Lines 63-68
Link Here
|
63 |
boolean doubleClick; |
63 |
boolean doubleClick; |
64 |
String message = ""; |
64 |
String message = ""; |
65 |
|
65 |
|
|
|
66 |
static final char LTR_MARK = '\u200e'; |
67 |
static final char RTL_MARK = '\u200f'; |
68 |
|
69 |
/* GTK signals data */ |
70 |
static final int BACKSPACE = 1; |
71 |
static final int COPY_CLIPBOARD = 2; |
72 |
static final int CUT_CLIPBOARD = 3; |
73 |
static final int PASTE_CLIPBOARD = 4; |
74 |
static final int DELETE_FROM_CURSOR = 5; |
75 |
static final int MOVE_CURSOR = 6; |
76 |
static final int CONNECTED_AFTER = 8; |
77 |
|
78 |
int[] segments; |
79 |
|
66 |
static final int ITER_SIZEOF = OS.GtkTextIter_sizeof(); |
80 |
static final int ITER_SIZEOF = OS.GtkTextIter_sizeof(); |
67 |
static final int SPACE_FOR_CURSOR = 1; |
81 |
static final int SPACE_FOR_CURSOR = 1; |
68 |
|
82 |
|
Lines 257-262
Link Here
|
257 |
addListener (SWT.Modify, typedListener); |
271 |
addListener (SWT.Modify, typedListener); |
258 |
} |
272 |
} |
259 |
|
273 |
|
|
|
274 |
public void addSegmentListener (SegmentListener listener) { |
275 |
checkWidget (); |
276 |
if (listener == null) error (SWT.ERROR_NULL_ARGUMENT); |
277 |
if (segments != null) clearSegments (); |
278 |
addListener (SWT.GetSegments, new TypedListener (listener)); |
279 |
applySegments (); |
280 |
|
281 |
if (OS.g_signal_handler_find (handle, OS.G_SIGNAL_MATCH_FUNC, 0, 0, 0, display.segmentsProc2, 0) == 0) { |
282 |
/* |
283 |
* NOTE: We do not instantiate the segments callbacks unless they are |
284 |
* really needed. |
285 |
*/ |
286 |
if (display.segmentsCallback2 == null) { |
287 |
display.segmentsCallback2 = new Callback (display, "segmentsProc2", 2); //$NON-NLS-1$ |
288 |
display.segmentsProc2 = display.segmentsCallback2.getAddress (); |
289 |
if (display.segmentsProc2 == 0) error (SWT.ERROR_NO_MORE_CALLBACKS); |
290 |
display.segmentsCallback4 = new Callback (display, "segmentsProc4", 4); //$NON-NLS-1$ |
291 |
display.segmentsProc4 = display.segmentsCallback4.getAddress (); |
292 |
if (display.segmentsProc4 == 0) error (SWT.ERROR_NO_MORE_CALLBACKS); |
293 |
display.segmentsCallback5 = new Callback (display, "segmentsProc5", 5); //$NON-NLS-1$ |
294 |
display.segmentsProc5 = display.segmentsCallback5.getAddress (); |
295 |
if (display.segmentsProc5 == 0) error (SWT.ERROR_NO_MORE_CALLBACKS); |
296 |
} |
297 |
OS.g_signal_connect (handle, OS.backspace, display.segmentsProc2, BACKSPACE); |
298 |
OS.g_signal_connect (handle, OS.copy_clipboard, display.segmentsProc2, COPY_CLIPBOARD); |
299 |
OS.g_signal_connect (handle, OS.cut_clipboard, display.segmentsProc2, CUT_CLIPBOARD); |
300 |
OS.g_signal_connect (handle, OS.paste_clipboard, display.segmentsProc2, PASTE_CLIPBOARD); |
301 |
OS.g_signal_connect (handle, OS.delete_from_cursor, display.segmentsProc4, DELETE_FROM_CURSOR); |
302 |
OS.g_signal_connect (handle, OS.move_cursor, display.segmentsProc5, MOVE_CURSOR); |
303 |
OS.g_signal_connect_after (handle, OS.backspace, display.segmentsProc2, BACKSPACE | CONNECTED_AFTER); |
304 |
OS.g_signal_connect_after (handle, OS.copy_clipboard, display.segmentsProc2, COPY_CLIPBOARD | CONNECTED_AFTER); |
305 |
OS.g_signal_connect_after (handle, OS.cut_clipboard, display.segmentsProc2, CUT_CLIPBOARD | CONNECTED_AFTER); |
306 |
OS.g_signal_connect_after (handle, OS.paste_clipboard, display.segmentsProc2, PASTE_CLIPBOARD | CONNECTED_AFTER); |
307 |
OS.g_signal_connect_after (handle, OS.delete_from_cursor, display.segmentsProc4, DELETE_FROM_CURSOR | CONNECTED_AFTER); |
308 |
OS.g_signal_connect_after (handle, OS.move_cursor, display.segmentsProc5, MOVE_CURSOR | CONNECTED_AFTER); |
309 |
} |
310 |
} |
311 |
|
260 |
/** |
312 |
/** |
261 |
* Adds the listener to the collection of listeners who will |
313 |
* Adds the listener to the collection of listeners who will |
262 |
* be notified when the control is selected by the user, by sending |
314 |
* be notified when the control is selected by the user, by sending |
Lines 338-343
Link Here
|
338 |
checkWidget (); |
390 |
checkWidget (); |
339 |
if (string == null) error (SWT.ERROR_NULL_ARGUMENT); |
391 |
if (string == null) error (SWT.ERROR_NULL_ARGUMENT); |
340 |
byte [] buffer = Converter.wcsToMbcs (null, string, false); |
392 |
byte [] buffer = Converter.wcsToMbcs (null, string, false); |
|
|
393 |
if (segments != null) clearSegments (); |
341 |
if ((style & SWT.SINGLE) != 0) { |
394 |
if ((style & SWT.SINGLE) != 0) { |
342 |
OS.gtk_editable_insert_text (handle, buffer, buffer.length, new int[]{-1}); |
395 |
OS.gtk_editable_insert_text (handle, buffer, buffer.length, new int[]{-1}); |
343 |
OS.gtk_editable_set_position (handle, -1); |
396 |
OS.gtk_editable_set_position (handle, -1); |
Lines 349-354
Link Here
|
349 |
int /*long*/ mark = OS.gtk_text_buffer_get_insert (bufferHandle); |
402 |
int /*long*/ mark = OS.gtk_text_buffer_get_insert (bufferHandle); |
350 |
OS.gtk_text_view_scroll_mark_onscreen (handle, mark); |
403 |
OS.gtk_text_view_scroll_mark_onscreen (handle, mark); |
351 |
} |
404 |
} |
|
|
405 |
if (hooks (SWT.GetSegments) || filters (SWT.GetSegments)) { |
406 |
applySegments (); |
407 |
} |
408 |
} |
409 |
|
410 |
void applySegments () { |
411 |
if (!hooks (SWT.GetSegments) && !filters (SWT.GetSegments)) return; |
412 |
if (segments != null) clearSegments (); |
413 |
Event event = new Event (); |
414 |
String string = getText (); |
415 |
event.text = string; |
416 |
event.segments = segments; |
417 |
sendEvent (SWT.GetSegments, event); |
418 |
segments = event.segments; |
419 |
if (segments == null) return; |
420 |
int nSegments = segments.length; |
421 |
if (nSegments == 0) return; |
422 |
|
423 |
for (int i = 1, lineLength = string == null ? 0 : string.length (); i < nSegments; i++) { |
424 |
if (event.segments [i] < event.segments [i - 1] || event.segments [i] > lineLength) { |
425 |
SWT.error (SWT.ERROR_INVALID_ARGUMENT); |
426 |
} |
427 |
} |
428 |
char[] segmentsChars = event.segmentsChars; |
429 |
char [] separator = { getOrientation () == SWT.RIGHT_TO_LEFT ? RTL_MARK : LTR_MARK }; |
430 |
if ((style & SWT.SINGLE) != 0) { |
431 |
OS.g_signal_handlers_block_matched (handle, OS.G_SIGNAL_MATCH_DATA, 0, 0, 0, 0, CHANGED); |
432 |
OS.g_signal_handlers_block_matched (handle, OS.G_SIGNAL_MATCH_DATA, 0, 0, 0, 0, INSERT_TEXT); |
433 |
int limit = OS.gtk_entry_get_max_length (handle); |
434 |
if (limit != 0) OS.gtk_entry_set_max_length (handle, limit + nSegments); |
435 |
int [] pos = new int [1]; |
436 |
for (int i = 0; i < nSegments; i++) { |
437 |
pos [0] = segments [i] + i; |
438 |
if (segmentsChars != null && segmentsChars.length > i) { |
439 |
separator [0] = segmentsChars [i]; |
440 |
} |
441 |
byte [] buffer = Converter.wcsToMbcs (null, separator, false); |
442 |
OS.gtk_editable_insert_text (handle, buffer, buffer.length, pos); |
443 |
} |
444 |
OS.g_signal_handlers_unblock_matched (handle, OS.G_SIGNAL_MATCH_DATA, 0, 0, 0, 0, CHANGED); |
445 |
OS.g_signal_handlers_unblock_matched (handle, OS.G_SIGNAL_MATCH_DATA, 0, 0, 0, 0, INSERT_TEXT); |
446 |
} else { |
447 |
OS.g_signal_handlers_block_matched (bufferHandle, OS.G_SIGNAL_MATCH_DATA, 0, 0, 0, 0, CHANGED); |
448 |
OS.g_signal_handlers_block_matched (bufferHandle, OS.G_SIGNAL_MATCH_DATA, 0, 0, 0, 0, TEXT_BUFFER_INSERT_TEXT); |
449 |
byte [] pos = new byte [ITER_SIZEOF]; |
450 |
for (int i = 0; i < nSegments; i++) { |
451 |
OS.gtk_text_buffer_get_iter_at_offset (bufferHandle, pos, segments[i] + i); |
452 |
if (segmentsChars != null && segmentsChars.length > i) { |
453 |
separator [0] = segmentsChars [i]; |
454 |
} |
455 |
byte [] buffer = Converter.wcsToMbcs (null, separator, false); |
456 |
OS.gtk_text_buffer_insert (bufferHandle, pos, buffer, buffer.length); |
457 |
} |
458 |
OS.g_signal_handlers_unblock_matched (bufferHandle, OS.G_SIGNAL_MATCH_DATA, 0, 0, 0, 0, CHANGED); |
459 |
OS.g_signal_handlers_unblock_matched (bufferHandle, OS.G_SIGNAL_MATCH_DATA, 0, 0, 0, 0, TEXT_BUFFER_INSERT_TEXT); |
460 |
} |
461 |
} |
462 |
|
463 |
void clearSegments () { |
464 |
if (segments == null) return; |
465 |
int nSegments = segments.length; |
466 |
if (nSegments == 0) return; |
467 |
|
468 |
if ((style & SWT.SINGLE) != 0) { |
469 |
OS.g_signal_handlers_block_matched (handle, OS.G_SIGNAL_MATCH_DATA, 0, 0, 0, 0, CHANGED); |
470 |
OS.g_signal_handlers_block_matched (handle, OS.G_SIGNAL_MATCH_DATA, 0, 0, 0, 0, DELETE_TEXT); |
471 |
for (int i = 0; i < nSegments; i++) { |
472 |
OS.gtk_editable_delete_text (handle, segments[i], segments[i] + 1); |
473 |
} |
474 |
int limit = OS.gtk_entry_get_max_length (handle); |
475 |
if (limit != 0) OS.gtk_entry_set_max_length (handle, limit - nSegments); |
476 |
OS.g_signal_handlers_unblock_matched (handle, OS.G_SIGNAL_MATCH_DATA, 0, 0, 0, 0, CHANGED); |
477 |
OS.g_signal_handlers_unblock_matched (handle, OS.G_SIGNAL_MATCH_DATA, 0, 0, 0, 0, DELETE_TEXT); |
478 |
} else { |
479 |
OS.g_signal_handlers_block_matched (bufferHandle, OS.G_SIGNAL_MATCH_DATA, 0, 0, 0, 0, CHANGED); |
480 |
OS.g_signal_handlers_block_matched (bufferHandle, OS.G_SIGNAL_MATCH_DATA, 0, 0, 0, 0, DELETE_RANGE); |
481 |
|
482 |
byte [] start = new byte [ITER_SIZEOF], end = new byte [ITER_SIZEOF]; |
483 |
for (int i = 0; i < nSegments; i++) { |
484 |
OS.gtk_text_buffer_get_iter_at_offset (bufferHandle, start, segments[i]); |
485 |
OS.gtk_text_buffer_get_iter_at_offset (bufferHandle, end, segments[i] + 1); |
486 |
OS.gtk_text_buffer_delete (bufferHandle, start, end); |
487 |
} |
488 |
OS.g_signal_handlers_unblock_matched (bufferHandle, OS.G_SIGNAL_MATCH_DATA, 0, 0, 0, 0, CHANGED); |
489 |
OS.g_signal_handlers_unblock_matched (bufferHandle, OS.G_SIGNAL_MATCH_DATA, 0, 0, 0, 0, DELETE_RANGE); |
490 |
} |
491 |
segments = null; |
352 |
} |
492 |
} |
353 |
|
493 |
|
354 |
/** |
494 |
/** |
Lines 462-468
Link Here
|
462 |
OS.gtk_editable_copy_clipboard (handle); |
602 |
OS.gtk_editable_copy_clipboard (handle); |
463 |
} else { |
603 |
} else { |
464 |
int /*long*/ clipboard = OS.gtk_clipboard_get (OS.GDK_NONE); |
604 |
int /*long*/ clipboard = OS.gtk_clipboard_get (OS.GDK_NONE); |
465 |
OS.gtk_text_buffer_copy_clipboard (bufferHandle, clipboard); |
605 |
if (segments != null) { |
|
|
606 |
clearSegments (); |
607 |
OS.gtk_text_buffer_copy_clipboard (bufferHandle, clipboard); |
608 |
applySegments (); |
609 |
} else { |
610 |
OS.gtk_text_buffer_copy_clipboard (bufferHandle, clipboard); |
611 |
} |
466 |
} |
612 |
} |
467 |
} |
613 |
} |
468 |
|
614 |
|
Lines 484-491
Link Here
|
484 |
OS.gtk_editable_cut_clipboard (handle); |
630 |
OS.gtk_editable_cut_clipboard (handle); |
485 |
} else { |
631 |
} else { |
486 |
int /*long*/ clipboard = OS.gtk_clipboard_get (OS.GDK_NONE); |
632 |
int /*long*/ clipboard = OS.gtk_clipboard_get (OS.GDK_NONE); |
487 |
OS.gtk_text_buffer_cut_clipboard (bufferHandle, clipboard, OS.gtk_text_view_get_editable (handle)); |
633 |
if (hooks (SWT.GetSegments) || filters (SWT.GetSegments)) { |
|
|
634 |
if (segments != null) clearSegments (); |
635 |
OS.gtk_text_buffer_cut_clipboard (bufferHandle, clipboard, OS.gtk_text_view_get_editable (handle)); |
636 |
applySegments (); |
637 |
} else { |
638 |
OS.gtk_text_buffer_cut_clipboard (bufferHandle, clipboard, OS.gtk_text_view_get_editable (handle)); |
639 |
} |
640 |
} |
641 |
} |
642 |
|
643 |
char [] deprocessText (char [] text, int start) { |
644 |
if (text == null || segments == null) return text; |
645 |
int length = text.length; |
646 |
if (length == 0) return text; |
647 |
int nSegments = segments.length; |
648 |
if (nSegments == 0) return text; |
649 |
if (start > segments [nSegments - 1] || start + length <= segments [0]) return text; |
650 |
char[] newText = new char [length]; |
651 |
int nLeadSegments = 0; |
652 |
while (start - nLeadSegments > segments [nLeadSegments]) nLeadSegments++; |
653 |
int segmentCount = nLeadSegments; |
654 |
for (int i = 0; i < length; i++) { |
655 |
if (segmentCount < nSegments && i + start - segmentCount == segments [segmentCount]) { |
656 |
++segmentCount; |
657 |
} else { |
658 |
newText [i - segmentCount + nLeadSegments] = text [i]; |
659 |
} |
660 |
} |
661 |
segmentCount -= nLeadSegments; |
662 |
if (segmentCount > 0) { |
663 |
char [] newChars = new char [length - segmentCount]; |
664 |
System.arraycopy(newText, 0, newChars, 0, length - segmentCount); |
665 |
return newChars; |
488 |
} |
666 |
} |
|
|
667 |
return newText; |
489 |
} |
668 |
} |
490 |
|
669 |
|
491 |
void deregister () { |
670 |
void deregister () { |
Lines 669-681
Link Here
|
669 |
*/ |
848 |
*/ |
670 |
public int getCaretPosition () { |
849 |
public int getCaretPosition () { |
671 |
checkWidget (); |
850 |
checkWidget (); |
|
|
851 |
int caretPos; |
672 |
if ((style & SWT.SINGLE) != 0) { |
852 |
if ((style & SWT.SINGLE) != 0) { |
673 |
return OS.gtk_editable_get_position (handle); |
853 |
caretPos = OS.gtk_editable_get_position (handle); |
|
|
854 |
} else { |
855 |
byte [] position = new byte [ITER_SIZEOF]; |
856 |
int /*long*/ mark = OS.gtk_text_buffer_get_insert (bufferHandle); |
857 |
OS.gtk_text_buffer_get_iter_at_mark (bufferHandle, position, mark); |
858 |
caretPos = OS.gtk_text_iter_get_offset (position); |
674 |
} |
859 |
} |
675 |
byte [] position = new byte [ITER_SIZEOF]; |
860 |
if (segments != null) caretPos = untranslateOffset (caretPos); |
676 |
int /*long*/ mark = OS.gtk_text_buffer_get_insert (bufferHandle); |
861 |
return caretPos; |
677 |
OS.gtk_text_buffer_get_iter_at_mark (bufferHandle, position, mark); |
|
|
678 |
return OS.gtk_text_iter_get_offset (position); |
679 |
} |
862 |
} |
680 |
|
863 |
|
681 |
/** |
864 |
/** |
Lines 690-700
Link Here
|
690 |
*/ |
873 |
*/ |
691 |
public int getCharCount () { |
874 |
public int getCharCount () { |
692 |
checkWidget (); |
875 |
checkWidget (); |
|
|
876 |
int count; |
693 |
if ((style & SWT.SINGLE) != 0) { |
877 |
if ((style & SWT.SINGLE) != 0) { |
694 |
int /*long*/ ptr = OS.gtk_entry_get_text (handle); |
878 |
int /*long*/ ptr = OS.gtk_entry_get_text (handle); |
695 |
return (int)/*64*/OS.g_utf8_strlen (ptr, -1); |
879 |
count = (int)/*64*/OS.g_utf8_strlen (ptr, -1); |
|
|
880 |
} else { |
881 |
count = OS.gtk_text_buffer_get_char_count (bufferHandle); |
696 |
} |
882 |
} |
697 |
return OS.gtk_text_buffer_get_char_count (bufferHandle); |
883 |
if (segments != null) count -= segments.length; |
|
|
884 |
return count; |
698 |
} |
885 |
} |
699 |
|
886 |
|
700 |
/** |
887 |
/** |
Lines 868-873
Link Here
|
868 |
OS.gtk_text_view_get_iter_at_location (handle, p, point.x, point.y); |
1055 |
OS.gtk_text_view_get_iter_at_location (handle, p, point.x, point.y); |
869 |
position = OS.gtk_text_iter_get_offset (p); |
1056 |
position = OS.gtk_text_iter_get_offset (p); |
870 |
} |
1057 |
} |
|
|
1058 |
if (segments != null) position = untranslateOffset(position); |
871 |
return position; |
1059 |
return position; |
872 |
} |
1060 |
} |
873 |
|
1061 |
|
Lines 891-906
Link Here
|
891 |
*/ |
1079 |
*/ |
892 |
public Point getSelection () { |
1080 |
public Point getSelection () { |
893 |
checkWidget (); |
1081 |
checkWidget (); |
|
|
1082 |
Point selection; |
894 |
if ((style & SWT.SINGLE) != 0) { |
1083 |
if ((style & SWT.SINGLE) != 0) { |
895 |
int [] start = new int [1]; |
1084 |
int [] start = new int [1]; |
896 |
int [] end = new int [1]; |
1085 |
int [] end = new int [1]; |
897 |
OS.gtk_editable_get_selection_bounds (handle, start, end); |
1086 |
OS.gtk_editable_get_selection_bounds (handle, start, end); |
898 |
return new Point (start [0], end [0]); |
1087 |
selection = new Point (start [0], end [0]); |
|
|
1088 |
} else { |
1089 |
byte [] start = new byte [ITER_SIZEOF]; |
1090 |
byte [] end = new byte [ITER_SIZEOF]; |
1091 |
OS.gtk_text_buffer_get_selection_bounds (bufferHandle, start, end); |
1092 |
selection = new Point (OS.gtk_text_iter_get_offset (start), OS.gtk_text_iter_get_offset (end)); |
1093 |
} |
1094 |
if (segments != null) { |
1095 |
selection.x = untranslateOffset (selection.x); |
1096 |
selection.y = untranslateOffset (selection.y); |
899 |
} |
1097 |
} |
900 |
byte [] start = new byte [ITER_SIZEOF]; |
1098 |
return selection; |
901 |
byte [] end = new byte [ITER_SIZEOF]; |
|
|
902 |
OS.gtk_text_buffer_get_selection_bounds (bufferHandle, start, end); |
903 |
return new Point (OS.gtk_text_iter_get_offset (start), OS.gtk_text_iter_get_offset (end)); |
904 |
} |
1099 |
} |
905 |
|
1100 |
|
906 |
/** |
1101 |
/** |
Lines 1007-1022
Link Here
|
1007 |
int /*long*/ address; |
1202 |
int /*long*/ address; |
1008 |
if ((style & SWT.SINGLE) != 0) { |
1203 |
if ((style & SWT.SINGLE) != 0) { |
1009 |
start = Math.max (0, start); |
1204 |
start = Math.max (0, start); |
1010 |
address = OS.gtk_editable_get_chars (handle, start, end + 1); |
1205 |
if (segments != null) { |
|
|
1206 |
start = translateOffset (start); |
1207 |
address = OS.gtk_editable_get_chars (handle, start, translateOffset (end + 1)); |
1208 |
} else { |
1209 |
address = OS.gtk_editable_get_chars (handle, start, end + 1); |
1210 |
} |
1011 |
} else { |
1211 |
} else { |
1012 |
int length = OS.gtk_text_buffer_get_char_count (bufferHandle); |
1212 |
int length = OS.gtk_text_buffer_get_char_count (bufferHandle); |
|
|
1213 |
if (segments != null) length -= segments.length; |
1013 |
end = Math.min (end, length - 1); |
1214 |
end = Math.min (end, length - 1); |
1014 |
if (start > end) return ""; |
1215 |
if (start > end) return ""; |
1015 |
start = Math.max (0, start); |
1216 |
start = Math.max (0, start); |
1016 |
byte [] startIter = new byte [ITER_SIZEOF]; |
1217 |
byte [] startIter = new byte [ITER_SIZEOF]; |
1017 |
byte [] endIter = new byte [ITER_SIZEOF]; |
1218 |
byte [] endIter = new byte [ITER_SIZEOF]; |
|
|
1219 |
if (segments != null) { |
1220 |
start = translateOffset (start); |
1221 |
OS.gtk_text_buffer_get_iter_at_offset (bufferHandle, endIter, translateOffset (end + 1)); |
1222 |
} else { |
1223 |
OS.gtk_text_buffer_get_iter_at_offset (bufferHandle, endIter, end + 1); |
1224 |
} |
1018 |
OS.gtk_text_buffer_get_iter_at_offset (bufferHandle, startIter, start); |
1225 |
OS.gtk_text_buffer_get_iter_at_offset (bufferHandle, startIter, start); |
1019 |
OS.gtk_text_buffer_get_iter_at_offset (bufferHandle, endIter, end + 1); |
|
|
1020 |
address = OS.gtk_text_buffer_get_text (bufferHandle, startIter, endIter, true); |
1226 |
address = OS.gtk_text_buffer_get_text (bufferHandle, startIter, endIter, true); |
1021 |
} |
1227 |
} |
1022 |
if (address == 0) error (SWT.ERROR_CANNOT_GET_TEXT); |
1228 |
if (address == 0) error (SWT.ERROR_CANNOT_GET_TEXT); |
Lines 1024-1029
Link Here
|
1024 |
byte [] buffer = new byte [length]; |
1230 |
byte [] buffer = new byte [length]; |
1025 |
OS.memmove (buffer, address, length); |
1231 |
OS.memmove (buffer, address, length); |
1026 |
OS.g_free (address); |
1232 |
OS.g_free (address); |
|
|
1233 |
if (segments != null) { |
1234 |
return new String (deprocessText (Converter.mbcsToWcs (null, buffer), start)); |
1235 |
} |
1027 |
return new String (Converter.mbcsToWcs (null, buffer)); |
1236 |
return new String (Converter.mbcsToWcs (null, buffer)); |
1028 |
} |
1237 |
} |
1029 |
|
1238 |
|
Lines 1058-1063
Link Here
|
1058 |
byte [] buffer = new byte [length]; |
1267 |
byte [] buffer = new byte [length]; |
1059 |
OS.memmove (buffer, address, length); |
1268 |
OS.memmove (buffer, address, length); |
1060 |
if ((style & SWT.MULTI) != 0) OS.g_free (address); |
1269 |
if ((style & SWT.MULTI) != 0) OS.g_free (address); |
|
|
1270 |
if (segments != null) { |
1271 |
return deprocessText (Converter.mbcsToWcs (null, buffer), 0); |
1272 |
} |
1061 |
return Converter.mbcsToWcs (null, buffer); |
1273 |
return Converter.mbcsToWcs (null, buffer); |
1062 |
} |
1274 |
} |
1063 |
|
1275 |
|
Lines 1081-1087
Link Here
|
1081 |
checkWidget (); |
1293 |
checkWidget (); |
1082 |
if ((style & SWT.MULTI) != 0) return LIMIT; |
1294 |
if ((style & SWT.MULTI) != 0) return LIMIT; |
1083 |
int limit = OS.gtk_entry_get_max_length (handle); |
1295 |
int limit = OS.gtk_entry_get_max_length (handle); |
1084 |
return limit == 0 ? 0xFFFF : limit; |
1296 |
return limit == 0 ? 0xFFFF : segments != null ? limit - segments.length : limit; |
1085 |
} |
1297 |
} |
1086 |
|
1298 |
|
1087 |
/** |
1299 |
/** |
Lines 1467-1476
Link Here
|
1467 |
} |
1679 |
} |
1468 |
|
1680 |
|
1469 |
int /*long*/ gtk_key_press_event (int /*long*/ widget, int /*long*/ event) { |
1681 |
int /*long*/ gtk_key_press_event (int /*long*/ widget, int /*long*/ event) { |
|
|
1682 |
boolean handleSegments = false, segmentsCleared = false; |
1683 |
if (hooks (SWT.GetSegments) || filters (SWT.GetSegments)) { |
1684 |
GdkEventKey gdkEvent = new GdkEventKey (); |
1685 |
OS.memmove (gdkEvent, event, GdkEventKey.sizeof); |
1686 |
if (gdkEvent.length > 0 && (gdkEvent.state & (OS.GDK_MOD1_MASK | OS.GDK_CONTROL_MASK)) == 0) { |
1687 |
handleSegments = true; |
1688 |
if (segments != null) { |
1689 |
clearSegments (); |
1690 |
segmentsCleared = true; |
1691 |
} |
1692 |
} |
1693 |
} |
1470 |
int /*long*/ result = super.gtk_key_press_event (widget, event); |
1694 |
int /*long*/ result = super.gtk_key_press_event (widget, event); |
1471 |
if (result != 0) fixIM (); |
1695 |
if (result != 0) fixIM (); |
1472 |
if (gdkEventKey == -1) result = 1; |
1696 |
if (gdkEventKey == -1) result = 1; |
1473 |
gdkEventKey = 0; |
1697 |
gdkEventKey = 0; |
|
|
1698 |
if (handleSegments && (result != 0 || segmentsCleared)) { |
1699 |
applySegments (); |
1700 |
} |
1474 |
return result; |
1701 |
return result; |
1475 |
} |
1702 |
} |
1476 |
|
1703 |
|
Lines 1564-1569
Link Here
|
1564 |
public void insert (String string) { |
1791 |
public void insert (String string) { |
1565 |
checkWidget (); |
1792 |
checkWidget (); |
1566 |
if (string == null) error (SWT.ERROR_NULL_ARGUMENT); |
1793 |
if (string == null) error (SWT.ERROR_NULL_ARGUMENT); |
|
|
1794 |
if (segments != null) clearSegments (); |
1567 |
byte [] buffer = Converter.wcsToMbcs (null, string, false); |
1795 |
byte [] buffer = Converter.wcsToMbcs (null, string, false); |
1568 |
if ((style & SWT.SINGLE) != 0) { |
1796 |
if ((style & SWT.SINGLE) != 0) { |
1569 |
int [] start = new int [1], end = new int [1]; |
1797 |
int [] start = new int [1], end = new int [1]; |
Lines 1582-1587
Link Here
|
1582 |
int /*long*/ mark = OS.gtk_text_buffer_get_insert (bufferHandle); |
1810 |
int /*long*/ mark = OS.gtk_text_buffer_get_insert (bufferHandle); |
1583 |
OS.gtk_text_view_scroll_mark_onscreen (handle, mark); |
1811 |
OS.gtk_text_view_scroll_mark_onscreen (handle, mark); |
1584 |
} |
1812 |
} |
|
|
1813 |
if (hooks (SWT.GetSegments) || filters (SWT.GetSegments)) { |
1814 |
applySegments (); |
1815 |
} |
1585 |
} |
1816 |
} |
1586 |
|
1817 |
|
1587 |
int /*long*/ paintWindow () { |
1818 |
int /*long*/ paintWindow () { |
Lines 1624-1630
Link Here
|
1624 |
OS.gtk_editable_paste_clipboard (handle); |
1855 |
OS.gtk_editable_paste_clipboard (handle); |
1625 |
} else { |
1856 |
} else { |
1626 |
int /*long*/ clipboard = OS.gtk_clipboard_get (OS.GDK_NONE); |
1857 |
int /*long*/ clipboard = OS.gtk_clipboard_get (OS.GDK_NONE); |
1627 |
OS.gtk_text_buffer_paste_clipboard (bufferHandle, clipboard, null, OS.gtk_text_view_get_editable (handle)); |
1858 |
if (hooks (SWT.GetSegments) || filters (SWT.GetSegments)) { |
|
|
1859 |
if (segments != null) clearSegments (); |
1860 |
OS.gtk_text_buffer_paste_clipboard (bufferHandle, clipboard, null, OS.gtk_text_view_get_editable (handle)); |
1861 |
applySegments (); |
1862 |
} else { |
1863 |
OS.gtk_text_buffer_paste_clipboard (bufferHandle, clipboard, null, OS.gtk_text_view_get_editable (handle)); |
1864 |
} |
1628 |
} |
1865 |
} |
1629 |
} |
1866 |
} |
1630 |
|
1867 |
|
Lines 1677-1682
Link Here
|
1677 |
eventTable.unhook (SWT.Modify, listener); |
1914 |
eventTable.unhook (SWT.Modify, listener); |
1678 |
} |
1915 |
} |
1679 |
|
1916 |
|
|
|
1917 |
public void removeSegmentListener (SegmentListener listener) { |
1918 |
checkWidget (); |
1919 |
if (listener == null) SWT.error (SWT.ERROR_NULL_ARGUMENT); |
1920 |
clearSegments (); |
1921 |
eventTable.unhook (SWT.GetSegments, listener); |
1922 |
if (getListeners (SWT.GetSegments).length == 0) { |
1923 |
OS.g_signal_handlers_disconnect_matched (handle, OS.G_SIGNAL_MATCH_FUNC, 0, 0, 0, display.segmentsProc2, 0); |
1924 |
OS.g_signal_handlers_disconnect_matched (handle, OS.G_SIGNAL_MATCH_FUNC, 0, 0, 0, display.segmentsProc4, 0); |
1925 |
OS.g_signal_handlers_disconnect_matched (handle, OS.G_SIGNAL_MATCH_FUNC, 0, 0, 0, display.segmentsProc5, 0); |
1926 |
} else { |
1927 |
applySegments (); |
1928 |
} |
1929 |
} |
1930 |
|
1680 |
/** |
1931 |
/** |
1681 |
* Removes the listener from the collection of listeners who will |
1932 |
* Removes the listener from the collection of listeners who will |
1682 |
* be notified when the control is selected by the user. |
1933 |
* be notified when the control is selected by the user. |
Lines 1726-1731
Link Here
|
1726 |
eventTable.unhook (SWT.Verify, listener); |
1977 |
eventTable.unhook (SWT.Verify, listener); |
1727 |
} |
1978 |
} |
1728 |
|
1979 |
|
|
|
1980 |
int /*long*/ segmentsProc (int /*long*/ handle, int /*long*/ arg0, int /*long*/ arg1, int /*long*/ arg2, int /*long*/ user_data) { |
1981 |
switch (user_data & ~CONNECTED_AFTER) { |
1982 |
case MOVE_CURSOR: |
1983 |
if (arg0 != 1 /*GtkMovementStep#GTK_MOVEMENT_VISUAL_POSITIONS*/) break; |
1984 |
default: |
1985 |
if ((user_data & CONNECTED_AFTER) != 0) applySegments (); |
1986 |
else if (segments != null) clearSegments (); |
1987 |
} |
1988 |
return 0; |
1989 |
} |
1990 |
|
1729 |
/** |
1991 |
/** |
1730 |
* Selects all the text in the receiver. |
1992 |
* Selects all the text in the receiver. |
1731 |
* |
1993 |
* |
Lines 1912-1917
Link Here
|
1912 |
*/ |
2174 |
*/ |
1913 |
public void setSelection (int start) { |
2175 |
public void setSelection (int start) { |
1914 |
checkWidget (); |
2176 |
checkWidget (); |
|
|
2177 |
if (segments != null) start = translateOffset (start); |
1915 |
if ((style & SWT.SINGLE) != 0) { |
2178 |
if ((style & SWT.SINGLE) != 0) { |
1916 |
OS.gtk_editable_set_position (handle, start); |
2179 |
OS.gtk_editable_set_position (handle, start); |
1917 |
} else { |
2180 |
} else { |
Lines 1950-1955
Link Here
|
1950 |
*/ |
2213 |
*/ |
1951 |
public void setSelection (int start, int end) { |
2214 |
public void setSelection (int start, int end) { |
1952 |
checkWidget (); |
2215 |
checkWidget (); |
|
|
2216 |
if (segments != null) { |
2217 |
start = translateOffset (start); |
2218 |
end = translateOffset (end); |
2219 |
} |
1953 |
if ((style & SWT.SINGLE) != 0) { |
2220 |
if ((style & SWT.SINGLE) != 0) { |
1954 |
OS.gtk_editable_set_position (handle, start); |
2221 |
OS.gtk_editable_set_position (handle, start); |
1955 |
OS.gtk_editable_select_region (handle, start, end); |
2222 |
OS.gtk_editable_select_region (handle, start, end); |
Lines 2099-2107
Link Here
|
2099 |
void setText (char [] text) { |
2366 |
void setText (char [] text) { |
2100 |
if ((style & SWT.SINGLE) != 0) { |
2367 |
if ((style & SWT.SINGLE) != 0) { |
2101 |
byte [] buffer = Converter.wcsToMbcs (null, text, true); |
2368 |
byte [] buffer = Converter.wcsToMbcs (null, text, true); |
|
|
2369 |
// OS.g_signal_handlers_block_matched (handle, OS.G_SIGNAL_MATCH_DATA | OS.G_SIGNAL_MATCH_FUNC, 0, 0, 0, clipboardProc, CHANGED); |
2102 |
OS.g_signal_handlers_block_matched (handle, OS.G_SIGNAL_MATCH_DATA, 0, 0, 0, 0, CHANGED); |
2370 |
OS.g_signal_handlers_block_matched (handle, OS.G_SIGNAL_MATCH_DATA, 0, 0, 0, 0, CHANGED); |
2103 |
OS.g_signal_handlers_block_matched (handle, OS.G_SIGNAL_MATCH_DATA, 0, 0, 0, 0, DELETE_TEXT); |
2371 |
OS.g_signal_handlers_block_matched (handle, OS.G_SIGNAL_MATCH_DATA, 0, 0, 0, 0, DELETE_TEXT); |
2104 |
OS.g_signal_handlers_block_matched (handle, OS.G_SIGNAL_MATCH_DATA, 0, 0, 0, 0, INSERT_TEXT); |
2372 |
OS.g_signal_handlers_block_matched (handle, OS.G_SIGNAL_MATCH_DATA, 0, 0, 0, 0, INSERT_TEXT); |
|
|
2373 |
if (segments != null) { |
2374 |
int limit = OS.gtk_entry_get_max_length (handle); |
2375 |
if (limit != 0) OS.gtk_entry_set_max_length (handle, limit - segments.length); |
2376 |
segments = null; |
2377 |
} |
2105 |
OS.gtk_entry_set_text (handle, buffer); |
2378 |
OS.gtk_entry_set_text (handle, buffer); |
2106 |
OS.g_signal_handlers_unblock_matched (handle, OS.G_SIGNAL_MATCH_DATA, 0, 0, 0, 0, CHANGED); |
2379 |
OS.g_signal_handlers_unblock_matched (handle, OS.G_SIGNAL_MATCH_DATA, 0, 0, 0, 0, CHANGED); |
2107 |
OS.g_signal_handlers_unblock_matched (handle, OS.G_SIGNAL_MATCH_DATA, 0, 0, 0, 0, DELETE_TEXT); |
2380 |
OS.g_signal_handlers_unblock_matched (handle, OS.G_SIGNAL_MATCH_DATA, 0, 0, 0, 0, DELETE_TEXT); |
Lines 2109-2114
Link Here
|
2109 |
} else { |
2382 |
} else { |
2110 |
byte [] buffer = Converter.wcsToMbcs (null, text, false); |
2383 |
byte [] buffer = Converter.wcsToMbcs (null, text, false); |
2111 |
byte [] position = new byte [ITER_SIZEOF]; |
2384 |
byte [] position = new byte [ITER_SIZEOF]; |
|
|
2385 |
segments = null; |
2112 |
OS.g_signal_handlers_block_matched (bufferHandle, OS.G_SIGNAL_MATCH_DATA, 0, 0, 0, 0, CHANGED); |
2386 |
OS.g_signal_handlers_block_matched (bufferHandle, OS.G_SIGNAL_MATCH_DATA, 0, 0, 0, 0, CHANGED); |
2113 |
OS.g_signal_handlers_block_matched (bufferHandle, OS.G_SIGNAL_MATCH_DATA, 0, 0, 0, 0, DELETE_RANGE); |
2387 |
OS.g_signal_handlers_block_matched (bufferHandle, OS.G_SIGNAL_MATCH_DATA, 0, 0, 0, 0, DELETE_RANGE); |
2114 |
OS.g_signal_handlers_block_matched (bufferHandle, OS.G_SIGNAL_MATCH_DATA, 0, 0, 0, 0, TEXT_BUFFER_INSERT_TEXT); |
2388 |
OS.g_signal_handlers_block_matched (bufferHandle, OS.G_SIGNAL_MATCH_DATA, 0, 0, 0, 0, TEXT_BUFFER_INSERT_TEXT); |
Lines 2127-2132
Link Here
|
2127 |
OS.gtk_entry_set_icon_sensitive (handle, OS.GTK_ENTRY_ICON_SECONDARY, true); |
2401 |
OS.gtk_entry_set_icon_sensitive (handle, OS.GTK_ENTRY_ICON_SECONDARY, true); |
2128 |
} |
2402 |
} |
2129 |
} |
2403 |
} |
|
|
2404 |
if (hooks (SWT.GetSegments) || filters (SWT.GetSegments)) { |
2405 |
applySegments (); |
2406 |
} |
2130 |
} |
2407 |
} |
2131 |
|
2408 |
|
2132 |
/** |
2409 |
/** |
Lines 2156-2162
Link Here
|
2156 |
public void setTextLimit (int limit) { |
2433 |
public void setTextLimit (int limit) { |
2157 |
checkWidget (); |
2434 |
checkWidget (); |
2158 |
if (limit == 0) error (SWT.ERROR_CANNOT_BE_ZERO); |
2435 |
if (limit == 0) error (SWT.ERROR_CANNOT_BE_ZERO); |
2159 |
if ((style & SWT.SINGLE) != 0) OS.gtk_entry_set_max_length (handle, limit); |
2436 |
if ((style & SWT.SINGLE) != 0) { |
|
|
2437 |
if (segments != null) { |
2438 |
OS.gtk_entry_set_max_length (handle, Math.min (LIMIT, limit + segments.length)); |
2439 |
} else { |
2440 |
OS.gtk_entry_set_max_length (handle, limit); |
2441 |
} |
2442 |
} |
2160 |
} |
2443 |
} |
2161 |
|
2444 |
|
2162 |
/** |
2445 |
/** |
Lines 2201-2206
Link Here
|
2201 |
OS.gtk_text_view_scroll_mark_onscreen (handle, mark); |
2484 |
OS.gtk_text_view_scroll_mark_onscreen (handle, mark); |
2202 |
} |
2485 |
} |
2203 |
|
2486 |
|
|
|
2487 |
int translateOffset (int offset) { |
2488 |
if (segments == null) return offset; |
2489 |
for (int i = 0, nSegments = segments.length; i < nSegments && offset - i >= segments[i]; i++) { |
2490 |
offset++; |
2491 |
} |
2492 |
return offset; |
2493 |
} |
2494 |
|
2204 |
boolean translateTraversal (GdkEventKey keyEvent) { |
2495 |
boolean translateTraversal (GdkEventKey keyEvent) { |
2205 |
int key = keyEvent.keyval; |
2496 |
int key = keyEvent.keyval; |
2206 |
switch (key) { |
2497 |
switch (key) { |
Lines 2236-2241
Link Here
|
2236 |
return bits; |
2527 |
return bits; |
2237 |
} |
2528 |
} |
2238 |
|
2529 |
|
|
|
2530 |
int untranslateOffset (int offset) { |
2531 |
if (segments == null) return offset; |
2532 |
for (int i = 0, nSegments = segments.length; i < nSegments && offset > segments[i]; i++) { |
2533 |
offset--; |
2534 |
} |
2535 |
return offset; |
2536 |
} |
2537 |
|
2239 |
String verifyText (String string, int start, int end) { |
2538 |
String verifyText (String string, int start, int end) { |
2240 |
if (string != null && string.length () == 0 && start == end) return null; |
2539 |
if (string != null && string.length () == 0 && start == end) return null; |
2241 |
Event event = new Event (); |
2540 |
Event event = new Event (); |