| /* |
| * Copyright (c) 2007 Borland Software Corporation |
| * |
| * 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: |
| * Sergey Gribovsky (Borland) - initial API and implementation |
| */ |
| package org.eclipse.uml2.diagram.statemachine.part; |
| |
| import java.util.Iterator; |
| import java.util.List; |
| |
| import org.eclipse.emf.common.util.EList; |
| import org.eclipse.emf.edit.ui.provider.AdapterFactoryLabelProvider; |
| import org.eclipse.jface.dialogs.Dialog; |
| import org.eclipse.jface.dialogs.IDialogConstants; |
| import org.eclipse.jface.viewers.ILabelProvider; |
| import org.eclipse.jface.viewers.ILabelProviderListener; |
| import org.eclipse.jface.viewers.ISelectionChangedListener; |
| import org.eclipse.jface.viewers.IStructuredSelection; |
| import org.eclipse.jface.viewers.ITreeContentProvider; |
| 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.graphics.Image; |
| import org.eclipse.swt.layout.GridData; |
| import org.eclipse.swt.widgets.Composite; |
| import org.eclipse.swt.widgets.Control; |
| import org.eclipse.swt.widgets.Shell; |
| import org.eclipse.uml2.uml.Pseudostate; |
| import org.eclipse.uml2.uml.PseudostateKind; |
| import org.eclipse.uml2.uml.StateMachine; |
| |
| |
| public class SelectConnectionPointsDialog extends Dialog { |
| public SelectConnectionPointsDialog(Shell parentShell, StateMachine input, PseudostateKind kind) { |
| super(parentShell); |
| setShellStyle(getShellStyle() | SWT.RESIZE); |
| myInput = input; |
| myKind = kind; |
| } |
| |
| public List<Pseudostate> getSelectedConnectionPoints() { |
| return mySelectionConnectionPoints; |
| } |
| |
| @Override |
| protected Control createDialogArea(Composite parent) { |
| getShell().setText(CustomMessages.SelectConnectionPointsDialog_Title); |
| createSelector(parent); |
| return parent; |
| } |
| |
| @Override |
| protected Control createButtonBar(Composite parent) { |
| Control buttonBar = super.createButtonBar(parent); |
| setOkButtonEnabled(false); |
| return buttonBar; |
| } |
| |
| private void setOkButtonEnabled(boolean enabled) { |
| getButton(IDialogConstants.OK_ID).setEnabled(enabled); |
| } |
| |
| private void createSelector(Composite parent) { |
| TreeViewer viewer = new TreeViewer(parent, SWT.MULTI | SWT.V_SCROLL | SWT.BORDER); |
| GridData layoutData = new GridData(GridData.FILL_BOTH); |
| layoutData.heightHint = 300; |
| layoutData.widthHint = 300; |
| viewer.getTree().setLayoutData(layoutData); |
| ConnectionPointsListContentProvider contentProvider = new ConnectionPointsListContentProvider(myInput); |
| viewer.setContentProvider(contentProvider); |
| viewer.setLabelProvider(new ConnectionPointsListLabelProvider()); |
| viewer.setInput(myInput); |
| viewer.addFilter(new ConnectionPointsFilter()); |
| viewer.addSelectionChangedListener(new OkButtonEnabler()); |
| } |
| |
| private StateMachine myInput; |
| private PseudostateKind myKind; |
| private List<Pseudostate> mySelectionConnectionPoints; |
| |
| private static class ConnectionPointsListContentProvider implements ITreeContentProvider { |
| public ConnectionPointsListContentProvider(StateMachine content) { |
| myContent = content; |
| } |
| |
| public Object[] getChildren(Object parentElement) { |
| if (parentElement instanceof StateMachine) { |
| EList connectionPoints = myContent.getConnectionPoints(); |
| return connectionPoints.toArray(new Pseudostate[connectionPoints.size()]); |
| } |
| return null; |
| } |
| |
| public Object getParent(Object element) { |
| if (element instanceof Pseudostate) { |
| return myContent; |
| } |
| return null; |
| } |
| |
| public boolean hasChildren(Object element) { |
| if (element instanceof StateMachine) { |
| return true; |
| } |
| return false; |
| } |
| |
| public Object[] getElements(Object inputElement) { |
| return getChildren(inputElement); |
| } |
| |
| public void dispose() { |
| } |
| |
| public void inputChanged(Viewer viewer, Object oldInput, Object newInput) { |
| } |
| |
| private StateMachine myContent; |
| } |
| |
| private static class ConnectionPointsListLabelProvider implements ILabelProvider { |
| public String getText(Object element) { |
| if (element instanceof Pseudostate) { |
| Pseudostate pseudoState = (Pseudostate) element; |
| StringBuffer text = new StringBuffer(10); |
| if (pseudoState.getKind() == PseudostateKind.ENTRY_POINT_LITERAL) { |
| text.append(CustomMessages.SelectConnectionPointsDialog_LabelProvider_EntryPointPrefix); |
| } else if (pseudoState.getKind() == PseudostateKind.EXIT_POINT_LITERAL) { |
| text.append(CustomMessages.SelectConnectionPointsDialog_LabelProvider_ExitPointPrefix); |
| } |
| text.append(' '); |
| text.append(pseudoState.getName()); |
| return text.toString(); |
| } |
| |
| return myAdapterFactoryLabelProvider.getText(element); |
| } |
| |
| public Image getImage(Object element) { |
| return myAdapterFactoryLabelProvider.getImage(element); |
| } |
| |
| public void addListener(ILabelProviderListener listener) { |
| myAdapterFactoryLabelProvider.addListener(listener); |
| } |
| |
| public void dispose() { |
| myAdapterFactoryLabelProvider.dispose(); |
| } |
| |
| public boolean isLabelProperty(Object element, String property) { |
| return myAdapterFactoryLabelProvider.isLabelProperty(element, property); |
| } |
| |
| public void removeListener(ILabelProviderListener listener) { |
| myAdapterFactoryLabelProvider.removeListener(listener); |
| } |
| |
| private AdapterFactoryLabelProvider myAdapterFactoryLabelProvider = new AdapterFactoryLabelProvider(UMLDiagramEditorPlugin.getInstance().getItemProvidersAdapterFactory()); |
| } |
| |
| private class ConnectionPointsFilter extends ViewerFilter { |
| @Override |
| public boolean select(Viewer viewer, Object parentElement, Object element) { |
| if (element instanceof Pseudostate) { |
| Pseudostate pseudostate = (Pseudostate) element; |
| if (pseudostate.getKind() != SelectConnectionPointsDialog.this.myKind) { |
| return false; |
| } |
| } |
| return true; |
| } |
| } |
| |
| private class OkButtonEnabler implements ISelectionChangedListener { |
| public void selectionChanged(SelectionChangedEvent event) { |
| if (!(event.getSelection() instanceof IStructuredSelection)) { |
| setOkButtonEnabled(false); |
| return; |
| } |
| IStructuredSelection selection = (IStructuredSelection) event.getSelection(); |
| mySelectionConnectionPoints = selection.toList(); |
| if (selection.isEmpty()) { |
| setOkButtonEnabled(false); |
| return; |
| } |
| for (Iterator iterator = selection.iterator(); iterator.hasNext();) { |
| Object selectedElement = iterator.next(); |
| if (!(selectedElement instanceof Pseudostate)) { |
| setOkButtonEnabled(false); |
| return; |
| } |
| } |
| setOkButtonEnabled(true); |
| } |
| } |
| } |