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.Collection; import java.util.List; import org.eclipse.core.databinding.DataBindingContext; import org.eclipse.core.databinding.observable.list.IObservableList; import org.eclipse.core.databinding.observable.map.IObservableMap; import org.eclipse.core.databinding.observable.set.IObservableSet; import org.eclipse.emf.cdo.eresource.CDOResource; import org.eclipse.emf.common.command.Command; import org.eclipse.emf.common.command.CompoundCommand; import org.eclipse.emf.databinding.EMFDataBindingContext; import org.eclipse.emf.databinding.FeaturePath; 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.jface.action.Action; import org.eclipse.jface.action.IAction; import org.eclipse.jface.databinding.viewers.ObservableListTreeContentProvider; import org.eclipse.jface.dialogs.IDialogConstants; 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.jface.window.Window; import org.eclipse.jface.wizard.WizardDialog; 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.IMemento; import org.eclipse.ui.PlatformUI; import org.eclipse.ui.forms.events.HyperlinkAdapter; 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.google.inject.Inject; import com.netxforge.netxstudio.data.actions.ServerRequest; 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.EquipmentRelationship; import com.netxforge.netxstudio.operators.FunctionRelationship; 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.operators.Warehouse; import com.netxforge.netxstudio.scheduling.Job; import com.netxforge.netxstudio.scheduling.SchedulingPackage; import com.netxforge.netxstudio.screens.AbstractScreen; import com.netxforge.netxstudio.screens.actions.ExportHTMLAction; import com.netxforge.netxstudio.screens.actions.ExportXLSAction; import com.netxforge.netxstudio.screens.dialog.OperatorFilterDialog; import com.netxforge.netxstudio.screens.dialog.WarehouseFilterDialog; import com.netxforge.netxstudio.screens.editing.util.CDOMementoUtil; import com.netxforge.netxstudio.screens.f1.support.ScheduledReportSelectionWizard; import com.netxforge.netxstudio.screens.f2.NodeHistory; import com.netxforge.netxstudio.screens.f2.details.NewEditEquipmentLinkII; import com.netxforge.netxstudio.screens.f2.details.NewEditFunctionLinkII; 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.NewEditNodeFunction; import com.netxforge.netxstudio.screens.f2.details.NewEditNodeType; import com.netxforge.netxstudio.screens.f3.support.NetworkTreeFactoryImpl; import com.netxforge.netxstudio.screens.f3.support.NetworkTreeLabelProvider; import com.netxforge.netxstudio.screens.f3.support.NetworkTreeStructureAdvisorImpl; import com.netxforge.netxstudio.screens.f4.NewEditJob; import com.netxforge.screens.editing.base.IDataServiceInjection; import com.netxforge.screens.editing.base.ScreenUtil; import com.netxforge.screens.editing.base.WizardUtil; import com.netxforge.screens.editing.base.actions.BaseSelectionListenerAction; import com.netxforge.screens.editing.base.actions.SeparatorAction; import com.netxforge.screens.editing.base.filter.TreeSearchFilter; import com.netxforge.screens.editing.base.util.MementoUtil; /** * @author Christophe Bouhier christophe.bouhier@netxforge.com * */ public class Networks extends AbstractScreen implements IDataServiceInjection { private static final String MEM_KEY_NETWORKS_SELECTION_TREE = "MEM_KEY_NETWORKS_SELECTION_TREE"; /* * Remember the state for Details => Function. */ private static final String MEM_KEY_DETAILS_FUNCTION = "MEM_KEY_DETAILS_FUNCTION"; private static final String MEM_KEY_DETAILS_EQUIPMENT = "MEM_KEY_DETAILS_EQUIPMENT"; private static final String MEM_KEY_DETAILS_NODE = "MEM_KEY_DETAILS_NODE"; private static final String MEM_KEY_DETAILS_NODE_TYPE = "MEM_KEY_DETAILS_NODE_TYPE"; private static final String MEM_KEY_DETAILS_NETWORK = "MEM_KEY_DETAILS_NETWORK"; private static final String MEM_KEY_DETAILS_FUNCTION_LINK = "MEM_KEY_DETAILS_FUNCTION_LINK"; private static final String MEM_KEY_DETAILS_EQUIPMENT_LINK = "MEM_KEY_DETAILS_EQUIPMENT_LINK"; private final FormToolkit toolkit = new FormToolkit(Display.getCurrent()); private Text txtFilterText; @SuppressWarnings("unused") private DataBindingContext bindingContext; private Form frmNetworks; private CDOResource operatorsResource; private TreeViewer networkTreeViewer; private Composite cmpDetails; private SashForm sashForm; @Inject ServerRequest serverActions; /** * Create the composite. * * @param parent * @param style */ public Networks(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); } /* * (non-Javadoc) * * @see com.netxforge.netxstudio.data.IDataServiceInjection#injectData() */ public void injectData() { operatorsResource = (CDOResource) editingService.getData(OperatorsPackage.Literals.OPERATOR); 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; frmNetworks = toolkit.createForm(this); frmNetworks.setSeparatorVisible(true); toolkit.paintBordersFor(frmNetworks); frmNetworks.setText(getOperationText() + "Network"); frmNetworks.getBody().setLayout(new FillLayout(SWT.HORIZONTAL)); frmNetworks.addMessageHyperlinkListener(new HyperlinkAdapter()); sashForm = new SashForm(frmNetworks.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.FILL, SWT.CENTER, true, 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) { ViewerFilter[] filters = networkTreeViewer.getFilters(); for (ViewerFilter viewerFilter : filters) { if (viewerFilter instanceof TreeSearchFilter) { ((TreeSearchFilter) viewerFilter).setSearchText(txtFilterText.getText()); } } networkTreeViewer.refresh(); networkTreeViewer.expandAll(); } }); if (!readonly) { mghprlnkNewImagehyperlink = toolkit.createImageHyperlink(composite, SWT.NONE); mghprlnkNewImagehyperlink.addHyperlinkListener(new IHyperlinkListener() { public void linkActivated(HyperlinkEvent e) { OperatorFilterDialog dialog = new OperatorFilterDialog(Networks.this.getShell(), operatorsResource); int result = dialog.open(); if (result == Window.OK) { Operator operator = (Operator) dialog.getFirstResult(); 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"); } networkTreeViewer = new TreeViewer(composite, SWT.BORDER | SWT.VIRTUAL | SWT.MULTI | widgetStyle); // networkTreeViewer.setUseHashlookup(true); // networkTreeViewer.setComparer(new CDOElementComparer()); networkTreeViewer.addFilter(new TreeSearchFilter()); // CB http://work.netxforge.com/issues/290 networkTreeViewer.setComparator(new NetworkViewerComparator()); networkTreeViewer.addSelectionChangedListener(new ISelectionChangedListener() { public void selectionChanged(SelectionChangedEvent event) { ISelection s = event.getSelection(); if (s instanceof IStructuredSelection) { IStructuredSelection ss = (IStructuredSelection) s; final Object o = ss.getFirstElement(); Networks.this.getDisplay().asyncExec(new Runnable() { public void run() { try { handleDetailsSelection(o); } catch (Exception e) { e.printStackTrace(); } } }); } } }); Tree tree = networkTreeViewer.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[] { 3, 7 }); } private final List<IAction> actions = Lists.newArrayList(); @Override public IAction[] getActions() { // Lazy init actions. if (actions.isEmpty()) { boolean readonly = ScreenUtil.isReadOnlyOperation(getOperation()); actions.add(new HistoryAction("History...", SWT.PUSH)); actions.add(new SeparatorAction()); if (!readonly) { actions.add(new MoveToWarehouseAction("Decommission", SWT.PUSH)); actions.add(new SeparatorAction()); } // actions.add(new ScheduleReportingJobAction( // "Schedule Reporting Job...", SWT.PUSH)); actions.add(new ScheduleReportingJobAction("Schedule Reporting Job...")); actions.add(new ReportNodeAction("Report Now")); actions.add(new SeparatorAction()); actions.add(new ExportHTMLAction("Export to HTML")); actions.add(new ExportXLSAction("Export to XLS")); actions.add(new SeparatorAction()); // actions.add(new ExpressionsAction(this.getScreenService(), // "Expressions for")); } return actions.toArray(new IAction[actions.size()]); } class HistoryAction extends BaseSelectionListenerAction { public HistoryAction(String text, int style) { super(text); } @Override protected boolean updateSelection(IStructuredSelection selection) { // boolean superResult = super.updateSelection(selection); Object firstElement = selection.getFirstElement(); return firstElement instanceof Node; } @Override public void run() { IStructuredSelection structuredSelection = this.getStructuredSelection(); Object object = structuredSelection.getFirstElement(); if (object instanceof Node) { NodeHistory nodeHistoryScreen = new NodeHistory(screenService.getScreenContainer(), SWT.NONE); nodeHistoryScreen.setScreenService(screenService); nodeHistoryScreen.setOperation(ScreenUtil.OPERATION_READ_ONLY); nodeHistoryScreen.injectData(null, object); screenService.setActiveScreen(nodeHistoryScreen); } } } class ScheduleReportingJobAction extends Action { public ScheduleReportingJobAction(String text) { super(text); } @Override public void run() { if (screenService != null) { ISelection selection = getViewer().getSelection(); if (selection instanceof IStructuredSelection) { Resource jobResource = editingService.getData(SchedulingPackage.Literals.JOB); ScheduledReportSelectionWizard wizard = new ScheduledReportSelectionWizard(); wizard.init(PlatformUI.getWorkbench(), (IStructuredSelection) selection); wizard.setEditingService(editingService); WizardDialog dialog = new WizardDialog(Networks.this.getShell(), wizard); dialog.open(); Job j = wizard.getJob(); NewEditJob newEditJob = new NewEditJob(screenService.getScreenContainer(), SWT.NONE); newEditJob.setOperation(wizard.getOperation()); newEditJob.setScreenService(screenService); newEditJob.injectData(jobResource, j); screenService.setActiveScreen(newEditJob); } } } } class ReportNodeAction extends Action { public ReportNodeAction(String text) { super(text); } @Override public void run() { ISelection selection = getViewer().getSelection(); if (selection instanceof IStructuredSelection) { WizardUtil.openWizard("com.netxforge.netxstudio.screens.reporting", (IStructuredSelection) selection); } } } /** * Action to move objects to the ware house. * * @author Christophe Bouhier * */ class MoveToWarehouseAction extends BaseSelectionListenerAction { public MoveToWarehouseAction(String text, int style) { super(text); } @Override protected boolean updateSelection(IStructuredSelection selection) { @SuppressWarnings("rawtypes") List list = selection.toList(); boolean result = true; for (Object o : list) { if (!(o instanceof Node) && !(o instanceof Equipment)) { result = false; } } return result; } @Override public void run() { IStructuredSelection s = this.getStructuredSelection(); @SuppressWarnings("unchecked") List<Object> selectionList = s.toList(); Collection<Node> nodesToDecommission = Lists.newArrayList(); Collection<Equipment> equipmentsToDecommission = Lists.newArrayList(); for (Object o : selectionList) { if (o instanceof Node) { nodesToDecommission.add((Node) o); } if (o instanceof Equipment) { equipmentsToDecommission.add((Equipment) o); } } if (nodesToDecommission.size() > 0 || equipmentsToDecommission.size() > 0) { Resource warehouseResource = editingService.getData(OperatorsPackage.Literals.WAREHOUSE); WarehouseFilterDialog dialog = new WarehouseFilterDialog(Networks.this.getShell(), warehouseResource); if (dialog.open() == IDialogConstants.OK_ID) { Warehouse warehouse = (Warehouse) dialog.getFirstResult(); // Loop through the node and find cross references. CompoundCommand cc = new CompoundCommand(); if (nodesToDecommission.size() > 0) { Command c = new AddCommand(editingService.getEditingDomain(), warehouse.getNodes(), nodesToDecommission); cc.append(c); } if (equipmentsToDecommission.size() > 0) { Command c = new AddCommand(editingService.getEditingDomain(), warehouse.getEquipments(), equipmentsToDecommission); cc.append(c); } editingService.getEditingDomain().getCommandStack().execute(cc); } } } } public EMFDataBindingContext initDataBindings_() { EMFDataBindingContext bindingContext = new EMFDataBindingContext(); ObservableListTreeContentProvider cp = new ObservableListTreeContentProvider( new NetworkTreeFactoryImpl(editingService.getEditingDomain()), new NetworkTreeStructureAdvisorImpl()); networkTreeViewer.setContentProvider(cp); IObservableSet set = cp.getKnownElements(); List<IObservableMap> observableMap = Lists.newArrayList(); observableMap.add( EMFEditProperties.value(editingService.getEditingDomain(), GenericsPackage.Literals.COMPANY__NAME) .observeDetail(set)); // CB propably not needed, as the factory will take care. // observableMap.add(EMFEditProperties.value( // editingService.getEditingDomain(), // OperatorsPackage.Literals.OPERATOR__NETWORKS) // .observeDetail(set)); observableMap.add( EMFEditProperties.value(editingService.getEditingDomain(), OperatorsPackage.Literals.NETWORK__NAME) .observeDetail(set)); // observableMap.add(EMFEditProperties.value( // editingService.getEditingDomain(), // OperatorsPackage.Literals.NETWORK__NODES).observeDetail(set)); observableMap.add( EMFEditProperties.value(editingService.getEditingDomain(), OperatorsPackage.Literals.NODE__NODE_ID) .observeDetail(set)); observableMap.add(EMFEditProperties .value(editingService.getEditingDomain(), OperatorsPackage.Literals.NODE__NODE_TYPE) .observeDetail(set)); observableMap.add(EMFEditProperties .value(editingService.getEditingDomain(), OperatorsPackage.Literals.RELATIONSHIP__NAME) .observeDetail(set)); // Relationship text changes. observableMap.add(EMFEditProperties .value(editingService.getEditingDomain(), OperatorsPackage.Literals.RELATIONSHIP__NODE_ID1_REF) .observeDetail(set)); observableMap.add(EMFEditProperties .value(editingService.getEditingDomain(), OperatorsPackage.Literals.RELATIONSHIP__NODE_ID2_REF) .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( EMFEditProperties.value(editingService.getEditingDomain(), LibraryPackage.Literals.COMPONENT__NAME) .observeDetail(set)); // Notifiy LifeCycle Features. observableMap.add(EMFEditProperties .value(editingService.getEditingDomain(), FeaturePath.fromList( LibraryPackage.Literals.COMPONENT__LIFECYCLE, GenericsPackage.Literals.LIFECYCLE__PROPOSED)) .observeDetail(set)); observableMap.add(EMFEditProperties.value(editingService.getEditingDomain(), FeaturePath.fromList( LibraryPackage.Literals.COMPONENT__LIFECYCLE, GenericsPackage.Literals.LIFECYCLE__PLANNED_DATE)) .observeDetail(set)); observableMap.add(EMFEditProperties.value(editingService.getEditingDomain(), FeaturePath.fromList(LibraryPackage.Literals.COMPONENT__LIFECYCLE, GenericsPackage.Literals.LIFECYCLE__CONSTRUCTION_DATE)) .observeDetail(set)); observableMap.add(EMFEditProperties.value(editingService.getEditingDomain(), FeaturePath.fromList( LibraryPackage.Literals.COMPONENT__LIFECYCLE, GenericsPackage.Literals.LIFECYCLE__IN_SERVICE_DATE)) .observeDetail(set)); observableMap .add(EMFEditProperties .value(editingService.getEditingDomain(), FeaturePath.fromList(LibraryPackage.Literals.COMPONENT__LIFECYCLE, GenericsPackage.Literals.LIFECYCLE__OUT_OF_SERVICE_DATE)) .observeDetail(set)); observableMap.add(EMFEditProperties .value(editingService.getEditingDomain(), LibraryPackage.Literals.COMPONENT__METRIC_REFS) .observeDetail(set)); observableMap.add(EMFEditProperties .value(editingService.getEditingDomain(), LibraryPackage.Literals.COMPONENT__RESOURCE_REFS) .observeDetail(set)); IObservableMap[] map = new IObservableMap[observableMap.size()]; observableMap.toArray(map); networkTreeViewer.setLabelProvider(new NetworkTreeLabelProvider(map)); IEMFListProperty networksResourceProperty = EMFEditProperties.resource(editingService.getEditingDomain()); IObservableList networksObservableList = networksResourceProperty.observe(operatorsResource); networkTreeViewer.setInput(networksObservableList); return bindingContext; } /** The composite holding the current details */ Composite currentDetails; private ImageHyperlink mghprlnkNewImagehyperlink; /* * Show details for a selection. */ private void handleDetailsSelection(Object o) { // Clear the form messages. this.getScreenForm().getMessageManager().removeAllMessages(); // Remember the state only if the corresponding selection is not null. // This would be a deleted object. if (currentDetails != null && !currentDetails.isDisposed()) { this.saveDetailsState(currentDetails); currentDetails.dispose(); } if (o instanceof Network) { NewEditNetwork nef = null; nef = new NewEditNetwork(this.cmpDetails, SWT.NONE, editingService); nef.setOperation(getOperation()); nef.setScreenService(screenService); nef.setParentScreen(this); nef.injectData(null, o); this.currentDetails = nef; this.restoreDetailsState(currentDetails); sashForm.layout(true, true); } else if (o instanceof Node) { NewEditNode node = null; node = new NewEditNode(this.getScreenForm(), this.cmpDetails, SWT.NONE, editingService); node.setOperation(getOperation()); node.setScreenService(screenService); node.setParentScreen(this); node.injectData(null, o); this.currentDetails = node; this.restoreDetailsState(currentDetails); sashForm.layout(true, true); } else if (o instanceof Function) { NewEditNodeFunction screen = new NewEditNodeFunction(this.cmpDetails, SWT.NONE, editingService); screen.setScreenService(screenService); screen.setOperation(getOperation()); screen.setParentScreen(this); screen.injectData(null, o); this.currentDetails = screen; this.restoreDetailsState(currentDetails); sashForm.layout(true, true); } else if (o instanceof Equipment) { NewEditNodeEquipment screen = null; screen = new NewEditNodeEquipment(this.cmpDetails, SWT.NONE, editingService); screen.setOperation(getOperation()); screen.setScreenService(screenService); screen.setParentScreen(this); screen.injectData(null, o); this.currentDetails = screen; this.restoreDetailsState(currentDetails); sashForm.layout(true, true); } else if (o instanceof NodeType) { NewEditNodeType nnt = new NewEditNodeType(this.cmpDetails, SWT.NONE, editingService); nnt.setOperation(getOperation()); nnt.setScreenService(screenService); nnt.setParentScreen(this); nnt.injectData(null, o); this.currentDetails = nnt; this.restoreDetailsState(currentDetails); sashForm.layout(true, true); } else if (o instanceof FunctionRelationship) { NewEditFunctionLinkII linkScreen = new NewEditFunctionLinkII(this.cmpDetails, SWT.NONE, editingService); linkScreen.setOperation(getOperation()); linkScreen.setScreenService(screenService); linkScreen.setParentScreen(this); linkScreen.injectData(null, o); this.currentDetails = linkScreen; this.restoreDetailsState(currentDetails); sashForm.layout(true, true); return; } else if (o instanceof EquipmentRelationship) { NewEditEquipmentLinkII linkScreen = new NewEditEquipmentLinkII(this.cmpDetails, SWT.NONE, editingService); linkScreen.setOperation(getOperation()); linkScreen.setScreenService(screenService); linkScreen.setParentScreen(this); linkScreen.injectData(null, o); this.currentDetails = linkScreen; this.restoreDetailsState(currentDetails); sashForm.layout(true, true); return; } } /* * (non-Javadoc) * * @see org.eclipse.emf.common.ui.viewer.IViewerProvider#getViewer() */ public Viewer getViewer() { return this.networkTreeViewer; } /* * (non-Javadoc) * * @see com.netxforge.netxstudio.screens.editing.selector.IScreen#isValid() */ public boolean isValid() { return true; } public Form getScreenForm() { return this.frmNetworks; } @Override public String getScreenName() { return "Networks"; } /* * (non-Javadoc) * * @see * com.netxforge.netxstudio.screens.AbstractScreenImpl#saveState(org.eclipse * .ui.IMemento) */ @Override public void saveState(IMemento memento) { CDOMementoUtil.rememberStructuredViewerSelection(memento, networkTreeViewer, MEM_KEY_NETWORKS_SELECTION_TREE); // We might not have a currentDetails state. this.saveDetailsState(currentDetails); } public void saveDetailsState(Composite currentDetails) { if (currentDetails == null || currentDetails.isDisposed()) { return; } IMemento memento = this.getScreenService().getAbsViewPart().getMemento(); String key = keyForComposite(currentDetails); if (key != null) { MementoUtil.rememberSectionsInComposite(memento, currentDetails, key); } } public void restoreDetailsState(Composite currentDetails) { IMemento memento = this.getScreenService().getAbsViewPart().getMemento(); String key = keyForComposite(currentDetails); if (key != null) { MementoUtil.retrieveSectionsInComposite(memento, currentDetails, key); } } /** * Find the IMemento Key for a Composite, to remember UI Details state. * * @param currentDetails * @return */ private String keyForComposite(Composite currentDetails) { String key = null; if (currentDetails instanceof NewEditNetwork) { key = MEM_KEY_DETAILS_NETWORK; } else if (currentDetails instanceof NewEditNode) { key = MEM_KEY_DETAILS_NODE; } else if (currentDetails instanceof NewEditNodeType) { key = MEM_KEY_DETAILS_NODE_TYPE; } else if (currentDetails instanceof NewEditNodeFunction) { key = MEM_KEY_DETAILS_FUNCTION; } else if (currentDetails instanceof NewEditNodeEquipment) { key = MEM_KEY_DETAILS_EQUIPMENT; } else if (currentDetails instanceof NewEditEquipmentLinkII) { key = MEM_KEY_DETAILS_EQUIPMENT_LINK; } else if (currentDetails instanceof NewEditFunctionLinkII) { key = MEM_KEY_DETAILS_FUNCTION_LINK; } return key; } /* * (non-Javadoc) * * @see * com.netxforge.netxstudio.screens.AbstractScreenImpl#init(org.eclipse. * ui.IMemento) */ @Override public void restoreState(IMemento memento) { if (memento != null) { CDOMementoUtil.retrieveStructuredViewerSelection(memento, networkTreeViewer, MEM_KEY_NETWORKS_SELECTION_TREE, this.operatorsResource.cdoView()); } } }