1
17 package guk.im;
18
19 import java.awt.event.InputEvent;
20 import java.io.*;
21 import java.util.*;
22
23
29 public class LocaleHandler {
30
38 public LocaleHandler(Locale locale, String fileName) throws IOException {
39 this.locale = locale;
41 InputStream is = GateIM.class.getResourceAsStream(GateIM.getIMBase()
42 + fileName);
43 if (is==null) throw new IllegalArgumentException
44 ("Failed to retrieve resource '"+fileName+"'. Please reset classpath.");
45 BufferedReader br = new BufferedReader(new InputStreamReader(is));
46 String line = br.readLine();
47 initialState = new State();
48
49 String remains;
50 String keyStr;
51 String keycapStr;
52 String keymapName;
53 String number;
54 String output;
55 keycap = new HashMap();
56 int start, end;
57 while(line != null){
58 line = line.trim();
61 if( line.startsWith("#") || line.startsWith("//" ) ||
62 line.length() == 0 ){
63 line = br.readLine();
64 continue;
65 }
66 try {
67 remains = line;
68 keycapStr = null;
69 keymapName = null;
70 if(remains.startsWith("bind")){
71 remains = remains.substring(4).trim();
74 keyStr = "";
76 start = remains.indexOf('\"');
77 for(end = start + 1 ; remains.charAt(end)!='\"'; end++){
78 if(remains.charAt(end) == '\\') end++;
79 keyStr += remains.charAt(end);
80 }
81 remains = remains.substring(end + 1).trim();
82 if(remains.startsWith("digit")) {
83 remains = remains.substring(5).trim();
86 output = "";
88 while(remains.startsWith("0x")){
89 number = remains.substring(2,6);
91 output += (char)Integer.parseInt(number, 16);
92 remains = remains.substring(6);
94 }
95 remains = remains.trim();
96
97 if(remains.length() > 0){
99 output = "";
100 while(remains.startsWith("0x")){
101 number = remains.substring(2,6);
103 output += (char)Integer.parseInt(number, 16);
104 remains = remains.substring(6);
106 }
107 }
108 addAction(keyStr, output, output);
109 } else if(remains.startsWith("send")) {
111 remains = remains.substring(4).trim();
114 output = "";
116 while(remains.startsWith("0x")) {
117 number = remains.substring(2,6);
119 output += (char)Integer.parseInt(number, 16);
120 remains = remains.substring(6).trim();
121 }
122 if(remains.startsWith("keycap")){
124 remains = remains.substring(6).trim();
126 keycapStr = "";
128 while(remains.startsWith("0x")){
129 number = remains.substring(2,6);
131 keycapStr += (char)Integer.parseInt(number, 16);
132 remains = remains.substring(6).trim();
133 }
134 }
135 if (remains.startsWith("keymap")){
137 remains = remains.substring(6).trim();
139 } else if(remains.length() == 0) {
141 addAction(keyStr, output, keycapStr);
143 } else System.err.println("[GATE Unicode input method loader]" +
144 " Ignoring line: " + line);
145 } else if(remains.startsWith("resetorsend")){
146 remains = remains.substring(11).trim();
149 } else System.err.println("[GATE Unicode input method loader]" +
151 " Ignoring line: " + line);
152 } else if(remains.startsWith("keymap")){
153 } else if(remains.startsWith("inputmethod")){
155 } else if(remains.startsWith("option")){
157 } else System.err.println("[GATE Unicode input method loader]" +
159 " Ignoring line: " + line);
160 } catch(StringIndexOutOfBoundsException siobe) {
161 System.err.println("[GATE Unicode input method loader]" +
162 " Ignoring line: " + line);
163 }
164 line = br.readLine();
165 } }
168
173 protected State addAction(String keyDesc,
174 String textToAdd,
175 String keycapStr) {
176 List keyList = new ArrayList(1);
178 int modifiers = 0;
179 char keyChar;
180 int offset = 0;
181 while(keyDesc.length() > 0) {
182 modifiers = 0;
184 offset = 0;
185 if(keyDesc.startsWith("C-")) {
186 modifiers |= InputEvent.CTRL_MASK;
188 offset = 2;
189 } else if(keyDesc.startsWith("M-")) {
190 modifiers |= InputEvent.ALT_MASK;
192 offset = 2;
193 }
194 keyChar = keyDesc.charAt(offset);
195 keyDesc = keyDesc.substring(offset + 1).trim();
196 keyList.add(new Key(keyChar, modifiers));
197 }
199 if(keycapStr != null && keyList.size() == 1) {
201 keycap.put(keyList.get(0), keycapStr);
202 }
204
205 State nextState, currentState = initialState;
207 Action currentAction = null;
208 Iterator keyIter = keyList.iterator();
209 Key currentKey;
210 while(keyIter.hasNext()) {
211 currentKey = (Key)keyIter.next();
212 currentAction = currentState.getNext(currentKey);
213 if(currentAction == null){
214 nextState = new State();
215 currentAction = new Action(nextState);
216 currentState.addAction(currentKey, currentAction);
217 currentAction.setComposedText("" + currentKey.keyChar);
218 } else nextState = currentAction.getNext();
219 currentState = nextState;
220 } currentAction.setComposedText(textToAdd);
222 currentState.setFinal(true);
223 return currentState;
224 }
226
230 public State getInitialState(){
231 return initialState;
232 }
233
234
238 public Map getKeyCap(){
239 return keycap;
240 }
241
242
247 State initialState;
248
252 Map keycap;
253
254
258 Locale locale;
259 }