Java tutorial
/** * Copyright (C) 2012 BonitaSoft S.A. * BonitaSoft, 32 rue Gustave Eiffel - 38000 Grenoble * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 2.0 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 General Public License * along with this program. If not, see <http://www.gnu.org/licenses/>. */ package org.bonitasoft.studio.properties.sections.transitionordering; import org.bonitasoft.studio.common.properties.AbstractBonitaDescriptionSection; import org.bonitasoft.studio.model.process.Connection; import org.bonitasoft.studio.model.process.ProcessPackage; import org.bonitasoft.studio.model.process.SourceElement; import org.bonitasoft.studio.properties.i18n.Messages; import org.eclipse.core.databinding.observable.list.IObservableList; import org.eclipse.emf.common.command.CompoundCommand; import org.eclipse.emf.common.util.EList; import org.eclipse.emf.databinding.EMFDataBindingContext; import org.eclipse.emf.databinding.edit.EMFEditProperties; import org.eclipse.emf.edit.command.MoveCommand; import org.eclipse.jface.databinding.swt.WidgetProperties; import org.eclipse.jface.databinding.viewers.ObservableListContentProvider; import org.eclipse.jface.fieldassist.ControlDecoration; import org.eclipse.jface.fieldassist.FieldDecoration; import org.eclipse.jface.fieldassist.FieldDecorationRegistry; import org.eclipse.jface.layout.GridDataFactory; import org.eclipse.jface.layout.GridLayoutFactory; import org.eclipse.jface.viewers.ISelection; import org.eclipse.jface.viewers.ISelectionChangedListener; import org.eclipse.jface.viewers.IStructuredSelection; import org.eclipse.jface.viewers.LabelProvider; import org.eclipse.jface.viewers.ListViewer; import org.eclipse.jface.viewers.SelectionChangedEvent; import org.eclipse.jface.viewers.StructuredSelection; import org.eclipse.swt.SWT; import org.eclipse.swt.events.SelectionAdapter; import org.eclipse.swt.events.SelectionEvent; import org.eclipse.swt.layout.RowLayout; import org.eclipse.swt.widgets.Button; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Label; import org.eclipse.swt.widgets.List; import org.eclipse.ui.IWorkbenchPart; import org.eclipse.ui.views.properties.tabbed.TabbedPropertySheetPage; /** * @author Aurelien Pupier * */ public class TransitionOrderingPropertySection extends AbstractBonitaDescriptionSection { private EMFDataBindingContext databindingContext; private ListViewer listViewer; private Button upButton; private Button downButton; public TransitionOrderingPropertySection() { } @Override public void createControls(Composite parent, TabbedPropertySheetPage aTabbedPropertySheetPage) { super.createControls(parent, aTabbedPropertySheetPage); Composite mainComposite = getWidgetFactory().createComposite(parent); mainComposite.setLayout(GridLayoutFactory.fillDefaults().margins(10, 10).numColumns(2).create()); mainComposite.setLayoutData(GridDataFactory.fillDefaults().grab(true, true).create()); //createExplanationLabel(mainComposite); createButtons(mainComposite); createList(mainComposite); } protected void createExplanationLabel(Composite mainComposite) { Label explanationLabel = getWidgetFactory().createLabel(mainComposite, Messages.transitionOrderingExplanation_Short, SWT.WRAP); explanationLabel.setLayoutData(GridDataFactory.swtDefaults().grab(false, false).span(2, 1).create()); ControlDecoration cd = new ControlDecoration(explanationLabel, SWT.RIGHT); FieldDecoration fieldDecoration = FieldDecorationRegistry.getDefault() .getFieldDecoration(FieldDecorationRegistry.DEC_INFORMATION); cd.setImage(fieldDecoration.getImage()); cd.setDescriptionText(Messages.transitionOrderingExplanation); } protected void createList(Composite mainComposite) { List list = getWidgetFactory().createList(mainComposite, SWT.BORDER | SWT.V_SCROLL); list.setLayoutData(GridDataFactory.fillDefaults().grab(true, true).hint(SWT.DEFAULT, 90).create()); listViewer = new ListViewer(list); listViewer.setContentProvider(new ObservableListContentProvider()); listViewer.setLabelProvider(new LabelProvider() { @Override public String getText(Object element) { if (element != null && element instanceof Connection) { final String transitionName = ((Connection) element).getName(); return transitionName + " -- " + ((Connection) element).getTarget().getName(); } return super.getText(element); } }); listViewer.addSelectionChangedListener(new ISelectionChangedListener() { public void selectionChanged(SelectionChangedEvent event) { updateButtonsEnablement(); } }); } protected void updateButtonsEnablement() { if (listViewer.getSelection().isEmpty()) { upButton.setEnabled(false); downButton.setEnabled(false); } else { Object selectedConnection = ((IStructuredSelection) listViewer.getSelection()).getFirstElement(); final EList<Connection> outgoingConnections = getSourceElement().getOutgoing(); int indexSelected = outgoingConnections.indexOf(selectedConnection); upButton.setEnabled(indexSelected != 0); downButton.setEnabled(indexSelected < outgoingConnections.size() - 1); } } private void createButtons(Composite mainComposite) { Composite buttonComposite = getWidgetFactory().createComposite(mainComposite); final RowLayout layout = new RowLayout(SWT.VERTICAL); layout.fill = true; buttonComposite.setLayout(layout); createButtonUp(buttonComposite); createButtonDown(buttonComposite); } private void createButtonUp(Composite buttonComposite) { upButton = getWidgetFactory().createButton(buttonComposite, Messages.up, SWT.FLAT); upButton.addSelectionListener(new SelectionAdapter() { @Override public void widgetSelected(SelectionEvent e) { super.widgetSelected(e); java.util.List<?> selectedConnections = ((IStructuredSelection) listViewer.getSelection()).toList(); CompoundCommand command = new CompoundCommand("Up elements in transition ordering"); for (Object selectedConnection : selectedConnections) { int oldIndex = getSourceElement().getOutgoing().indexOf(selectedConnection); if (oldIndex != -1) {//should never happened int newIndex = Math.min(getSourceElement().getOutgoing().size() - 1, oldIndex - 1); command.append(MoveCommand.create(getEditingDomain(), getSourceElement(), ProcessPackage.Literals.SOURCE_ELEMENT__OUTGOING, selectedConnection, newIndex)); } } getEditingDomain().getCommandStack().execute(command); listViewer.setSelection(new StructuredSelection(selectedConnections)); listViewer.refresh(); } }); } private void createButtonDown(Composite buttonComposite) { downButton = getWidgetFactory().createButton(buttonComposite, Messages.down, SWT.FLAT); downButton.addSelectionListener(new SelectionAdapter() { @Override public void widgetSelected(SelectionEvent e) { super.widgetSelected(e); java.util.List<?> selectedConnections = ((IStructuredSelection) listViewer.getSelection()).toList(); CompoundCommand command = new CompoundCommand("Down elements in transition ordering"); for (Object selectedConnection : selectedConnections) { int oldIndex = getSourceElement().getOutgoing().indexOf(selectedConnection); if (oldIndex != -1) {//should never happened final int sizeOfOutgoingList = getSourceElement().getOutgoing().size(); int newIndex = Math.min(sizeOfOutgoingList - 1, oldIndex + 1); command.append(MoveCommand.create(getEditingDomain(), getSourceElement(), ProcessPackage.Literals.SOURCE_ELEMENT__OUTGOING, selectedConnection, newIndex)); } } getEditingDomain().getCommandStack().execute(command); listViewer.setSelection(new StructuredSelection(selectedConnections)); listViewer.refresh(); } }); } @Override public void setInput(IWorkbenchPart part, ISelection selection) { super.setInput(part, selection); resetDatabindingContext(); bindList(); updateButtonsEnablement(); } protected void resetDatabindingContext() { if (databindingContext != null) { databindingContext.dispose(); } databindingContext = new EMFDataBindingContext(); } protected void bindList() { SourceElement sourceElement = getSourceElement(); final IObservableList outgoingListObserved = EMFEditProperties .list(getEditingDomain(), ProcessPackage.Literals.SOURCE_ELEMENT__OUTGOING).observe(sourceElement); databindingContext.bindList(WidgetProperties.items().observe(listViewer.getList()), outgoingListObserved); listViewer.setInput(outgoingListObserved); } @Override public void dispose() { super.dispose(); if (databindingContext != null) { databindingContext.dispose(); } } private SourceElement getSourceElement() { return (SourceElement) getEObject(); } @Override public String getSectionDescription() { return Messages.transitionOrderingExplanation; } }