From bdabd0e055d494c7546de08348e32cf5622c9074 Mon Sep 17 00:00:00 2001
From: mickeyl <mickeyl>
Date: Sat, 03 Jan 2004 16:57:51 +0000
Subject: add multikey patches courtesy Anton Kachalov <mouse@altlinux.ru>

---
(limited to 'inputmethods/multikey')

diff --git a/inputmethods/multikey/configdlg.cpp b/inputmethods/multikey/configdlg.cpp
index a8206b7..f127d0e 100644
--- a/inputmethods/multikey/configdlg.cpp
+++ b/inputmethods/multikey/configdlg.cpp
@@ -10,6 +10,7 @@
 
 #include <qpe/qpeapplication.h>
 #include <qpe/config.h>
+#include <qpe/resource.h>
 
 #include <qwidget.h>
 #include <qdialog.h>
@@ -23,6 +24,7 @@
 #include <qpushbutton.h>
 #include <qlistbox.h>
 #include <qstringlist.h>
+#include <qtoolbutton.h>
 #include <opie/ofiledialog.h>
 #include <opie/colordialog.h>
 #include <qdir.h>
@@ -48,8 +50,24 @@ ConfigDlg::ConfigDlg () : QTabWidget ()
 
     QGroupBox *map_group = new QGroupBox (2, Qt::Vertical, tr("Keymap File"), gen_box);
 
-    keymaps = new QListBox (map_group);
+    QHBox *hbox1 = new QHBox(map_group);
+    keymaps = new QListBox(hbox1);
     keymaps->setSizePolicy(QSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding));
+    QVBox *vbox1 = new QVBox(hbox1);
+    
+    QToolButton *tb1 = new QToolButton(vbox1, tr("Move Up"));
+    tb1->setPixmap(Resource::loadPixmap("up"));
+    tb1->setAutoRaise(TRUE);
+    tb1->setFocusPolicy(QWidget::NoFocus);
+    tb1->setToggleButton(FALSE);
+    connect(tb1, SIGNAL(clicked()), this, SLOT(moveSelectedUp()));
+
+    QToolButton *tb2 = new QToolButton(vbox1, tr("Move Down"));
+    tb2->setPixmap(Resource::loadPixmap("down"));
+    tb2->setAutoRaise(TRUE);
+    tb2->setFocusPolicy(QWidget::NoFocus);
+    tb2->setToggleButton(FALSE);
+    connect(tb2, SIGNAL(clicked()), this, SLOT(moveSelectedDown()));
 
     QString cur(tr("Current Language"));
     keymaps->insertItem(cur);
@@ -57,95 +75,75 @@ ConfigDlg::ConfigDlg () : QTabWidget ()
     
     QDir map_dir(QPEApplication::qpeDir() + "/share/multikey", "*.keymap");
     default_maps = map_dir.entryList(); // so i can access it in other places
-
-    for (uint i = 0; i < map_dir.count(); i++) {
-
-        QFile map (map_dir.absPath() + "/" + map_dir[i]);
-        if (map.open(IO_ReadOnly)) {
-
-            QString line; bool found = 0;
-
-            map.readLine(line, 1024);
-            while (!map.atEnd()) {
-
-                if (line.find(QRegExp("^title\\s*=\\s*")) != -1) {
-                
-                    keymaps->insertItem(line.right(line.length() - line.find(QChar('=')) - 1).stripWhiteSpace());
-                    found = 1;
-                    break;
-                }
-                map.readLine(line, 1024);
-            }
-            if (!found) keymaps->insertItem(map_dir.absPath() + "/" + map_dir[i]);
-
-            map.close();
-        }
-        if (map_dir.absPath() + "/" + map_dir[i] == current_map) {
-
-            keymaps->setSelected(i + 1, true);
-        }
-
-    } 
-
     custom_maps = config.readListEntry("maps", QChar('|'));
+    sw_maps = ConfigDlg::loadSw();
 
-    for (uint i = 0; i < custom_maps.count(); i++) {
+    QStringList sw_copy(sw_maps);
+    for (uint i = 0; i < sw_copy.count(); i++) {
 
-        if (map_dir.exists(QFileInfo(custom_maps[i]).fileName(), false) 
-                        || !QFile::exists(custom_maps[i])) {
+	QString keymap_map;
+	if (sw_copy[i][0] != '/') { /* share/multikey */
 
-            custom_maps.remove(custom_maps.at(i));
+	    keymap_map =  map_dir.absPath() + "/" + sw_copy[i];
+	} else {
 
-            // remove it from the list too
-            config.writeEntry("maps", custom_maps.join("|"));
+	    if (map_dir.exists(QFileInfo(sw_copy[i]).fileName(), false) 
+		|| !QFile::exists(sw_copy[i])) {
 
+		custom_maps.remove(sw_copy[i]);
+		sw_maps.remove(sw_copy[i]);
 
-        } else {
+		// remove it from the list too
+		config.writeEntry("maps", custom_maps.join("|"));
 
-            QFile map (custom_maps[i]);
-            if (map.open(IO_ReadOnly)) {
+		continue;
+	    }
+	    keymap_map = sw_copy[i];
+	}
 
-                QString line; bool found = 0;
+	QFile map(keymap_map);
+	if (map.open(IO_ReadOnly)) {
 
-                map.readLine(line, 1024);
-                while (!map.atEnd()) {
+	    QString line; bool found = 0;
 
-                    if (line.find(QRegExp("^title\\s*=\\s*")) != -1) {
-                
-                        keymaps->insertItem(line.right(line.length() - line.find(QChar('=')) - 1).stripWhiteSpace());
-                        found = 1;
-                        break;
-                    }
-                    map.readLine(line, 1024);
-                }
-                if (!found) keymaps->insertItem(custom_maps[i]);
-
-                map.close();
-            }
-            if (custom_maps[i] == current_map) {
+	    map.readLine(line, 1024);
+	    while (!map.atEnd()) {
 
-                keymaps->setSelected(map_dir.count() + i + 1, true);
-            }
-        }
+		if (line.find(QRegExp("^title\\s*=\\s*")) != -1) {
+                
+		    keymaps->insertItem(line.right(line.length() - line.find(QChar('=')) - 1).stripWhiteSpace());
+		    found = 1;
+		    break;
+		}
+		map.readLine(line, 1024);
+	    }
+	    if (!found)
+		keymaps->insertItem(keymap_map);
+
+	    map.close();
+	}
+
+	if (keymap_map == current_map) {
+	    keymaps->setSelected(i + 1, true);
+	}
     }
 
     // have to "+1" because the "current language" listItem... remember?
 
     connect(keymaps, SIGNAL(highlighted(int)), SLOT(setMap(int)));
 
-
     QGrid *add_remove_grid = new QGrid(2, map_group);
     add_remove_grid->setMargin(3);
     add_remove_grid->setSpacing(3);
 
     add_button = new QPushButton(tr("Add"), add_remove_grid);
-    add_button->setFlat((bool)1);
+    add_button->setFlat(TRUE);
     connect(add_button, SIGNAL(clicked()), SLOT(addMap()));
 
     remove_button = new QPushButton(tr("Remove"), add_remove_grid);
-    remove_button->setFlat((bool)1);
-    if ((int)map_dir.count() >= keymaps->currentItem()) 
-        remove_button->setDisabled(true);
+    remove_button->setFlat(TRUE);
+    if (default_maps.find(QFileInfo(current_map).fileName()) != default_maps.end())
+	remove_button->setDisabled(true);
     connect(remove_button, SIGNAL(clicked()), SLOT(removeMap()));
 
     // make a box that will contain the buttons on the bottom
@@ -153,7 +151,7 @@ ConfigDlg::ConfigDlg () : QTabWidget ()
     pick_button = new QCheckBox(tr("Pickboard"), other_grid);
 
     config.setGroup ("general");
-    bool pick_open = config.readBoolEntry ("usePickboard", (bool)0); // default closed
+    bool pick_open = config.readBoolEntry ("usePickboard", FALSE); // default closed
     if (pick_open) {
 
         pick_button->setChecked(true);
@@ -163,7 +161,7 @@ ConfigDlg::ConfigDlg () : QTabWidget ()
     connect (pick_button, SIGNAL(clicked()), this, SLOT(pickTog()));
 
     repeat_button = new QCheckBox(tr("Key Repeat"), other_grid);
-    bool repeat_on = config.readBoolEntry ("useRepeat", (bool)1);
+    bool repeat_on = config.readBoolEntry ("useRepeat", TRUE);
 
     if (repeat_on) {
 
@@ -171,7 +169,6 @@ ConfigDlg::ConfigDlg () : QTabWidget ()
     }
     connect (repeat_button, SIGNAL(clicked()), this, SLOT(repeatTog()));
 
-
     /*
      * 'color' tab
      */
@@ -189,7 +186,7 @@ ConfigDlg::ConfigDlg () : QTabWidget ()
     label = new QLabel(tr("Key Color"), color_box);
     keycolor_button = new QPushButton(color_box);
     connect(keycolor_button, SIGNAL(clicked()), SLOT(keyColorClicked()));
-    keycolor_button->setFlat((bool)1);
+    keycolor_button->setFlat(TRUE);
     color = config.readListEntry("keycolor", QChar(','));
     /*
      * hopefully not required
@@ -206,14 +203,14 @@ ConfigDlg::ConfigDlg () : QTabWidget ()
     label = new QLabel(tr("Key Pressed Color"), color_box);
     keycolor_pressed_button = new QPushButton(color_box);
     connect(keycolor_pressed_button, SIGNAL(clicked()), SLOT(keyColorPressedClicked()));
-    keycolor_pressed_button->setFlat((bool)1);
+    keycolor_pressed_button->setFlat(TRUE);
     color = config.readListEntry("keycolor_pressed", QChar(','));
     keycolor_pressed_button->setPalette(QPalette((QColor(color[0].toInt(), color[1].toInt(), color[2].toInt()))));
 
     label = new QLabel(tr("Line Color"), color_box);
     keycolor_lines_button = new QPushButton(color_box);
     connect(keycolor_lines_button, SIGNAL(clicked()), SLOT(keyColorLinesClicked()));
-    keycolor_lines_button->setFlat((bool)1);
+    keycolor_lines_button->setFlat(TRUE);
     color = config.readListEntry("keycolor_lines", QChar(','));
     keycolor_lines_button->setPalette(QPalette((QColor(color[0].toInt(), color[1].toInt(), color[2].toInt()))));
 
@@ -221,14 +218,98 @@ ConfigDlg::ConfigDlg () : QTabWidget ()
     label = new QLabel(tr("Text Color"), color_box);
     textcolor_button = new QPushButton(color_box);
     connect(textcolor_button, SIGNAL(clicked()), SLOT(textColorClicked()));
-    textcolor_button->setFlat((bool)1);
+    textcolor_button->setFlat(TRUE);
     color = config.readListEntry("textcolor", QChar(','));
     textcolor_button->setPalette(QPalette((QColor(color[0].toInt(), color[1].toInt(), color[2].toInt()))));
 
-
     label = new QLabel("", color_box); // a spacer so the above buttons dont expand
     label->setSizePolicy(QSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding));
+}
+
+ConfigDlg::~ConfigDlg()
+{
+    emit reloadSw();
+}
+
+QStringList ConfigDlg::loadSw()
+{
+    Config *config = new Config("multikey");
+    config->setGroup("keymaps");
+    QDir map_dir(QPEApplication::qpeDir() + "/share/multikey", "*.keymap");
+    QStringList d_maps = map_dir.entryList(); // so i can access it in other places
+    QStringList c_maps = config->readListEntry("maps", QChar('|'));
+    QStringList s_maps = config->readListEntry("sw", QChar('|'));
+    delete config;
+
+    if (!s_maps.count())
+    {
+	s_maps = d_maps+c_maps;
+    }
+    else
+    {
+	/* Clear non existents entries */
+	QStringList s_copy = s_maps;
+	for (uint i = 0; i < s_copy.count(); ++i) {
+	    if (d_maps.find(s_copy[i]) == d_maps.end()
+		&& c_maps.find(s_copy[i]) == c_maps.end()) {
+		s_maps.remove(s_copy[i]);
+	    }
+	}
+	/* Update sw_maps from default_maps */
+	for (uint i = 0; i < d_maps.count(); ++i) {
+	    if (s_maps.find(d_maps[i]) == s_maps.end()) {
+		s_maps.append(d_maps[i]);
+	    }
+	}
+	/* Update sw_maps from custom_maps */
+	for (uint i = 0; i < c_maps.count(); ++i) {
+	    if (s_maps.find(c_maps[i]) == s_maps.end()) {
+		s_maps.append(c_maps[i]);
+	    }
+	}
+    }
+
+    return s_maps;
+}
+
+void ConfigDlg::moveSelectedUp()
+{
+    int i = keymaps->currentItem();
+    /* Ignore Current Language */
+    if (i > 1) {
+	QString t = sw_maps[i-1];
+	sw_maps[i-1] = sw_maps[i-2];
+	sw_maps[i-2] = t;
+
+    	QString item = keymaps->currentText();
+	keymaps->removeItem(i);
+	keymaps->insertItem(item, i-1);
+	keymaps->setCurrentItem(i-1);
+
+	Config config("multikey");
+	config.setGroup("keymaps");
+	config.writeEntry("sw", sw_maps, QChar('|'));
+    }
+}
 
+void ConfigDlg::moveSelectedDown()
+{
+    int i = keymaps->currentItem();
+    /* Ignore Current Language */
+    if (i > 0 && i < (int)keymaps->count() - 1) {
+	QString t = sw_maps[i-1];
+	sw_maps[i-1] = sw_maps[i];
+	sw_maps[i] = t;
+
+    	QString item = keymaps->currentText();
+	keymaps->removeItem(i);
+	keymaps->insertItem(item, i+1);
+	keymaps->setCurrentItem(i+1);
+
+	Config config("multikey");
+	config.setGroup("keymaps");
+	config.writeEntry("sw", sw_maps, QChar('|'));
+    }
 }
 
 void ConfigDlg::pickTog() {
@@ -271,15 +352,15 @@ void ConfigDlg::setMap(int index) {
         remove_button->setDisabled(true);
         emit setMapToDefault();
     }
-    else if ((uint)index <= default_maps.count()) {
+    else if (default_maps.find(sw_maps[index-1]) != default_maps.end()) {
 
         remove_button->setDisabled(true);
-        emit setMapToFile(QPEApplication::qpeDir() + "share/multikey/" + default_maps[index - 1]);
+        emit setMapToFile(QPEApplication::qpeDir() + "share/multikey/" + sw_maps[index - 1]);
 
     } else {
 
         remove_button->setEnabled(true);
-        emit setMapToFile(custom_maps[index - default_maps.count() - 1]);
+        emit setMapToFile(sw_maps[index - 1]);
     }
 }
 
@@ -295,6 +376,8 @@ void ConfigDlg::addMap() {
     QStringList maps = config.readListEntry("maps", QChar('|'));
     maps.append(map);
     custom_maps.append(map);
+    if (sw_maps.find(map) == sw_maps.end())
+	sw_maps.append(map);
 
     QFile map_file (map);
     if (map_file.open(IO_ReadOnly)) {
@@ -321,6 +404,7 @@ void ConfigDlg::addMap() {
 
 
     config.writeEntry("maps", maps, QChar('|'));
+    config.writeEntry("sw", sw_maps, QChar('|'));
     config.writeEntry("current", map);
 
 }
@@ -333,12 +417,14 @@ void ConfigDlg::removeMap() {
     // delete the next selected item cus you just moved it up
     keymaps->removeItem(keymaps->currentItem() + 1);
 
-    custom_maps.remove(custom_maps.at(keymaps->currentItem() - default_maps.count()));
+    custom_maps.remove(sw_maps[keymaps->currentItem()]);
+    sw_maps.remove(sw_maps.at(keymaps->currentItem()));
 
     // write the changes
     Config config ("multikey");
     config.setGroup("keymaps");
     config.writeEntry("maps", custom_maps, QChar('|'));
+    config.writeEntry("sw", sw_maps, QChar('|'));
 }
 
 /* ConfigDlg::slots for the color buttons {{{1
diff --git a/inputmethods/multikey/configdlg.h b/inputmethods/multikey/configdlg.h
index 336932b..ea157c5 100644
--- a/inputmethods/multikey/configdlg.h
+++ b/inputmethods/multikey/configdlg.h
@@ -13,6 +13,8 @@ class ConfigDlg : public QTabWidget
 
 public:
     ConfigDlg ();
+    ~ConfigDlg ();
+    static QStringList ConfigDlg::loadSw();
 
 signals:
     void pickboardToggled(bool on_off);
@@ -21,6 +23,11 @@ signals:
     void setMapToFile(QString map);
     void reloadKeyboard();
     void configDlgClosed();
+    void reloadSw();
+
+protected slots:
+    void moveSelectedUp();
+    void moveSelectedDown();
 
 private slots:
     void pickTog();
@@ -47,6 +54,7 @@ private:
 
     QStringList default_maps; // the maps in your share/multikey/ dir
     QStringList custom_maps; // maps you added with the 'add' button
+    QStringList sw_maps; // maps, which used in keyboard switch rotation ring
 
     /* color buttons */
     QPushButton *keycolor_button;
diff --git a/inputmethods/multikey/keyboard.cpp b/inputmethods/multikey/keyboard.cpp
index 2ce6dd3..aec0ad3 100644
--- a/inputmethods/multikey/keyboard.cpp
+++ b/inputmethods/multikey/keyboard.cpp
@@ -31,7 +31,7 @@
 #include <qpe/qpeapplication.h>
 #include <qpe/config.h>
 #include <ctype.h>
-#include <qfile.h>
+#include <qdir.h>
 #include <qtextstream.h>
 #include <qstringlist.h>
 
@@ -94,12 +94,15 @@ Keyboard::Keyboard(QWidget* parent, const char* _name, WFlags f) :
     repeatTimer = new QTimer( this );
     connect( repeatTimer, SIGNAL(timeout()), this, SLOT(repeat()) );
 
+    QCopChannel* kbdChannel = new QCopChannel("MultiKey/Keyboard", this);
+    connect(kbdChannel, SIGNAL(received(const QCString &, const QByteArray &)),
+	    this, SLOT(receive(const QCString &, const QByteArray &)));
 }
 
 Keyboard::~Keyboard() {
 
     if ( configdlg ) { 
-        delete (ConfigDlg *) configdlg; 
+        delete configdlg;
         configdlg = 0;
     }
 
@@ -417,7 +420,7 @@ void Keyboard::mousePressEvent(QMouseEvent *e)
 
             if ( configdlg ) { 
 
-                delete (ConfigDlg *) configdlg; 
+                delete configdlg; 
                 configdlg = 0;
             }
             else {
@@ -434,6 +437,8 @@ void Keyboard::mousePressEvent(QMouseEvent *e)
                        this, SLOT(reloadKeyboard()));
                connect(configdlg, SIGNAL(configDlgClosed()),
                        this, SLOT(cleanupConfigDlg()));
+               connect(configdlg, SIGNAL(reloadSw()),
+                       this, SLOT(reloadSw()));
                configdlg->showMaximized();
                configdlg->show();
                configdlg->raise();
@@ -760,6 +765,17 @@ void Keyboard::mousePressEvent(QMouseEvent *e)
 
 }
 
+void Keyboard::receive(const QCString &msg, const QByteArray &data)
+{
+    if (msg == "setmultikey(QString)") {
+	QDataStream stream(data, IO_ReadOnly);
+        QString map;
+        stream >> map;
+	setMapToFile(map);
+    } else if (msg == "getmultikey()") {
+	reloadSw();
+    }
+}
 
 /* Keyboard::mouseReleaseEvent {{{1 */
 void Keyboard::mouseReleaseEvent(QMouseEvent*)
@@ -911,11 +927,22 @@ void Keyboard::toggleRepeat(bool on) {
 void Keyboard::cleanupConfigDlg() {
 
     if ( configdlg ) { 
-        delete (ConfigDlg *) configdlg; 
+        delete configdlg; 
         configdlg = 0;
     }
 }
 
+void Keyboard::reloadSw() {
+    QCopEnvelope e("MultiKey/Switcher", "setsw(QString,QString)");
+
+    Config* config = new Config("multikey");
+    config->setGroup("keymaps");
+    QString current_map = config->readEntry("current", "en.keymap");
+    delete config;
+
+    e << ConfigDlg::loadSw().join("|") << current_map;
+}
+
 /* Keyboard::setMapTo ... {{{1 */
 void Keyboard::setMapToDefault() {
 
@@ -926,6 +953,11 @@ void Keyboard::setMapToDefault() {
     QString l = config->readEntry( "Language" , "en" );
     delete config;
 
+    /* if Language represents as en_US, ru_RU, etc... */
+    int d = l.find('_');
+    if (d != -1) {
+	l.remove(d, l.length()-d);
+    }
     QString key_map = QPEApplication::qpeDir() + "share/multikey/" 
             + l + ".keymap";
 
@@ -1506,7 +1538,7 @@ void Keys::setKeysFromFile(const char * filename) {
                 buf = t.readLine();
             }
 
-            // other variables like lang & title
+            // other variables like lang & title & sw
             else if (buf.contains(QRegExp("^\\s*[a-zA-Z]+\\s*=\\s*[a-zA-Z0-9/]+\\s*$", FALSE, FALSE))) {
 
                 QTextStream tmp (buf, IO_ReadOnly);
diff --git a/inputmethods/multikey/keyboard.h b/inputmethods/multikey/keyboard.h
index 20c5cee..0b56988 100644
--- a/inputmethods/multikey/keyboard.h
+++ b/inputmethods/multikey/keyboard.h
@@ -130,9 +130,11 @@ private slots:
     void setMapToDefault();
     void setMapToFile(QString map);
     void cleanupConfigDlg();
+    void reloadSw();
 
     // used to redraw keyboard after edited colors
     void reloadKeyboard();
+    void receive( const QCString &msg, const QByteArray &data );
     
 private:
     int getKey( int &w, int j = -1 );
--
cgit v0.9.0.2