com.ultimatetech.cim.views.CIMClassHierarchyView.java Source code

Java tutorial

Introduction

Here is the source code for com.ultimatetech.cim.views.CIMClassHierarchyView.java

Source

/*******************************************************************************
 * Copyright (c) 2006 Ultimate Technology, Inc.
 * 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:
 *     Bojan Vukojevic - initial API and implementation
 *******************************************************************************/
package com.ultimatetech.cim.views;

import java.util.ArrayList;
import java.util.Enumeration;
import java.util.List;
import java.util.Vector;

import javax.wbem.cim.CIMClass;
import javax.wbem.cim.CIMException;
import javax.wbem.cim.CIMMethod;
import javax.wbem.cim.CIMObjectPath;
import javax.wbem.cim.CIMProperty;
import javax.wbem.cim.CIMQualifier;
import javax.wbem.client.CIMClient;

import org.eclipse.core.runtime.Preferences;
import org.eclipse.draw2d.ChopboxAnchor;
import org.eclipse.draw2d.Figure;
import org.eclipse.draw2d.Graphics;
import org.eclipse.draw2d.Label;
import org.eclipse.draw2d.LightweightSystem;
import org.eclipse.draw2d.PolygonDecoration;
import org.eclipse.draw2d.PolylineConnection;
import org.eclipse.draw2d.ScrollPane;
import org.eclipse.draw2d.XYLayout;
import org.eclipse.draw2d.geometry.Rectangle;
import org.eclipse.jface.resource.ImageDescriptor;
import org.eclipse.swt.SWT;
import org.eclipse.swt.graphics.Color;
import org.eclipse.swt.graphics.Font;
import org.eclipse.swt.widgets.Canvas;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.ui.part.ViewPart;

import com.ultimatetech.cim.CIMPlugin;
import com.ultimatetech.cim.graphical.PersistentToolTipListener;
import com.ultimatetech.cim.graphical.UMLCIMClass;
import com.ultimatetech.cim.graphical.UMLCIMClassMouseListener;
import com.ultimatetech.cim.preferences.CIMPreferencePage;
import com.ultimatetech.cim.views.content.CIMConnect;

public class CIMClassHierarchyView extends ViewPart {
    Canvas canvas = null;
    CIMClass cc = null;
    CIMObjectPath cop = null;
    Composite parent = null;
    ScrollPane pane = null;

    public CIMClassHierarchyView() {
        super();
    }

    public void createPartControl(Composite parent) {
        this.parent = parent;
        pane = new ScrollPane();
        pane.setBackgroundColor(new Color(null, 255, 255, 255));
        pane.setScrollBarVisibility(ScrollPane.AUTOMATIC);
        canvas = new Canvas(parent, SWT.BORDER);

        if (cc != null) {
            drawCIMClass();
        }

    }

    private void drawCIMClass() {
        if (cop == null)
            return;
        List<UMLCIMClass> subclasses = new ArrayList<UMLCIMClass>();
        Figure mainClass;
        Preferences pref = CIMPlugin.getDefault().getPluginPreferences();
        CIMClient client = CIMConnect.connect(pref.getString(CIMPreferencePage.PreferenceNames.IS_SECURE),
                pref.getString(CIMPreferencePage.PreferenceNames.CIM_HOST),
                pref.getString(CIMPreferencePage.PreferenceNames.CIM_PORT),
                pref.getString(CIMPreferencePage.PreferenceNames.CIM_NAMESPACE));
        List<CIMClass> subClassList = new ArrayList<CIMClass>();
        try {
            cc = client.getClass(cop, true, true, true, null);
            Enumeration<?> children = client.enumerateClasses(cop);
            while (children != null && children.hasMoreElements()) {
                subClassList.add((CIMClass) children.nextElement());
            }
            LightweightSystem lws = new LightweightSystem(canvas);
            if (pane != null) {
                pane.removeAll();
            }

            pane = new ScrollPane();
            pane.setScrollBarVisibility(ScrollPane.AUTOMATIC);
            pane.setVisible(true);

            Figure contents = new Figure();
            XYLayout contentsLayout = new XYLayout();
            contents.setLayoutManager(contentsLayout);
            Font classFont = new Font(null, "Arial", 10, SWT.BOLD);
            ImageDescriptor id = CIMPlugin.getImageDescriptor("icons/class_obj.gif");
            int y = 10;
            int x = 10;
            int maxy = 10;
            UMLCIMClass f = null;
            for (int i = 0; i < subClassList.size(); i++) {
                f = addClassFigure(contents, contentsLayout, classFont, id, subClassList.get(i),
                        new Color(null, 225, 225, 225), x, y);
                subclasses.add(f);
                x = x + 265;
                int y1 = 40;
                y1 += f.getAttributesCompartment().getChildren().size() * 20;
                y1 += f.getMethodsCompartment().getChildren().size() * 15;
                if (y1 > maxy) {
                    maxy = y1;
                }
            }
            x = x / 2;
            if (maxy > 10)
                maxy += 50;
            y = maxy;

            f = addClassFigure(contents, contentsLayout, classFont, id, cc, null, x, y);
            mainClass = f;
            y += 50 + f.getAttributesCompartment().getChildren().size() * 20;
            y += f.getMethodsCompartment().getChildren().size() * 15;

            //add superclass
            String superclass = cc.getSuperClass();
            CIMObjectPath cop = (CIMObjectPath) cc.getObjectPath().clone();
            cop.setObjectName(superclass);
            CIMClass cimSC = client.getClass(cop, false, true, true, null);
            UMLCIMClass umlSC = addClassFigure(contents, contentsLayout, classFont, id, cimSC,
                    new Color(null, 225, 225, 225), x, y);

            addConnection(contents, (Figure) umlSC, (UMLCIMClass) mainClass, Graphics.LINE_SOLID);

            for (int i = 0; i < subclasses.size(); i++) {
                addConnection(contents, mainClass, subclasses.get(i), Graphics.LINE_SOLID);
            }
            x = 10;
            /*for(int i = 0; i < copList.size(); i++){
               f = addClassFigure(contents, contentsLayout, classFont, id,
                     (CIMClass)copList.get(i), null, x, y);
               addConnection(contents, mainClass, f, Graphics.LINE_DASH);
               x = x + 265;
                   
            }*/
            pane.add(contents);
            pane.setConstraint(contents, new Rectangle(0, 0, -1, -1));
            pane.setContents(contents);
            lws.setContents(pane);
        } catch (CIMException e) {
            e.printStackTrace();
        }
    }

    private void addConnection(Figure contents, Figure mainClass, UMLCIMClass f, int lineStyle) {
        PolylineConnection c = new PolylineConnection();
        ChopboxAnchor sourceAnchor = new ChopboxAnchor(mainClass);
        ChopboxAnchor targetAnchor = new ChopboxAnchor(f);
        c.setSourceAnchor(sourceAnchor);
        c.setTargetAnchor(targetAnchor);
        c.setLineStyle(lineStyle);
        if (lineStyle == Graphics.LINE_SOLID) {
            PolygonDecoration decoration = new PolygonDecoration();
            c.setTargetDecoration(decoration);
        }
        contents.add(c);
    }

    private UMLCIMClass addClassFigure(//ScrollPane contents,
            Figure contents, XYLayout contentsLayout, Font classFont, ImageDescriptor id, CIMClass cc, Color color,
            int x, int y) {
        Label classLabel1 = new Label(cc.getName(), id.createImage());
        classLabel1.setFont(classFont);
        Vector<?> vc = cc.getQualifiers();
        StringBuffer buf = new StringBuffer("");
        makeToolTipText(vc, buf);
        if (!cc.getName().equals(this.cc.getName())) {
            buf.append("\n    >> Double-click to display hierarchy <<");
        }
        //classLabel1.setToolTip(new Label(buf.toString()));
        classLabel1.addMouseMotionListener(new PersistentToolTipListener(classLabel1, buf.toString(), parent));
        classLabel1.addMouseListener(new UMLCIMClassMouseListener(cc));
        //classLabel1.setBackgroundColor(new Color(null, 88, 88, 8));
        UMLCIMClass classFigure = new UMLCIMClass(classLabel1, color, cc, parent);

        //XYLayout contentsLayout = new XYLayout();
        id = CIMPlugin.getImageDescriptor("icons/field_private_obj.gif");
        Vector<?> v = cc.getAllProperties();
        if (v != null) {
            for (int i = 0; i < v.size(); i++) {
                CIMProperty cp = (CIMProperty) v.get(i);
                String pn = cp.getName();
                String type = cp.getType().toMOF();
                Label attribute1 = new Label(pn + ": " + type, id.createImage());
                vc = cp.getQualifiers();
                buf = new StringBuffer("");
                makeToolTipText(vc, buf);
                attribute1
                        .addMouseMotionListener(new PersistentToolTipListener(attribute1, buf.toString(), parent));
                classFigure.getAttributesCompartment().add(attribute1);

            }
        }
        id = CIMPlugin.getImageDescriptor("icons/methpub_obj.gif");
        v = cc.getAllMethods();
        if (v != null) {
            for (int i = 0; i < v.size(); i++) {
                CIMMethod cm = (CIMMethod) v.get(i);
                Label method1 = new Label(cm.getName() + ": " + cm.getType().toMOF(), id.createImage());
                vc = cm.getQualifiers();
                buf = new StringBuffer("");
                makeToolTipText(vc, buf);
                method1.addMouseMotionListener(new PersistentToolTipListener(method1, buf.toString(), parent));
                classFigure.getMethodsCompartment().add(method1);
            }
        }
        contentsLayout.setConstraint(classFigure, new Rectangle(x, y, -1, -1));
        contents.add(classFigure);
        return classFigure;
    }

    /**
     * @param vc
     * @param buf
     */
    private void makeToolTipText(Vector<?> vc, StringBuffer buf) {
        int vs = vc == null ? 0 : vc.size();
        for (int i = 0; i < vs; i++) {
            String q = ((CIMQualifier) vc.get(i)).toMOF();
            if (q.length() > 30) {
                String words[] = q.split(" ");
                StringBuffer xbuf = new StringBuffer("");
                for (int z = 0; z < words.length; z++) {
                    xbuf.append(words[z]).append(" ");
                    if (xbuf.length() > 60) {
                        buf.append(xbuf).append("\n");
                        xbuf = new StringBuffer("");
                    }
                }
                if (xbuf.length() != 0) {
                    buf.append(xbuf).append("\n");
                    xbuf = null;
                }
            } else {
                buf.append(q).append("\n");
            }
        }
        if (buf.length() == 0) {
            buf.append("<No Qualifiers>");
        }
    }

    public void setFocus() {
        // TODO Auto-generated method stub

    }

    public void setCimObjectPath(CIMObjectPath cop) {
        if (canvas != null) {
            if (pane != null) {
                pane.removeAll();
            }
            this.cop = null;
            canvas.redraw();
            canvas.update();
            this.cop = cop;
            drawCIMClass();
            canvas.redraw();
            canvas.update();
        }
        this.cop = cop;
    }

    public CIMObjectPath getCimObjectPath() {
        return cop;
    }

}