com.archimatetool.editor.views.tree.TreeModelViewer.java Source code

Java tutorial

Introduction

Here is the source code for com.archimatetool.editor.views.tree.TreeModelViewer.java

Source

/**
 * This program and the accompanying materials
 * are made available under the terms of the License
 * which accompanies this distribution in the file LICENSE.txt
 */
package com.archimatetool.editor.views.tree;

import java.util.ArrayList;
import java.util.List;

import org.eclipse.emf.ecore.EObject;
import org.eclipse.jface.resource.JFaceResources;
import org.eclipse.jface.viewers.IColorProvider;
import org.eclipse.jface.viewers.IFontProvider;
import org.eclipse.jface.viewers.ITreeContentProvider;
import org.eclipse.jface.viewers.LabelProvider;
import org.eclipse.jface.viewers.TreeViewer;
import org.eclipse.jface.viewers.Viewer;
import org.eclipse.jface.viewers.ViewerFilter;
import org.eclipse.jface.viewers.ViewerSorter;
import org.eclipse.swt.SWT;
import org.eclipse.swt.graphics.Color;
import org.eclipse.swt.graphics.Font;
import org.eclipse.swt.graphics.Image;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.TreeItem;
import org.eclipse.swt.widgets.Widget;

import com.archimatetool.editor.model.DiagramModelUtils;
import com.archimatetool.editor.model.IEditorModelManager;
import com.archimatetool.editor.ui.ArchimateLabelProvider;
import com.archimatetool.editor.views.tree.search.SearchFilter;
import com.archimatetool.model.FolderType;
import com.archimatetool.model.IArchimateElement;
import com.archimatetool.model.IArchimateModel;
import com.archimatetool.model.IFolder;
import com.archimatetool.model.IRelationship;

/**
 * Tree Viewer for Model Tree View
 * 
 * @author Phillip Beauvoir
 */
public class TreeModelViewer extends TreeViewer {

    private TreeCellEditor fCellEditor;

    /**
     * Show elements as grey if not in Viewpoint
     */
    private TreeViewpointFilterProvider fViewpointFilterProvider;

    public TreeModelViewer(Composite parent, int style) {
        super(parent, style | SWT.MULTI);

        setContentProvider(new ModelTreeViewerContentProvider());
        setLabelProvider(new ModelTreeViewerLabelProvider());

        setUseHashlookup(true);

        // Sort
        setSorter(new ViewerSorter() {
            @SuppressWarnings("unchecked")
            @Override
            public int compare(Viewer viewer, Object e1, Object e2) {
                int cat1 = category(e1);
                int cat2 = category(e2);

                if (cat1 != cat2) {
                    return cat1 - cat2;
                }

                // Only user folders are sorted
                if ((e1 instanceof IFolder && e2 instanceof IFolder) && (((IFolder) e1).getType() != FolderType.USER
                        || ((IFolder) e2).getType() != FolderType.USER)) {
                    return 0;
                }

                String name1 = ArchimateLabelProvider.INSTANCE.getLabel(e1);
                String name2 = ArchimateLabelProvider.INSTANCE.getLabel(e2);

                if (name1 == null) {
                    name1 = "";//$NON-NLS-1$
                }
                if (name2 == null) {
                    name2 = "";//$NON-NLS-1$
                }

                return getComparator().compare(name1, name2);
            }

            @Override
            public int category(Object element) {
                if (element instanceof IFolder) {
                    return 0;
                }
                if (element instanceof EObject) {
                    return 1;
                }
                return 0;
            }
        });

        // Cell Editor
        fCellEditor = new TreeCellEditor(getTree());

        // Filter
        fViewpointFilterProvider = new TreeViewpointFilterProvider(this);
    }

    /**
     * Edit an element on the tree
     * @param element the element to be edited
     */
    public void editElement(Object element) {
        TreeItem item = findTreeItem(element);
        if (item != null) {
            fCellEditor.editItem(item);
        }
    }

    @Override
    public void refresh(Object element) {
        if (fCellEditor != null && fCellEditor.isEditing()) {
            fCellEditor.cancelEditing();
        }
        super.refresh(element);
    }

    @Override
    public void refresh(Object element, boolean updateLabels) {
        if (fCellEditor != null && fCellEditor.isEditing()) {
            fCellEditor.cancelEditing();
        }
        super.refresh(element, updateLabels);
    }

    /**
     * Finds the widget which represents the given element.
     * @param element the element
     * @return the TreeItem or null
     */
    public TreeItem findTreeItem(Object element) {
        Widget item = findItem(element);
        return (TreeItem) (item instanceof TreeItem ? item : null);
    }

    /**
     * @return The Search Filter or null if not filtering
     */
    protected SearchFilter getSearchFilter() {
        for (ViewerFilter filter : getFilters()) {
            if (filter instanceof SearchFilter) {
                return (SearchFilter) filter;
            }
        }

        return null;
    }

    /**
     *  Content Provider
     */
    private class ModelTreeViewerContentProvider implements ITreeContentProvider {

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

        public void dispose() {
        }

        public Object[] getElements(Object parent) {
            return getChildren(parent);
        }

        public Object[] getChildren(Object parentElement) {
            if (parentElement instanceof IEditorModelManager) {
                return ((IEditorModelManager) parentElement).getModels().toArray();
            }

            if (parentElement instanceof IArchimateModel) {
                return ((IArchimateModel) parentElement).getFolders().toArray();
            }

            if (parentElement instanceof IFolder) {
                List<Object> list = new ArrayList<Object>();

                // Folders
                list.addAll(((IFolder) parentElement).getFolders());
                // Elements
                list.addAll(((IFolder) parentElement).getElements());

                return list.toArray();
            }

            return new Object[0];
        }

        public Object getParent(Object element) {
            if (element instanceof EObject) {
                return ((EObject) element).eContainer();
            }
            return null;
        }

        public boolean hasChildren(Object element) {
            return getFilteredChildren(element).length > 0;
        }
    }

    /**
     * Label Provider
     */
    private class ModelTreeViewerLabelProvider extends LabelProvider implements IFontProvider, IColorProvider {
        Font fontItalic = JFaceResources.getFontRegistry().getItalic(""); //$NON-NLS-1$
        Font fontBold = JFaceResources.getFontRegistry().getBold(""); //$NON-NLS-1$

        @Override
        public String getText(Object element) {
            String name = ArchimateLabelProvider.INSTANCE.getLabel(element);

            // If a dirty model show asterisk
            if (element instanceof IArchimateModel) {
                IArchimateModel model = (IArchimateModel) element;
                if (IEditorModelManager.INSTANCE.isModelDirty(model)) {
                    name = "*" + name; //$NON-NLS-1$
                }
            }

            if (element instanceof IRelationship) {
                IRelationship relationship = (IRelationship) element;
                name += " ("; //$NON-NLS-1$
                name += ArchimateLabelProvider.INSTANCE.getLabel(relationship.getSource());
                name += " - "; //$NON-NLS-1$
                name += ArchimateLabelProvider.INSTANCE.getLabel(relationship.getTarget());
                name += ")"; //$NON-NLS-1$
            }

            return name;
        }

        @Override
        public Image getImage(Object element) {
            return ArchimateLabelProvider.INSTANCE.getImage(element);
        }

        @Override
        public Font getFont(Object element) {
            SearchFilter filter = getSearchFilter();
            if (filter != null && filter.isFiltering() && filter.matchesFilter(element)) {
                return fontBold;
            }

            if (element instanceof IArchimateElement) {
                if (!DiagramModelUtils.isElementReferencedInDiagrams((IArchimateElement) element)) {
                    return fontItalic;
                }
            }

            return null;
        }

        @Override
        public Color getForeground(Object element) {
            return fViewpointFilterProvider.getTextColor(element);
        }

        @Override
        public Color getBackground(Object element) {
            return null;
        }
    }
}