/*****************************************************************************
* Copyright (c) 2008 CEA LIST.
*
*
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* Remi Schnekenburger (CEA LIST) remi.schnekenburger@cea.fr - Initial API and implementation
*
*****************************************************************************/
package org.eclipse.papyrus.extensionpoints.editors.ui;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.ControlEvent;
import org.eclipse.swt.events.ControlListener;
import org.eclipse.swt.events.DisposeEvent;
import org.eclipse.swt.events.DisposeListener;
import org.eclipse.swt.events.FocusEvent;
import org.eclipse.swt.events.FocusListener;
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.TraverseEvent;
import org.eclipse.swt.events.TraverseListener;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Event;
import org.eclipse.swt.widgets.Listener;
/**
*
*/
// @unused
public class CloseListener implements ControlListener, MouseListener, DisposeListener, FocusListener, KeyListener, TraverseListener, Listener {
/** main control of the parent editor to be listen */
private final Control control;
/** embedded editor to close */
private final EmbeddedTextEditor editor;
/** host shell for the embedded editor */
private final Composite composite;
/**
* Creates a new CloseListener.
*
* @param editor
* the editor to close
*/
public CloseListener(Control control, EmbeddedTextEditor editor, Composite composite) {
this.control = control;
this.editor = editor;
this.composite = composite;
install();
}
private void install() {
if(isControlValid()) {
Display display = control.getShell().getDisplay();
display.addListener(SWT.KeyDown, this);
display.addListener(SWT.Traverse, this);
display.addFilter(SWT.None, this);
control.getShell().addControlListener(this);
control.getShell().addKeyListener(this);
control.addListener(SWT.KeyDown, this);
control.addTraverseListener(this);
control.addMouseListener(this);
control.addDisposeListener(this);
control.addFocusListener(this);
control.addControlListener(this);
}
}
/**
* Checks if the parent control is valid or not.
*
* @return <code>true</code> if the control is not <code>null</code> and not disposed.
*/
protected boolean isControlValid() {
return (control != null && !control.isDisposed());
}
private void uninstall() {
if(isControlValid()) {
Display display = control.getShell().getDisplay();
display.removeListener(SWT.KeyDown, this);
display.removeListener(SWT.Traverse, this);
control.getShell().removeControlListener(this);
control.getShell().removeKeyListener(this);
control.removeListener(SWT.KeyDown, this);
control.removeTraverseListener(this);
control.removeMouseListener(this);
control.removeDisposeListener(this);
control.removeFocusListener(this);
control.removeControlListener(this);
}
}
public void controlResized(ControlEvent e) {
editor.close(false);
}
public void controlMoved(ControlEvent e) {
editor.close(false);
}
public void mouseDown(MouseEvent e) {
editor.close(true);
}
public void mouseUp(MouseEvent e) {
}
public void mouseDoubleClick(MouseEvent e) {
editor.close(false);
}
public void focusGained(FocusEvent e) {
}
public void focusLost(FocusEvent e) {
editor.close(true);
}
public void widgetDisposed(DisposeEvent e) {
editor.close(false);
}
public void close() {
uninstall();
if(composite != null && !composite.isDisposed()) {
composite.setVisible(false);
composite.dispose();
}
}
public void keyPressed(KeyEvent e) {
}
public void keyReleased(KeyEvent e) {
}
public void keyTraversed(TraverseEvent e) {
if(SWT.ESC == e.keyCode) {
editor.close(false);
e.doit = false;
}
}
public void handleEvent(Event event) {
}
}