Java tutorial
/******************************************************************************* * Copyright (c) May 9, 2011 NetXForge. * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see <http://www.gnu.org/licenses/> * * Contributors: * Christophe Bouhier - initial API and implementation and/or initial documentation *******************************************************************************/ package com.netxforge.netxstudio.screens.f3; import java.util.List; import org.eclipse.core.databinding.DataBindingContext; import org.eclipse.core.databinding.observable.IObservable; import org.eclipse.core.databinding.observable.list.IObservableList; import org.eclipse.core.databinding.observable.map.IObservableMap; import org.eclipse.core.databinding.observable.masterdetail.IObservableFactory; import org.eclipse.core.databinding.observable.set.IObservableSet; import org.eclipse.emf.common.command.Command; import org.eclipse.emf.databinding.EMFDataBindingContext; import org.eclipse.emf.databinding.EMFProperties; import org.eclipse.emf.databinding.IEMFListProperty; import org.eclipse.emf.databinding.edit.EMFEditProperties; import org.eclipse.emf.ecore.resource.Resource; import org.eclipse.emf.edit.command.AddCommand; import org.eclipse.emf.edit.domain.EditingDomain; import org.eclipse.jface.databinding.viewers.ObservableListTreeContentProvider; import org.eclipse.jface.databinding.viewers.TreeStructureAdvisor; import org.eclipse.jface.viewers.ISelection; import org.eclipse.jface.viewers.ISelectionChangedListener; import org.eclipse.jface.viewers.IStructuredSelection; import org.eclipse.jface.viewers.SelectionChangedEvent; import org.eclipse.jface.viewers.TreeViewer; import org.eclipse.jface.viewers.Viewer; import org.eclipse.jface.viewers.ViewerFilter; import org.eclipse.swt.SWT; import org.eclipse.swt.custom.SashForm; import org.eclipse.swt.events.DisposeEvent; import org.eclipse.swt.events.DisposeListener; import org.eclipse.swt.events.KeyAdapter; import org.eclipse.swt.events.KeyEvent; import org.eclipse.swt.layout.FillLayout; import org.eclipse.swt.layout.GridData; import org.eclipse.swt.layout.GridLayout; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Display; import org.eclipse.swt.widgets.Label; import org.eclipse.swt.widgets.Text; import org.eclipse.swt.widgets.Tree; import org.eclipse.ui.forms.events.HyperlinkEvent; import org.eclipse.ui.forms.events.IHyperlinkListener; import org.eclipse.ui.forms.widgets.Form; import org.eclipse.ui.forms.widgets.FormToolkit; import org.eclipse.ui.forms.widgets.ImageHyperlink; import org.eclipse.wb.swt.ResourceManager; import com.google.common.collect.Lists; import com.netxforge.netxstudio.generics.GenericsPackage; import com.netxforge.netxstudio.library.Equipment; import com.netxforge.netxstudio.library.Function; import com.netxforge.netxstudio.library.LibraryPackage; import com.netxforge.netxstudio.library.NodeType; import com.netxforge.netxstudio.operators.Network; import com.netxforge.netxstudio.operators.Node; import com.netxforge.netxstudio.operators.Operator; import com.netxforge.netxstudio.operators.OperatorsFactory; import com.netxforge.netxstudio.operators.OperatorsPackage; import com.netxforge.netxstudio.screens.AbstractScreen; import com.netxforge.netxstudio.screens.editing.tables.CDOElementComparer; import com.netxforge.netxstudio.screens.f2.details.NewEditFunction; import com.netxforge.netxstudio.screens.f2.details.NewEditNetwork; import com.netxforge.netxstudio.screens.f2.details.NewEditNode; import com.netxforge.netxstudio.screens.f2.details.NewEditNodeEquipment; import com.netxforge.netxstudio.screens.f2.details.NewEditNodeType; import com.netxforge.netxstudio.screens.f3.support.NetworkTreeLabelProvider; import com.netxforge.screens.editing.base.IDataServiceInjection; import com.netxforge.screens.editing.base.ScreenUtil; import com.netxforge.screens.editing.base.filter.ISearchFilter; /** * @author Christophe Bouhier christophe.bouhier@netxforge.com * */ public class Warehouses extends AbstractScreen implements IDataServiceInjection { private final FormToolkit toolkit = new FormToolkit(Display.getCurrent()); private Text txtFilterText; @SuppressWarnings("unused") private DataBindingContext bindingContext; private Form frmNodeTypes; private Resource operatorsResource; private TreeViewer warehouseTreeViewer; private Composite cmpDetails; private SashForm sashForm; private Operator operator; /** * Create the composite. * * @param parent * @param style */ public Warehouses(Composite parent, int style) { super(parent, style); addDisposeListener(new DisposeListener() { public void widgetDisposed(DisposeEvent e) { // obm.dispose(); toolkit.dispose(); } }); toolkit.adapt(this); toolkit.paintBordersFor(this); // buildUI(); } /* * (non-Javadoc) * * @see com.netxforge.netxstudio.data.IDataServiceInjection#injectData() */ public void injectData() { operatorsResource = editingService.getData(OperatorsPackage.Literals.OPERATOR); // FIXME, we can only support one operator now, this should actually // be a subscreen of operator. if (operatorsResource.getContents().size() > 0) { operator = (Operator) operatorsResource.getContents().get(0); } buildUI(); initDataBindings_(); } private void buildUI() { setLayout(new FillLayout(SWT.HORIZONTAL)); // Readonlyness. boolean readonly = ScreenUtil.isReadOnlyOperation(this.getOperation()); int widgetStyle = readonly ? SWT.READ_ONLY : SWT.NONE; frmNodeTypes = toolkit.createForm(this); frmNodeTypes.setSeparatorVisible(true); toolkit.paintBordersFor(frmNodeTypes); frmNodeTypes.setText(getOperationText() + "Warehouse"); frmNodeTypes.getBody().setLayout(new FillLayout(SWT.HORIZONTAL)); sashForm = new SashForm(frmNodeTypes.getBody(), SWT.VERTICAL); sashForm.setOrientation(SWT.HORIZONTAL); toolkit.adapt(sashForm); toolkit.paintBordersFor(sashForm); Composite composite = toolkit.createComposite(sashForm, SWT.NONE); toolkit.paintBordersFor(composite); composite.setLayout(new GridLayout(3, false)); Label lblFilterLabel = toolkit.createLabel(composite, "Filter:", SWT.NONE); lblFilterLabel.setSize(64, 81); txtFilterText = toolkit.createText(composite, "New Text", SWT.H_SCROLL | SWT.SEARCH | SWT.CANCEL); GridData gd_txtFilterText = new GridData(SWT.LEFT, SWT.CENTER, false, false, 1, 1); gd_txtFilterText.widthHint = 200; txtFilterText.setLayoutData(gd_txtFilterText); txtFilterText.setSize(64, 81); txtFilterText.setText(""); txtFilterText.addKeyListener(new KeyAdapter() { public void keyReleased(KeyEvent ke) { warehouseTreeViewer.refresh(); ViewerFilter[] filters = warehouseTreeViewer.getFilters(); for (ViewerFilter viewerFilter : filters) { if (viewerFilter instanceof ISearchFilter) { ((ISearchFilter) viewerFilter).setSearchText(txtFilterText.getText()); } } } }); mghprlnkNewImagehyperlink = toolkit.createImageHyperlink(composite, SWT.NONE); mghprlnkNewImagehyperlink.addHyperlinkListener(new IHyperlinkListener() { public void linkActivated(HyperlinkEvent e) { // Create a new top level network, for this operator. Network newNetwork = OperatorsFactory.eINSTANCE.createNetwork(); newNetwork.setName("<new network>"); Command add = AddCommand.create(editingService.getEditingDomain(), operator, null, newNetwork); editingService.getEditingDomain().getCommandStack().execute(add); } public void linkEntered(HyperlinkEvent e) { } public void linkExited(HyperlinkEvent e) { } }); mghprlnkNewImagehyperlink.setImage(ResourceManager.getPluginImage("com.netxforge.netxstudio.models.edit", "icons/full/ctool16/Network_E.png")); mghprlnkNewImagehyperlink.setLayoutData(new GridData(SWT.RIGHT, SWT.CENTER, false, false, 1, 1)); toolkit.paintBordersFor(mghprlnkNewImagehyperlink); mghprlnkNewImagehyperlink.setText("New"); warehouseTreeViewer = new TreeViewer(composite, SWT.BORDER | widgetStyle); warehouseTreeViewer.setUseHashlookup(true); warehouseTreeViewer.setComparer(new CDOElementComparer()); warehouseTreeViewer.addSelectionChangedListener(new ISelectionChangedListener() { public void selectionChanged(SelectionChangedEvent event) { ISelection s = event.getSelection(); if (s instanceof IStructuredSelection) { IStructuredSelection ss = (IStructuredSelection) s; Object o = ss.getFirstElement(); handleDetailsSelection(o); } } }); Tree tree = warehouseTreeViewer.getTree(); GridData gd_tree = new GridData(SWT.FILL, SWT.FILL, true, true, 3, 2); gd_tree.widthHint = 396; tree.setLayoutData(gd_tree); tree.setSize(74, 81); toolkit.paintBordersFor(tree); cmpDetails = toolkit.createComposite(sashForm, SWT.NONE); toolkit.paintBordersFor(cmpDetails); cmpDetails.setLayout(new FillLayout()); sashForm.setWeights(new int[] { 1, 1 }); } public EMFDataBindingContext initDataBindings_() { EMFDataBindingContext bindingContext = new EMFDataBindingContext(); ObservableListTreeContentProvider cp = new ObservableListTreeContentProvider( new NetworkTreeFactoryImpl(editingService.getEditingDomain()), new NodeTypeTreeStructureAdvisorImpl()); warehouseTreeViewer.setContentProvider(cp); IObservableSet set = cp.getKnownElements(); List<IObservableMap> observableMap = Lists.newArrayList(); observableMap.add( EMFEditProperties.value(editingService.getEditingDomain(), GenericsPackage.Literals.COMPANY__NAME) .observeDetail(set)); observableMap.add( EMFEditProperties.value(editingService.getEditingDomain(), OperatorsPackage.Literals.NETWORK__NAME) .observeDetail(set)); observableMap.add( EMFEditProperties.value(editingService.getEditingDomain(), OperatorsPackage.Literals.NODE__NODE_ID) .observeDetail(set)); observableMap.add(EMFEditProperties .value(editingService.getEditingDomain(), OperatorsPackage.Literals.RELATIONSHIP__NAME) .observeDetail(set)); observableMap.add( EMFEditProperties.value(editingService.getEditingDomain(), LibraryPackage.Literals.NODE_TYPE__NAME) .observeDetail(set)); observableMap.add(EMFProperties.value(LibraryPackage.Literals.COMPONENT__NAME).observeDetail(set)); IObservableMap[] map = new IObservableMap[observableMap.size()]; observableMap.toArray(map); warehouseTreeViewer.setLabelProvider(new NetworkTreeLabelProvider(map)); IEMFListProperty networksResourceProperty = EMFEditProperties.list(editingService.getEditingDomain(), OperatorsPackage.Literals.OPERATOR__WAREHOUSES); IObservableList networksObservableList = networksResourceProperty.observe(operator); warehouseTreeViewer.setInput(networksObservableList); return bindingContext; } class NetworkTreeFactoryImpl implements IObservableFactory { EditingDomain domain; private IEMFListProperty operatorObservableProperty = EMFEditProperties.list(domain, OperatorsPackage.Literals.OPERATOR__NETWORKS); private IEMFListProperty networkObservableProperty = EMFEditProperties.multiList(domain, OperatorsPackage.Literals.NETWORK__NODES, OperatorsPackage.Literals.NETWORK__NETWORKS, OperatorsPackage.Literals.NETWORK__EQUIPMENT_RELATIONSHIPS, OperatorsPackage.Literals.NETWORK__FUNCTION_RELATIONSHIPS); private IEMFListProperty nodeObservableProperty = EMFEditProperties.list(domain, OperatorsPackage.Literals.NODE__NODE_TYPE); private IEMFListProperty nodeTypeObservableProperty = EMFEditProperties.multiList(domain, LibraryPackage.Literals.NODE_TYPE__FUNCTIONS, LibraryPackage.Literals.NODE_TYPE__EQUIPMENTS); private IEMFListProperty functionsObservableProperty = EMFEditProperties.multiList(domain, LibraryPackage.Literals.FUNCTION__FUNCTIONS); private IEMFListProperty equipmentsObservableProperty = EMFEditProperties.multiList(domain, LibraryPackage.Literals.EQUIPMENT__EQUIPMENTS); NetworkTreeFactoryImpl(EditingDomain domain) { this.domain = domain; } public IObservable createObservable(final Object target) { IObservable ol = null; if (target instanceof IObservableList) { ol = (IObservable) target; } else if (target instanceof Operator) { ol = operatorObservableProperty.observe(target); } else if (target instanceof Network) { ol = networkObservableProperty.observe(target); } else if (target instanceof Node) { ol = nodeObservableProperty.observe(target); } else if (target instanceof NodeType) { ol = nodeTypeObservableProperty.observe(target); } else if (target instanceof Function) { ol = functionsObservableProperty.observe(target); } else if (target instanceof Equipment) { ol = equipmentsObservableProperty.observe(target); } return ol; } } class NodeTypeTreeStructureAdvisorImpl extends TreeStructureAdvisor { @Override public Object getParent(Object element) { return null; } @Override public Boolean hasChildren(Object element) { if (element instanceof Operator) { return ((Operator) element).getNetworks().size() > 0 ? Boolean.TRUE : Boolean.FALSE; } if (element instanceof Network) { Network net = (Network) element; if (net.getNetworks().size() > 0 || net.getNodes().size() > 0 || net.getEquipmentRelationships().size() > 0 || net.getFunctionRelationships().size() > 0) { return Boolean.TRUE; } } if (element instanceof Node) { Node n = (Node) element; if (n.getNodeType() != null) { return Boolean.TRUE; } } if (element instanceof NodeType && (((NodeType) element).getFunctions().size() > 0 || ((NodeType) element).getEquipments().size() > 0)) { return Boolean.TRUE; } if (element instanceof Function && ((Function) element).getFunctions().size() > 0) { return Boolean.TRUE; } if (element instanceof Equipment && ((Equipment) element).getEquipments().size() > 0) { return Boolean.TRUE; } return super.hasChildren(element); } } Composite currentDetails; private ImageHyperlink mghprlnkNewImagehyperlink; private void handleDetailsSelection(Object o) { if (currentDetails != null) { currentDetails.dispose(); } if (o instanceof Network) { NewEditNetwork nef = null; nef = new NewEditNetwork(this.cmpDetails, SWT.NONE, editingService); nef.setScreenService(screenService); nef.injectData(null, o); this.currentDetails = nef; sashForm.layout(true, true); } if (o instanceof Node) { NewEditNode node = null; node = new NewEditNode(this.getScreenForm(), this.cmpDetails, SWT.NONE, editingService); node.setScreenService(screenService); node.injectData(null, o); this.currentDetails = node; sashForm.layout(true, true); } if (o instanceof Function) { NewEditFunction screen = null; screen = new NewEditFunction(this.cmpDetails, SWT.NONE, editingService); screen.setScreenService(screenService); screen.injectData(null, o); this.currentDetails = screen; sashForm.layout(true, true); } if (o instanceof Equipment) { NewEditNodeEquipment screen = null; screen = new NewEditNodeEquipment(this.cmpDetails, SWT.NONE, editingService); screen.setScreenService(screenService); screen.injectData(null, o); this.currentDetails = screen; sashForm.layout(true, true); } if (o instanceof NodeType) { NewEditNodeType nnt = new NewEditNodeType(this.cmpDetails, SWT.NONE, editingService); nnt.injectData(null, o); this.currentDetails = nnt; sashForm.layout(true, true); } } /* * (non-Javadoc) * * @see org.eclipse.emf.common.ui.viewer.IViewerProvider#getViewer() */ public Viewer getViewer() { return this.warehouseTreeViewer; } /* * (non-Javadoc) * * @see com.netxforge.netxstudio.screens.editing.selector.IScreen#isValid() */ public boolean isValid() { return true; } public Form getScreenForm() { return this.frmNodeTypes; } @Override public String getScreenName() { return "Warehouses"; } }