summaryrefslogtreecommitdiff
path: root/core/applets/multikeyapplet/multikey.cpp
blob: f1227ef1cae5d6e3b4692594f074d8727957355c (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
/**********************************************************************
** Copyright (C) 2004 Anton Kachalov mouse@altlinux.ru
**  All rights reserved.
**
** This file may be distributed and/or modified under the terms of the
** GNU General Public License version 2 as published by the Free Software
** Foundation and appearing in the file LICENSE.GPL included in the
** packaging of this file.
**
** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
**
**********************************************************************/

#include "multikey.h"

#include <qpe/global.h>
#include <qpe/config.h>
#include <qpe/qcopenvelope_qws.h>
#include <qpe/qpeapplication.h>

#include <qlabel.h>
#include <qdir.h>
#include <qfileinfo.h>
#include <qcopchannel_qws.h>

Multikey::Multikey(QWidget *parent) : QLabel(parent), popupMenu(this), current("EN")
{
    QCopChannel* swChannel = new QCopChannel("MultiKey/Switcher", this);
    connect( swChannel, SIGNAL(received(const QCString &, const QByteArray &)),
	     this, SLOT(message(const QCString &, const QByteArray &)));

    setFont( QFont( "Helvetica", 10, QFont::Normal ) );
    lang = 0;
    QCopEnvelope e("MultiKey/Keyboard", "getmultikey()");
    setText("EN");
    popupMenu.insertItem("EN", -1);
    show();
}

void Multikey::mousePressEvent(QMouseEvent *ev)
{
    if (ev->button() == RightButton) {

	QPoint p = mapToGlobal(QPoint(0, 0));
	QSize s = popupMenu.sizeHint();
	int opt = popupMenu.exec(QPoint(p.x() + (width() / 2) - (s.width() / 2),
					p.y() - s.height()), 0);

	if (opt == -1)
	    return;
	lang = opt;
    } else {
	lang = lang < sw_maps.count()-1 ? lang+1 : 0;
    }

    QCopEnvelope e("MultiKey/Keyboard", "setmultikey(QString)");
    //qDebug("Lang=%d, count=%d, lab=%s", lang, sw_maps.count(), labels[lang].ascii());
    e << sw_maps[lang];
    setText(labels[lang]);
}

void Multikey::message(const QCString &message, const QByteArray &data)
{
    if ( message == "setsw(QString,QString)" ) {

	QDataStream stream(data, IO_ReadOnly);
	QString maps, current_map;
	stream >> maps >> current_map;
	QStringList sw = QStringList::split(QChar('|'), maps);
	sw.append(current_map);

	QDir map_dir(QPEApplication::qpeDir() + "/share/multikey/", "*.keymap");
	lang = 0;
	labels.clear();
	sw_maps.clear();
	popupMenu.clear();

	for (uint i = 0; i < sw.count(); ++i) {
	    QString keymap_map;
	    if (sw[i][0] != '/') {

		keymap_map =  map_dir.absPath() + "/" + sw[i];
	    } else {

		if ((map_dir.exists(QFileInfo(sw[i]).fileName(), false)
		     && i != sw.count()-1) || !QFile::exists(sw[i])) {
		    continue;
		}
		keymap_map = sw[i];
	    }

	    QFile map(keymap_map);
	    if (map.open(IO_ReadOnly)) {
		QString line;

		map.readLine(line, 1024);
		while (!map.atEnd()) {

		    if (line.find(QRegExp("^sw\\s*=\\s*")) != -1) {
                
			if (i != sw.count()-1) {
			    if (keymap_map == current_map) {
				lang = i;
			    }
			    sw_maps.append(keymap_map);
			    labels.append(line.right(line.length() - line.find(QChar('=')) - 1).stripWhiteSpace());
			    popupMenu.insertItem(labels[labels.count()-1], labels.count()-1);
			} else {
			    current = line.right(line.length() - line.find(QChar('=')) - 1).stripWhiteSpace();
			}
			break;
		    }
		    map.readLine(line, 1024);
		}
		map.close();
	    }
	}

	setText(current);
    }
}