com.sympedia.density.gen.ui.internal.views.InstanceDetailsView.java Source code

Java tutorial

Introduction

Here is the source code for com.sympedia.density.gen.ui.internal.views.InstanceDetailsView.java

Source

/***************************************************************************
 * Copyright (c) 2006 Eike Stepper, Fuggerstr. 39, 10777 Berlin, Germany.
 * 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:
 *    Eike Stepper - initial API and implementation
 **************************************************************************/
package com.sympedia.density.gen.ui.internal.views;

import com.sympedia.density.IComponent;
import com.sympedia.density.gen.ui.internal.Activator;
import com.sympedia.density.gen.ui.internal.draw2d.InstanceFigure;
import com.sympedia.density.impl.Component_Base;

import com.sympedia.util.BeanHelper;
import com.sympedia.util.StringHelper;

import org.eclipse.jface.action.Action;
import org.eclipse.jface.action.IMenuListener;
import org.eclipse.jface.action.IMenuManager;
import org.eclipse.jface.action.IToolBarManager;
import org.eclipse.jface.action.MenuManager;
import org.eclipse.jface.action.Separator;
import org.eclipse.jface.viewers.ColumnWeightData;
import org.eclipse.jface.viewers.IStructuredContentProvider;
import org.eclipse.jface.viewers.ITableLabelProvider;
import org.eclipse.jface.viewers.LabelProvider;
import org.eclipse.jface.viewers.TableLayout;
import org.eclipse.jface.viewers.TableViewer;
import org.eclipse.jface.viewers.Viewer;
import org.eclipse.swt.SWT;
import org.eclipse.swt.graphics.Image;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Menu;
import org.eclipse.swt.widgets.Table;
import org.eclipse.swt.widgets.TableColumn;
import org.eclipse.ui.IActionBars;
import org.eclipse.ui.IWorkbenchActionConstants;
import org.eclipse.ui.part.ViewPart;

import java.lang.reflect.Field;
import java.lang.reflect.Modifier;
import java.util.ArrayList;
import java.util.List;

public class InstanceDetailsView extends ViewPart {
    public static InstanceDetailsView INSTANCE;

    private TableViewer viewer;

    private Action showQualifiedNamesAction;

    private IComponent currentInstance;

    private TableColumn header;

    public InstanceDetailsView() {
    }

    public void createPartControl(Composite parent) {
        viewer = new TableViewer(parent, SWT.MULTI | SWT.H_SCROLL | SWT.V_SCROLL);
        viewer.setContentProvider(new ViewContentProvider());
        viewer.setLabelProvider(new ViewLabelProvider());

        TableLayout layout = new TableLayout();
        Table table = viewer.getTable();
        table.setHeaderVisible(true);
        table.setLayout(layout);

        layout.addColumnData(new ColumnWeightData(1, 128));
        header = new TableColumn(table, SWT.NONE, 0);
        header.setResizable(true);
        header.setText("Current Instance:");

        layout.addColumnData(new ColumnWeightData(5, 1024));
        header = new TableColumn(table, SWT.NONE, 1);
        header.setResizable(true);
        header.setImage(ContainerMonitorView.getImageDesc("Deployment").createImage());

        makeActions();
        hookContextMenu();
        contributeToActionBars();
        INSTANCE = this;

        if (ContainerMonitorView.INSTANCE != null) {
            InstanceFigure figure = ContainerMonitorView.INSTANCE.getCurrentFigure();
            setCurrentInstance(figure == null ? null : (IComponent) figure.getData());
        }

    }

    @Override
    public void dispose() {
        INSTANCE = null;
        super.dispose();
    }

    public IComponent getCurrentInstance() {
        return currentInstance;
    }

    public void setCurrentInstance(IComponent instance) {
        if (instance == currentInstance)
            return;
        currentInstance = instance;
        if (viewer != null && !viewer.getControl().isDisposed()) {
            viewer.setInput(currentInstance);
            header.setText(currentInstance != null ? currentInstance.toString() : "");
        }
    }

    private void hookContextMenu() {
        MenuManager menuMgr = new MenuManager("#PopupMenu");
        menuMgr.setRemoveAllWhenShown(true);
        menuMgr.addMenuListener(new IMenuListener() {
            public void menuAboutToShow(IMenuManager manager) {
                InstanceDetailsView.this.fillContextMenu(manager);
            }
        });

        Menu menu = menuMgr.createContextMenu(viewer.getControl());
        viewer.getControl().setMenu(menu);
        getSite().registerContextMenu(menuMgr, viewer);
    }

    private void contributeToActionBars() {
        IActionBars bars = getViewSite().getActionBars();
        fillLocalPullDown(bars.getMenuManager());
        fillLocalToolBar(bars.getToolBarManager());
    }

    private void fillLocalPullDown(IMenuManager manager) {
        manager.add(showQualifiedNamesAction);
        manager.add(new Separator(IWorkbenchActionConstants.MB_ADDITIONS));
    }

    private void fillContextMenu(IMenuManager manager) {
        manager.add(new Separator(IWorkbenchActionConstants.MB_ADDITIONS));
    }

    private void fillLocalToolBar(IToolBarManager manager) {
        manager.add(showQualifiedNamesAction);
        manager.add(new Separator(IWorkbenchActionConstants.MB_ADDITIONS));
    }

    private void makeActions() {
        showQualifiedNamesAction = new Action("Show Qualified Names", SWT.TOGGLE) {
            public void run() {
                viewer.refresh(true);
            }
        };

        showQualifiedNamesAction.setToolTipText(showQualifiedNamesAction.getText());
        showQualifiedNamesAction.setImageDescriptor(Activator.getImageDescriptor("icons/EClass.gif"));
    }

    public void setFocus() {
        viewer.getControl().setFocus();
    }

    public class ViewContentProvider implements IStructuredContentProvider {
        public void inputChanged(Viewer v, Object oldInput, Object newInput) {
        }

        public void dispose() {
        }

        public Object[] getElements(Object parent) {
            if (parent instanceof IComponent) {
                List<String> result = new ArrayList<String>();
                List<Field> fields = BeanHelper.getAllDeclaredFields(parent.getClass(), Component_Base.class);
                for (Field field : fields) {
                    if ((field.getModifiers() & Modifier.STATIC) != 0)
                        continue;
                    if ((field.getModifiers() & Modifier.TRANSIENT) != 0)
                        continue;
                    if ((field.getModifiers() & Modifier.VOLATILE) != 0)
                        continue;
                    boolean old = field.isAccessible();
                    if (!old)
                        field.setAccessible(true);

                    try {
                        Object value = field.get(parent);
                        String name = field.getName();
                        if (showQualifiedNamesAction.isChecked()) {
                            name = field.getDeclaringClass().getName() + "." + name;
                        }

                        boolean primitive = BeanHelper.isPrimitive(field.getType());
                        result.add((primitive ? "" : "*") + name + " = " + value);
                    } catch (Exception ignore) {
                        ignore.printStackTrace();
                    } finally {
                        if (!old)
                            field.setAccessible(false);
                    }
                }

                return result.toArray(new String[result.size()]);
            }

            return new Object[0];
        }
    }

    public static class ViewLabelProvider extends LabelProvider implements ITableLabelProvider {
        private Image parameterImage;

        private Image referenceImage;

        public ViewLabelProvider() {
            parameterImage = ContainerMonitorView.getImageDesc("Parameter").createImage();
            referenceImage = ContainerMonitorView.getImageDesc("NormalRef").createImage();
        }

        public String getColumnText(Object obj, int index) {
            String text = getText(obj);
            text = StringHelper.removePrefix(text, "*");
            int pos = text.indexOf("=");
            if (pos != -1) {
                if (index == 0) {
                    text = text.substring(0, pos).trim();
                } else if (index == 1) {
                    text = text.substring(pos + 1).trim();
                }
            }

            return text;
        }

        public Image getColumnImage(Object obj, int index) {
            if (index == 1) {
                return getImage(obj);
            }

            return null;
        }

        public Image getImage(Object obj) {
            String text = getText(obj);
            return text.startsWith("*") ? referenceImage : parameterImage;
        }
    }
}