/**
* Copyright (c) 2002-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.edit.ui.celleditor;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.FocusAdapter;
import org.eclipse.swt.events.FocusEvent;
import org.eclipse.swt.events.KeyAdapter;
import org.eclipse.swt.events.KeyEvent;
import org.eclipse.swt.events.ModifyEvent;
import org.eclipse.swt.events.ModifyListener;
import org.eclipse.swt.graphics.Point;
import org.eclipse.swt.widgets.Combo;
import org.eclipse.swt.widgets.Text;
import org.eclipse.swt.widgets.Tree;
import org.eclipse.swt.widgets.TreeItem;
import org.eclipse.emf.common.notify.AdapterFactory;
import org.eclipse.emf.common.ui.celleditor.ExtendedTreeEditor;
import org.eclipse.emf.edit.provider.IUpdateableItemText;
/**
* This base class for implementing {@link org.eclipse.swt.custom.TreeEditor}s that delegate
* to adapters produced by an {@link AdapterFactory}.
*/
public class AdapterFactoryTreeEditor extends ExtendedTreeEditor
{
private static final long serialVersionUID = 1L;
protected AdapterFactory adapterFactory;
protected TreeItem currentTreeItem;
public AdapterFactoryTreeEditor(Tree tree, AdapterFactory adapterFactory)
{
super(tree);
this.adapterFactory = adapterFactory;
}
public AdapterFactory getAdapterFactory()
{
return adapterFactory;
}
public void setAdapterFactory(AdapterFactory adapterFactory)
{
this.adapterFactory = adapterFactory;
}
@Override
protected void editItem(final TreeItem treeItem)
{
final Object object = treeItem.getData();
final IUpdateableItemText updateableItemText = (IUpdateableItemText)adapterFactory.adapt(object, IUpdateableItemText.class);
if (updateableItemText != null)
{
String string = updateableItemText.getUpdateableText(object);
if (string != null)
{
horizontalAlignment = SWT.LEFT;
// grabHorizontal = true;
minimumWidth = Math.max(50, treeItem.getBounds().width);
if (System.getProperty("EMF_COMBO_TEST") == null)
{
final Text text = new Text(tree, SWT.BORDER);
setEditor(text, treeItem);
text.setFocus();
text.setText(string);
text.setSelection(0, string.length());
text.addFocusListener
(new FocusAdapter()
{
private static final long serialVersionUID = 1L;
@Override
public void focusLost(FocusEvent event)
{
updateableItemText.setText(object, text.getText());
text.setVisible(false);
}
});
text.addKeyListener
(new KeyAdapter()
{
private static final long serialVersionUID = 1L;
@Override
public void keyPressed(KeyEvent event)
{
if (event.character == '\r' || event.character == '\n')
{
updateableItemText.setText(object, text.getText());
setEditor(null);
text.dispose();
}
else if (event.character == '\033')
{
setEditor(null);
text.dispose();
}
}
});
}
else
{
final Combo combo = new Combo(tree, SWT.BORDER);
setEditor(combo, treeItem);
combo.setFocus();
combo.setText(string);
combo.setSelection(new Point(0,string.length()));
combo.add("Item 1");
combo.add("Item 2");
combo.add("Item 3");
combo.add("Item 4");
combo.addFocusListener
(new FocusAdapter()
{
/**
*
*/
private static final long serialVersionUID = 1L;
@Override
public void focusLost(FocusEvent event)
{
System.out.println("Combo lost focus");
updateableItemText.setText(object, combo.getText());
combo.setVisible(false);
}
});
combo.addKeyListener
(new KeyAdapter()
{
/**
*
*/
private static final long serialVersionUID = 1L;
@Override
public void keyPressed(KeyEvent event)
{
System.out.println("Combo key event");
if (event.character == '\r' || event.character == '\n')
{
updateableItemText.setText(object, combo.getText());
setEditor(null);
combo.dispose();
}
else if (event.character == '\033')
{
setEditor(null);
combo.dispose();
}
}
});
combo.addModifyListener
(new ModifyListener()
{
/**
*
*/
private static final long serialVersionUID = 1L;
public void modifyText(ModifyEvent event)
{
System.out.println("Combo modified");
}
});
}
}
}
}
}