net.certiv.fluentmark.tables.TableDialog.java Source code

Java tutorial

Introduction

Here is the source code for net.certiv.fluentmark.tables.TableDialog.java

Source

/*******************************************************************************
 * Copyright (c) 2016 - 2017 Certiv Analytics and others.
 * All rights reserved. This program and the accompanying materials
 * are made available under the terms of the Eclipse Public License v1.0
 * which accompanies this distribution, and is available at
 * http://www.eclipse.org/legal/epl-v10.html
 ******************************************************************************/
package net.certiv.fluentmark.tables;

import org.eclipse.jface.action.Action;
import org.eclipse.jface.action.MenuManager;
import org.eclipse.jface.action.Separator;
import org.eclipse.jface.action.ToolBarManager;
import org.eclipse.jface.dialogs.MessageDialog;
import org.eclipse.jface.layout.GridDataFactory;
import org.eclipse.jface.layout.GridLayoutFactory;
import org.eclipse.jface.viewers.CellEditor;
import org.eclipse.jface.viewers.ColumnLabelProvider;
import org.eclipse.jface.viewers.ColumnViewer;
import org.eclipse.jface.viewers.ColumnViewerEditor;
import org.eclipse.jface.viewers.ColumnViewerEditorActivationEvent;
import org.eclipse.jface.viewers.ColumnViewerEditorActivationStrategy;
import org.eclipse.jface.viewers.EditingSupport;
import org.eclipse.jface.viewers.FocusCellOwnerDrawHighlighter;
import org.eclipse.jface.viewers.TableViewer;
import org.eclipse.jface.viewers.TableViewerColumn;
import org.eclipse.jface.viewers.TableViewerEditor;
import org.eclipse.jface.viewers.TableViewerFocusCellManager;
import org.eclipse.jface.viewers.TextCellEditor;
import org.eclipse.jface.viewers.ViewerCell;
import org.eclipse.swt.SWT;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Table;
import org.eclipse.swt.widgets.TableColumn;
import org.eclipse.swt.widgets.TableItem;
import org.eclipse.swt.widgets.ToolBar;

import net.certiv.fluentmark.FluentMkImages;
import net.certiv.fluentmark.FluentUI;
import net.certiv.fluentmark.model.PagePart;
import net.certiv.fluentmark.tables.TableModel.Row;

public class TableDialog extends MessageDialog {

    public class AlignLeftAction extends Action {

        public AlignLeftAction() {
            super("Left Align");
            setImageDescriptor(FluentUI.getDescriptor(FluentMkImages.DESC_OBJ_LEFT));
        }

        @Override
        public void run() {
            ViewerCell cell = cellMgr.getFocusCell();
            int target = cell != null ? cell.getColumnIndex() : 0;
            target = target < 0 ? tableModel.numCols : target;
            tableModel.aligns[target] = SWT.LEFT;
            recreateCols();
        }
    }

    public class AlignCenterAction extends Action {

        public AlignCenterAction() {
            super("Center Align");
            setImageDescriptor(FluentUI.getDescriptor(FluentMkImages.DESC_OBJ_CENTER));
        }

        @Override
        public void run() {
            ViewerCell cell = cellMgr.getFocusCell();
            int target = cell != null ? cell.getColumnIndex() : 0;
            target = target < 0 ? tableModel.numCols : target;
            tableModel.aligns[target] = SWT.CENTER;
            recreateCols();
        }
    }

    public class AlignRightAction extends Action {

        public AlignRightAction() {
            super("Right Align");
            setImageDescriptor(FluentUI.getDescriptor(FluentMkImages.DESC_OBJ_RIGHT));
        }

        @Override
        public void run() {
            ViewerCell cell = cellMgr.getFocusCell();
            int target = cell != null ? cell.getColumnIndex() : 0;
            target = target < 0 ? tableModel.numCols : target;
            tableModel.aligns[target] = SWT.RIGHT;
            recreateCols();
        }
    }

    public class InsColBeforeAction extends Action {

        public InsColBeforeAction() {
            super("Insert Column Before");
            setImageDescriptor(FluentUI.getDescriptor(FluentMkImages.DESC_OBJ_COL_INS_BEF));
        }

        @Override
        public void run() {
            ViewerCell cell = cellMgr.getFocusCell();
            int target = cell != null ? cell.getColumnIndex() : 0;
            target = target < 0 ? tableModel.numCols : target;
            tableModel.insertCol(target);
            recreateCols();
        }
    }

    public class InsColAfterAction extends Action {

        public InsColAfterAction() {
            super("Insert Column After");
            setImageDescriptor(FluentUI.getDescriptor(FluentMkImages.DESC_OBJ_COL_INS_AFT));
        }

        @Override
        public void run() {
            ViewerCell cell = cellMgr.getFocusCell();
            int target = cell != null ? cell.getColumnIndex() : 0;
            target = target < 0 ? tableModel.numCols : target;
            tableModel.insertCol(target + 1);
            recreateCols();
        }
    }

    public class RmvColAction extends Action {

        public RmvColAction() {
            super("Delete Column");
            setImageDescriptor(FluentUI.getDescriptor(FluentMkImages.DESC_OBJ_COL_DEL));
        }

        @Override
        public void run() {
            ViewerCell cell = cellMgr.getFocusCell();
            int target = cell != null ? cell.getColumnIndex() : 0;
            if (target < 0 || target >= tableModel.numCols)
                return;
            tableModel.removeCol(target);
            recreateCols();
        }
    }

    public class InsRowAboveAction extends Action {

        public InsRowAboveAction() {
            super("Insert Row Above");
            setImageDescriptor(FluentUI.getDescriptor(FluentMkImages.DESC_OBJ_ROW_INS_ABV));
        }

        @Override
        public void run() {
            TableItem[] items = table.getSelection();
            if (items == null || items.length == 0)
                return;
            int target = table.indexOf(items[0]);
            if (target < 1)
                return;

            tableModel.addRow(target + 1);
            viewer.refresh();
        }
    }

    public class InsRowBelowAction extends Action {

        public InsRowBelowAction() {
            super("Insert Row Below");
            setImageDescriptor(FluentUI.getDescriptor(FluentMkImages.DESC_OBJ_ROW_INS_BLW));
        }

        @Override
        public void run() {
            TableItem[] items = table.getSelection();
            if (items == null || items.length == 0)
                return;
            int target = table.indexOf(items[0]);
            if (target < 1)
                return;

            tableModel.addRow(target + 2);
            viewer.refresh();
        }
    }

    public class RmvRowAction extends Action {

        public RmvRowAction() {
            super("Delete Row");
            setImageDescriptor(FluentUI.getDescriptor(FluentMkImages.DESC_OBJ_ROW_DEL));
        }

        @Override
        public void run() {
            TableItem[] items = table.getSelection();
            if (items == null || items.length == 0)
                return;
            int target = table.indexOf(items[0]);
            if (target < 1)
                return;

            tableModel.removeRow(target + 1);
            viewer.refresh();
        }
    }

    private class TableEditingSupport extends EditingSupport {

        private TextCellEditor editor;
        private int idx;

        public TableEditingSupport(ColumnViewer viewer, int idx) {
            super(viewer);
            this.editor = new TextCellEditor((Composite) viewer.getControl());
            this.idx = idx;
        }

        @Override
        protected boolean canEdit(Object element) {
            return element instanceof Row;
        }

        @Override
        protected CellEditor getCellEditor(Object element) {
            return editor;
        }

        @Override
        protected Object getValue(Object element) {
            return ((Row) element).data[idx];
        }

        @Override
        protected void setValue(Object element, Object value) {
            ((Row) element).data[idx] = (String) value;
            viewer.refresh();
        }
    }

    private static final int features = ColumnViewerEditor.TABBING_HORIZONTAL
            | ColumnViewerEditor.TABBING_MOVE_TO_ROW_NEIGHBOR | ColumnViewerEditor.TABBING_VERTICAL
            | ColumnViewerEditor.KEYBOARD_ACTIVATION;

    private PagePart part;
    private int style;

    private TableViewer viewer;
    private Table table;
    private TableModel tableModel;
    private TableViewerFocusCellManager cellMgr;

    /**
     * Creates a new TableDialog with default SWT styles.
     */
    public TableDialog(PagePart part) {
        this(part, SWT.H_SCROLL | SWT.V_SCROLL | SWT.BORDER | SWT.FULL_SELECTION);
    }

    /**
     * Creates a new TableDialog with the given style.
     * 
     * @param editor
     * @param part
     */
    public TableDialog(PagePart part, int style) {
        super(Display.getCurrent().getActiveShell(), "Table Editor", null, null, MessageDialog.NONE,
                new String[] { "Apply", "Cancel" }, 1);
        this.part = part;
        this.style = style;
        setShellStyle(getShellStyle() | SWT.RESIZE);
    }

    public String build() {
        return tableModel.build();
    }

    @Override
    protected Control createCustomArea(final Composite parent) {
        Composite body = new Composite(parent, SWT.NONE);
        GridDataFactory.fillDefaults().grab(true, true).span(2, 1).applyTo(body);
        GridLayoutFactory.fillDefaults().numColumns(2).applyTo(body);

        ToolBar bar = new ToolBar(body, SWT.HORIZONTAL);
        ToolBarManager barMgr = new ToolBarManager(bar);
        barMgr.add(new AlignLeftAction());
        barMgr.add(new AlignCenterAction());
        barMgr.add(new AlignRightAction());
        barMgr.add(new InsColBeforeAction());
        barMgr.add(new InsColAfterAction());
        barMgr.add(new RmvColAction());
        barMgr.add(new InsRowAboveAction());
        barMgr.add(new InsRowBelowAction());
        barMgr.add(new RmvRowAction());
        barMgr.update(true);
        bar.pack();

        viewer = new TableViewer(body, style);
        GridDataFactory.fillDefaults().grab(true, true).span(2, 1).applyTo(viewer.getControl());

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

        cellMgr = new TableViewerFocusCellManager(viewer, new FocusCellOwnerDrawHighlighter(viewer));

        ColumnViewerEditorActivationStrategy activator = new ColumnViewerEditorActivationStrategy(viewer) {

            @Override
            protected boolean isEditorActivationEvent(ColumnViewerEditorActivationEvent event) {
                return event.eventType == ColumnViewerEditorActivationEvent.TRAVERSAL
                        || event.eventType == ColumnViewerEditorActivationEvent.MOUSE_DOUBLE_CLICK_SELECTION
                        || (event.eventType == ColumnViewerEditorActivationEvent.KEY_PRESSED
                                && event.keyCode == SWT.CR)
                        || event.eventType == ColumnViewerEditorActivationEvent.PROGRAMMATIC;
            }
        };

        TableViewerEditor.create(viewer, cellMgr, activator, features);

        MenuManager mgr = new MenuManager();
        mgr.add(new InsColBeforeAction());
        mgr.add(new InsColAfterAction());
        mgr.add(new RmvColAction());
        mgr.add(new Separator());
        mgr.add(new InsRowAboveAction());
        mgr.add(new InsRowBelowAction());
        mgr.add(new RmvRowAction());
        viewer.getControl().setMenu(mgr.createContextMenu(viewer.getControl()));

        tableModel = new TableModel();
        setInput(part);

        return body;
    }

    private void setInput(PagePart part) {
        if (tableModel.load(part)) {
            createColumns();
            TableContentProvider provider = new TableContentProvider(tableModel);
            viewer.setContentProvider(provider);
            viewer.setInput(part);
        }
    }

    private void createColumns() {
        for (int idx = 0; idx < tableModel.numCols; idx++) {
            int align = tableModel.aligns[idx];
            createColumn(idx, align);
        }
    }

    private void createColumn(int idx, int align) {
        TableViewerColumn viewerColumn = new TableViewerColumn(viewer, align, idx);
        viewerColumn.setEditingSupport(new TableEditingSupport(viewer, idx));
        viewerColumn.setLabelProvider(new ColumnLabelProvider() {

            private int col = idx;

            public String getText(Object element) {
                if (element instanceof Row) {
                    return ((Row) element).data[col];
                }
                return super.getText(element);
            }
        });

        TableColumn column = viewerColumn.getColumn();
        column.setResizable(true);
        column.setMoveable(true);

        column.setText(tableModel.headers[idx]);

        int width = convertWidthInCharsToPixels(tableModel.colWidths[idx]);
        width = Math.max(width, 50);
        column.setWidth(width);
    }

    private void recreateCols() {
        int cnt = table.getColumnCount();
        for (int idx = 0; idx < cnt; idx++) {
            table.getColumn(0).dispose();
        }
        createColumns();
        viewer.refresh();
    }
}