Example usage for org.eclipse.jface.viewers ViewerCell getItem

List of usage examples for org.eclipse.jface.viewers ViewerCell getItem

Introduction

In this page you can find the example usage for org.eclipse.jface.viewers ViewerCell getItem.

Prototype

public Widget getItem() 

Source Link

Document

Return the item for the receiver.

Usage

From source file:hydrograph.ui.dataviewer.window.DebugDataViewer.java

License:Apache License

private Point getCellId(Point mouseLocation, TableViewer tableViewer) {
    ViewerCell cell = tableViewer.getCell(mouseLocation);
    if (cell == null) {
        return null;
    }//w  w  w  .  j a va2s.  c  o  m
    int columnIndex = cell.getColumnIndex();
    int rowIndex = tableViewer.getTable().indexOf((TableItem) cell.getItem());
    return new Point(rowIndex, columnIndex);
}

From source file:hydrograph.ui.parametergrid.dialog.MultiParameterFileDialog.java

License:Apache License

private void createViewParameterFileBox(Composite composite) {
    HydroGroup grpPropertyFileView = new HydroGroup(composite, SWT.NONE);
    grpPropertyFileView.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true, 1, 1));
    grpPropertyFileView.setHydroGroupText(MultiParameterFileDialogConstants.PARAMETER_FILE_VIEW);
    grpPropertyFileView.setHydroGroupBorderBackground(SWTResourceManager.getColor(SWT.COLOR_DARK_GRAY));
    GridLayout gl_grpPropertyFileView = new GridLayout(1, false);
    gl_grpPropertyFileView.verticalSpacing = 0;
    gl_grpPropertyFileView.marginHeight = 0;
    gl_grpPropertyFileView.horizontalSpacing = 0;
    gl_grpPropertyFileView.marginWidth = 0;
    grpPropertyFileView.setLayout(gl_grpPropertyFileView);
    grpPropertyFileView.getHydroGroupClientArea().setLayout(new GridLayout(1, false));
    Composite composite_4 = new Composite(grpPropertyFileView.getHydroGroupClientArea(), SWT.None);
    composite_4.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true, 1, 1));
    composite_4.setLayout(new GridLayout(1, false));

    Composite composite_8 = new Composite(composite_4, SWT.NONE);
    composite_8.setLayout(new GridLayout(5, false));
    composite_8.setLayoutData(new GridData(SWT.RIGHT, SWT.FILL, false, false, 1, 1));

    Button btnAdd_1 = new Button(composite_8, SWT.NONE);
    btnAdd_1.setToolTipText(Messages.ADD_KEY_SHORTCUT_TOOLTIP);
    btnAdd_1.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, false, false, 1, 1));
    btnAdd_1.addSelectionListener(new SelectionAdapter() {
        @Override//w  w w.j av  a  2  s  . c  om
        public void widgetSelected(SelectionEvent e) {
            addNewRow(parameterTableViewer);
            applyButton.setEnabled(true);
        }
    });
    btnAdd_1.setImage(ImagePathConstant.ADD_BUTTON.getImageFromRegistry());

    Button btnDelete = new Button(composite_8, SWT.NONE);
    btnDelete.setToolTipText(Messages.DELETE_KEY_SHORTCUT_TOOLTIP);
    btnDelete.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, false, false, 1, 1));
    btnDelete.addSelectionListener(new SelectionAdapter() {
        @Override
        public void widgetSelected(SelectionEvent e) {
            deleteRow(parameterTableViewer);
            applyButton.setEnabled(true);
        }
    });
    btnDelete.setImage(ImagePathConstant.DELETE_BUTTON.getImageFromRegistry());

    Button btnUp = new Button(composite_8, SWT.NONE);
    btnUp.setToolTipText(Messages.MOVE_UP_KEY_SHORTCUT_TOOLTIP);
    btnUp.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, false, false, 1, 1));
    btnUp.addSelectionListener(new SelectionAdapter() {
        @Override
        public void widgetSelected(SelectionEvent e) {
            moveRowUp(parameterTableViewer);
            applyButton.setEnabled(true);
        }
    });
    btnUp.setImage(ImagePathConstant.MOVEUP_BUTTON.getImageFromRegistry());

    Button btnDown = new Button(composite_8, SWT.NONE);
    btnDown.setToolTipText(Messages.MOVE_DOWN_KEY_SHORTCUT_TOOLTIP);
    btnDown.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, false, false, 1, 1));
    btnDown.addSelectionListener(new SelectionAdapter() {
        @Override
        public void widgetSelected(SelectionEvent e) {
            moveRowDown(parameterTableViewer);
            applyButton.setEnabled(true);
        }
    });
    btnDown.setImage(ImagePathConstant.MOVEDOWN_BUTTON.getImageFromRegistry());
    new Label(composite_8, SWT.NONE);

    Composite composite_1 = new Composite(composite_4, SWT.NONE);
    composite_1.setLayout(new GridLayout(1, false));
    composite_1.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true, 1, 1));

    parameterTableViewer = new TableViewer(composite_1, SWT.BORDER | SWT.FULL_SELECTION | SWT.MULTI);
    table_2 = parameterTableViewer.getTable();
    table_2.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true, 1, 1));
    table_2.setLinesVisible(true);
    table_2.setHeaderVisible(true);
    parameterTableViewer.setContentProvider(new ArrayContentProvider());
    parameterTableViewer.setData(TABLE_TYPE_KEY, "parameterTableViewer");
    attachShortcutListner(parameterTableViewer, table_2);
    TableViewerFocusCellManager focusCellManager = new TableViewerFocusCellManager(parameterTableViewer,
            new FocusCellOwnerDrawHighlighter(parameterTableViewer));
    ColumnViewerEditorActivationStrategy activationSupport = new ColumnViewerEditorActivationStrategy(
            parameterTableViewer);
    TableViewerEditor.create(parameterTableViewer, focusCellManager, activationSupport,
            ColumnViewerEditor.TABBING_HORIZONTAL | ColumnViewerEditor.TABBING_MOVE_TO_ROW_NEIGHBOR
                    | ColumnViewerEditor.TABBING_VERTICAL | ColumnViewerEditor.KEYBOARD_ACTIVATION);
    final TableViewerColumn tableViewerColumn_3 = new TableViewerColumn(parameterTableViewer, SWT.NONE);
    ColumnViewerToolTipSupport.enableFor(parameterTableViewer, ToolTip.NO_RECREATE);
    TableColumn tblclmnParameterName_1 = tableViewerColumn_3.getColumn();
    tblclmnParameterName_1.setWidth(190);
    tblclmnParameterName_1.setText(MultiParameterFileDialogConstants.PARAMETER_NAME);
    tableViewerColumn_3.setEditingSupport(new ParameterEditingSupport(parameterTableViewer,
            MultiParameterFileDialogConstants.PARAMETER_NAME, this));
    tableViewerColumn_3.setLabelProvider(new ColumnLabelProvider() {

        @Override
        public String getToolTipText(Object element) {
            Parameter p = (Parameter) element;
            if (StringUtils.isEmpty(p.getParameterName())) {
                return ErrorMessages.NAME_VALUE_CANNOT_BE_BLANK;
            } else {
                return null;
            }
        }

        @Override
        public String getText(Object element) {
            Parameter p = (Parameter) element;
            return p.getParameterName();
        }

        @Override
        public Color getBackground(Object element) {
            Parameter p = (Parameter) element;
            if (StringUtils.isEmpty(p.getParameterName())) {
                return CustomColorRegistry.INSTANCE.getColorFromRegistry(0xFF, 0xDD, 0xDD);
            }
            return super.getBackground(element);
        }

    });

    TableViewerColumn tableViewerColumn_5 = new TableViewerColumn(parameterTableViewer, SWT.NONE);
    TableColumn tblclmnParameterValue_1 = tableViewerColumn_5.getColumn();
    tblclmnParameterValue_1.setWidth(170);
    tblclmnParameterValue_1.setText(MultiParameterFileDialogConstants.PARAMETER_VALUE);
    tableViewerColumn_5.setEditingSupport(new ParameterEditingSupport(parameterTableViewer,
            MultiParameterFileDialogConstants.PARAMETER_VALUE, this));
    tableViewerColumn_5.setLabelProvider(new ColumnLabelProvider() {
        @Override
        public String getText(Object element) {
            Parameter p = (Parameter) element;
            return p.getParameterValue();
        }
    });

    TableViewerColumn tableViewerColumn = new TableViewerColumn(parameterTableViewer, SWT.NONE);
    TableColumn tblclmnEdit = tableViewerColumn.getColumn();
    tblclmnEdit.setWidth(84);
    tableViewerColumn.setLabelProvider(new ColumnLabelProvider() {

        @Override
        public void update(ViewerCell cell) {
            final TableItem item = (TableItem) cell.getItem();

            // DO NOT REMOVE THIS CONDITION. The condition is return to
            // prevent multiple updates on single item
            if (item.getData("UPDATED") == null) {
                item.setData("UPDATED", "TRUE");
            } else {
                return;
            }

            final Composite buttonPane = new Composite(parameterTableViewer.getTable(), SWT.NONE);
            buttonPane.setLayout(new FillLayout());

            final Button button = new Button(buttonPane, SWT.NONE);
            button.setText(MultiParameterFileDialogConstants.EDIT_BUTTON_TEXT);

            final TableEditor editor = new TableEditor(parameterTableViewer.getTable());
            editor.grabHorizontal = true;
            editor.grabVertical = true;
            editor.setEditor(buttonPane, item, cell.getColumnIndex());
            editor.layout();
            //Added Key Event on Edit Button
            button.addKeyListener(new KeyListener() {

                @Override
                public void keyReleased(KeyEvent event) {
                    if (event.keyCode == SWT.CTRL || event.keyCode == SWT.COMMAND) {
                        ctrlKeyPressed = false;
                    }
                }

                @Override
                public void keyPressed(KeyEvent event) {
                    if (event.keyCode == SWT.CTRL || event.keyCode == SWT.COMMAND) {
                        ctrlKeyPressed = true;
                    }

                    if (ctrlKeyPressed && event.keyCode == Constants.KEY_D) {
                        deleteRow(parameterTableViewer);
                    }

                    else if (ctrlKeyPressed && event.keyCode == Constants.KEY_N) {
                        addNewRow(parameterTableViewer);
                    }

                    else if (ctrlKeyPressed && event.keyCode == SWT.ARROW_UP) {
                        moveRowUp(parameterTableViewer);
                    }

                    else if (ctrlKeyPressed && event.keyCode == SWT.ARROW_DOWN) {
                        moveRowDown(parameterTableViewer);
                    }
                }
            });
            button.addSelectionListener(new SelectionAdapter() {

                @Override
                public void widgetSelected(SelectionEvent e) {
                    String initialParameterValue = item.getText(PROPERTY_VALUE_COLUMN_INDEX);
                    ParamterValueDialog paramterValueDialog = new ParamterValueDialog(getShell(),
                            XMLUtil.formatXML(initialParameterValue));
                    paramterValueDialog.open();

                    int index = Arrays.asList(parameterTableViewer.getTable().getItems()).indexOf(item);

                    if (StringUtils.isNotEmpty(paramterValueDialog.getParamterValue())) {
                        String newParameterValue = paramterValueDialog.getParamterValue().replaceAll("\r", "")
                                .replaceAll("\n", "").replaceAll("\t", "").replace("  ", "");
                        parameters.get(index).setParameterValue(newParameterValue);
                    } else {
                        parameters.get(index).setParameterValue("");
                    }

                    parameterTableViewer.refresh();
                    applyButton.setEnabled(true);
                }
            });

            item.addDisposeListener(new DisposeListener() {

                @Override
                public void widgetDisposed(DisposeEvent e) {
                    button.dispose();
                    buttonPane.dispose();
                    editor.dispose();
                }
            });
        }
    });

    parameterTableViewer.setInput(parameters);
    getShell().setFocus();
    enableTabbing(filePathTableViewer);
    setTableLayoutToMappingTable(parameterTableViewer);

    parameterTableViewer.getTable().addMouseListener(new MouseAdapter() {
        @Override
        public void mouseDoubleClick(MouseEvent e) {
            addNewRow(parameterTableViewer);
            applyButton.setEnabled(true);
        }

        @Override
        public void mouseDown(MouseEvent e) {
        }
    });
}

From source file:hydrograph.ui.propertywindow.widgets.customwidgets.mapping.tables.inputtable.InputFieldColumnLabelProvider.java

License:Apache License

@Override
public void update(ViewerCell cell) {
    TableItem item = (TableItem) cell.getItem();

    Pattern pattern = Pattern.compile("^[a-zA-Z0-9 _]*$");

    if (!pattern.matcher(((InputField) cell.getElement()).getFieldName()).matches()) {
        item.setBackground(cell.getControl().getDisplay().getSystemColor(SWT.COLOR_INFO_BACKGROUND));
        item.setForeground(cell.getControl().getDisplay().getSystemColor(SWT.COLOR_RED));
        ((InputField) cell.getElement()).getErrorObject()
                .setErrorMessage("Input field should match regular expression- \"^[a-zA-Z0-9_]*$\" ");
        ((InputField) cell.getElement()).getErrorObject().setHasError(true);
    } else {/*www  . j a  va2 s.  c  o  m*/

        if (((InputField) cell.getElement()).getFieldName().trim().equalsIgnoreCase("")) {
            item.setBackground(cell.getControl().getDisplay().getSystemColor(SWT.COLOR_RED));
            ((InputField) cell.getElement()).getErrorObject()
                    .setErrorMessage("Input field should not be empty");
            ((InputField) cell.getElement()).getErrorObject().setHasError(true);
        } else {
            ((InputField) cell.getElement()).getErrorObject().setHasError(false);
        }

    }
    super.update(cell);
}

From source file:net.karlmartens.ui.viewer.TableViewerEditor.java

License:Apache License

@Override
protected void updateFocusCell(ViewerCell focusCell, ColumnViewerEditorActivationEvent event) {
    if (event.eventType == ColumnViewerEditorActivationEvent.PROGRAMMATIC
            || event.eventType == ColumnViewerEditorActivationEvent.TRAVERSAL) {
        final Table table = _viewer.getControl();
        final int row = table.indexOf((TableItem) focusCell.getItem());
        final int col = focusCell.getColumnIndex();
        _selectionManager.setFocusCell(new Point(col, row));
    }/*from   ww  w  .ja  v  a  2s .c  o m*/
}

From source file:net.karlmartens.ui.viewer.TimeSeriesTableValueEditingSupport.java

License:Apache License

private void update(ViewerCell cell, double value) {
    _viewer.getEditingSupport().setValue(cell.getElement(), computePeriodIndex(cell), value);
    final TableItem item = (TableItem) cell.getItem();
    item.setText(cell.getColumnIndex(), _viewer.getNumberFormat().format(value));
    _viewer.getControl().redraw();/* ww w .  ja  va2s.c o  m*/
}

From source file:net.sf.smbt.ui.ableton.views.AbletonLiveView.java

License:LGPL

private TreeViewerColumn createTableViewerColumn(String title, int bound) {
    final TreeViewerColumn viewerColumn = new TreeViewerColumn(subDetailsViewer, SWT.NONE);
    final TreeColumn column = viewerColumn.getColumn();
    column.setText(title);//from   www  . j a  v a  2s.co m
    column.setWidth(bound);
    column.setResizable(true);
    column.setMoveable(true);
    viewerColumn.setLabelProvider(new StyledCellLabelProvider() {
        @Override
        protected void paint(Event event, Object element) {
            if (element instanceof LiveScene) {
                TreeItem treeItem = (TreeItem) event.item;
                Object obj = treeItem.getData(viewerColumn.getColumn().getText() + "#clip");
                if (obj != null) {
                    LiveClip c = (LiveClip) obj;
                    super.paint(event, element);
                    if (((LiveScene) element).getSceneID() == lastSceneID) {
                        int width = 0;
                        int height = event.height - 4;
                        int x = event.x;
                        int y = event.y + 2;
                        float l = c.getLength();
                        float p = c.getPosition();

                        if (p > 0 && l > 0) {
                            float ratio = p / l;
                            width = Float.valueOf(ratio * (float) viewerColumn.getColumn().getWidth())
                                    .intValue();
                            event.gc.setAlpha(100);
                            event.gc.setBackground(Display.getDefault().getSystemColor(SWT.COLOR_WHITE));
                            event.gc.setForeground(Display.getDefault().getSystemColor(SWT.COLOR_WHITE));
                            event.gc.fillRoundRectangle(x, y, width, height, 2, 2);
                            event.gc.setAlpha(255);
                            event.gc.drawRoundRectangle(x, y, width, height, 2, 2);
                        }
                    }
                } else {
                    super.paint(event, element);
                }
            } else {
                super.paint(event, element);
            }
        }

        @Override
        public void update(ViewerCell cell) {
            super.update(cell);
            if (cell.getElement() instanceof LiveScene) {
                LiveScene scene = (LiveScene) cell.getElement();
                int idx = cell.getColumnIndex();
                if (liveController.getLiveApp().getTracks().size() > idx) {
                    LiveTrack track = liveController.getLiveApp().getTracks().get(idx);
                    for (LiveClip c : track.getClips()) {
                        if (scene.getSceneID() == c.getClipID()) {
                            cell.setText(c.getClipName());
                            //cell.getStyleRanges();
                            /*
                            switch(c.getClipState()) {
                               case PLAYING:
                               case TRIGGERED:
                                  cell.setImage(playImage);
                                  //break;
                               case STOP:
                                  cell.setImage(stopImage);
                                  break;
                               default:
                                  cell.setImage(stopImage);
                                  break;
                            };*/

                            cell.setImage(lastSceneID == scene.getSceneID() ? playImage : stopImage);

                            if (c.getColor() != null) {
                                cell.setForeground(Display.getDefault().getSystemColor(SWT.COLOR_BLACK));
                                cell.setBackground(c.getColor());
                            }

                            cell.getItem().setData(track.getTrackName() + "#clip", c);
                            break;
                        } else {
                            cell.setForeground(GUIToolkit.FG);
                            cell.setBackground(GUIToolkit.BG);
                        }
                    }
                }
            }
        }
    });
    return viewerColumn;
}

From source file:net.sf.smbt.ui.audio.view.FmodexLiveView.java

License:LGPL

private TreeViewerColumn createTableViewerColumn(String title, int bound) {
    final TreeViewerColumn viewerColumn = new TreeViewerColumn(subDetailsViewer, SWT.NONE);
    final TreeColumn column = viewerColumn.getColumn();

    column.setText(title);/*from w  w  w  .j a  v  a 2 s. c o m*/
    column.setWidth(bound);
    column.setResizable(true);
    column.setMoveable(true);

    viewerColumn.setLabelProvider(new StyledCellLabelProvider() {
        @Override
        protected void paint(Event event, Object element) {
            TreeItem treeItem = (TreeItem) event.item;

            Object obj = treeItem.getData(viewerColumn.getColumn().getText() + "#clip");
            Object track = treeItem.getData(viewerColumn.getColumn().getText() + "#track");
            if (obj != null && track != null) {
                AudioClip c = (AudioClip) obj;
                int x = event.getBounds().x;
                int y = event.getBounds().y;

                String txt = "";
                AudioChannel channel = (AudioChannel) ((AudioTrack) track).getChannel();
                if (c.getSound() != null && channel != null) {
                    TimeTag tag = AudioUtils.INSTANCE.getTimePosition(c.getSound(), channel);
                    long ms = tag.getTime();
                    long lenms = tag.getDuration();

                    txt = String.format(" (%02d:%02d:%02d/%02d:%02d:%02d)", ms / 1000 / 60, ms / 1000 % 60,
                            ms / 10 % 100, lenms / 1000 / 60, lenms / 1000 % 60, lenms / 10 % 100
                    //tag.getStatus().equals(CLIP_STATUS.PAUSE) ? "Paused " : tag.getStatus().equals(CLIP_STATUS.PLAY) ? "Playing" : "Stopped"
                    );

                    event.gc.drawText(c.getLabel() + " " + txt, x, y);

                    int width = 0;
                    int height = event.height - 4;
                    int x0 = event.x;
                    int y0 = event.y + 2;
                    float l = tag.getDuration();
                    float p = tag.getTime();

                    Color oldBG = event.gc.getBackground();
                    Color oldFG = event.gc.getForeground();
                    event.gc.setForeground(Display.getDefault().getSystemColor(SWT.COLOR_WHITE));

                    if (p > 0 && l > 0) {
                        float ratio = p / l;
                        width = Float.valueOf(ratio * (float) viewerColumn.getColumn().getWidth()).intValue();
                        event.gc.setAlpha(100);
                        event.gc.setBackground(Display.getDefault().getSystemColor(SWT.COLOR_WHITE));
                        event.gc.setForeground(Display.getDefault().getSystemColor(SWT.COLOR_WHITE));
                        event.gc.fillRoundRectangle(x0, y0, width, height, 2, 2);
                        event.gc.setAlpha(255);
                        event.gc.drawRoundRectangle(x0, y0, width, height, 2, 2);
                    }
                    event.gc.setForeground(oldFG);
                    event.gc.setBackground(oldBG);
                }
            } else {
                super.paint(event, element);
            }
        }

        @Override
        public void update(ViewerCell cell) {
            super.update(cell);
            if (cell.getElement() instanceof AudioScene) {
                AudioScene scene = (AudioScene) cell.getElement();
                int idx = cell.getColumnIndex();
                if (project.getTracks().size() > idx) {
                    AudioClip clip = scene.getClips().get(idx);
                    AudioTrack track = project.getTracks().get(idx);
                    track.setLabel(viewerColumn.getColumn().getText());
                    AudioFile file = clip.getFile();
                    if (file != null) {
                    }
                    cell.getItem().setData(track.getLabel() + "#clip", clip);
                    cell.getItem().setData(track.getLabel() + "#track", track);
                    cell.setText(clip.getLabel());
                }
            } else {
                cell.setText("clip !!!");
            }
        }
    });
    return viewerColumn;
}

From source file:net.zehrer.no2.ui.provider.NoColumnLabelProvider.java

License:Open Source License

@Override
public void update(ViewerCell cell) {
    cell.setText(table.indexOf((TableItem) cell.getItem()) + 1 + "");
    cell.setBackground(this.color);
}

From source file:org.bonitasoft.studio.contract.ui.property.AddRowOnEnterCellNavigationStrategy.java

License:Open Source License

protected void updateSelection(final ViewerCell viewerCell) {
    if (viewerCell != null) {
        viewer.setSelection(new StructuredSelection(viewerCell.getItem().getData()));
    }/*from w w  w  .  j a  v  a2  s  .  c  o  m*/
}

From source file:org.csstudio.display.pvtable.ui.PVTable.java

License:Open Source License

/**
 * Create GUI components/*www.  jav  a2  s  .co  m*/
 *
 * @param parent
 */
private void createComponents(final Composite parent) {
    // TableColumnLayout requires table to be only child of parent.
    // To assert that'll always be the case, create box.
    final Composite table_box = new Composite(parent, 0);
    parent.setLayout(new FillLayout());
    final TableColumnLayout layout = new MinSizeTableColumnLayout(50);
    table_box.setLayout(layout);

    // Tried CheckboxTableViewer, but it lead to inconsistent refreshes:
    // Rows would appear blank. Didn't investigate further, stuck with
    // TableViewer.
    viewer = new TableViewer(table_box,
            SWT.CHECK | SWT.MULTI | SWT.H_SCROLL | SWT.V_SCROLL | SWT.BORDER | SWT.VIRTUAL);

    final Table table = viewer.getTable();
    table.setHeaderVisible(true);
    table.setLinesVisible(true);

    // PV Name column: Has the 'check box' to select, allows editing
    final TableViewerColumn pv_column = createColumn(viewer, layout, Messages.PV, 75, 100,
            new PVTableCellLabelProvider() {
                @Override
                public void update(final ViewerCell cell) {
                    final TableItem tab_item = (TableItem) cell.getItem();
                    final PVTableItem item = (PVTableItem) cell.getElement();
                    if (item.isConfHeader()) {
                        cell.setText(item.getConfHeader());
                        cell.setForeground(tab_item.getDisplay().getSystemColor(SWT.COLOR_DARK_BLUE));
                        return;
                    }
                    if (item.isMeasureHeader() && model.getConfig() != null) {
                        cell.setText(item.getMeasureHeader());
                        cell.setForeground(tab_item.getDisplay().getSystemColor(SWT.COLOR_DARK_GREEN));
                        return;
                    }
                    if (item.isComment()) {
                        cell.setText(item.getComment());
                        cell.setForeground(tab_item.getDisplay().getSystemColor(SWT.COLOR_BLUE));
                        return;
                    }
                    tab_item.setChecked(item.isSelected());
                    cell.setText(item.getName());
                    cell.setForeground(null);
                }
            });
    pv_column.setEditingSupport(new EditingSupport(viewer) {
        @Override
        protected boolean canEdit(final Object element) {
            final PVTableItem item = (PVTableItem) element;
            if (item.isMeasure() && !item.isMeasureHeader())
                return false;
            return true;
        }

        @Override
        protected CellEditor getCellEditor(final Object element) {
            return AutoCompleteUIHelper.createAutoCompleteTextCellEditor(table, AutoCompleteTypes.PV);
        }

        @Override
        protected void setValue(final Object element, final Object value) {
            final String new_name = value.toString().trim();
            final PVTableItem item = (PVTableItem) element;

            if (item == PVTableModelContentProvider.NEW_ITEM) {
                // Set name of magic NEW_ITEM: Add new item
                if (new_name.isEmpty())
                    return;
                model.addItem(new_name);
                viewer.setInput(model);
            } else if (item.isMeasureHeader() && !new_name.startsWith("#mesure#"))
                return;
            else if (new_name.isEmpty()) {
                if (item.isConfHeader()) {
                    boolean isDelete = MessageDialog.openConfirm(Display.getCurrent().getActiveShell(),
                            Messages.InformationPopup, Messages.InformationPopup_DelConfHeader);

                    if (isDelete == false)
                        return;

                    Configuration conf = model.getConfig();
                    System.out.println("PVTable.createComponents(...).new EditingSupport() {...}.setValue() "
                            + conf + " " + ((conf != null) ? conf.getMeasures() : ""));
                    List<Measure> allMeasures = conf.getMeasures();
                    for (Measure measure : allMeasures) {
                        List<PVTableItem> itemsMeasure = measure.getItems();
                        for (PVTableItem itemMes : itemsMeasure)
                            model.removeItem(itemMes);
                    }
                }
                // Setting name to nothing: Remove item
                model.removeItem(item);
                viewer.remove(item);

                viewer.setItemCount(model.getItemCount() + 1);
                viewer.refresh();
            } else {
                // Change name of existing item
                item.updateName(new_name);
                model.isConfHeaderToAdd(item);
                model.fireModelChange();
            }
        }

        @Override
        protected Object getValue(final Object element) {
            final PVTableItem item = (PVTableItem) element;
            return item.getName();
        }
    });
    // Allow check/uncheck to select items for restore
    viewer.getTable().addListener(SWT.Selection, new Listener() {
        @Override
        public void handleEvent(final Event event) {
            final TableItem tab_item = (TableItem) event.item;
            final PVTableItem item = (PVTableItem) tab_item.getData();

            if (event.detail != SWT.CHECK) {
                changeContextMenu(item);
                return;
            }

            if (item.isComment() || item.isMeasure()) {
                tab_item.setChecked(false);
                return;
            }

            /*
             * Toggle selection of PVTableItem, then update the TableItem to
             * reflect current state. When instead updating the PVTableItem
             * from the TableItem's check mark, the result was inconsistent
             * behavior for selected rows: Could not un-check the checkbox
             * for a selected row...
             */
            if (item == PVTableModelContentProvider.NEW_ITEM)
                item.setSelected(false);
            else
                item.setSelected(!item.isSelected());
            tab_item.setChecked(item.isSelected());
        }
    });

    // Optionally, add column to display item.getDescription()
    if (Preferences.showDescription()) {
        createColumn(viewer, layout, Messages.Description, 50, 40, new PVTableCellLabelProvider() {
            @Override
            public void update(final ViewerCell cell) {
                final PVTableItem item = (PVTableItem) cell.getElement();
                cell.setText(item.getDescription());
            }
        });
    }

    // Read-only time stamp
    createColumn(viewer, layout, Messages.Time, 50, 100, new PVTableCellLabelProvider() {
        @Override
        public void update(final ViewerCell cell) {
            final PVTableItem item = (PVTableItem) cell.getElement();
            final VType value = item.getValue();
            if (!item.isMeasureHeader() && (value == null || item.isComment()))
                cell.setText(""); //$NON-NLS-1$
            else
                cell.setText(TimestampHelper.format(VTypeHelper.getTimestamp(value)));
        }
    });
    // Editable value
    final TableViewerColumn value_column = createColumn(viewer, layout, Messages.Value, 100, 50,
            new PVTableCellLabelProviderWithChangeIndicator(changed_background) {
                @Override
                public void update(final ViewerCell cell) {
                    final PVTableItem item = (PVTableItem) cell.getElement();
                    final VType value = item.getValue();
                    if (value == null)
                        cell.setText(""); //$NON-NLS-1$
                    else
                        cell.setText(VTypeHelper.toString(value));
                    super.update(cell);
                }
            });
    value_column.setEditingSupport(new EditingSupport(viewer) {
        /** When a combo box editor is created, its value must be the integer
         *  index. Note that this variable is shared for all rows. When
         *  editing, the UI thread calls getCellEditor() for the row, then
         *  get/setValue().
         */
        private boolean need_index = false;

        @Override
        protected boolean canEdit(final Object element) {
            final PVTableItem item = (PVTableItem) element;
            return item.isWritable();
        }

        @Override
        protected CellEditor getCellEditor(final Object element) {
            final PVTableItem item = (PVTableItem) element;
            final String[] options = item.getValueOptions();
            need_index = options != null;
            if (need_index)
                return new ComboBoxCellEditor(table, options, SWT.READ_ONLY);
            return new TextCellEditor(table);
        }

        @Override
        protected void setValue(final Object element, final Object value) {
            final PVTableItem item = (PVTableItem) element;
            item.setValue(value.toString());
        }

        @Override
        protected Object getValue(final Object element) {
            final PVTableItem item = (PVTableItem) element;
            final VType value = item.getValue();
            if (need_index) {
                if (value == null || !(value instanceof VEnum))
                    return 0;
                return ((VEnum) value).getIndex();
            }
            if (value == null)
                return ""; //$NON-NLS-1$
            return VTypeHelper.toString(value);
        }
    });
    // Remaining columns are read-only
    createColumn(viewer, layout, Messages.Alarm, 100, 50, new PVTableCellLabelProvider() {
        @Override
        public void update(final ViewerCell cell) {
            final PVTableItem item = (PVTableItem) cell.getElement();
            final VType value = item.getValue();
            if (value == null)
                cell.setText(""); //$NON-NLS-1$
            else {
                cell.setText(VTypeHelper.formatAlarm(value));
                cell.setForeground(alarm_colors.get(VTypeHelper.getSeverity(value)));
            }
        }
    });
    // Column Saved Value
    createColumn(viewer, layout, Messages.Saved, 100, 50,
            new PVTableCellLabelProviderWithChangeIndicator(changed_background) {
                @Override
                public void update(final ViewerCell cell) {
                    final PVTableItem item = (PVTableItem) cell.getElement();
                    final SavedValue value = item.getSavedValue().orElse(null);
                    if (value == null)
                        cell.setText(""); //$NON-NLS-1$
                    else
                        cell.setText(value.toString());
                    super.update(cell);
                }
            });

    // Optionally, add column to display item.getTime_saved()
    if (Preferences.showSaveTimestamp()) {
        createColumn(viewer, layout, Messages.Saved_Value_TimeStamp, 50, 40, new PVTableCellLabelProvider() {
            @Override
            public void update(final ViewerCell cell) {
                final PVTableItem item = (PVTableItem) cell.getElement();
                cell.setText(item.getTime_saved());
            }
        });
    }

    final TableViewerColumn completion_column = createColumn(viewer, layout, "Completion", 10, 100,
            new PVTableCellLabelProvider() {
                @Override
                public void update(final ViewerCell cell) {
                    final PVTableItem item = (PVTableItem) cell.getElement();
                    if (item.isWritable()) {
                        if (item.isUsingCompletion())
                            cell.setImage(icon_checked);
                        else
                            cell.setImage(icon_unchecked);
                    }
                }
            });
    completion_column.getColumn().setToolTipText("Await completion (use put-callback) when restoring values?");
    completion_column.setEditingSupport(new EditingSupport(viewer) {
        @Override
        protected boolean canEdit(final Object element) {
            return ((PVTableItem) element).isWritable();
        }

        @Override
        protected CellEditor getCellEditor(final Object element) {
            return new CheckboxCellEditor(table);
        }

        @Override
        protected Object getValue(final Object element) {
            return ((PVTableItem) element).isUsingCompletion();
        }

        @Override
        protected void setValue(final Object element, final Object value) {
            ((PVTableItem) element).setUseCompletion((Boolean) value);
            model.fireModelChange();
        }
    });

    ColumnViewerToolTipSupport.enableFor(viewer);
    viewer.setContentProvider(new PVTableModelContentProvider());
}