|
1 /* |
|
2 * Copyright (c) 2007-2010 Nokia Corporation and/or its subsidiary(-ies). |
|
3 * All rights reserved. |
|
4 * This component and the accompanying materials are made available |
|
5 * under the terms of "Eclipse Public License v1.0" |
|
6 * which accompanies this distribution, and is available |
|
7 * at the URL "http://www.eclipse.org/legal/epl-v10.html". |
|
8 * |
|
9 * Initial Contributors: |
|
10 * Nokia Corporation - initial contribution. |
|
11 * |
|
12 * Contributors: |
|
13 * |
|
14 * Description: |
|
15 * |
|
16 * TraceViewer view key listener |
|
17 * |
|
18 */ |
|
19 package com.nokia.traceviewer.view.listener; |
|
20 |
|
21 import org.eclipse.jface.text.TextViewer; |
|
22 import org.eclipse.swt.SWT; |
|
23 import org.eclipse.swt.events.KeyEvent; |
|
24 import org.eclipse.swt.events.KeyListener; |
|
25 import org.eclipse.swt.widgets.Slider; |
|
26 |
|
27 import com.nokia.traceviewer.engine.StateHolder; |
|
28 import com.nokia.traceviewer.engine.TraceViewerGlobals; |
|
29 import com.nokia.traceviewer.engine.TraceViewerTraceViewInterface; |
|
30 import com.nokia.traceviewer.engine.TraceViewerUtils; |
|
31 import com.nokia.traceviewer.view.TraceViewerView; |
|
32 |
|
33 /** |
|
34 * TraceViewer view key listener |
|
35 * |
|
36 */ |
|
37 public class ViewerKeyListener implements KeyListener { |
|
38 |
|
39 /** |
|
40 * The slider in the view |
|
41 */ |
|
42 private final Slider slider; |
|
43 |
|
44 /** |
|
45 * The TextViewer in the view |
|
46 */ |
|
47 private final TextViewer viewer; |
|
48 |
|
49 /** |
|
50 * TraceViewer view |
|
51 */ |
|
52 private final TraceViewerView view; |
|
53 |
|
54 /** |
|
55 * Boolean determining if view should be updated after arrow up/down |
|
56 */ |
|
57 private boolean shouldBeUpdated; |
|
58 |
|
59 /** |
|
60 * Font size |
|
61 */ |
|
62 private int fontSize = TraceViewerTraceViewInterface.FONT_SIZE; |
|
63 |
|
64 /** |
|
65 * Max font size |
|
66 */ |
|
67 private static final int MAX_FONT_SIZE = 100; |
|
68 |
|
69 /** |
|
70 * Constructor |
|
71 * |
|
72 * @param slider |
|
73 * reference to the slider |
|
74 * @param viewer |
|
75 * reference to the viewer |
|
76 * @param view |
|
77 * reference to the view |
|
78 */ |
|
79 public ViewerKeyListener(Slider slider, TextViewer viewer, |
|
80 TraceViewerView view) { |
|
81 this.slider = slider; |
|
82 this.viewer = viewer; |
|
83 this.view = view; |
|
84 } |
|
85 |
|
86 /* |
|
87 * (non-Javadoc) |
|
88 * |
|
89 * @see |
|
90 * org.eclipse.swt.events.KeyListener#keyPressed(org.eclipse.swt.events. |
|
91 * KeyEvent) |
|
92 */ |
|
93 public void keyPressed(KeyEvent e) { |
|
94 int keyCode = e.keyCode; |
|
95 int showingTracesFrom = TraceViewerGlobals.getTraceViewer().getView() |
|
96 .getShowingTracesFrom(); |
|
97 |
|
98 switch (keyCode) { |
|
99 |
|
100 // Page up pressed |
|
101 case SWT.PAGE_UP: |
|
102 // If there is at least one full page left in up of the cursor, we |
|
103 // just move the slider to where top index is |
|
104 if (viewer.getTopIndex() > (viewer.getBottomIndex() - viewer |
|
105 .getTopIndex())) { |
|
106 slider.setSelection(showingTracesFrom + viewer.getTopIndex()); |
|
107 |
|
108 // If there is not at least one full page left, we move the |
|
109 // slider with one thumb |
|
110 } else { |
|
111 slider.setSelection(slider.getSelection() - slider.getThumb()); |
|
112 TraceViewerGlobals.getTraceViewer().getStateHolder().setState( |
|
113 StateHolder.State.SCROLLING_WITH_PAGEUPDOWN); |
|
114 } |
|
115 |
|
116 break; |
|
117 |
|
118 // Page down pressed |
|
119 case SWT.PAGE_DOWN: |
|
120 // If there is at least full page left down from the cursor, we |
|
121 // just move the slider to where top index is |
|
122 if (viewer.getTopIndex() + viewer.getBottomIndex() |
|
123 - viewer.getTopIndex() + 2 < viewer.getTextWidget() |
|
124 .getLineCount()) { |
|
125 |
|
126 slider.setSelection(showingTracesFrom + viewer.getTopIndex()); |
|
127 |
|
128 // If there is not full page left, we move the |
|
129 // slider with one thumb |
|
130 } else { |
|
131 slider.setSelection(slider.getSelection() + slider.getThumb()); |
|
132 TraceViewerGlobals.getTraceViewer().getStateHolder().setState( |
|
133 StateHolder.State.SCROLLING_WITH_PAGEUPDOWN); |
|
134 } |
|
135 |
|
136 break; |
|
137 |
|
138 case SWT.ARROW_UP: |
|
139 // There is at least 1 row in top of the view, just move slider to |
|
140 // where top index is |
|
141 if (viewer.getTopIndex() > 0) { |
|
142 slider.setSelection(showingTracesFrom + viewer.getTopIndex()); |
|
143 } else { |
|
144 // When we are in the first row, the second time is when we want |
|
145 // to update |
|
146 if (shouldBeUpdated) { |
|
147 TraceViewerGlobals.getTraceViewer().getStateHolder() |
|
148 .setState(StateHolder.State.SCROLLING_WITH_ARROWS); |
|
149 slider.setSelection(showingTracesFrom - 1); |
|
150 shouldBeUpdated = false; |
|
151 } else { |
|
152 shouldBeUpdated = true; |
|
153 } |
|
154 |
|
155 } |
|
156 removePossibleSelection(e.stateMask); |
|
157 break; |
|
158 case SWT.ARROW_DOWN: |
|
159 // There is at least 1 row in bottom of the view, just move slider |
|
160 // to where top index is |
|
161 if (viewer.getBottomIndex() < viewer.getTextWidget().getLineCount() - 1) { |
|
162 slider.setSelection(showingTracesFrom + viewer.getTopIndex()); |
|
163 } else { |
|
164 TraceViewerGlobals.getTraceViewer().getStateHolder().setState( |
|
165 StateHolder.State.SCROLLING_WITH_ARROWS); |
|
166 slider.setSelection(slider.getSelection() + 1); |
|
167 } |
|
168 removePossibleSelection(e.stateMask); |
|
169 break; |
|
170 case SWT.ARROW_LEFT: |
|
171 // Fall through |
|
172 case SWT.ARROW_RIGHT: |
|
173 removePossibleSelection(e.stateMask); |
|
174 break; |
|
175 case SWT.HOME: |
|
176 // Ctrl was used |
|
177 if ((e.stateMask & SWT.CTRL) == SWT.CTRL) { |
|
178 |
|
179 // Shift was used |
|
180 if ((e.stateMask & SWT.SHIFT) == SWT.SHIFT) { |
|
181 SelectionProperties.lastClickedLine = 0; |
|
182 SelectionProperties.lastClickedLineCaretOffset = 0; |
|
183 SelectionProperties.lastClickedTimestamp = TraceViewerUtils |
|
184 .getTimestampStringForTrace(0); |
|
185 |
|
186 } else { |
|
187 SelectionProperties.firstClickedLine = 0; |
|
188 SelectionProperties.firstClickedLineCaretOffset = 0; |
|
189 SelectionProperties.firstClickedTimestamp = TraceViewerUtils |
|
190 .getTimestampStringForTrace(0); |
|
191 SelectionProperties.lastClickedLine = -1; |
|
192 SelectionProperties.lastClickedTimestamp = ""; //$NON-NLS-1$ |
|
193 } |
|
194 |
|
195 // If we are in the first block |
|
196 if (isInFirstBlock()) { |
|
197 // Update trim and set selection |
|
198 ViewerSelectionChangedListener |
|
199 .handleTrimInformationUpdate(); |
|
200 view.setSelection(); |
|
201 } |
|
202 |
|
203 // Jump to first line |
|
204 viewer.getTextWidget().setCaretOffset(0); |
|
205 slider.setSelection(0); |
|
206 |
|
207 // Ctrl was not used |
|
208 } else { |
|
209 removePossibleSelection(e.stateMask); |
|
210 } |
|
211 |
|
212 break; |
|
213 case SWT.END: |
|
214 // Ctrl was used |
|
215 if ((e.stateMask & SWT.CTRL) == SWT.CTRL) { |
|
216 int traceCount = TraceViewerGlobals.getTraceViewer() |
|
217 .getDataReaderAccess().getCurrentDataReader() |
|
218 .getTraceCount(); |
|
219 |
|
220 // Shift was used |
|
221 if ((e.stateMask & SWT.SHIFT) == SWT.SHIFT) { |
|
222 SelectionProperties.lastClickedLine = traceCount; |
|
223 SelectionProperties.lastClickedLineCaretOffset = 0; |
|
224 SelectionProperties.lastClickedTimestamp = TraceViewerUtils |
|
225 .getTimestampStringForTrace(traceCount - 1); |
|
226 } else { |
|
227 SelectionProperties.firstClickedLine = traceCount; |
|
228 SelectionProperties.firstClickedLineCaretOffset = 0; |
|
229 SelectionProperties.firstClickedTimestamp = TraceViewerUtils |
|
230 .getTimestampStringForTrace(traceCount - 1); |
|
231 SelectionProperties.lastClickedLine = -1; |
|
232 SelectionProperties.lastClickedTimestamp = ""; //$NON-NLS-1$ |
|
233 } |
|
234 |
|
235 // If we are in the last block |
|
236 if (isInLastBlock()) { |
|
237 |
|
238 // Set the caret to the end |
|
239 viewer.getTextWidget().setCaretOffset( |
|
240 viewer.getTextWidget().getCharCount()); |
|
241 |
|
242 viewer.setTopIndex(traceCount); |
|
243 |
|
244 // Update trim and set selection |
|
245 ViewerSelectionChangedListener |
|
246 .handleTrimInformationUpdate(); |
|
247 view.setSelection(); |
|
248 |
|
249 // Not in the last block |
|
250 } else { |
|
251 SelectionProperties.putCaretToTheEnd = true; |
|
252 } |
|
253 |
|
254 // Change the slider position |
|
255 slider.setSelection(traceCount); |
|
256 |
|
257 // Ctrl was not used |
|
258 } else { |
|
259 removePossibleSelection(e.stateMask); |
|
260 } |
|
261 |
|
262 break; |
|
263 |
|
264 // Search again |
|
265 case SWT.F3: |
|
266 String previousSearch = TraceViewerGlobals.getTraceViewer() |
|
267 .getDataProcessorAccess().getSearchProcessor() |
|
268 .getSearchDialog().getPreviousSearchString(); |
|
269 |
|
270 if (!previousSearch.equals("")) { //$NON-NLS-1$ |
|
271 TraceViewerGlobals.getTraceViewer().getDataProcessorAccess() |
|
272 .getSearchProcessor().searchTraceWithString( |
|
273 previousSearch); |
|
274 } |
|
275 break; |
|
276 default: |
|
277 break; |
|
278 } |
|
279 |
|
280 // Font size can be changed with CTRL + "+" or CTRL + "-" chars |
|
281 if (e.stateMask == SWT.CTRL) { |
|
282 switch (e.character) { |
|
283 case '+': |
|
284 if (fontSize++ <= MAX_FONT_SIZE) { |
|
285 TraceViewerGlobals.getTraceViewer().getView().setFontSize( |
|
286 fontSize); |
|
287 } else { |
|
288 fontSize = MAX_FONT_SIZE; |
|
289 } |
|
290 |
|
291 break; |
|
292 case '-': |
|
293 if (fontSize-- > 0) { |
|
294 TraceViewerGlobals.getTraceViewer().getView().setFontSize( |
|
295 fontSize); |
|
296 } else { |
|
297 fontSize = 1; |
|
298 } |
|
299 break; |
|
300 default: |
|
301 break; |
|
302 } |
|
303 |
|
304 } |
|
305 |
|
306 // Scroll to new line or get more data |
|
307 TraceViewerGlobals.getTraceViewer().getView().scrollViewToLine( |
|
308 slider.getSelection()); |
|
309 } |
|
310 |
|
311 /* |
|
312 * (non-Javadoc) |
|
313 * |
|
314 * @see |
|
315 * org.eclipse.swt.events.KeyListener#keyReleased(org.eclipse.swt.events |
|
316 * .KeyEvent) |
|
317 */ |
|
318 public void keyReleased(KeyEvent e) { |
|
319 |
|
320 } |
|
321 |
|
322 /** |
|
323 * Checks if we are in the last block of traces |
|
324 * |
|
325 * @return true if we are in the last block of traces |
|
326 */ |
|
327 private boolean isInLastBlock() { |
|
328 boolean lastBlock = false; |
|
329 if (TraceViewerGlobals.getTraceViewer().getView() |
|
330 .getShowingTracesFrom() |
|
331 + (2 * TraceViewerGlobals.blockSize) > TraceViewerGlobals |
|
332 .getTraceViewer().getDataReaderAccess().getCurrentDataReader() |
|
333 .getTraceCount()) { |
|
334 lastBlock = true; |
|
335 } |
|
336 return lastBlock; |
|
337 |
|
338 } |
|
339 |
|
340 /** |
|
341 * Checks if we are in the first block of traces |
|
342 * |
|
343 * @return true if we are in the first block of traces |
|
344 */ |
|
345 private boolean isInFirstBlock() { |
|
346 boolean firstBlock = false; |
|
347 if (TraceViewerGlobals.getTraceViewer().getView() |
|
348 .getShowingTracesFrom() == 0) { |
|
349 firstBlock = true; |
|
350 } |
|
351 return firstBlock; |
|
352 |
|
353 } |
|
354 |
|
355 /** |
|
356 * Removes possible selection |
|
357 * |
|
358 * @param stateMask |
|
359 * state mask for the key |
|
360 */ |
|
361 private void removePossibleSelection(int stateMask) { |
|
362 if (stateMask != SWT.SHIFT) { |
|
363 SelectionProperties.clear(); |
|
364 } |
|
365 } |
|
366 } |