package org.codemap.mapview; import org.eclipse.swt.SWT; import org.eclipse.swt.events.ControlEvent; import org.eclipse.swt.events.ControlListener; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Display; import org.eclipse.swt.widgets.Event; import org.eclipse.swt.widgets.Listener; /** * Used to detect when the mapview was resized and to trigger * the redraw/resize events. * When the window is dragged it delays resizing until the * dragging has stopped. * * @author deif */ public class ResizeListener implements ControlListener { private Composite eventsource; private boolean mouseDown; private boolean resized; private MapController theController; public ResizeListener(Composite eventsource, MapController theController) { this.eventsource = eventsource; this.theController = theController; setupListeners(); } private void setupListeners() { eventsource.addControlListener(this); Display display = Display.getCurrent(); addMouseUpListener(display); addMouseDownListener(display); } private void addMouseUpListener(Display display) { display.addFilter(SWT.MouseDown, new Listener(){ @Override public void handleEvent(Event event) { mouseDown(); } }); } private void addMouseDownListener(Display display) { display.addFilter(SWT.MouseUp, new Listener(){ @Override public void handleEvent(Event event) { mouseUp(); } }); } private void mouseUp() { mouseDown = false; if (resized) { resized = false; processResize(); } } private void mouseDown() { mouseDown = true; } @Override public void controlResized(ControlEvent e) { if (! mouseDown) { processResize(); } resized = true; } private void processResize() { theController.onResize(eventsource.getSize()); } @Override public void controlMoved(ControlEvent e) { // don't care } }