com.nokia.tools.screen.ui.views.ResourcePositionViewer.java Source code

Java tutorial

Introduction

Here is the source code for com.nokia.tools.screen.ui.views.ResourcePositionViewer.java

Source

/*
* Copyright (c) 2006-2010 Nokia Corporation and/or its subsidiary(-ies). 
* All rights reserved.
* This component and the accompanying materials are made available
* under the terms of "Eclipse Public License v1.0"
* which accompanies this distribution, and is available
* at the URL "http://www.eclipse.org/legal/epl-v10.html".
*
* Initial Contributors:
* Nokia Corporation - initial contribution.
*
* Contributors:
*
* Description:
*
*/
package com.nokia.tools.screen.ui.views;

import java.util.List;
import java.util.Map;

import org.eclipse.draw2d.Clickable;
import org.eclipse.draw2d.ColorConstants;
import org.eclipse.draw2d.Graphics;
import org.eclipse.draw2d.IFigure;
import org.eclipse.draw2d.Label;
import org.eclipse.draw2d.SchemeBorder;
import org.eclipse.draw2d.ScrollBar;
import org.eclipse.draw2d.ScrollPane;
import org.eclipse.draw2d.ToolbarLayout;
import org.eclipse.draw2d.geometry.Insets;
import org.eclipse.draw2d.text.FlowPage;
import org.eclipse.draw2d.text.ParagraphTextLayout;
import org.eclipse.draw2d.text.TextFlow;
import org.eclipse.gef.EditPart;
import org.eclipse.gef.palette.CombinedTemplateCreationEntry;
import org.eclipse.gef.palette.PaletteContainer;
import org.eclipse.gef.palette.PaletteDrawer;
import org.eclipse.gef.palette.PaletteRoot;
import org.eclipse.gef.palette.ToolEntry;
import org.eclipse.jface.action.IMenuListener;
import org.eclipse.jface.action.MenuManager;
import org.eclipse.jface.resource.ImageDescriptor;
import org.eclipse.jface.viewers.ISelection;
import org.eclipse.jface.viewers.ISelectionChangedListener;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.jface.viewers.SelectionChangedEvent;
import org.eclipse.swt.SWT;
import org.eclipse.swt.graphics.Color;
import org.eclipse.swt.graphics.GC;
import org.eclipse.swt.graphics.Image;
import org.eclipse.swt.graphics.ImageData;
import org.eclipse.swt.graphics.Rectangle;
import org.eclipse.swt.widgets.Display;

import com.nokia.tools.content.core.ContentAttribute;
import com.nokia.tools.content.core.IContent;
import com.nokia.tools.content.core.IContentData;
import com.nokia.tools.screen.ui.utils.ScreenUtil;

/**
 * This viewer displays the element's position on the screen.
 * 
 */
public class ResourcePositionViewer extends EarlyDisposablePaletteViewer {
    private static final int COLOR = SWT.COLOR_DARK_GRAY;
    private String selectedId = null;
    private Clickable lastSelected = null;
    private int lastScrollY = 0;
    private int tempScrollY = 0;

    private IContentData data;

    private int width = 55;

    public void clearPositionData() {
        selectedId = null;
        lastSelected = null;
        lastScrollY = 0;
        tempScrollY = 0;
    }

    public ResourcePositionViewer(final ResourcePage page) {
        addSelectionChangedListener(new ISelectionChangedListener() {
            public void selectionChanged(SelectionChangedEvent e) {
                ISelection selection = e.getSelection();
                if (selection instanceof IStructuredSelection
                        && ((IStructuredSelection) selection).getFirstElement() instanceof EditPart) {
                    EditPart selectedPart = (EditPart) ((IStructuredSelection) selection).getFirstElement();
                    if (selectedPart.getModel() instanceof ToolEntry) {
                        Map visualPartMap = getVisualPartMap();
                        for (Object obj : visualPartMap.keySet()) {
                            IFigure fig = (IFigure) obj;
                            EditPart part = (EditPart) visualPartMap.get(fig);
                            if (part.getModel() instanceof ToolEntry) {
                                // to persist the selection after Copy/Paste and
                                // similar actions
                                if (lastSelected != null) {
                                    lastSelected.getModel().setArmed(false);
                                    lastSelected.getModel().setPressed(false);

                                    IFigure labelFigure = (IFigure) ((IFigure) lastSelected).getChildren().get(0);
                                    labelFigure.setBorder(null);
                                }
                                Clickable button = (Clickable) fig;
                                IFigure image = (IFigure) ((IFigure) button.getChildren().get(0)).getChildren()
                                        .get(0);
                                button.getModel().setArmed(part == selectedPart);
                                button.getModel().setPressed(part == selectedPart);

                                if (part == selectedPart) {
                                    // for selection persistence
                                    IFigure tooltip = ((IFigure) (button.getChildren().get(0))).getToolTip();
                                    if (tooltip != null)
                                        selectedId = ((Label) tooltip).getText();
                                    // for scroll persistence
                                    if (button.getParent().getParent().getParent() instanceof ScrollPane) {
                                        ScrollPane scrollPane = (ScrollPane) button.getParent().getParent()
                                                .getParent();
                                        ScrollBar scrollBar = scrollPane.getVerticalScrollBar();
                                        lastScrollY = scrollBar.getValue();
                                        tempScrollY = lastScrollY;
                                    }
                                }

                            }
                        }
                    }
                }
            }
        });

    }

    public void addMenuListeners(List<IMenuListener> listeners) {
        MenuManager mmgr = new MenuManager();
        mmgr.setRemoveAllWhenShown(true);

        for (IMenuListener listener : listeners) {
            if (listener != null) {
                mmgr.addMenuListener(listener);
            }
        }
        setContextMenu(mmgr);
    }

    /**
     * @param data The data to set.
     */
    public synchronized void setData(IContent content, IContentData data) {
        if (data == null || data instanceof IContent) {
            setContents(null);
            this.data = null;
            return;
        }
        this.data = data;
        setPaletteRoot(createPaletteRoot(content));
        updateFigures(content);
    }

    /**
     * @return Returns the data.
     */
    public IContentData getData() {
        return data;
    }

    /**
     * @return Returns the width.
     */
    public int getWidth() {
        return width;
    }

    /**
     * @param width The width to set.
     */
    public void setWidth(int width) {
        this.width = width;
    }

    protected void updateFigures(IContent content) {
        Map visualPartMap = getVisualPartMap();
        for (Object obj : visualPartMap.keySet()) {
            IFigure fig = (IFigure) obj;
            EditPart part = (EditPart) visualPartMap.get(fig);
            if (part.getModel() instanceof PaletteDrawer) {
                List children = fig.getChildren();

                ToolbarLayout drawerLayout = (ToolbarLayout) fig.getLayoutManager();
                drawerLayout.setMinorAlignment(ToolbarLayout.ALIGN_CENTER);

                IFigure f = (IFigure) children.get(0);
                if (f instanceof Clickable) {
                    ((Clickable) f).setEnabled(false);
                    f.setBorder(null);
                    // removes the default figures (icon + label + pin)
                    f.remove((IFigure) f.getChildren().get(0));
                    FlowPage page = new FlowPage();
                    TextFlow text = new TextFlow(
                            content == null ? ViewMessages.ResourceView_NoTheme : data.getName());
                    ParagraphTextLayout l = new ParagraphTextLayout(text, ParagraphTextLayout.WORD_WRAP_SOFT);
                    text.setLayoutManager(l);
                    page.add(text);
                    f.add(page, 0);

                }

                for (Object child : children) {
                    IFigure childFig = (IFigure) child;
                    if (childFig instanceof ScrollPane) {
                        IFigure viewport = (IFigure) childFig.getChildren().get(0);
                        final IFigure entriesFig = (IFigure) viewport.getChildren().get(0);
                        // for scroll persistence after Copy/Paste and similar
                        // actions
                        tempScrollY = lastScrollY;
                        /**
                         * custom paint border that repaints whole area with the
                         * same color-pattern as in pressed pallete entry and
                         * then to fulfill IFigure painting, renders children on
                         * top of invalidated client area
                         */
                        entriesFig.setBorder(new SchemeBorder(SchemeBorder.SCHEMES.LOWERED) {

                            /*
                             * (non-Javadoc)
                             * 
                             * @see org.eclipse.draw2d.SchemeBorder#paint(org.eclipse.draw2d.Graphics,
                             *      org.eclipse.draw2d.IFigure,
                             *      org.eclipse.draw2d.geometry.Insets,
                             *      org.eclipse.swt.graphics.Color[],
                             *      org.eclipse.swt.graphics.Color[])
                             */
                            @Override
                            protected void paint(Graphics graphics, IFigure fig, Insets insets, Color[] tl,
                                    Color[] br) {
                                org.eclipse.draw2d.geometry.Rectangle rect = getPaintRectangle(fig, insets);

                                super.paint(graphics, fig, insets, tl, br);

                                /*
                                 * pattern interfearing with parent loaded
                                 * patern but dot by dot works
                                 */
                                graphics.setForegroundColor(ColorConstants.white);
                                for (int j = 1; j < rect.height - 2; j++)
                                    for (int i = 1; i < rect.width - 2; i += 2)
                                        graphics.drawPoint(i + rect.x + (j + rect.y) % 2, j + rect.y);
                                /*
                                 * children repainting taken from default figure
                                 * painting since border painting comes after
                                 * children painting - now children repeated
                                 * after border repaint
                                 */
                                IFigure child;
                                org.eclipse.draw2d.geometry.Rectangle clip = org.eclipse.draw2d.geometry.Rectangle.SINGLETON;
                                for (int i = 0; i < entriesFig.getChildren().size(); i++) {
                                    child = (IFigure) entriesFig.getChildren().get(i);
                                    if (child.isVisible() && child.intersects(graphics.getClip(clip))) {
                                        graphics.clipRect(child.getBounds());
                                        child.paint(graphics);
                                        graphics.restoreState();
                                    }
                                }
                                if (tempScrollY != 0) { // for scroll
                                    // persistence
                                    ((ScrollPane) entriesFig.getParent().getParent())
                                            .scrollVerticalTo(ResourcePositionViewer.this.tempScrollY);
                                    tempScrollY = 0;

                                }
                            }
                        });

                        entriesFig.setOpaque(true);

                        ToolbarLayout layout = (ToolbarLayout) entriesFig.getLayoutManager();

                        // increases the spacing
                        layout.setSpacing(10);

                        for (Object entry : entriesFig.getChildren()) {
                            IFigure labelFigure = (IFigure) ((IFigure) entry).getChildren().get(0);
                            // removes the default label figure which takes the
                            // extra space
                            labelFigure.remove((IFigure) labelFigure.getChildren().get(1));

                            String dataId = ((IContentData) ((CombinedTemplateCreationEntry) ((EditPart) visualPartMap
                                    .get(entry)).getModel()).getTemplate()).getName();

                            if (dataId == selectedId) {
                                Clickable button = (Clickable) entry;

                                button.getModel().setArmed(true);
                                button.getModel().setPressed(true);
                                lastSelected = button;

                            }
                            labelFigure.setToolTip(new Label(
                                    ((IContentData) ((CombinedTemplateCreationEntry) ((EditPart) visualPartMap
                                            .get(entry)).getModel()).getTemplate()).getName()));
                            labelFigure.setCursor(Display.getDefault().getSystemCursor(SWT.CURSOR_HAND));
                        }
                    }
                }
            }
        }
    }

    /**
     * Creates the palette root, which contains the categories and the
     * subcategories.
     * 
     * @return the created palette root.
     */
    protected PaletteRoot createPaletteRoot(IContent content) {
        PaletteRoot root = new PaletteRoot();
        PaletteContainer container = new PaletteDrawer(
                content == null ? ViewMessages.ResourceView_NoTheme : data.getName());

        if (content != null && data != null) {
            for (IContentData child : data.getChildren()) {
                ImageDescriptor desc = createImageDescriptor(child);
                container.add(new CombinedTemplateCreationEntry("", "", child, null, desc, desc));
            }
        }
        root.add(container);
        return root;
    }

    IResourceViewRectProvider rectProvider;

    protected ImageDescriptor createImageDescriptor(IContentData data) {
        if (rectProvider == null) {
            return null;
        } else {
            IContentData firstChild = data.getChildren()[0];
            IContentData screen = ScreenUtil.getScreenForData(firstChild, false);

            java.awt.Rectangle awtRec;
            if (screen != null) {
                awtRec = (java.awt.Rectangle) screen.getAttribute(ContentAttribute.BOUNDS.name());
            } else {
                awtRec = rectProvider.getResolution(data);
            }
            double scale = awtRec.width / (double) width;
            Rectangle resolutionRectangle = changeRec(awtRec, scale);

            java.awt.Rectangle dataRec = (java.awt.Rectangle) firstChild
                    .getAttribute(ContentAttribute.BOUNDS.name());
            if (dataRec == null) {
                dataRec = rectProvider.getCategoryHighlightRect(data);
            }
            Rectangle rec = changeRec(dataRec, scale);
            rec.width = Math.max(2, rec.width);
            rec.height = Math.max(2, rec.height);

            Rectangle recSize = new Rectangle(0, 0, resolutionRectangle.width + 2, resolutionRectangle.height + 2);
            Rectangle border1 = new Rectangle(1, 1, resolutionRectangle.width, resolutionRectangle.height);

            Image image = new Image(Display.getDefault(), recSize);
            GC gc = new GC(image);
            gc.setBackground(Display.getDefault()
                    .getSystemColor(new Boolean((String) data.getAttribute(ContentAttribute.MODIFIED.name()))
                            ? IIDEConstants.COLOR_OVERRIDE
                            : COLOR));
            gc.setForeground(Display.getDefault().getSystemColor(SWT.COLOR_DARK_GRAY));
            gc.fillRectangle(rec);
            gc.drawRectangle(border1);
            gc.dispose();
            ImageData imageData = image.getImageData();
            image.dispose();

            ImageDescriptor descriptor = ImageDescriptor.createFromImageData(imageData);
            addImageDescriptorToDispose(descriptor);
            return descriptor;
        }

    }

    /**
     * Coverts java.awt.Rectangle to org.eclipse.swt.graphics.Rectangle and
     * change it's (x,y) to (1,1)
     */
    private Rectangle changeRec(java.awt.Rectangle awtRec, double scale) {
        return new Rectangle(intValue(awtRec.x, scale) + 1, intValue(awtRec.y, scale) + 1,
                intValue(awtRec.width, scale), intValue(awtRec.height, scale));
    }

    private int intValue(int i, double scale) {
        if (scale == 0) {
            return i;
        }
        Double dob = i / scale;
        return dob.intValue();
    }
}