summaryrefslogtreecommitdiff
path: root/ieditor_gesture.pl
diff options
context:
space:
mode:
Diffstat (limited to 'ieditor_gesture.pl')
-rw-r--r--ieditor_gesture.pl134
1 files changed, 134 insertions, 0 deletions
diff --git a/ieditor_gesture.pl b/ieditor_gesture.pl
new file mode 100644
index 0000000..fe5d68c
--- /dev/null
+++ b/ieditor_gesture.pl
@@ -0,0 +1,134 @@
+/*
+ * This file contains minor patches to the select_editor_text_gesture
+ * class included with XPCE to bring the behavior closer to UI
+ * standards.
+ *
+ */
+
+:- use_module(library(pce)).
+
+% Override the default @editor_recogniser. This affects the default
+% editor class too!
+
+ieditor_gesture_override :-
+ free(@editor_recogniser),
+ new(@editor_recogniser, handler_group(new(ieditor_gesture))).
+
+:- pce_begin_class(ieditor_gesture, select_editor_text_gesture).
+
+% Get the index of the clicked character -- but if the user clicked
+% close to the next character, get that character's index instead.
+%
+% (If the mouse is dragged above the editor, though, the pointer's x
+% position should not be accounted for whatsoever.)
+
+index(_, Ev, Index) :<-
+ "Calculate index of clicked character."::
+ get(Ev, receiver, Editor),
+ get(Editor, image, Image),
+ get(Image, index, Ev, Index0),
+ get(Ev, y, Y_ev),
+ ( Y_ev > 1,
+ get(Image, character_position, Index0, Point1),
+ get(Image, character_position, Index0 + 1, Point2),
+ get(Ev, x, X_ev),
+ get(Image, x, X_image),
+ get(Point1, x, X1),
+ get(Point2, x, X2),
+ D1 is X_ev - X_image - X1,
+ D2 is X2 - (X_ev - X_image),
+ D1 > abs(D2),
+ Index is Index0 + 1
+ ; Index = Index0
+ ).
+
+initiate(G, Ev:event) :->
+ "Set caret and prepare for selectiong"::
+ send(G, slot, down_position, Ev?position),
+ get(Ev, receiver, Editor),
+ send(G, slot, editor, Editor),
+ get(G, index, Ev, Index), % Use sane index.
+ send(Editor, caret, Index),
+ get(Ev, multiclick, Multi),
+ selection_unit(Multi, Unit),
+ send(G, slot, unit, Unit),
+ ( Multi == single
+ -> send(G, slot, origin, Index),
+ send(G, selecting, @off)
+ ; send(G, selecting, @on)
+ ).
+
+selection_unit(single, character).
+selection_unit(double, word).
+selection_unit(triple, line).
+
+drag(G, Ev:event) :->
+ "Extend the selection if selecting"::
+ get(Ev, receiver, Editor),
+ ( ( get(G, selecting, @on)
+ -> true
+ ; get(G, down_position, DownPos),
+ get(Ev, position, EvPos),
+ get(DownPos, distance, EvPos, D),
+ D > 5 % Default is 25.
+ -> send(G, selecting, @on)
+ )
+ -> ( get(G, index, Ev, Index) % Use sane index.
+ -> ( get(G, unit, character) % Fix mark after char selection.
+ -> get(G, selection_save_mark, Editor, M),
+ send(Editor, selection_extend, Index),
+ send(Editor, mark, M)
+ ; send(Editor, selection_extend, Index)
+ )
+ ; true
+ )
+ ; true
+ ).
+
+selection_save_mark(G, Editor, M) :<-
+ ( ( get(Editor, mark_status, active)
+ ; get(G, selecting, @on)
+ )
+ -> get(Editor, mark, M) % Already selecting.
+ ; get(Editor, caret, C),
+ send(Editor, selection_origin, C), % Start new selection.
+ M = C
+ ).
+
+:- pce_end_class.
+
+/* Based on code included with XPCE --- The SWI-Prolog GUI toolkit
+
+ Original file: xpce/prolog/boot/pce_editor.pl
+
+ Author: Jan Wielemaker and Anjo Anjewierden
+ E-mail: jan@swi.psy.uva.nl
+ WWW: http://www.swi.psy.uva.nl/projects/xpce/
+ Copyright (c) 1985-2002, University of Amsterdam
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions
+ are met:
+
+ 1. Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in
+ the documentation and/or other materials provided with the
+ distribution.
+
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+ FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+ INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+ BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+ CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
+ ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ POSSIBILITY OF SUCH DAMAGE.
+*/