/***************************************************************************
* Copyright (C) 2005 by TAM (Teppei Tamra) *
* tam-t@par.odn.ne.jp *
* *
* This program is free software; you can redistribute it and/or modify *
* it under the terms of the GNU General Public License as published by *
* the Free Software Foundation; either version 2 of the License, or *
* (at your option) any later version. *
* *
* This program is distributed in the hope that it will be useful, *
* but WITHOUT ANY WARRANTY; without even the implied warranty of *
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
* GNU General Public License for more details. *
* *
* You should have received a copy of the GNU General Public License *
* along with this program; if not, write to the *
* Free Software Foundation, Inc., *
* 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. *
***************************************************************************/
#ifdef HAVE_CONFIG_H
#include <config.h>
#endif
#define _(String) QString(i18n(String)).local8Bit().data()
#define Uses_SCIM_CONFIG_MODULE
#define Uses_SCIM_CONFIG_PATH
#define Uses_SCIM_GLOBAL_CONFIG
#include <scim.h>
#include <scim_global_config.h>
#include <sys/types.h>
#include <dirent.h>
#include <dlfcn.h>
using namespace scim;
class scimConfigPrivate {
public:
scim::ConfigModule configModule;
scim::ConfigPointer config;
};
#include <qlayout.h>
#include <klocale.h>
#include <kglobal.h>
#include <qpushbutton.h>
#include <qlayout.h>
#include <kparts/genericfactory.h>
#include <klocale.h>
#include "skim_honoka.h"
#include <honokasetupkde.h>
#include "honoka_def.h"
#include "honoka_plugin_def.h"
#include <honokapluginbase.h>
typedef HonokaSetupCorePage *pluginSetupFunc();
typedef int getPluginVersionFunc();
static HonokaSetupKde *_setup;
typedef KGenericFactory<skim_honoka, QWidget> skim_honokaFactory;
K_EXPORT_COMPONENT_FACTORY( kcm_skim_honoka, skim_honokaFactory("skim_honoka"))
skim_honoka::skim_honoka(QWidget *parent, const char *name, const QStringList&)
: KCModule(parent, name), myAboutData(0)
{
KGlobal::locale()->insertCatalogue("skim_honoka");
// scim::String mod = scim::scim_global_config_read(scim::String("/DefaultConfigModule"),scim::String("simple"));
// config.configModule.load(mod);
// config.config = config.configModule.create_config();
QGridLayout *grid = new QGridLayout(this,0,0,4);
HonokaSetupKde *setup = new HonokaSetup("setup","","");
HonokaSetupPage *page;
std::vector<scim::String> l;
//
// general setting
//
page = new HonokaSetupPage(_("general setting"),"","");
page->append(new HonokaSetupIntItem(
_("_Auto candidates popup: "),
HONOKA_CONFIG_ALP,
_("set the count of conversion until displaying the list of lookup result automatically."),
HONOKA_DEFAULT_ALP,
-1,10
));
page->append(new HonokaSetupBoolItem(
_("Auto _conversion: "),
HONOKA_CONFIG_AUTO_CONVERSION,
_("If you set default to the auto conversion mode use, check this."),
HONOKA_DEFAULT_AUTO_CONVERSION
));
page->append(new HonokaSetupBoolItem(
_("_NumKey selection: "),
HONOKA_CONFIG_NUMKEY_SELECT,
_("If you use the candidate selection by numkey, check this."),
HONOKA_DEFAULT_NUMKEY_SELECT
));
page->append(new HonokaSetupBoolItem(
_("use _Prediction: "),
HONOKA_CONFIG_PREDICTION,
_("If you use the prediction, check this."),
HONOKA_DEFAULT_PREDICTION
));
page->append(new HonokaSetupBoolItem(
_("_Realtime Prediction: "),
HONOKA_CONFIG_REALTIME_PREDICTION,
_("If you use the realtime prediction, check this."),
HONOKA_DEFAULT_REALTIME_PREDICTION
));
page->append(new HonokaSetupIntItem(
_("_Delay Prediction search: "),
HONOKA_CONFIG_PREDICTION_DELAY,
_("set the time to delay prediction search. (1/10secs)"),
HONOKA_DEFAULT_PREDICTION_DELAY,
0,10
));
page->append(new HonokaSetupBoolItem(
_("_Select prediction direct: "),
HONOKA_CONFIG_SELECT_PREDICTION_DIRECT,
_("If you want select prediction direct with numkey, check this."),
HONOKA_DEFAULT_SELECT_PREDICTION_DIRECT
));
page->append(new HonokaSetupBoolItem(
_("Restore previous setting: "),
HONOKA_CONFIG_SAVE_SETTING,
_("if you restore previous setting at the startup time ,check this."),
HONOKA_DEFAULT_SAVE_SETTING
));
page->append(new HonokaSetupEntryItem(
_("Default _PreEditor: "),
HONOKA_CONFIG_DEFAULT_PREEDITOR,
_("select the default preeditor."),
HONOKA_DEFAULT_DEFAULT_PREEDITOR
));
page->append(new HonokaSetupEntryItem(
_("Default _Convertor: "),
HONOKA_CONFIG_DEFAULT_CONVERTOR,
_("select the default Convertor."),
HONOKA_DEFAULT_DEFAULT_CONVERTOR
));
page->append(new HonokaSetupEntryItem(
_("Default _Predictor: "),
HONOKA_CONFIG_DEFAULT_PREDICTOR,
_("select the default predictor."),
HONOKA_DEFAULT_DEFAULT_PREDICTOR
));
setup->append(page);
//
// key setting
//
HonokaSetup * keys = new HonokaSetup(_("key setting"),"","");
page = new HonokaSetupPage(_("Common keys"),"","");
page->append(new HonokaSetupKeyItem(
_("Commit keys:"),
HONOKA_CONFIG_KEY_COMMIT,
_("The key events to commit the preedit string. "),
HONOKA_DEFAULT_KEY_COMMIT
));
page->append(new HonokaSetupKeyItem(
_("Convert keys:"),
HONOKA_CONFIG_KEY_CONVERSION_START,
_("The key events to convert the preedit string to kanji. "),
HONOKA_DEFAULT_KEY_CONVERSION_START
));
page->append(new HonokaSetupKeyItem(
_("Cancel keys:"),
HONOKA_CONFIG_KEY_CANCEL,
_("The key events to cancel preediting or converting. "),
HONOKA_DEFAULT_KEY_CANCEL
));
page->append(new HonokaSetupKeyItem(
_("Backspace keys:"),
HONOKA_CONFIG_KEY_BACKSPACE,
_("The key events to delete a character before caret. "),
HONOKA_DEFAULT_KEY_BACKSPACE
));
page->append(new HonokaSetupKeyItem(
_("Delete keys:"),
HONOKA_CONFIG_KEY_DELETE,
_("The key events to delete a character after caret. "),
HONOKA_DEFAULT_KEY_DELETE
));
keys->append(page);
page = new HonokaSetupPage(_("Preedit keys"),"","");
page->append(new HonokaSetupKeyItem(
_("Move forward keys:"),
HONOKA_CONFIG_KEY_FORWARD,
_("The key events to move the caret to forward. "),
HONOKA_DEFAULT_KEY_FORWARD
));
page->append(new HonokaSetupKeyItem(
_("Move backward keys:"),
HONOKA_CONFIG_KEY_BACKWARD,
_("The key events to move the caret to backward. "),
HONOKA_DEFAULT_KEY_BACKWARD
));
keys->append(page);
page = new HonokaSetupPage(_("Segment keys"),"","");
page->append(new HonokaSetupKeyItem(
_("Next segment keys:"),
HONOKA_CONFIG_KEY_CONVERSION_FORWARD,
_("The key events to select next segment. "),
HONOKA_DEFAULT_KEY_CONVERSION_FORWARD
));
page->append(new HonokaSetupKeyItem(
_("Previous segment keys:"),
HONOKA_CONFIG_KEY_CONVERSION_BACKWARD,
_("The key events to select previous segment. "),
HONOKA_DEFAULT_KEY_CONVERSION_BACKWARD
));
page->append(new HonokaSetupKeyItem(
_("Shrink segment keys:"),
HONOKA_CONFIG_KEY_CONVERSION_SHRINK,
_("The key events to shrink the selected segment. "),
HONOKA_DEFAULT_KEY_CONVERSION_SHRINK
));
page->append(new HonokaSetupKeyItem(
_("Expand segment keys:"),
HONOKA_CONFIG_KEY_CONVERSION_EXPAND,
_("The key events to expand the selected segment. "),
HONOKA_DEFAULT_KEY_CONVERSION_EXPAND
));
keys->append(page);
page = new HonokaSetupPage(_("Candidates keys"),"","");
page->append(new HonokaSetupKeyItem(
_("Next keys:"),
HONOKA_CONFIG_KEY_CONVERSION_NEXT,
_("The key events to select next candidate. "),
HONOKA_DEFAULT_KEY_CONVERSION_NEXT
));
page->append(new HonokaSetupKeyItem(
_("Previous keys:"),
HONOKA_CONFIG_KEY_CONVERSION_PREV,
_("The key events to select previous candidate. "),
HONOKA_DEFAULT_KEY_CONVERSION_PREV
));
page->append(new HonokaSetupKeyItem(
_("candidates list keys:"),
HONOKA_CONFIG_KEY_LOOKUPPOPUP,
_("The key events to popup candidates list. "),
HONOKA_DEFAULT_KEY_LOOKUPPOPUP
));
page->append(new HonokaSetupKeyItem(
_("Page up keys:"),
HONOKA_CONFIG_KEY_LOOKUPPAGEUP,
_("The key events to select page up candidates. "),
HONOKA_DEFAULT_KEY_LOOKUPPAGEUP
));
page->append(new HonokaSetupKeyItem(
_("Page down keys:"),
HONOKA_CONFIG_KEY_LOOKUPPAGEDOWN,
_("The key events to select page down candidates. "),
HONOKA_DEFAULT_KEY_LOOKUPPAGEDOWN
));
keys->append(page);
page = new HonokaSetupPage(_("Other function keys"),"","");
page->append(new HonokaSetupKeyItem(
_("auto conversion mode keys:"),
HONOKA_CONFIG_KEY_AUTO_CONVERSION,
_("The key events to change auto conversion mode. "),
HONOKA_DEFAULT_KEY_AUTO_CONVERSION
));
page->append(new HonokaSetupKeyItem(
_("Prediction keys:"),
HONOKA_CONFIG_KEY_SELECT_PREDICTION,
_("The key events to select from prediction list. "),
HONOKA_DEFAULT_KEY_SELECT_PREDICTION
));
page->append(new HonokaSetupKeyItem(
_("Convert to HIRAGANA keys:"),
HONOKA_CONFIG_KEY_CONVERT_HIRAGANA,
_("The key events to convert the selected candidate or the preedit string to HIRAGANA. "),
HONOKA_DEFAULT_KEY_CONVERT_HIRAGANA
));
page->append(new HonokaSetupKeyItem(
_("Convert to KATAKANA keys:"),
HONOKA_CONFIG_KEY_CONVERT_KATAKANA,
_("The key events to convert the selected candidate or the preedit string to KATAKANA. "),
HONOKA_DEFAULT_KEY_CONVERT_KATAKANA
));
page->append(new HonokaSetupKeyItem(
_("Convert to WIDE keys:"),
HONOKA_CONFIG_KEY_CONVERT_WIDE,
_("The key events to convert the selected candidate or the preedit string to WIDE-charactors. "),
HONOKA_DEFAULT_KEY_CONVERT_WIDE
));
page->append(new HonokaSetupKeyItem(
_("Convert to HALF keys:"),
HONOKA_CONFIG_KEY_CONVERT_HALF,
_("The key events to convert the selected candidate or the preedit string to HALF-charactors. "),
HONOKA_DEFAULT_KEY_CONVERT_HALF
));
page->append(new HonokaSetupKeyItem(
_("Convert to ikeiji keys:"),
HONOKA_CONFIG_KEY_CONVERSION_IKEIJI,
_("The key events to convert the selected candidate to ikei-kanji. "),
HONOKA_DEFAULT_KEY_CONVERSION_IKEIJI
));
page->append(new HonokaSetupKeyItem(
_("Convert to rensou keys:"),
HONOKA_CONFIG_KEY_CONVERSION_RENSOU,
_("The key events to convert the selected candidate to the associated acceptation string. "),
HONOKA_DEFAULT_KEY_CONVERSION_RENSOU
));
page->append(new HonokaSetupKeyItem(
_("Character type conversion :"),
HONOKA_CONFIG_KEY_CONVERT_CTYPETOGGLE,
_("The key events to string to other character type."),
HONOKA_DEFAULT_KEY_CONVERT_CTYPETOGGLE
));
keys->append(page);
setup->append(keys);
//
// plugins setting
//
HonokaSetup * plugins = new HonokaSetup(_("plugins setting"),"","");
////
DIR *dir = opendir(HONOKA_PLUGINDIR);
if (dir) {
struct dirent *entry;
while((entry = readdir(dir)) != NULL) {
String d = entry->d_name;
if ((d.substr(0,6) == "plugin") && (d.substr(d.length() - 3,3) == ".so")) {
String pluginName = d.substr(0,d.length() - 3);
d = String(HONOKA_PLUGINDIR) + "/" + d;
void* plugin = dlopen(d.c_str(), RTLD_LAZY);
if (!plugin) continue;
pluginSetupFunc *pluginSetup = (pluginSetupFunc *)dlsym(plugin,"HonokaPluginSetup");
getPluginVersionFunc *getPluginVersion = (getPluginVersionFunc *)dlsym(plugin,"getHonokaPluginVersion");
if ((!pluginSetup) || (!getPluginVersion)) {
dlclose(plugin);
continue;
}
if (getPluginVersion() == HONOKA_PLUGIN_VERSION) {
HonokaSetupCorePage *p = pluginSetup();
// "if you use this plugin, check this." ----
HonokaSetupKdePage *page = new HonokaSetupKdePage(p->getLabel(),p->getName(),p->getTip());
page->append(new HonokaSetupBoolItem(
_("_Use this plugin: "),
String(HONOKA_CONFIG_PLUGINLOADER_PREFIX) + "/" + pluginName,
_("if you use this plugin, check this."),
true
));
for(unsigned int i = 0;i < p->getChildren().size();i ++) {
page->append(HonokaSetup::HonokaSetupCoreToKde(p->getChildren()[i]));
}
plugins->append(page);
//plugin->append(p);
}
dlclose(plugin);
}
}
}
////
setup->append(plugins);
setup->getValueWidget()->reparent(this,QPoint());
setup->getValueWidget()->show();
grid->addWidget(setup->getValueWidget(),0,0);
setSizePolicy(QSizePolicy::Expanding,QSizePolicy::Expanding);
//emit changed(true);
connect(setup,SIGNAL(changed()),this,SLOT(configChanged()));
_setup = setup;
load();
};
skim_honoka::~skim_honoka()
{
}
void skim_honoka::load()
{
scimConfigPrivate config;
if (!config.configModule.valid()) {
scim::String mod = scim::scim_global_config_read(scim::String("/DefaultConfigModule"),scim::String("simple"));
config.configModule.load(mod);
}
config.config = config.configModule.create_config();
_setup->readConfig(config.config);
}
void skim_honoka::defaults()
{
// insert your default settings code here...
emit changed(true);
}
void skim_honoka::save()
{
scimConfigPrivate config;
if (!config.configModule.valid()) {
scim::String mod = scim::scim_global_config_read(scim::String("/DefaultConfigModule"),scim::String("simple"));
config.configModule.load(mod);
}
config.config = config.configModule.create_config();
_setup->saveConfig(config.config);
emit changed(true);
}
int skim_honoka::buttons()
{
return KCModule::Default|KCModule::Apply|KCModule::Help;
}
void skim_honoka::configChanged()
{
// insert your saving code here...
emit changed(true);
}
QString skim_honoka::quickHelp() const
{
return i18n("Helpful information about the skim_honoka module.");
}
#include "skim_honoka.moc"