/******************************************************************************* * Copyright (c) 2007 Exadel, Inc. and Red Hat, Inc. * Distributed under license by Red Hat, Inc. All rights reserved. * This program is 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: * Exadel, Inc. and Red Hat, Inc. - initial API and implementation ******************************************************************************/ package org.jboss.tools.common.editor.form; import java.util.HashMap; import java.util.Iterator; import java.util.Properties; import org.jboss.tools.common.editor.SelectionNotifier; import org.jboss.tools.common.editor.XModelObjectTreeViewComponent; import org.eclipse.jface.text.ITextSelection; import org.eclipse.jface.viewers.ISelection; import org.eclipse.jface.viewers.ISelectionChangedListener; import org.eclipse.jface.viewers.SelectionChangedEvent; import org.eclipse.jface.viewers.StructuredSelection; import org.eclipse.jface.viewers.Viewer; import org.eclipse.swt.SWT; import org.eclipse.swt.events.DisposeEvent; import org.eclipse.swt.events.DisposeListener; import org.eclipse.swt.layout.GridData; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Control; import org.eclipse.ui.IEditorPart; import org.eclipse.ui.actions.ActionFactory; import org.jboss.tools.common.meta.action.XAction; import org.jboss.tools.common.meta.action.XActionInvoker; import org.jboss.tools.common.model.XFilteredTreeConstraint; import org.jboss.tools.common.model.XModelObject; import org.jboss.tools.common.model.util.XModelObjectCache; import org.jboss.tools.common.model.ui.forms.ExpandableForm; import org.jboss.tools.common.model.ui.widgets.BorderedControl; import org.jboss.tools.common.model.ui.widgets.IWidgetSettings; public class SampleTreeForm extends ExpandableForm implements ISelectionChangedListener { private XModelObject xmo; private XModelObjectTreeViewComponent tree; private XFilteredTreeConstraint[] filters = new XFilteredTreeConstraint[0]; private SelectionNotifier notifier; public SampleTreeForm(IEditorPart part) { tree = new XModelObjectTreeViewComponent(part); headingText = "Tree Form"; setCollapsable(Boolean.FALSE.booleanValue()); createActionMapping(); } public void setFocus() { if(tree != null && tree.getViewer() != null) { Control c = tree.getViewer().getControl(); if(c != null && !c.isDisposed()) { c.setFocus(); } } } public void dispose() { super.dispose(); if (tree!=null) tree.dispose(); tree = null; if (actionMapping!=null) actionMapping.clear(); actionMapping = null; } public void addFilter(XFilteredTreeConstraint filter) { filters = new XFilteredTreeConstraint[]{filter}; } protected Control createClientArea(Composite parent, IWidgetSettings settings) { BorderedControl borderedControl = new BorderedControl(parent, SWT.NONE, settings.getBorder("Table.Border")); //$NON-NLS-1$ borderedControl.setLayoutData(new GridData(GridData.FILL_BOTH)); Control treeControl = tree.createControl(borderedControl, SWT.H_SCROLL | SWT.V_SCROLL); treeControl.addDisposeListener(new DisposeListener() { public void widgetDisposed(DisposeEvent e) { tree.dispose(); } }); GridData gd = new GridData(GridData.FILL_BOTH); treeControl.setLayoutData(gd); if (notifier!=null) tree.getViewer().addSelectionChangedListener(notifier); return borderedControl; } public void initialize(Object model) { this.xmo = (XModelObject)model; this.model = xmo.getModel(); setHeadingText(this.xmo.getAttributeValue("name")); //$NON-NLS-1$ for (int i = 0; i < filters.length; i++) tree.addFilter(filters[i]); tree.setCache(new XModelObjectCache(xmo)); } public void setSelectionNotifier(SelectionNotifier notifier) { ISelectionChangedListener oldListener = this.notifier; if ((tree!=null)&&(tree.getViewer()!=null)) { if (notifier!=null) { if (oldListener!=null) { tree.getViewer().removeSelectionChangedListener(oldListener); } tree.getViewer().addPostSelectionChangedListener(notifier); } else { tree.getViewer().removeSelectionChangedListener(notifier); } } this.notifier = notifier; notifier.addSelectionChangedListener(this); } public void setHeadingText(String heading) { if(heading.equals(getHeadingText())) return; super.setHeadingText(heading); // if(header != null && !header.isDisposed()) { // header.setText(getHeadingText()); // } if(section != null && !section.isDisposed()) { section.setText(getHeadingText()); } } public void update() { super.update(); } // ISelectionChangedListener#selectionChanged(org.eclipse.jface.viewers.SelectionChangedEvent) boolean selectionLock = false; public void selectionChanged(SelectionChangedEvent event) { if (tree == null || tree.getViewer() == null) return; if(selectionLock) return; selectionLock = true; try { Viewer viewer = tree.getViewer(); ISelection oldSelection = viewer.getSelection(); ISelection newSelection = event.getSelection(); if (oldSelection.equals(newSelection) || newSelection instanceof ITextSelection) return; viewer.setSelection(newSelection); if(viewer.getSelection().isEmpty() && !oldSelection.isEmpty()) { viewer.setSelection(oldSelection); } } finally { selectionLock = false; } } private HashMap<String,String> actionMapping = new HashMap<String,String>(); private void createActionMapping() { actionMapping.put(ActionFactory.COPY.getId(), XAction.COPY); actionMapping.put(ActionFactory.CUT.getId(), XAction.CUT); actionMapping.put(ActionFactory.PASTE.getId(), XAction.PASTE); actionMapping.put(ActionFactory.DELETE.getId(), XAction.DELETE); } public boolean doGlobalAction(String actionId) { String actionPath = (String)actionMapping.get(actionId); if(actionPath == null) return false; Control c = tree.getViewer() == null ? null : tree.getViewer().getControl(); if(c == null || !c.isFocusControl()) return false; ISelection selection = tree.getSelectionProvider().getSelection(); if(selection == null || selection.isEmpty() || !(selection instanceof StructuredSelection)) return false; StructuredSelection ss = (StructuredSelection)selection; if(!(ss.getFirstElement() instanceof XModelObject)) return true; XModelObject object = (XModelObject)ss.getFirstElement(); XModelObject[] os = null; if(ss.size() > 1) { os = new XModelObject[ss.size()]; Iterator it = ss.iterator(); for (int i = 0; i < os.length; i++) os[i] = (XModelObject)it.next(); } XAction action = XActionInvoker.getAction(actionPath, object); if(action == null) return true; if(os == null) { if(!action.isEnabled(object)) return true; XActionInvoker.invoke(actionPath, object, new Properties()); } else { if(!action.isEnabled(object, os)) return true; XActionInvoker.invoke(actionPath, object, os, new Properties()); } return true; } }