trace/traceviewer/com.nokia.traceviewer/src/com/nokia/traceviewer/view/listener/ViewerKeyListener.java
changeset 11 5b9d4d8641ce
equal deleted inserted replaced
10:ed1c9f64298a 11:5b9d4d8641ce
       
     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 }