package tool.editors.cdf;
import java.beans.PropertyChangeEvent;
import java.beans.PropertyChangeListener;
import java.util.Set;
import org.eclipse.core.databinding.DataBindingContext;
import org.eclipse.core.databinding.UpdateValueStrategy;
import org.eclipse.core.databinding.beans.BeansObservables;
import org.eclipse.core.databinding.observable.value.IObservableValue;
import org.eclipse.core.resources.IFile;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.jface.databinding.swt.SWTObservables;
import org.eclipse.jface.viewers.ArrayContentProvider;
import org.eclipse.jface.viewers.ColumnLabelProvider;
import org.eclipse.jface.viewers.DoubleClickEvent;
import org.eclipse.jface.viewers.IDoubleClickListener;
import org.eclipse.jface.viewers.IStructuredContentProvider;
import org.eclipse.jface.viewers.ITreeSelection;
import org.eclipse.jface.viewers.ListViewer;
import org.eclipse.jface.viewers.TableViewer;
import org.eclipse.jface.viewers.TableViewerColumn;
import org.eclipse.jface.viewers.TreeViewer;
import org.eclipse.jface.viewers.Viewer;
import org.eclipse.jface.viewers.ViewerSorter;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.graphics.Image;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.ExpandBar;
import org.eclipse.swt.widgets.ExpandItem;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.List;
import org.eclipse.swt.widgets.Table;
import org.eclipse.swt.widgets.TableColumn;
import org.eclipse.swt.widgets.Text;
import org.eclipse.swt.widgets.Tree;
import org.eclipse.ui.IEditorInput;
import org.eclipse.ui.IEditorSite;
import org.eclipse.ui.IFileEditorInput;
import org.eclipse.ui.IWorkbenchPage;
import org.eclipse.ui.IWorkbenchPartConstants;
import org.eclipse.ui.IWorkbenchWindow;
import org.eclipse.ui.PlatformUI;
import org.eclipse.ui.forms.editor.FormEditor;
import org.eclipse.ui.forms.editor.FormPage;
import org.eclipse.wb.swt.ResourceManager;
import tool.ToolPlugin;
import tool.action.cdf.OpenClassComponentAction;
import tool.model.IClassComponent;
import tool.model.ToolClass;
import tool.model.ToolClass.ClassProperty;
import tool.model.ToolComponent;
import tool.model.ToolType;
import tool.model.validation.ToolNameValidator;
import tool.navigator.cdf.CdfContentProvider;
import tool.navigator.common.LabelProvider;
import tool.search.SelectType;
import org.eclipse.swt.widgets.TabFolder;
import org.eclipse.swt.widgets.TabItem;
public class ClassEditor extends FormPage implements PropertyChangeListener{
public static final String ID = "tool.editors.cdf.ClassEditor";
private static final Image CHECKED = ToolPlugin.getImage("icons/checked.gif");
private static final Image UNCHECKED = ToolPlugin.getImage("icons/unchecked.gif");
private DataBindingContext m_bindingContext;
ToolClass cdf;
private Text classNameText;
private Text superClassText;
private Table table;
private TableViewer tableViewer;
private TreeViewer treeViewer;
private ListViewer listViewer;
private Button addButton;
private Button removeButton;
private Text planNameText;
private TabItem tbtmName;
public ClassEditor(){
this(ID, "Class");
}
public ClassEditor(FormEditor editor, String id, String title) {
super(editor, id, title);
}
public ClassEditor(String id, String title) {
super(id, title);
}
@Override
public void createPartControl(Composite parent) {
parent.setLayout(new GridLayout(1, false));
TabFolder tabFolder = new TabFolder(parent, SWT.NONE);
tbtmName = new TabItem(tabFolder, SWT.NONE);
tbtmName.setImage(ResourceManager.getPluginImage("Tool", "icons/class.gif"));
tbtmName.setText("Name");
Composite nameComposite = new Composite(tabFolder, SWT.NONE);
tbtmName.setControl(nameComposite);
GridLayout gl_nameComposite = new GridLayout(3, false);
gl_nameComposite.horizontalSpacing = 8;
nameComposite.setLayout(gl_nameComposite);
Label lblPlanName = new Label(nameComposite, SWT.NONE);
lblPlanName.setLayoutData(new GridData(SWT.RIGHT, SWT.CENTER, false, false, 1, 1));
lblPlanName.setText("Plan Name");
planNameText = new Text(nameComposite, SWT.BORDER);
planNameText.setEditable(false);
GridData gd_planNameText = new GridData(SWT.FILL, SWT.CENTER, false, false, 1, 1);
gd_planNameText.widthHint = 224;
planNameText.setLayoutData(gd_planNameText);
new Label(nameComposite, SWT.NONE);
Label lblName = new Label(nameComposite, SWT.NONE);
lblName.setLayoutData(new GridData(SWT.RIGHT, SWT.CENTER, false, false, 1, 1));
lblName.setText("Class Name");
classNameText = new Text(nameComposite, SWT.BORDER);
GridData gd_classNameText = new GridData(SWT.FILL, SWT.CENTER, false, false, 1, 1);
gd_classNameText.widthHint = 224;
classNameText.setLayoutData(gd_classNameText);
new Label(nameComposite, SWT.NONE);
Label lblSuperClass = new Label(nameComposite, SWT.NONE);
lblSuperClass.setLayoutData(new GridData(SWT.RIGHT, SWT.CENTER, false, false, 1, 1));
lblSuperClass.setText("Super class");
superClassText = new Text(nameComposite, SWT.BORDER);
GridData gd_superClassText = new GridData(SWT.FILL, SWT.CENTER, false, false, 1, 1);
gd_superClassText.widthHint = 226;
superClassText.setLayoutData(gd_superClassText);
Button lookupButton = new Button(nameComposite, SWT.NONE);
lookupButton.setImage(ResourceManager.getPluginImage("Tool", "icons/look_up.gif"));
lookupButton.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent e) {
ToolComponent superClass = getCdf().getToolSuperClass();
ToolType newClass = (ToolType) SelectType.select(cdf, superClass);
cdf.setSuperClass(newClass.getFullName());
}
});
lookupButton.setToolTipText("Lookup Super Class");
TabItem tbtmProperties = new TabItem(tabFolder, SWT.NONE);
tbtmProperties.setImage(ResourceManager.getPluginImage("Tool", "icons/properties.gif"));
tbtmProperties.setText("Properties");
Composite propsComposite = new Composite(tabFolder, SWT.NONE);
tbtmProperties.setControl(propsComposite);
tableViewer = new TableViewer(propsComposite, SWT.BORDER | SWT.FULL_SELECTION);
table = tableViewer.getTable();
table.setSize(291, 86);
table.setLinesVisible(true);
table.setHeaderVisible(true);
TableViewerColumn tableViewerColumn = new TableViewerColumn(tableViewer, SWT.NONE);
tableViewerColumn.setLabelProvider(new ColumnLabelProvider(){
@Override
public String getText(Object element) {
ClassProperty cp = (ClassProperty)element;
return cp.name;
}
});
TableColumn tblclmnName = tableViewerColumn.getColumn();
tblclmnName.setResizable(false);
tblclmnName.setWidth(120);
tblclmnName.setText("Name");
TableViewerColumn tableViewerColumn_1 = new TableViewerColumn(tableViewer, SWT.NONE);
tableViewerColumn_1.setLabelProvider(new ColumnLabelProvider(){
@Override
public String getText(Object element) {
return null;
}
@Override
public Image getImage(Object element) {
if (((ClassProperty) element).allow) {
return CHECKED;
} else {
return UNCHECKED;
}
}
});
TableColumn tblclmnAllow = tableViewerColumn_1.getColumn();
tblclmnAllow.setResizable(false);
tblclmnAllow.setWidth(50);
tblclmnAllow.setText("Allow");
TableViewerColumn tableViewerColumn_2 = new TableViewerColumn(tableViewer, SWT.NONE);
tableViewerColumn_2.setLabelProvider(new ColumnLabelProvider(){
@Override
public String getText(Object element) {
return null;
}
@Override
public Image getImage(Object element) {
if (((ClassProperty) element).override) {
return CHECKED;
} else {
return UNCHECKED;
}
}
});
TableColumn tblclmnOverride = tableViewerColumn_2.getColumn();
tblclmnOverride.setResizable(false);
tblclmnOverride.setWidth(50);
tblclmnOverride.setText("Override");
TableViewerColumn tableViewerColumn_3 = new TableViewerColumn(tableViewer, SWT.NONE);
tableViewerColumn_3.setLabelProvider(new ColumnLabelProvider(){
@Override
public String getText(Object element) {
return null;
}
@Override
public Image getImage(Object element) {
if (((ClassProperty) element).def) {
return CHECKED;
} else {
return UNCHECKED;
}
}
});
TableColumn tblclmnDefault = tableViewerColumn_3.getColumn();
tblclmnDefault.setWidth(50);
tblclmnDefault.setText("Default");
TabItem tbtmInterfaces = new TabItem(tabFolder, SWT.NONE);
tbtmInterfaces.setImage(ResourceManager.getPluginImage("Tool", "icons/interface.gif"));
tbtmInterfaces.setText("Interfaces Implemented");
Composite interfaceComposite = new Composite(tabFolder, SWT.NONE);
tbtmInterfaces.setControl(interfaceComposite);
interfaceComposite.setLayout(new GridLayout(2, false));
listViewer = new ListViewer(interfaceComposite, SWT.BORDER | SWT.V_SCROLL);
listViewer.setSorter(new ViewerSorter());
List list = listViewer.getList();
GridData gd_list = new GridData(SWT.LEFT, SWT.CENTER, false, false, 1, 1);
gd_list.widthHint = 284;
list.setLayoutData(gd_list);
list.setSize(238, 111);
listViewer.setContentProvider(new IStructuredContentProvider() {
public Object[] getElements(Object inputElement) {
return ((Set<?>)inputElement).toArray();
}
public void dispose() {
System.out.println("Disposing ...");
}
public void inputChanged(
Viewer viewer,
Object oldInput,
Object newInput) {
System.out.println("Input changed: old=" + oldInput + ", new=" + newInput);
}
});
listViewer.setLabelProvider(new LabelProvider());
Composite buttonComposite = new Composite(interfaceComposite, SWT.NONE);
//buttonComposite.setSize(51, 46);
buttonComposite.setCapture(true);
GridLayout gl_buttonComposite = new GridLayout(1, false);
gl_buttonComposite.verticalSpacing = 0;
gl_buttonComposite.marginWidth = 0;
gl_buttonComposite.horizontalSpacing = 0;
gl_buttonComposite.marginHeight = 0;
buttonComposite.setLayout(gl_buttonComposite);
addButton = new Button(buttonComposite, SWT.NONE);
addButton.setBounds(0, 0, 94, 30);
addButton.setText("Add");
removeButton = new Button(buttonComposite, SWT.NONE);
removeButton.setBounds(0, 0, 94, 30);
removeButton.setText("Remove");
tableViewer.setContentProvider(new ArrayContentProvider());
Composite membersComposite = new Composite(parent, SWT.NONE);
membersComposite.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true, 1, 1));
membersComposite.setLayout(new GridLayout(1, false));
treeViewer = new TreeViewer(membersComposite, SWT.BORDER);
treeViewer.addDoubleClickListener(new IDoubleClickListener() {
public void doubleClick(DoubleClickEvent event) {
ITreeSelection selection = (ITreeSelection)event.getSelection();
IWorkbenchWindow window=PlatformUI.getWorkbench().getActiveWorkbenchWindow();
IWorkbenchPage page = window.getActivePage();
Object element = selection.getFirstElement();
if (element instanceof IClassComponent){
OpenClassComponentAction action = new OpenClassComponentAction(page, (IClassComponent)element);
action.run();
treeViewer.refresh(element);
}
}
});
treeViewer.setSorter(new ViewerSorter());
treeViewer.setAutoExpandLevel(1);
Tree membersTree = treeViewer.getTree();
GridData gd_membersTree = new GridData(SWT.FILL, SWT.FILL, true, true, 1, 1);
gd_membersTree.widthHint = 300;
membersTree.setLayoutData(gd_membersTree);
membersTree.setSize(0, 0);
treeViewer.setLabelProvider(new LabelProvider());
treeViewer.setContentProvider(new CdfContentProvider());
if (this.cdf != null){
bind();
}
m_bindingContext = initDataBindings();
}
public void doSave(IProgressMonitor monitor) {
super.doSave(monitor);
this.cdf.doSave(monitor);
this.cdf.setDirty(false);
}
public void doSaveAs() {
}
public void init(IEditorSite site, IEditorInput editorInput) {
super.init(site, editorInput);
IFileEditorInput ifei = (IFileEditorInput)editorInput;
IFile modelFile = ifei.getFile();
ToolClass cdf = ToolClass.fetch(modelFile);
this.setCdf(cdf);
setPartName(cdf.getToolName());
}
/* (non-Javadoc)
* Method declared on IEditorPart.
*/
public boolean isSaveAsAllowed() {
return false;
}
@Override
public Image getTitleImage() {
if (this.getCdf() != null){
return ToolPlugin.getImage(this.getCdf().getIconString());
} else {
return ToolPlugin.getImage("icons/class.gif");
}
}
public ToolClass getCdf() {
return cdf;
}
public void setCdf(ToolClass cdf) {
if (m_bindingContext != null){
m_bindingContext.dispose();
m_bindingContext = null;
}
this.cdf = cdf;
this.cdf.setDirty(false);
this.cdf.addPropertyChangeListener("dirty", this);
if (this.cdf != null && classNameText != null){
bind();
}
}
@Override
public void dispose() {
this.cdf.removePropertyChangeListener(this);
super.dispose();
}
protected void bind(){
m_bindingContext = initDataBindings();
tableViewer.setInput(this.cdf.getClassProperties());
treeViewer.setInput(this.cdf);
listViewer.setInput(this.cdf.getImplementations());
if (cdf.isMapped()){
Image icon = ToolPlugin.getImage("icons/window_class.gif");
tbtmName.setImage(icon);
setTitleImage(icon);
}
}
@Override
public boolean isDirty() {
return this.cdf.isDirty();
}
@Override
public void propertyChange(PropertyChangeEvent event) {
if (event.getPropertyName().equalsIgnoreCase("dirty")){
firePropertyChange(IWorkbenchPartConstants.PROP_DIRTY);
}
}
protected DataBindingContext initDataBindings() {
DataBindingContext bindingContext = new DataBindingContext();
//
IObservableValue classNameTextObserveTextObserveWidget = SWTObservables.observeText(classNameText, SWT.Modify);
IObservableValue cdfNameObserveValue = BeansObservables.observeValue(cdf, "toolName");
UpdateValueStrategy strategy = new UpdateValueStrategy();
strategy.setAfterConvertValidator(new ToolNameValidator(classNameText));
bindingContext.bindValue(classNameTextObserveTextObserveWidget, cdfNameObserveValue, strategy, null);
//
IObservableValue superClassTextObserveTextObserveWidget = SWTObservables.observeText(superClassText, SWT.FocusOut);
IObservableValue cdfSuperClassObserveValue = BeansObservables.observeValue(cdf, "superClass");
bindingContext.bindValue(superClassTextObserveTextObserveWidget, cdfSuperClassObserveValue, null, null);
//
IObservableValue superClassTextObserveEditableObserveWidget = SWTObservables.observeEditable(superClassText);
IObservableValue cdfReadWriteObserveValue = BeansObservables.observeValue(cdf, "readWrite");
bindingContext.bindValue(superClassTextObserveEditableObserveWidget, cdfReadWriteObserveValue, null, null);
//
IObservableValue classNameTextObserveEditableObserveWidget = SWTObservables.observeEditable(classNameText);
bindingContext.bindValue(classNameTextObserveEditableObserveWidget, cdfReadWriteObserveValue, null, null);
//
IObservableValue addButtonObserveEnabledObserveWidget = SWTObservables.observeEnabled(addButton);
bindingContext.bindValue(addButtonObserveEnabledObserveWidget, cdfReadWriteObserveValue, null, null);
//
IObservableValue removeButtonObserveEnabledObserveWidget = SWTObservables.observeEnabled(removeButton);
bindingContext.bindValue(removeButtonObserveEnabledObserveWidget, cdfReadWriteObserveValue, null, null);
//
IObservableValue planNameTextObserveTextObserveWidget = SWTObservables.observeText(planNameText, SWT.FocusOut);
IObservableValue cdfPlanNameObserveValue = BeansObservables.observeValue(cdf, "planName");
bindingContext.bindValue(planNameTextObserveTextObserveWidget, cdfPlanNameObserveValue, null, null);
//
return bindingContext;
}
}