com.laex.cg2d.screeneditor.handlers.EditShapeIDDialog.java Source code

Java tutorial

Introduction

Here is the source code for com.laex.cg2d.screeneditor.handlers.EditShapeIDDialog.java

Source

/*
 * Copyright (c) 2012, 2013 Hemanta Sapkota.
 * 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
 *
 * Contributors:
 * Hemanta Sapkota (laex.pearl@gmail.com)
 */
package com.laex.cg2d.screeneditor.handlers;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import org.apache.commons.lang.StringUtils;
import org.eclipse.gef.EditPart;
import org.eclipse.jface.dialogs.IDialogConstants;
import org.eclipse.jface.dialogs.TitleAreaDialog;
import org.eclipse.jface.viewers.CellEditor;
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.IStructuredContentProvider;
import org.eclipse.jface.viewers.ITableLabelProvider;
import org.eclipse.jface.viewers.LabelProvider;
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.Viewer;
import org.eclipse.jface.viewers.ViewerComparator;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.graphics.Image;
import org.eclipse.swt.graphics.Point;
import org.eclipse.swt.layout.FillLayout;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.swt.widgets.Table;
import org.eclipse.swt.widgets.TableColumn;

import com.laex.cg2d.model.EntityManager;
import com.laex.cg2d.model.SharedImages;
import com.laex.cg2d.model.model.IDCreationStrategy;
import com.laex.cg2d.model.model.IDCreationStrategyFactory;
import com.laex.cg2d.model.model.Shape;
import com.laex.cg2d.model.resources.ResourceManager;
import com.laex.cg2d.screeneditor.ScreenEditorUtil;
import com.laex.cg2d.screeneditor.editparts.ShapeEditPart;
import com.laex.cg2d.screeneditor.editparts.tree.ShapeTreeEP;

/**
 * The Class EditShapeIDDialog.
 */
public class EditShapeIDDialog extends TitleAreaDialog {

    /**
     * The Class Comparator.
     */
    private static class Comparator extends ViewerComparator {

        /*
         * (non-Javadoc)
         * 
         * @see
         * org.eclipse.jface.viewers.ViewerComparator#compare(org.eclipse.jface.
         * viewers.Viewer, java.lang.Object, java.lang.Object)
         */
        @Override
        public int compare(Viewer viewer, Object e1, Object e2) {
            String item1 = ((InternalShapeId) e1).newId;
            String item2 = ((InternalShapeId) e2).newId;

            return item2.compareTo(item1);
        }

    }

    /**
     * The Class InternalShapeId.
     */
    class InternalShapeId {

        /** The shape. */
        Shape shape;

        /** The new id. */
        String newId;
    }

    /**
     * The Class TableLabelProvider.
     */
    private class TableLabelProvider extends LabelProvider implements ITableLabelProvider {

        /*
         * (non-Javadoc)
         * 
         * @see
         * org.eclipse.jface.viewers.ITableLabelProvider#getColumnImage(java.lang
         * .Object, int)
         */
        public Image getColumnImage(Object element, int columnIndex) {
            if (columnIndex != 0)
                return null;

            InternalShapeId shp = (InternalShapeId) element;

            switch (shp.shape.getEditorShapeType()) {
            case BACKGROUND_SHAPE:
                return ResourceManager.getImage(shp.shape.getBackgroundResourceFile().getResourceFile());

            case ENTITY_SHAPE:
                Image i = EntityManager.entityManager()
                        .findEntity(shp.shape.getEntityResourceFile().getResourceFile()).getDefaultFrame();
                return ResourceManager.getImageDescriptor(i, 0.5f).createImage();

            case SIMPLE_SHAPE_BOX:
                return SharedImages.BOX.createImage();

            case SIMPLE_SHAPE_CIRCLE:
                return SharedImages.CIRCLE.createImage();

            case SIMPLE_SHAPE_HEDGE:
            case SIMPLE_SHAPE_VEDGE:
                return SharedImages.BOX.createImage();
            }

            return null;
        }

        /*
         * (non-Javadoc)
         * 
         * @see
         * org.eclipse.jface.viewers.ITableLabelProvider#getColumnText(java.lang
         * .Object, int)
         */
        public String getColumnText(Object element, int columnIndex) {
            InternalShapeId shp = (InternalShapeId) element;

            if (columnIndex == 0) {
                return shp.shape.getId();
            }

            return shp.newId;
        }

    }

    /**
     * The Class ContentProvider.
     */
    private static class ContentProvider implements IStructuredContentProvider {

        /*
         * (non-Javadoc)
         * 
         * @see
         * org.eclipse.jface.viewers.IStructuredContentProvider#getElements(java
         * .lang.Object)
         */
        public Object[] getElements(Object inputElement) {
            return ((List<Shape>) inputElement).toArray();
        }

        /*
         * (non-Javadoc)
         * 
         * @see org.eclipse.jface.viewers.IContentProvider#dispose()
         */
        public void dispose() {
        }

        /*
         * (non-Javadoc)
         * 
         * @see
         * org.eclipse.jface.viewers.IContentProvider#inputChanged(org.eclipse.jface
         * .viewers.Viewer, java.lang.Object, java.lang.Object)
         */
        public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
        }
    }

    /** The shape id list. */
    private List<InternalShapeId> shapeIdList = new ArrayList<InternalShapeId>();

    /** The table. */
    private Table table;

    /** The table viewer. */
    private TableViewer tableViewer;

    /** The update id map. */
    private Map<Shape, String> updateIdMap = new HashMap<Shape, String>();

    /**
     * Create the dialog.
     * 
     * @param parentShell
     *          the parent shell
     * @param selectedEditParts
     *          the selected edit parts
     */
    public EditShapeIDDialog(Shell parentShell, List selectedEditParts) {
        super(parentShell);

        for (Object o : selectedEditParts) {

            boolean isShapeEP = (o instanceof ShapeEditPart) || (o instanceof ShapeTreeEP);

            if (!isShapeEP) {
                continue;
            }

            EditPart shpEp = (EditPart) o;
            Shape shp = (Shape) shpEp.getModel();

            InternalShapeId sim = new InternalShapeId();
            sim.shape = shp;
            sim.newId = "";

            shapeIdList.add(sim);
        }
    }

    /**
     * Create contents of the dialog.
     * 
     * @param parent
     *          the parent
     * @return the control
     */
    @Override
    protected Control createDialogArea(Composite parent) {
        setTitle("Change Shape ID");
        setMessage("Update the IDs of shapes");
        Composite area = (Composite) super.createDialogArea(parent);
        Composite container = new Composite(area, SWT.NONE);
        container.setLayout(new FillLayout(SWT.HORIZONTAL));
        container.setLayoutData(new GridData(GridData.FILL_BOTH));

        tableViewer = new TableViewer(container, SWT.BORDER | SWT.FULL_SELECTION);
        table = tableViewer.getTable();
        table.setHeaderVisible(true);
        table.setLinesVisible(true);

        // Tab Editing of Cells.
        TableViewerFocusCellManager focusCellManager = new TableViewerFocusCellManager(tableViewer,
                new FocusCellOwnerDrawHighlighter(tableViewer));
        ColumnViewerEditorActivationStrategy actSupport = new ColumnViewerEditorActivationStrategy(tableViewer) {
            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(tableViewer, focusCellManager, actSupport,
                ColumnViewerEditor.TABBING_HORIZONTAL | ColumnViewerEditor.TABBING_MOVE_TO_ROW_NEIGHBOR
                        | ColumnViewerEditor.TABBING_VERTICAL | ColumnViewerEditor.KEYBOARD_ACTIVATION);

        TableViewerColumn colOldID = new TableViewerColumn(tableViewer, SWT.NONE);
        final TableColumn tblclmnOldId = colOldID.getColumn();
        tblclmnOldId.setWidth(100);
        tblclmnOldId.setText("Old ID");
        tblclmnOldId.addSelectionListener(new SelectionAdapter() {
            @Override
            public void widgetSelected(SelectionEvent e) {
                tableViewer.getTable().setSortColumn(tblclmnOldId);
                tableViewer.refresh();
            }
        });

        TableViewerColumn colNewID = new TableViewerColumn(tableViewer, SWT.NONE);
        TableColumn tblclmnNewId = colNewID.getColumn();
        tblclmnNewId.setWidth(100);
        tblclmnNewId.setText("New ID");
        colNewID.setEditingSupport(new EditingSupport(tableViewer) {

            IDCreationStrategy ics = IDCreationStrategyFactory.getIDCreator(ScreenEditorUtil.getScreenModel());

            private boolean validate(String idToCheck) {

                // Make a copy of list to check, otherwise we will perpetually be
                // validating false
                for (InternalShapeId isi : shapeIdList) {

                    boolean idUsed = ics.isIdUsed(isi.shape.getEditorShapeType(), isi.newId);

                    if (idUsed) {
                        setErrorMessage("ID already exists");
                        getButton(OK).setEnabled(false);
                        return false;
                    }

                }

                setErrorMessage(null);
                getButton(OK).setEnabled(true);
                return true;
            }

            @Override
            protected void setValue(Object element, Object value) {
                ((InternalShapeId) element).newId = value.toString();
                tableViewer.refresh();

                validate(value.toString());
            }

            @Override
            protected Object getValue(Object element) {
                return ((InternalShapeId) element).newId;
            }

            @Override
            protected CellEditor getCellEditor(Object element) {
                TextCellEditor tce = new TextCellEditor(tableViewer.getTable());
                return tce;
            }

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

        tableViewer.setLabelProvider(new TableLabelProvider());
        tableViewer.setContentProvider(new ContentProvider());
        // tableViewer.setComparator(new Comparator());

        tableViewer.setInput(shapeIdList);
        tableViewer.refresh();

        return area;
    }

    /*
     * (non-Javadoc)
     * 
     * @see org.eclipse.jface.dialogs.Dialog#okPressed()
     */
    @Override
    protected void okPressed() {
        updateIdMap.clear();

        for (InternalShapeId s : shapeIdList) {
            if (!StringUtils.isEmpty(s.newId)) {
                updateIdMap.put(s.shape, s.newId);
            }
        }

        super.okPressed();
    }

    /**
     * Gets the update id map.
     * 
     * @return the update id map
     */
    public Map<Shape, String> getUpdateIdMap() {
        return updateIdMap;
    }

    /**
     * Create contents of the button bar.
     * 
     * @param parent
     *          the parent
     */
    @Override
    protected void createButtonsForButtonBar(Composite parent) {
        createButton(parent, IDialogConstants.OK_ID, IDialogConstants.OK_LABEL, false);
        createButton(parent, IDialogConstants.CANCEL_ID, IDialogConstants.CANCEL_LABEL, false);

        getButton(OK).setEnabled(false);
    }

    /**
     * Return the initial size of the dialog.
     * 
     * @return the initial size
     */
    @Override
    protected Point getInitialSize() {
        return new Point(450, 300);
    }

}