/** * Copyright (c) 2005-2006 IBM Corporation and others. * 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: * IBM - Initial API and implementation */ package org.eclipse.emf.exporter.util; import org.eclipse.swt.SWT; import org.eclipse.swt.custom.ControlEditor; import org.eclipse.swt.custom.TreeEditor; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Control; import org.eclipse.swt.widgets.Event; import org.eclipse.swt.widgets.Listener; import org.eclipse.swt.widgets.Tree; import org.eclipse.swt.widgets.TreeColumn; import org.eclipse.swt.widgets.TreeItem; import org.eclipse.swt.widgets.Widget; /** * @since 2.2.0 */ public class ExporterUIUtil { public static abstract class CompositeEditorHelper implements Listener { protected Composite composite; protected ControlEditor compositeEditor; protected CompositeEditorHelper(Composite composite) { this.composite = composite; composite.addListener(SWT.Selection, this); composite.addListener(SWT.DefaultSelection, this); composite.addListener(SWT.Dispose, this); compositeEditor = createControlEditor(composite); compositeEditor.horizontalAlignment = SWT.LEFT; compositeEditor.grabHorizontal = true; } protected ControlEditor createControlEditor(Composite composite) { return new ControlEditor(composite); } public void handleEvent(Event event) { if (event.widget == composite) { switch (event.type) { case SWT.Selection: case SWT.DefaultSelection: compositeSelected(event); break; case SWT.Dispose: compositeDisposed(); break; } } } protected void compositeSelected(Event event) { disposeOldEditorControl(compositeEditor.getEditor()); Widget item = event.item; Control editorControl = createEditorControl(item); if (editorControl != null) { setEditor(editorControl, item); } } protected void compositeDisposed() { composite.removeListener(SWT.Selection, this); composite.removeListener(SWT.DefaultSelection, this); composite.removeListener(SWT.Dispose, this); composite = null; } protected void disposeOldEditorControl(Control control) { if (control != null && !control.isDisposed()) { control.removeListener(SWT.Selection, this); control.dispose(); } } protected void setEditor(Control editorControl, Widget item) { compositeEditor.setEditor(editorControl); } protected abstract Control createEditorControl(Widget item); } public static abstract class TreeEditorHelper extends CompositeEditorHelper { public TreeEditorHelper(Tree tree) { super(tree); } @Override protected ControlEditor createControlEditor(Composite composite) { return new TreeEditor((Tree)composite); } public void setColumn(int index) { TreeColumn treeColumn = ((Tree)composite).getColumn(index); TreeEditor treeEditor = (TreeEditor)compositeEditor; treeEditor.minimumWidth = treeColumn.getWidth(); treeEditor.setColumn(index); } public int getColumn() { return ((TreeEditor)compositeEditor).getColumn(); } @Override protected void setEditor(Control editorControl, Widget item) { ((TreeEditor)compositeEditor).setEditor(editorControl, (TreeItem)item); } } }