00001 #include <opie2/otaskbarapplet.h>
00002 #include <opie2/okeyfilter.h>
00003 #include <opie2/oresource.h>
00004 #include <qpe/qcopenvelope_qws.h>
00005 #include <qpe/applnk.h>
00006 #include <qpe/qpeapplication.h>
00007
00008
00009 #include "zkbwidget.h"
00010 #include "zkbcfg.h"
00011
00012 using namespace Opie::Ui;
00013
00014 ZkbWidget::ZkbWidget(QWidget* parent)
00015 :QLabel(parent),keymap(0),disabled(Opie::Core::OResource::loadPixmap("zkb-disabled", Opie::Core::OResource::SmallIcon)) {
00016
00017 labels = new QPopupMenu();
00018 connect(labels, SIGNAL(activated(int)), this,
00019 SLOT(labelChanged(int)));
00020
00021 loadKeymap();
00022
00023 channel = new QCopChannel("QPE/zkb", this);
00024 connect(channel, SIGNAL(received(const QCString&,const QByteArray&)),
00025 this, SLOT(signalReceived(const QCString&,const QByteArray&)));
00026 setFixedWidth ( AppLnk::smallIconSize() );
00027 setFixedHeight ( AppLnk::smallIconSize() );
00028 }
00029
00030 ZkbWidget::~ZkbWidget()
00031 {
00032 delete keymap;
00033 keymap = 0;
00034 }
00035
00036 int ZkbWidget::position()
00037 {
00038 return 8;
00039 }
00040
00041 bool ZkbWidget::loadKeymap() {
00042 ZkbConfig c(Global::applicationFileName("zkb", QString::null) );
00043 QFontMetrics fm(font());
00044
00045 delete keymap;
00046 keymap = 0;
00047
00048 Keymap* km = new Keymap();
00049
00050 if (!c.load("zkb.xml", *km, "")) {
00051 delete km;
00052 setPixmap(disabled);
00053 return false;
00054 }
00055
00056 connect(km, SIGNAL(stateChanged(const QString&)),
00057 this, SLOT(stateChanged(const QString&)));
00058
00059 Opie::Core::OKeyFilter::inst()->addHandler(km);
00060
00061 Keymap* oldkm = keymap;
00062 keymap = km;
00063
00064 if (oldkm != 0) {
00065 delete oldkm;
00066 }
00067
00068 QString ltext = keymap->getCurrentLabel();
00069 if (ltext.length()==0) ltext = "??";
00070 setText(ltext);
00071
00072 labels->clear();
00073 QStringList l = keymap->listLabels();
00074 labels->insertItem(disabled, 0, 0);
00075 int n = 1;
00076 w = 0;
00077 for(QStringList::Iterator it = l.begin(); it != l.end();
00078 ++it, n++) {
00079
00080
00081
00082 labels->insertItem(*it, n, n);
00083 int lw = fm.width(*it);
00084 if (lw > w) {
00085 w = lw;
00086 }
00087 }
00088
00089 if (w == 0) {
00090 hide();
00091 } else {
00092 show();
00093 }
00094 return true;
00095 }
00096
00097 void ZkbWidget::stateChanged(const QString& s) {
00098
00099 setText(s);
00100 }
00101
00102 void ZkbWidget::labelChanged(int id) {
00103 if (id == 0) {
00104 keymap->disable();
00105 setPixmap(disabled);
00106 return;
00107 }
00108
00109 keymap->enable();
00110
00111 QStringList l = keymap->listLabels();
00112 QString lbl = l[id-1];
00113
00114
00115 State* state = keymap->getStateByLabel(lbl);
00116 if (state != 0) {
00117 keymap->setCurrentState(state);
00118 setText(lbl);
00119 }
00120 }
00121
00122 void ZkbWidget::mouseReleaseEvent(QMouseEvent*) {
00123 QSize sh = labels->sizeHint();
00124 QPoint p = mapToGlobal(QPoint((width()-sh.width())/2,-sh.height()));
00125 labels->exec(p);
00126 }
00127
00128 void ZkbWidget::signalReceived(const QCString& msg, const QByteArray& data) {
00129 QDataStream stream(data, IO_ReadOnly);
00130
00131 if (msg == "enable()") {
00132 keymap->enable();
00133 } else if (msg == "disable()") {
00134 keymap->disable();
00135 } else if (msg == "reload()") {
00136 QCopEnvelope("QPE/System", "busy()");
00137 QTimer::singleShot(0, this, SLOT(reload()));
00138 } else if (msg == "switch(QString)") {
00139 QString lbl;
00140 stream >> lbl;
00141
00142 if (keymap != 0) {
00143 State* state = keymap->getStateByLabel(lbl);
00144 if (state != 0) {
00145 keymap->setCurrentState(state);
00146 setText(lbl);
00147 }
00148 }
00149 } else if (msg == "debug(QString)") {
00150 QString flag;
00151 stream >> flag;
00152 }
00153 }
00154
00155 void ZkbWidget::reload() {
00156 loadKeymap();
00157 QCopEnvelope("QPE/System", "notBusy()");
00158 }
00159
00160 EXPORT_OPIE_APPLET_v1( ZkbWidget )