Example usage for org.eclipse.jface.viewers ColumnViewerEditor TABBING_CYCLE_IN_ROW

List of usage examples for org.eclipse.jface.viewers ColumnViewerEditor TABBING_CYCLE_IN_ROW

Introduction

In this page you can find the example usage for org.eclipse.jface.viewers ColumnViewerEditor TABBING_CYCLE_IN_ROW.

Prototype

int TABBING_CYCLE_IN_ROW

To view the source code for org.eclipse.jface.viewers ColumnViewerEditor TABBING_CYCLE_IN_ROW.

Click Source Link

Document

Should if the end of the row is reach started from the beginning in the same row

Usage

From source file:org.eclipse.sapphire.ui.forms.swt.TablePropertyEditorPresentation.java

License:Open Source License

@SuppressWarnings("unchecked") // TreeViewer is parameterized since Eclipse 4.4

protected Control createContents(final Composite parent, final boolean embedded) {
    final PropertyEditorPart part = part();
    final Property property = part.property();
    final boolean isReadOnly = part.isReadOnly();
    final boolean showHeader = part.getRenderingHint(PropertyEditorDef.HINT_SHOW_HEADER, true);

    final SapphireActionGroup actions = getActions();
    final SapphireActionPresentationManager actionPresentationManager = getActionPresentationManager();

    final SapphireToolBarActionPresentation toolBarActionsPresentation = new SapphireToolBarActionPresentation(
            actionPresentationManager);//from   w w  w. j a v a 2 s. c  o m
    toolBarActionsPresentation.addFilter(createFilterByActionId(ACTION_ASSIST));
    toolBarActionsPresentation.addFilter(createFilterByActionId(ACTION_JUMP));

    final SapphireMenuActionPresentation menuActionsPresentation = new SapphireMenuActionPresentation(
            actionPresentationManager);
    menuActionsPresentation.addFilter(createFilterByActionId(ACTION_ASSIST));
    menuActionsPresentation.addFilter(createFilterByActionId(ACTION_JUMP));

    addOnDisposeOperation(new Runnable() {
        public void run() {
            actionPresentationManager.dispose();
        }
    });

    final Composite mainComposite = createMainComposite(parent, new CreateMainCompositeDelegate(part) {
        @Override
        public boolean getShowLabel() {
            return (embedded ? false : super.getShowLabel());
        }

        @Override
        public int getLeftMargin() {
            return (embedded ? 0 : super.getLeftMargin());
        }

        @Override
        public boolean getSpanBothColumns() {
            return (embedded ? true : super.getSpanBothColumns());
        }
    });

    final Composite tableComposite;

    if (this.decorator == null) {
        tableComposite = new Composite(mainComposite, SWT.NULL);
        tableComposite.setLayoutData(gdfill());
        tableComposite.setLayout(glspacing(glayout(2, 0, 0), 2));

        this.decorator = createDecorator(tableComposite);
        this.decorator.control().setLayoutData(gdvalign(gd(), SWT.TOP));

        this.decorator.addEditorControl(tableComposite);
    } else {
        tableComposite = mainComposite;
    }

    this.decorator.addEditorControl(mainComposite);

    // Setting the whint in the following code is a hacky workaround for the problem
    // tracked by the following JFace bug:
    //
    // https://bugs.eclipse.org/bugs/show_bug.cgi?id=215997
    //

    final Composite tableParentComposite = new Composite(tableComposite, SWT.NULL);
    tableParentComposite.setLayoutData(gdwhint(gdfill(), 1));
    final TableColumnLayout tableColumnLayout = new TableColumnLayout();
    tableParentComposite.setLayout(tableColumnLayout);

    this.tableViewer = new CustomTableViewer(tableParentComposite, SWT.BORDER | SWT.FULL_SELECTION | SWT.MULTI);
    this.table = this.tableViewer.getTable();
    this.decorator.addEditorControl(this.table);

    final List<Control> relatedControls = new ArrayList<Control>();
    this.table.setData(RELATED_CONTROLS, relatedControls);

    this.table.addListener(SWT.MeasureItem, new org.eclipse.swt.widgets.Listener() {
        public void handleEvent(final org.eclipse.swt.widgets.Event event) {
            // The rows should be 18 pixels at minimum to allow sufficient 
            // room for the cell editors.

            event.height = Math.max(event.height, 18);
        }
    });

    this.columnHandlers = new ArrayList<ColumnHandler>();

    final ColumnViewerEditorActivationStrategy activationStrategy = new ColumnViewerEditorActivationStrategy(
            this.tableViewer) {
        protected boolean isEditorActivationEvent(final ColumnViewerEditorActivationEvent event) {
            final int columnIndex = ((ViewerCell) event.getSource()).getColumnIndex();
            final ColumnHandler columnHandler = getColumnHandler(columnIndex);
            return columnHandler.isEditorActivationEvent(event);
        }
    };

    TableViewerEditor.create(this.tableViewer, null, activationStrategy,
            ColumnViewerEditor.TABBING_HORIZONTAL | ColumnViewerEditor.TABBING_CYCLE_IN_ROW);

    this.table.setHeaderVisible(showHeader);

    this.selectionProvider = new SelectionProvider(this.tableViewer);

    this.table.addFocusListener(new FocusAdapter() {
        @Override
        public void focusGained(final FocusEvent event) {
            handleTableFocusGainedEvent();
        }
    });

    attachAccessibleName(this.table);

    this.refreshOperation = new Runnable() {
        boolean running = false;

        public void run() {
            if (TablePropertyEditorPresentation.this.table.isDisposed()) {
                return;
            }

            if (this.running == true) {
                return;
            }

            this.running = true;

            try {
                TablePropertyEditorPresentation.this.tableViewer.refresh();

                if (TablePropertyEditorPresentation.this.table.isDisposed()) {
                    return;
                }

                TablePropertyEditorPresentation.this.table.notifyListeners(SWT.Selection, null);
                tableParentComposite.layout();
            } finally {
                this.running = false;
            }
        }
    };

    final Listener listener = new FilteredListener<PropertyContentEvent>() {
        @Override
        protected void handleTypedEvent(final PropertyContentEvent event) {
            TablePropertyEditorPresentation.this.refreshOperation.run();
        }
    };

    property.attach(listener);

    addOnDisposeOperation(new Runnable() {
        public void run() {
            property.detach(listener);
        }
    });

    boolean showImages = true;

    final String columnWidthsHint = part.getRenderingHint(PropertyEditorDef.HINT_COLUMN_WIDTHS, "");
    final StringTokenizer columnWidthsHintTokenizer = new StringTokenizer(columnWidthsHint, ",");

    for (final ModelPath childPropertyPath : part.getChildProperties()) {
        final PropertyDef childProperty = property.definition().getType().property(childPropertyPath);
        final PropertyEditorDef childPropertyEditorDef = part.definition()
                .getChildPropertyEditor(childPropertyPath);
        final TableViewerColumn tableViewerColumn = new TableViewerColumn(this.tableViewer, SWT.NONE);

        if (childPropertyEditorDef == null) {
            final String label = childProperty.getLabel(false, CapitalizationType.TITLE_STYLE, false);
            tableViewerColumn.getColumn().setText(label);
        } else {
            final MutableReference<FunctionResult> labelFunctionResultRef = new MutableReference<FunctionResult>();

            final Runnable updateLabelOp = new Runnable() {
                public void run() {
                    String label = (String) labelFunctionResultRef.get().value();
                    label = LabelTransformer.transform(label, CapitalizationType.TITLE_STYLE, false);
                    tableViewerColumn.getColumn().setText(label);
                }
            };

            final FunctionResult labelFunctionResult = part.initExpression(
                    childPropertyEditorDef.getLabel().content(), String.class,
                    Literal.create(childProperty.getLabel(false, CapitalizationType.NO_CAPS, true)),
                    updateLabelOp);

            labelFunctionResultRef.set(labelFunctionResult);

            updateLabelOp.run();

            addOnDisposeOperation(new Runnable() {
                public void run() {
                    labelFunctionResult.dispose();
                }
            });
        }

        ColumnWeightData columnWeightData = null;

        if (columnWidthsHintTokenizer.hasMoreTokens()) {
            final String columnWidthHint = columnWidthsHintTokenizer.nextToken();
            final String[] columnWidthHintSplit = columnWidthHint.split(":");

            if (columnWidthHintSplit.length == 1 || columnWidthHintSplit.length == 2) {
                try {
                    final int minColumnWidth = Integer.parseInt(columnWidthHintSplit[0].trim());
                    final int columnWeight;

                    if (columnWidthHintSplit.length == 2) {
                        columnWeight = Integer.parseInt(columnWidthHintSplit[1].trim());
                    } else {
                        columnWeight = 0;
                    }

                    columnWeightData = new ColumnWeightData(columnWeight, minColumnWidth, true);
                } catch (NumberFormatException e) {
                }
            }
        }

        if (columnWeightData == null) {
            columnWeightData = new ColumnWeightData(1, 100, true);
        }

        tableColumnLayout.setColumnData(tableViewerColumn.getColumn(), columnWeightData);

        final ColumnHandler columnHandler = createColumnHandler(this.columnHandlers, childPropertyPath,
                showImages, childPropertyEditorDef);

        showImages = false; // Only the first column should ever show the image.

        tableViewerColumn.setLabelProvider(columnHandler.getLabelProvider());
        tableViewerColumn.setEditingSupport(columnHandler.getEditingSupport());

        final TableColumn tableColumn = tableViewerColumn.getColumn();

        tableColumn.addSelectionListener(new SelectionAdapter() {
            @Override
            public void widgetSelected(final SelectionEvent event) {
                final TableColumn currentSortColumn = TablePropertyEditorPresentation.this.table
                        .getSortColumn();

                if (currentSortColumn != tableColumn) {
                    TablePropertyEditorPresentation.this.table.setSortColumn(tableColumn);
                    TablePropertyEditorPresentation.this.table.setSortDirection(SWT.DOWN);
                    TablePropertyEditorPresentation.this.tableViewer
                            .setComparator(new TableSorter(columnHandler, SWT.DOWN));
                } else {
                    final int currentSortDirection = TablePropertyEditorPresentation.this.table
                            .getSortDirection();

                    if (currentSortDirection == SWT.DOWN) {
                        TablePropertyEditorPresentation.this.table.setSortDirection(SWT.UP);
                        TablePropertyEditorPresentation.this.tableViewer
                                .setComparator(new TableSorter(columnHandler, SWT.UP));
                    } else {
                        TablePropertyEditorPresentation.this.table.setSortColumn(null);
                        TablePropertyEditorPresentation.this.tableViewer.setComparator(null);
                    }
                }

                for (SapphireAction action : actions.getActions()) {
                    for (SapphireActionHandler handler : action.getActiveHandlers()) {
                        if (handler instanceof PropertyEditorActionHandler) {
                            ((PropertyEditorActionHandler) handler).refreshEnablementState();
                        }
                    }
                }
            }
        });
    }

    final IStructuredContentProvider contentProvider = new IStructuredContentProvider() {
        public Object[] getElements(final Object inputElement) {
            final ElementList<?> list = property();
            final Map<Element, TableRow> rows = new LinkedHashMap<Element, TableRow>();

            for (Element element : list) {
                TableRow row = null;

                if (TablePropertyEditorPresentation.this.rows != null) {
                    row = TablePropertyEditorPresentation.this.rows.remove(element);
                }

                if (row == null) {
                    ImageProvider imageProvider = null;

                    final ImageService imageService = element.service(ImageService.class);

                    if (imageService != null) {
                        imageProvider = new ImageProvider() {
                            private Listener imageServiceListener;

                            @Override
                            public ImageData image() {
                                if (this.imageServiceListener == null) {
                                    this.imageServiceListener = new Listener() {
                                        @Override
                                        public void handle(final Event event) {
                                            update(row());
                                        }
                                    };

                                    imageService.attach(this.imageServiceListener);
                                }

                                return imageService.image();
                            }

                            @Override
                            public void dispose() {
                                if (this.imageServiceListener != null) {
                                    imageService.detach(this.imageServiceListener);
                                }
                            }
                        };
                    } else if (getColumnCount() == 1) {
                        final Value<?> value = (Value<?>) element.property(getColumnHandler(0).property());
                        final ValueImageService valueImageService = value.service(ValueImageService.class);

                        if (valueImageService != null) {
                            imageProvider = new ImageProvider() {
                                @Override
                                public ImageData image() {
                                    return valueImageService.provide(value.text());
                                }
                            };
                        }
                    }

                    row = new TableRow(element, imageProvider);
                }

                rows.put(element, row);
            }

            if (TablePropertyEditorPresentation.this.rows != null) {
                for (TableRow row : TablePropertyEditorPresentation.this.rows.values()) {
                    row.dispose();
                }
            }

            TablePropertyEditorPresentation.this.rows = rows;

            return rows.values().toArray();
        }

        public void inputChanged(final Viewer viewer, final Object oldInput, final Object newInput) {
        }

        public void dispose() {
            for (TableRow row : TablePropertyEditorPresentation.this.rows.values()) {
                row.dispose();
            }
        }
    };

    this.tableViewer.setContentProvider(contentProvider);
    this.tableViewer.setInput(contentProvider);

    this.table.addTraverseListener(new TraverseListener() {
        public void keyTraversed(final TraverseEvent event) {
            handleTableTraverseEvent(event);
        }
    });

    final ListSelectionService selectionService = part.service(ListSelectionService.class);

    this.selectionProvider.addSelectionChangedListener(new ISelectionChangedListener() {
        public void selectionChanged(SelectionChangedEvent event) {
            selectionService.select(getSelectedElements());
        }
    });

    setSelectedElements(selectionService.selection());

    final org.eclipse.sapphire.Listener selectionServiceListener = new FilteredListener<ListSelectionChangedEvent>() {
        @Override
        protected void handleTypedEvent(final ListSelectionChangedEvent event) {
            setSelectedElements(event.after());
        }
    };

    selectionService.attach(selectionServiceListener);

    if (!isReadOnly) {
        if (this.exposeAddAction) {
            final SapphireAction addAction = actions.getAction(ACTION_ADD);
            final List<SapphireActionHandler> addActionHandlers = new ArrayList<SapphireActionHandler>();

            final org.eclipse.sapphire.Listener addActionHandlerListener = new org.eclipse.sapphire.Listener() {
                @Override
                public void handle(final org.eclipse.sapphire.Event event) {
                    if (event instanceof PostExecuteEvent) {
                        if (TablePropertyEditorPresentation.this.table.isDisposed()) {
                            return;
                        }

                        final Element newListElement = (Element) ((PostExecuteEvent) event).getResult();

                        if (newListElement != null) {
                            TablePropertyEditorPresentation.this.refreshOperation.run();

                            final TableRow row = findTableRow(newListElement);

                            TablePropertyEditorPresentation.this.tableViewer
                                    .setSelection(new StructuredSelection(row), true);

                            if (TablePropertyEditorPresentation.this.table.isDisposed()) {
                                return;
                            }

                            TablePropertyEditorPresentation.this.tableViewer.editElement(row, 0);
                            TablePropertyEditorPresentation.this.table.notifyListeners(SWT.Selection, null);
                        }
                    }
                }
            };

            final PossibleTypesService possibleTypesService = property.service(PossibleTypesService.class);

            final Runnable refreshAddActionHandlersOp = new Runnable() {
                public void run() {
                    addAction.removeHandlers(addActionHandlers);

                    for (SapphireActionHandler addActionHandler : addActionHandlers) {
                        addActionHandler.dispose();
                    }

                    for (ElementType memberType : possibleTypesService.types()) {
                        final SapphireActionHandler addActionHandler = new AddActionHandler(memberType);
                        addActionHandler.init(addAction, null);
                        addActionHandler.attach(addActionHandlerListener);
                        addActionHandlers.add(addActionHandler);
                        addAction.addHandler(addActionHandler);
                    }
                }
            };

            refreshAddActionHandlersOp.run();

            final org.eclipse.sapphire.Listener possibleTypesServiceListener = new org.eclipse.sapphire.Listener() {
                @Override
                public void handle(final org.eclipse.sapphire.Event event) {
                    refreshAddActionHandlersOp.run();
                }
            };

            possibleTypesService.attach(possibleTypesServiceListener);

            addOnDisposeOperation(new Runnable() {
                public void run() {
                    addAction.removeHandlers(addActionHandlers);

                    for (SapphireActionHandler addActionHandler : addActionHandlers) {
                        addActionHandler.dispose();
                    }

                    possibleTypesService.detach(possibleTypesServiceListener);
                }
            });
        }

        if (this.exposeDeleteAction) {
            final SapphireAction deleteAction = actions.getAction(ACTION_DELETE);
            final SapphireActionHandler deleteActionHandler = new DeleteActionHandler();
            deleteActionHandler.init(deleteAction, null);
            deleteAction.addHandler(deleteActionHandler);

            addOnDisposeOperation(new Runnable() {
                public void run() {
                    deleteAction.removeHandler(deleteActionHandler);
                    deleteActionHandler.dispose();
                }
            });
        }

        if (!property.definition().hasAnnotation(FixedOrderList.class)) {
            final SapphireAction moveUpAction = actions.getAction(ACTION_MOVE_UP);
            final SapphireActionHandler moveUpActionHandler = new MoveUpActionHandler();
            moveUpActionHandler.init(moveUpAction, null);
            moveUpAction.addHandler(moveUpActionHandler);

            addOnDisposeOperation(new Runnable() {
                public void run() {
                    moveUpAction.removeHandler(moveUpActionHandler);
                    moveUpActionHandler.dispose();
                }
            });

            final SapphireAction moveDownAction = actions.getAction(ACTION_MOVE_DOWN);
            final SapphireActionHandler moveDownActionHandler = new MoveDownActionHandler();
            moveDownActionHandler.init(moveDownAction, null);
            moveDownAction.addHandler(moveDownActionHandler);

            addOnDisposeOperation(new Runnable() {
                public void run() {
                    moveDownAction.removeHandler(moveDownActionHandler);
                    moveDownActionHandler.dispose();
                }
            });

            final org.eclipse.sapphire.Listener moveActionHandlerListener = new org.eclipse.sapphire.Listener() {
                @Override
                public void handle(final org.eclipse.sapphire.Event event) {
                    if (event instanceof PostExecuteEvent) {
                        TablePropertyEditorPresentation.this.refreshOperation.run();

                        // This is a workaround for a weird problem on SWT on Windows. If modifier keys are pressed
                        // when the list is re-ordered (as in when issuing move up or move down command from the
                        // keyboard), the focused row can detached from selected row.

                        final Element element = getSelectedElement();
                        final TableItem[] items = TablePropertyEditorPresentation.this.table.getItems();

                        for (int i = 0; i < items.length; i++) {
                            if (items[i].getData() == element) {
                                TablePropertyEditorPresentation.this.table.setSelection(i);
                                break;
                            }
                        }
                    }
                }
            };

            moveUpAction.attach(moveActionHandlerListener);
            moveDownAction.attach(moveActionHandlerListener);

            final ElementsTransfer transfer = new ElementsTransfer(
                    element().type().getModelElementClass().getClassLoader());
            final Transfer[] transfers = new Transfer[] { transfer };

            final DragSource dragSource = new DragSource(this.table, DND.DROP_COPY | DND.DROP_MOVE);
            dragSource.setTransfer(transfers);

            final List<Element> dragElements = new ArrayList<Element>();

            dragSource.addDragListener(new DragSourceListener() {
                public void dragStart(final DragSourceEvent event) {
                    if (TablePropertyEditorPresentation.this.tableViewer.getComparator() == null) {
                        dragElements.addAll(getSelectedElements());
                        event.doit = true;
                    } else {
                        event.doit = false;
                    }
                }

                public void dragSetData(final DragSourceEvent event) {
                    event.data = dragElements;
                }

                public void dragFinished(final DragSourceEvent event) {
                    if (event.detail == DND.DROP_MOVE) {
                        // When drop target is the same editor as drag source, the drop handler takes care of removing
                        // elements from their original location. The following block of code accounts for the case when 
                        // dropping into another editor.

                        boolean droppedIntoAnotherEditor = false;

                        for (Element dragElement : dragElements) {
                            if (!dragElement.disposed()) {
                                droppedIntoAnotherEditor = true;
                                break;
                            }
                        }

                        if (droppedIntoAnotherEditor) {
                            try {
                                final Element selectionPostDelete = findSelectionPostDelete(property(),
                                        dragElements);

                                for (Element dragElement : dragElements) {
                                    final ElementList<?> dragElementContainer = (ElementList<?>) dragElement
                                            .parent();
                                    dragElementContainer.remove(dragElement);
                                }

                                setSelectedElement(selectionPostDelete);
                            } catch (Exception e) {
                                // Log this exception unless the cause is EditFailedException. These exception
                                // are the result of the user declining a particular action that is necessary
                                // before the edit can happen (such as making a file writable).

                                final EditFailedException editFailedException = EditFailedException
                                        .findAsCause(e);

                                if (editFailedException == null) {
                                    Sapphire.service(LoggingService.class).log(e);
                                }
                            }
                        }
                    }

                    dragElements.clear();
                }
            });

            final DropTarget target = new DropTarget(this.table, DND.DROP_COPY | DND.DROP_MOVE);
            target.setTransfer(transfers);

            target.addDropListener(new DropTargetAdapter() {
                public void dragOver(final DropTargetEvent event) {
                    if (event.item != null) {
                        final TableItem dragOverItem = (TableItem) event.item;

                        final Point pt = dragOverItem.getDisplay().map(null,
                                TablePropertyEditorPresentation.this.table, event.x, event.y);
                        final Rectangle bounds = dragOverItem.getBounds();

                        if (pt.y < bounds.y + bounds.height / 2) {
                            event.feedback = DND.FEEDBACK_INSERT_BEFORE;
                        } else {
                            event.feedback = DND.FEEDBACK_INSERT_AFTER;
                        }
                    }

                    event.feedback |= DND.FEEDBACK_SCROLL;
                }

                public void drop(final DropTargetEvent event) {
                    if (event.data == null) {
                        event.detail = DND.DROP_NONE;
                        return;
                    }

                    final List<ElementData> droppedElements = (List<ElementData>) event.data;
                    final Set<ElementType> possibleTypesService = property.service(PossibleTypesService.class)
                            .types();

                    for (final ElementData droppedElement : droppedElements) {
                        if (!possibleTypesService.contains(droppedElement.type())) {
                            event.detail = DND.DROP_NONE;
                            return;
                        }
                    }

                    final ElementList<?> list = property();

                    int position;

                    if (event.item == null) {
                        position = list.size();
                    } else {
                        final TableItem dropTargetItem = (TableItem) event.item;
                        final TableRow dropTargetRow = (TableRow) dropTargetItem.getData();
                        final Element dropTargetElement = dropTargetRow.element();

                        final Point pt = TablePropertyEditorPresentation.this.table.getDisplay().map(null,
                                TablePropertyEditorPresentation.this.table, event.x, event.y);
                        final Rectangle bounds = dropTargetItem.getBounds();

                        position = list.indexOf(dropTargetElement);

                        if (pt.y >= bounds.y + bounds.height / 2) {
                            position++;
                        }
                    }

                    try {
                        if (event.detail == DND.DROP_MOVE) {
                            for (Element dragElement : dragElements) {
                                final ElementList<?> dragElementContainer = (ElementList<?>) dragElement
                                        .parent();

                                if (dragElementContainer == list
                                        && dragElementContainer.indexOf(dragElement) < position) {
                                    position--;
                                }

                                dragElementContainer.remove(dragElement);
                            }
                        }

                        final List<Element> newSelection = new ArrayList<Element>();

                        for (final ElementData droppedElement : droppedElements) {
                            final Element insertedElement = list.insert(droppedElement.type(), position);
                            insertedElement.copy(droppedElement);

                            newSelection.add(insertedElement);

                            position++;
                        }

                        if (TablePropertyEditorPresentation.this.table.isDisposed()) {
                            return;
                        }

                        TablePropertyEditorPresentation.this.tableViewer.refresh();
                        setSelectedElements(newSelection);
                    } catch (Exception e) {
                        // Log this exception unless the cause is EditFailedException. These exception
                        // are the result of the user declining a particular action that is necessary
                        // before the edit can happen (such as making a file writable).

                        final EditFailedException editFailedException = EditFailedException.findAsCause(e);

                        if (editFailedException == null) {
                            Sapphire.service(LoggingService.class).log(e);
                        }

                        event.detail = DND.DROP_NONE;
                    }
                }
            });
        }
    }

    final boolean toolBarNeeded = toolBarActionsPresentation.hasActions();

    mainComposite.setLayout(glayout((toolBarNeeded ? 2 : 1), 0, 0, 0, 0));

    if (toolBarNeeded) {
        final ToolBar toolbar = new ToolBar(mainComposite, SWT.FLAT | SWT.VERTICAL);
        toolbar.setLayoutData(gdvfill());
        toolBarActionsPresentation.setToolBar(toolbar);
        toolBarActionsPresentation.render();
        addControl(toolbar);
        this.decorator.addEditorControl(toolbar);
    }

    if (menuActionsPresentation.hasActions()) {
        final Menu menu = new Menu(this.table);
        this.table.setMenu(menu);
        menuActionsPresentation.setMenu(menu);
        menuActionsPresentation.render();
    }

    final HyperlinkTable hyperlinkTable = new HyperlinkTable(this.table, actions);

    hyperlinkTable.setController(new HyperlinkTable.Controller() {
        @Override
        public boolean isHyperlinkEnabled(final TableItem item, final int column) {
            final SapphireActionHandler jumpHandler = getJumpHandler(item, column);

            if (jumpHandler != null) {
                return jumpHandler.isEnabled();
            }

            return false;
        }

        @Override
        public void handleHyperlinkEvent(final TableItem item, final int column) {
            final SapphireActionHandler jumpHandler = getJumpHandler(item, column);

            if (jumpHandler != null) {
                jumpHandler.execute(TablePropertyEditorPresentation.this);
            }
        }

        private SapphireActionHandler getJumpHandler(final TableItem item, final int column) {
            final Element element = ((TableRow) item.getData()).element();
            final ModelPath property = part.getChildProperties().get(column);
            final PropertyEditorPart propertyEditor = part.getChildPropertyEditor(element, property);
            final SapphireActionGroup actions = propertyEditor.getActions();
            return actions.getAction(ACTION_JUMP).getFirstActiveHandler();
        }
    });

    suppressDashedTableEntryBorder(this.table);

    addControl(this.table);

    addOnDisposeOperation(new Runnable() {
        public void run() {
            selectionService.detach(selectionServiceListener);
        }
    });

    return this.table;
}

From source file:org.eclipse.sapphire.ui.renderers.swt.DefaultListPropertyEditorRenderer.java

License:Open Source License

protected Control createContents(final Composite parent, final boolean embedded) {
    final PropertyEditorPart part = getPart();
    final Property property = part.property();
    final boolean isReadOnly = part.isReadOnly();
    final boolean showHeader = part.getRenderingHint(PropertyEditorDef.HINT_SHOW_HEADER, true);

    final SapphireActionGroup actions = getActions();
    final SapphireActionPresentationManager actionPresentationManager = getActionPresentationManager();

    final SapphireToolBarActionPresentation toolBarActionsPresentation = new SapphireToolBarActionPresentation(
            actionPresentationManager);/*from w ww . ja  v a 2s  .c o m*/
    toolBarActionsPresentation.addFilter(createFilterByActionId(ACTION_ASSIST));
    toolBarActionsPresentation.addFilter(createFilterByActionId(ACTION_JUMP));

    final SapphireMenuActionPresentation menuActionsPresentation = new SapphireMenuActionPresentation(
            actionPresentationManager);
    menuActionsPresentation.addFilter(createFilterByActionId(ACTION_ASSIST));
    menuActionsPresentation.addFilter(createFilterByActionId(ACTION_JUMP));

    addOnDisposeOperation(new Runnable() {
        public void run() {
            actionPresentationManager.dispose();
        }
    });

    final Composite mainComposite = createMainComposite(parent, new CreateMainCompositeDelegate(part) {
        @Override
        public boolean getShowLabel() {
            return (embedded ? false : super.getShowLabel());
        }

        @Override
        public int getLeftMargin() {
            return (embedded ? 0 : super.getLeftMargin());
        }

        @Override
        public boolean getSpanBothColumns() {
            return (embedded ? true : super.getSpanBothColumns());
        }
    });

    final Composite tableComposite;

    if (this.decorator == null) {
        tableComposite = new Composite(mainComposite, SWT.NULL);
        tableComposite.setLayoutData(gdfill());
        tableComposite.setLayout(glspacing(glayout(2, 0, 0), 2));

        this.decorator = createDecorator(tableComposite);
        this.decorator.control().setLayoutData(gdvalign(gd(), SWT.TOP));

        this.decorator.addEditorControl(tableComposite);
    } else {
        tableComposite = mainComposite;
    }

    this.decorator.addEditorControl(mainComposite);

    // Setting the whint in the following code is a hacky workaround for the problem
    // tracked by the following JFace bug:
    //
    // https://bugs.eclipse.org/bugs/show_bug.cgi?id=215997
    //

    final Composite tableParentComposite = new Composite(tableComposite, SWT.NULL);
    tableParentComposite.setLayoutData(gdwhint(gdfill(), 1));
    final TableColumnLayout tableColumnLayout = new TableColumnLayout();
    tableParentComposite.setLayout(tableColumnLayout);

    this.tableViewer = new TableViewer(tableParentComposite, SWT.BORDER | SWT.FULL_SELECTION | SWT.MULTI);
    this.table = this.tableViewer.getTable();
    this.decorator.addEditorControl(this.table);

    final List<Control> relatedControls = new ArrayList<Control>();
    this.table.setData(RELATED_CONTROLS, relatedControls);

    this.table.addListener(SWT.MeasureItem, new org.eclipse.swt.widgets.Listener() {
        public void handleEvent(final org.eclipse.swt.widgets.Event event) {
            // The rows should be 18 pixels at minimum to allow sufficient 
            // room for the cell editors.

            event.height = Math.max(event.height, 18);
        }
    });

    this.columnHandlers = new ArrayList<ColumnHandler>();

    final ColumnViewerEditorActivationStrategy activationStrategy = new ColumnViewerEditorActivationStrategy(
            this.tableViewer) {
        protected boolean isEditorActivationEvent(final ColumnViewerEditorActivationEvent event) {
            final int columnIndex = ((ViewerCell) event.getSource()).getColumnIndex();
            final ColumnHandler columnHandler = getColumnHandler(columnIndex);
            return columnHandler.isEditorActivationEvent(event);
        }
    };

    TableViewerEditor.create(this.tableViewer, null, activationStrategy,
            ColumnViewerEditor.TABBING_HORIZONTAL | ColumnViewerEditor.TABBING_CYCLE_IN_ROW);

    this.table.setHeaderVisible(showHeader);

    this.selectionProvider = new SelectionProvider(this.tableViewer);

    this.table.addFocusListener(new FocusAdapter() {
        @Override
        public void focusGained(final FocusEvent event) {
            handleTableFocusGainedEvent();
        }
    });

    this.refreshOperation = new Runnable() {
        boolean running = false;

        public void run() {
            if (DefaultListPropertyEditorRenderer.this.table.isDisposed()) {
                return;
            }

            if (this.running == true) {
                return;
            }

            this.running = true;

            try {
                DefaultListPropertyEditorRenderer.this.tableViewer.refresh();
                DefaultListPropertyEditorRenderer.this.table.notifyListeners(SWT.Selection, null);
                tableParentComposite.layout();
            } finally {
                this.running = false;
            }
        }
    };

    final Listener listener = new FilteredListener<PropertyContentEvent>() {
        @Override
        protected void handleTypedEvent(final PropertyContentEvent event) {
            DefaultListPropertyEditorRenderer.this.refreshOperation.run();
        }
    };

    property.attach(listener);

    addOnDisposeOperation(new Runnable() {
        public void run() {
            property.detach(listener);
        }
    });

    boolean showImages = true;

    final String columnWidthsHint = part.getRenderingHint(PropertyEditorDef.HINT_COLUMN_WIDTHS, "");
    final StringTokenizer columnWidthsHintTokenizer = new StringTokenizer(columnWidthsHint, ",");

    for (final ModelPath childPropertyPath : part.getChildProperties()) {
        final PropertyDef childProperty = property.definition().getType().property(childPropertyPath);
        final PropertyEditorDef childPropertyEditorDef = part.definition()
                .getChildPropertyEditor(childPropertyPath);
        final TableViewerColumn tableViewerColumn = new TableViewerColumn(this.tableViewer, SWT.NONE);

        if (childPropertyEditorDef == null) {
            final String label = childProperty.getLabel(false, CapitalizationType.TITLE_STYLE, false);
            tableViewerColumn.getColumn().setText(label);
        } else {
            final MutableReference<FunctionResult> labelFunctionResultRef = new MutableReference<FunctionResult>();

            final Runnable updateLabelOp = new Runnable() {
                public void run() {
                    String label = (String) labelFunctionResultRef.get().value();
                    label = LabelTransformer.transform(label, CapitalizationType.TITLE_STYLE, false);
                    tableViewerColumn.getColumn().setText(label);
                }
            };

            final FunctionResult labelFunctionResult = part.initExpression(
                    childPropertyEditorDef.getLabel().content(), String.class,
                    Literal.create(childProperty.getLabel(false, CapitalizationType.NO_CAPS, true)),
                    updateLabelOp);

            labelFunctionResultRef.set(labelFunctionResult);

            updateLabelOp.run();

            addOnDisposeOperation(new Runnable() {
                public void run() {
                    labelFunctionResult.dispose();
                }
            });
        }

        ColumnWeightData columnWeightData = null;

        if (columnWidthsHintTokenizer.hasMoreTokens()) {
            final String columnWidthHint = columnWidthsHintTokenizer.nextToken();
            final String[] columnWidthHintSplit = columnWidthHint.split(":");

            if (columnWidthHintSplit.length == 1 || columnWidthHintSplit.length == 2) {
                try {
                    final int minColumnWidth = Integer.parseInt(columnWidthHintSplit[0].trim());
                    final int columnWeight;

                    if (columnWidthHintSplit.length == 2) {
                        columnWeight = Integer.parseInt(columnWidthHintSplit[1].trim());
                    } else {
                        columnWeight = 0;
                    }

                    columnWeightData = new ColumnWeightData(columnWeight, minColumnWidth, true);
                } catch (NumberFormatException e) {
                }
            }
        }

        if (columnWeightData == null) {
            columnWeightData = new ColumnWeightData(1, 100, true);
        }

        tableColumnLayout.setColumnData(tableViewerColumn.getColumn(), columnWeightData);

        final ColumnHandler columnHandler = createColumnHandler(this.columnHandlers, childPropertyPath,
                showImages, childPropertyEditorDef);

        showImages = false; // Only the first column should ever show the image.

        tableViewerColumn.setLabelProvider(columnHandler.getLabelProvider());
        tableViewerColumn.setEditingSupport(columnHandler.getEditingSupport());

        final TableColumn tableColumn = tableViewerColumn.getColumn();

        tableColumn.addSelectionListener(new SelectionAdapter() {
            @Override
            public void widgetSelected(final SelectionEvent event) {
                final TableColumn currentSortColumn = DefaultListPropertyEditorRenderer.this.table
                        .getSortColumn();

                if (currentSortColumn != tableColumn) {
                    DefaultListPropertyEditorRenderer.this.table.setSortColumn(tableColumn);
                    DefaultListPropertyEditorRenderer.this.table.setSortDirection(SWT.DOWN);
                    DefaultListPropertyEditorRenderer.this.tableViewer
                            .setComparator(new TableSorter(columnHandler, SWT.DOWN));
                } else {
                    final int currentSortDirection = DefaultListPropertyEditorRenderer.this.table
                            .getSortDirection();

                    if (currentSortDirection == SWT.DOWN) {
                        DefaultListPropertyEditorRenderer.this.table.setSortDirection(SWT.UP);
                        DefaultListPropertyEditorRenderer.this.tableViewer
                                .setComparator(new TableSorter(columnHandler, SWT.UP));
                    } else {
                        DefaultListPropertyEditorRenderer.this.table.setSortColumn(null);
                        DefaultListPropertyEditorRenderer.this.tableViewer.setComparator(null);
                    }
                }

                for (SapphireAction action : actions.getActions()) {
                    for (SapphireActionHandler handler : action.getActiveHandlers()) {
                        if (handler instanceof SapphirePropertyEditorActionHandler) {
                            ((SapphirePropertyEditorActionHandler) handler).refreshEnablementState();
                        }
                    }
                }
            }
        });
    }

    final IStructuredContentProvider contentProvider = new IStructuredContentProvider() {
        public Object[] getElements(final Object inputElement) {
            final ElementList<?> list = getList();
            final Map<Element, TableRow> rows = new LinkedHashMap<Element, TableRow>();

            for (Element element : list) {
                TableRow row = null;

                if (DefaultListPropertyEditorRenderer.this.rows != null) {
                    row = DefaultListPropertyEditorRenderer.this.rows.remove(element);
                }

                if (row == null) {
                    row = new TableRow(element);
                }

                rows.put(element, row);
            }

            if (DefaultListPropertyEditorRenderer.this.rows != null) {
                for (TableRow row : DefaultListPropertyEditorRenderer.this.rows.values()) {
                    row.dispose();
                }
            }

            DefaultListPropertyEditorRenderer.this.rows = rows;

            return rows.values().toArray();
        }

        public void inputChanged(final Viewer viewer, final Object oldInput, final Object newInput) {
        }

        public void dispose() {
            for (TableRow row : DefaultListPropertyEditorRenderer.this.rows.values()) {
                row.dispose();
            }
        }
    };

    this.tableViewer.setContentProvider(contentProvider);
    this.tableViewer.setInput(contentProvider);

    this.table.addTraverseListener(new TraverseListener() {
        public void keyTraversed(final TraverseEvent event) {
            handleTableTraverseEvent(event);
        }
    });

    final ListSelectionService selectionService = part.service(ListSelectionService.class);

    this.selectionProvider.addSelectionChangedListener(new ISelectionChangedListener() {
        public void selectionChanged(SelectionChangedEvent event) {
            selectionService.select(getSelectedElements());
        }
    });

    setSelectedElements(selectionService.selection());

    final org.eclipse.sapphire.Listener selectionServiceListener = new org.eclipse.sapphire.Listener() {
        @Override
        public void handle(final org.eclipse.sapphire.Event event) {
            setSelectedElements(((ListSelectionChangedEvent) event).after());
        }
    };

    selectionService.attach(selectionServiceListener);

    if (!isReadOnly) {
        if (this.exposeAddAction) {
            final SapphireAction addAction = actions.getAction(ACTION_ADD);
            final List<SapphireActionHandler> addActionHandlers = new ArrayList<SapphireActionHandler>();

            final org.eclipse.sapphire.Listener addActionHandlerListener = new org.eclipse.sapphire.Listener() {
                @Override
                public void handle(final org.eclipse.sapphire.Event event) {
                    if (event instanceof PostExecuteEvent) {
                        if (DefaultListPropertyEditorRenderer.this.table.isDisposed()) {
                            return;
                        }

                        final Element newListElement = (Element) ((PostExecuteEvent) event).getResult();

                        if (newListElement != null) {
                            DefaultListPropertyEditorRenderer.this.refreshOperation.run();

                            final TableRow row = DefaultListPropertyEditorRenderer.this.rows
                                    .get(newListElement);

                            DefaultListPropertyEditorRenderer.this.tableViewer
                                    .setSelection(new StructuredSelection(row), true);
                            DefaultListPropertyEditorRenderer.this.tableViewer.editElement(row, 0);
                            DefaultListPropertyEditorRenderer.this.table.notifyListeners(SWT.Selection, null);
                        }
                    }
                }
            };

            final PossibleTypesService possibleTypesService = property.service(PossibleTypesService.class);

            final Runnable refreshAddActionHandlersOp = new Runnable() {
                public void run() {
                    addAction.removeHandlers(addActionHandlers);

                    for (SapphireActionHandler addActionHandler : addActionHandlers) {
                        addActionHandler.dispose();
                    }

                    for (ElementType memberType : possibleTypesService.types()) {
                        final SapphireActionHandler addActionHandler = new AddActionHandler(memberType);
                        addActionHandler.init(addAction, null);
                        addActionHandler.attach(addActionHandlerListener);
                        addActionHandlers.add(addActionHandler);
                        addAction.addHandler(addActionHandler);
                    }
                }
            };

            refreshAddActionHandlersOp.run();

            final org.eclipse.sapphire.Listener possibleTypesServiceListener = new org.eclipse.sapphire.Listener() {
                @Override
                public void handle(final org.eclipse.sapphire.Event event) {
                    refreshAddActionHandlersOp.run();
                }
            };

            possibleTypesService.attach(possibleTypesServiceListener);

            addOnDisposeOperation(new Runnable() {
                public void run() {
                    addAction.removeHandlers(addActionHandlers);

                    for (SapphireActionHandler addActionHandler : addActionHandlers) {
                        addActionHandler.dispose();
                    }

                    possibleTypesService.detach(possibleTypesServiceListener);
                }
            });
        }

        if (this.exposeDeleteAction) {
            final SapphireAction deleteAction = actions.getAction(ACTION_DELETE);
            final SapphireActionHandler deleteActionHandler = new DeleteActionHandler();
            deleteActionHandler.init(deleteAction, null);
            deleteAction.addHandler(deleteActionHandler);

            addOnDisposeOperation(new Runnable() {
                public void run() {
                    deleteAction.removeHandler(deleteActionHandler);
                }
            });
        }

        if (!property.definition().hasAnnotation(FixedOrderList.class)) {
            final SapphireAction moveUpAction = actions.getAction(ACTION_MOVE_UP);
            final SapphireActionHandler moveUpActionHandler = new MoveUpActionHandler();
            moveUpActionHandler.init(moveUpAction, null);
            moveUpAction.addHandler(moveUpActionHandler);

            addOnDisposeOperation(new Runnable() {
                public void run() {
                    moveUpAction.removeHandler(moveUpActionHandler);
                }
            });

            final SapphireAction moveDownAction = actions.getAction(ACTION_MOVE_DOWN);
            final SapphireActionHandler moveDownActionHandler = new MoveDownActionHandler();
            moveDownActionHandler.init(moveDownAction, null);
            moveDownAction.addHandler(moveDownActionHandler);

            addOnDisposeOperation(new Runnable() {
                public void run() {
                    moveDownAction.removeHandler(moveDownActionHandler);
                }
            });

            final org.eclipse.sapphire.Listener moveActionHandlerListener = new org.eclipse.sapphire.Listener() {
                @Override
                public void handle(final org.eclipse.sapphire.Event event) {
                    if (event instanceof PostExecuteEvent) {
                        DefaultListPropertyEditorRenderer.this.refreshOperation.run();

                        // This is a workaround for a weird problem on SWT on Windows. If modifier keys are pressed
                        // when the list is re-ordered (as in when issuing move up or move down command from the
                        // keyboard), the focused row can detached from selected row.

                        final Element element = getSelectedElement();
                        final TableItem[] items = DefaultListPropertyEditorRenderer.this.table.getItems();

                        for (int i = 0; i < items.length; i++) {
                            if (items[i].getData() == element) {
                                DefaultListPropertyEditorRenderer.this.table.setSelection(i);
                                break;
                            }
                        }
                    }
                }
            };

            moveUpAction.attach(moveActionHandlerListener);
            moveDownAction.attach(moveActionHandlerListener);

            final ModelElementsTransfer transfer = new ModelElementsTransfer(
                    getModelElement().type().getModelElementClass().getClassLoader());
            final Transfer[] transfers = new Transfer[] { transfer };

            final DragSource dragSource = new DragSource(this.table, DND.DROP_MOVE);
            dragSource.setTransfer(transfers);

            final List<Element> dragElements = new ArrayList<Element>();

            dragSource.addDragListener(new DragSourceListener() {
                public void dragStart(final DragSourceEvent event) {
                    if (DefaultListPropertyEditorRenderer.this.tableViewer.getComparator() == null) {
                        dragElements.addAll(getSelectedElements());
                        event.doit = true;
                    } else {
                        event.doit = false;
                    }
                }

                public void dragSetData(final DragSourceEvent event) {
                    event.data = dragElements;
                }

                public void dragFinished(final DragSourceEvent event) {
                    if (event.detail == DND.DROP_MOVE) {
                        // When drop target is the same editor as drag source, the drop handler takes care of removing
                        // elements from their original location. The following block of code accounts for the case when 
                        // dropping into another editor.

                        boolean droppedIntoAnotherEditor = false;

                        for (Element dragElement : dragElements) {
                            if (!dragElement.disposed()) {
                                droppedIntoAnotherEditor = true;
                                break;
                            }
                        }

                        if (droppedIntoAnotherEditor) {
                            try {
                                final Element selectionPostDelete = findSelectionPostDelete(getList(),
                                        dragElements);

                                for (Element dragElement : dragElements) {
                                    final ElementList<?> dragElementContainer = (ElementList<?>) dragElement
                                            .parent();
                                    dragElementContainer.remove(dragElement);
                                }

                                setSelectedElement(selectionPostDelete);
                            } catch (Exception e) {
                                // Log this exception unless the cause is EditFailedException. These exception
                                // are the result of the user declining a particular action that is necessary
                                // before the edit can happen (such as making a file writable).

                                final EditFailedException editFailedException = EditFailedException
                                        .findAsCause(e);

                                if (editFailedException == null) {
                                    SapphireUiFrameworkPlugin.log(e);
                                }
                            }
                        }
                    }

                    dragElements.clear();
                }
            });

            final DropTarget target = new DropTarget(this.table, DND.DROP_MOVE);
            target.setTransfer(transfers);

            target.addDropListener(new DropTargetAdapter() {
                public void dragOver(final DropTargetEvent event) {
                    if (event.item != null) {
                        final TableItem dragOverItem = (TableItem) event.item;

                        final Point pt = dragOverItem.getDisplay().map(null,
                                DefaultListPropertyEditorRenderer.this.table, event.x, event.y);
                        final Rectangle bounds = dragOverItem.getBounds();

                        if (pt.y < bounds.y + bounds.height / 2) {
                            event.feedback = DND.FEEDBACK_INSERT_BEFORE;
                        } else {
                            event.feedback = DND.FEEDBACK_INSERT_AFTER;
                        }
                    }

                    event.feedback |= DND.FEEDBACK_SCROLL;
                }

                @SuppressWarnings("unchecked")

                public void drop(final DropTargetEvent event) {
                    if (event.data == null) {
                        event.detail = DND.DROP_NONE;
                        return;
                    }

                    final List<Element> droppedElements = (List<Element>) event.data;
                    final Set<ElementType> possibleTypesService = property.service(PossibleTypesService.class)
                            .types();

                    for (Element droppedElement : droppedElements) {
                        if (!possibleTypesService.contains(droppedElement.type())) {
                            event.detail = DND.DROP_NONE;
                            return;
                        }
                    }

                    final ElementList<?> list = getList();

                    int position;

                    if (event.item == null) {
                        position = list.size();
                    } else {
                        final TableItem dropTargetItem = (TableItem) event.item;
                        final TableRow dropTargetRow = (TableRow) dropTargetItem.getData();
                        final Element dropTargetElement = dropTargetRow.element();

                        final Point pt = DefaultListPropertyEditorRenderer.this.table.getDisplay().map(null,
                                DefaultListPropertyEditorRenderer.this.table, event.x, event.y);
                        final Rectangle bounds = dropTargetItem.getBounds();

                        position = list.indexOf(dropTargetElement);

                        if (pt.y >= bounds.y + bounds.height / 2) {
                            position++;
                        }
                    }

                    try {
                        for (Element dragElement : dragElements) {
                            final ElementList<?> dragElementContainer = (ElementList<?>) dragElement.parent();

                            if (dragElementContainer == list
                                    && dragElementContainer.indexOf(dragElement) < position) {
                                position--;
                            }

                            dragElementContainer.remove(dragElement);
                        }

                        final List<Element> newSelection = new ArrayList<Element>();

                        for (Element droppedElement : droppedElements) {
                            final Element insertedElement = list.insert(droppedElement.type(), position);
                            insertedElement.copy(droppedElement);

                            newSelection.add(insertedElement);

                            position++;
                        }

                        DefaultListPropertyEditorRenderer.this.tableViewer.refresh();
                        setSelectedElements(newSelection);
                    } catch (Exception e) {
                        // Log this exception unless the cause is EditFailedException. These exception
                        // are the result of the user declining a particular action that is necessary
                        // before the edit can happen (such as making a file writable).

                        final EditFailedException editFailedException = EditFailedException.findAsCause(e);

                        if (editFailedException == null) {
                            SapphireUiFrameworkPlugin.log(e);
                        }

                        event.detail = DND.DROP_NONE;
                    }
                }
            });
        }
    }

    final boolean toolBarNeeded = toolBarActionsPresentation.hasActions();

    mainComposite.setLayout(glayout((toolBarNeeded ? 2 : 1), 0, 0, 0, 0));

    if (toolBarNeeded) {
        final ToolBar toolbar = new ToolBar(mainComposite, SWT.FLAT | SWT.VERTICAL);
        toolbar.setLayoutData(gdvfill());
        toolBarActionsPresentation.setToolBar(toolbar);
        toolBarActionsPresentation.render();
        addControl(toolbar);
        this.decorator.addEditorControl(toolbar);
    }

    if (menuActionsPresentation.hasActions()) {
        final Menu menu = new Menu(this.table);
        this.table.setMenu(menu);
        menuActionsPresentation.setMenu(menu);
        menuActionsPresentation.render();
    }

    final HyperlinkTable hyperlinkTable = new HyperlinkTable(this.table, actions);

    hyperlinkTable.setController(new HyperlinkTable.Controller() {
        @Override
        public boolean isHyperlinkEnabled(final TableItem item, final int column) {
            final SapphireActionHandler jumpHandler = getJumpHandler(item, column);

            if (jumpHandler != null) {
                return jumpHandler.isEnabled();
            }

            return false;
        }

        @Override
        public void handleHyperlinkEvent(final TableItem item, final int column) {
            final SapphireActionHandler jumpHandler = getJumpHandler(item, column);

            if (jumpHandler != null) {
                jumpHandler.execute(DefaultListPropertyEditorRenderer.this.context);
            }
        }

        private SapphireActionHandler getJumpHandler(final TableItem item, final int column) {
            final Element element = ((TableRow) item.getData()).element();
            final ModelPath property = part.getChildProperties().get(column);
            final PropertyEditorPart propertyEditor = part.getChildPropertyEditor(element, property);
            final SapphireActionGroup actions = propertyEditor.getActions();
            return actions.getAction(ACTION_JUMP).getFirstActiveHandler();
        }
    });

    suppressDashedTableEntryBorder(this.table);

    addControl(this.table);

    addOnDisposeOperation(new Runnable() {
        public void run() {
            selectionService.detach(selectionServiceListener);
        }
    });

    return this.table;
}

From source file:org.jkiss.dbeaver.ui.controls.itemlist.ObjectListControl.java

License:Open Source License

public ObjectListControl(Composite parent, int style, IContentProvider contentProvider) {
    super(parent, style);
    this.isFitWidth = false;

    int viewerStyle = getDefaultListStyle();
    if ((style & SWT.SHEET) == 0) {
        viewerStyle |= SWT.BORDER;//  w w  w  .  java  2s .co  m
    }

    EditorActivationStrategy editorActivationStrategy;
    final SelectionAdapter enterListener = new SelectionAdapter() {
        @Override
        public void widgetDefaultSelected(SelectionEvent e) {
            if (doubleClickHandler != null) {
                doubleClickHandler.doubleClick(new DoubleClickEvent(itemsViewer, itemsViewer.getSelection()));
            }
        }
    };
    if (contentProvider instanceof ITreeContentProvider) {
        TreeViewer treeViewer = new TreeViewer(this, viewerStyle);
        final Tree tree = treeViewer.getTree();
        tree.setLinesVisible(true);
        tree.setHeaderVisible(true);
        itemsViewer = treeViewer;
        editorActivationStrategy = new EditorActivationStrategy(treeViewer);
        TreeViewerEditor.create(treeViewer, editorActivationStrategy, ColumnViewerEditor.TABBING_CYCLE_IN_ROW);
        // We need measure item listener to prevent collapse/expand on double click
        // Looks like a bug in SWT: http://www.eclipse.org/forums/index.php/t/257325/
        treeViewer.getControl().addListener(SWT.MeasureItem, new Listener() {
            @Override
            public void handleEvent(Event event) {
                // Just do nothing
            }
        });
        tree.addSelectionListener(enterListener);
    } else {
        TableViewer tableViewer = new TableViewer(this, viewerStyle);
        final Table table = tableViewer.getTable();
        table.setLinesVisible(true);
        table.setHeaderVisible(true);
        itemsViewer = tableViewer;
        //UIUtils.applyCustomTolTips(table);
        //itemsEditor = new TableEditor(table);
        editorActivationStrategy = new EditorActivationStrategy(tableViewer);
        TableViewerEditor.create(tableViewer, editorActivationStrategy,
                ColumnViewerEditor.TABBING_CYCLE_IN_ROW);
        table.addSelectionListener(enterListener);
    }
    //editorActivationStrategy.setEnableEditorActivationWithKeyboard(true);
    renderer = createRenderer();
    itemsViewer.getColumnViewerEditor().addEditorActivationListener(new EditorActivationListener());

    itemsViewer.setContentProvider(contentProvider);
    //itemsViewer.setLabelProvider(new ItemLabelProvider());
    itemsViewer.getControl().addMouseListener(new MouseAdapter() {
        @Override
        public void mouseDoubleClick(MouseEvent e) {
            if (doubleClickHandler != null) {
                // Uee provided double click
                doubleClickHandler.doubleClick(new DoubleClickEvent(itemsViewer, itemsViewer.getSelection()));
            }
        }
    });
    itemsViewer.getControl().addListener(SWT.PaintItem, new PaintListener());
    GridData gd = new GridData(GridData.FILL_BOTH);
    itemsViewer.getControl().setLayoutData(gd);
    //PropertiesContributor.getInstance().addLazyListener(this);

    // Add selection listener
    itemsViewer.addSelectionChangedListener(new ISelectionChangedListener() {
        @Override
        public void selectionChanged(SelectionChangedEvent event) {
            IStructuredSelection selection = (IStructuredSelection) event.getSelection();
            if (selection.isEmpty()) {
                setCurListObject(null);
            } else {
                setCurListObject((OBJECT_TYPE) selection.getFirstElement());
            }

            String status;
            if (selection.isEmpty()) {
                status = ""; //$NON-NLS-1$
            } else if (selection.size() == 1) {
                Object selectedNode = selection.getFirstElement();
                status = ObjectViewerRenderer.getCellString(selectedNode, false);
            } else {
                status = NLS.bind(CoreMessages.controls_object_list_status_objects, selection.size());
            }
            setInfo(status);
        }
    });
}