Mercurial > hg > Members > nobuyasu > tightVNCProxy
comparison src/OptionsFrame.java @ 0:30bb7074acb1
upload all file of tighVNCProxy
author | e085711 |
---|---|
date | Tue, 12 Apr 2011 12:58:05 +0900 |
parents | |
children |
comparison
equal
deleted
inserted
replaced
-1:000000000000 | 0:30bb7074acb1 |
---|---|
1 // | |
2 // Copyright (C) 2001 HorizonLive.com, Inc. All Rights Reserved. | |
3 // Copyright (C) 2001 Constantin Kaplinsky. All Rights Reserved. | |
4 // Copyright (C) 2000 Tridia Corporation. All Rights Reserved. | |
5 // Copyright (C) 1999 AT&T Laboratories Cambridge. All Rights Reserved. | |
6 // | |
7 // This is free software; you can redistribute it and/or modify | |
8 // it under the terms of the GNU General Public License as published by | |
9 // the Free Software Foundation; either version 2 of the License, or | |
10 // (at your option) any later version. | |
11 // | |
12 // This software is distributed in the hope that it will be useful, | |
13 // but WITHOUT ANY WARRANTY; without even the implied warranty of | |
14 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |
15 // GNU General Public License for more details. | |
16 // | |
17 // You should have received a copy of the GNU General Public License | |
18 // along with this software; if not, write to the Free Software | |
19 // Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, | |
20 // USA. | |
21 // | |
22 | |
23 // | |
24 // Options frame. | |
25 // | |
26 // This deals with all the options the user can play with. | |
27 // It sets the encodings array and some booleans. | |
28 // | |
29 | |
30 import java.awt.*; | |
31 import java.awt.event.*; | |
32 | |
33 class OptionsFrame extends Frame | |
34 implements WindowListener, ActionListener, ItemListener { | |
35 | |
36 static String[] names = { | |
37 "Encoding", | |
38 "Compression level", | |
39 "JPEG image quality", | |
40 "Cursor shape updates", | |
41 "Use CopyRect", | |
42 "Restricted colors", | |
43 "Mouse buttons 2 and 3", | |
44 "View only", | |
45 "Scale remote cursor", | |
46 "Share desktop", | |
47 }; | |
48 | |
49 static String[][] values = { | |
50 { "Auto", "Raw", "RRE", "CoRRE", "Hextile", "Zlib", "Tight", "ZRLE" }, | |
51 { "Default", "1", "2", "3", "4", "5", "6", "7", "8", "9" }, | |
52 { "JPEG off", "0", "1", "2", "3", "4", "5", "6", "7", "8", "9" }, | |
53 { "Enable", "Ignore", "Disable" }, | |
54 { "Yes", "No" }, | |
55 { "Yes", "No" }, | |
56 { "Normal", "Reversed" }, | |
57 { "Yes", "No" }, | |
58 { "No", "50%", "75%", "125%", "150%" }, | |
59 { "Yes", "No" }, | |
60 }; | |
61 | |
62 final int | |
63 encodingIndex = 0, | |
64 compressLevelIndex = 1, | |
65 jpegQualityIndex = 2, | |
66 cursorUpdatesIndex = 3, | |
67 useCopyRectIndex = 4, | |
68 eightBitColorsIndex = 5, | |
69 mouseButtonIndex = 6, | |
70 viewOnlyIndex = 7, | |
71 scaleCursorIndex = 8, | |
72 shareDesktopIndex = 9; | |
73 | |
74 Label[] labels = new Label[names.length]; | |
75 Choice[] choices = new Choice[names.length]; | |
76 Button closeButton; | |
77 VncViewer viewer; | |
78 | |
79 | |
80 // | |
81 // The actual data which other classes look at: | |
82 // | |
83 | |
84 int preferredEncoding; | |
85 int compressLevel; | |
86 int jpegQuality; | |
87 boolean useCopyRect; | |
88 boolean requestCursorUpdates; | |
89 boolean ignoreCursorUpdates; | |
90 | |
91 boolean eightBitColors; | |
92 | |
93 boolean reverseMouseButtons2And3; | |
94 boolean shareDesktop; | |
95 boolean viewOnly; | |
96 int scaleCursor; | |
97 | |
98 boolean autoScale; | |
99 int scalingFactor; | |
100 | |
101 // | |
102 // Constructor. Set up the labels and choices from the names and values | |
103 // arrays. | |
104 // | |
105 | |
106 OptionsFrame(VncViewer v) { | |
107 super("TightVNC Options"); | |
108 | |
109 viewer = v; | |
110 | |
111 GridBagLayout gridbag = new GridBagLayout(); | |
112 setLayout(gridbag); | |
113 | |
114 GridBagConstraints gbc = new GridBagConstraints(); | |
115 gbc.fill = GridBagConstraints.BOTH; | |
116 | |
117 for (int i = 0; i < names.length; i++) { | |
118 labels[i] = new Label(names[i]); | |
119 gbc.gridwidth = 1; | |
120 gridbag.setConstraints(labels[i],gbc); | |
121 add(labels[i]); | |
122 | |
123 choices[i] = new Choice(); | |
124 gbc.gridwidth = GridBagConstraints.REMAINDER; | |
125 gridbag.setConstraints(choices[i],gbc); | |
126 add(choices[i]); | |
127 choices[i].addItemListener(this); | |
128 | |
129 for (int j = 0; j < values[i].length; j++) { | |
130 choices[i].addItem(values[i][j]); | |
131 } | |
132 } | |
133 | |
134 closeButton = new Button("Close"); | |
135 gbc.gridwidth = GridBagConstraints.REMAINDER; | |
136 gridbag.setConstraints(closeButton, gbc); | |
137 add(closeButton); | |
138 closeButton.addActionListener(this); | |
139 | |
140 pack(); | |
141 | |
142 addWindowListener(this); | |
143 | |
144 // Set up defaults | |
145 | |
146 choices[encodingIndex].select("Auto"); | |
147 choices[compressLevelIndex].select("Default"); | |
148 choices[jpegQualityIndex].select("6"); | |
149 choices[cursorUpdatesIndex].select("Enable"); | |
150 choices[useCopyRectIndex].select("Yes"); | |
151 choices[eightBitColorsIndex].select("No"); | |
152 choices[mouseButtonIndex].select("Normal"); | |
153 choices[viewOnlyIndex].select("No"); | |
154 choices[scaleCursorIndex].select("No"); | |
155 choices[shareDesktopIndex].select("Yes"); | |
156 | |
157 // But let them be overridden by parameters | |
158 | |
159 for (int i = 0; i < names.length; i++) { | |
160 String s = viewer.readParameter(names[i], false); | |
161 if (s != null) { | |
162 for (int j = 0; j < values[i].length; j++) { | |
163 if (s.equalsIgnoreCase(values[i][j])) { | |
164 choices[i].select(j); | |
165 } | |
166 } | |
167 } | |
168 } | |
169 | |
170 // FIXME: Provide some sort of GUI for "Scaling Factor". | |
171 | |
172 autoScale = false; | |
173 scalingFactor = 100; | |
174 String s = viewer.readParameter("Scaling Factor", false); | |
175 if (s != null) { | |
176 if (s.equalsIgnoreCase("Auto")) { | |
177 autoScale = true; | |
178 } else { | |
179 // Remove the '%' char at the end of string if present. | |
180 if (s.charAt(s.length() - 1) == '%') { | |
181 s = s.substring(0, s.length() - 1); | |
182 } | |
183 // Convert to an integer. | |
184 try { | |
185 scalingFactor = Integer.parseInt(s); | |
186 } | |
187 catch (NumberFormatException e) { | |
188 scalingFactor = 100; | |
189 } | |
190 // Make sure scalingFactor is in the range of [1..1000]. | |
191 if (scalingFactor < 1) { | |
192 scalingFactor = 1; | |
193 } else if (scalingFactor > 1000) { | |
194 scalingFactor = 1000; | |
195 } | |
196 } | |
197 } | |
198 | |
199 // Make the booleans and encodings array correspond to the state of the GUI | |
200 | |
201 setEncodings(); | |
202 setColorFormat(); | |
203 setOtherOptions(); | |
204 } | |
205 | |
206 | |
207 // | |
208 // Disable the shareDesktop option | |
209 // | |
210 | |
211 void disableShareDesktop() { | |
212 labels[shareDesktopIndex].setEnabled(false); | |
213 choices[shareDesktopIndex].setEnabled(false); | |
214 } | |
215 | |
216 // | |
217 // setEncodings looks at the encoding, compression level, JPEG | |
218 // quality level, cursor shape updates and copyRect choices and sets | |
219 // corresponding variables properly. Then it calls the VncViewer's | |
220 // setEncodings method to send a SetEncodings message to the RFB | |
221 // server. | |
222 // | |
223 | |
224 void setEncodings() { | |
225 useCopyRect = choices[useCopyRectIndex].getSelectedItem().equals("Yes"); | |
226 | |
227 preferredEncoding = RfbProto.EncodingRaw; | |
228 boolean enableCompressLevel = false; | |
229 | |
230 if (choices[encodingIndex].getSelectedItem().equals("RRE")) { | |
231 preferredEncoding = RfbProto.EncodingRRE; | |
232 } else if (choices[encodingIndex].getSelectedItem().equals("CoRRE")) { | |
233 preferredEncoding = RfbProto.EncodingCoRRE; | |
234 } else if (choices[encodingIndex].getSelectedItem().equals("Hextile")) { | |
235 preferredEncoding = RfbProto.EncodingHextile; | |
236 } else if (choices[encodingIndex].getSelectedItem().equals("ZRLE")) { | |
237 preferredEncoding = RfbProto.EncodingZRLE; | |
238 } else if (choices[encodingIndex].getSelectedItem().equals("Zlib")) { | |
239 preferredEncoding = RfbProto.EncodingZlib; | |
240 enableCompressLevel = true; | |
241 } else if (choices[encodingIndex].getSelectedItem().equals("Tight")) { | |
242 preferredEncoding = RfbProto.EncodingTight; | |
243 enableCompressLevel = true; | |
244 } else if (choices[encodingIndex].getSelectedItem().equals("Auto")) { | |
245 preferredEncoding = -1; | |
246 } | |
247 | |
248 // Handle compression level setting. | |
249 | |
250 try { | |
251 compressLevel = | |
252 Integer.parseInt(choices[compressLevelIndex].getSelectedItem()); | |
253 } | |
254 catch (NumberFormatException e) { | |
255 compressLevel = -1; | |
256 } | |
257 if (compressLevel < 1 || compressLevel > 9) { | |
258 compressLevel = -1; | |
259 } | |
260 labels[compressLevelIndex].setEnabled(enableCompressLevel); | |
261 choices[compressLevelIndex].setEnabled(enableCompressLevel); | |
262 | |
263 // Handle JPEG quality setting. | |
264 | |
265 try { | |
266 jpegQuality = | |
267 Integer.parseInt(choices[jpegQualityIndex].getSelectedItem()); | |
268 } | |
269 catch (NumberFormatException e) { | |
270 jpegQuality = -1; | |
271 } | |
272 if (jpegQuality < 0 || jpegQuality > 9) { | |
273 jpegQuality = -1; | |
274 } | |
275 | |
276 // Request cursor shape updates if necessary. | |
277 | |
278 requestCursorUpdates = | |
279 !choices[cursorUpdatesIndex].getSelectedItem().equals("Disable"); | |
280 | |
281 if (requestCursorUpdates) { | |
282 ignoreCursorUpdates = | |
283 choices[cursorUpdatesIndex].getSelectedItem().equals("Ignore"); | |
284 } | |
285 | |
286 viewer.setEncodings(); | |
287 } | |
288 | |
289 // | |
290 // setColorFormat sets eightBitColors variable depending on the GUI | |
291 // setting, causing switches between 8-bit and 24-bit colors mode if | |
292 // necessary. | |
293 // | |
294 | |
295 void setColorFormat() { | |
296 | |
297 eightBitColors = | |
298 choices[eightBitColorsIndex].getSelectedItem().equals("Yes"); | |
299 | |
300 boolean enableJPEG = !eightBitColors; | |
301 | |
302 labels[jpegQualityIndex].setEnabled(enableJPEG); | |
303 choices[jpegQualityIndex].setEnabled(enableJPEG); | |
304 } | |
305 | |
306 // | |
307 // setOtherOptions looks at the "other" choices (ones that do not | |
308 // cause sending any protocol messages) and sets the boolean flags | |
309 // appropriately. | |
310 // | |
311 | |
312 void setOtherOptions() { | |
313 | |
314 reverseMouseButtons2And3 | |
315 = choices[mouseButtonIndex].getSelectedItem().equals("Reversed"); | |
316 | |
317 viewOnly | |
318 = choices[viewOnlyIndex].getSelectedItem().equals("Yes"); | |
319 if (viewer.vc != null) | |
320 viewer.vc.enableInput(!viewOnly); | |
321 | |
322 shareDesktop | |
323 = choices[shareDesktopIndex].getSelectedItem().equals("Yes"); | |
324 | |
325 String scaleString = choices[scaleCursorIndex].getSelectedItem(); | |
326 if (scaleString.endsWith("%")) | |
327 scaleString = scaleString.substring(0, scaleString.length() - 1); | |
328 try { | |
329 scaleCursor = Integer.parseInt(scaleString); | |
330 } | |
331 catch (NumberFormatException e) { | |
332 scaleCursor = 0; | |
333 } | |
334 if (scaleCursor < 10 || scaleCursor > 500) { | |
335 scaleCursor = 0; | |
336 } | |
337 if (requestCursorUpdates && !ignoreCursorUpdates && !viewOnly) { | |
338 labels[scaleCursorIndex].setEnabled(true); | |
339 choices[scaleCursorIndex].setEnabled(true); | |
340 } else { | |
341 labels[scaleCursorIndex].setEnabled(false); | |
342 choices[scaleCursorIndex].setEnabled(false); | |
343 } | |
344 if (viewer.vc != null) | |
345 viewer.vc.createSoftCursor(); // update cursor scaling | |
346 } | |
347 | |
348 | |
349 // | |
350 // Respond to actions on Choice controls | |
351 // | |
352 | |
353 public void itemStateChanged(ItemEvent evt) { | |
354 Object source = evt.getSource(); | |
355 | |
356 if (source == choices[encodingIndex] || | |
357 source == choices[compressLevelIndex] || | |
358 source == choices[jpegQualityIndex] || | |
359 source == choices[cursorUpdatesIndex] || | |
360 source == choices[useCopyRectIndex]) { | |
361 | |
362 setEncodings(); | |
363 | |
364 if (source == choices[cursorUpdatesIndex]) { | |
365 setOtherOptions(); // update scaleCursor state | |
366 } | |
367 | |
368 } else if (source == choices[eightBitColorsIndex]) { | |
369 | |
370 setColorFormat(); | |
371 | |
372 } else if (source == choices[mouseButtonIndex] || | |
373 source == choices[shareDesktopIndex] || | |
374 source == choices[viewOnlyIndex] || | |
375 source == choices[scaleCursorIndex]) { | |
376 | |
377 setOtherOptions(); | |
378 | |
379 } | |
380 } | |
381 | |
382 // | |
383 // Respond to button press | |
384 // | |
385 | |
386 public void actionPerformed(ActionEvent evt) { | |
387 if (evt.getSource() == closeButton) | |
388 setVisible(false); | |
389 } | |
390 | |
391 // | |
392 // Respond to window events | |
393 // | |
394 | |
395 public void windowClosing(WindowEvent evt) { | |
396 setVisible(false); | |
397 } | |
398 | |
399 public void windowActivated(WindowEvent evt) {} | |
400 public void windowDeactivated(WindowEvent evt) {} | |
401 public void windowOpened(WindowEvent evt) {} | |
402 public void windowClosed(WindowEvent evt) {} | |
403 public void windowIconified(WindowEvent evt) {} | |
404 public void windowDeiconified(WindowEvent evt) {} | |
405 } |