blob: df3addc5c6554e88d618af4c4b0d1603175775f9 [file] [log] [blame]
/*
* 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);
}
}
}