/*************************************************************************** * 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. * ***************************************************************************/ #include "honokasetupkde.h" #include <qlabel.h> #include <qpushbutton.h> #include <qtabwidget.h> #include <qlineedit.h> #include <qcheckbox.h> #include <qspinbox.h> #include <qcombobox.h> #include <qurl.h> #include <qtooltip.h> #include <kfiledialog.h> #include <skim/skimkeygrabber.h> // Item HonokaSetupKdeItem::HonokaSetupKdeItem(scim::String _label,scim::String _name,scim::String _tip) : QObject(0) { label = QString::fromLocal8Bit(_label.c_str()); name = _name; tip = QString::fromLocal8Bit(_tip.c_str()); valueWidget = 0; labelWidget = 0; } HonokaSetupKdeItem::~HonokaSetupKdeItem() { } QWidget * HonokaSetupKdeItem::getValueWidget() { if (!valueWidget) { createValueWidget(); QToolTip::add(valueWidget,tip); } static_cast<QLabel *>(getLabelWidget())->setBuddy(valueWidget); return valueWidget; } QWidget * HonokaSetupKdeItem::getLabelWidget() { if (!labelWidget) createLabelWidget(); return labelWidget; } void HonokaSetupKdeItem::readConfig(scim::ConfigPointer cfg) { } void HonokaSetupKdeItem::saveConfig(scim::ConfigPointer cfg) { } QString HonokaSetupKdeItem::getLabel() { return label; } void HonokaSetupKdeItem::createLabelWidget() { QString l = label; l.replace(QChar('_'),QChar('&')); labelWidget = new QLabel(0,"label"); labelWidget->setText(l); labelWidget->setAlignment(Qt::AlignRight | Qt::AlignVCenter); labelWidget->hide(); } void HonokaSetupKdeItem::createValueWidget() { valueWidget = new QLabel(0,"value"); static_cast<QLabel *>(valueWidget)->setText(label); valueWidget->hide(); } void HonokaSetupKdeItem::createTipWidget() { } // Container HonokaSetupKdeContainer::HonokaSetupKdeContainer() { } HonokaSetupKdeContainer::~HonokaSetupKdeContainer() { } void HonokaSetupKdeContainer::append(HonokaSetupKdeItem *item) { } // HonokaSetupKde HonokaSetupKde::HonokaSetupKde(scim::String _label,scim::String _name,scim::String _tip) : HonokaSetupKdeItem(_label,_name,_tip),HonokaSetupKdeContainer() { } HonokaSetupKde::~HonokaSetupKde() { } void HonokaSetupKde::readConfig(scim::ConfigPointer cfg) { for(unsigned int i = 0;i < items.size();i ++) { items[i]->readConfig(cfg); } return; } void HonokaSetupKde::saveConfig(scim::ConfigPointer cfg) { for(unsigned int i = 0;i < items.size();i ++) { items[i]->saveConfig(cfg); } return; } void HonokaSetupKde::append(HonokaSetupKdeItem *item) { items.append(item); connect(item,SIGNAL(changed()),this,SIGNAL(changed())); item->getValueWidget()->reparent(getValueWidget(),QPoint()); item->getValueWidget()->setSizePolicy(QSizePolicy::Expanding,QSizePolicy::Expanding); static_cast<QTabWidget *>(getValueWidget())->addTab(item->getValueWidget(),item->getLabel()); item->getValueWidget()->show(); } void HonokaSetupKde::createValueWidget() { valueWidget = new QTabWidget(0,"Tab"); valueWidget->setSizePolicy(QSizePolicy::Expanding,QSizePolicy::Expanding); valueWidget->hide(); } HonokaSetupKdeItem *HonokaSetupKde::HonokaSetupCoreToKde(Honoka::HonokaSetupCoreItem *item) { if (item->getType() == HONOKA_SETUP_ITEM_ENTRY) { return new HonokaSetupKdeEntryItem(item->getLabel(),item->getName(),item->getTip(),item->getStringData()); } if (item->getType() == HONOKA_SETUP_ITEM_KEY) { return new HonokaSetupKdeKeyItem(item->getLabel(),item->getName(),item->getTip(),item->getStringData()); } if (item->getType() == HONOKA_SETUP_ITEM_FILE) { return new HonokaSetupKdeFileItem(item->getLabel(),item->getName(),item->getTip(),item->getStringData()); } if (item->getType() == HONOKA_SETUP_ITEM_BOOL) { return new HonokaSetupKdeBoolItem(item->getLabel(),item->getName(),item->getTip(),item->getBoolData()); } if (item->getType() == HONOKA_SETUP_ITEM_INT) { return new HonokaSetupKdeIntItem(item->getLabel(),item->getName(),item->getTip(),item->getIntData(), item->getIntLower(),item->getIntUpper()); } if (item->getType() == HONOKA_SETUP_ITEM_SELECT) { return new HonokaSetupKdeSelectItem(item->getLabel(),item->getName(),item->getTip(),item->getStringData(), item->getStringListData()); } if (item->getType() == HONOKA_SETUP_ITEM_PAGE) { HonokaSetupKdePage *page = new HonokaSetupKdePage(item->getLabel(),item->getName(),item->getTip()); for(unsigned int i = 0;i < static_cast<Honoka::HonokaSetupCorePage *>(item)->getChildren().size(); i ++) { page->append(HonokaSetupCoreToKde(static_cast<Honoka::HonokaSetupCorePage *>(item)->getChildren()[i])); } return page; } if (item->getType() == HONOKA_SETUP_ITEM_SETUP) { HonokaSetupKde *page = new HonokaSetupKde(item->getLabel(),item->getName(),item->getTip()); for(unsigned int i = 0;i < static_cast<Honoka::HonokaSetupCore *>(item)->getChildren().size(); i ++) { page->append(HonokaSetupCoreToKde(static_cast<Honoka::HonokaSetupCore *>(item)->getChildren()[i])); } return page; } return 0; } // Page HonokaSetupKdePage::HonokaSetupKdePage(scim::String _label,scim::String _name,scim::String _tip) : HonokaSetupKdeItem(_label,_name,_tip),HonokaSetupKdeContainer() { } HonokaSetupKdePage::~HonokaSetupKdePage() { } void HonokaSetupKdePage::append(HonokaSetupKdeItem *item) { items.append(item); connect(item,SIGNAL(changed()),this,SIGNAL(changed())); item->getLabelWidget()->reparent(getValueWidget(),QPoint()); item->getLabelWidget()->setSizePolicy(QSizePolicy::Minimum,QSizePolicy::Minimum); item->getValueWidget()->reparent(getValueWidget(),QPoint()); item->getValueWidget()->setSizePolicy(QSizePolicy::Expanding,QSizePolicy::Minimum); table->addWidget(item->getLabelWidget(),items.count() - 1,0); table->addWidget(item->getValueWidget(),items.count() - 1,1); item->getValueWidget()->show(); item->getLabelWidget()->show(); } void HonokaSetupKdePage::readConfig(scim::ConfigPointer cfg) { for(unsigned int i = 0;i < items.size();i ++) { items[i]->readConfig(cfg); } return; } void HonokaSetupKdePage::saveConfig(scim::ConfigPointer cfg) { for(unsigned int i = 0;i < items.size();i ++) { items[i]->saveConfig(cfg); } return; } void HonokaSetupKdePage::createValueWidget() { valueWidget = new QWidget(0,"Page"); valueWidget->setSizePolicy(QSizePolicy::Expanding,QSizePolicy::Expanding); valueWidget->hide(); table = new QGridLayout(valueWidget,0,0,4); spacer = new QSpacerItem(1,1,QSizePolicy::Minimum,QSizePolicy::Expanding); //table->addItem(spacer,99,0); table->addMultiCell(spacer,99,100,0,1); } // String HonokaSetupKdeEntryItem::HonokaSetupKdeEntryItem(scim::String _label,scim::String _name,scim::String _tip,scim::String _default) : HonokaSetupKdeItem(_label,_name,_tip) { stringData = _default; } HonokaSetupKdeEntryItem::~HonokaSetupKdeEntryItem() { } void HonokaSetupKdeEntryItem::readConfig(scim::ConfigPointer cfg) { stringData = cfg->read(scim::String(name.latin1()),scim::String(stringData.local8Bit().data())); static_cast<QLineEdit *>(getValueWidget())->setText(stringData); return; } void HonokaSetupKdeEntryItem::saveConfig(scim::ConfigPointer cfg) { cfg->write(scim::String(name.latin1()),scim::String(stringData.local8Bit().data())); return; } void HonokaSetupKdeEntryItem::createValueWidget() { valueWidget = new QLineEdit(0,"String"); valueWidget->setSizePolicy(QSizePolicy::Expanding,QSizePolicy::Minimum); static_cast<QLineEdit *>(valueWidget)->setText(stringData); valueWidget->hide(); connect(valueWidget,SIGNAL(textChanged(const QString &)),this,SLOT(textChanged(const QString &))); } void HonokaSetupKdeEntryItem::textChanged(const QString &text) { stringData = text; emit changed(); } // Bool HonokaSetupKdeBoolItem::HonokaSetupKdeBoolItem(scim::String _label,scim::String _name,scim::String _tip,bool _default) : HonokaSetupKdeItem(_label,_name,_tip) { boolData = _default; } HonokaSetupKdeBoolItem::~HonokaSetupKdeBoolItem() { } void HonokaSetupKdeBoolItem::readConfig(scim::ConfigPointer cfg) { boolData = cfg->read(scim::String(name.latin1()),boolData); static_cast<QCheckBox *>(getValueWidget())->setChecked(boolData); return; } void HonokaSetupKdeBoolItem::saveConfig(scim::ConfigPointer cfg) { cfg->write(scim::String(name.latin1()),boolData); return; } void HonokaSetupKdeBoolItem::createValueWidget() { valueWidget = new QCheckBox(0,"Bool"); valueWidget->setSizePolicy(QSizePolicy::Expanding,QSizePolicy::Minimum); static_cast<QCheckBox *>(valueWidget)->setChecked(boolData); valueWidget->hide(); connect(valueWidget,SIGNAL(clicked()),this,SLOT(clicked())); } void HonokaSetupKdeBoolItem::clicked() { boolData = static_cast<QCheckBox *>(valueWidget)->isOn(); emit changed(); } // File HonokaSetupKdeFileItem::HonokaSetupKdeFileItem(scim::String _label,scim::String _name,scim::String _tip,scim::String _default) : HonokaSetupKdeItem(_label,_name,_tip) { stringData = _default; } HonokaSetupKdeFileItem::~HonokaSetupKdeFileItem() { } void HonokaSetupKdeFileItem::readConfig(scim::ConfigPointer cfg) { stringData = cfg->read(scim::String(name.latin1()),scim::String(stringData.local8Bit().data())); if (!getValueWidget()) return; le->setText(stringData); return; } void HonokaSetupKdeFileItem::saveConfig(scim::ConfigPointer cfg) { cfg->write(scim::String(name.latin1()),scim::String(stringData.local8Bit().data())); return; } void HonokaSetupKdeFileItem::createValueWidget() { valueWidget = new QWidget(0,"File"); valueWidget->setSizePolicy(QSizePolicy::Expanding,QSizePolicy::Minimum); le = new QLineEdit(valueWidget,"File-LineEdit"); le->setSizePolicy(QSizePolicy::Expanding,QSizePolicy::Minimum); QPushButton *b = new QPushButton(valueWidget,"File-Button"); b->setSizePolicy(QSizePolicy::Minimum,QSizePolicy::Minimum); b->setText("..."); QHBoxLayout *l = new QHBoxLayout(valueWidget); l->addWidget(le); l->addWidget(b); le->setText(stringData); valueWidget->hide(); connect(le,SIGNAL(textChanged(const QString &)),this,SLOT(textChanged(const QString &))); connect(b,SIGNAL(clicked()),this,SLOT(buttonClicked())); } void HonokaSetupKdeFileItem::textChanged(const QString &text) { stringData = text; emit changed(); } void HonokaSetupKdeFileItem::buttonClicked() { QString d = KFileDialog::getOpenFileName(QUrl(stringData).dirPath()); if (d != stringData) { le->setText(d); stringData = d; // ÉÔÍס© } } // Key HonokaSetupKdeKeyItem::HonokaSetupKdeKeyItem(scim::String _label,scim::String _name,scim::String _tip,scim::String _default) : HonokaSetupKdeItem(_label,_name,_tip) { stringData = _default; } HonokaSetupKdeKeyItem::~HonokaSetupKdeKeyItem() { } void HonokaSetupKdeKeyItem::readConfig(scim::ConfigPointer cfg) { stringData = cfg->read(scim::String(name.latin1()),scim::String(stringData.latin1())); if (!getValueWidget()) return; le->setText(stringData); return; } void HonokaSetupKdeKeyItem::saveConfig(scim::ConfigPointer cfg) { cfg->write(scim::String(name.latin1()),scim::String(stringData.latin1())); return; } void HonokaSetupKdeKeyItem::createValueWidget() { valueWidget = new QWidget(0,"Key"); valueWidget->setSizePolicy(QSizePolicy::Expanding,QSizePolicy::Minimum); le = new QLineEdit(valueWidget,"Key-LineEdit"); le->setSizePolicy(QSizePolicy::Expanding,QSizePolicy::Minimum); QPushButton *b = new QPushButton(valueWidget,"Key-Button"); b->setSizePolicy(QSizePolicy::Minimum,QSizePolicy::Minimum); b->setText("..."); QHBoxLayout *l = new QHBoxLayout(valueWidget); l->addWidget(le); l->addWidget(b); le->setText(stringData); valueWidget->hide(); connect(le,SIGNAL(textChanged(const QString &)),this,SLOT(textChanged(const QString &))); connect(b,SIGNAL(clicked()),this,SLOT(buttonClicked())); } void HonokaSetupKdeKeyItem::textChanged(const QString &text) { stringData = text; emit changed(); } void HonokaSetupKdeKeyItem::buttonClicked() { SkimShortcutListEditor *d = new SkimShortcutListEditor(); d->setModal(true); QStringList s = QStringList::split(",",stringData); d->setStringList(s); if (d->exec() == QDialog::Accepted) { le->setText(d->getCombinedString()); stringData = d->getCombinedString(); } delete d; } // Int HonokaSetupKdeIntItem::HonokaSetupKdeIntItem(scim::String _label,scim::String _name,scim::String _tip,int _default,int lower,int upper) : HonokaSetupKdeItem(_label,_name,_tip) { intData = _default; upperValue = upper; lowerValue = lower; } HonokaSetupKdeIntItem::~HonokaSetupKdeIntItem() { } void HonokaSetupKdeIntItem::readConfig(scim::ConfigPointer cfg) { intData = cfg->read(scim::String(name.latin1()),intData); static_cast<QSpinBox *>(getValueWidget())->setValue(intData); return; } void HonokaSetupKdeIntItem::saveConfig(scim::ConfigPointer cfg) { cfg->write(scim::String(name.latin1()),intData); return; } void HonokaSetupKdeIntItem::createValueWidget() { valueWidget = new QSpinBox(lowerValue,upperValue,1,0,"Int"); valueWidget->setSizePolicy(QSizePolicy::Expanding,QSizePolicy::Minimum); static_cast<QSpinBox *>(valueWidget)->setValue(intData); valueWidget->hide(); connect(valueWidget,SIGNAL(valueChanged(int)),this,SLOT(valueChanged(int))); } void HonokaSetupKdeIntItem::valueChanged(int value) { intData = value; emit changed(); } // Select HonokaSetupKdeSelectItem::HonokaSetupKdeSelectItem(scim::String _label,scim::String _name,scim::String _tip,scim::String _default,std::vector<scim::String> _list) : HonokaSetupKdeItem(_label,_name,_tip) { stringData = _default; for(unsigned int i = 0;i < _list.size();i ++) list.append(_list[i]); } HonokaSetupKdeSelectItem::~HonokaSetupKdeSelectItem() { } void HonokaSetupKdeSelectItem::readConfig(scim::ConfigPointer cfg) { stringData = cfg->read(scim::String(name.latin1()),scim::String(stringData.local8Bit().data())); static_cast<QComboBox *>(getValueWidget())->setCurrentText(stringData); return; } void HonokaSetupKdeSelectItem::saveConfig(scim::ConfigPointer cfg) { cfg->write(scim::String(name.latin1()),scim::String(stringData.local8Bit().data())); return; } void HonokaSetupKdeSelectItem::createValueWidget() { valueWidget = new QComboBox(0,"Select"); valueWidget->setSizePolicy(QSizePolicy::Expanding,QSizePolicy::Minimum); static_cast<QComboBox *>(valueWidget)->insertStringList(list); static_cast<QComboBox *>(valueWidget)->setCurrentText(stringData); valueWidget->hide(); connect(valueWidget,SIGNAL(activated(int)),this,SLOT(activated(int))); } void HonokaSetupKdeSelectItem::activated(int pos) { stringData = list[pos]; emit changed(); }