com.generalrobotix.ui.view.GrxItemView.java Source code

Java tutorial

Introduction

Here is the source code for com.generalrobotix.ui.view.GrxItemView.java

Source

/*
 * Copyright (c) 2008, AIST, the University of Tokyo and General Robotix Inc.
 * All rights reserved. This program is 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:
 * General Robotix Inc.
 * National Institute of Advanced Industrial Science and Technology (AIST)
 */
/*
 *  GrxItemView.java
 *
 *  Copyright (C) 2007 GeneralRobotix, Inc.
 *  All Rights Reserved
 *
 *  @author Yuichiro Kawasumi (General Robotix, Inc.)
 */

package com.generalrobotix.ui.view;

import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.Vector;
import java.util.Iterator;

import org.eclipse.jface.action.Action;
import org.eclipse.jface.action.MenuManager;
import org.eclipse.jface.viewers.ISelection;
import org.eclipse.jface.viewers.ISelectionChangedListener;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.jface.viewers.ITreeContentProvider;
import org.eclipse.jface.viewers.IViewerLabelProvider;
import org.eclipse.jface.viewers.LabelProvider;
import org.eclipse.jface.viewers.SelectionChangedEvent;
import org.eclipse.jface.viewers.StructuredSelection;
import org.eclipse.jface.viewers.TreeViewer;
import org.eclipse.jface.viewers.Viewer;
import org.eclipse.jface.viewers.ViewerLabel;

import org.eclipse.swt.SWT;
import org.eclipse.swt.graphics.Image;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Event;
import org.eclipse.swt.widgets.Listener;
import org.eclipse.swt.widgets.Tree;
import org.eclipse.ui.ISharedImages;
import org.eclipse.ui.PlatformUI;

import com.generalrobotix.ui.GrxBaseItem;
import com.generalrobotix.ui.GrxBaseView;
import com.generalrobotix.ui.GrxBasePlugin;
import com.generalrobotix.ui.GrxBaseViewPart;
import com.generalrobotix.ui.GrxPluginManager;
import com.generalrobotix.ui.grxui.Activator;
import com.generalrobotix.ui.item.GrxExtraJointItem;
import com.generalrobotix.ui.item.GrxHwcItem;
import com.generalrobotix.ui.item.GrxLinkItem;
import com.generalrobotix.ui.item.GrxModeInfoItem;
import com.generalrobotix.ui.item.GrxModelItem;
import com.generalrobotix.ui.item.GrxProjectItem;
import com.generalrobotix.ui.item.GrxSegmentItem;
import com.generalrobotix.ui.item.GrxSensorItem;
import com.generalrobotix.ui.item.GrxTransformItem;
import com.generalrobotix.ui.util.OrderedHashMap;

@SuppressWarnings("serial")
/**
 * @brief This view shows tree of various items
 */
public class GrxItemView extends GrxBaseView {

    GrxItemViewPart vp;

    TreeViewer tv;
    MenuManager menuMgr = new MenuManager();

    private List<GrxBasePlugin> baseItems_ = new ArrayList<GrxBasePlugin>();

    /**
     * @brief constructor
     * @param name name of this view
     * @param manager PluginManager
     * @param vp
     * @param parent
     */
    @SuppressWarnings("unchecked")
    public GrxItemView(String name, GrxPluginManager manager, GrxBaseViewPart vp, Composite parent) {
        super(name, manager, vp, parent);

        tv = new TreeViewer(composite_);
        tv.setContentProvider(new TreeContentProvider());
        tv.setLabelProvider(new TreeLabelProvider());

        Tree t = tv.getTree();

        // When an item is left-clicked, the item becomes "current item".
        tv.addSelectionChangedListener(new ISelectionChangedListener() {
            public void selectionChanged(SelectionChangedEvent event) {
                ISelection selection = event.getSelection();
                for (Object o : ((IStructuredSelection) selection).toArray()) {
                    if (GrxBaseItem.class.isAssignableFrom(o.getClass())) {
                        manager_.focusedItem((GrxBaseItem) o);
                    } else if (o instanceof String) {
                        manager_.focusedItem(manager_.getProject());
                    }
                }
            }
        });
        // ???
        t.addListener(SWT.DefaultSelection, new Listener() {
            public void handleEvent(Event event) {
                ISelection selection = tv.getSelection();
                for (Object o : ((IStructuredSelection) selection).toArray()) {
                    if (GrxBaseItem.class.isAssignableFrom(o.getClass())) {
                        manager_.setSelectedItem((GrxBaseItem) o, !((GrxBaseItem) o).isSelected());
                    }
                }
            }
        });

        // ?
        t.setMenu(menuMgr.createContextMenu(t));
        t.addListener(SWT.MenuDetect, new Listener() {
            public void handleEvent(Event event) {
                ISelection selection = tv.getSelection();
                Object o = ((IStructuredSelection) selection).getFirstElement();
                menuMgr.removeAll(); // ????

                // project name
                if (o instanceof String) {
                    Vector<Action> menus = manager_.getProject().getMenu();
                    for (Action a : menus) {
                        menuMgr.add(a);
                    }
                }

                // ?
                if (Class.class.isAssignableFrom(o.getClass())) {
                    if (GrxBaseItem.class.isAssignableFrom((Class<?>) o)) {
                        Vector<Action> menus = manager_.getItemMenu((Class<? extends GrxBaseItem>) o);
                        for (Action a : menus) {
                            menuMgr.add(a);
                        }
                    }
                }
                // ?
                if (GrxBasePlugin.class.isAssignableFrom(o.getClass())) {
                    Vector<Action> menus = ((GrxBasePlugin) o).getMenu();
                    for (Action a : menus) {
                        menuMgr.add(a);
                    }
                    Vector<MenuManager> subMenus = ((GrxBasePlugin) o).getSubMenu();
                    for (MenuManager m : subMenus) {
                        menuMgr.add(m);
                    }
                }
            }
        });

        // ?
        tv.setInput(manager_);

        manager_.registerItemChangeListener(this, GrxBaseItem.class);
        setUp();
    }

    public void setUp() {
        Iterator<GrxBasePlugin> it0 = baseItems_.iterator();
        while (it0.hasNext())
            it0.next().deleteObserver(this);
        baseItems_.clear();
        GrxModeInfoItem mode = manager_.getMode();
        Iterator<Class<? extends GrxBaseItem>> it = mode.activeItemClassList_.listIterator();
        while (it.hasNext()) {
            Class<? extends GrxBaseItem> local = (Class<? extends GrxBaseItem>) it.next();
            if (manager_.isItemVisible(local)) {
                Map<String, ?> map = (Map<String, ?>) manager_.getItemMap(local);
                Iterator itI = map.values().iterator();
                while (itI.hasNext()) {
                    GrxBaseItem baseItem = (GrxBaseItem) itI.next();
                    baseItems_.add(baseItem);
                    baseItem.addObserver(this);
                    if (baseItem instanceof GrxModelItem) {
                        GrxModelItem model = (GrxModelItem) baseItem;
                        GrxLinkItem root = model.rootLink();
                        if (root != null) {
                            addchildrenObserver(root);
                        }
                    }
                }
            }
        }
        GrxProjectItem projectItem = manager_.getProject();
        if (!projectItem.getObserver().contains(this))
            projectItem.addObserver(this);
        updateTree();
    }

    private void addchildrenObserver(GrxBaseItem item) {
        baseItems_.add(item);
        item.addObserver(this);
        Vector<GrxTransformItem> children = ((GrxTransformItem) item).children_;
        for (int i = 0; i < children.size(); i++) {
            addchildrenObserver(children.get(i));
        }
    }

    /**
     * @brief
     */
    class TreeContentProvider implements ITreeContentProvider {

        Object[] gets(Object o) {
            // root(PluginManager) -> ??
            if (o instanceof GrxPluginManager) {
                Object[] os = { ((GrxPluginManager) o).getProjectName() };
                return os;
            }

            // ?? -> ??
            if (o instanceof String) {
                GrxModeInfoItem mode = manager_.getMode();

                ArrayList<Class<? extends GrxBaseItem>> localList = new ArrayList<Class<? extends GrxBaseItem>>();
                Iterator<Class<? extends GrxBaseItem>> it = mode.activeItemClassList_.listIterator();
                //grxuirc.xml?grxui.mode.item.visible??visible?true???????
                while (it.hasNext()) {
                    Class<? extends GrxBaseItem> local = (Class<? extends GrxBaseItem>) it.next();
                    if (manager_.isItemVisible(local)) {
                        localList.add(local);
                    }
                }
                return localList.toArray();
            }

            // ? -> ?
            if (o instanceof Class) {
                if (GrxBaseItem.class.isAssignableFrom((Class<?>) o)) {
                    OrderedHashMap oMap = manager_.pluginMap_.get(o);
                    return oMap.values().toArray();
                }
            }
            // GrxModelItem -> ??
            if (o instanceof GrxModelItem) {
                GrxModelItem model = (GrxModelItem) o;
                if (model.rootLink() != null) {
                    //Object[] os = {((GrxModelItem)o).rootLink()};
                    Vector<GrxExtraJointItem> extraJointList = ((GrxModelItem) o).extraJoints_;
                    Object[] os = new Object[extraJointList.size() + 1];
                    os[0] = ((GrxModelItem) o).rootLink();
                    for (int i = 0; i < extraJointList.size(); i++)
                        os[i + 1] = extraJointList.get(i);
                    return os;
                } else {
                    return null;
                }
            }
            // GrxLinkItem -> ??,??
            if (o instanceof GrxLinkItem) {
                GrxLinkItem link = (GrxLinkItem) o;
                return link.children_.toArray();
            }

            // GrxLinkItem -> ???
            if (o instanceof GrxSegmentItem) {
                GrxSegmentItem link = (GrxSegmentItem) o;
                return link.children_.toArray();
            }

            // GrxSensorItem -> ???
            if (o instanceof GrxSensorItem) {
                GrxSensorItem sensor = (GrxSensorItem) o;
                return sensor.children_.toArray();
            }

            // GrxHwcItem -> ???
            if (o instanceof GrxHwcItem) {
                GrxHwcItem hwc = (GrxHwcItem) o;
                return hwc.children_.toArray();
            }

            // ???
            return null;
        }

        public Object[] getChildren(Object parentElement) {
            return gets(parentElement);
        }

        public Object getParent(Object element) {
            return null;
        }

        public boolean hasChildren(Object element) {
            Object[] os = gets(element);
            return os != null && os.length > 0;
        }

        public Object[] getElements(Object inputElement) {
            return gets(inputElement);
        }

        public void dispose() {
        }

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

    /**
     * @brief
     */
    class TreeLabelProvider extends LabelProvider implements IViewerLabelProvider {

        public String getText(Object object) {
            // ?
            if (object instanceof Class) {
                if (GrxBaseItem.class.isAssignableFrom((Class<?>) object)) {
                    return manager_.getItemTitle((Class<? extends GrxBaseItem>) object);
                }
                // ?
            } else {
                if (GrxBaseItem.class.isAssignableFrom(object.getClass())) {
                    return ((GrxBaseItem) object).getName();
                }
            }
            // Other
            return object.toString();
        }

        public Image getImage(Object o) {
            if (GrxBaseItem.class.isAssignableFrom(o.getClass())) {
                if (((GrxBaseItem) o).getIcon() == null)
                    return PlatformUI.getWorkbench().getSharedImages().getImage(ISharedImages.IMG_OBJ_FILE);
                return ((GrxBaseItem) o).getIcon();
            }
            return PlatformUI.getWorkbench().getSharedImages().getImage(ISharedImages.IMG_OBJ_FOLDER);
        }

        public void updateLabel(ViewerLabel label, Object element) {
            label.setText(getText(element));
            label.setImage(getImage(element));
            if (GrxBaseItem.class.isAssignableFrom(element.getClass())) {
                //?
                if (((GrxBaseItem) element).isSelected()) {
                    label.setForeground(Activator.getDefault().getColor("black"));
                    //??
                } else {
                    label.setForeground(Activator.getDefault().getColor("gray"));
                    label.setText("(" + getText(element) + ")");
                }
            }
        }
    }

    /**
     * @brief
     */
    public void updateTree() {
        tv.refresh();
        tv.expandToLevel(3);
    }

    public void update(GrxBasePlugin plugin, Object... arg) {
        if ((String) arg[0] != "PropertyChange")
            return;
        updateTree();
    }

    public void registerItemChange(GrxBaseItem item, int event) {
        switch (event) {
        case GrxPluginManager.ADD_ITEM:
            if (!baseItems_.contains(item)) {
                item.addObserver(this);
                baseItems_.add(item);
            }
            break;
        case GrxPluginManager.REMOVE_ITEM:
            if (baseItems_.contains(item)) {
                item.deleteObserver(this);
                baseItems_.remove(item);
            }
            break;
        default:
            break;
        }
        updateTree();
        if (event == GrxPluginManager.FOCUSED_ITEM) {
            List<GrxBasePlugin> l = new ArrayList<GrxBasePlugin>();
            l.add(item);
            tv.setSelection(new StructuredSelection(l), true);
        }
    }

    public void shutdown() {
        manager_.removeItemChangeListener(this, GrxBaseItem.class);
        Iterator<GrxBasePlugin> it = baseItems_.iterator();
        while (it.hasNext()) {
            it.next().deleteObserver(this);
        }
        manager_.getProject().deleteObserver(this);
    }

}