moved kdeaccessibility kdeaddons kdeadmin kdeartwork kdebindings kdeedu kdegames...
[kdeedu.git] / kiten / kromajiedit.cpp
blob3ec2ad47484482a7c3976701a436abb47dda4288
1 /**
2 This file is part of Kiten, a KDE Japanese Reference Tool...
3 Copyright (C) 2001 Jason Katz-Brown <jason@katzbrown.com>
5 This program is free software; you can redistribute it and/or modify
6 it under the terms of the GNU General Public License as published by
7 the Free Software Foundation; either version 2 of the License, or
8 (at your option) any later version.
10 This program is distributed in the hope that it will be useful,
11 but WITHOUT ANY WARRANTY; without even the implied warranty of
12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 GNU General Public License for more details.
15 You should have received a copy of the GNU General Public License
16 along with this program; if not, write to the Free Software
17 Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
18 USA
19 **/
21 #include <kdebug.h>
22 #include <kstandarddirs.h>
23 #include <kmessagebox.h>
24 #include <klocale.h>
25 #include <qfile.h>
26 #include <qpopupmenu.h>
27 #include <qtextcodec.h>
29 #include "kromajiedit.h"
31 KRomajiEdit::KRomajiEdit(QWidget *parent, const char *name)
32 : KLineEdit(parent, name)
34 kana = "unset";
36 KStandardDirs *dirs = KGlobal::dirs();
37 QString romkana = dirs->findResource("data", "kiten/romkana.cnv");
38 if (romkana.isNull())
40 KMessageBox::error(0, i18n("Romaji information file not installed, so Romaji conversion cannot be used."));
41 return;
44 QFile f(romkana);
46 if (!f.open(IO_ReadOnly))
48 KMessageBox::error(0, i18n("Romaji information could not be loaded, so Romaji conversion cannot be used."));
51 QTextStream t(&f);
52 t.setCodec(QTextCodec::codecForName("eucJP"));
53 while (!t.eof())
55 QString s = t.readLine();
57 QChar first = s.at(0);
58 if (first == '#') // comment!
60 // nothing
62 else if (first == '$') // header
64 if (kana == "unset")
65 kana = "hiragana";
66 else
67 kana = "katakana";
69 else // body
71 QStringList things(QStringList::split(QChar(' '), s));
72 QString thekana(things.first());
73 QString romaji(*things.at(1));
75 if (kana == "hiragana")
76 hiragana[romaji] = thekana;
77 else if (kana == "katakana")
78 katakana[romaji] = thekana;
81 f.close();
83 kana = "english";
86 KRomajiEdit::~KRomajiEdit()
90 void KRomajiEdit::setKana(int _kana)
92 switch (_kana)
94 case 0:
95 kana = "english";
96 break;
97 case 1:
98 kana = "hiragana";
99 break;
100 //case 2:
101 //kana = "katakana";
102 //break;
106 // TODO allow editing not only at end
107 void KRomajiEdit::keyPressEvent(QKeyEvent *e)
109 bool shift = e->state() & ShiftButton;
110 QString ji = e->text();
112 if (shift && e->key() == Key_Space) // switch hiragana/english
114 if (kana == "hiragana")
115 kana = "english";
116 else if (kana == "english")
117 kana = "hiragana";
119 return;
122 if (kana == "english" || ji.isEmpty())
124 KLineEdit::keyPressEvent(e);
125 return;
128 if (shift) // shift for katakana
130 if (kana == "hiragana")
131 kana = "katakana";
134 //kdDebug() << "--------------------\n";
136 QString curEng;
137 QString curKana;
138 QString _text = text();
140 int i;
141 unsigned int len = _text.length();
142 //kdDebug() << "length = " << len << endl;
143 for (i = len - 1; i >= 0; i--)
145 QChar at = _text.at(i);
147 //kdDebug() << "at = " << QString(at) << endl;
149 if (at.row() == 0 && at != '.')
151 //kdDebug() << "prepending " << QString(at) << endl;
152 curEng.prepend(at);
154 else
155 break;
157 i++;
159 //kdDebug() << "i is " << i << ", length is " << len << endl;
160 curKana = _text.left(i);
162 ji.prepend(curEng);
163 ji = ji.lower();
164 //kdDebug() << "ji = " << ji << endl;
166 QString replace;
168 //kdDebug () << "kana is " << kana << endl;
169 if (kana == "hiragana")
170 replace = hiragana[ji];
171 else if (kana == "katakana")
172 replace = katakana[ji];
174 //kdDebug() << "replace = " << replace << endl;
176 if (!!replace) // if (replace has something in it)
178 //kdDebug() << "replace isn't empty\n";
180 setText(curKana + replace);
182 if (kana == "katakana")
183 kana = "hiragana";
184 return;
186 else
188 //kdDebug() << "replace is empty\n";
189 QString farRight(ji.right(ji.length() - 1));
190 //kdDebug() << "ji = " << ji << endl;
191 //kdDebug() << "farRight = " << farRight << endl;
193 // test if we need small tsu
194 if (ji.at(0) == farRight.at(0)) // if two letters are same, and we can add a twoletter length kana
196 if (kana == "hiragana")
197 setText(curKana + hiragana[ji.at(0) == 'n'? "n'" : "t-"] + farRight.at(0));
198 else
199 setText(curKana + katakana[ji.at(0) == 'n'? "n'" : "t-"] + farRight.at(0));
201 if (kana == "katakana")
202 kana = "hiragana";
203 return;
206 // test for hanging n
207 QString newkana;
208 if (kana == "hiragana")
210 newkana = hiragana[farRight];
211 //kdDebug() << "newkana = " << newkana << endl;
212 if (ji.at(0) == 'n' && !!newkana)
214 //kdDebug() << "doing the n thing\n";
216 setText(curKana + hiragana["n'"] + newkana);
218 if (kana == "katakana")
219 kana = "hiragana";
220 return;
223 else
225 newkana = katakana[farRight];
226 if (ji.at(0) == 'n' && !!newkana)
228 //kdDebug() << "doing the n thing - katakana\n";
230 setText(curKana + katakana["n'"] + newkana);
232 if (kana == "katakana")
233 kana = "hiragana";
234 return;
239 if ( e->key() == Key_Return || e->key() == Key_Enter ) // take care of pending n
241 if (kana == "hiragana")
243 if (_text[len-1] == 'n')
244 setText(curKana + hiragana["n'"]);
246 else
248 if (_text[len-1] == 'N')
249 setText(curKana + katakana["n'"]);
253 KLineEdit::keyPressEvent(e); // don't think we'll get here :)
256 QPopupMenu *KRomajiEdit::createPopupMenu()
258 QPopupMenu *popup = KLineEdit::createPopupMenu();
259 popup->insertSeparator();
260 popup->insertItem(i18n("English"), 0);
261 popup->insertItem(i18n("Kana"), 1);
263 if (kana == "english")
264 popup->setItemChecked(0, true);
265 else if (kana == "hiragana")
266 popup->setItemChecked(1, true);
268 connect(popup, SIGNAL(activated(int)), SLOT(setKana(int)));
270 emit aboutToShowContextMenu(popup);
271 return popup;
274 #include "kromajiedit.moc"