fr.imag.adele.cadse.eclipse.view.AbstractCadseTreeViewUI.java Source code

Java tutorial

Introduction

Here is the source code for fr.imag.adele.cadse.eclipse.view.AbstractCadseTreeViewUI.java

Source

/*
 * Licensed to the Apache Software Foundation (ASF) under one
 * or more contributor license agreements.  See the NOTICE file
 * distributed with this work for additional information
 * regarding copyright ownership.  The ASF licenses this file
 * to you under the Apache License, Version 2.0 (the
 * "License"); you may not use this file except in compliance
 * with the License.  You may obtain a copy of the License at
 *
 *   http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing,
 * software distributed under the License is distributed on an
 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
 * KIND, either express or implied.  See the License for the
 * specific language governing permissions and limitations
 * under the License.
 *
 * Copyright (C) 2006-2010 Adele Team/LIG/Grenoble University, France
 */
package fr.imag.adele.cadse.eclipse.view;

import java.util.ArrayList;
import java.util.Collections;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
import java.util.logging.Level;
import java.util.logging.Logger;

import org.eclipse.core.runtime.Assert;
import org.eclipse.jdt.internal.ui.JavaPluginImages;
import org.eclipse.jdt.internal.ui.actions.ActionMessages;
import org.eclipse.jface.action.Action;
import org.eclipse.jface.action.GroupMarker;
import org.eclipse.jface.action.IAction;
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.commands.ActionHandler;
import org.eclipse.jface.viewers.DoubleClickEvent;
import org.eclipse.jface.viewers.IDoubleClickListener;
import org.eclipse.jface.viewers.ISelectionChangedListener;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.jface.viewers.ITreeViewerListener;
import org.eclipse.jface.viewers.SelectionChangedEvent;
import org.eclipse.jface.viewers.StructuredSelection;
import org.eclipse.jface.viewers.TreeExpansionEvent;
import org.eclipse.jface.viewers.TreeViewer;
import org.eclipse.jface.window.IShellProvider;
import org.eclipse.swt.SWT;
import org.eclipse.swt.dnd.DND;
import org.eclipse.swt.dnd.Transfer;
import org.eclipse.swt.events.FocusEvent;
import org.eclipse.swt.events.FocusListener;
import org.eclipse.swt.graphics.Font;
import org.eclipse.swt.graphics.FontData;
import org.eclipse.swt.graphics.Image;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Menu;
import org.eclipse.ui.IActionBars;
import org.eclipse.ui.IMemento;
import org.eclipse.ui.ISharedImages;
import org.eclipse.ui.IViewSite;
import org.eclipse.ui.IWorkbenchActionConstants;
import org.eclipse.ui.IWorkbenchPartSite;
import org.eclipse.ui.IWorkbenchWindow;
import org.eclipse.ui.PartInitException;
import org.eclipse.ui.PlatformUI;
import org.eclipse.ui.actions.ActionContext;
import org.eclipse.ui.handlers.CollapseAllHandler;
import org.eclipse.ui.handlers.IHandlerService;
import org.eclipse.ui.part.DrillDownAdapter;
import org.eclipse.ui.views.properties.IPropertySheetPage;

import fede.plugin.workspace.filters.CustomFiltersActionGroup;
import fede.workspace.tool.view.FieldsPropertySheetPage;
import fede.workspace.tool.view.ItemInViewer;
import fede.workspace.tool.view.ItemInViewerToolTip;
import fede.workspace.tool.view.TreeToolTipListener;
import fede.workspace.tool.view.WSPlugin;
import fede.workspace.tool.view.dnd.ItemTransfer;
import fede.workspace.tool.view.dnd.WSViewDragListener;
import fede.workspace.tool.view.dnd.WSViewDropAdapter;
import fede.workspace.tool.view.menu.ItemActionGroup;
import fede.workspace.tool.view.node.AbstractCadseViewNode;
import fede.workspace.tool.view.node.CadseViewModelController;
import fede.workspace.tool.view.node.ItemNode;
import fede.workspace.tool.view.node.ItemTypeNode;
import fede.workspace.tool.view.node.LinkNode;
import fede.workspace.tool.view.node.LinkTypeNode;
import fede.workspace.tool.view.node.RootNode;
import fede.workspace.tool.view.oper.WSCheckItemInViewer;
import fr.imag.adele.cadse.core.CadseDomain;
import fr.imag.adele.cadse.core.CadseException;
import fr.imag.adele.cadse.core.CadseGCST;
import fr.imag.adele.cadse.core.ChangeID;
import fr.imag.adele.cadse.core.IItemManager;
import fr.imag.adele.cadse.core.IItemNode;
import fr.imag.adele.cadse.core.Item;
import fr.imag.adele.cadse.core.ItemType;
import fr.imag.adele.cadse.core.Link;
import fr.imag.adele.cadse.core.LinkType;
import fr.imag.adele.cadse.core.LogicalWorkspace;
import fr.imag.adele.cadse.core.TypeDefinition;
import fr.imag.adele.cadse.core.WSModelState;
import fr.imag.adele.cadse.core.WorkspaceListener;
import fr.imag.adele.cadse.core.attribute.IAttributeType;
import fr.imag.adele.cadse.core.impl.CadseIllegalArgumentException;
import fr.imag.adele.cadse.core.key.Key;
import fr.imag.adele.cadse.core.oper.WSCheckAttribute;
import fr.imag.adele.cadse.core.oper.WSCheckItem;
import fr.imag.adele.cadse.core.transaction.LogicalWorkspaceTransaction;
import fr.imag.adele.cadse.core.transaction.delta.ImmutableItemDelta;
import fr.imag.adele.cadse.core.transaction.delta.ImmutableWorkspaceDelta;
import fr.imag.adele.cadse.core.transaction.delta.ItemDelta;
import fr.imag.adele.cadse.core.ui.view.NewContext;
import fr.imag.adele.cadse.core.ui.view.ViewDescription;
import fr.imag.adele.cadse.core.ui.view.ViewFilter;
import fr.imag.adele.cadse.util.ArraysUtil;
import fr.imag.adele.fede.workspace.si.view.View;

/**
 * Cette vue repr?sente les item du workspace courant. Nous avons trois mode d'affichage : - aggr?gations; - relations
 * et link - relations et relations inverse. Le menu contextuel a une zone particuli?re. "WS-Actions" pour les actions
 * du workspace.
 */

public abstract class AbstractCadseTreeViewUI extends WorkspaceListener
        implements CadseViewModelController, IViewLinkManager, IViewDisplayConfiguration, ViewDescription {

    static class CollapseAllAction extends Action {

        private final TreeViewer fViewer;

        public CollapseAllAction(TreeViewer viewer) {
            super(ActionMessages.CollapsAllAction_label, JavaPluginImages.DESC_ELCL_COLLAPSEALL);
            setToolTipText(ActionMessages.CollapsAllAction_tooltip);
            setDescription(ActionMessages.CollapsAllAction_description);
            Assert.isNotNull(viewer);
            fViewer = viewer;
        }

        @Override
        public void run() {
            try {
                fViewer.getControl().setRedraw(false);
                fViewer.collapseAll();
            } finally {
                fViewer.getControl().setRedraw(true);
            }
        }

    }

    private final class TreeViewerListener implements ITreeViewerListener {
        public void treeCollapsed(TreeExpansionEvent event) {
            if (event.getElement() instanceof ItemInViewer) {
                IItemNode iiv = (IItemNode) event.getElement();
                iiv.close();
            }

        }

        public void treeExpanded(TreeExpansionEvent event) {
            if (event.getElement() instanceof IItemNode) {
                IItemNode iiv = (IItemNode) event.getElement();
                iiv.open();
            }
        }
    }

    private final class SelectionChangeListener implements ISelectionChangedListener {
        public void selectionChanged(SelectionChangedEvent event) {
            try {
                if (((IStructuredSelection) event.getSelection()).size() == 1) {
                    IItemNode node = (IItemNode) ((IStructuredSelection) event.getSelection()).getFirstElement();
                    if (View.isStarted()) {
                        if (View.getInstance().getTestService().isRecordedTests()) {
                            if (node.getItem() != null) {
                                View.getInstance().getTestService().registerIfNeed(new WSCheckItem(node.getItem()));
                                Item item = node.getItem();
                                IAttributeType<?>[] attributesNames = item.getType().getAllAttributeTypes();
                                for (int i = 0; i < attributesNames.length; i++) {
                                    View.getInstance().getTestService()
                                            .registerIfNeed(new WSCheckAttribute(item, attributesNames[i]));
                                }
                            }
                            View.getInstance().getTestService()
                                    .registerIfNeed(new WSCheckItemInViewer(getViewPart(), node));

                        }
                    }
                }
            } catch (Throwable e) {
            }

        }
    }

    private final class DblClickListener implements IDoubleClickListener {
        public void doubleClick(DoubleClickEvent event) {
            IStructuredSelection sel = (IStructuredSelection) event.getSelection();
            ItemInViewer iiv = (ItemInViewer) sel.getFirstElement();
            if (iiv == null) {
                return;
            }
            Item item = iiv.getItem();
            if (item == null) {
                return;
            }

            IItemManager im = item.getType().getItemManager();
            im.doubleClick(item);

            LogicalWorkspaceTransaction copy = item.getLogicalWorkspace().createTransaction();
            ItemDelta oper = copy.getItem(item.getId());
            if (oper == null) {
                copy.rollback();
            } else {
                oper.doubleClick();
                try {
                    copy.commit();
                } catch (CadseException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
            }

        }
    }

    private ItemActionGroup _actionSet;

    public static final String WS_MB_ADDITIONS = "WS-Actions";

    private static final String KEY_SHOW_LINKTYPE = WSPlugin.NAMESPACE_ID + ".view.SHOW_LINKTYPE"; //$NON-NLS-1$

    private static final String KEY_SHOW_TOOLTIP = WSPlugin.NAMESPACE_ID + ".view.SHOW_TOOLTIP";

    private static final String KEY_SHOW_KIND = WSPlugin.NAMESPACE_ID + ".view.KEY_SHOW_KIND";

    private static final String KEY_SHOW_Incomings = WSPlugin.NAMESPACE_ID + ".view.Incomings";

    private static final String KEY_SHOW_LINK_TYPE_NAME = WSPlugin.NAMESPACE_ID + ".view.KEY_SHOW_LINK_TYPE_NAME";

    protected AbstractCadseViewNode rootWS;

    private DrillDownAdapter drillDownAdapter;

    private TreeViewer fTreeViewer;

    private int _contentProviderFlag = 0;

    private CustomFiltersActionGroup fCustomFiltersActionGroup;

    private ViewContentProvider contentProvider;

    // private Action showLinkType;
    private Action showToolTips;
    private Action showLinkTypeName;
    private Action showKind;
    private Action showIncomings;

    protected boolean _showToolTip = false;

    private TreeToolTipListener toolTipListener = null;

    private boolean _showKind;
    private boolean _showIncomings;

    private boolean _showLinkTypeName;

    private IMemento localMemento;

    protected boolean _isRecomputeChildren = false;

    protected Font italique;

    protected Font gras;

    private final IShellProvider shellprovider;

    private final IWorkbenchWindow workbenchWindow;

    private final IWorkbenchPartSite workbenchPartSite;

    private final IViewSite viewsite;

    private Action refresh;

    private Action openPropertyView;

    private fr.imag.adele.cadse.eclipse.view.AbstractCadseTreeViewUI.CollapseAllAction _collapseAllAction;

    private boolean _init = false;

    /**
     * The constructor.
     */
    public AbstractCadseTreeViewUI(IShellProvider shellprovider, IWorkbenchWindow workbenchWindow,
            IWorkbenchPartSite workbenchPartSite, IViewSite viewsite) {
        rootWS = new RootNode(this);

        add(rootWS);
        this.shellprovider = shellprovider;
        this.workbenchWindow = workbenchWindow;
        this.workbenchPartSite = workbenchPartSite;
        this.viewsite = viewsite;
        setKind(WorkspaceListener.ListenerKind.UI);

    }

    public AbstractCadseTreeViewUI(IViewSite site) {
        rootWS = new RootNode(this);
        add(rootWS);
        this.shellprovider = site;
        this.workbenchWindow = site.getWorkbenchWindow();
        this.workbenchPartSite = site;
        this.viewsite = site;
        setKind(WorkspaceListener.ListenerKind.UI);
    }

    protected void contributeToActionBars() {
        IActionBars bars = getActionBars();
        fillLocalPullDown(bars.getMenuManager());
        fillLocalToolBar(bars.getToolBarManager());
        if (fCustomFiltersActionGroup != null) {
            fCustomFiltersActionGroup.fillActionBars(bars);
        }
        setKind(WorkspaceListener.ListenerKind.UI);
    }

    protected IActionBars getActionBars() {
        return this.getViewSite().getActionBars();
    }

    protected IViewSite getViewSite() {
        return viewsite;
    }

    /**
     * This is a callback that will allow us to create the viewer and initialize it.
     */
    public void createPartControl(final Composite parent) {
        if (View.getInstance() == null) {
            createPartControlWait(parent, "No service view avaible !!!");
        }
        if (View.getInstance() != null && View.getInstance().getWorkspaceDomain() == null) {
            createPartControlWait(parent, "No service cadse domain avaible !!!");
        }
        createControlAfter(parent);
    }

    private void createPartControlWait(final Composite parent, String msg) {

        View.addAfterListener(new ViewAfterInit() {
            public void afterInit() {
                Logger log = Logger.getLogger("Cadseview");
                log.log(Level.WARNING, "register listener (after)");

                View.getInstance().getWorkspaceDomain().getLogicalWorkspace()
                        .addListener(AbstractCadseTreeViewUI.this, 0xFFFFF);
                fTreeViewer.getTree().getDisplay().asyncExec(new Runnable() {
                    @Override
                    public void run() {
                        resetIfNeed(true);
                    }
                });
            }
        });
    }

    public void createControlAfter(Composite parent) {
        if (fTreeViewer != null) {
            return;
        }
        Font f = parent.getFont();
        FontData fd = f.getFontData()[0];
        fd.setStyle(SWT.ITALIC);
        italique = new Font(null, fd);
        fd.setStyle(SWT.BOLD);
        gras = new Font(null, fd);

        // creation du tree viewer.
        fTreeViewer = new TreeViewer(parent, SWT.MULTI | SWT.H_SCROLL | SWT.V_SCROLL);
        drillDownAdapter = new DrillDownAdapter(fTreeViewer);

        contentProvider = new ViewContentProvider(this);
        fTreeViewer.setContentProvider(contentProvider); // gestionnaire de
        // contenu
        fTreeViewer.setLabelProvider(new ViewLabelProvider(this)); // gestionnaire
        // d'affichage
        fTreeViewer.setUseHashlookup(true);
        fTreeViewer.setInput(rootWS);
        fTreeViewer.addTreeListener(new TreeViewerListener());

        fTreeViewer.addDoubleClickListener(new DblClickListener());
        fTreeViewer.addPostSelectionChangedListener(new SelectionChangeListener());

        int ops = DND.DROP_COPY | DND.DROP_MOVE | DND.DROP_LINK | DND.DROP_TARGET_MOVE;
        Transfer[] transfers = new Transfer[] { ItemTransfer.getInstance() };
        fTreeViewer.addDropSupport(ops, transfers, new WSViewDropAdapter(fTreeViewer));

        fTreeViewer.addDragSupport(ops, transfers, new WSViewDragListener(fTreeViewer));
        fTreeViewer.getTree().addFocusListener(new FocusListener() {

            @Override
            public void focusLost(FocusEvent e) {
            }

            @Override
            public void focusGained(FocusEvent e) {
                resetIfNeed(false);
            }
        });
        if (View.getInstance() != null && View.getInstance().getWorkspaceDomain() != null
                && View.getInstance().getWorkspaceDomain().getLogicalWorkspace() != null) {
            View.getInstance().getWorkspaceDomain().getLogicalWorkspace().addListener(this, 0xFFFFF);
            Logger log = Logger.getLogger("Cadseview");
            log.log(Level.WARNING, "register listener");
        } else {
            Logger log = Logger.getLogger("Cadseview");
            log.log(Level.WARNING, "Must register listener after");
        }
        if (getSite() != null) {
            fCustomFiltersActionGroup = new CustomFiltersActionGroup(getSite().getId(), this.fTreeViewer);
            if (localMemento != null) {
                fCustomFiltersActionGroup.restoreState(localMemento);
            }
        } else {
            Logger log = Logger.getLogger("Cadseview");
            log.log(Level.WARNING, "Get site is null, cannot instanciate Custom filter");
        }
        // fTreeViewer.setSorter(new WSViewerSorter());
        setToolTip(getToolTip());
        setSelectionProvider();

        makeActions();
        activateHandlers((IHandlerService) getViewSite().getService(IHandlerService.class));

        hookContextMenu();
        contributeToActionBars();
    }

    protected void resetIfNeed(boolean force) {
        if (_init && !force) {
            return;
        }

        if (View.getInstance() == null) {
            return;
        }
        CadseDomain ws = View.getInstance().getWorkspaceDomain();
        if (ws == null) {
            return;
        }

        LogicalWorkspace lw = ws.getLogicalWorkspace();
        if (lw == null) {
            return;
        }

        if (lw.getState() != WSModelState.RUN) {
            return;
        }

        Logger log = Logger.getLogger("Cadseview");
        log.log(Level.WARNING, "reset view " + this);

        _init = true;
        loadView();
        rootWS.recomputeChildren();
        fTreeViewer.refresh();
    }

    protected void activateHandlers(IHandlerService handlerService) {
        handlerService.activateHandler(CollapseAllHandler.COMMAND_ID, new ActionHandler(_collapseAllAction));
    }

    private void setSelectionProvider() {
        getSite().setSelectionProvider(fTreeViewer);
    }

    public void dispose() {
        if (_actionSet != null) {
            _actionSet.dispose();
        }
        removeListener();
    }

    private void removeListener() {
        if (View.getInstance() != null && View.getInstance().getWorkspaceDomain() != null
                && View.getInstance().getWorkspaceDomain().getLogicalWorkspace() != null) {
            View.getInstance().getWorkspaceDomain().getLogicalWorkspace().removeListener(this);
        }
    }

    public void setToolTip(boolean toolTip) {
        if (toolTipListener != null) {
            toolTipListener.dispose();
            toolTipListener = null;
        }
        this._showToolTip = toolTip;
        if (toolTip) {
            toolTipListener = new TreeToolTipListener(fTreeViewer.getTree(), new ItemInViewerToolTip());
        }

    }

    protected void fillContextMenu(IMenuManager manager) {

        fillActionSet(manager);

        manager.add(new GroupMarker(WS_MB_ADDITIONS));

        // manager.add(new Separator());

        manager.add(showToolTips);
        manager.add(showLinkTypeName);
        manager.add(showKind);
        manager.add(showIncomings);
        fillflags(manager);

        manager.add(new Separator());

        drillDownAdapter.addNavigationActions(manager);
        manager.add(new Separator());

        // Other plug-ins can contribute there actions here
        manager.add(new GroupMarker(IWorkbenchActionConstants.MB_ADDITIONS));
        // manager.add(new Separator());
        manager.add(openPropertyView);
        // PropertyDialogAction a = new PropertyDialogAction(getSite(),
        // fTreeViewer);
        // manager.add(a);
    }

    protected void fillActionSet(IMenuManager manager) {
        _actionSet.setContext(new ActionContext(fTreeViewer.getSelection()));
        _actionSet.fillContextMenu(manager);
        _actionSet.setContext(null);
    }

    protected void fillflags(IMenuManager manager) {

    }

    protected void fillLocalPullDown(IMenuManager manager) {
        // manager.add(showLinkType);
        manager.add(showToolTips);
        manager.add(showLinkTypeName);
        manager.add(showKind);
        manager.add(showIncomings);
        manager.add(refresh);
    }

    protected void fillLocalToolBar(IToolBarManager manager) {
        manager.add(new Separator());
        drillDownAdapter.addNavigationActions(manager);
        manager.add(_collapseAllAction);
    }

    public TreeViewer getFTreeViewer() {
        return fTreeViewer;
    }

    protected void hookContextMenu() {
        MenuManager manager = new MenuManager("#PopupMenu");
        manager.setRemoveAllWhenShown(true);

        manager.addMenuListener(new IMenuListener() {
            public void menuAboutToShow(IMenuManager manager1) {
                AbstractCadseTreeViewUI.this.fillContextMenu(manager1);
            }

        });

        Menu menu = manager.createContextMenu(fTreeViewer.getControl());
        fTreeViewer.getControl().setMenu(menu);
        getSite().registerContextMenu(manager, fTreeViewer);
    }

    protected IWorkbenchPartSite getSite() {
        return workbenchPartSite;
    }

    /**
     * Restore the state of this view : three options : show all items, show the relations "to", show the relations
     * "from"
     */
    public void loadState(IMemento memento) throws PartInitException {
        if (memento != null) {
            Integer i = memento.getInteger(KEY_SHOW_LINKTYPE);
            this._contentProviderFlag = i == null ? 0 : i.intValue();

            i = memento.getInteger(KEY_SHOW_TOOLTIP);
            _showToolTip = (i == null ? false : i.intValue() == 1);

            i = memento.getInteger(KEY_SHOW_KIND);
            _showKind = (i == null ? false : i.intValue() == 1);

            i = memento.getInteger(KEY_SHOW_LINK_TYPE_NAME);
            _showLinkTypeName = (i == null ? false : i.intValue() == 1);

            i = memento.getInteger(KEY_SHOW_Incomings);
            _showIncomings = (i == null ? false : i.intValue() == 1);

            this.localMemento = memento;
        }

    }

    /**
     * Save the state of this view through the sessions : three options : show all items, show the relations "to", show
     * the relations "from"
     */
    public void saveState(IMemento memento) {
        memento.putInteger(KEY_SHOW_LINKTYPE, _contentProviderFlag);
        memento.putInteger(KEY_SHOW_TOOLTIP, getToolTip() ? 1 : 0);
        memento.putInteger(KEY_SHOW_KIND, getShowKind() ? 1 : 0);
        memento.putInteger(KEY_SHOW_Incomings, getShowIncomings() ? 1 : 0);
        memento.putInteger(KEY_SHOW_LINK_TYPE_NAME, getShowLinkTypeName() ? 1 : 0);
        if (fCustomFiltersActionGroup != null) {
            fCustomFiltersActionGroup.saveState(memento);
        }
    }

    // create view actions
    protected void makeActions() {

        _collapseAllAction = new CollapseAllAction(getFTreeViewer());
        _collapseAllAction.setActionDefinitionId(CollapseAllHandler.COMMAND_ID);

        _actionSet = createActionSet();

        openPropertyView = new Action("Open properties view", IAction.AS_PUSH_BUTTON) {

            @Override
            public void run() {
                try {
                    PlatformUI.getWorkbench().getActiveWorkbenchWindow().getActivePage()
                            .showView("org.eclipse.ui.views.PropertySheet");
                } catch (PartInitException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }

            }
        };

        refresh = new Action("refresh", IAction.AS_PUSH_BUTTON) {

            @Override
            public void run() {
                refresh();
            }
        };

        // showLinkType = new Action("Show the name of the links",
        // IAction.AS_CHECK_BOX) {
        // @Override
        // public void run() {
        // _contentProviderFlag = (_contentProviderFlag &
        // ~ItemInViewer.SHOW_RELATION_OUTGOING)
        // | (~_contentProviderFlag & ItemInViewer.SHOW_RELATION_OUTGOING);
        // contentStructreChanged();
        // }
        // };
        // showLinkType.setChecked((_contentProviderFlag &
        // ItemInViewer.SHOW_RELATION_OUTGOING) != 0);
        showToolTips = new Action("Show tool tip", IAction.AS_CHECK_BOX) {
            @Override
            public void run() {
                setToolTip(!getToolTip());
            }
        };
        showToolTips.setChecked(getToolTip());

        showLinkTypeName = new Action("Show link name", IAction.AS_CHECK_BOX) {
            @Override
            public void run() {
                setShowLinkTypeName(!getShowLinkTypeName());
                contentStructreChanged();
            }
        };
        showLinkTypeName.setChecked(getShowLinkTypeName());

        showKind = new Action("Show kind of link", IAction.AS_CHECK_BOX) {
            @Override
            public void run() {
                setShowKind(!getShowKind());
                contentStructreChanged();
            }
        };
        showKind.setChecked(getShowKind());

        showIncomings = new Action("Show incomings links", IAction.AS_CHECK_BOX) {
            @Override
            public void run() {
                setShowIncomings(!getShowIncomings());
                contentStructreChanged();
            }
        };
        showIncomings.setChecked(getShowIncomings());
    }

    protected ItemActionGroup createActionSet() {
        return new ItemActionGroup(this);
    }

    protected ItemActionGroup getActionSet() {
        return _actionSet;
    }

    protected void openEditorItem() {
        // ISelection sel = this.fTreeViewer.getSelection();
        // if (sel == null) return;
        // if (sel.isEmpty()) return;
        // if (!(sel instanceof IStructuredSelection)) return;
        // IStructuredSelection ssel = (IStructuredSelection) sel;
        // Object obj = ssel.getFirstElement();
        // if (obj == null) return;
        // if (!(obj instanceof ItemInViewer)) return;
        //
        // ItemInViewer iiv = (ItemInViewer) obj;
        // Item item = iiv.getItem();
        // if (item == null) return;
        //
        // try {
        // WSPlugin.getDefault().getWorkbench()
        // .getActiveWorkbenchWindow()
        // .getActivePage()
        // .openEditor(new ItemEditorInput(item), ItemEditorPart.ID);
        // } catch (PartInitException e) {
        // // TODO Auto-generated catch block
        // e.printStackTrace();
        // }
    }

    protected void setShowKind(boolean b) {
        _showKind = b;
        updateTree();
    }

    protected boolean getShowKind() {
        return _showKind;
    }

    public void setShowIncomings(boolean b) {
        _showIncomings = b;
        updateTree();
    }

    protected boolean getShowIncomings() {
        return _showIncomings;
    }

    protected void setShowLinkTypeName(boolean b) {
        _showLinkTypeName = b;
        updateTree();
    }

    protected boolean getShowLinkTypeName() {
        return _showLinkTypeName;
    }

    protected boolean getToolTip() {
        return this._showToolTip;
    }

    public void refresh() {
        PlatformUI.getWorkbench().getDisplay().asyncExec(new Runnable() {
            public void run() {
                fTreeViewer.refresh();
            };
        });
    }

    public void reset() {
        // can be null if no CadseDomain
        if (fTreeViewer != null) {
            return;
        }
        rootWS.close();
        rootWS.open();
        fTreeViewer.setInput(rootWS);
        fTreeViewer.setSelection(new StructuredSelection(rootWS));
        fTreeViewer.refresh();
    }

    /**
     * Passing the focus request to the viewer's control.
     */
    public void setFocus() {
        // can be null if no CadseDomain
        if (fTreeViewer != null) {
            fTreeViewer.getControl().setFocus();
        }
    }

    void setContentProviderFlag(int addFlag, int removeflag) {
        int newflag = (_contentProviderFlag | addFlag) & ~removeflag;
        if (newflag != _contentProviderFlag) {
            _contentProviderFlag = newflag;
            contentStructreChanged();
        }
    }

    protected void contentStructreChanged() {
        rootWS.close();
        rootWS.open();
        refresh(rootWS);
    }

    public int getContentProviderFlag() {
        return _contentProviderFlag;
    }

    public void refresh(final AbstractCadseViewNode iiv) {
        if (iiv == null) {
            throw new CadseIllegalArgumentException("The item is null!!!");
        }
        PlatformUI.getWorkbench().getDisplay().asyncExec(new RefreshWSView(fTreeViewer, iiv));
    }

    public void updateTree() {
        PlatformUI.getWorkbench().getDisplay().asyncExec(
                new RefreshWSView(fTreeViewer, Collections.EMPTY_LIST, Collections.singleton(rootWS), true));

    }

    public AbstractCadseViewNode getRootWS() {
        return rootWS;
    }

    @Override
    public void workspaceChanged(final ImmutableWorkspaceDelta wd) {
        if (PlatformUI.getWorkbench().getDisplay().isDisposed()) {
            removeListener();
            return;
        }
        PlatformUI.getWorkbench().getDisplay().syncExec(new Runnable() {
            public void run() {
                Set<IItemNode> refreshStruct = new HashSet<IItemNode>();
                Set<IItemNode> refreshRemoveNode = new HashSet<IItemNode>();
                Set<IItemNode> refreshUpdate = new HashSet<IItemNode>();

                if (wd.currentModelHasState(WSModelState.RUN) || wd.getLoadedItems() != null) {
                    resetIfNeed(wd.getLoadedItems() != null);
                    return;
                }

                for (ImmutableItemDelta itemDelta : wd.getItems()) {

                    if (itemDelta.isDeleted()) {
                        refreshRemoveNode.addAll(getNodeFromElement(itemDelta.getItem()));
                    }
                    for (Link l : itemDelta.getLinksRemoved()) {
                        refreshRemoveNode.addAll(getNodeFromElement(l));
                    }
                    if (itemDelta.isCreated() || itemDelta.isDeleted() || itemDelta.hasResolvedOutgoingLink()
                            || itemDelta.hasUnresolvedOutgoingLink() || itemDelta.hasResolvedIncomingLink()
                            || itemDelta.hasRemovedOutgoingLink()) {

                        refreshStruct.addAll(getParentNode(itemDelta.getItem()));
                        continue;
                    }
                    if (itemDelta.hasSetAttributes()) {
                        refreshUpdate.addAll(getNodeFromElement(itemDelta.getItem()));
                        continue;
                    }
                }
                if (fTreeViewer.getTree().isDisposed()) {
                    return;
                }

                if (refreshRemoveNode.size() != 0) {
                    fTreeViewer.remove(refreshRemoveNode.toArray());
                }
                refreshUpdate.removeAll(refreshRemoveNode);
                if (refreshUpdate.size() != 0) {
                    if (fTreeViewer.getTree().isDisposed()) {
                        return;
                    }
                    fTreeViewer.update(refreshUpdate.toArray(), null);
                }

                for (IItemNode iiv : refreshStruct) {
                    if (iiv.isOpen()) {
                        if (((AbstractCadseViewNode) iiv).recomputeChildren()) {
                            fTreeViewer.refresh(iiv, true);
                        }
                    } else {
                        if (iiv.getParent() != null && iiv.getParent().isOpen()) {
                            fTreeViewer.refresh(iiv, true);
                        }
                    }
                }

            }
        });

    }

    /**
     * You can create item when the view is loaded.
     */
    protected void loadView() {

    }

    public Object getAdapter(Class adapter) {
        if (adapter == IPropertySheetPage.class) {
            return new FieldsPropertySheetPage();
        }
        return null;
    }

    public void refresh(Item item) {
        refresh(rootWS, item);
    }

    private void refresh(AbstractCadseViewNode iiv, Item item) {
        if (iiv.getItem() == item) {
            refresh(iiv);
        }
        if (iiv.hasChildren()) {
            for (AbstractCadseViewNode childIIV : iiv.getChildren()) {
                refresh(childIIV, item);
            }
        }
    }

    public LogicalWorkspace getCadseModel() {
        if (View.getInstance() == null) {
            return null;
        }
        return View.getInstance().getWorkspaceLogique();
    }

    public abstract boolean isItemType(TypeDefinition it, LogicalWorkspace cadseModel);

    public abstract boolean isRefItemType(TypeDefinition it, LogicalWorkspace cadseModel);

    public abstract boolean isFirstItemType(ItemType it, LogicalWorkspace cadseModel);

    public boolean isFirstItem(Item item, LogicalWorkspace cadseModel) {
        return (isFirstItemType(item.getType(), cadseModel));
    }

    public abstract ItemType[] getFirstItemType(LogicalWorkspace cadseModel);

    protected abstract boolean isLink(Link link);

    public abstract boolean isCreateLink(LinkType lt);

    @Deprecated
    public String getDislplayCreate(LinkType link) {
        return null;
    }

    public String getDislplayCreate(LinkType link, ItemType destItemType) {
        return getDislplayCreate(link);
    }

    public abstract boolean isAggregationLink(Link link);

    public Font getDisplayFont(IItemNode node) {
        return this.gras;
    }

    public Font getDisplayFont(LinkNode node) {
        if (node.getLink() != null && !node.getLink().isLinkResolved()) {
            return this.italique;
        }

        return null;
    }

    /*
     * (non-Javadoc)
     * @see fr.imag.adele.cadse.eclipse.view.IViewDisplayConfiguration#getDisplayImage
     * (fede.workspace.tool.view.node.LinkNode)
     */
    public Image getDisplayImage(LinkNode node) {
        Item destination = node.getItem();
        ItemType it = destination.getType();
        Image ret = WSPlugin.getDefault().getImageFrom(it, destination);
        if (ret != null) {
            return ret;
        }

        String imageKey = ISharedImages.IMG_OBJ_ELEMENT;
        return PlatformUI.getWorkbench().getSharedImages().getImage(imageKey);
    }

    /*
     * (non-Javadoc)
     * @see fr.imag.adele.cadse.eclipse.view.IViewDisplayConfiguration#getDisplayImage
     * (fr.imag.adele.cadse.core.IItemNode)
     */
    public Image getDisplayImage(IItemNode node) {
        Item destination = node.getItem();
        ItemType it = destination.getType();
        Image ret = WSPlugin.getDefault().getImageFrom(it, destination);
        if (ret != null) {
            return ret;
        }

        String imageKey = ISharedImages.IMG_OBJ_ELEMENT;
        return PlatformUI.getWorkbench().getSharedImages().getImage(imageKey);
    }

    /*
     * (non-Javadoc)
     * @see fr.imag.adele.cadse.eclipse.view.IViewDisplayConfiguration#getDisplayText
     * (fr.imag.adele.cadse.core.IItemNode)
     */
    public String getDisplayText(IItemNode node) {
        StringBuilder begin = new StringBuilder();
        begin.append(node.getItem().getDisplayName());
        return begin.toString();
    }

    protected String toStringKind(LinkType lt) {
        StringBuilder ret = new StringBuilder();
        ret.append("[");
        if (lt.isPart()) {
            ret.append("p");
        } else {
            ret.append(" ");
        }
        if (lt.isAggregation()) {
            ret.append("a");
        } else {
            ret.append(" ");
        }
        if (lt.isRequire()) {
            ret.append("r");
        } else {
            ret.append(" ");
        }
        if (lt.isComposition()) {
            ret.append("c");
        } else {
            ret.append(" ");
        }
        ret.append("] ");
        return ret.toString();

    }

    /*
     * (non-Javadoc)
     * @see fr.imag.adele.cadse.eclipse.view.IViewDisplayConfiguration#getDisplayText
     * (fede.workspace.tool.view.node.LinkNode)
     */
    public String getDisplayText(LinkNode node) {

        Link link = node.getLink();
        StringBuilder begin = new StringBuilder();
        LinkType lt = link.getLinkType();
        link.toString();
        if (node.getKind() == ItemInViewer.LINK_INCOMING) {
            begin.append("<-- ");
        }
        if (getShowKind()) {
            if (lt == null) {
                begin.append("[???] ");
            } else {
                begin.append(toStringKind(lt));
            }
        }
        if (getShowLinkTypeName()) {
            if (lt == null) {
                begin.append("??? ");
            } else {
                begin.append(lt.getDisplayName()).append(" ");
            }
        }
        if (begin.length() > 0) {
            begin.append("--> ");
        }
        Item dest = null;
        if (node.getKind() == ItemInViewer.LINK_INCOMING) {
            dest = link.getSource();
        } else {
            dest = link.getDestination();
        }
        final Item nodeitem = node.getItem();
        if (nodeitem != null) {
            begin.append(nodeitem.getDisplayName());
        }

        return begin.toString();
    }

    /*
     * (non-Javadoc)
     * @see fr.imag.adele.cadse.eclipse.view.IViewDisplayConfiguration#getDisplayText (fr.imag.adele.cadse.core.Link,
     * fr.imag.adele.cadse.core.Item)
     */
    public String getDisplayText(Link link, Item destination) {
        return destination.getDisplayName();
    }

    /*
     * (non-Javadoc)
     * @see fr.imag.adele.cadse.eclipse.view.IViewDisplayConfiguration#getDisplayToolTip (fr.imag.adele.cadse.core.Item)
     */
    public String getDisplayToolTip(Item theItem) {
        StringBuilder sb = new StringBuilder();
        sb.append("\n#class: " + theItem.getClass().getName());
        ItemType itemType = theItem.getType();
        sb.append("\n#type: ").append(itemType.getId()).append("\n");
        sb.append("       ").append(itemType.getName()).append("\n");
        sb.append("\n#id         : ").append(theItem.getId());
        if (itemType.getKeyDefinition() != null) {
            Key key = theItem.getKey();
            if (key == null) {
                sb.append("\n#key        : null key");
            } else {
                sb.append("\n#key        : ");
                key.getQualifiedString(sb);
            }
        } else {
            sb.append("\n#key        : no key");
        }
        sb.append("\n#qualified name  : ").append(theItem.getQualifiedName());
        sb.append("\n#name : ").append(theItem.getName());
        sb.append("\n#display name : ").append(theItem.getDisplayName());
        tooTipParent(theItem, sb);
        if (theItem.isReadOnly()) {
            sb.append("\nitem readonly");
        }
        // List<Item> parentComposite = theItem.getCompositeParent();
        // if (parentComposite != null && parentComposite.size() > 0) {
        // sb.append("\ncomposite parent:\n");
        // for (Item pitem : parentComposite) {
        // sb.append("   - ");
        // sb.append(pitem.getQualifiedName());
        //
        // }
        // }
        // Set<Item> comp = theItem.getComponents();
        // if (comp.size() > 0) {
        // sb.append("\ncomponants:");
        // Item[] linkArray = comp.toArray(new Item[0]);
        // Arrays.sort(linkArray, new Comparator<Item>() {
        //
        // public int compare(Item o1, Item o2) {
        // return o1.getQualifiedName().compareTo(o2.getQualifiedName());
        // }
        // });
        // for (Item link2 : linkArray) {
        // sb.append("\n   - ").append(link2.getQualifiedName());
        // }
        // }
        // Set<DerivedLink> derivedLink = theItem.getDerivedLinks();
        // if (derivedLink.size() > 0) {
        // sb.append("\nderived links:");
        // for (DerivedLink link2 : derivedLink) {
        // sb.append("\n   - ").append(link2.getDestinationQualifiedName()).append(" (").append(
        // link2.getLinkType().getName()).append(")");
        // }
        // }

        return sb.toString();
    }

    private void tooTipParent(Item theItem, StringBuilder sb) {
        Item parent = theItem.getPartParent();
        if (parent != null) {
            sb.append("\n#parent id : ").append(parent.getId());
            Key pkey = parent.getKey();
            if (pkey != null) {
                sb.append("\n#parent key : ");
                pkey.getQualifiedString(sb);
            }
            sb.append("\n#parent un : ").append(parent.getQualifiedName());
        }
    }

    /*
     * (non-Javadoc)
     * @see fr.imag.adele.cadse.eclipse.view.IViewDisplayConfiguration#getDisplayToolTip (fr.imag.adele.cadse.core.Link)
     */
    public String getDisplayToolTip(Link link) {
        StringBuilder sb = new StringBuilder();
        if (link == null) {
            return "link is null !!";
        }
        sb.append("\n#class: " + link.getClass().getName());
        sb.append("\n").append(link.toString());
        if (link.isReadOnly()) {
            sb.append("\nlink readonly\n");
        }
        if (link.getLinkType() == null) {

        }
        Item theItem = link.getDestination(false);
        sb.append("\n#class: " + theItem.getClass().getName());
        ItemType itemType = theItem.getType();
        if (itemType == null) {
            sb.append("\n#type: no volue !!!");
        } else {
            sb.append("\n#type: ").append(itemType.getId());
            sb.append("\n     : ").append(itemType.getName());
        }
        sb.append("\n#id         : ").append(theItem.getId());
        if (itemType != null && theItem.isResolved()) {
            if (itemType.getKeyDefinition() != null) {
                Key key = theItem.getKey();
                if (key == null) {
                    sb.append("\n#key        : null key");
                } else {
                    sb.append("\n#key        : ");
                    key.getQualifiedString(sb);
                }
            } else {
                sb.append("\n#key        : no key");
            }
        }
        sb.append("\n#qualified name  : ").append(theItem.getQualifiedName());
        sb.append("\n#name : ").append(theItem.getName());
        sb.append("\n#display name : ").append(theItem.getDisplayName());
        tooTipParent(theItem, sb);
        if (link.isLinkResolved()) {

            if (/* heItem.isResolved() && */theItem.isReadOnly()) {
                sb.append("\nitem readonly");
            }
            // List<Item> parentComposite = theItem.getCompositeParent();
            // if (parentComposite != null && parentComposite.size() > 0) {
            // sb.append("\ncomposite parent:\n");
            // for (Item pitem : parentComposite) {
            // sb.append("   - ");
            // sb.append(pitem.getQualifiedName());
            //
            // }
            // }
            //
            // Set<Item> comp = theItem.getComponents();
            // if (comp != null && comp.size() > 0) {
            // sb.append("\ncomponants:");
            // Item[] linkArray = comp.toArray(new Item[0]);
            // Arrays.sort(linkArray, new Comparator<Item>() {
            //
            // public int compare(Item o1, Item o2) {
            // return o1.getQualifiedName().compareTo(o2.getQualifiedName());
            // }
            // });
            // for (Item link2 : linkArray) {
            // sb.append("\n   - ").append(link2.getQualifiedName());
            // }
            // }
            // Set<DerivedLink> derivedLink = theItem.getDerivedLinks();
            // if (derivedLink != null && derivedLink.size() > 0) {
            // sb.append("\nderived links:");
            // for (DerivedLink link2 : derivedLink) {
            // sb.append("\n   - ").append(link2.getDestinationQualifiedName()).append(" (").append(
            // link2.getLinkType().getName()).append(")");
            // }
            // }
        }

        // case NOT_ATTACHED_OR_ONLY_IN_WORKSPACE:
        // item = (Item) value;
        // sb.append(item.getType().getId());
        //
        // break;

        return sb.toString();
    }

    public AbstractCadseViewNode[] getChildren(AbstractCadseViewNode node) {
        LogicalWorkspace cadseModel = getCadseModel();
        if (cadseModel == null) {
            return AbstractCadseViewNode.EMPTY;
        }

        if (node == rootWS) {
            return getFirstChildren();
        }
        if (node.getKind() == ItemInViewer.ITEM || node.getKind() == ItemInViewer.LINK_OUTGOING
                || node.getKind() == ItemInViewer.LINK_INCOMING) {
            Item item = node.getItem();

            List<LinkNode> ret = new ArrayList<LinkNode>();
            List<? extends Link> outgoingLinks = item.getOutgoingLinks();
            if (outgoingLinks != null) {
                for (Link l : outgoingLinks) {
                    if (!isItemType(l.getDestinationType(), cadseModel)) {
                        continue;
                    }
                    if (isLink(l)) {
                        ret.add(createLinkNode(node, l));
                    }
                }
            }
            if (_showIncomings) {
                List<? extends Link> incomingsLinks = item.getIncomingLinks();
                if (incomingsLinks != null) {
                    for (Link l : incomingsLinks) {
                        ret.add(createLinkIncomingNode(node, l));
                    }
                }
            }
            return sort(item, ret.toArray(new LinkNode[ret.size()]));
        }
        return AbstractCadseViewNode.EMPTY;
    }

    protected AbstractCadseViewNode[] sort(Item itemParent, LinkNode[] nodes) {
        return nodes;
    }

    protected AbstractCadseViewNode[] getFirstChildren() {
        LogicalWorkspace model = getCadseModel();
        if (model == null) {
            return AbstractCadseViewNode.EMPTY;
        }
        ItemType[] itemtypes = getFirstItemType(model);
        List<ItemNode> ret = new ArrayList<ItemNode>();
        for (ItemType it : itemtypes) {
            if (it == null) {
                continue;
            }

            it.addListener(this, ChangeID.toFilter(ChangeID.DELETE_ITEM, ChangeID.CREATE_ITEM));
            List<Item> itemByType;
            while (true) {
                try {
                    itemByType = it.getItems();
                    break;
                } catch (Throwable e) {
                    try {
                        Thread.sleep(20);
                    } catch (InterruptedException e1) {
                    }
                }
            }
            for (Item item : itemByType) {
                if (item.getType() != it) {
                    continue;
                }
                ret.add(createItemNode(rootWS, item));
            }
        }
        return ret.toArray(new ItemNode[ret.size()]);
    }

    public LinkNode createLinkNode(AbstractCadseViewNode parent, Link l) {
        return parent.getOrCreateNode(l);
    }

    public LinkNode createLinkIncomingNode(AbstractCadseViewNode parent, Link l) {
        return parent.getOrCreateIncomingNode(l);
    }

    public ItemNode createItemNode(AbstractCadseViewNode parent, Item item) {
        if (parent == null) {
            parent = rootWS;
        }
        return parent.getOrCreateNode(item);
    }

    public boolean hasChildren(AbstractCadseViewNode node) {
        LogicalWorkspace cadseModel = getCadseModel();
        if (cadseModel == null) {
            return false;
        }

        if (node == rootWS) {
            return rootWS.getChildren().length != 0;
        }
        if (node.getKind() == ItemInViewer.ITEM || node.getKind() == ItemInViewer.LINK_OUTGOING) {
            Item item = node.getItem();

            // if (!item.isResolved()) return AbstractCadseViewNode.EMPTY;
            List<LinkNode> ret = new ArrayList<LinkNode>();
            List<? extends Link> outgoingLinks = item.getOutgoingLinks();
            if (outgoingLinks != null) {
                for (Link l : outgoingLinks) {
                    if (!isItemType(l.getDestinationType(), cadseModel)) {
                        continue;
                    }
                    if (isLink(l)) {
                        return true;
                    }
                }
            }
            if (_showIncomings) {
                List<? extends Link> incomingsLinks = item.getIncomingLinks();
                if (incomingsLinks != null) {
                    for (Link l : incomingsLinks) {
                        return true;
                    }
                }
            }
        }
        return false;
    }

    public boolean isRecomputeChildren() {
        return _isRecomputeChildren;
    }

    public void setRecomputeChildren(boolean recomputeChildren) {
        _isRecomputeChildren = recomputeChildren;
    }

    /*
     * (non-Javadoc)
     * @see fr.imag.adele.cadse.eclipse.view.IViewDisplayConfiguration#getDisplayToolTip
     * (fr.imag.adele.cadse.core.LinkType)
     */
    public String getDisplayToolTip(LinkType linkType) {
        return "LinkType: " + linkType.getName();
    }

    /*
     * (non-Javadoc)
     * @see fr.imag.adele.cadse.eclipse.view.IViewDisplayConfiguration#getDisplayImage
     * (fede.workspace.tool.view.node.LinkTypeNode)
     */
    public Image getDisplayImage(LinkTypeNode node) {

        Image ret = WSPlugin.getDefault().getImageFrom(node.getLinkType().getDestination(), null);
        if (ret != null) {
            return ret;
        }

        String imageKey = ISharedImages.IMG_OBJ_ELEMENT;
        return PlatformUI.getWorkbench().getSharedImages().getImage(imageKey);
    }

    /*
     * (non-Javadoc)
     * @see fr.imag.adele.cadse.eclipse.view.IViewDisplayConfiguration#getDisplayText
     * (fede.workspace.tool.view.node.LinkTypeNode)
     */
    public String getDisplayText(LinkTypeNode node) {
        return node.toString();
    }

    /*
     * (non-Javadoc)
     * @see fr.imag.adele.cadse.eclipse.view.IViewDisplayConfiguration#getDisplayFont
     * (fede.workspace.tool.view.node.LinkTypeNode)
     */
    public Font getDisplayFont(LinkTypeNode node) {
        return null;
    }

    /*
     * (non-Javadoc)
     * @see fr.imag.adele.cadse.eclipse.view.IViewDisplayConfiguration#getDisplayToolTip
     * (fr.imag.adele.cadse.core.ItemType)
     */
    public String getDisplayToolTip(ItemType itemType) {
        return "ItemType:" + itemType.getId();
    }

    /*
     * (non-Javadoc)
     * @see fr.imag.adele.cadse.eclipse.view.IViewDisplayConfiguration#getDisplayImage
     * (fede.workspace.tool.view.node.ItemTypeNode)
     */
    public Image getDisplayImage(ItemTypeNode node) {
        Image ret = WSPlugin.getDefault().getImageFrom(node.getItemType(), null);
        if (ret != null) {
            return ret;
        }

        String imageKey = ISharedImages.IMG_OBJ_ELEMENT;
        return PlatformUI.getWorkbench().getSharedImages().getImage(imageKey);
    }

    /*
     * (non-Javadoc)
     * @see fr.imag.adele.cadse.eclipse.view.IViewDisplayConfiguration#getDisplayText
     * (fede.workspace.tool.view.node.ItemTypeNode)
     */
    public String getDisplayText(ItemTypeNode node) {
        return node.toString();
    }

    /*
     * (non-Javadoc)
     * @see fr.imag.adele.cadse.eclipse.view.IViewDisplayConfiguration#getDisplayFont
     * (fede.workspace.tool.view.node.ItemTypeNode)
     */
    public Font getDisplayFont(ItemTypeNode node) {
        return null;
    }

    public IShellProvider getShellProvider() {
        return shellprovider;
    }

    public IWorkbenchWindow getWorkbenchWindow() {
        return workbenchWindow;
    }

    /*
     * (non-Javadoc)
     * @see fr.imag.adele.cadse.eclipse.view.IViewDisplayConfiguration#getDisplayToolTip
     * (fede.workspace.tool.view.node.AbstractCadseViewNode)
     */
    public String getDisplayToolTip(AbstractCadseViewNode node) {
        if (node instanceof LinkNode) {
            return getDisplayToolTip(node.getLink());
        }
        if (node instanceof ItemNode) {
            return getDisplayToolTip(node.getItem());
        }
        if (node instanceof LinkTypeNode) {
            return getDisplayToolTip(node.getLinkType());
        }
        if (node instanceof ItemTypeNode) {
            return getDisplayToolTip(node.getItemType());
        }
        return "";
    }

    public boolean isAggregationLink(AbstractCadseViewNode node) {
        if (node instanceof LinkNode) {
            return isAggregationLink(node.getLink());
        }
        return true;
    }

    public boolean canCreateItem(ItemType it) {
        LogicalWorkspace cadseModel = getCadseModel();
        if (cadseModel == null) {
            return false;
        }
        return !isRefItemType(it, cadseModel);
    }

    public boolean canCreateFrom(Item itemparent, LinkType alt, ItemType anIT) {
        LogicalWorkspace cadseModel = getCadseModel();
        if (cadseModel == null) {
            return false;
        }
        if (!isCreateLink(alt)) {
            return false;
        }
        if (!isItemType(anIT, cadseModel)) {
            return false;
        }
        return true;
    }

    public boolean canCreateFrom(Item itemparent, LinkType alt) {
        LogicalWorkspace cadseModel = getCadseModel();
        if (cadseModel == null) {
            return false;
        }
        if (!isCreateLink(alt)) {
            return false;
        }
        if (!isItemType(alt.getDestination(), cadseModel)) {
            return false;
        }
        return true;
    }

    public boolean canCreateLinkFrom(Item parentitem, LinkType alt) {
        return true;
    }

    public void add(AbstractCadseViewNode node) {
    }

    public void remove(AbstractCadseViewNode node) {
    }

    public List<AbstractCadseViewNode> getNodeFromElement(Object element) {
        ArrayList<AbstractCadseViewNode> ret = new ArrayList<AbstractCadseViewNode>();
        ArrayList<AbstractCadseViewNode> visite = new ArrayList<AbstractCadseViewNode>();
        visite.add(rootWS);

        while (!visite.isEmpty()) {
            AbstractCadseViewNode node = visite.remove(visite.size() - 1);

            if (element instanceof Item && node.getItem() == element) {
                ret.add(node);
            } else if (node.getElementModel() == element) {
                ret.add(node);
            }

            if (node.isOpen()) {
                List<AbstractCadseViewNode> children = node.children();
                if (children != null) {
                    visite.addAll(children);
                }
            }
        }

        return ret;
    }

    public List<AbstractCadseViewNode> getNodeFromElement(Item item) {
        ArrayList<AbstractCadseViewNode> ret = new ArrayList<AbstractCadseViewNode>();
        ret.addAll(getNodeFromElement((Object) item));
        for (Link il : item.getIncomingLinks()) {
            if (isLink(il)) {
                ret.addAll(getNodeFromElement(il));
            }
        }
        return ret;
    }

    public List<Object> getParentElement(Object element) {
        LogicalWorkspace cadseModel = getCadseModel();
        if (cadseModel == null) {
            return Collections.EMPTY_LIST;
        }
        if (element instanceof Link) {
            Link l = (Link) element;
            ArrayList<Object> ret = new ArrayList<Object>();
            if (l.getSource() != null && isFirstItem(l.getSource(), cadseModel)) {
                ret.add(l.getSource());
            }
            if (l.getSource() != null) {
                for (Link il : l.getSource().getIncomingLinks()) {
                    if (isLink(il)) {
                        ret.add(il);
                    }
                }
            }
            return ret;
        }
        if (element instanceof Item) {
            ArrayList<Object> ret = new ArrayList<Object>();
            Item source = (Item) element;
            for (Link il : source.getIncomingLinks()) {
                if (isLink(il)) {
                    ret.add(il.getSource());
                }
            }
            if (isFirstItem(source, cadseModel)) {
                ret.add(rootWS);
            }

            return ret;
        }
        return Collections.EMPTY_LIST;
    }

    public Set<IItemNode> getParentNode(Object element) {
        List<AbstractCadseViewNode> nodeOfElement = getNodeFromElement(element);

        Set<IItemNode> ret = new HashSet<IItemNode>();
        for (AbstractCadseViewNode el : nodeOfElement) {
            ret.add(el);
            if (el.getParent() != null) {
                ret.add(el.getParent());
            }
        }
        List<Object> parentElement = getParentElement(element);
        for (Object el : parentElement) {
            ret.addAll(getNodeFromElement(el));
        }
        return ret;
    }

    AbstractCadseView viewPart;

    public AbstractCadseView getViewPart() {
        return viewPart;
    }

    public void setViewPart(AbstractCadseView viewPart) {
        this.viewPart = viewPart;
    }

    public int isSelected(IItemNode node) {
        return IItemNode.DESELECTED;
    }

    ViewFilter[] _filters = null;

    final public void addFilter(ViewFilter f) {
        _filters = ArraysUtil.add(ViewFilter.class, _filters, f);
    }

    final public ViewFilter[] getFilters() {
        return _filters;
    }

    final public void removeFilter(ViewFilter f) {
        _filters = ArraysUtil.remove(ViewFilter.class, _filters, f);
    }

    @Override
    public boolean filterNew(NewContext context) {

        if (context.getOutgoingDestination(CadseGCST.ITEM_lt_PARENT) != null) {
            if (!canCreateFrom(context.getPartParent(), context.getPartLinkType(), context.getDestinationType())) {
                return true;
            }
        } else {
            if (!canCreateItem(context.getDestinationType())) {
                return true;
            }
        }

        if (_filters != null) {
            for (ViewFilter f : _filters) {
                if (f.isPositifFilter() && f.acceptNew(context)) {
                    return false;
                }

                if (f.isNegatifFilter() && f.filterNew(context)) {
                    return true;
                }
            }
        }
        return false;
    }

    @Override
    public boolean canCreateDestination(LinkType lt) {
        return isCreateLink(lt);
    }

    @Override
    public ItemType[] getCreatableItemType() {
        return getFirstItemType(getCadseModel());
    }

    public ItemType[] getFirstItemType() {
        return getFirstItemType(getCadseModel());
    }

    public Object getWindowProvider() {
        return getShellProvider();
    }

    @Override
    public String getNewLabel(NewContext context) {
        return context.getLabel();
    }

}