Coverage Report - org.openpermis.editor.policy.view.ActionEditor
 
Classes in this File Line Coverage Branch Coverage Complexity
ActionEditor
0%
0/73
0%
0/14
1.536
ActionEditor$ParametersModel
0%
0/29
0%
0/8
1.536
ActionEditor$ParametersModel$1
0%
0/9
N/A
1.536
ActionEditor$TypesEditor
0%
0/3
N/A
1.536
 
 1  
 /*
 2  
  * Copyright (c) 2009, Swiss Federal Department of Defence Civil Protection and Sport
 3  
  *                     (http://www.vbs.admin.ch)
 4  
  * Copyright (c) 2009, Ergon Informatik AG (http://www.ergon.ch)
 5  
  * All rights reserved.
 6  
  *
 7  
  * Licensed under the Open Permis License which accompanies this distribution,
 8  
  * and is available at http://www.openpermis.org/BSDlicenceKent.txt
 9  
  */
 10  
 package org.openpermis.editor.policy.view;
 11  
 
 12  
 import java.util.List;
 13  
 
 14  
 import javax.swing.DefaultCellEditor;
 15  
 import javax.swing.JComboBox;
 16  
 import javax.swing.JComponent;
 17  
 import javax.swing.JPanel;
 18  
 import javax.swing.JScrollPane;
 19  
 import javax.swing.JTable;
 20  
 import javax.swing.JTextField;
 21  
 import javax.swing.event.AncestorEvent;
 22  
 import javax.swing.event.AncestorListener;
 23  
 import javax.swing.table.AbstractTableModel;
 24  
 import javax.swing.table.TableColumn;
 25  
 
 26  
 import org.jdesktop.application.Action;
 27  
 import org.jdesktop.application.ApplicationContext;
 28  
 import org.jdesktop.beansbinding.BeanProperty;
 29  
 import org.jdesktop.beansbinding.Binding;
 30  
 import org.jdesktop.beansbinding.BindingGroup;
 31  
 import org.jdesktop.beansbinding.Bindings;
 32  
 import org.jdesktop.beansbinding.AutoBinding.UpdateStrategy;
 33  
 import org.jdesktop.observablecollections.ObservableList;
 34  
 import org.jdesktop.observablecollections.ObservableListListener;
 35  
 import org.slf4j.Logger;
 36  
 import org.slf4j.LoggerFactory;
 37  
 
 38  
 import com.jgoodies.forms.layout.CellConstraints;
 39  
 import com.jgoodies.forms.layout.FormLayout;
 40  
 
 41  
 import org.openpermis.editor.policy.adapter.AdapterTrader;
 42  
 import org.openpermis.editor.policy.gui.binding.ActionNameConverter;
 43  
 import org.openpermis.editor.policy.gui.binding.ErrorBindingListener;
 44  
 import org.openpermis.editor.policy.presenter.ActionPresenter;
 45  
 import org.openpermis.policy.ParameterList.Parameter;
 46  
 
 47  
 /**
 48  
  * Editor for a {@link ActionPresenter}.
 49  
  * @since 0.1.0
 50  
  */
 51  0
 public class ActionEditor
 52  
         extends AbstractEditor<ActionPresenter>
 53  
         implements AncestorListener
 54  
 {
 55  
 
 56  
         //---- Static
 57  
 
 58  
         /**
 59  
          * The logger object of this class.
 60  
          * @since 0.1.0
 61  
          */
 62  0
         private static final Logger LOGGER =
 63  
                 LoggerFactory.getLogger(ActionEditor.class);
 64  
 
 65  
         /**
 66  
          * An array of allowed action types.
 67  
          * @since 0.3.0
 68  
          */
 69  0
         private static final Class<?>[] SUPPORTED_TYPES = {
 70  
                 Integer.class, Double.class, Boolean.class, String.class, Object.class
 71  
         };
 72  
 
 73  
         /**
 74  
          * The editor for the parameter type.
 75  
          * @since 0.1.0
 76  
          */
 77  
         @SuppressWarnings("serial")
 78  
         class TypesEditor extends DefaultCellEditor {
 79  0
                 public TypesEditor (String[] items) {
 80  0
                         super(new JComboBox(items));
 81  0
                 }
 82  
         }
 83  
 
 84  
         /**
 85  
          * A model for the table representing the action's parameters.
 86  
          * @since 0.1.0
 87  
          */
 88  
         @SuppressWarnings("serial")
 89  0
         class ParametersModel extends AbstractTableModel {
 90  
 
 91  
                 /**
 92  
                  * Column headers.
 93  
                  */
 94  0
                 private final String[] columnHeader = {"tableHeaderName", "tableHeaderType"};
 95  
 
 96  
                 /**
 97  
                  * Updates the model when the {@link Parameter} {@link ObservableList} is changed.
 98  
                  * @since 0.1.0
 99  
                  */
 100  0
                 private final ObservableListListener listener = new ObservableListListener() {
 101  
 
 102  
                         @SuppressWarnings("unchecked")
 103  
                         public void listElementPropertyChanged (ObservableList list, int index) {
 104  0
                                 fireTableDataChanged();
 105  0
                         }
 106  
 
 107  
                         @SuppressWarnings("unchecked")
 108  
                         public void listElementReplaced (ObservableList list, int index, Object oldElement) {
 109  0
                                 fireTableDataChanged();
 110  0
                         }
 111  
 
 112  
                         @SuppressWarnings("unchecked")
 113  
                         public void listElementsAdded (ObservableList list, int index, int length) {
 114  0
                                 fireTableDataChanged();
 115  0
                         }
 116  
 
 117  
                         @SuppressWarnings("unchecked")
 118  0
                         public void listElementsRemoved (ObservableList list, int index, List oldElements) {
 119  0
                                 fireTableDataChanged();
 120  0
                         }
 121  
 
 122  
                 };
 123  
 
 124  
                 /**
 125  
                  * @since 0.1.0
 126  
                  */
 127  
                 private void configureListeners () {
 128  0
                         getPresenter().getPresenterParameters().addObservableListListener(this.listener);
 129  0
                 }
 130  
 
 131  
                 /**
 132  
                  * @since 0.1.0
 133  
                  */
 134  
                 private void unconfigureListeners () {
 135  0
                         getPresenter().getPresenterParameters().removeObservableListListener(this.listener);
 136  0
                 }
 137  
 
 138  
                 /**
 139  
                  * @since 0.1.0
 140  
                  */
 141  
                 public int getColumnCount () {
 142  0
                         return 2;
 143  
                 }
 144  
 
 145  
                 /**
 146  
                  * @since 0.1.0
 147  
                  */
 148  
                 public int getRowCount () {
 149  0
                         return getPresenter().getPresenterParameters().size();
 150  
                 }
 151  
 
 152  
                 /**
 153  
                  * @since 0.1.0
 154  
                  */
 155  
                 public Object getValueAt (int rowIndex, int columnIndex) {
 156  0
                         if (columnIndex == 0) {
 157  0
                                 return getPresenter().getPresenterParameters().get(rowIndex).getName();
 158  0
                         } else if (columnIndex == 1) {
 159  0
                                 return getPresenter().getPresenterParameters().
 160  
                                         get(rowIndex).getType().getSimpleName();
 161  
                         } else {
 162  0
                                 return null;
 163  
                         }
 164  
                 }
 165  
 
 166  
                 /**
 167  
                  * @since 0.1.0
 168  
                  */
 169  
                 @Override
 170  
                 public boolean isCellEditable (int rowIndex, int columnIndex) {
 171  0
                         return true;
 172  
                 }
 173  
 
 174  
                 /**
 175  
                  * @since 0.1.0
 176  
                  */
 177  
                 @Override
 178  
                 public void setValueAt (Object value, int rowIndex, int columnIndex) {
 179  0
                         ObservableList<Parameter> presenterParameters = getPresenter().getPresenterParameters();
 180  0
                         if (columnIndex == 0) {
 181  0
                                 LOGGER.debug("setValueAt: setName in presenter");
 182  0
                                 Parameter oldParameter = presenterParameters.get(rowIndex);
 183  0
                                 Parameter newParameter = new Parameter((String) value, oldParameter.getType());
 184  0
                                 presenterParameters.set(rowIndex, newParameter);
 185  0
                         } else if (columnIndex == 1) {
 186  0
                                 LOGGER.debug("setValueAt: setType in presenter");
 187  0
                                 Parameter oldParameter = presenterParameters.get(rowIndex);
 188  0
                                 Parameter newParameter = new Parameter(oldParameter.getName(),
 189  
                                         classFromString((String) value));
 190  0
                                 presenterParameters.set(rowIndex, newParameter);
 191  
                         }
 192  0
                 }
 193  
 
 194  
                 /**
 195  
                  * @since 0.1.0
 196  
                  */
 197  
                 @Override
 198  
                 public String getColumnName (int columnIndex) {
 199  0
                         return getResourceMap().getString(this.columnHeader[columnIndex]);
 200  
                 }
 201  
 
 202  
                 /**
 203  
                  * @since 0.1.0
 204  
                  */
 205  
                 @Override
 206  
                 public Class<?> getColumnClass (int columnIndex) {
 207  0
                         return String.class;
 208  
                 }
 209  
 
 210  
         }
 211  
 
 212  
         //---- State
 213  
 
 214  
         /**
 215  
          * The name field.
 216  
          * @since 0.1.0
 217  
          */
 218  
         private JTextField nameField;
 219  
 
 220  
         /**
 221  
          * The parameter list.
 222  
          * @since 0.1.0
 223  
          */
 224  
         private JTable parameterList;
 225  
 
 226  
         /**
 227  
          * The parameter list model.
 228  
          * @since 0.1.0
 229  
          */
 230  
         private ParametersModel parameterModel;
 231  
 
 232  
         //---- Constructor
 233  
 
 234  
         /**
 235  
          * Creates a new editor view.
 236  
          * @param context the application context used to lookup the action and resource map.
 237  
          * @param presenter the presenter of this view.
 238  
          * @since 0.1.0
 239  
          */
 240  
         public ActionEditor (
 241  
                 ApplicationContext context, AdapterTrader trader, ActionPresenter presenter
 242  
         ) {
 243  0
                 super(context, trader, presenter);
 244  0
         }
 245  
 
 246  
         //---- Methods
 247  
 
 248  
         /**
 249  
          * @since 0.1.0
 250  
          */
 251  
         private JComponent parameterList () {
 252  0
                 final FormLayout layout = new FormLayout(
 253  
                         "pref, fill:pref:grow",
 254  
                         "pref, pref, fill:pref:grow"
 255  
                 );
 256  0
                 final JPanel panel = new JPanel();
 257  0
                 panel.setLayout(layout);
 258  
 
 259  0
                 CellConstraints cc = new CellConstraints();
 260  0
                 panel.add(label("parameters"), cc.xy(1, 1));
 261  0
                 panel.add(toolBar("parametersToolBar"), cc.xy(2, 1));
 262  
 
 263  0
                 JScrollPane scrollPane = new JScrollPane(this.parameterList);
 264  0
                 panel.add(scrollPane, cc.xyw(1, 2, 2));
 265  0
                 return panel;
 266  
         }
 267  
 
 268  
         //---- Actions
 269  
 
 270  
         /**
 271  
          * @since 0.1.0
 272  
          */
 273  
         @Action
 274  
         public void moveUpParameter () {
 275  0
                 LOGGER.debug("moveUpParameter");
 276  0
                 final int anchor = this.parameterList.getSelectionModel().getAnchorSelectionIndex();
 277  0
                 if (anchor > 0 && anchor < getPresenter().getPresenterParameters().size()) {
 278  0
                         Parameter a = getPresenter().getPresenterParameters().get(anchor - 1);
 279  0
                         getPresenter().getPresenterParameters().set(
 280  
                                 anchor - 1,
 281  
                                 getPresenter().getPresenterParameters().get(anchor)
 282  
                         );
 283  0
                         getPresenter().getPresenterParameters().set(anchor, a);
 284  0
                         this.parameterList.getSelectionModel().setSelectionInterval(anchor - 1, anchor - 1);
 285  
                 }
 286  0
         }
 287  
 
 288  
         /**
 289  
          * @since 0.1.0
 290  
          */
 291  
         @Action
 292  
         public void moveDownParameter () {
 293  0
                 LOGGER.debug("moveDownParameter");
 294  0
                 final int anchor = this.parameterList.getSelectionModel().getAnchorSelectionIndex();
 295  0
                 if (anchor >= 0 && anchor < getPresenter().getPresenterParameters().size() - 1) {
 296  0
                         Parameter a = getPresenter().getPresenterParameters().get(anchor + 1);
 297  0
                         getPresenter().getPresenterParameters().set(
 298  
                                 anchor + 1,
 299  
                                 getPresenter().getPresenterParameters().get(anchor)
 300  
                         );
 301  0
                         getPresenter().getPresenterParameters().set(anchor, a);
 302  0
                         this.parameterList.getSelectionModel().setSelectionInterval(anchor + 1, anchor + 1);
 303  
                 }
 304  0
         }
 305  
 
 306  
         /**
 307  
          * @since 0.1.0
 308  
          */
 309  
         @Action
 310  
         public void addParameter () {
 311  0
                 LOGGER.debug("addParameter");
 312  0
                 this.getPresenter().getPresenterParameters().add(new Parameter("", SUPPORTED_TYPES[0]));
 313  0
         }
 314  
 
 315  
         /**
 316  
          * @since 0.1.0
 317  
          */
 318  
         @Action
 319  
         public void removeParameter () {
 320  0
                 LOGGER.debug("removeParameter");
 321  0
                 final int anchor = this.parameterList.getSelectionModel().getAnchorSelectionIndex();
 322  0
                 if (anchor > 0 && anchor < getPresenter().getPresenterParameters().size()) {
 323  0
                         getPresenter().getPresenterParameters().remove(anchor);
 324  
                 }
 325  0
         }
 326  
 
 327  
         //---- AbstractEditor
 328  
 
 329  
 
 330  
         /**
 331  
          * @since 0.1.0
 332  
          */
 333  
         @Override
 334  
         protected void bind (BindingGroup bindings) {
 335  0
                 final Binding<ActionPresenter, String, JTextField, String> nameBinding =
 336  
                         Bindings.createAutoBinding(
 337  
                                 UpdateStrategy.READ_WRITE,
 338  
                                 getPresenter(),
 339  
                                 BeanProperty.<ActionPresenter, String>create("name"),
 340  
                                 this.nameField,
 341  
                                 BeanProperty.<JTextField, String>create("text")
 342  
                         );
 343  0
                 nameBinding.setConverter(new ActionNameConverter(this.getPresenter()));
 344  0
                 nameBinding.addBindingListener(
 345  
                         new ErrorBindingListener(
 346  
                                 this,
 347  
                                 getResourceMap(),
 348  
                                 this.nameField,
 349  
                                 "nameError"
 350  
                         )
 351  
                 );
 352  0
                 bindings.addBinding(nameBinding);
 353  0
         }
 354  
 
 355  
         /**
 356  
          * @since 0.1.0
 357  
          */
 358  
         private Class<?> classFromString (final String classSimpleName) {
 359  
                 try {
 360  0
                         return Class.forName("java.lang." + classSimpleName);
 361  0
                 } catch (ClassNotFoundException e) {
 362  0
                         LOGGER.warn("Cannot find a class named [" + classSimpleName + "].", e);
 363  
                 }
 364  0
                 return null;
 365  
         }
 366  
 
 367  
         /**
 368  
          * @since 0.1.0
 369  
          */
 370  
         private String[] getSimpleClassNames (Class<?>[] classes) {
 371  0
                 final String[] names = new String[classes.length];
 372  0
                 for (int i = 0; i < classes.length; i++) {
 373  0
                         names[i] = classes[i].getSimpleName();
 374  
                 }
 375  0
                 return names;
 376  
         }
 377  
 
 378  
         //---- View
 379  
 
 380  
         /**
 381  
          * @since 0.1.0
 382  
          */
 383  
         private JComponent headerName () {
 384  0
                 final FormLayout layout = new FormLayout(
 385  
                         "fill:pref:grow",
 386  
                         "pref, fill:pref:grow"
 387  
                 );
 388  0
                 final JPanel panel = new JPanel();
 389  0
                 panel.setLayout(layout);
 390  0
                 final CellConstraints cc = new CellConstraints();
 391  0
                 panel.add(label("name"), cc.xy(1, 1));
 392  0
                 panel.add(this.nameField, cc.xy(1, 2));
 393  0
                 return panel;
 394  
         }
 395  
 
 396  
         /**
 397  
          * @since 0.1.0
 398  
          */
 399  
         @Override
 400  
         public void fillContentPane (JPanel panel) {
 401  0
                 final CellConstraints cc = new CellConstraints();
 402  0
                 this.nameField = new JTextField();
 403  0
                 this.parameterModel = new ParametersModel();
 404  0
                 this.parameterList = new JTable(this.parameterModel);
 405  0
                 this.parameterList.setSelectionMode(javax.swing.ListSelectionModel.SINGLE_SELECTION);
 406  0
                 this.parameterModel.configureListeners();
 407  0
                 TableColumn col = this.parameterList.getColumnModel().getColumn(1);
 408  0
                 col.setCellEditor(new TypesEditor(getSimpleClassNames(SUPPORTED_TYPES)));
 409  0
                 panel.add(headerName(), cc.xy(2, 2));
 410  0
                 panel.add(parameterList(), cc.xy(2, 4));
 411  0
         }
 412  
 
 413  
         //---- AnchestorListener
 414  
 
 415  
         /**
 416  
          * @since 0.1.0
 417  
          */
 418  
         public void ancestorAdded (AncestorEvent event) {
 419  
                 // Nop.
 420  0
         }
 421  
 
 422  
         /**
 423  
          * @since 0.1.0
 424  
          */
 425  
         public void ancestorMoved (AncestorEvent event) {
 426  
                 // Nop.
 427  0
         }
 428  
 
 429  
         /**
 430  
          * @since 0.1.0
 431  
          */
 432  
         public void ancestorRemoved (AncestorEvent event) {
 433  0
                 this.parameterModel.unconfigureListeners();
 434  0
         }
 435  
 
 436  
 }