Skip to main content
aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
Diffstat (limited to 'bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/CaretMediator.java')
-rw-r--r--bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/CaretMediator.java427
1 files changed, 0 insertions, 427 deletions
diff --git a/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/CaretMediator.java b/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/CaretMediator.java
deleted file mode 100644
index b8d3aab397..0000000000
--- a/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/CaretMediator.java
+++ /dev/null
@@ -1,427 +0,0 @@
-/*
-* Copyright (c) 2002 IBM Corporation and others.
-* All rights reserved. This program and the accompanying materials
-* are made available under the terms of the Common Public License v1.0
-* which accompanies this distribution, and is available at
-* http://www.eclipse.org/legal/cpl-v10.html
-*
-* Contributors:
-* IBM - Initial API and implementation
-* Jens Lukowski/Innoopract - initial renaming/restructuring
-*
-*/
-package org.eclipse.wst.sse.ui;
-
-
-
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.custom.StyledText;
-import org.eclipse.swt.events.KeyEvent;
-import org.eclipse.swt.events.KeyListener;
-import org.eclipse.swt.events.MouseEvent;
-import org.eclipse.swt.events.MouseListener;
-import org.eclipse.swt.events.SelectionEvent;
-import org.eclipse.swt.events.SelectionListener;
-import org.eclipse.swt.events.TypedEvent;
-import org.eclipse.swt.widgets.Display;
-import org.eclipse.swt.widgets.Event;
-import org.eclipse.swt.widgets.Listener;
-import org.eclipse.wst.sse.core.util.Debug;
-import org.eclipse.wst.sse.core.util.Utilities;
-import org.eclipse.wst.sse.ui.util.Assert;
-import org.eclipse.wst.sse.ui.view.events.CaretEvent;
-import org.eclipse.wst.sse.ui.view.events.ICaretListener;
-
-
-/**
- * Has the responsibility of listening for key events, and mouse events, deciding if the
- * caret has moved (without a text change), and if so, will notify CaretListeners that the
- * caret has moved. Objects which are interested in ALL caret postion changes will also
- * have to listen for textChanged events.
- */
-public class CaretMediator implements org.eclipse.swt.widgets.Listener {
-
-
- public class DelayTimer {
-
- /**
- * A DelayTimer notifies a listener when a specific amount
- * of time has passed. Based upon
- * org.eclipse.jdt.internal.debug.core.Timer
- */
-
- protected Listener fListener;
- protected int fTimeout;
- protected boolean fAlive = true;
- protected boolean fStarted = false;
-
- /**
- */
- private Thread fDelayThread;
-
- /**
- * Constructs a new timer
- */
- public DelayTimer() {
- fTimeout = Integer.MAX_VALUE;
- Runnable r = new Runnable() {
- public void run() {
- while (fAlive) {
- boolean interrupted = false;
- try {
- Thread.sleep(fTimeout);
- }
- catch (InterruptedException e) {
- interrupted = true;
- }
- if (!interrupted) {
- if (fListener != null) {
- fStarted = false;
- fTimeout = Integer.MAX_VALUE;
- fListener.handleEvent(null);
- }
- }
- }
- }
- };
- fDelayThread = new Thread(r, "Caret Delay Timer");//$NON-NLS-1$
- fDelayThread.setDaemon(true);
- fDelayThread.start();
- }
-
- /**
- * Disposes this timer
- */
- public void dispose() {
- fAlive = false;
- fDelayThread.interrupt();
- fDelayThread = null;
- }
-
- /**
- * Immediately cancels any pending requests, and start over,
- * with the previous value, fTimeout, passed into start.
- * Note: 'restarting' a stopped timer basically has no effect.
- */
- public synchronized void restart() {
- stop();
- start(fListener, fTimeout);
- }
-
- /**
- * Starts this timer, and notifies the given listener when
- * the time has passed. A call to <code>stop</code>, before the
- * time expires, will cancel the the timer and timeout callback.
- * This method can only be called if this timer is idle (i.e.
- * stopped, or expired).
- */
- public synchronized void start(Listener listener, int ms) {
- // if we are already started, we'll ignore the previous request,
- // and "start over" with this new request.
- //if (fStarted) {
- //restart();
- ////throw new IllegalStateException();
- //}
- fListener = listener;
- fTimeout = ms;
- fStarted = true;
- fDelayThread.interrupt();
- }
-
- /**
- * Stops this timer
- */
- public synchronized void stop() {
- fTimeout = Integer.MAX_VALUE;
- fStarted = false;
- fDelayThread.interrupt();
- }
- }
-
- class CaretMediatorListener implements KeyListener, MouseListener, SelectionListener {
-
-
- public void widgetSelected(SelectionEvent e) {
- internalWidgetSelected(e);
- }
-
- public void widgetDefaultSelected(SelectionEvent e) {
- internalWidgetDefaultSelected(e);
- }
-
- public void mouseDoubleClick(MouseEvent e) {
- // ignore completely since mouseUp is always sent too
- }
-
- public void mouseDown(MouseEvent e) {
- // ignore ... even during a swipe select, we're only interested after the select
- // in which case the "caret" postion returned by the widget's getCaretPostion is
- // at the beginning of the selection -- which is what we want.
- internalMouseDown(e);
- }
-
- public void mouseUp(MouseEvent e) {
- internalMouseUp(e);
- }
-
- public void keyPressed(KeyEvent e) {
- internalKeyPressed(e);
- }
-
- public void keyReleased(KeyEvent e) {
- internalKeyReleased(e);
- }
- }
-
- protected ICaretListener[] fCaretListeners;
- protected DelayTimer timer;
- protected StyledText textWidget;
- protected int delayMSecs = 300;
- protected CaretMediatorListener internalListener;
- /** used just for debug print outs */
- private long startTime;
- /** used just for debug print outs */
- private long endTime;
-
- /**
- * CaretMediator constructor comment.
- */
- public CaretMediator() {
- super();
- }
-
- /**
- * CaretMediator constructor comment. Must always provide the widget its supposed to
- * listen to.
- */
- public CaretMediator(StyledText textWidget) {
- this();
- setTextWidget(textWidget);
- }
-
- public synchronized void addCaretListener(ICaretListener listener) {
-
- if (Debug.debugStructuredDocument) {
- System.out.println("CaretMediator::addCaretListener. Request to add an instance of " + listener.getClass() + " as a listener on caretlistner.");//$NON-NLS-2$//$NON-NLS-1$
- }
- // make sure listener is not already in listening array
- // (and if it is, print a warning to aid debugging, if needed)
-
- if (Utilities.contains(fCaretListeners, listener)) {
- if (Debug.displayWarnings) {
- System.out.println("CaretMediator::addCaretListener. listener " + listener + " was added more than once. ");//$NON-NLS-2$//$NON-NLS-1$
- }
- }
- else {
- if (Debug.debugStructuredDocument) {
- System.out.println("CaretMediator::addCaretListener. Adding an instance of " + listener.getClass() + " as a listener on caret mediator.");//$NON-NLS-2$//$NON-NLS-1$
- }
- int oldSize = 0;
- if (fCaretListeners != null) {
- // normally won't be null, but we need to be sure, for first time through
- oldSize = fCaretListeners.length;
- }
- int newSize = oldSize + 1;
- ICaretListener[] newListeners = new ICaretListener[newSize];
- if (fCaretListeners != null) {
- System.arraycopy(fCaretListeners, 0, newListeners, 0, oldSize);
- }
- // add listener to last position
- newListeners[newSize - 1] = listener;
- //
- // now switch new for old
- fCaretListeners = newListeners;
-
- }
- }
-
- protected void fireCaretEvent(CaretEvent event) {
- if (fCaretListeners != null) {
- // we must assign listeners to local variable to be thread safe,
- // since the add and remove listner methods
- // can change this object's actual instance of the listener array from another thread
- // (and since object assignment is atomic, we don't need to synchronize
- ICaretListener[] holdListeners = fCaretListeners;
- //
- for (int i = 0; i < holdListeners.length; i++) {
- holdListeners[i].caretMoved(event);
-
- }
- }
- }
-
- public void handleEvent(Event e) {
- Display display = null;
- // timer should never be null when this fires,
- // since the handleEvent should be called from the other thread.
- Assert.isNotNull(timer);
-
- if (Debug.debugCaretMediator) {
- endTime = System.currentTimeMillis();
- System.out.println("Timer fired: " + (endTime - startTime)); //$NON-NLS-1$
- }
-
- // check if 'okToUse'
- if (textWidget != null && !textWidget.isDisposed()) {
- display = textWidget.getDisplay();
- if ((display != null) && (!display.isDisposed())) {
- display.asyncExec(new Runnable() {
- public void run() {
- if (textWidget != null && !textWidget.isDisposed()) {
- fireCaretEvent(new CaretEvent(textWidget, textWidget.getCaretOffset()));
- }
- }
- });
- }
- }
- }
-
- protected void internalKeyPressed(KeyEvent e) {
- // stopTimer(e);
- }
-
- protected void internalKeyReleased(KeyEvent e) {
- switch (e.keyCode) {
- case SWT.ARROW_DOWN :
- case SWT.ARROW_UP :
- case SWT.ARROW_LEFT :
- case SWT.ARROW_RIGHT :
- case SWT.HOME :
- case SWT.END :
- case SWT.PAGE_DOWN :
- case SWT.PAGE_UP :
- {
- startTimer(e);
- break;
- }
- default :
- {
- // always update cursor postion, even during normal typing
- // (the logic may look funny, since we always to the same
- // thing, but we haven't always done the same thing, so I
- // wanted to leave that fact documented via code.)
- startTimer(e);
- }
- }
- }
-
- protected void internalMouseDown(MouseEvent e) {
- stopTimer(e);
- }
-
- protected void internalMouseUp(MouseEvent e) {
- // Note, even during a swipe select, when the mouse button goes up, and the widget is
- // queried for the current caret postion, it always returns the beginning of the selection,
- // which is desirable (at least for the known use of this feature, which is to signal
- // that the property sheet can update itself.
- startTimer(e);
- }
-
- protected void internalWidgetDefaultSelected(SelectionEvent event) {
- // What to do here?
- //System.out.println("Double: " + event.x + " " + event.y + " " + event.width + " " + event.item);
- }
-
- protected void internalWidgetSelected(SelectionEvent event) {
- // TODO: be sure "current caret postion is updated with event.x (beginnging of selection)
- // and that your 'end' is set to event.y
- //System.out.println("Single: " + event.x + " " + event.y + " " + event.width + " " + event.item);
- }
-
- public void release() {
- if (timer != null) {
- timer.dispose();
- timer = null;
- }
- if (textWidget != null && !textWidget.isDisposed()) {
- textWidget.removeKeyListener(internalListener);
- textWidget.removeMouseListener(internalListener);
- textWidget.removeSelectionListener(internalListener);
- textWidget = null;
- }
-
- }
-
- public synchronized void removeCaretListener(ICaretListener listener) {
-
- if ((fCaretListeners != null) && (listener != null)) {
- // if its not in the listeners, we'll ignore the request
- if (Utilities.contains(fCaretListeners, listener)) {
- int oldSize = fCaretListeners.length;
- int newSize = oldSize - 1;
- ICaretListener[] newListeners = new ICaretListener[newSize];
- int index = 0;
- for (int i = 0; i < oldSize; i++) {
- if (fCaretListeners[i] == listener) { // ignore
- }
- else {
- // copy old to new if its not the one we are removing
- newListeners[index++] = fCaretListeners[i];
- }
- }
- // now that we have a new array, let's switch it for the old one
- fCaretListeners = newListeners;
- }
- }
- }
-
- public void setTextWidget(StyledText textWidget) {
- // unhook from previous, if any
- if (this.textWidget != null) {
- stopTimer(null);
- this.textWidget.removeKeyListener(internalListener);
- this.textWidget.removeMouseListener(internalListener);
- this.textWidget.removeSelectionListener(internalListener);
- }
- //
- //
- this.textWidget = textWidget;
- internalListener = new CaretMediatorListener();
- if (textWidget != null) {
- textWidget.addKeyListener(internalListener);
- textWidget.addMouseListener(internalListener);
- textWidget.addSelectionListener(internalListener);
- }
- else {
- Logger.log(Logger.WARNING, "CaretMediator constructor. textWidget was null, so keys and mouse events won't be listened to");//$NON-NLS-1$
- }
- }
-
- /**
- * The TypedEvent is expected to be of type KeyEvent or MouseEvent.
- */
- protected void startTimer(TypedEvent e) {
- if (timer == null) {
- timer = new DelayTimer();
- if (Debug.debugCaretMediator) {
- startTime = System.currentTimeMillis();
- System.out.println("Timer created: " + startTime); //$NON-NLS-1$
- }
- }
- if (Debug.debugCaretMediator) {
-
- endTime = System.currentTimeMillis();
- System.out.println("Timer started/restarted: after " + (endTime - startTime)); //$NON-NLS-1$
- startTime = System.currentTimeMillis();
- }
- timer.start(this, delayMSecs);
- }
-
- /**
- * The TypedEvent is expected to be of type KeyEvent or MouseEvent.
- */
- protected void stopTimer(TypedEvent e) {
- if (timer != null) {
- timer.stop();
- if (Debug.debugCaretMediator) {
- endTime = System.currentTimeMillis();
- System.out.println("Timer stopped: " + (endTime - startTime)); //$NON-NLS-1$
- startTime = System.currentTimeMillis();
- }
- }
- else if (Debug.debugCaretMediator) {
- System.out.println("No Timer to stop: " + System.currentTimeMillis()); //$NON-NLS-1$
- }
-
- }
-}

Back to the top