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
22 #include <kstandarddirs.h>
23 #include <kmessagebox.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
)
36 KStandardDirs
*dirs
= KGlobal::dirs();
37 QString romkana
= dirs
->findResource("data", "kiten/romkana.cnv");
40 KMessageBox::error(0, i18n("Romaji information file not installed, so Romaji conversion cannot be used."));
46 if (!f
.open(IO_ReadOnly
))
48 KMessageBox::error(0, i18n("Romaji information could not be loaded, so Romaji conversion cannot be used."));
52 t
.setCodec(QTextCodec::codecForName("eucJP"));
55 QString s
= t
.readLine();
57 QChar first
= s
.at(0);
58 if (first
== '#') // comment!
62 else if (first
== '$') // header
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
;
86 KRomajiEdit::~KRomajiEdit()
90 void KRomajiEdit::setKana(int _kana
)
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")
116 else if (kana
== "english")
122 if (kana
== "english" || ji
.isEmpty())
124 KLineEdit::keyPressEvent(e
);
128 if (shift
) // shift for katakana
130 if (kana
== "hiragana")
134 //kdDebug() << "--------------------\n";
138 QString _text
= text();
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;
159 //kdDebug() << "i is " << i << ", length is " << len << endl;
160 curKana
= _text
.left(i
);
164 //kdDebug() << "ji = " << ji << endl;
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")
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));
199 setText(curKana
+ katakana
[ji
.at(0) == 'n'? "n'" : "t-"] + farRight
.at(0));
201 if (kana
== "katakana")
206 // test for hanging n
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")
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")
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'"]);
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
);
274 #include "kromajiedit.moc"