]> gitweb.fperrin.net Git - Dictionary.git/blob - jars/icu4j-4_2_1-src/src/com/ibm/richtext/textpanel/SelectionDragInteractor.java
icu4jsrc
[Dictionary.git] / jars / icu4j-4_2_1-src / src / com / ibm / richtext / textpanel / SelectionDragInteractor.java
1 /*\r
2  * (C) Copyright IBM Corp. 1998-2004.  All Rights Reserved.\r
3  *\r
4  * The program is provided "as is" without any warranty express or\r
5  * implied, including the warranty of non-infringement and the implied\r
6  * warranties of merchantibility and fitness for a particular purpose.\r
7  * IBM will not be liable for any damages suffered by you as a result\r
8  * of using the Program. In no event will IBM be liable for any\r
9  * special, indirect or consequential damages or lost profits even if\r
10  * IBM has been advised of the possibility of their occurrence. IBM\r
11  * will not be liable for any third party claims against you.\r
12  */\r
13 package com.ibm.richtext.textpanel;\r
14 \r
15 import java.awt.event.FocusEvent;\r
16 import java.awt.event.KeyEvent;\r
17 import java.awt.event.MouseEvent;\r
18 \r
19 import com.ibm.richtext.textformat.TextOffset;\r
20 \r
21 final class SelectionDragInteractor extends Behavior implements Runnable {\r
22 \r
23     static final String COPYRIGHT =\r
24                 "(C) Copyright IBM Corp. 1998-1999 - All Rights Reserved";\r
25     private TextComponent fTextComponent;\r
26     private TextSelection fSelection;\r
27     private RunStrategy fRunStrategy;\r
28     \r
29     private TextOffset fAnchorStart; // aliases text offsets - client beware\r
30     private TextOffset fAnchorEnd;\r
31     private TextOffset fCurrent;\r
32 \r
33     private final boolean fWasZeroLength;\r
34 \r
35     private int fCurrentX;\r
36     private int fCurrentY;\r
37     private boolean fMouseOutside;\r
38 \r
39     private Thread fAutoscrollThread = null;\r
40     private boolean fThreadRun = true;\r
41 \r
42     private static final int kScrollSleep = 300;\r
43 \r
44     public SelectionDragInteractor(TextSelection selection,\r
45                                    TextComponent textComponent,\r
46                                    RunStrategy runStrategy,\r
47                                    TextOffset anchorStart,\r
48                                    TextOffset anchorEnd,\r
49                                    TextOffset current,\r
50                                    int initialX,\r
51                                    int initialY,\r
52                                    boolean wasZeroLength) {\r
53 \r
54         fTextComponent = textComponent;\r
55         fSelection = selection;\r
56         fRunStrategy = runStrategy;\r
57         fAnchorStart = anchorStart;\r
58         fAnchorEnd = anchorEnd;\r
59         fCurrent = current;\r
60 \r
61         fCurrentX = initialX;\r
62         fCurrentY = initialY;\r
63         fMouseOutside = false;\r
64 \r
65         fWasZeroLength = wasZeroLength;\r
66         \r
67         setSelection();\r
68     }\r
69     \r
70     public boolean textControlEventOccurred(Behavior.EventType event, Object what) {\r
71 \r
72         return true;\r
73     }\r
74 \r
75     public boolean focusGained(FocusEvent event) {\r
76 \r
77         return true;\r
78     }\r
79 \r
80     public boolean focusLost(FocusEvent event) {\r
81 \r
82         return true;\r
83     }\r
84 \r
85     public boolean keyPressed(KeyEvent event) {\r
86 \r
87         return true;\r
88     }\r
89 \r
90     public boolean keyTyped(KeyEvent event) {\r
91 \r
92         return true;\r
93     }\r
94 \r
95     public boolean keyReleased(KeyEvent event) {\r
96 \r
97         return true;\r
98     }\r
99 \r
100     public synchronized boolean mouseDragged(MouseEvent e) {\r
101 \r
102         int x = e.getX(), y = e.getY();\r
103         if (fCurrentX != x || fCurrentY != y) {\r
104             fCurrentX = x;\r
105             fCurrentY = y;\r
106             processMouseLocation();\r
107         }\r
108         return true;\r
109     }\r
110 \r
111     public synchronized boolean mouseEnter(MouseEvent e) {\r
112 \r
113         fMouseOutside = false;\r
114         return true;\r
115     }\r
116 \r
117     public synchronized boolean mouseExited(MouseEvent e) {\r
118 \r
119         if (fAutoscrollThread == null) {\r
120             fAutoscrollThread = new Thread(this);\r
121             fAutoscrollThread.start();\r
122         }\r
123         fMouseOutside = true;\r
124         notify();\r
125 \r
126         return true;\r
127     }\r
128 \r
129     public synchronized boolean mouseReleased(MouseEvent e) {\r
130 \r
131         fMouseOutside = false;\r
132         fThreadRun = false;\r
133         if (fAutoscrollThread != null) {\r
134             fAutoscrollThread.interrupt();\r
135         }\r
136         \r
137         removeFromOwner();\r
138         boolean isZeroLength = TextSelection.rangeIsZeroLength(fAnchorStart,\r
139                                                                fAnchorEnd,\r
140                                                                fCurrent);\r
141         fSelection.mouseReleased(isZeroLength != fWasZeroLength);\r
142 \r
143         return true;\r
144     }\r
145 \r
146     private void processMouseLocation() {\r
147 \r
148         fTextComponent.scrollToShow(fCurrentX, fCurrentY);\r
149         fTextComponent.pointToTextOffset(fCurrent, fCurrentX, fCurrentY, null, true);\r
150         setSelection();\r
151     }\r
152 \r
153     private void setSelection() {\r
154 \r
155         if (fCurrent.greaterThan(fAnchorEnd)) {\r
156             fSelection.advanceToNextBoundary(fCurrent);\r
157             fSelection.setSelRangeAndDraw(fAnchorStart, fCurrent, fAnchorStart);\r
158         }\r
159         else if (fCurrent.lessThan(fAnchorStart)) {\r
160             fSelection.advanceToPreviousBoundary(fCurrent);\r
161             fSelection.setSelRangeAndDraw(fCurrent, fAnchorEnd, fAnchorStart);\r
162         }\r
163         else {\r
164             fCurrent.assign(fAnchorEnd);\r
165             fSelection.setSelRangeAndDraw(fAnchorStart, fAnchorEnd, fAnchorStart);\r
166         }\r
167     }\r
168 \r
169     public void run() {\r
170 \r
171         Runnable doMouseLoc = new Runnable() {\r
172             public void run() {\r
173                 processMouseLocation();\r
174             }\r
175         };\r
176         \r
177         while (fThreadRun) {\r
178 \r
179             try {\r
180                 Thread.sleep(kScrollSleep);\r
181             }\r
182             catch(InterruptedException e) {\r
183                 return; // just quit scrolling\r
184             }\r
185 \r
186             synchronized(this) {\r
187 \r
188                 while (!fMouseOutside) {\r
189                     try {\r
190                         wait();\r
191                     }\r
192                     catch(InterruptedException e) {\r
193                         return; // just quit scrolling\r
194                     }\r
195                 }\r
196 \r
197                 fRunStrategy.doIt(doMouseLoc);\r
198             }\r
199         }\r
200     }\r
201 }\r