Java tutorial
/*---------------- FILE HEADER KALYPSO ------------------------------------------ * * This file is part of kalypso. * Copyright (C) 2004 by: * * Technical University Hamburg-Harburg (TUHH) * Institute of River and coastal engineering * Denickestrae 22 * 21073 Hamburg, Germany * http://www.tuhh.de/wb * * and * * Bjoernsen Consulting Engineers (BCE) * Maria Trost 3 * 56070 Koblenz, Germany * http://www.bjoernsen.de * * This library 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 2.1 of the License, or (at your option) any later version. * * This library 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 * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * * Contact: * * E-Mail: * belger@bjoernsen.de * schlienger@bjoernsen.de * v.doemming@tuhh.de * * ---------------------------------------------------------------------------*/ package org.kalypso.ui.rrm.internal.cm.view; import java.beans.PropertyChangeEvent; import java.beans.PropertyChangeListener; import java.util.ArrayList; import java.util.Arrays; import java.util.List; import org.eclipse.core.runtime.CoreException; import org.eclipse.core.runtime.IStatus; import org.eclipse.core.runtime.Status; import org.eclipse.jface.dialogs.IDialogSettings; import org.eclipse.jface.dialogs.MessageDialog; import org.eclipse.jface.dialogs.TitleAreaDialog; import org.eclipse.jface.viewers.ArrayContentProvider; import org.eclipse.jface.viewers.CheckStateChangedEvent; import org.eclipse.jface.viewers.CheckboxTableViewer; import org.eclipse.jface.viewers.ICheckStateListener; import org.eclipse.jface.viewers.ICheckStateProvider; import org.eclipse.jface.viewers.TableViewer; import org.eclipse.jface.viewers.TableViewerColumn; import org.eclipse.jface.viewers.ViewerFilter; import org.eclipse.swt.SWT; import org.eclipse.swt.custom.SashForm; import org.eclipse.swt.layout.GridData; import org.eclipse.swt.layout.GridLayout; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Control; import org.eclipse.swt.widgets.Group; import org.eclipse.swt.widgets.Shell; import org.eclipse.ui.forms.widgets.ScrolledForm; import org.kalypso.afgui.KalypsoAFGUIFrameworkPlugin; import org.kalypso.commons.databinding.IDataBinding; import org.kalypso.commons.databinding.dialog.DatabindingTitleAreaDialog; import org.kalypso.commons.databinding.validation.ValidationStatusUtilities; import org.kalypso.contribs.eclipse.jface.dialog.DialogSettingsUtils; import org.kalypso.contribs.eclipse.jface.viewers.table.ColumnsResizeControlListener; import org.kalypso.contribs.eclipse.swt.widgets.ColumnViewerSorter; import org.kalypso.core.status.StatusComposite; import org.kalypso.core.status.StatusDialog; import org.kalypso.model.hydrology.binding.cm.ICatchmentModel; import org.kalypso.model.hydrology.binding.cm.ILinearSumGenerator; import org.kalypso.model.hydrology.binding.cm.IMultiGenerator; import org.kalypso.model.rcm.binding.IRainfallGenerator; import org.kalypso.ogc.gml.mapmodel.CommandableWorkspace; import org.kalypso.ui.rrm.internal.IUiRrmWorkflowConstants; import org.kalypso.ui.rrm.internal.KalypsoUIRRMPlugin; import org.kalypso.ui.rrm.internal.cm.view.comparator.CommentComparator; import org.kalypso.ui.rrm.internal.cm.view.comparator.DescriptionComparator; import org.kalypso.ui.rrm.internal.cm.view.comparator.ValidFromComparator; import org.kalypso.ui.rrm.internal.cm.view.comparator.ValidToComparator; import org.kalypso.ui.rrm.internal.cm.view.filter.ParameterTypeViewerFilter; import org.kalypso.ui.rrm.internal.cm.view.provider.CommentColumnLabelProvider; import org.kalypso.ui.rrm.internal.cm.view.provider.DescriptionColumnLabelProvider; import org.kalypso.ui.rrm.internal.cm.view.provider.ValidFromColumnLabelProvider; import org.kalypso.ui.rrm.internal.cm.view.provider.ValidToColumnLabelProvider; import org.kalypso.ui.rrm.internal.i18n.Messages; import org.kalypso.ui.rrm.internal.utils.featureTree.ITreeNodeModel; import org.kalypsodeegree.model.feature.Feature; import org.kalypsodeegree.model.feature.IFeatureBindingCollection; import de.renew.workflow.connector.cases.IScenarioDataProvider; /** * This dialog allows the editing of the properties of a multi catchment model. * * @author Holger Albert */ public class EditMultiDialog extends TitleAreaDialog { private final PropertyChangeListener m_propertyListener = new PropertyChangeListener() { @Override public void propertyChange(final PropertyChangeEvent evt) { if (evt.getPropertyName().equals(IMultiGenerator.PROPERTY_PARAMETER_TYPE.toString())) handleParameterTypeChanged(evt); else handlePropertyChanged(); } }; /** * The model. */ private final ITreeNodeModel m_model; /** * The bean to edit. */ protected final MultiBean m_bean; /** * The main group. */ private Group m_mainGroup; /** * The details group. */ private Group m_detailsGroup; /** * The generator viewer. */ protected CheckboxTableViewer m_generatorViewer; /** * The status composite. */ protected StatusComposite m_statusComposite; /** * The data binding. */ private IDataBinding m_dataBinding; /** * The dialog settings. */ private final IDialogSettings m_settings; /** * The ignore next change flag. */ private boolean m_ignoreNextChange; /** * The constructor. * * @param parentShell * The parent shell, or null to create a top-level shell. * @param model * The model. * @param bean * The bean to edit. */ public EditMultiDialog(final Shell shell, final ITreeNodeModel model, final MultiBean bean) { super(shell); m_model = model; m_bean = bean; m_mainGroup = null; m_detailsGroup = null; m_generatorViewer = null; m_statusComposite = null; m_dataBinding = null; m_settings = DialogSettingsUtils.getDialogSettings(KalypsoUIRRMPlugin.getDefault(), getClass().getName()); m_ignoreNextChange = false; m_bean.addPropertyChangeListener(m_propertyListener); } /** * @see org.eclipse.jface.dialogs.TitleAreaDialog#createDialogArea(org.eclipse.swt.widgets.Composite) */ @Override protected Control createDialogArea(final Composite parent) { /* Set the title. */ getShell().setText(Messages.getString("EditMultiDialog_0")); //$NON-NLS-1$ setTitle(Messages.getString("EditMultiDialog_1")); //$NON-NLS-1$ /* Create the control. */ final Composite control = (Composite) super.createDialogArea(parent); /* Create the main composite. */ final Composite main = new Composite(control, SWT.NONE); main.setLayout(new GridLayout(2, false)); final GridData mainData = new GridData(SWT.FILL, SWT.FILL, true, true); mainData.heightHint = 550; mainData.widthHint = 900; main.setLayoutData(mainData); /* Create the main sash form. */ final SashForm mainSashForm = new SashForm(main, SWT.NONE); mainSashForm.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true)); /* Create the main group. */ m_mainGroup = new Group(mainSashForm, SWT.NONE); m_mainGroup.setLayout(new GridLayout(1, false)); final GridData mainGroupData = new GridData(SWT.FILL, SWT.FILL, true, true); mainGroupData.widthHint = 250; m_mainGroup.setLayoutData(mainGroupData); m_mainGroup.setText(Messages.getString("EditMultiDialog_2")); //$NON-NLS-1$ /* Create the content of the main group. */ createMainContent(m_mainGroup); /* Create the details group. */ m_detailsGroup = new Group(mainSashForm, SWT.NONE); m_detailsGroup.setLayout(new GridLayout(1, false)); m_detailsGroup.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true)); m_detailsGroup.setText(Messages.getString("EditMultiDialog_3")); //$NON-NLS-1$ /* Create the content of the details group. */ createDetailsContent(m_detailsGroup); /* Set the weights. */ mainSashForm.setWeights(new int[] { 35, 65 }); return control; } /** * @see org.eclipse.jface.dialogs.Dialog#createButtonsForButtonBar(org.eclipse.swt.widgets.Composite) */ @Override protected void createButtonsForButtonBar(final Composite parent) { super.createButtonsForButtonBar(parent); /* Update the status. */ updateStatus(); } /** * @see org.eclipse.jface.dialogs.Dialog#getDialogBoundsSettings() */ @Override protected IDialogSettings getDialogBoundsSettings() { return DialogSettingsUtils.getSection(m_settings, "bounds"); //$NON-NLS-1$ } /** * @see org.eclipse.jface.dialogs.Dialog#isResizable() */ @Override protected boolean isResizable() { return true; } /** * @see org.eclipse.jface.dialogs.Dialog#okPressed() */ @Override protected void okPressed() { /* Check the status of the data binding. */ final IStatus bindingStatus = ValidationStatusUtilities.getFirstNonOkStatus(m_dataBinding); if (!bindingStatus.isOK()) { final IStatus status = new Status(IStatus.ERROR, KalypsoUIRRMPlugin.getID(), String.format(Messages.getString("EditMultiDialog_4"), bindingStatus.getMessage()), //$NON-NLS-1$ bindingStatus.getException()); StatusDialog.open(getShell(), status, getShell().getText()); return; } /* Perform ok. */ final IStatus performStatus = performOk(); if (!performStatus.isOK()) { StatusDialog.open(getShell(), performStatus, getShell().getText()); return; } /* Dispose the dialog. */ dispose(); super.okPressed(); } @Override protected void cancelPressed() { /* Dispose the dialog. */ dispose(); super.cancelPressed(); } /** * This function creates the content of the main group. * * @param parent * The parent composite. */ private void createMainContent(final Composite parent) { /* Create the form. */ final ScrolledForm form = new ScrolledForm(parent, SWT.H_SCROLL | SWT.V_SCROLL); form.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true)); form.setExpandHorizontal(true); form.setExpandVertical(true); /* Get the body. */ final Composite body = form.getBody(); final GridLayout bodyLayout = new GridLayout(1, false); bodyLayout.marginHeight = 0; bodyLayout.marginWidth = 0; body.setLayout(bodyLayout); /* Create the data binding. */ m_dataBinding = new DatabindingTitleAreaDialog(this, null); /* Create the multi new composite. */ final MultiNewComposite multiComposite = new MultiNewComposite(body, m_bean, m_dataBinding); multiComposite.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true)); /* Do a reflow and a layout. */ form.reflow(true); form.layout(true, true); } /** * This function creates the content of the details group. * * @param parent * The parent composite. */ private void createDetailsContent(final Composite parent) { /* Create the generator viewer. */ m_generatorViewer = CheckboxTableViewer.newCheckList(parent, SWT.BORDER | SWT.H_SCROLL | SWT.V_SCROLL | SWT.FULL_SELECTION | SWT.SINGLE); m_generatorViewer.getTable().setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true)); m_generatorViewer.getTable().setLinesVisible(true); m_generatorViewer.getTable().setHeaderVisible(true); m_generatorViewer.getTable().addControlListener(new ColumnsResizeControlListener()); m_generatorViewer.setContentProvider(new ArrayContentProvider()); m_generatorViewer.setFilters(new ViewerFilter[] { new ParameterTypeViewerFilter( (String) m_bean.getProperty(ILinearSumGenerator.PROPERTY_PARAMETER_TYPE)) }); /* Create the columns. */ createGeneratorViewerColumns(m_generatorViewer); /* Set the input. */ final ILinearSumGenerator[] generators = getGenerators(); m_generatorViewer.setInput(generators); /* Add a checkstate provider. */ m_generatorViewer.setCheckStateProvider(new ICheckStateProvider() { @Override public boolean isGrayed(final Object element) { return false; } @Override public boolean isChecked(final Object element) { final ILinearSumGenerator[] subGenerators = m_bean.getSubGenerators(); if (subGenerators == null || subGenerators.length == 0) return false; final List<ILinearSumGenerator> subGeneratorsList = Arrays.asList(subGenerators); if (subGeneratorsList.contains(element)) return true; return false; } }); /* Add a listener. */ m_generatorViewer.addCheckStateListener(new ICheckStateListener() { @Override public void checkStateChanged(final CheckStateChangedEvent event) { final Object[] checkedElements = m_generatorViewer.getCheckedElements(); final List<ILinearSumGenerator> subGenerators = new ArrayList<>(); for (final Object checkedElement : checkedElements) subGenerators.add((ILinearSumGenerator) checkedElement); m_bean.setSubGenerators(subGenerators.toArray(new ILinearSumGenerator[] {})); m_generatorViewer.refresh(); updateStatus(); } }); /* Create the status composite. */ m_statusComposite = new StatusComposite(parent, StatusComposite.DETAILS); m_statusComposite.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, false)); } private void createGeneratorViewerColumns(final TableViewer viewer) { /* Create the description column. */ final TableViewerColumn descriptionColumn = new TableViewerColumn(viewer, SWT.LEFT); descriptionColumn.getColumn().setText(Messages.getString("EditMultiDialog_5")); //$NON-NLS-1$ descriptionColumn.getColumn().setWidth(150); descriptionColumn.setLabelProvider(new DescriptionColumnLabelProvider()); ColumnsResizeControlListener.setMinimumPackWidth(descriptionColumn.getColumn()); ColumnViewerSorter.registerSorter(descriptionColumn, new DescriptionComparator()); /* Create the comment column. */ final TableViewerColumn commentColumn = new TableViewerColumn(viewer, SWT.LEFT); commentColumn.getColumn().setText(Messages.getString("EditMultiDialog_6")); //$NON-NLS-1$ commentColumn.getColumn().setWidth(150); commentColumn.setLabelProvider(new CommentColumnLabelProvider()); ColumnsResizeControlListener.setMinimumPackWidth(commentColumn.getColumn()); ColumnViewerSorter.registerSorter(commentColumn, new CommentComparator()); /* Create the valid from column. */ final TableViewerColumn validFromColumn = new TableViewerColumn(viewer, SWT.LEFT); validFromColumn.getColumn().setText(Messages.getString("EditMultiDialog_7")); //$NON-NLS-1$ validFromColumn.getColumn().setWidth(75); validFromColumn.setLabelProvider(new ValidFromColumnLabelProvider()); ColumnsResizeControlListener.setMinimumPackWidth(validFromColumn.getColumn()); ColumnViewerSorter.registerSorter(validFromColumn, new ValidFromComparator()); /* Create the valid to column. */ final TableViewerColumn validToColumn = new TableViewerColumn(viewer, SWT.LEFT); validToColumn.getColumn().setText(Messages.getString("EditMultiDialog_8")); //$NON-NLS-1$ validToColumn.getColumn().setWidth(75); validToColumn.setLabelProvider(new ValidToColumnLabelProvider()); ColumnsResizeControlListener.setMinimumPackWidth(validToColumn.getColumn()); ColumnViewerSorter.registerSorter(validToColumn, new ValidToComparator()); /* Define a initial order. */ ColumnViewerSorter.setSortState(descriptionColumn, Boolean.FALSE); } /** * This function returns all linear sum generators that can be linked in a multi generator. * * @return All linear sum generators that can be linked in a multi generator. */ private ILinearSumGenerator[] getGenerators() { final List<ILinearSumGenerator> results = new ArrayList<>(); try { final IScenarioDataProvider dataProvider = KalypsoAFGUIFrameworkPlugin.getDataProvider(); final CommandableWorkspace generatorsWorkspace = dataProvider .getCommandableWorkSpace(IUiRrmWorkflowConstants.SCENARIO_DATA_CATCHMENT_MODELS); final ICatchmentModel rootFeature = (ICatchmentModel) generatorsWorkspace.getRootFeature(); final IFeatureBindingCollection<IRainfallGenerator> generators = rootFeature.getGenerators(); for (final IRainfallGenerator generator : generators) { if (generator instanceof ILinearSumGenerator) results.add((ILinearSumGenerator) generator); } } catch (final CoreException e) { // should never happen e.printStackTrace(); } return results.toArray(new ILinearSumGenerator[] {}); } /** * This function saves the changes. * * @return A ERROR status on error or an OK status. */ private IStatus performOk() { try { final IScenarioDataProvider dataProvider = KalypsoAFGUIFrameworkPlugin.getDataProvider(); final CommandableWorkspace generatorsWorkspace = dataProvider .getCommandableWorkSpace(IUiRrmWorkflowConstants.SCENARIO_DATA_CATCHMENT_MODELS); /* Apply the changes. */ final Feature generator = m_bean.apply(generatorsWorkspace); /* Refresh the tree. */ m_model.refreshTree(generator); return Status.OK_STATUS; } catch (final Exception e) { e.printStackTrace(); return new Status(IStatus.ERROR, KalypsoUIRRMPlugin.getID(), "Failed to save the model", e); //$NON-NLS-1$ } } /** * This function disposes the dialog. */ private void dispose() { m_mainGroup = null; m_detailsGroup = null; m_generatorViewer = null; m_statusComposite = null; m_dataBinding = null; /* HINT: Do not discard the dialog settings, will be used to save the dialog bounds . */ m_ignoreNextChange = false; } /** * This function updates the status. */ protected void updateStatus() { if (m_statusComposite == null || m_statusComposite.isDisposed()) return; m_bean.updateStatus(); m_statusComposite.setStatus(m_bean.getStatus()); } /** * This function handles the property changed event for the parameter type. * * @param evt * The property change event. */ protected void handleParameterTypeChanged(final PropertyChangeEvent evt) { /* Avoid loop, if we cancel the change. */ if (m_ignoreNextChange == true) { m_ignoreNextChange = false; return; } /* Get the shell. */ final Shell shell = getShell(); /* Show the confirm dialog. */ if (!MessageDialog.openConfirm(shell, shell.getText(), Messages.getString("EditMultiDialog_9"))) //$NON-NLS-1$ { m_ignoreNextChange = true; final MultiBean generator = m_bean; final Runnable revertOperation = new Runnable() { @Override public void run() { generator.setProperty(IMultiGenerator.PROPERTY_PARAMETER_TYPE, evt.getOldValue()); } }; shell.getDisplay().asyncExec(revertOperation); return; } /* Reset the set generators. */ m_bean.setSubGenerators(new ILinearSumGenerator[] {}); updateStatus(); /* Set the viewer filter of the generator viewer. */ final String parameterType = (String) evt.getNewValue(); if (m_generatorViewer != null && !m_generatorViewer.getTable().isDisposed()) m_generatorViewer.setFilters(new ViewerFilter[] { new ParameterTypeViewerFilter(parameterType) }); } protected void handlePropertyChanged() { updateStatus(); } }