org.bbaw.pdr.ae.view.main.views.Treeview.java Source code

Java tutorial

Introduction

Here is the source code for org.bbaw.pdr.ae.view.main.views.Treeview.java

Source

/**
 * This file is part of Archiv-Editor.
 * 
 * The software Archiv-Editor serves as a client user interface for working with
 * the Person Data Repository. See: pdr.bbaw.de
 * 
 * The software Archiv-Editor was developed at the Berlin-Brandenburg Academy
 * of Sciences and Humanities, Jgerstr. 22/23, D-10117 Berlin.
 * www.bbaw.de
 * 
 * Copyright (C) 2010-2013  Berlin-Brandenburg Academy
 * of Sciences and Humanities
 * 
 * The software Archiv-Editor was developed by @author: Christoph Plutte.
 * 
 * Archiv-Editor is free software: you can redistribute it and/or modify
 * it under the terms of the GNU Lesser General Public License as published by
 * the Free Software Foundation, either version 3 of the License, or
 * (at your option) any later version.
 * 
 * Archiv-Editor is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU Lesser General Public License for more details.
 * 
 * You should have received a copy of the GNU Lesser General Public License
 * along with Archiv-Editor.  
 * If not, see <http://www.gnu.org/licenses/lgpl-3.0.html>.
 */
package org.bbaw.pdr.ae.view.main.views;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.Observable;
import java.util.Observer;
import java.util.Vector;

import org.bbaw.pdr.ae.common.AEConstants;
import org.bbaw.pdr.ae.common.AEPluginIDs;
import org.bbaw.pdr.ae.common.CommonActivator;
import org.bbaw.pdr.ae.common.NLMessages;
import org.bbaw.pdr.ae.common.icons.IconsInternal;
import org.bbaw.pdr.ae.config.model.ConfigItem;
import org.bbaw.pdr.ae.control.core.PDRConfigProvider;
import org.bbaw.pdr.ae.control.facade.Facade;
import org.bbaw.pdr.ae.control.interfaces.AMainSearcher;
import org.bbaw.pdr.ae.metamodel.IAEPresentable;
import org.bbaw.pdr.ae.metamodel.PdrId;
import org.bbaw.pdr.ae.model.Aspect;
import org.bbaw.pdr.ae.model.BasicPersonData;
import org.bbaw.pdr.ae.model.PdrObject;
import org.bbaw.pdr.ae.model.Person;
import org.bbaw.pdr.ae.model.ReferenceMods;
import org.bbaw.pdr.ae.model.ReferenceModsTemplate;
import org.bbaw.pdr.ae.model.search.Criteria;
import org.bbaw.pdr.ae.model.search.PdrQuery;
import org.bbaw.pdr.ae.model.view.TreeNode;
import org.bbaw.pdr.ae.view.control.ViewHelper;
import org.bbaw.pdr.ae.view.control.filters.OnlyAspectDivergentMarkup;
import org.bbaw.pdr.ae.view.control.filters.OnlyIncorrectPDRObjectsFilter;
import org.bbaw.pdr.ae.view.control.filters.PersonConcurrenceFilter;
import org.bbaw.pdr.ae.view.control.filters.PersonIdentifierFilter;
import org.bbaw.pdr.ae.view.control.filters.PersonWithoutICCUFilter;
import org.bbaw.pdr.ae.view.control.filters.PersonWithoutLCCNFilter;
import org.bbaw.pdr.ae.view.control.filters.PersonWithoutPNDFilter;
import org.bbaw.pdr.ae.view.control.filters.PersonWithoutVIAFFilter;
import org.bbaw.pdr.ae.view.control.filters.TreeNodeNewFilter;
import org.bbaw.pdr.ae.view.control.filters.TreeNodeUpdatedFilter;
import org.bbaw.pdr.ae.view.control.provider.AEConfigPresentableContentProvider;
import org.bbaw.pdr.ae.view.control.provider.AEConfigPresentableLabelProvider;
import org.bbaw.pdr.ae.view.control.provider.TreeContentProvider;
import org.bbaw.pdr.ae.view.control.provider.TreeLabelProvider;
import org.bbaw.pdr.ae.view.main.internal.Activator;
import org.bbaw.pdr.ae.view.main.internal.TreeSearchHelper;
import org.bbaw.pdr.ae.view.main.internal.TreeSelectionSourceProvider;
import org.eclipse.core.commands.Command;
import org.eclipse.core.commands.ExecutionException;
import org.eclipse.core.commands.IParameter;
import org.eclipse.core.commands.NotEnabledException;
import org.eclipse.core.commands.NotHandledException;
import org.eclipse.core.commands.Parameterization;
import org.eclipse.core.commands.ParameterizedCommand;
import org.eclipse.core.commands.State;
import org.eclipse.core.commands.common.NotDefinedException;
import org.eclipse.core.runtime.ILog;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.Platform;
import org.eclipse.core.runtime.Status;
import org.eclipse.core.runtime.jobs.Job;
import org.eclipse.jface.action.Action;
import org.eclipse.jface.action.GroupMarker;
import org.eclipse.jface.action.IMenuListener;
import org.eclipse.jface.action.IMenuManager;
import org.eclipse.jface.action.MenuManager;
import org.eclipse.jface.action.Separator;
import org.eclipse.jface.dialogs.MessageDialog;
import org.eclipse.jface.fieldassist.ControlDecoration;
import org.eclipse.jface.fieldassist.FieldDecorationRegistry;
import org.eclipse.jface.resource.ImageRegistry;
import org.eclipse.jface.viewers.ArrayContentProvider;
import org.eclipse.jface.viewers.ComboViewer;
import org.eclipse.jface.viewers.DoubleClickEvent;
import org.eclipse.jface.viewers.IDoubleClickListener;
import org.eclipse.jface.viewers.ISelection;
import org.eclipse.jface.viewers.ISelectionChangedListener;
import org.eclipse.jface.viewers.ISelectionProvider;
import org.eclipse.jface.viewers.IStructuredSelection;
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.ViewerFilter;
import org.eclipse.swt.SWT;
import org.eclipse.swt.custom.CTabFolder;
import org.eclipse.swt.custom.CTabFolder2Adapter;
import org.eclipse.swt.custom.CTabFolderEvent;
import org.eclipse.swt.custom.CTabItem;
import org.eclipse.swt.custom.SashForm;
import org.eclipse.swt.events.KeyEvent;
import org.eclipse.swt.events.KeyListener;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.widgets.Combo;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Event;
import org.eclipse.swt.widgets.Group;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.Menu;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.swt.widgets.TabFolder;
import org.eclipse.swt.widgets.TabItem;
import org.eclipse.swt.widgets.Text;
import org.eclipse.swt.widgets.Tree;
import org.eclipse.ui.IActionBars;
import org.eclipse.ui.ISelectionListener;
import org.eclipse.ui.ISizeProvider;
import org.eclipse.ui.IWorkbenchActionConstants;
import org.eclipse.ui.IWorkbenchPart;
import org.eclipse.ui.IWorkbenchWindow;
import org.eclipse.ui.PlatformUI;
import org.eclipse.ui.commands.ICommandService;
import org.eclipse.ui.handlers.IHandlerService;
import org.eclipse.ui.part.ViewPart;
import org.eclipse.ui.progress.UIJob;
import org.eclipse.ui.services.ISourceProviderService;
import org.omg.CORBA._IDLTypeStub;

/**
 * Class creates tree view on left side of GUI view.
 * @author cplutte
 */
public class Treeview extends ViewPart implements ISelectionListener, ISelectionProvider, Observer, ISizeProvider {

    /**
     * Id des Treeviews.
     */
    public static final String ID = "org.bbaw.pdr.ae.view.main.views.Treeview"; //$NON-NLS-1$

    /** The sash form main. */
    private SashForm _sashFormMain;

    /** Treeviewer. */
    private TreeViewer _treeViewer;
    /** tree viewer of all persons. */
    private TreeViewer _allPersonsTreeViewer;
    /** tree viewer of all references. */
    private TreeViewer _allReferencesTreeViewer;

    /** The _tree search helper. */
    private TreeSearchHelper _treeSearchHelper = new TreeSearchHelper();

    /** The _combo tree viewer. */
    private ComboViewer _comboTreeViewer;

    /** The _combo semantic viewer. */
    private ComboViewer _comboSemanticViewer;

    /** The treenode updated filter. */
    private ViewerFilter _treenodeUpdatedFilter = new TreeNodeUpdatedFilter();

    /** The treenode new filter. */
    private ViewerFilter _treenodeNewFilter = new TreeNodeNewFilter();

    /** The only incorrect pdr objects. */
    private ViewerFilter _onlyIncorrectPDRObjects = new OnlyIncorrectPDRObjectsFilter();

    /** The only i aspects divergent markup. */
    private ViewerFilter _onlyIAspectsDivergentMarkup = new OnlyAspectDivergentMarkup();

    /** The person identifier filter. */
    private ViewerFilter _personIdentifierFilter = new PersonIdentifierFilter();

    /** The person concurrence filter. */
    private ViewerFilter _personConcurrenceFilter = new PersonConcurrenceFilter();

    /** The person without pnd filter. */
    private ViewerFilter _personWithoutPNDFilter = new PersonWithoutPNDFilter();

    /** The person without lccn filter. */
    private ViewerFilter _personWithoutLCCNFilter = new PersonWithoutLCCNFilter();

    /** The person without viaf filter. */
    private ViewerFilter _personWithoutVIAFFilter = new PersonWithoutVIAFFilter();

    /** The person without iccu filter. */
    private ViewerFilter _personWithoutICCUFilter = new PersonWithoutICCUFilter();

    /** The only person concurrences. */
    private Action _onlyAspectsWithDivergentMarkup, _openAspectsInNewTap, _openReferencesInNewTap,
            _onlyUpdatedObjects, _onlyNewObjects, _onlyIncorrectObjects, _onlyPersonIdentifiers,
            _onlyPersonConcurrences, _selectAllChildNods;

    /** The only without iccu persons. */
    private Action _onlyWithoutPNDPersons, _onlyWithoutLCCNPersons, _onlyWithoutVIAFPersons,
            _onlyWithoutICCUPersons;

    /** The load query. */
    private Action _loadQuery;

    /** The tree viewer map. */
    private HashMap<String, TreeViewer> _treeViewerMap = new HashMap<String, TreeViewer>();
    /**
     * Tabfolder containing Trees.
     */
    private CTabFolder _tabFolderLeft;
    /**
     * contains the currently selected Object.
     */
    private Group _currentObjectGroup;
    /**
     * group contains Combos, Text, Button for TreeBuilder.
     */
    private Group _groupTree;
    /**
     * contains the currently selected Object.
     */
    private Text _currentObjectText;
    /** search text. */
    private Text _searchText;
    /**
     * part of Searchcombos for tree builder.
     */
    private Combo _comboTree;
    /**
     * Combo for Selection of Criteria for TreeBuilder.
     */
    private Combo _comboTag;

    /** The _search result. */
    private Object _searchResult;

    /** The _selection. */
    private PdrObject[] _selection;

    /** The selection changed listeners. */
    private ArrayList<ISelectionChangedListener> _selectionChangedListeners = new ArrayList<ISelectionChangedListener>();

    /** Button to create tree. */
    private Button _treeButton;

    /** The _add aspect button. */
    private Button _addAspectButton;

    /** The _add similar aspect button. */
    private Button _addSimilarAspectButton;

    /** pdrquery. */
    private PdrQuery _pdrQuery;

    /** criteria for query. */
    private Criteria _criteria;

    /** tree counter. */
    private int _keyCounter = 0;

    /** The pressed. */
    @SuppressWarnings("unused")
    private boolean _pressed = false;
    /** _facade singleton instance. */
    private Facade _facade = Facade.getInstanz();

    /** Logger. */
    private ILog _iLogger = AEConstants.ILOGGER;

    /** _MainSearcher als Singleton. */
    private AMainSearcher _mainSearcher = _facade.getMainSearcher();

    /** Instance of shared image registry. */
    private ImageRegistry _imageReg = CommonActivator.getDefault().getImageRegistry();

    /**
     * Hauptmethode der ViewKlasse.
     * @param parent.
     */
    private Shell _parentShell;

    /** The ref facets. */
    private String[] _refFacets = new String[] { "title", "subtitle", "partName", //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
            "name", "genre", "dateCreated", //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
            "dateIssued", "dateCaptured", //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
            "copyrightDate", "publisher", "place", //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
            "edition", "physicalLocation", "shelfLocator" }; //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$

    private boolean _advanced = Platform.getPreferencesService().getBoolean(CommonActivator.PLUGIN_ID,
            "AE_ADVANCED_VERSION", AEConstants.AE_ADVANCED_VERSION, null);

    private Button _facetPreferenceButton;

    /**
     * public Constructor.
     */
    public Treeview() {
    }

    @Override
    public final void addSelectionChangedListener(final ISelectionChangedListener listener) {
        _selectionChangedListeners.add(listener);

    }

    /**
     * Builds the tab folder left.
     */
    private void buildTabFolderLeft() {
        _tabFolderLeft = new CTabFolder(_groupTree, SWT.TOP);
        _tabFolderLeft.setLayout(new GridLayout());

        _tabFolderLeft.setLayoutData(new GridData(GridData.FILL_BOTH));
        // ((GridData) _tabFolderLeft.getLayoutData()).horizontalAlignment =
        // SWT.FILL;
        // ((GridData) _tabFolderLeft.getLayoutData()).grabExcessHorizontalSpace
        // = true;
        // ((GridData) _tabFolderLeft.getLayoutData()).verticalAlignment =
        // SWT.FILL;
        // ((GridData) _tabFolderLeft.getLayoutData()).grabExcessVerticalSpace =
        // true;
        ((GridData) _tabFolderLeft.getLayoutData()).horizontalSpan = 4;
        _tabFolderLeft.setUnselectedImageVisible(false);
        _tabFolderLeft.setUnselectedCloseVisible(false);
        _tabFolderLeft.setMRUVisible(true);
        ViewHelper.setTabfolderSimple(_tabFolderLeft, false);
        _tabFolderLeft.addCTabFolder2Listener(new CTabFolder2Adapter() {
            @Override
            public void close(final CTabFolderEvent event) {
                _treeViewerMap.remove(_tabFolderLeft.getSelection().getData("key")); //$NON-NLS-1$
                uncheckToggleCommands();
            }
        });
        PlatformUI.getWorkbench().getHelpSystem().setHelp(_tabFolderLeft, "org.bbaw.pdr.ae.help._tabFolderLeft"); //$NON-NLS-1$

        _tabFolderLeft.setSelection(0);
        _tabFolderLeft.addSelectionListener(new SelectionAdapter() {
            @Override
            public void widgetSelected(final SelectionEvent ev) {
                String key = (String) _tabFolderLeft.getSelection().getData("key");
                String type = (String) _tabFolderLeft.getSelection().getData("type");

                TreeViewer tv = _treeViewerMap.get(key);
                if (tv != null) {
                    tv.resetFilters(); //$NON-NLS-1$
                }
                uncheckToggleCommands();

                // get the window (which is a IServiceLocator)
                IWorkbenchWindow window = PlatformUI.getWorkbench().getActiveWorkbenchWindow();
                // get the service
                ISourceProviderService service = (ISourceProviderService) window
                        .getService(ISourceProviderService.class);
                // get our source provider by querying by the variable name
                TreeSelectionSourceProvider treeSelectionSourceProvider = (TreeSelectionSourceProvider) service
                        .getSourceProvider(AEPluginIDs.SOURCE_PARAMETER_TREE);
                // set the value
                treeSelectionSourceProvider.setTreeSelection(key);
                treeSelectionSourceProvider.setTreeType(type);
                // System.out.println("treeSelectionSourceProvider.setTreeType(type) "
                // + type);
                // System.out.println("treeSelectionSourceProvider.setTreeType(key) "
                // + key);

                treeSelectionSourceProvider.setTreeViewer(tv);
            }

        }); // SelectionListener

        _sashFormMain.redraw();
        createTreeViewer(_tabFolderLeft, "allPersons"); //$NON-NLS-1$
        _keyCounter++;
        createTreeViewer(_tabFolderLeft, "allReferences"); //$NON-NLS-1$
        _tabFolderLeft.setSelection(0);

        // initialize sources parameters:
        IWorkbenchWindow window = PlatformUI.getWorkbench().getActiveWorkbenchWindow();
        // get the service
        ISourceProviderService service = (ISourceProviderService) window.getService(ISourceProviderService.class);
        // get our source provider by querying by the variable name
        TreeSelectionSourceProvider treeSelectionSourceProvider = (TreeSelectionSourceProvider) service
                .getSourceProvider(AEPluginIDs.SOURCE_PARAMETER_TREE);
        // set the value
        treeSelectionSourceProvider.setTreeSelection("allPersons");
        treeSelectionSourceProvider.setTreeType("pdrPo");
        TreeViewer tv = _treeViewerMap.get("allPersons");
        if (tv != null) {
            treeSelectionSourceProvider.setTreeViewer(tv);
        }

        _keyCounter++;
        _groupTree.layout();
        _groupTree.pack();
        _sashFormMain.layout();
    }

    /**
     * @param treeViewer This method creates the Tree.
     */
    private void buildTree(final TreeViewer treeViewer) {
        createActions();

        createMenus(treeViewer.getControl());
        treeViewer.addSelectionChangedListener(new ISelectionChangedListener() {
            @Override
            public void selectionChanged(final SelectionChangedEvent event) {
                if (event.getSelection() instanceof IStructuredSelection) {
                    IStructuredSelection selection = (IStructuredSelection) event.getSelection();
                    Object[] objs = selection.toArray();
                    TreeNode[] tns = new TreeNode[objs.length];
                    TreeNode tn;
                    for (int i = 0; i < objs.length; i++) {
                        tns[i] = (TreeNode) objs[i];
                    }

                    System.out.println("Selection size " + selection.size());
                    boolean loaded = true;
                    if (tns != null && tns.length > 0) {
                        tn = tns[tns.length - 1];
                        if (tn.getPdrQuery() != null) {
                            loaded = false;
                            _treeSearchHelper.processTreeNode(tn);
                            treeViewer.refresh();
                        }

                        if (tn != null && tn.hasChildren()) {
                            if (!treeViewer.getExpandedState(tn)) {
                                loaded = tn.getPdrObject() != null;
                                // treeViewer.setExpandedState(tn,
                                // !treeViewer.getExpandedState(tn));
                            }
                        }
                        if (loaded) // objects are only selected if they are
                                    // already loaded, otherwise it might take
                                    // too long
                        {
                            // FIXME Selection steuerung
                            ArrayList<PdrObject> helpObjs = new ArrayList<PdrObject>();
                            for (int i = 0; i < tns.length; i++) {
                                if (tns[i].getPdrObject() != null) {
                                    helpObjs.add(tns[i].getPdrObject());
                                }
                            }
                            setStatusLine(helpObjs.size() + " " + NLMessages.getString("View_objects_selected"));
                            _selection = helpObjs.toArray(new PdrObject[helpObjs.size()]);
                            _facade.setCurrentTreeObjects(_selection);
                            showCurrentPdrObject();
                        }

                    }

                    IStatus sAspect = new Status(IStatus.INFO, Activator.PLUGIN_ID,
                            "Tree item selected: " + selection); //$NON-NLS-1$
                    _iLogger.log(sAspect);
                }
            }
        });
        treeViewer.addDoubleClickListener(new IDoubleClickListener() {
            @Override
            public void doubleClick(final DoubleClickEvent event) {
                IStructuredSelection selection = (IStructuredSelection) event.getSelection();
                Object obj = selection.getFirstElement();
                TreeNode tn = (TreeNode) obj;
                if (tn != null && tn.hasChildren()) {
                    treeViewer.setExpandedState(tn, !treeViewer.getExpandedState(tn));
                }

            }
        });

    }

    @Override
    public final int computePreferredSize(final boolean width, final int availableParallel,
            final int availablePerpendicular, final int preferredResult) {
        return 350;
    }

    /**
     * Creates the actions.
     */
    @SuppressWarnings("unchecked")
    protected final void createActions() {
        _openAspectsInNewTap = new Action(NLMessages.getString("View_action_open_aspects_new_tab")) {
            @Override
            public void run() {
                TreeViewer viewer = (TreeViewer) _tabFolderLeft.getSelection().getData("viewer"); //$NON-NLS-1$
                //            System.out.println("TreeViewer " + viewer); //$NON-NLS-1$
                //            System.out.println("Selection " + viewer.getSelection()); //$NON-NLS-1$
                if (viewer != null) {
                    IStructuredSelection selection = (IStructuredSelection) viewer.getSelection();
                    Object obj = selection.getFirstElement();
                    TreeNode tn = (TreeNode) obj;
                    if (tn.getPdrObject() != null) {
                        PdrObject pdrO = tn.getPdrObject();
                        if (pdrO != null && pdrO.getPdrId() != null) {
                            Event event = new Event();
                            event.data = pdrO.getPdrId().toString();
                            IHandlerService handlerService = (IHandlerService) PlatformUI.getWorkbench()
                                    .getService(IHandlerService.class);
                            try {
                                handlerService.executeCommand(
                                        "org.bbaw.pdr.ae.view.main.commands.OpenAdditionalAspectsView", event); //$NON-NLS-1$
                            } catch (ExecutionException e) {
                                e.printStackTrace();
                            } catch (NotDefinedException e) {
                                e.printStackTrace();
                            } catch (NotEnabledException e) {
                                e.printStackTrace();
                            } catch (NotHandledException e) {
                                e.printStackTrace();
                            }
                        }
                    }
                }
                _openAspectsInNewTap.setChecked(false);

            }
        };
        _openAspectsInNewTap.setChecked(false);
        _openAspectsInNewTap.setImageDescriptor(_imageReg.getDescriptor(IconsInternal.ASPECTS));

        _openReferencesInNewTap = new Action(NLMessages.getString("View_action_open_references_new_tab")) {
            @Override
            public void run() {
                TreeViewer viewer = (TreeViewer) _tabFolderLeft.getSelection().getData("viewer"); //$NON-NLS-1$
                //            System.out.println("TreeViewer " + viewer); //$NON-NLS-1$
                //            System.out.println("Selection " + viewer.getSelection()); //$NON-NLS-1$
                if (viewer != null) {
                    IStructuredSelection selection = (IStructuredSelection) viewer.getSelection();
                    Object obj = selection.getFirstElement();
                    TreeNode tn = (TreeNode) obj;
                    if (tn.getPdrObject() != null) {
                        PdrObject pdrO = tn.getPdrObject();
                        if (pdrO != null && pdrO.getPdrId() != null) {
                            Event event = new Event();
                            event.data = pdrO.getPdrId().toString();
                            IHandlerService handlerService = (IHandlerService) PlatformUI.getWorkbench()
                                    .getService(IHandlerService.class);
                            try {
                                handlerService.executeCommand(
                                        "org.bbaw.pdr.ae.view.main.commands.OpenAdditionalReferencesView", event); //$NON-NLS-1$
                            } catch (ExecutionException e) {
                                e.printStackTrace();
                            } catch (NotDefinedException e) {
                                e.printStackTrace();
                            } catch (NotEnabledException e) {
                                e.printStackTrace();
                            } catch (NotHandledException e) {
                                e.printStackTrace();
                            }
                        }
                    }
                }

                _openReferencesInNewTap.setChecked(false);

            }
        };
        _openReferencesInNewTap.setChecked(false);
        _openReferencesInNewTap.setImageDescriptor(_imageReg.getDescriptor(IconsInternal.REFERENCES));

        _loadQuery = new Action(NLMessages.getString("View_action_load_query")) {
            @Override
            public void run() {
                _loadQuery.setChecked(false);
                PdrQuery query = (PdrQuery) _tabFolderLeft.getItem(_tabFolderLeft.getSelectionIndex())
                        .getData("query"); //$NON-NLS-1$
                if (query != null) {
                    Event event = new Event();
                    event.data = query.clone();
                    IHandlerService handlerService = (IHandlerService) PlatformUI.getWorkbench()
                            .getService(IHandlerService.class);
                    if (query.getSearchLevel() == 0) {
                        //                  System.out.println("load query in simple search " + query.getType()); //$NON-NLS-1$
                        _comboTree.select(query.getType());
                        if (query.getCriterias() != null && query.getCriterias().firstElement() != null) {
                            String crit0 = query.getCriterias().firstElement().getCrit0();
                            //                     System.out.println("crit0 " + crit0); //$NON-NLS-1$
                            if (crit0 == null) {
                                crit0 = "ALL"; //$NON-NLS-1$
                            }
                            IAEPresentable ci = ((HashMap<String, IAEPresentable>) _comboSemanticViewer.getInput())
                                    .get(crit0);
                            if (ci == null) {
                                ci = new ConfigItem(crit0, crit0);
                                _comboSemanticViewer.add(ci);
                            }
                            IStructuredSelection selection = new StructuredSelection(ci);
                            _comboSemanticViewer.setSelection(selection);
                            if (query.getCriterias().firstElement().getSearchText() != null) {
                                _searchText.setText(query.getCriterias().firstElement().getSearchText());
                            } else {
                                _searchText.setText(""); //$NON-NLS-1$
                            }
                        } else {
                            _searchText.setText(""); //$NON-NLS-1$
                            IAEPresentable ci = ((HashMap<String, IAEPresentable>) _comboSemanticViewer.getInput())
                                    .get("ALL"); //$NON-NLS-1$
                            if (ci == null) {
                                ci = new ConfigItem("ALL", "ALL"); //$NON-NLS-1$ //$NON-NLS-2$
                                _comboSemanticViewer.add(ci);
                            }
                            IStructuredSelection selection = new StructuredSelection(ci);
                            _comboSemanticViewer.setSelection(selection);
                        }
                    } else if (query.getSearchLevel() == 1) {
                        try {
                            handlerService.executeCommand(
                                    "org.bbaw.pdr.ae.view.main.commands.OpenAdvancedSearchDialog", event); //$NON-NLS-1$
                        } catch (ExecutionException e) {
                            e.printStackTrace();
                        } catch (NotDefinedException e) {
                            e.printStackTrace();
                        } catch (NotEnabledException e) {
                            e.printStackTrace();
                        } catch (NotHandledException e) {
                            e.printStackTrace();
                        }
                    } else if (query.getSearchLevel() == 2) {
                        try {
                            handlerService.executeCommand(
                                    "org.bbaw.pdr.ae.view.main.commands.OpenExpertSearchDialog", event); //$NON-NLS-1$
                        } catch (ExecutionException e) {
                            e.printStackTrace();
                        } catch (NotDefinedException e) {
                            e.printStackTrace();
                        } catch (NotEnabledException e) {
                            e.printStackTrace();
                        } catch (NotHandledException e) {
                            e.printStackTrace();
                        }
                    }
                }
            }
        };
        _loadQuery.setChecked(false);
        _loadQuery.setImageDescriptor(_imageReg.getDescriptor(IconsInternal.SEARCH));

        _selectAllChildNods = new Action(NLMessages.getString("Views_treeview_select_all_children")) {
            @Override
            public void run() {
                TreeViewer viewer = (TreeViewer) _tabFolderLeft.getSelection().getData("viewer"); //$NON-NLS-1$
                //            System.out.println("TreeViewer " + viewer); //$NON-NLS-1$
                //            System.out.println("Selection " + viewer.getSelection()); //$NON-NLS-1$
                if (viewer != null) {
                    ArrayList<PdrObject> helpObjs = new ArrayList<PdrObject>();
                    IStructuredSelection selection = (IStructuredSelection) viewer.getSelection();
                    Object[] objs = selection.toArray();
                    TreeNode[] tns = new TreeNode[objs.length];
                    for (int i = 0; i < objs.length; i++) {
                        tns[i] = (TreeNode) objs[i];
                    }
                    for (int i = 0; i < tns.length; i++) {
                        if (tns[i].getPdrObject() != null) {
                            helpObjs.add(tns[i].getPdrObject());
                        }
                        if (tns[i].hasChildren()) {
                            for (TreeNode c : tns[i].getChildren()) {
                                if (c.getPdrObject() != null) {
                                    helpObjs.add(c.getPdrObject());
                                }
                                if (c.hasChildren()) {
                                    for (TreeNode cc : c.getChildren()) {
                                        if (cc.getPdrObject() != null) {
                                            helpObjs.add(cc.getPdrObject());
                                        }
                                        if (cc.hasChildren()) {
                                            for (TreeNode ccc : cc.getChildren()) {
                                                if (ccc.getPdrObject() != null) {
                                                    helpObjs.add(ccc.getPdrObject());
                                                }
                                                if (ccc.hasChildren()) {
                                                    for (TreeNode cccc : ccc.getChildren()) {
                                                        if (cccc.getPdrObject() != null) {
                                                            helpObjs.add(cccc.getPdrObject());
                                                        }
                                                    }
                                                }
                                            }
                                        }
                                    }
                                }
                            }
                        }
                    }
                    System.out.println("tree all children size: " + helpObjs.size());
                    _selection = helpObjs.toArray(new PdrObject[helpObjs.size()]);
                    StructuredSelection sel = null;
                    if (_selection != null) {
                        sel = new StructuredSelection(_selection);
                    }
                    selectionChanged(Treeview.this, sel);
                    _facade.setCurrentTreeObjects(_selection);
                    setStatusLine(helpObjs.size() + " " + NLMessages.getString("View_objects_selected"));

                }

                _selectAllChildNods.setChecked(false);

            }
        };
        _selectAllChildNods.setChecked(false);
        _selectAllChildNods.setImageDescriptor(_imageReg.getDescriptor(IconsInternal.TREE));

    }

    /**
     * Creates the menus.
     * @param control the control
     */
    protected final void createMenus(final Control control) {
        MenuManager menuMgr = new MenuManager();
        menuMgr.add(new GroupMarker(IWorkbenchActionConstants.MB_ADDITIONS));
        menuMgr.setRemoveAllWhenShown(true);
        menuMgr.addMenuListener(new IMenuListener() {
            @Override
            public void menuAboutToShow(final IMenuManager mgr) {
                fillMenu(mgr);
            }
        });
        Menu menu = menuMgr.createContextMenu(control);
        fillMenu(menuMgr);

        control.setMenu(menu);
        getSite().registerContextMenu(menuMgr, Treeview.this);
    }

    @Override
    public final void createPartControl(final Composite parent) {
        parent.setLayout(new GridLayout());
        _pdrQuery = new PdrQuery();
        _criteria = new Criteria();
        getSite().getPage().addSelectionListener(this);
        getSite().setSelectionProvider(this);
        _facade.addObserver(this);

        _sashFormMain = new SashForm(parent, SWT.VERTICAL);
        _sashFormMain.setLayout(new GridLayout());
        _sashFormMain.setLayoutData(new GridData(GridData.FILL_BOTH));
        {
            _currentObjectGroup = new Group(_sashFormMain, SWT.SHADOW_IN);
            _currentObjectGroup.setText(""); //$NON-NLS-1$
            _currentObjectGroup.setLayout(new GridLayout());
            ((GridLayout) _currentObjectGroup.getLayout()).numColumns = 2;
            _currentObjectGroup.setLayoutData(new GridData());
            _currentObjectText = new Text(_currentObjectGroup, SWT.MULTI | SWT.WRAP | SWT.V_SCROLL | SWT.READ_ONLY);
            _currentObjectText.setBackground(Display.getDefault().getSystemColor(SWT.COLOR_WHITE));
            _currentObjectText.setLayoutData(new GridLayout());
            _currentObjectText.setLayoutData(new GridData());
            ((GridData) _currentObjectText.getLayoutData()).horizontalAlignment = SWT.FILL;
            ((GridData) _currentObjectText.getLayoutData()).verticalAlignment = SWT.FILL;
            ((GridData) _currentObjectText.getLayoutData()).horizontalSpan = 2;
            ((GridData) _currentObjectText.getLayoutData()).grabExcessHorizontalSpace = true;
            ((GridData) _currentObjectText.getLayoutData()).grabExcessVerticalSpace = true;

            if (_advanced) {
                _addAspectButton = new Button(_currentObjectGroup, SWT.PUSH);
                _addAspectButton.setText(NLMessages.getString("View_add_new_aspect")); //$NON-NLS-1$
                _addAspectButton.setToolTipText(NLMessages.getString("View_add_new_aspect_tooltip")); //$NON-NLS-1$
                _addAspectButton.setLayoutData(new GridData());
                ((GridData) _addAspectButton.getLayoutData()).horizontalAlignment = SWT.LEFT;
                ((GridData) _addAspectButton.getLayoutData()).horizontalSpan = 2;

                _addAspectButton.setEnabled(false);
                _addAspectButton.setImage(_imageReg.get(IconsInternal.ASPECT_ADD_SAME_PERSON));
                _addAspectButton.addSelectionListener(new SelectionAdapter() {
                    @Override
                    public void widgetSelected(final SelectionEvent event) {
                        IHandlerService handlerService = (IHandlerService) PlatformUI.getWorkbench()
                                .getService(IHandlerService.class);
                        try {
                            handlerService.executeCommand("org.bbaw.pdr.ae.view.main.commands.AddNewAspect", null); //$NON-NLS-1$
                        } catch (ExecutionException e) {
                            e.printStackTrace();
                        } catch (NotDefinedException e) {
                            e.printStackTrace();
                        } catch (NotEnabledException e) {
                            e.printStackTrace();
                        } catch (NotHandledException e) {
                            e.printStackTrace();
                        }
                    }
                }); // SelectionListener

                _addSimilarAspectButton = new Button(_currentObjectGroup, SWT.PUSH);
                _addSimilarAspectButton.setText(NLMessages.getString("View_add_similar_aspect"));
                _addSimilarAspectButton.setToolTipText(NLMessages.getString("View_add_similar_aspect_tooltip")); //$NON-NLS-1$
                _addSimilarAspectButton.setLayoutData(new GridData());
                ((GridData) _addSimilarAspectButton.getLayoutData()).horizontalSpan = 2;

                ((GridData) _addSimilarAspectButton.getLayoutData()).horizontalAlignment = SWT.LEFT;
                _addSimilarAspectButton.setEnabled(false);
                _addSimilarAspectButton.setImage(_imageReg.get(IconsInternal.ASPECT_ADD_SAME_SOURCE));
                _addSimilarAspectButton.addSelectionListener(new SelectionAdapter() {
                    @Override
                    public void widgetSelected(final SelectionEvent event) {
                        IHandlerService handlerService = (IHandlerService) PlatformUI.getWorkbench()
                                .getService(IHandlerService.class);
                        try {
                            handlerService.executeCommand("org.bbaw.pdr.ae.view.main.commands.AddSimilarAspect", //$NON-NLS-1$
                                    null);
                        } catch (ExecutionException e) {
                            e.printStackTrace();
                        } catch (NotDefinedException e) {
                            e.printStackTrace();
                        } catch (NotEnabledException e) {
                            e.printStackTrace();
                        } catch (NotHandledException e) {
                            e.printStackTrace();
                        }
                    }
                });
            }
            {

                {
                    _groupTree = new Group(_sashFormMain, SWT.SHADOW_IN);
                    _groupTree.setText(NLMessages.getString("Treeview_criteriaForTree")); //$NON-NLS-1$
                    _groupTree.setLayout(new GridLayout());
                    ((GridLayout) _groupTree.getLayout()).numColumns = 4;
                    ((GridLayout) _groupTree.getLayout()).makeColumnsEqualWidth = false;
                    _groupTree.setLayoutData(new GridData());

                    {
                        Label treeSearchLabel = new Label(_groupTree, SWT.NONE);
                        treeSearchLabel.setText(NLMessages.getString("Treeview_searchFor")); //$NON-NLS-1$
                        treeSearchLabel.setLayoutData(new GridData());
                        ((GridData) treeSearchLabel.getLayoutData()).horizontalSpan = 2;

                        _comboTree = new Combo(_groupTree, SWT.READ_ONLY);
                        _comboTree.setLayoutData(new GridData());
                        ((GridData) _comboTree.getLayoutData()).horizontalAlignment = SWT.FILL;
                        ((GridData) _comboTree.getLayoutData()).grabExcessHorizontalSpace = true;
                        ((GridData) _comboTree.getLayoutData()).horizontalSpan = 2;
                        _comboTreeViewer = new ComboViewer(_comboTree);
                        _comboTreeViewer.setContentProvider(new ArrayContentProvider());
                        _comboTreeViewer.setLabelProvider(new LabelProvider() {

                            @Override
                            public String getText(final Object element) {
                                String str = (String) element;
                                return NLMessages.getString("Treeview_searchTrees_" + str); //$NON-NLS-1$
                            }

                        });
                        String[] trees = new String[] { "aspects", //$NON-NLS-1$
                                "persons", //$NON-NLS-1$
                                "references", //$NON-NLS-1$
                                "faceted-persons", //$NON-NLS-1$
                                "faceted-aspects", //$NON-NLS-1$
                                "faceted-references" }; //$NON-NLS-1$
                        _comboTreeViewer.setInput(trees);
                        _comboTree.select(1);
                        final Label treeSemanticLabel = new Label(_groupTree, SWT.NONE);
                        _comboTreeViewer.addSelectionChangedListener(new ISelectionChangedListener() {

                            @Override
                            public void selectionChanged(final SelectionChangedEvent event) {
                                ISelection iSelection = event.getSelection();
                                Object obj = ((IStructuredSelection) iSelection).getFirstElement();
                                String str = (String) obj;
                                if (str != null) {
                                    _pdrQuery.setType(_comboTree.getSelectionIndex());
                                    _pdrQuery.setCriterias(null);

                                    _criteria.setFuzzy(true);

                                    _criteria.setType("tagging"); //$NON-NLS-1$

                                    //                           System.out.println(_comboTree.getSelectionIndex() + " selected: "  //$NON-NLS-1$
                                    //                              + str); //$NON-NLS-1$
                                    if (_comboTree.getSelectionIndex() == 2) {
                                        _facetPreferenceButton.setEnabled(false);
                                        ((AEConfigPresentableContentProvider) _comboSemanticViewer
                                                .getContentProvider()).setAddALL(true);
                                        treeSemanticLabel.setText(NLMessages.getString("View_genre"));
                                        if (_facade.getAllGenres() != null && !_facade.getAllGenres().isEmpty()) {
                                            _comboSemanticViewer.setInput(_facade.getAllGenres());
                                        }
                                    } else if (_comboTree.getSelectionIndex() == 3) {
                                        _facetPreferenceButton.setEnabled(true);
                                        ((AEConfigPresentableContentProvider) _comboSemanticViewer
                                                .getContentProvider()).setAddALL(false);
                                        _criteria.setCrit0(null);
                                        _pdrQuery.setKey("content"); //$NON-NLS-1$
                                        treeSemanticLabel.setText(NLMessages.getString("View_facets"));
                                        if (_facade.getFacetProposals() != null
                                                && !_facade.getFacetProposals().isEmpty()) {
                                            _comboSemanticViewer.setInput(_facade.getFacetProposals());
                                        } else {
                                            _comboSemanticViewer.setInput(null);
                                            MessageDialog messageDialog = new MessageDialog(_parentShell,
                                                    NLMessages.getString("View_message_person_facet_empty"), null,
                                                    NLMessages.getString("View_message_person_facet_customize"),
                                                    MessageDialog.INFORMATION,
                                                    new String[] { NLMessages.getString(
                                                            "View_message_customize_person_facet_proposals"),
                                                            NLMessages.getString("Handler_cancel") },
                                                    0);
                                            int returnCode = messageDialog.open();
                                            if (returnCode == 0) {
                                                openPreferencePage(
                                                        "org.bbaw.pdr.ae.view.main.preferences.FacetedSearch");
                                                if (_facade.getFacetProposals() != null
                                                        && !_facade.getFacetProposals().isEmpty()) {
                                                    _comboSemanticViewer.setInput(_facade.getFacetProposals());
                                                }
                                            }
                                        }
                                    } else if (_comboTree.getSelectionIndex() == 4) {
                                        _facetPreferenceButton.setEnabled(true);
                                        ((AEConfigPresentableContentProvider) _comboSemanticViewer
                                                .getContentProvider()).setAddALL(false);
                                        _criteria.setCrit0(null);
                                        _pdrQuery.setKey("content"); //$NON-NLS-1$
                                        treeSemanticLabel.setText(NLMessages.getString("View_facets"));
                                        if (_facade.getAspectFacetProposals() != null
                                                && !_facade.getAspectFacetProposals().isEmpty()) {
                                            _comboSemanticViewer.setInput(_facade.getAspectFacetProposals());
                                        } else {
                                            _comboSemanticViewer.setInput(null);
                                            MessageDialog messageDialog = new MessageDialog(_parentShell,
                                                    NLMessages.getString("View_message_aspect_facet_empty"), null,
                                                    NLMessages.getString("View_message_aspect_facet_customize"),
                                                    MessageDialog.INFORMATION,
                                                    new String[] { NLMessages.getString(
                                                            "View_message_customize_aspect_facet_proposals"),
                                                            NLMessages.getString("Handler_cancel") },
                                                    0);
                                            int returnCode = messageDialog.open();
                                            if (returnCode == 0) {
                                                openPreferencePage(
                                                        "org.bbaw.pdr.ae.view.main.preferences.FacetedAspectSearch");
                                                if (_facade.getAspectFacetProposals() != null
                                                        && !_facade.getAspectFacetProposals().isEmpty()) {
                                                    _comboSemanticViewer
                                                            .setInput(_facade.getAspectFacetProposals());
                                                }
                                            }

                                        }
                                    } else if (_comboTree.getSelectionIndex() == 5) {
                                        _facetPreferenceButton.setEnabled(false);
                                        ((AEConfigPresentableContentProvider) _comboSemanticViewer
                                                .getContentProvider()).setAddALL(false);
                                        _criteria.setCrit0(null);
                                        treeSemanticLabel.setText(NLMessages.getString("View_facets"));
                                        HashMap<String, ConfigItem> refFacetsConfigItems = new HashMap<String, ConfigItem>(
                                                _refFacets.length);
                                        for (int i = 0; i < _refFacets.length; i++) {
                                            ConfigItem ci = new ConfigItem();
                                            ci.setValue(_refFacets[i]);
                                            ci.setLabel(NLMessages.getString("Editor_" + ci.getValue())); //$NON-NLS-1$
                                            refFacetsConfigItems.put(ci.getValue(), ci);
                                        }
                                        _comboSemanticViewer.setInput(refFacetsConfigItems);
                                    } else {
                                        ((AEConfigPresentableContentProvider) _comboSemanticViewer
                                                .getContentProvider()).setAddALL(true);
                                        treeSemanticLabel.setText(NLMessages.getString("View_semantic"));
                                        if (_facade.getAllSemantics() != null
                                                && !_facade.getAllSemantics().isEmpty()) {
                                            _comboSemanticViewer.setInput(_facade.getAllSemantics());
                                        }
                                        _facetPreferenceButton.setEnabled(false);

                                    }
                                    _comboTag.select(0);
                                }
                            }

                        });

                        _pdrQuery.setType(_comboTree.getSelectionIndex());
                        _pdrQuery.setCriterias(null);
                        _criteria.setType("tagging"); //$NON-NLS-1$
                        _criteria.setFuzzy(true);

                        treeSemanticLabel.setText(NLMessages.getString("Treeview_semantic_genre")); //$NON-NLS-1$
                        treeSemanticLabel.setLayoutData(new GridData());

                        _facetPreferenceButton = new Button(_groupTree, SWT.READ_ONLY);
                        _facetPreferenceButton.setLayoutData(new GridData());
                        ((GridData) _facetPreferenceButton.getLayoutData()).horizontalAlignment = SWT.RIGHT;
                        _facetPreferenceButton.setImage(_imageReg.get(IconsInternal.PREFERENCES));
                        _facetPreferenceButton.setEnabled(false);
                        _facetPreferenceButton.addSelectionListener(new SelectionAdapter() {
                            @Override
                            public void widgetSelected(final SelectionEvent event) {
                                ArrayList<Parameterization> parameters = new ArrayList<Parameterization>();
                                IParameter iparam = null;

                                // get the command from plugin.xml
                                IWorkbenchWindow window = PlatformUI.getWorkbench().getActiveWorkbenchWindow();
                                ICommandService cmdService = (ICommandService) window
                                        .getService(ICommandService.class);
                                Command cmd = cmdService.getCommand("org.eclipse.ui.window.preferences");

                                // get the parameter
                                try {
                                    iparam = cmd.getParameter("preferencePageId");
                                } catch (NotDefinedException e1) {
                                    e1.printStackTrace();
                                }
                                String pageID = null;
                                switch (_pdrQuery.getType()) {
                                case 3:
                                    pageID = "org.bbaw.pdr.ae.view.main.preferences.FacetedSearch";
                                    break;
                                case 4:
                                    pageID = "org.bbaw.pdr.ae.view.main.preferences.FacetedAspectSearch";
                                    break;

                                default:
                                    break;
                                }
                                if (pageID != null) {
                                    Parameterization params = new Parameterization(iparam, pageID);
                                    parameters.add(params);

                                    // build the parameterized command
                                    ParameterizedCommand pc = new ParameterizedCommand(cmd,
                                            parameters.toArray(new Parameterization[parameters.size()]));

                                    // execute the command
                                    try {
                                        IHandlerService handlerService = (IHandlerService) window
                                                .getService(IHandlerService.class);
                                        handlerService.executeCommand(pc, null);
                                    } catch (ExecutionException e) {
                                        e.printStackTrace();
                                    } catch (NotDefinedException e) {
                                        e.printStackTrace();
                                    } catch (NotEnabledException e) {
                                        e.printStackTrace();
                                    } catch (NotHandledException e) {
                                        e.printStackTrace();
                                    }
                                }

                            }
                        }); // SelectionListener

                        _comboTag = new Combo(_groupTree, SWT.READ_ONLY);
                        _comboTag.setLayoutData(new GridData());
                        ((GridData) _comboTag.getLayoutData()).horizontalAlignment = SWT.FILL;
                        ((GridData) _comboTag.getLayoutData()).grabExcessHorizontalSpace = true;
                        ((GridData) _comboTag.getLayoutData()).horizontalSpan = 2;
                        _comboSemanticViewer = new ComboViewer(_comboTag);
                        _comboSemanticViewer.setContentProvider(new AEConfigPresentableContentProvider());
                        _comboSemanticViewer.setLabelProvider(new AEConfigPresentableLabelProvider());
                        ((AEConfigPresentableContentProvider) _comboSemanticViewer.getContentProvider())
                                .setAddALL(true);
                        if (_facade.getAllSemantics() != null && !_facade.getAllSemantics().isEmpty()) {
                            _comboSemanticViewer.setInput(_facade.getAllSemantics());
                            _comboTag.select(0);
                            _criteria.setCrit0(_comboTag.getItem(0));
                        }

                        _comboSemanticViewer.addSelectionChangedListener(new ISelectionChangedListener() {

                            @Override
                            public void selectionChanged(final SelectionChangedEvent event) {
                                ISelection iSelection = event.getSelection();
                                Object obj = ((IStructuredSelection) iSelection).getFirstElement();
                                IAEPresentable cp = (IAEPresentable) obj;
                                if (cp != null) {
                                    _criteria.setType("tagging"); //$NON-NLS-1$
                                    _criteria.setFuzzy(true);
                                    if (_comboTree.getSelectionIndex() == 3
                                            || _comboTree.getSelectionIndex() == 4) {
                                        _criteria.setCrit0(null);
                                        ConfigItem ci = (ConfigItem) cp;
                                        if (ci.getPos() != null && ci.getPos().equals("type")) //$NON-NLS-1$
                                        {
                                            try {
                                                String[] facetStrings = _mainSearcher.getFacets("tagging", //$NON-NLS-1$
                                                        ci.getParent().getValue().substring(5), ci.getValue(), null, null);
                                                setQueryFacets(_pdrQuery, facetStrings);
                                            } catch (Exception e1) {
                                                e1.printStackTrace();
                                            }
                                        } else if (ci.getPos() != null && ci.getPos().equals("subtype")) //$NON-NLS-1$
                                        {
                                            try {
                                                String[] facetStrings = _mainSearcher.getFacets("tagging",
                                                        ((ConfigItem) ci.getParent()).getParent().getValue()
                                                                .substring(5),
                                                        ci.getParent().getValue(), ci.getValue(), //$NON-NLS-1$
                                                        null);
                                                setQueryFacets(_pdrQuery, facetStrings);
                                            } catch (Exception e1) {
                                                e1.printStackTrace();
                                            }
                                        } else if (ci.getPos() != null && ci.getPos().equals("role")) //$NON-NLS-1$
                                        {
                                            try {
                                                String[] facetStrings = _mainSearcher.getFacets("tagging",
                                                        ((ConfigItem) ((ConfigItem) ci.getParent()).getParent())
                                                                .getParent().getValue().substring(5),
                                                        ((ConfigItem) ci.getParent()).getParent().getValue(),
                                                        ci.getParent().getValue(), ci.getValue()); //$NON-NLS-1$
                                                setQueryFacets(_pdrQuery, facetStrings);
                                            } catch (Exception e1) {
                                                e1.printStackTrace();
                                            }
                                        }

                                        // try {
                                        // _pdrQuery.setFacets(_mainSearcher.getFacets("tagging",
                                        // "name", cp.getValue(), null, null));
                                        // } catch (XQException e) {
                                        // e.printStackTrace();
                                        // }
                                        _criteria.setCrit0("ALL"); //$NON-NLS-1$

                                    } else if (_comboTree.getSelectionIndex() == 5) {
                                        _criteria.setCrit0(null);
                                        ConfigItem ci = (ConfigItem) cp;
                                        String type = null;
                                        String[] referenceFacets = null;
                                        if (ci.getValue().equals("name")) //$NON-NLS-1$
                                        {
                                            ci.setValue("namePart"); //$NON-NLS-1$
                                            type = "family"; //$NON-NLS-1$
                                        }
                                        try {
                                            referenceFacets = _mainSearcher.getFacets("reference", ci.getValue(), //$NON-NLS-1$
                                                    type, null, null);
                                        } catch (Exception e) {
                                            // TODO Auto-generated catch block
                                            e.printStackTrace();
                                        }
                                        if (ci.getValue().equals("genre")) //$NON-NLS-1$
                                        {
                                            _pdrQuery.setKey("genre"); //$NON-NLS-1$

                                        } else {
                                            _pdrQuery.setKey(null);
                                        }
                                        setQueryFacets(_pdrQuery, referenceFacets);
                                    } else if (cp.getValue() == null || cp.getValue().equals("ALL")
                                            || cp.getLabel() == null || cp.getLabel().equals("ALL")) //$NON-NLS-1$ //$NON-NLS-2$
                                    {
                                        _criteria.setCrit0(null);

                                    } else {
                                        _criteria.setCrit0(cp.getValue());
                                    }

                                }
                            }
                        });
                        // _comboTag.addSelectionListener(new SelectionAdapter()
                        // {
                        // public void widgetSelected(SelectionEvent se)
                        // {
                        //                       _criteria.setType("tagging"); //$NON-NLS-1$
                        // _criteria.setFuzzy(true);
                        //
                        // // if facet person search set facets.
                        // if (_pdrQuery.getType() == 3)
                        // {
                        // try {
                        // _pdrQuery.setFacets(_mainSearcher.getFacets("tagging",
                        // "name",
                        // _comboTag.getItem(_comboTag.getSelectionIndex()),
                        // null, null));
                        // } catch (XQException e) {
                        // e.printStackTrace();
                        // }
                        // _criteria.setCrit0("ALL");
                        //
                        // }
                        // else
                        // {
                        // _criteria.setCrit0(_comboTag.getItem(_comboTag.getSelectionIndex()));
                        // }
                        // // System.out.println(_comboTag.getSelectionIndex()
                        ////                          + " selected: " //$NON-NLS-1$
                        // // +
                        // _comboTag.getItem(_comboTag.getSelectionIndex()));
                        // }
                        // }); //SelectionListener

                        _searchText = new Text(_groupTree, SWT.BORDER);
                        _searchText.setLayoutData(new GridData());
                        _searchText.setLayoutData(new GridData());
                        ((GridData) _searchText.getLayoutData()).horizontalAlignment = SWT.FILL;
                        ((GridData) _searchText.getLayoutData()).grabExcessHorizontalSpace = true;
                        ((GridData) _searchText.getLayoutData()).horizontalSpan = 4;

                        ControlDecoration decoValIdInfo = new ControlDecoration(_searchText, SWT.LEFT | SWT.BOTTOM);
                        decoValIdInfo.setDescriptionText(
                                "Use ? as wildcard for a single character.\nUse * for any number of characters.");
                        decoValIdInfo.setImage(FieldDecorationRegistry.getDefault()
                                .getFieldDecoration(FieldDecorationRegistry.DEC_INFORMATION).getImage());
                        decoValIdInfo.setShowOnlyOnFocus(false);

                        _searchText.addKeyListener(new KeyListener() {

                            @Override
                            public void keyPressed(final KeyEvent e) {
                                if (e.keyCode == SWT.CR) {
                                    search();
                                }
                            }

                            @Override
                            public void keyReleased(final KeyEvent e) {
                                // TODO Auto-generated method stub

                            }
                        });

                        if (_advanced) {
                            Button advancedTreeButton = new Button(_groupTree, SWT.PUSH);
                            advancedTreeButton.setText(NLMessages.getString("Treeview_advanced")); //$NON-NLS-1$
                            advancedTreeButton
                                    .setToolTipText(NLMessages.getString("View_open_advanced_search_tooltip"));
                            advancedTreeButton.setImage(_imageReg.get(IconsInternal.SEARCH_ADVANCED));
                            advancedTreeButton.setLayoutData(new GridData());
                            ((GridData) advancedTreeButton.getLayoutData()).horizontalAlignment = SWT.LEFT;

                            advancedTreeButton.addSelectionListener(new SelectionAdapter() {
                                @Override
                                public void widgetSelected(final SelectionEvent event) {

                                    IHandlerService handlerService = (IHandlerService) PlatformUI.getWorkbench()
                                            .getService(IHandlerService.class);
                                    try {
                                        handlerService.executeCommand(
                                                "org.bbaw.pdr.ae.view.main.commands.OpenAdvancedSearchDialog", //$NON-NLS-1$
                                                null);
                                    } catch (ExecutionException e) {
                                        e.printStackTrace();
                                    } catch (NotDefinedException e) {
                                        e.printStackTrace();
                                    } catch (NotEnabledException e) {
                                        e.printStackTrace();
                                    } catch (NotHandledException e) {
                                        e.printStackTrace();
                                    }
                                }
                            });

                            Button expertTreeButton = new Button(_groupTree, SWT.PUSH);
                            expertTreeButton.setText(NLMessages.getString("Treeview_expert")); //$NON-NLS-1$
                            expertTreeButton
                                    .setToolTipText(NLMessages.getString("View_open_expert_search_tooltip"));
                            expertTreeButton.setImage(_imageReg.get(IconsInternal.SEARCH_EXPERT));
                            expertTreeButton.setLayoutData(new GridData());
                            ((GridData) expertTreeButton.getLayoutData()).horizontalAlignment = SWT.LEFT;
                            ((GridData) expertTreeButton.getLayoutData()).horizontalSpan = 2;

                            expertTreeButton.addSelectionListener(new SelectionAdapter() {
                                @Override
                                public void widgetSelected(final SelectionEvent event) {

                                    IHandlerService handlerService = (IHandlerService) PlatformUI.getWorkbench()
                                            .getService(IHandlerService.class);
                                    try {
                                        handlerService.executeCommand(
                                                "org.bbaw.pdr.ae.view.main.commands.OpenExpertSearchDialog", null); //$NON-NLS-1$
                                    } catch (ExecutionException e) {
                                        e.printStackTrace();
                                    } catch (NotDefinedException e) {
                                        e.printStackTrace();
                                    } catch (NotEnabledException e) {
                                        e.printStackTrace();
                                    } catch (NotHandledException e) {
                                        e.printStackTrace();
                                    }
                                }
                            });
                        }

                        _treeButton = new Button(_groupTree, SWT.PUSH);
                        _treeButton.setText(NLMessages.getString("View_search")); //$NON-NLS-1$
                        _treeButton.setToolTipText(NLMessages.getString("View_create_tree_tooltip"));
                        _treeButton.setLayoutData(new GridData());
                        ((GridData) _treeButton.getLayoutData()).horizontalAlignment = SWT.RIGHT;
                        ((GridData) _treeButton.getLayoutData()).horizontalSpan = 1;

                        _treeButton.setImage(_imageReg.get(IconsInternal.SEARCH));

                        _treeButton.addSelectionListener(new SelectionAdapter() {
                            @Override
                            public void widgetSelected(final SelectionEvent event) {
                                search();
                            }
                        }); // SelectionListener
                    } // _groupTree
                }

            }
            buildTabFolderLeft();

            _sashFormMain.setWeights(new int[] { 1, 4 });

        }
    }

    /**
     * creates new TabItem for TreeBuilder in which the newly generated Tree is
     * beeing shown. This method is separated from the TreeBuilder itself in
     * order to pass the Treeviewermethod later to a separate thread.
     * @param tabFolderLeft tabFolder
     * @param name name
     */
    @SuppressWarnings("unused")
    private void createTabItem(final TabFolder tabFolderLeft, final String name) {

        TabItem tabItemLowerLeftPersonen = new TabItem(tabFolderLeft, SWT.NONE);
        tabItemLowerLeftPersonen.setText(name);
        tabFolderLeft.setSelection(tabItemLowerLeftPersonen);
        // setBulb();
        Tree tree = new Tree(_tabFolderLeft, SWT.BORDER);
        tabItemLowerLeftPersonen.setControl(tree);
        PlatformUI.getWorkbench().getHelpSystem().setHelp(tree, "org.bbaw.pdr.ae.help.objectsTree"); //$NON-NLS-1$
        // buildTree(tree);

    }

    /**
     * Creates the tree viewer.
     * @param tabFolderLeft the _tab folder left
     * @param key the key
     */
    private void createTreeViewer(final CTabFolder tabFolderLeft, final String key) {

        CTabItem tabItemLowerLeftPersonen;
        Tree tree;
        String type = "";
        if (key.equals("allPersons")) //$NON-NLS-1$
        {
            tabItemLowerLeftPersonen = new CTabItem(tabFolderLeft, SWT.NONE);
            tabItemLowerLeftPersonen.setText(NLMessages.getString("Treeview_all_persons"));
            tabItemLowerLeftPersonen.setData("key", key); //$NON-NLS-1$
            tabItemLowerLeftPersonen.setData("type", "pdrPo"); //$NON-NLS-1$

            tabFolderLeft.setSelection(tabItemLowerLeftPersonen);
            // setBulb();
            tabItemLowerLeftPersonen.setImage(_imageReg.get(IconsInternal.PERSONS));
            tree = new Tree(tabFolderLeft, SWT.BORDER | SWT.MULTI);
            tabItemLowerLeftPersonen.setControl(tree);
            PlatformUI.getWorkbench().getHelpSystem().setHelp(tree, "org.bbaw.pdr.ae.help.objectsTree"); //$NON-NLS-1$
            _allPersonsTreeViewer = new TreeViewer(tree);
            _allPersonsTreeViewer.setData("key", 1); //$NON-NLS-1$
            _allPersonsTreeViewer.setData("tab", tabItemLowerLeftPersonen); //$NON-NLS-1$

            tabItemLowerLeftPersonen.setData("viewer", _allPersonsTreeViewer); //$NON-NLS-1$
            _allPersonsTreeViewer.setContentProvider(new TreeContentProvider());
            _allPersonsTreeViewer.setLabelProvider(new TreeLabelProvider());
            _allPersonsTreeViewer.setUseHashlookup(true);
            _treeViewerMap.put(key, _allPersonsTreeViewer);
            if (!_facade.getLazyLoading()) {
                if (_facade.getAllPersons() == null || _facade.getAllPersons().isEmpty()) {
                    UIJob job = new UIJob(key) {

                        @Override
                        public IStatus runInUIThread(final IProgressMonitor monitor) {
                            try {
                                _facade.setAllPersons(_mainSearcher.searchAllPersons());
                            } catch (Exception e) {
                                e.printStackTrace();
                            }
                            if (monitor.isCanceled()) {
                                return Status.CANCEL_STATUS;
                            }

                            return Status.OK_STATUS;
                        }
                    };
                    job.setUser(true);
                    job.schedule();

                }
            } else {
                TreeNode root = new TreeSearchHelper().getTreeNodeAlphabet("pdrPo", 1);
                _allPersonsTreeViewer.setInput(root);
            }

            // Create menu, toolbars, filters, sorters.
            // createActions();
            // createMenus(_allPersonsTreeViewer);
            // _allPersonsTreeViewer.setInput(_facade.getAllPersons());
            buildTree(_allPersonsTreeViewer);
            setStatusLine("Ready");

        } else if (key.equals("allReferences")) //$NON-NLS-1$
        {
            tabItemLowerLeftPersonen = new CTabItem(_tabFolderLeft, SWT.NONE);
            tabItemLowerLeftPersonen.setText(NLMessages.getString("Treeview_all_references"));
            tabItemLowerLeftPersonen.setData("key", key); //$NON-NLS-1$
            tabItemLowerLeftPersonen.setData("type", "pdrRo"); //$NON-NLS-1$

            _tabFolderLeft.setSelection(tabItemLowerLeftPersonen);
            tabItemLowerLeftPersonen.setImage(_imageReg.get(IconsInternal.REFERENCES));
            tree = new Tree(_tabFolderLeft, SWT.BORDER | SWT.MULTI);
            tabItemLowerLeftPersonen.setControl(tree);

            PlatformUI.getWorkbench().getHelpSystem().setHelp(tree, "org.bbaw.pdr.ae.help.objectsTree"); //$NON-NLS-1$
            _allReferencesTreeViewer = new TreeViewer(tree);
            _allReferencesTreeViewer.setData("key", 2); //$NON-NLS-1$
            _allReferencesTreeViewer.setData("tab", tabItemLowerLeftPersonen); //$NON-NLS-1$

            tabItemLowerLeftPersonen.setData("viewer", _allReferencesTreeViewer); //$NON-NLS-1$

            if (_facade.getAllReferences() == null || _facade.getAllReferences().isEmpty()) {
                setStatusLine("Performing Search " + key);
                UIJob job = new UIJob(key) {

                    @Override
                    public IStatus runInUIThread(final IProgressMonitor monitor) {
                        try {
                            _facade.setAllReferences(_mainSearcher.searchAllReferences());
                        } catch (Exception e) {
                            e.printStackTrace();
                        }
                        if (monitor.isCanceled()) {
                            return Status.CANCEL_STATUS;
                        }

                        return Status.OK_STATUS;
                    }
                };
                job.setUser(true);
                job.schedule();

            }

            _allReferencesTreeViewer.setContentProvider(new TreeContentProvider());
            _allReferencesTreeViewer.setLabelProvider(new TreeLabelProvider());
            _treeViewerMap.put(key, _allReferencesTreeViewer);
            // Create menu, toolbars, filters, sorters.
            // createActions();
            // createMenus(_allReferencesTreeViewer);

            _allReferencesTreeViewer.setInput(_facade.getAllReferences());
            buildTree(_allReferencesTreeViewer);
            setStatusLine("Ready");
        }

        else {
            tabItemLowerLeftPersonen = new CTabItem(_tabFolderLeft, SWT.CLOSE);
            tabItemLowerLeftPersonen.setText(key);
            tabItemLowerLeftPersonen.setData("key", key); //$NON-NLS-1$
            _tabFolderLeft.setSelection(tabItemLowerLeftPersonen);

            tree = new Tree(_tabFolderLeft, SWT.BORDER | SWT.MULTI);
            tabItemLowerLeftPersonen.setControl(tree);

            PlatformUI.getWorkbench().getHelpSystem().setHelp(tree, "org.bbaw.pdr.ae.help.objectsTree"); //$NON-NLS-1$
            //            System.out.println("pdrQeuery type: " +_pdrQuery.getType()); //$NON-NLS-1$
            if (_pdrQuery.getType() == 0)

            {
                tabItemLowerLeftPersonen.setImage(_imageReg.get(IconsInternal.ASPECTS));
                tabItemLowerLeftPersonen.setData("type", "pdrAo"); //$NON-NLS-1$

                _treeViewer = new TreeViewer(tree);
                _treeViewer.setData("key", 0); //$NON-NLS-1$
                _treeViewer.setData("tab", tabItemLowerLeftPersonen); //$NON-NLS-1$

                tabItemLowerLeftPersonen.setData("viewer", _treeViewer); //$NON-NLS-1$
                tabItemLowerLeftPersonen.setData("query", _pdrQuery.clone()); //$NON-NLS-1$
                _treeViewer.setContentProvider(new TreeContentProvider());
                _treeViewer.setLabelProvider(new TreeLabelProvider());
                _treeViewerMap.put(key, _treeViewer);
                type = "pdrAo";
                setStatusLine("Performing Search " + key);
                UIJob job = new UIJob(_treeViewer.getTree().getDisplay(), key) {

                    @Override
                    public IStatus runInUIThread(final IProgressMonitor monitor) {
                        _searchResult = null;
                        try {
                            _searchResult = _mainSearcher.searchAspects(_pdrQuery, monitor);
                            _treeViewer.setInput(_searchResult);
                            setStatusLine("Ready");
                        } catch (Exception e) {
                            // TODO Auto-generated catch block
                            e.printStackTrace();
                        }
                        if (monitor.isCanceled()) {
                            return Status.CANCEL_STATUS;
                        }
                        return Status.OK_STATUS;
                    }
                };
                job.setUser(true);
                job.schedule();
            } else if (_pdrQuery.getType() == 1)

            {
                tabItemLowerLeftPersonen.setImage(_imageReg.get(IconsInternal.PERSONS));
                tabItemLowerLeftPersonen.setData("key", key); //$NON-NLS-1$
                tabItemLowerLeftPersonen.setData("type", "pdrPo"); //$NON-NLS-1$

                _treeViewer = new TreeViewer(tree);
                _treeViewer.setData("key", 1); //$NON-NLS-1$
                _treeViewer.setData("tab", tabItemLowerLeftPersonen); //$NON-NLS-1$

                tabItemLowerLeftPersonen.setData("viewer", _treeViewer); //$NON-NLS-1$
                tabItemLowerLeftPersonen.setData("query", _pdrQuery.clone()); //$NON-NLS-1$
                _treeViewer.setContentProvider(new TreeContentProvider());
                _treeViewer.setLabelProvider(new TreeLabelProvider());
                _treeViewerMap.put(key, _treeViewer);
                type = "pdrPo";
                setStatusLine("Performing Search " + key);
                Job job = new Job(key) {
                    @Override
                    protected IStatus run(final IProgressMonitor monitor) {
                        _searchResult = null;
                        try {
                            _searchResult = _mainSearcher.searchPersons(_pdrQuery, monitor);
                        } catch (Exception e) {
                            // TODO Auto-generated catch block
                            e.printStackTrace();
                        }
                        if (monitor.isCanceled()) {
                            return Status.CANCEL_STATUS;
                        }
                        UIJob job = new UIJob(_treeViewer.getTree().getDisplay(), "Load Result") {
                            @Override
                            public IStatus runInUIThread(final IProgressMonitor monitor) {
                                _treeViewer.setInput(_searchResult);
                                setStatusLine("Ready");
                                return Status.OK_STATUS;
                            }
                        };
                        job.setUser(true);
                        job.schedule();
                        return Status.OK_STATUS;
                    }
                };
                job.setUser(true);
                job.schedule();
            } else if (_pdrQuery.getType() == 2) {
                tabItemLowerLeftPersonen.setImage(_imageReg.get(IconsInternal.REFERENCES));
                tabItemLowerLeftPersonen.setData("key", key); //$NON-NLS-1$
                tabItemLowerLeftPersonen.setData("type", "pdrRo"); //$NON-NLS-1$

                _treeViewer = new TreeViewer(tree);
                _treeViewer.setData("key", 2); //$NON-NLS-1$
                _treeViewer.setData("tab", tabItemLowerLeftPersonen); //$NON-NLS-1$

                tabItemLowerLeftPersonen.setData("viewer", _treeViewer); //$NON-NLS-1$
                tabItemLowerLeftPersonen.setData("query", _pdrQuery.clone()); //$NON-NLS-1$
                _treeViewer.setContentProvider(new TreeContentProvider());
                _treeViewer.setLabelProvider(new TreeLabelProvider());
                _treeViewerMap.put(key, _treeViewer);
                type = "pdrRo";
                setStatusLine("Performing Search " + key);
                Job job = new Job(key) {
                    @Override
                    protected IStatus run(final IProgressMonitor monitor) {
                        _searchResult = null;
                        try {
                            _searchResult = _mainSearcher.searchReferences(_pdrQuery, monitor);
                        } catch (Exception e) {
                            // TODO Auto-generated catch block
                            e.printStackTrace();
                        }
                        if (monitor.isCanceled()) {
                            return Status.CANCEL_STATUS;
                        }
                        UIJob job = new UIJob(_treeViewer.getTree().getDisplay(), "Load Result") {
                            @Override
                            public IStatus runInUIThread(final IProgressMonitor monitor) {
                                _treeViewer.setInput(_searchResult);
                                setStatusLine("Ready");
                                return Status.OK_STATUS;
                            }
                        };
                        job.setUser(true);
                        job.schedule();
                        return Status.OK_STATUS;
                    }
                };
                job.setUser(true);
                job.schedule();
            } else if (_pdrQuery.getType() == 3) {
                tabItemLowerLeftPersonen.setImage(_imageReg.get(IconsInternal.PERSONS));
                tabItemLowerLeftPersonen.setData("key", key); //$NON-NLS-1$
                tabItemLowerLeftPersonen.setData("type", "facet"); //$NON-NLS-1$

                _treeViewer = new TreeViewer(tree);
                _treeViewer.setData("key", 3); //$NON-NLS-1$
                _treeViewer.setData("tab", tabItemLowerLeftPersonen); //$NON-NLS-1$

                tabItemLowerLeftPersonen.setData("viewer", _treeViewer); //$NON-NLS-1$
                tabItemLowerLeftPersonen.setData("query", _pdrQuery.clone()); //$NON-NLS-1$
                _treeViewer.setContentProvider(new TreeContentProvider());
                _treeViewer.setLabelProvider(new TreeLabelProvider());
                _treeViewerMap.put(key, _treeViewer);
                type = "pdrPo";
                setStatusLine("Performing Search " + key);

                //              System.out.println("im else teil pers, nun er soll nach facet-person suchen"); //$NON-NLS-1$
                Job job = new Job(key) {
                    @Override
                    protected IStatus run(final IProgressMonitor monitor) {
                        int work = 10;
                        if (_pdrQuery.getFacets() != null) {
                            work = _pdrQuery.getFacets().size();
                        }
                        monitor.beginTask("Searching... Number of Facets: " + work, work);
                        try {
                            _searchResult = _mainSearcher.searchFacetPersons(_pdrQuery, monitor);
                        } catch (Exception e) {
                            // TODO Auto-generated catch block
                            e.printStackTrace();
                        }

                        UIJob job = new UIJob(_treeViewer.getTree().getDisplay(), "Load Result") {
                            @Override
                            public IStatus runInUIThread(final IProgressMonitor monitor) {
                                _treeViewer.setInput(_searchResult);
                                setStatusLine("Ready");
                                return Status.OK_STATUS;
                            }
                        };

                        job.setUser(true);
                        job.schedule();
                        return Status.OK_STATUS;
                    }
                };
                job.setUser(true);
                job.schedule();

            } else if (_pdrQuery.getType() == 4) {
                tabItemLowerLeftPersonen.setImage(_imageReg.get(IconsInternal.ASPECTS));
                tabItemLowerLeftPersonen.setData("key", key); //$NON-NLS-1$
                tabItemLowerLeftPersonen.setData("type", "facet"); //$NON-NLS-1$

                _treeViewer = new TreeViewer(tree);
                _treeViewer.setData("key", 4); //$NON-NLS-1$
                _treeViewer.setData("tab", tabItemLowerLeftPersonen); //$NON-NLS-1$

                tabItemLowerLeftPersonen.setData("viewer", _treeViewer); //$NON-NLS-1$
                tabItemLowerLeftPersonen.setData("query", _pdrQuery.clone()); //$NON-NLS-1$
                _treeViewer.setContentProvider(new TreeContentProvider());
                _treeViewer.setLabelProvider(new TreeLabelProvider());
                _treeViewerMap.put(key, _treeViewer);
                type = "pdrAo";
                setStatusLine("Performing Search " + key);

                Job job = new Job(key) {
                    @Override
                    protected IStatus run(final IProgressMonitor monitor) {
                        int work = 10;
                        if (_pdrQuery.getFacets() != null) {
                            work = _pdrQuery.getFacets().size();
                        }
                        monitor.beginTask("Searching... Number of Facets: " + work, work);
                        try {
                            _searchResult = _mainSearcher.searchFacetAspects(_pdrQuery, monitor);
                        } catch (Exception e) {
                            // TODO Auto-generated catch block
                            e.printStackTrace();
                        }

                        UIJob job = new UIJob(_treeViewer.getTree().getDisplay(), "Load Result") {
                            @Override
                            public IStatus runInUIThread(final IProgressMonitor monitor) {
                                _treeViewer.setInput(_searchResult);
                                setStatusLine("Ready");
                                if (monitor.isCanceled()) {
                                    return Status.CANCEL_STATUS;
                                }
                                return Status.OK_STATUS;
                            }
                        };
                        job.setUser(true);
                        job.schedule();
                        return Status.OK_STATUS;
                    }
                };
                job.setUser(true);
                job.schedule();
            } else if (_pdrQuery.getType() == 5) {
                tabItemLowerLeftPersonen.setImage(_imageReg.get(IconsInternal.REFERENCES));
                tabItemLowerLeftPersonen.setData("key", key); //$NON-NLS-1$
                tabItemLowerLeftPersonen.setData("type", "facet"); //$NON-NLS-1$

                _treeViewer = new TreeViewer(tree);
                _treeViewer.setData("key", 3); //$NON-NLS-1$
                _treeViewer.setData("tab", tabItemLowerLeftPersonen); //$NON-NLS-1$

                tabItemLowerLeftPersonen.setData("viewer", _treeViewer); //$NON-NLS-1$
                tabItemLowerLeftPersonen.setData("query", _pdrQuery.clone()); //$NON-NLS-1$
                _treeViewer.setContentProvider(new TreeContentProvider());
                _treeViewer.setLabelProvider(new TreeLabelProvider());
                _treeViewerMap.put(key, _treeViewer);
                type = "pdrRo";
                setStatusLine("Performing Search " + key);
                Job job = new Job(key) {
                    @Override
                    protected IStatus run(final IProgressMonitor monitor) {
                        try {
                            _searchResult = _mainSearcher.searchFacetReferences(_pdrQuery, monitor);
                        } catch (Exception e) {
                            // TODO Auto-generated catch block
                            e.printStackTrace();
                        }
                        if (monitor.isCanceled()) {
                            return Status.CANCEL_STATUS;
                        }
                        UIJob job = new UIJob(_treeViewer.getTree().getDisplay(), "Load Result") {
                            @Override
                            public IStatus runInUIThread(final IProgressMonitor monitor) {
                                _treeViewer.setInput(_searchResult);
                                setStatusLine("Ready");
                                return Status.OK_STATUS;
                            }
                        };
                        job.setUser(true);
                        job.schedule();
                        return Status.OK_STATUS;
                    }
                };
                job.setUser(true);
                job.schedule();
            }

            if (_treeViewer.getInput() == null) {
                _treeViewer.setContentProvider(new TreeContentProvider());
                _treeViewer.setLabelProvider(new TreeLabelProvider());

                TreeNode tn = new TreeNode("Error", "Error"); //$NON-NLS-1$ //$NON-NLS-2$
                tn.addChild(new TreeNode("Error", "Error")); //$NON-NLS-1$ //$NON-NLS-2$
                _treeViewer.setInput(tn);
            }
            // get the window (which is a IServiceLocator)
            IWorkbenchWindow window = PlatformUI.getWorkbench().getActiveWorkbenchWindow();
            // get the service
            ISourceProviderService service = (ISourceProviderService) window
                    .getService(ISourceProviderService.class);
            // get our source provider by querying by the variable name
            TreeSelectionSourceProvider treeSelectionSourceProvider = (TreeSelectionSourceProvider) service
                    .getSourceProvider(AEPluginIDs.SOURCE_PARAMETER_TREE);
            // set the value
            treeSelectionSourceProvider.setTreeSelection(key);
            treeSelectionSourceProvider.setTreeType(type);
            treeSelectionSourceProvider.setTreeViewer(_treeViewer);
            setStatusLine("Ready"); //$NON-NLS-1$
            buildTree(_treeViewer);

        }
        // XXX anpassen an all person.

    }

    @Override
    public final void dispose() {
        // ISelectionService selectionService =
        // (ISelectionService)getSite().getService(ISelectionService.class);
        // selectionService.removeSelectionListener(this);
        super.dispose();
    }

    /**
     * Dispose tab items.
     */
    private void disposeTabItems() {

        if (_tabFolderLeft != null) {
            _tabFolderLeft.dispose();
        }

    }

    /**
     * Fill menu.
     * @param rootMenuManager the root menu manager
     */
    protected final void fillMenu(final IMenuManager rootMenuManager) {
        rootMenuManager.add(_openAspectsInNewTap);
        rootMenuManager.add(_openReferencesInNewTap);
        rootMenuManager.add(new Separator());
        rootMenuManager.add(_loadQuery);
        rootMenuManager.add(_selectAllChildNods);
        rootMenuManager.add(new Separator());
        // IMenuManager filterSubmenu = new
        // MenuManager(NLMessages.getString("View_submenu_filters"));
        // rootMenuManager.add(filterSubmenu);
        // filterSubmenu.add(onlyUpdatedObjects);
        // filterSubmenu.add(onlyNewObjects);
        // filterSubmenu.add(onlyIncorrectObjects);
        // switch (key)
        // {
        // case 0:
        // {
        // filterSubmenu.add(onlyAspectsWithDivergentMarkup);
        // break;
        // }
        // case 1:
        // {
        // filterSubmenu.add(onlyPersonConcurrences);
        // filterSubmenu.add(onlyPersonIdentifiers);
        // filterSubmenu.add(onlyWithoutPNDPersons);
        // filterSubmenu.add(onlyWithoutLCCNPersons);
        // filterSubmenu.add(onlyWithoutVIAFPersons);
        // filterSubmenu.add(onlyWithoutICCUPersons);
        // }
        //
        // }
    }

    @Override
    public final ISelection getSelection() {
        if (_tabFolderLeft != null) {
            CTabItem tab = _tabFolderLeft.getItem(_tabFolderLeft.getSelectionIndex());
            if (tab != null) {
                TreeViewer tv = (TreeViewer) tab.getData("viewer");
                Object[] objs = ((IStructuredSelection) tv.getSelection()).toArray();
                TreeNode[] tns = new TreeNode[objs.length];
                for (int i = 0; i < objs.length; i++) {
                    tns[i] = (TreeNode) objs[i];
                }

                if (tns != null && tns.length > 0) {
                    ArrayList<PdrObject> helpObjs = new ArrayList<PdrObject>();
                    for (int i = 0; i < tns.length; i++) {
                        if (tns[i].getPdrObject() != null) {
                            helpObjs.add(tns[i].getPdrObject());
                        }
                    }
                    //                  else if (tns[i].hasChildren())
                    //                  {
                    //                     for (TreeNode c : tns[i].getChildren())
                    //                     {
                    //                        if (c.getPdrObject() != null)
                    //                        {
                    //                           helpObjs.add(c.getPdrObject());
                    //                        }
                    //                        else if (c.hasChildren())
                    //                        {
                    //                           for (TreeNode cc : c.getChildren())
                    //                           {
                    //                              if (cc.getPdrObject() != null)
                    //                              {
                    //                                 helpObjs.add(cc.getPdrObject());
                    //                              }
                    //                           }
                    //                        }
                    //                     }
                    //                  }
                    // }
                    setStatusLine(helpObjs.size() + " " + NLMessages.getString("View_objects_selected"));
                    //_selection = helpObjs.toArray(new PdrObject[helpObjs.size()]);
                }
            }
            if (_selection != null) {

                StructuredSelection selection = new StructuredSelection(_selection);
                return selection;
            } else {
                return null;
            }

        } else {
            return null;
        }
    }

    @Override
    public final int getSizeFlags(final boolean width) {
        return SWT.MIN;
    }

    /**
     * Open in tree viewer.
     * @param tn the tn
     */
    public final void openInTreeViewer(final TreeNode tn) {
        if (tn != null) {
            TreeViewer treeViewer;
            CTabItem tabItem;
            String key;
            if (tn.getId() != null) {
                key = tn.getId();
            } else {
                key = "clipboard";
            }
            if (_treeViewerMap.containsKey(key)) {
                treeViewer = _treeViewerMap.get(key);
                tabItem = (CTabItem) treeViewer.getData("tab");
            } else {
                tabItem = new CTabItem(_tabFolderLeft, SWT.CLOSE);
                Tree tree = new Tree(_tabFolderLeft, SWT.BORDER | SWT.MULTI);
                tabItem.setControl(tree);
                tabItem.setData("type", "clipboard"); //$NON-NLS-1$

                PlatformUI.getWorkbench().getHelpSystem().setHelp(tree, "org.bbaw.pdr.ae.help.objectsTree"); //$NON-NLS-1$
                treeViewer = new TreeViewer(tree);
                treeViewer.setUseHashlookup(true);

            }
            tabItem.setText(key);
            tabItem.setData("key", key); //$NON-NLS-1$
            // setBulb();
            tabItem.setImage(_imageReg.get(IconsInternal.PERSONS));

            treeViewer.setData("key", 1); //$NON-NLS-1$
            treeViewer.setData("tab", tabItem); //$NON-NLS-1$
            tabItem.setData("viewer", treeViewer); //$NON-NLS-1$

            treeViewer.setContentProvider(new TreeContentProvider());
            treeViewer.setLabelProvider(new TreeLabelProvider());
            _treeViewerMap.put(key, treeViewer);
            // Create menu, toolbars, filters, sorters.
            createActions();
            buildTree(treeViewer);
            setStatusLine("Ready");
            treeViewer.setInput(tn);
        }

    }

    /**
     * Open preference page.
     * @param pageId the page id
     */
    protected final void openPreferencePage(final String pageId) {
        ArrayList<Parameterization> parameters = new ArrayList<Parameterization>();
        IParameter iparam = null;

        // get the command from plugin.xml
        IWorkbenchWindow window = PlatformUI.getWorkbench().getActiveWorkbenchWindow();
        ICommandService cmdService = (ICommandService) window.getService(ICommandService.class);
        Command cmd = cmdService.getCommand("org.eclipse.ui.window.preferences");

        // get the parameter
        try {
            iparam = cmd.getParameter("preferencePageId");
        } catch (NotDefinedException e1) {
            // TODO Auto-generated catch block
            e1.printStackTrace();
        }
        Parameterization params = new Parameterization(iparam, pageId);
        parameters.add(params);

        // build the parameterized command
        ParameterizedCommand pc = new ParameterizedCommand(cmd,
                parameters.toArray(new Parameterization[parameters.size()]));

        // execute the command
        try {
            IHandlerService handlerService = (IHandlerService) window.getService(IHandlerService.class);
            handlerService.executeCommand(pc, null);
        } catch (ExecutionException e) {
            e.printStackTrace();
        } catch (NotDefinedException e) {
            e.printStackTrace();
        } catch (NotEnabledException e) {
            e.printStackTrace();
        } catch (NotHandledException e) {
            e.printStackTrace();
        }

    }

    @Override
    public final void removeSelectionChangedListener(final ISelectionChangedListener listener) {
        _selectionChangedListeners.remove(listener);

    }

    /**
     * Search.
     */
    protected final void search() {
        _pdrQuery.setSearchLevel(0);
        _pdrQuery.setType(_comboTree.getSelectionIndex());
        ISelection iSelection = _comboSemanticViewer.getSelection();
        Object obj = ((IStructuredSelection) iSelection).getFirstElement();
        IAEPresentable cp = (IAEPresentable) obj;
        if (_pdrQuery.getType() == 3) {
            _pdrQuery.setCriterias(new Vector<Criteria>(1));
            _pdrQuery.getCriterias().add(_criteria);
        } else if (_pdrQuery.getType() < 3) {

            if (cp != null) {
                if (cp.getValue() == null || cp.getValue().equals("ALL") || cp.getLabel() == null //$NON-NLS-1$
                        || cp.getLabel().equals("ALL")) //$NON-NLS-1$
                {
                    _criteria.setCrit0(null);

                } else {
                    _criteria.setCrit0(cp.getValue());
                }
            }
            _criteria.setSearchText(_searchText.getText());
            _pdrQuery.setCriterias(new Vector<Criteria>(1));
            _pdrQuery.getCriterias().add(_criteria);
        }
        if (_comboTree.getSelectionIndex() == 3 || _comboTree.getSelectionIndex() == 4) {
            _criteria.setCrit0(null);
            ConfigItem ci = (ConfigItem) cp;
            String[] facetStrings = null;
            if (ci.getPos().equals("type")) //$NON-NLS-1$
            {
                try {
                    facetStrings = _mainSearcher.getFacets("tagging", ci.getParent().getValue().substring(5), //$NON-NLS-1$
                            ci.getValue(), null, null);
                    setQueryFacets(_pdrQuery, facetStrings);
                } catch (Exception e1) {
                    e1.printStackTrace();
                }
            } else if (ci.getPos().equals("subtype")) //$NON-NLS-1$
            {
                try {
                    facetStrings = _mainSearcher.getFacets("tagging",
                            ((ConfigItem) ci.getParent()).getParent().getValue().substring(5),
                            ci.getParent().getValue(), ci.getValue(), //$NON-NLS-1$
                            null);
                    setQueryFacets(_pdrQuery, facetStrings);
                } catch (Exception e1) {
                    e1.printStackTrace();
                }
            } else if (ci.getPos().equals("role")) //$NON-NLS-1$
            {
                try {
                    facetStrings = _mainSearcher.getFacets("tagging",
                            ((ConfigItem) ((ConfigItem) ci.getParent()).getParent()).getParent().getValue()
                                    .substring(5),
                            ((ConfigItem) ci.getParent()).getParent().getValue(), ci.getParent().getValue(),
                            ci.getValue()); //$NON-NLS-1$
                    setQueryFacets(_pdrQuery, facetStrings);
                } catch (Exception e1) {
                    e1.printStackTrace();
                }
            }

            // try {
            // _pdrQuery.setFacets(_mainSearcher.getFacets("tagging", "name",
            // cp.getValue(), null, null));
            // } catch (XQException e) {
            // e.printStackTrace();
            // }
            _criteria.setCrit0("ALL"); //$NON-NLS-1$
            _criteria.setSearchText(_searchText.getText());
            _pdrQuery.setCriterias(new Vector<Criteria>(1));
            _pdrQuery.getCriterias().add(_criteria);
            // setQueryFacets(_pdrQuery, facetStrings);

        } else if (_pdrQuery.getType() == 5) {
            _criteria.setCrit0(null);
            ConfigItem ci = (ConfigItem) cp;
            String type = null;
            String[] referenceFacets = null;
            if (ci.getValue().equals("name") //$NON-NLS-1$
                    || ci.getValue().equals("namePart")) //$NON-NLS-1$
            {
                ci.setValue("namePart"); //$NON-NLS-1$
                type = "family"; //$NON-NLS-1$
            }
            try {
                referenceFacets = _mainSearcher.getFacets("reference", ci.getValue(), type, null, null); //$NON-NLS-1$
            } catch (Exception e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
            if (ci.getValue().equals("genre")) //$NON-NLS-1$
            {
                _pdrQuery.setKey("genre"); //$NON-NLS-1$

            } else {
                _pdrQuery.setKey(null);
            }
            _pdrQuery.setCriterias(new Vector<Criteria>(1));
            _pdrQuery.getCriterias().add(_criteria);
            setQueryFacets(_pdrQuery, referenceFacets);
        }

        _keyCounter++;
        String key = _comboTree.getItem(_comboTree.getSelectionIndex()) + " " + _keyCounter;

        createTreeViewer(_tabFolderLeft, key);
        String message = "Performing Search..."; //$NON-NLS-1$

        setStatusLine(message);

    }

    /**
     * Search and build tree.
     * @param pdrQuery the pdr query
     */
    public final void searchAndBuildTree(final PdrQuery pdrQuery) {
        this._pdrQuery = pdrQuery;
        _keyCounter++;
        String key = _comboTree.getItem(_pdrQuery.getType()) + " " + _keyCounter; //$NON-NLS-1$
        // String key = new String(new Integer(_pdrQuery.getType()) + " " +
        // keyCounter);

        // _pdrQuery.setKey(key);

        createTreeViewer(_tabFolderLeft, key);
    }

    // //////////////////////// Observer //////////////////////////////////////

    @Override
    public void selectionChanged(final IWorkbenchPart part, final ISelection selection) {
    }

    /**
     * Select tree.
     * @param treeName the tree name
     */
    public final void selectTree(final String treeName) {
        if (_treeViewerMap.containsKey(treeName)) {
            TreeViewer treeViewer;
            CTabItem tabItem;
            treeViewer = _treeViewerMap.get(treeName);
            tabItem = (CTabItem) treeViewer.getData("tab");
            _tabFolderLeft.setSelection(tabItem);
        }

    }

    @Override
    public final void setFocus() {
        _treeButton.setFocus();

    }

    /**
     * Sets the pdr query.
     * @param pdrQuery the new pdr query
     */
    public final void setPdrQuery(final PdrQuery pdrQuery) {
        this._pdrQuery = pdrQuery;
    }

    /**
     * Sets the query facets.
     * @param facetQuery the facet query
     * @param facetStrings the facet strings
     */
    protected final void setQueryFacets(final PdrQuery facetQuery, final String[] facetStrings) {
        HashMap<String, IAEPresentable> facets = new HashMap<String, IAEPresentable>(facetStrings.length);
        for (String str : facetStrings) {
            ConfigItem ci = new ConfigItem();
            if (facetQuery.getKey() != null && facetQuery.getKey().equals("genre")) //$NON-NLS-1$
            {
                ReferenceModsTemplate temp = _facade.getReferenceModsTemplates().get(str);
                if (temp != null) {
                    ci.setLabel(temp.getLabel());
                } else {
                    ci.setLabel(str);
                }
            } else {
                ci.setLabel(str);
            }
            ci.setValue(str);
            facets.put(str, ci);
            //         System.out.println("facet " + str); //$NON-NLS-1$
        }
        facetQuery.setFacets(facets);
    }

    @Override
    public void setSelection(final ISelection selection) {
        // TODO Auto-generated method stub

    }

    /**
     * Sets the status line.
     * @param message the new status line
     */
    private void setStatusLine(final String message) {
        // Get the status line and set the text
        // if (message.trim().length() == 0)
        // {
        // Integer i = null;
        // System.out.println(i.doubleValue());
        // }
        // System.out.println("setStatusLine" + message);
        IActionBars bars = getViewSite().getActionBars();
        bars.getStatusLineManager().setMessage(message);
    }

    /**
     * method shows currently selected person in upper left group.
     */
    private void showCurrentPdrObject()

    {
        // delete old content
        _currentObjectText.setText(""); //$NON-NLS-1$
        String label = ""; //$NON-NLS-1$
        if (_facade.getCurrentTreeObjects() != null && _facade.getCurrentTreeObjects().length > 0) {
            IStatus slp = new Status(IStatus.INFO, Activator.PLUGIN_ID, "TreeView current object: " //$NON-NLS-1$
                    + _facade.getCurrentTreeObjects()[_facade.getCurrentTreeObjects().length - 1].getPdrId()
                            .toString());
            _iLogger.log(slp);

            if (_advanced) {
                _addAspectButton.setEnabled(true);
                if (!_facade.getLastAspects().isEmpty()) {
                    _addSimilarAspectButton.setEnabled(true);
                }
            }
        } else {
            if (_advanced) {
                _addAspectButton.setEnabled(false);
                _addSimilarAspectButton.setEnabled(false);
            }
        }

        if (_facade.getCurrentTreeObjects() != null && _facade.getCurrentTreeObjects().length > 0
                && _facade.getCurrentTreeObjects()[_facade.getCurrentTreeObjects().length - 1] != null) {
            if (_facade.getCurrentTreeObjects()[_facade.getCurrentTreeObjects().length - 1] instanceof Person) {
                Person cp = (Person) _facade.getCurrentTreeObjects()[_facade.getCurrentTreeObjects().length - 1];
                // System.out.println("currentPerson: " +
                // Facade.getInstanz().getCurrentPerson());
                /* set Text to newly selected person */
                label = ""; //$NON-NLS-1$
                if (_advanced) {
                    _addAspectButton.setEnabled(true);
                    if (_facade.getCurrentAspect() != null) {
                        _addSimilarAspectButton.setEnabled(true);
                    }
                }
                if (cp.getBasicPersonData() != null) {
                    BasicPersonData basicPersonData = cp.getBasicPersonData();
                    label = label + cp.getDisplayName(); //$NON-NLS-1$
                    if (!Platform.getPreferencesService().getBoolean(CommonActivator.PLUGIN_ID,
                            "PERSON_DISPLAYNAME_LIFESPAN", false, null)) {
                        if (basicPersonData.getBeginningOfLife() != null
                                && basicPersonData.getBeginningOfLife().getYear() != 0
                                && basicPersonData.getEndOfLife() != null
                                && basicPersonData.getEndOfLife().getYear() != 0) {
                            label += " (" + basicPersonData.getBeginningOfLife().toString(".") + " - "
                                    + basicPersonData.getEndOfLife().toString(".") + ")";
                        } else if (basicPersonData.getBeginningOfLife() != null
                                && basicPersonData.getBeginningOfLife().getYear() != 0) {
                            label += " (" + basicPersonData.getBeginningOfLife().toString(".") + "-)";
                        } else if (basicPersonData.getEndOfLife() != null
                                && basicPersonData.getEndOfLife().getYear() != 0) {
                            label += " (-" + basicPersonData.getEndOfLife().toString(".") + ")";
                        }
                    }
                    if (cp.getPdrId() != null) {
                        label = label + "\n\nID: " + cp.getPdrId().toString(); //$NON-NLS-1$
                    }
                    if (basicPersonData.getComplexNames().size() > 1) {
                        label = label + "\n\n" + NLMessages.getString("Treeview_namevariants"); //$NON-NLS-1$ //$NON-NLS-2$
                        Vector<String> helpNameVariants = new Vector<String>(5);

                        for (int i = 1; i < basicPersonData.getComplexNames().size(); i++) {
                            String name = basicPersonData.getComplexNames().get(i).toString();
                            if (!helpNameVariants.contains(name)) {
                                helpNameVariants.add(name);
                            }
                        }
                        for (String n : helpNameVariants) {
                            label += n + "\n";
                        }
                    }
                    if (!Platform.getPreferencesService().getBoolean(CommonActivator.PLUGIN_ID,
                            "PERSON_DISPLAYNAME_DESCRIPTION", false, null)) {
                        if (basicPersonData.getDescriptions() != null
                                && !basicPersonData.getDescriptions().isEmpty()) {
                            label = label + "\n\n"
                                    + PDRConfigProvider.getSemanticLabel(null, "principalDescription") + ":"; //$NON-NLS-1$ //$NON-NLS-3$
                            boolean first = true;
                            for (String s : basicPersonData.getDescriptions()) {
                                if (first) {
                                    label += " ";
                                } else {
                                    label += ", ";
                                }
                                label += s; //$NON-NLS-1$
                            }
                        }
                    }
                } else {
                    label = label + "\n\nID: " + cp.getPdrId().toString(); //$NON-NLS-1$
                }
            } else if (_facade.getCurrentTreeObjects()[_facade.getCurrentTreeObjects().length
                    - 1] instanceof ReferenceMods) {
                ReferenceMods cr = (ReferenceMods) _facade
                        .getCurrentTreeObjects()[_facade.getCurrentTreeObjects().length - 1];
                if (_advanced) {
                    _addAspectButton.setEnabled(true);
                    _addSimilarAspectButton.setEnabled(true);
                }
                label = NLMessages.getString("Treeview_currentlySelectedRef"); //$NON-NLS-1$
                label += cr.getDisplayNameLong();
            } else if (_facade.getCurrentTreeObjects()[_facade.getCurrentTreeObjects().length
                    - 1] instanceof Aspect) {
                Aspect ca = (Aspect) _facade.getCurrentTreeObjects()[_facade.getCurrentTreeObjects().length - 1];
                if (_advanced) {
                    _addAspectButton.setEnabled(false);
                    _addSimilarAspectButton.setEnabled(false);
                }
                label = NLMessages.getString("Treeview_currentlySelectedA"); //$NON-NLS-1$
                label += "ID: " + _facade.getCurrentAspect().getPdrId().toString() + "\n\n"; //$NON-NLS-1$ //$NON-NLS-2$
                label += ca.getNotification();
            }
        }
        _currentObjectText.setText(label);

    }

    /**
     * Uncheck toggle commands.
     */
    private void uncheckToggleCommands() {
        ICommandService cService = (ICommandService) PlatformUI.getWorkbench().getService(ICommandService.class);
        Command command;
        State tState;

        command = cService.getCommand("org.bbaw.pdr.ae.view.main.commands.FilterOnlyAspectsDivergentMarkup");
        tState = command.getState(AEPluginIDs.TOGGLE_STATE_FILTERONLYASPECTSDIVERGENTMARKUP);
        if ((Boolean) tState.getValue()) {
            IHandlerService handlerService = (IHandlerService) PlatformUI.getWorkbench()
                    .getService(IHandlerService.class);
            try {
                handlerService.executeCommand("org.bbaw.pdr.ae.view.main.commands.FilterOnlyAspectsDivergentMarkup", //$NON-NLS-1$
                        null);
            } catch (ExecutionException e) {
                e.printStackTrace();
            } catch (NotDefinedException e) {
                e.printStackTrace();
            } catch (NotEnabledException e) {
                e.printStackTrace();
            } catch (NotHandledException e) {
                e.printStackTrace();
            }

        }
        command = cService.getCommand("org.bbaw.pdr.ae.view.main.commands.FilterOnlyIncorrectObjects");
        tState = command.getState(AEPluginIDs.TOGGLE_STATE_FILTERONLYINCORRECTOBJECTS);
        if ((Boolean) tState.getValue()) {
            IHandlerService handlerService = (IHandlerService) PlatformUI.getWorkbench()
                    .getService(IHandlerService.class);
            try {
                handlerService.executeCommand("org.bbaw.pdr.ae.view.main.commands.FilterOnlyIncorrectObjects", //$NON-NLS-1$
                        null);
            } catch (ExecutionException e) {
                e.printStackTrace();
            } catch (NotDefinedException e) {
                e.printStackTrace();
            } catch (NotEnabledException e) {
                e.printStackTrace();
            } catch (NotHandledException e) {
                e.printStackTrace();
            }
        }
        command = cService.getCommand("org.bbaw.pdr.ae.view.main.commands.FilterOnlyNewObjects");
        tState = command.getState(AEPluginIDs.TOGGLE_STATE_FILTERONLYNEWOBJECTS);
        if ((Boolean) tState.getValue()) {
            IHandlerService handlerService = (IHandlerService) PlatformUI.getWorkbench()
                    .getService(IHandlerService.class);
            try {
                handlerService.executeCommand("org.bbaw.pdr.ae.view.main.commands.FilterOnlyNewObjects", null); //$NON-NLS-1$
            } catch (ExecutionException e) {
                e.printStackTrace();
            } catch (NotDefinedException e) {
                e.printStackTrace();
            } catch (NotEnabledException e) {
                e.printStackTrace();
            } catch (NotHandledException e) {
                e.printStackTrace();
            }
        }
        command = cService.getCommand("org.bbaw.pdr.ae.view.main.commands.FilterOnlyPersonConcurrences");
        tState = command.getState(AEPluginIDs.TOGGLE_STATE_FILTERONLYPERSONCONCURRENCES);
        if ((Boolean) tState.getValue()) {
            IHandlerService handlerService = (IHandlerService) PlatformUI.getWorkbench()
                    .getService(IHandlerService.class);
            try {
                handlerService.executeCommand("org.bbaw.pdr.ae.view.main.commands.FilterOnlyPersonConcurrences", //$NON-NLS-1$
                        null);
            } catch (ExecutionException e) {
                e.printStackTrace();
            } catch (NotDefinedException e) {
                e.printStackTrace();
            } catch (NotEnabledException e) {
                e.printStackTrace();
            } catch (NotHandledException e) {
                e.printStackTrace();
            }
        }
        command = cService.getCommand("org.bbaw.pdr.ae.view.main.commands.FilterOnlyPersonIdentifiers");
        tState = command.getState(AEPluginIDs.TOGGLE_STATE_FILTERONLYPERSONIDENTIFIERS);
        if ((Boolean) tState.getValue()) {
            IHandlerService handlerService = (IHandlerService) PlatformUI.getWorkbench()
                    .getService(IHandlerService.class);
            try {
                handlerService.executeCommand("org.bbaw.pdr.ae.view.main.commands.FilterOnlyPersonIdentifiers", //$NON-NLS-1$
                        null);
            } catch (ExecutionException e) {
                e.printStackTrace();
            } catch (NotDefinedException e) {
                e.printStackTrace();
            } catch (NotEnabledException e) {
                e.printStackTrace();
            } catch (NotHandledException e) {
                e.printStackTrace();
            }
        }
        command = cService.getCommand("org.bbaw.pdr.ae.view.main.commands.FilterOnlyUpdatedObjects");
        tState = command.getState(AEPluginIDs.TOGGLE_STATE_FILTERONLYUPDATEDOBJECTS);
        if ((Boolean) tState.getValue()) {
            IHandlerService handlerService = (IHandlerService) PlatformUI.getWorkbench()
                    .getService(IHandlerService.class);
            try {
                handlerService.executeCommand("org.bbaw.pdr.ae.view.main.commands.FilterOnlyUpdatedObjects", null); //$NON-NLS-1$
            } catch (ExecutionException e) {
                e.printStackTrace();
            } catch (NotDefinedException e) {
                e.printStackTrace();
            } catch (NotEnabledException e) {
                e.printStackTrace();
            } catch (NotHandledException e) {
                e.printStackTrace();
            }
        }
        command = cService.getCommand("org.bbaw.pdr.ae.view.main.commands.FilterOnlyWithoutICCUPersons");
        tState = command.getState(AEPluginIDs.TOGGLE_STATE_FILTERONLYWITHOUTICCUPERSONS);
        if ((Boolean) tState.getValue()) {
            IHandlerService handlerService = (IHandlerService) PlatformUI.getWorkbench()
                    .getService(IHandlerService.class);
            try {
                handlerService.executeCommand("org.bbaw.pdr.ae.view.main.commands.FilterOnlyWithoutICCUPersons", //$NON-NLS-1$
                        null);
            } catch (ExecutionException e) {
                e.printStackTrace();
            } catch (NotDefinedException e) {
                e.printStackTrace();
            } catch (NotEnabledException e) {
                e.printStackTrace();
            } catch (NotHandledException e) {
                e.printStackTrace();
            }
        }
        command = cService.getCommand("org.bbaw.pdr.ae.view.main.commands.FilterOnlyWithoutLCCNPersons");
        tState = command.getState(AEPluginIDs.TOGGLE_STATE_FILTERONLYWITHOUTLCCNPERSONS);
        if ((Boolean) tState.getValue()) {
            IHandlerService handlerService = (IHandlerService) PlatformUI.getWorkbench()
                    .getService(IHandlerService.class);
            try {
                handlerService.executeCommand("org.bbaw.pdr.ae.view.main.commands.FilterOnlyWithoutLCCNPersons", //$NON-NLS-1$
                        null);
            } catch (ExecutionException e) {
                e.printStackTrace();
            } catch (NotDefinedException e) {
                e.printStackTrace();
            } catch (NotEnabledException e) {
                e.printStackTrace();
            } catch (NotHandledException e) {
                e.printStackTrace();
            }
        }
        command = cService.getCommand("org.bbaw.pdr.ae.view.main.commands.FilterOnlyWithoutPNDPersons");
        tState = command.getState(AEPluginIDs.TOGGLE_STATE_FILTERONLYWITHOUTPNDPERSONS);
        if ((Boolean) tState.getValue()) {
            IHandlerService handlerService = (IHandlerService) PlatformUI.getWorkbench()
                    .getService(IHandlerService.class);
            try {
                handlerService.executeCommand("org.bbaw.pdr.ae.view.main.commands.FilterOnlyWithoutPNDPersons", //$NON-NLS-1$
                        null);
            } catch (ExecutionException e) {
                e.printStackTrace();
            } catch (NotDefinedException e) {
                e.printStackTrace();
            } catch (NotEnabledException e) {
                e.printStackTrace();
            } catch (NotHandledException e) {
                e.printStackTrace();
            }
        }
        command = cService.getCommand("org.bbaw.pdr.ae.view.main.commands.FilterOnlyWithoutVIAFPersons");
        tState = command.getState(AEPluginIDs.TOGGLE_STATE_FILTERONLYWITHOUTVIAFPERSONS);
        if ((Boolean) tState.getValue()) {
            IHandlerService handlerService = (IHandlerService) PlatformUI.getWorkbench()
                    .getService(IHandlerService.class);
            try {
                handlerService.executeCommand("org.bbaw.pdr.ae.view.main.commands.FilterOnlyWithoutVIAFPersons", //$NON-NLS-1$
                        null);
            } catch (ExecutionException e) {
                e.printStackTrace();
            } catch (NotDefinedException e) {
                e.printStackTrace();
            } catch (NotEnabledException e) {
                e.printStackTrace();
            } catch (NotHandledException e) {
                e.printStackTrace();
            }
        }

    }

    @Override
    public final void update(final Observable o, final Object arg) {
        IStatus sAspect = new Status(IStatus.INFO, Activator.PLUGIN_ID, "TreeView update: " + arg); //$NON-NLS-1$
        _iLogger.log(sAspect);

        //        System.out.println("treeviewer notified"); //$NON-NLS-1$

        if (arg.equals("newAspect")) //$NON-NLS-1$ //$NON-NLS-2$
        {
            if (_facade.getCurrentAspect() != null) {
                if (_facade.getCurrentPerson() != null) {
                    if (_advanced) {
                        _addSimilarAspectButton.setEnabled(true);
                    }
                }
                // _treeViewer.refresh();
            }
        } else if (arg.equals("newTreeObjects")) //$NON-NLS-1$
        {
            showCurrentPdrObject();
        } else if (arg.equals("noSelectedPerson")) //$NON-NLS-1$
        {

            _currentObjectText.setText(""); //$NON-NLS-1$

        } else if (arg.equals("newResultingPersons")) //$NON-NLS-1$
        {
            createTreeViewer(_tabFolderLeft, "Personen"); //$NON-NLS-1$

        } else if (arg.equals("newPersonTreeRequiered")) //$NON-NLS-1$
        {
            //          createTreeViewer(_tabFolderLeft, "allPersons"); //$NON-NLS-1$
            Object[] elements = _allPersonsTreeViewer.getExpandedElements();
            _allPersonsTreeViewer.setInput(_facade.getAllPersons());
            for (Object obj : elements) {
                _allPersonsTreeViewer.setExpandedState(obj, true);
            }
            showCurrentPdrObject();

        } else if (arg.equals("newAdvancedQuery")) //$NON-NLS-1$
        {
            searchAndBuildTree(_facade.getAdvancedQuery());

        } else if (arg.equals("newNewPerson")) //$NON-NLS-1$
        {
            Object[] elements = _allPersonsTreeViewer.getExpandedElements();
            _allPersonsTreeViewer.refresh();
            for (Object obj : elements) {
                _allPersonsTreeViewer.setExpandedState(obj, true);
            }
            showCurrentPdrObject();

        } else if (arg.equals("newNewReference")) //$NON-NLS-1$
        {
            Object[] elements = _allReferencesTreeViewer.getExpandedElements();
            _allReferencesTreeViewer.setInput(_facade.getAllReferences());
            for (Object obj : elements) {
                _allReferencesTreeViewer.setExpandedState(obj, true);
            }
            showCurrentPdrObject();

        } else if (arg.equals("refreshAll")) //$NON-NLS-1$
        {
            //
            _allReferencesTreeViewer.refresh();
            _allPersonsTreeViewer.refresh();
            disposeTabItems();
            buildTabFolderLeft();
            if (_advanced) {
                _addSimilarAspectButton.setEnabled(false);
            }

            showCurrentPdrObject();

        } else if (arg.equals("allPersons")) //$NON-NLS-1$
        {
            _allPersonsTreeViewer.setInput(_facade.getAllPersons());
            showCurrentPdrObject();
        } else if (arg.equals("allReferences")) //$NON-NLS-1$
        {
            _allReferencesTreeViewer.setInput(_facade.getAllReferences());
            showCurrentPdrObject();
        } else if (arg.equals("newPersonFacetProposals")) //$NON-NLS-1$
        {
            if (_facade.getFacetProposals() != null && !_facade.getFacetProposals().isEmpty()) {
                _comboSemanticViewer.setInput(_facade.getFacetProposals());
            } else {
                _comboSemanticViewer.setInput(null);
                MessageDialog messageDialog = new MessageDialog(_parentShell,
                        NLMessages.getString("View_message_person_facet_empty"), null,
                        NLMessages.getString("View_message_person_facet_customize"), MessageDialog.INFORMATION,
                        new String[] { NLMessages.getString("View_message_customize_person_facet_proposals"),
                                NLMessages.getString("Handler_cancel") },
                        0);
                int returnCode = messageDialog.open();
                if (returnCode == 0) {
                    openPreferencePage("org.bbaw.pdr.ae.view.main.preferences.pages.FacetedSearch");
                    if (_facade.getFacetProposals() != null && !_facade.getFacetProposals().isEmpty()) {
                        _comboSemanticViewer.setInput(_facade.getFacetProposals());
                    }
                }
            }
            _comboSemanticViewer.refresh();
        } else if (arg.equals("newAspectFacetProposals")) //$NON-NLS-1$
        {
            if (_facade.getAspectFacetProposals() != null && !_facade.getAspectFacetProposals().isEmpty()) {
                _comboSemanticViewer.setInput(_facade.getAspectFacetProposals());
            } else {
                _comboSemanticViewer.setInput(null);
                MessageDialog messageDialog = new MessageDialog(_parentShell,
                        NLMessages.getString("View_message_aspect_facet_empty"), null,
                        NLMessages.getString("View_message_aspect_facet_customize"), MessageDialog.INFORMATION,
                        new String[] { NLMessages.getString("View_message_customize_aspect_facet_proposals"),
                                NLMessages.getString("Handler_cancel") },
                        0);
                int returnCode = messageDialog.open();
                if (returnCode == 0) {
                    openPreferencePage("org.bbaw.pdr.ae.view.main.preferences.pages.FacetedAspectSearch");
                    if (_facade.getAspectFacetProposals() != null && !_facade.getAspectFacetProposals().isEmpty()) {
                        _comboSemanticViewer.setInput(_facade.getAspectFacetProposals());
                    }
                }

            }
            _comboSemanticViewer.refresh();
        }
    }

    /* Multiple filters can be enabled at a time. */
    /**
     * Update filter.
     * @param action the action
     */
    protected final void updateFilter(final Action action) {
        TreeViewer treeViewer = _treeViewerMap.get(_tabFolderLeft.getSelection().getData("key")); //$NON-NLS-1$
        if (action == _onlyUpdatedObjects) {
            if (action.isChecked()) {
                treeViewer.addFilter(_treenodeUpdatedFilter);
            } else {
                treeViewer.removeFilter(_treenodeUpdatedFilter);
            }
        } else if (action == _onlyNewObjects) {
            if (action.isChecked()) {
                treeViewer.addFilter(_treenodeNewFilter);
            } else {
                treeViewer.removeFilter(_treenodeNewFilter);
            }
        } else if (action == _onlyIncorrectObjects) {
            if (action.isChecked()) {
                treeViewer.addFilter(_onlyIncorrectPDRObjects);
            } else {
                treeViewer.removeFilter(_onlyIncorrectPDRObjects);
            }
        } else if (action == _onlyAspectsWithDivergentMarkup) {
            if (action.isChecked()) {
                treeViewer.addFilter(_onlyIAspectsDivergentMarkup);
            } else {
                treeViewer.removeFilter(_onlyIAspectsDivergentMarkup);
            }
        }

        else if (action == _onlyPersonConcurrences) {
            if (action.isChecked()) {
                treeViewer.addFilter(_personConcurrenceFilter);
            } else {
                treeViewer.removeFilter(_personConcurrenceFilter);
            }
        } else if (action == _onlyPersonIdentifiers) {
            if (action.isChecked()) {
                treeViewer.addFilter(_personIdentifierFilter);
            } else {
                treeViewer.removeFilter(_personIdentifierFilter);
            }
        } else if (action == _onlyWithoutPNDPersons) {
            if (action.isChecked()) {
                treeViewer.addFilter(_personWithoutPNDFilter);
            } else {
                treeViewer.removeFilter(_personWithoutPNDFilter);
            }
        } else if (action == _onlyWithoutLCCNPersons) {
            if (action.isChecked()) {
                treeViewer.addFilter(_personWithoutLCCNFilter);
            } else {
                treeViewer.removeFilter(_personWithoutLCCNFilter);
            }
        } else if (action == _onlyWithoutVIAFPersons) {
            if (action.isChecked()) {
                treeViewer.addFilter(_personWithoutVIAFFilter);
            } else {
                treeViewer.removeFilter(_personWithoutVIAFFilter);
            }
        } else if (action == _onlyWithoutICCUPersons) {
            if (action.isChecked()) {
                treeViewer.addFilter(_personWithoutICCUFilter);
            } else {
                treeViewer.removeFilter(_personWithoutICCUFilter);
            }
        }
    }

    public PdrObject[] getInputOfTree(String treeName, boolean filtered) {
        if (_treeViewerMap.containsKey(treeName)) {
            TreeViewer treeViewer;
            treeViewer = _treeViewerMap.get(treeName);
            Object obj = treeViewer.getInput();
            ArrayList<PdrObject> inputObjects = new ArrayList<PdrObject>();
            if (obj instanceof HashMap<?, ?>) {
                @SuppressWarnings("unchecked")
                HashMap<PdrId, PdrObject> inputs = (HashMap<PdrId, PdrObject>) obj;
                ViewerFilter[] filters = treeViewer.getFilters();
                for (PdrId id : inputs.keySet()) {
                    PdrObject po = inputs.get(id);
                    if (filtered && filters != null && filters.length > 0) {
                        for (ViewerFilter filter : filters) {
                            if (filter.select(treeViewer, null, po)) {
                                inputObjects.add(po);
                            }
                        }
                    } else {
                        inputObjects.add(po);
                    }
                }
                return inputObjects.toArray(new PdrObject[inputObjects.size()]);
            } else if (obj instanceof Vector<?>) {
                @SuppressWarnings("unchecked")
                Vector<PdrObject> inputs = (Vector<PdrObject>) obj;
                ViewerFilter[] filters = treeViewer.getFilters();
                for (PdrObject po : inputs) {
                    if (filtered && filters != null && filters.length > 0) {
                        for (ViewerFilter filter : filters) {
                            if (filter.select(treeViewer, null, po)) {
                                inputObjects.add(po);
                            }
                        }
                    } else {
                        inputObjects.add(po);
                    }
                }
                return inputObjects.toArray(new PdrObject[inputObjects.size()]);
            }
        }
        return null;
    }
}