org.bbaw.pdr.ae.config.editor.view.ConfigEditor.java Source code

Java tutorial

Introduction

Here is the source code for org.bbaw.pdr.ae.config.editor.view.ConfigEditor.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.config.editor.view;

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Observable;
import java.util.Observer;

import javax.xml.stream.XMLStreamException;

import org.bbaw.pdr.ae.common.AEConstants;
import org.bbaw.pdr.ae.common.AEVIEWConstants;
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.core.ConfigDataComparator;
import org.bbaw.pdr.ae.config.core.ConfigFactory;
import org.bbaw.pdr.ae.config.core.IAEMarkupTemplateConfigEditor;
import org.bbaw.pdr.ae.config.core.IConfigFacade;
import org.bbaw.pdr.ae.config.core.IConfigManager;
import org.bbaw.pdr.ae.config.core.IConfigRightsChecker;
import org.bbaw.pdr.ae.config.editor.internal.ConfigDragListener;
import org.bbaw.pdr.ae.config.editor.internal.ConfigDropListner;
import org.bbaw.pdr.ae.config.editor.internal.ConfigTransfer;
import org.bbaw.pdr.ae.config.editor.internal.CreateConfigDialog;
import org.bbaw.pdr.ae.config.model.AspectConfigTemplate;
import org.bbaw.pdr.ae.config.model.ConfigData;
import org.bbaw.pdr.ae.config.model.ConfigItem;
import org.bbaw.pdr.ae.config.model.ConfigTreeNode;
import org.bbaw.pdr.ae.config.model.DataType;
import org.bbaw.pdr.ae.config.model.DatatypeDesc;
import org.bbaw.pdr.ae.config.model.IdentifierConfig;
import org.bbaw.pdr.ae.config.model.SemanticTemplate;
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.common.NotDefinedException;
import org.eclipse.core.runtime.Platform;
import org.eclipse.jface.dialogs.MessageDialog;
import org.eclipse.jface.dialogs.TitleAreaDialog;
import org.eclipse.jface.fieldassist.ControlDecoration;
import org.eclipse.jface.fieldassist.FieldDecorationRegistry;
import org.eclipse.jface.resource.ImageRegistry;
import org.eclipse.jface.resource.JFaceResources;
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.IStructuredSelection;
import org.eclipse.jface.viewers.SelectionChangedEvent;
import org.eclipse.jface.viewers.StructuredSelection;
import org.eclipse.jface.viewers.TreeViewer;
import org.eclipse.swt.SWT;
import org.eclipse.swt.custom.SashForm;
import org.eclipse.swt.dnd.DND;
import org.eclipse.swt.dnd.Transfer;
import org.eclipse.swt.events.FocusAdapter;
import org.eclipse.swt.events.FocusEvent;
import org.eclipse.swt.events.KeyEvent;
import org.eclipse.swt.events.KeyListener;
import org.eclipse.swt.events.ModifyEvent;
import org.eclipse.swt.events.ModifyListener;
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.Label;
import org.eclipse.swt.widgets.Listener;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.swt.widgets.Spinner;
import org.eclipse.swt.widgets.Text;
import org.eclipse.swt.widgets.Tree;
import org.eclipse.swt.widgets.TreeColumn;
import org.eclipse.ui.IWorkbench;
import org.eclipse.ui.IWorkbenchWindow;
import org.eclipse.ui.PlatformUI;
import org.eclipse.ui.commands.ICommandService;
import org.eclipse.ui.handlers.IHandlerService;

/**
 * creates dialog for editing and creating relation classification lists.
 * @author cplutte
 */
public class ConfigEditor extends TitleAreaDialog implements Observer {

    /** singleton instance of facade. */
    private IConfigFacade _configFacade = ConfigFactory.getConfigFacade();
    /** user rights checker. */
    private IConfigRightsChecker _userRichtsChecker = _configFacade.getConfigRichtsChecker();
    /** config manager. */
    private IConfigManager _cfgManager = _configFacade.getConfigManager();
    /** Instance of shared image registry. */
    private ImageRegistry _imageReg = CommonActivator.getDefault().getImageRegistry();
    /** processor for loading and saving tagging lists. */
    /** The markup provider. */
    private String _semanticProvider = Platform.getPreferencesService().getString(CommonActivator.PLUGIN_ID,
            "PRIMARY_SEMANTIC_PROVIDER", AEConstants.CLASSIFICATION_AUTHORITY, null).toUpperCase(); //$NON-NLS-1$;
    /** composite left. */
    private Composite _leftComposite;
    /** composite right. */
    private Composite _rightComposite;
    /** main sashForm. */
    private SashForm _mainSashForm;
    /** combo for relation types. */
    private Spinner _baseSpinner;
    /** combo for relation subtypes. */
    private Combo _langCombo;
    /** provider combo. */
    private Combo _providerCombo;
    /** for adding entry to list. */
    private Button _addToList;
    /** deleting entry from list. */
    private Button _deleteFromList;
    /** button to create new configuration. */
    private Button _newButton;
    /** button to set semantic tag as person name tag . */
    private Button _setAsPersonName;
    /** button to set semantic tag as person display name tag. */
    private Button _setAsNormName;
    /** button to set config item as ignored. */
    private Button _ignoreButton;
    /** button to delete config. */
    private Button _deleteConfigButton;

    /** name of selected list. */
    private String _lang = ""; //$NON-NLS-1$

    /** system language. */
    private String _systemLang = ""; //$NON-NLS-1$

    /** name text. */
    private Text _name;
    /** label text. */
    private Text _labelText;
    /** position text. */
    private Text _posText;

    /** documentation text. */
    private Text _docuText;

    private Text _semanticAspectTemplateText;
    /** datatypedesc. */
    private DatatypeDesc _datatypeDesc;

    /** new additional entry. */
    private Text _addElement;

    /** tree viewer. */
    private TreeViewer _treeViewer;

    /** new configuration. */
    private DatatypeDesc _newConfiguration;

    /** available languages. */
    private String[] _langs = { "de", "en", "it", "fr" }; //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$
    protected IAEMarkupTemplateConfigEditor _markupTemplateEditor = ConfigFactory.getMarkupTemplateConfigEditor();
    private Text currentProvText;

    /**
     * constructor.
     * @param parentShell parent shell
     */
    public ConfigEditor(final Shell parentShell) {
        super(parentShell);
    }

    @Override
    public final void create() {
        super.create();
        // Set the title
        setTitle(NLMessages.getString("Config_editor_title"));
        dialogArea.addListener(SWT.Traverse, new Listener() {
            @Override
            public void handleEvent(final Event e) {
                if (e.detail == SWT.TRAVERSE_ESCAPE) {
                    e.doit = false;
                }
            }
        });

    }

    @Override
    protected final void createButtonsForButtonBar(final Composite parent) {
        GridData gridData = new GridData();
        gridData.verticalAlignment = GridData.FILL;
        gridData.horizontalSpan = 3;
        gridData.grabExcessHorizontalSpace = true;
        gridData.grabExcessVerticalSpace = true;
        gridData.horizontalAlignment = SWT.CENTER;

        parent.setLayoutData(gridData);
        // Create Add button
        // Own method as we need to overview the SelectionAdapter
        createSaveButton(parent, OK, NLMessages.getString("Config_save_close"), false);
        // Add a SelectionListener

        createOkButton(parent, OK, NLMessages.getString("Config_refresh"), false);
        // Add a SelectionListener

        // Create Cancel button
        Button cancelButton = createButton(parent, CANCEL, NLMessages.getString("Config_cancel"), false);
        // Add a SelectionListener
        cancelButton.addSelectionListener(new SelectionAdapter() {
            @Override
            public void widgetSelected(final SelectionEvent e) {
                setReturnCode(CANCEL);
                _configFacade.setConfigs(null);
                close();
            }
        });
    }

    @Override
    protected final Control createDialogArea(final Composite parent) {

        _mainSashForm = new SashForm(parent, SWT.HORIZONTAL | SWT.BORDER);
        _mainSashForm.setLayoutData(new GridData());
        ((GridData) _mainSashForm.getLayoutData()).grabExcessHorizontalSpace = true;
        ((GridData) _mainSashForm.getLayoutData()).horizontalAlignment = SWT.FILL;
        ((GridData) _mainSashForm.getLayoutData()).grabExcessVerticalSpace = true;
        ((GridData) _mainSashForm.getLayoutData()).verticalAlignment = SWT.FILL;
        if (AEVIEWConstants.IS_SMALL_MONITOR_DIMENSION) {
            ((GridData) _mainSashForm.getLayoutData()).minimumHeight = 320;
        } else {
            ((GridData) _mainSashForm.getLayoutData()).minimumHeight = 470;
        }
        ((GridData) _mainSashForm.getLayoutData()).minimumWidth = 800;

        _leftComposite = new Composite(_mainSashForm, SWT.NONE);
        _leftComposite.setLayoutData(new GridData());
        ((GridData) _leftComposite.getLayoutData()).grabExcessHorizontalSpace = true;
        ((GridData) _leftComposite.getLayoutData()).horizontalAlignment = SWT.FILL;
        ((GridData) _leftComposite.getLayoutData()).grabExcessVerticalSpace = true;
        ((GridData) _leftComposite.getLayoutData()).verticalAlignment = SWT.FILL;
        _leftComposite.setLayout(new GridLayout());
        ((GridLayout) _leftComposite.getLayout()).numColumns = 5;
        ((GridLayout) _leftComposite.getLayout()).makeColumnsEqualWidth = false;

        Label currentProv = new Label(_leftComposite, SWT.NONE);
        currentProv.setLayoutData(new GridData());
        currentProv.setText("Currently used classification provider");
        ((GridData) currentProv.getLayoutData()).horizontalSpan = 2;

        currentProvText = new Text(_leftComposite, SWT.READ_ONLY);
        currentProvText.setLayoutData(new GridData());
        currentProvText.setText(_semanticProvider);
        ((GridData) currentProvText.getLayoutData()).horizontalSpan = 2;

        Button providerChange = new Button(_leftComposite, SWT.PUSH);
        providerChange.setLayoutData(new GridData());
        ((GridData) providerChange.getLayoutData()).horizontalAlignment = SWT.RIGHT;
        providerChange.setImage(_imageReg.get(IconsInternal.PREFERENCES));
        providerChange.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();
                }
                Parameterization params = new Parameterization(iparam,
                        "org.bbaw.pdr.ae.view.main.preferences.AspectPage");
                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();
                }
                _semanticProvider = Platform.getPreferencesService().getString(CommonActivator.PLUGIN_ID,
                        "PRIMARY_SEMANTIC_PROVIDER", AEConstants.CLASSIFICATION_AUTHORITY, null).toUpperCase(); //$NON-NLS-1$;
                currentProvText.setText(_semanticProvider);

            }
        }); // SelectionListener

        Label prov = new Label(_leftComposite, SWT.NONE);
        prov.setLayoutData(new GridData());
        prov.setText(NLMessages.getString("Preference_select_primary_semantic_provider"));
        _providerCombo = new Combo(_leftComposite, SWT.BORDER | SWT.READ_ONLY);
        _providerCombo.setLayoutData(new GridData());

        if (_configFacade.getConfigs() == null) {
        }

        for (String s : _configFacade.getConfigs().keySet()) {
            _providerCombo.add(s);
        }

        _providerCombo.addSelectionListener(new SelectionAdapter() {
            @Override
            public void widgetSelected(final SelectionEvent e) {
                _datatypeDesc = _configFacade.getConfigs()
                        .get(_providerCombo.getItem(_providerCombo.getSelectionIndex()));
                checkAndCompleteConfig(_datatypeDesc);
                _treeViewer.setInput(_datatypeDesc);
                if (_deleteConfigButton != null) {
                    _deleteConfigButton.setEnabled(_userRichtsChecker.mayEditConfig());
                }
                loadConfigData(null);

            }
        });

        if (_userRichtsChecker.mayEditConfig()) {
            _deleteConfigButton = new Button(_leftComposite, SWT.PUSH);
            _deleteConfigButton.setText(NLMessages.getString("Config_delete"));
            _deleteConfigButton.setToolTipText(NLMessages.getString("Config_delete_tooltip"));
            _deleteConfigButton.addSelectionListener(new SelectionAdapter() {
                @Override
                public void widgetSelected(final SelectionEvent e) {
                    IWorkbench workbench = PlatformUI.getWorkbench();
                    Display display = workbench.getDisplay();
                    Shell shell = new Shell(display);
                    String message = NLMessages.getString("Config_delete_warning1");
                    message += NLMessages.getString("Config_delete_warning2");
                    MessageDialog messageDialog = new MessageDialog(shell,
                            NLMessages.getString("Config_delete_configuration"), null, message,
                            MessageDialog.WARNING, new String[] { NLMessages.getString("Config_delete"), //$NON-NLS-1$
                                    NLMessages.getString("Config_cancel") }, //$NON-NLS-1$
                            1);
                    if (messageDialog.open() == 0) {
                        _configFacade.getConfigs()
                                .remove(_providerCombo.getItem(_providerCombo.getSelectionIndex()));
                        _cfgManager.deleteConfig(
                                _providerCombo.getItem(_providerCombo.getSelectionIndex()).toLowerCase());
                        _cfgManager.deleteConfig(
                                _providerCombo.getItem(_providerCombo.getSelectionIndex()).toUpperCase());

                        _datatypeDesc = null;
                        _treeViewer.setInput(null);
                        _treeViewer.refresh();
                        _providerCombo.setEnabled(true);
                        _newButton.setEnabled(true);
                        _providerCombo.removeAll();
                        for (String s : _configFacade.getConfigs().keySet()) {
                            _providerCombo.add(s);
                        }
                        _providerCombo.select(0);
                        _deleteConfigButton.setEnabled(false);
                    }

                }
            });
            _deleteConfigButton.pack();

            _newButton = new Button(_leftComposite, SWT.PUSH);
            _newButton.setText(NLMessages.getString("Config_new"));
            _newButton.addSelectionListener(new SelectionAdapter() {
                @Override
                public void widgetSelected(final SelectionEvent e) {
                    // createNewConfig(providerText.getText().trim().toUpperCase(),
                    // newProviderCombo.getItem(newProviderCombo.getSelectionIndex()));
                    IWorkbench workbench = PlatformUI.getWorkbench();
                    Display display = workbench.getDisplay();
                    Shell shell = new Shell(display);
                    CreateConfigDialog dialog = new CreateConfigDialog(shell, ConfigEditor.this);
                    dialog.open();
                    if (_newConfiguration != null) {
                        CommonActivator.getDefault().getPreferenceStore().setValue("PRIMARY_SEMANTIC_PROVIDER", //$NON-NLS-1$
                                _newConfiguration.getProvider()); //$NON-NLS-1$
                        CommonActivator.getDefault().getPreferenceStore().setValue("PRIMARY_TAGGING_PROVIDER", //$NON-NLS-1$
                                _newConfiguration.getProvider()); //$NON-NLS-1$
                        CommonActivator.getDefault().getPreferenceStore().setValue("PRIMARY_RELATION_PROVIDER", //$NON-NLS-1$
                                _newConfiguration.getProvider());
                        _providerCombo.add(_newConfiguration.getProvider(), 0);
                        _providerCombo.select(0);
                        _providerCombo.setEnabled(false);
                        _datatypeDesc = _newConfiguration;
                        checkAndCompleteConfig(_datatypeDesc);
                        _treeViewer.setInput(_datatypeDesc);
                        _treeViewer.refresh();
                        _providerCombo.setEnabled(false);
                        currentProvText.setText(_newConfiguration.getProvider());
                        if (_newButton != null) {
                            _newButton.setEnabled(false);
                        }
                        _newConfiguration = null;
                    }
                }
            });
            _newButton.pack();
        } else {
            Label blancLabel = new Label(_leftComposite, SWT.NONE);
            blancLabel.setText(""); //$NON-NLS-1$
            blancLabel.setLayoutData(new GridData());
            ((GridData) blancLabel.getLayoutData()).horizontalSpan = 2;
        }

        Tree tree = new Tree(_leftComposite, SWT.BORDER);
        tree.setLayoutData(new GridData());
        ((GridData) tree.getLayoutData()).grabExcessHorizontalSpace = true;
        ((GridData) tree.getLayoutData()).horizontalAlignment = SWT.FILL;
        ((GridData) tree.getLayoutData()).grabExcessVerticalSpace = true;
        ((GridData) tree.getLayoutData()).verticalAlignment = SWT.FILL;
        ((GridData) tree.getLayoutData()).horizontalSpan = 5;

        _treeViewer = new TreeViewer(tree);
        TreeColumn column = new TreeColumn(_treeViewer.getTree(), SWT.NONE);
        column.setWidth(450);
        column.setResizable(true);
        column.setText("Column 1"); //$NON-NLS-1$

        int operations = DND.DROP_COPY | DND.DROP_MOVE;
        Transfer[] transferTypes = new Transfer[] { ConfigTransfer.getInstance() };
        if (_userRichtsChecker.mayEditConfig()) {
            _treeViewer.addDragSupport(operations, transferTypes, new ConfigDragListener(_treeViewer));
            _treeViewer.addDropSupport(operations, transferTypes, new ConfigDropListner(_treeViewer));
        }
        _treeViewer.setContentProvider(new ConfigTreeContentProvider(true, _markupTemplateEditor != null, true));
        _treeViewer.setLabelProvider(new ConfigTreeLabelProvider());

        _treeViewer.setSorter(new ConfigTreeSorter());
        _treeViewer.addDoubleClickListener(new IDoubleClickListener() {
            @Override
            public void doubleClick(final DoubleClickEvent event) {
                if (event.getSelection() instanceof IStructuredSelection) {
                    IStructuredSelection selection = (IStructuredSelection) event.getSelection();
                    Object obj = selection.getFirstElement();
                    ConfigTreeNode tn = (ConfigTreeNode) obj;
                    if (tn.hasChildren()) {
                        _treeViewer.setExpandedState(tn, !_treeViewer.getExpandedState(tn));
                    }
                }
            }
        });
        _treeViewer.addSelectionChangedListener(new ISelectionChangedListener() {
            @Override
            public void selectionChanged(final SelectionChangedEvent event) {
                IStructuredSelection selection = (IStructuredSelection) event.getSelection();
                Object obj = selection.getFirstElement();
                ConfigTreeNode tn = (ConfigTreeNode) obj;

                loadConfigData(tn);

            }
        });

        // public void doubleClick(final DoubleClickEvent event)
        // {
        // IStructuredSelection selection = (IStructuredSelection)
        // event.getSelection();
        // Object obj = ((IStructuredSelection)
        // selection).getFirstElement();
        // TreeNode tn = (TreeNode) obj;
        // loadValues(tn.getConfigData());
        // }
        // });

        // }// leftComposite
        _leftComposite.layout();
        // leftComposite.pack();

        _rightComposite = new Composite(_mainSashForm, SWT.NONE);
        _rightComposite.setLayoutData(new GridData());
        ((GridData) _rightComposite.getLayoutData()).grabExcessHorizontalSpace = true;
        ((GridData) _rightComposite.getLayoutData()).horizontalAlignment = SWT.FILL;
        ((GridData) _rightComposite.getLayoutData()).grabExcessVerticalSpace = true;
        ((GridData) _rightComposite.getLayoutData()).verticalAlignment = SWT.FILL;
        _rightComposite.setLayout(new GridLayout());
        ((GridLayout) _rightComposite.getLayout()).numColumns = 3;
        ((GridLayout) _rightComposite.getLayout()).makeColumnsEqualWidth = false;
        _rightComposite.layout();
        // rightComposite.pack();

        _mainSashForm.setWeights(new int[] { 3, 3 });

        // mainSashForm.pack();
        // mainComposite
        boolean found = false;
        for (String s : _providerCombo.getItems()) {
            if (s.equals(_semanticProvider)) {
                _providerCombo.select(_providerCombo.indexOf(_semanticProvider));
                _datatypeDesc = _configFacade.getConfigs()
                        .get(_providerCombo.getItem(_providerCombo.getSelectionIndex()));
                found = true;
                break;
            }
        }
        if (!found) {
            _providerCombo.select(0);
            _semanticProvider = _providerCombo.getItem(0);
            _datatypeDesc = _configFacade.getConfigs().get(_semanticProvider);
        }

        checkAndCompleteConfig(_datatypeDesc);
        _treeViewer.setInput(_datatypeDesc);

        parent.pack();
        return parent;
    }

    private void checkAndCompleteConfig(DatatypeDesc _datatypeDesc) {
        if (_markupTemplateEditor != null) {
            if (_datatypeDesc.getUsage().getTemplates() == null) {
                ConfigData templates = new ConfigData();
                templates.setValue("templates");
                templates.setLabel("Templates");
                _datatypeDesc.getUsage().setTemplates(templates);
            }
            if (!_datatypeDesc.getUsage().getTemplates().getChildren().containsKey("aspectTemplates")) {
                ConfigData aspectTemplates = new ConfigData();
                aspectTemplates.setValue("aspectTemplates");
                aspectTemplates.setLabel("Aspect Templates");
                _datatypeDesc.getUsage().getTemplates().getChildren().put("aspectTemplates", aspectTemplates);
            }
            if (!_datatypeDesc.getUsage().getTemplates().getChildren().get("aspectTemplates").getChildren()
                    .containsKey("complexTemplates")) {
                ConfigData complexTemplates = new ConfigData();
                complexTemplates.setValue("complexTemplates");
                complexTemplates.setLabel("Complex Templates");
                _datatypeDesc.getUsage().getTemplates().getChildren().get("aspectTemplates").getChildren()
                        .put("complexTemplates", complexTemplates);
            }
            if (!_datatypeDesc.getUsage().getTemplates().getChildren().get("aspectTemplates").getChildren()
                    .containsKey("semanticTemplates")) {
                ConfigData semanticTemplates = new ConfigData();
                semanticTemplates.setValue("semanticTemplates");
                semanticTemplates.setLabel("Semantic Templates");
                _datatypeDesc.getUsage().getTemplates().getChildren().get("aspectTemplates").getChildren()
                        .put("semanticTemplates", semanticTemplates);
            }
            ConfigData semanticTemplates = _datatypeDesc.getUsage().getTemplates().getChildren()
                    .get("aspectTemplates").getChildren().get("semanticTemplates");
            for (ConfigData semantic : _datatypeDesc.getChildren().get("aodl:semanticStm").getChildren().values()) {
                if (!semanticTemplates.getChildren().containsKey(semantic.getValue())) {
                    SemanticTemplate semanticTemplate = new SemanticTemplate();
                    semanticTemplate.setValue(semantic.getValue());
                    semanticTemplate.setLabel(semantic.getLabel());
                    semanticTemplate.setParent(semanticTemplates);
                    semanticTemplate.setPriority(semantic.getPriority());
                    semanticTemplate.setIgnore(true);
                    String value = NLMessages.getString("Dialog_reference");
                    AspectConfigTemplate configTemplate = new AspectConfigTemplate(value);
                    configTemplate.setParent(semanticTemplate);
                    configTemplate.setPriority(25);
                    configTemplate.setHorizontalSpan(4);
                    configTemplate.setRequired(true);
                    configTemplate.setWidgetType(7);
                    semanticTemplate.getChildren().put(value, configTemplate);

                    semanticTemplates.getChildren().put(semantic.getValue(), semanticTemplate);
                }
            }
            List<String> values = new ArrayList<String>(semanticTemplates.getChildren().size());
            for (String key : semanticTemplates.getChildren().keySet()) {
                values.add(new String(key));
            }
            for (String key : values) {
                if (!_datatypeDesc.getChildren().get("aodl:semanticStm").getChildren().containsKey(key)) {
                    semanticTemplates.getChildren().remove(key);
                }
            }
            values = null;
        }
    }

    private void loadConfigData(ConfigTreeNode tn) {
        if (tn != null) {
            if (_markupTemplateEditor != null && _markupTemplateEditor.isEditableObject(tn.getConfigData())) {
                _rightComposite = _markupTemplateEditor.loadEditor(_treeViewer, _rightComposite, tn.getConfigData(),
                        _datatypeDesc.getProvider());
            } else {

                loadValues(tn.getConfigData());
            }
        } else {
            // System.out.println("load null");
            _rightComposite.dispose();
            _rightComposite = new Composite(_mainSashForm, SWT.NONE);
            _rightComposite.setLayoutData(new GridData());
            ((GridData) _rightComposite.getLayoutData()).grabExcessHorizontalSpace = true;
            ((GridData) _rightComposite.getLayoutData()).horizontalAlignment = SWT.FILL;
            ((GridData) _rightComposite.getLayoutData()).grabExcessVerticalSpace = true;
            ((GridData) _rightComposite.getLayoutData()).verticalAlignment = SWT.FILL;
            _rightComposite.setLayout(new GridLayout());
            ((GridLayout) _rightComposite.getLayout()).numColumns = 3;
            ((GridLayout) _rightComposite.getLayout()).makeColumnsEqualWidth = false;
            _rightComposite.layout();
            _mainSashForm.layout();
        }

    }

    /**
     * create ok button.
     * @param parent parent composite
     * @param id button id
     * @param label button label
     * @param defaultButton is default
     * @return button
     */
    protected final Button createOkButton(final Composite parent, final int id, final String label,
            final boolean defaultButton) {
        // increment the number of columns in the button bar
        ((GridLayout) parent.getLayout()).numColumns++;
        Button button = new Button(parent, SWT.PUSH);
        button.setText(label);
        button.setFont(JFaceResources.getDialogFont());
        button.setData(new Integer(id));
        button.addSelectionListener(new SelectionAdapter() {
            @Override
            public void widgetSelected(final SelectionEvent event) {
                Object[] objects = _treeViewer.getExpandedElements();
                _treeViewer.setInput(_datatypeDesc);
                for (Object o : objects) {
                    _treeViewer.setExpandedState(o, true);
                }
            }
        });

        setButtonLayoutData(button);
        return button;
    }

    // /** meth checks whether entry contains illegal empty space.
    // *
    // * @param addEl
    // * @return returns true if no empty space
    // */
    // private boolean isValid(String addEl) {
    //         if(addEl.contains(" ")){ //$NON-NLS-1$
    // //TODO ErrorMessage
    // return false;
    // }else{
    // return true;
    // }
    // }
    // TODO buttons aufrumen. mommentan wird direkt durch hinzufgen ein
    // eintrag gespeichert und in liste zurckgeschrieben.
    // speicher und cancel button sind also nicht korrekt.
    // ein schlieen button reicht aus.

    /**
     * create save button.
     * @param parent parent composite
     * @param id button id
     * @param label button label
     * @param b boolean is default button
     * @return button
     */
    protected final Button createSaveButton(final Composite parent, final int id, final String label,
            final boolean b) {
        ((GridLayout) parent.getLayout()).numColumns++;
        Button button = new Button(parent, SWT.PUSH);
        button.setText(label);
        button.setFont(JFaceResources.getDialogFont());
        button.setData(new Integer(id));
        button.addSelectionListener(new SelectionAdapter() {
            @Override
            public void widgetSelected(final SelectionEvent event) {
                if (isValidInput()) {
                    okPressed();
                }
            }
        });
        if (b) {
            Shell shell = parent.getShell();
            if (shell != null) {
                shell.setDefaultButton(button);
            }
        }
        setButtonLayoutData(button);
        return button;

    }

    @Override
    protected final boolean isResizable() {
        return true;
    }

    // TODO validierung einrichten
    /**
     * checks if input is valid.
     * @return is valid.
     */
    private boolean isValidInput() {
        boolean valid = true;

        return valid;
    }

    /**
     * open currently selected configdata and loads it values.
     * @param c selected configdata to be opened.
     */
    protected void loadValues(final ConfigData c) {
        _systemLang = AEConstants.getCurrentLocale().getLanguage();
        if (_rightComposite != null) {
            _rightComposite.dispose();
        }
        _rightComposite = new Composite(_mainSashForm, SWT.NONE);
        _rightComposite.setLayoutData(new GridData());
        ((GridData) _rightComposite.getLayoutData()).grabExcessHorizontalSpace = true;
        ((GridData) _rightComposite.getLayoutData()).horizontalAlignment = SWT.FILL;
        ((GridData) _rightComposite.getLayoutData()).grabExcessVerticalSpace = true;
        ((GridData) _rightComposite.getLayoutData()).verticalAlignment = SWT.FILL;
        _rightComposite.setLayout(new GridLayout());
        ((GridLayout) _rightComposite.getLayout()).numColumns = 4;
        ((GridLayout) _rightComposite.getLayout()).makeColumnsEqualWidth = false;

        Label label = new Label(_rightComposite, SWT.NONE);
        label.setText(NLMessages.getString("Config_label"));
        label.setLayoutData(new GridData());
        ((GridData) label.getLayoutData()).horizontalSpan = 1;
        ((GridData) label.getLayoutData()).grabExcessHorizontalSpace = true;
        ((GridData) label.getLayoutData()).horizontalAlignment = SWT.FILL;

        _labelText = new Text(_rightComposite, SWT.BORDER);
        _labelText.setEditable(_userRichtsChecker.mayEditConfig());
        _labelText.setLayoutData(new GridData());
        final ControlDecoration labelDeco = new ControlDecoration(_labelText, SWT.LEFT | SWT.TOP);
        ((GridData) _labelText.getLayoutData()).horizontalSpan = 3;
        ((GridData) _labelText.getLayoutData()).grabExcessHorizontalSpace = true;
        ((GridData) _labelText.getLayoutData()).horizontalAlignment = SWT.FILL;
        if (c.getLabel() != null) {
            _labelText.setText(c.getLabel());
        } else {
            _labelText.setText(c.getValue());
        }
        // _labelText.addFocusListener(new FocusAdapter()
        // {
        // @Override
        // public void focusLost(final FocusEvent e)
        // {
        // c.setLabel(_labelText.getText().trim());
        // // if (c instanceof ConfigItem)
        // // {
        // // ((ConfigItem) c).setLabel(labelText.getText().trim());
        // // }
        // }
        // });
        _labelText.addModifyListener(new ModifyListener() {

            @Override
            public void modifyText(ModifyEvent e) {
                String name = _labelText.getText().trim();
                if (name.trim().length() > 0) {
                    boolean found = false;

                    for (ConfigData cd : _configFacade.getConfigs().get(_semanticProvider).getChildren().values()) {
                        if (cd.getLabel() != null && cd.getLabel().equals(name)) {
                            found = true;
                            break;
                        }
                    }
                    if (found) {
                        labelDeco.setImage(FieldDecorationRegistry.getDefault()
                                .getFieldDecoration(FieldDecorationRegistry.DEC_ERROR).getImage());
                        setMessage("Warning. A Markup Element with the same label exists already!");
                    } else {
                        setMessage("");
                        labelDeco.setImage(null);
                        IStructuredSelection selection = (IStructuredSelection) _treeViewer.getSelection();
                        Object obj = selection.getFirstElement();
                        ConfigTreeNode tn = (ConfigTreeNode) obj;
                        c.setLabel(name.trim());
                        tn.setLabel(c.getLabel());
                        _treeViewer.update(tn, null);
                    }
                } else {
                    setMessage("Warning. Label must consist of at least one character.");
                    labelDeco.setImage(FieldDecorationRegistry.getDefault()
                            .getFieldDecoration(FieldDecorationRegistry.DEC_ERROR).getImage());
                }

            }
        });

        Label rightTitel = new Label(_rightComposite, SWT.NONE);
        rightTitel.setText(NLMessages.getString("Config_value"));
        rightTitel.setLayoutData(new GridData());
        ((GridData) rightTitel.getLayoutData()).horizontalSpan = 1;
        ((GridData) rightTitel.getLayoutData()).grabExcessHorizontalSpace = true;
        ((GridData) rightTitel.getLayoutData()).horizontalAlignment = SWT.FILL;

        _name = new Text(_rightComposite, SWT.BORDER);
        if (((c instanceof ConfigItem) && _userRichtsChecker.mayEditConfig())
                && (!((ConfigItem) c).isMandatory() || _userRichtsChecker.mayModifyMandatoryConfig())) {
            _name.setEditable(true);
        } else {
            _name.setEditable(false);
        }

        _name.setLayoutData(new GridData());
        ((GridData) _name.getLayoutData()).horizontalSpan = 3;
        ((GridData) _name.getLayoutData()).grabExcessHorizontalSpace = true;
        ((GridData) _name.getLayoutData()).horizontalAlignment = SWT.FILL;
        if (c.getValue() != null) {
            _name.setText(c.getValue());

        }
        _name.addFocusListener(new FocusAdapter() {
            @Override
            public void focusLost(final FocusEvent e) {
                if (c instanceof ConfigItem) {
                    ((ConfigItem) c).setValue(_name.getText().trim());
                }
            }
        });
        _name.addModifyListener(new ModifyListener() {

            @Override
            public void modifyText(ModifyEvent e) {
                String name = _name.getText().trim();
                if (name.trim().length() > 0) {
                    if (c.getParent() != null && c.getParent().getChildren() != null
                            && c.getParent().getChildren().containsKey(name)
                            && !c.getParent().getChildren().get(name).equals(c)) {
                        labelDeco.setImage(FieldDecorationRegistry.getDefault()
                                .getFieldDecoration(FieldDecorationRegistry.DEC_ERROR).getImage());
                        setMessage("Warning. A Markup Element with the same value exists already!");
                    } else {
                        setMessage("");
                        labelDeco.setImage(null);
                        String oldValue = new String(c.getValue());
                        c.setValue(name.trim());
                        if (!oldValue.equals(name) && c.getParent() != null
                                && c.getParent().getChildren() != null) {
                            c.getParent().getChildren().put(name, c);
                            c.getParent().getChildren().remove(oldValue);
                        }
                    }
                } else {
                    setMessage("Warning. Value must consist of at least one character.");
                    labelDeco.setImage(FieldDecorationRegistry.getDefault()
                            .getFieldDecoration(FieldDecorationRegistry.DEC_ERROR).getImage());
                }

            }
        });

        Label pos = new Label(_rightComposite, SWT.NONE);
        pos.setText(NLMessages.getString("Config_position"));
        pos.setLayoutData(new GridData());
        ((GridData) pos.getLayoutData()).horizontalSpan = 1;
        ((GridData) pos.getLayoutData()).grabExcessHorizontalSpace = true;
        ((GridData) pos.getLayoutData()).horizontalAlignment = SWT.FILL;
        pos.pack();

        _posText = new Text(_rightComposite, SWT.NONE | SWT.READ_ONLY);
        _posText.setLayoutData(new GridData());
        _posText.setEditable(false);
        ((GridData) _posText.getLayoutData()).horizontalSpan = 3;
        ((GridData) _posText.getLayoutData()).grabExcessHorizontalSpace = true;
        ((GridData) _posText.getLayoutData()).horizontalAlignment = SWT.FILL;

        if (c instanceof ConfigItem && c.getParent() != null && c.getParent().getValue().equals("aodl:semanticStm")) //$NON-NLS-1$
        {
            DataType dt = (DataType) (((ConfigItem) c).getParent());
            final DatatypeDesc dtd = dt.getDatatypeDesc();
            if (dtd.getUsage() != null && dtd.getUsage().getUsageDisplay() != null
                    && dtd.getUsage().getUsageDisplay().getPersonNameTag() != null
                    && dtd.getUsage().getUsageDisplay().getPersonNameTag().contains(c.getValue())) {
                Label name = new Label(_rightComposite, SWT.NONE);
                name.setText(NLMessages.getString("Config_name_of_person"));
                name.setLayoutData(new GridData());
                ((GridData) name.getLayoutData()).horizontalSpan = 1;

                if (_datatypeDesc.getUsage().getUsageDisplay().getPersonNormNameTag() != null && _datatypeDesc
                        .getUsage().getUsageDisplay().getPersonNormNameTag().contains(c.getValue())) {
                    Label displayName = new Label(_rightComposite, SWT.NONE);
                    displayName.setText(NLMessages.getString("Config_displayname_of_person"));
                    displayName.setLayoutData(new GridData());
                    ((GridData) displayName.getLayoutData()).horizontalSpan = 3;

                } else {
                    Label blanc = new Label(_rightComposite, SWT.NONE);
                    blanc.setText(""); //$NON-NLS-1$
                    blanc.setLayoutData(new GridData());
                    ((GridData) blanc.getLayoutData()).horizontalSpan = 2;

                }
            }
        }
        if (c instanceof ConfigItem) {
            Label base = new Label(_rightComposite, SWT.NONE);
            base.setText(NLMessages.getString("Config_priority"));
            base.setLayoutData(new GridData());
            ((GridData) base.getLayoutData()).horizontalSpan = 1;
            ((GridData) base.getLayoutData()).grabExcessHorizontalSpace = true;
            ((GridData) base.getLayoutData()).horizontalAlignment = SWT.FILL;
            base.pack();

            _baseSpinner = new Spinner(_rightComposite, SWT.NONE);
            _baseSpinner.setLayoutData(new GridData());
            _baseSpinner.setEnabled(_userRichtsChecker.mayEditConfig());
            ((GridData) _baseSpinner.getLayoutData()).horizontalSpan = 1;
            ((GridData) _baseSpinner.getLayoutData()).grabExcessHorizontalSpace = true;
            ((GridData) _baseSpinner.getLayoutData()).horizontalAlignment = SWT.FILL;

            _baseSpinner.setMinimum(0);
            _baseSpinner.setMaximum(999);

            ConfigItem ci = (ConfigItem) c;
            if (ci.getPos() != null) {
                _posText.setText(ci.getPos());
            }
            _baseSpinner.setSelection(ci.getPriority());

            _baseSpinner.addSelectionListener(new SelectionAdapter() {
                @Override
                public void widgetSelected(final SelectionEvent se) {

                    c.setPriority(_baseSpinner.getSelection());
                    if (((ConfigItem) c).getParent().getValue().equals("aodl:semanticStm")) {
                        if (_datatypeDesc.getUsage().getTemplates() != null
                                && _datatypeDesc.getUsage().getTemplates().getChildren()
                                        .containsKey("aspectTemplates")
                                && _datatypeDesc.getUsage().getTemplates().getChildren().get("aspectTemplates")
                                        .getChildren().containsKey("semanticTemplates")
                                && _datatypeDesc.getUsage().getTemplates().getChildren().get("aspectTemplates")
                                        .getChildren().get("semanticTemplates").getChildren()
                                        .containsKey(c.getValue())) {
                            ConfigData ci = _datatypeDesc.getUsage().getTemplates().getChildren()
                                    .get("aspectTemplates").getChildren().get("semanticTemplates").getChildren()
                                    .get(c.getValue());
                            ci.setPriority(_baseSpinner.getSelection());
                        }
                    }
                }
            }); // SelectionListener

        } else {
            new Label(_rightComposite, SWT.NONE);
            new Label(_rightComposite, SWT.NONE);
        }
        Button sortButton = new Button(_rightComposite, SWT.PUSH);
        sortButton.setLayoutData(new GridData());
        sortButton.setText("Sort Children");
        sortButton.setImage(_imageReg.get(IconsInternal.SORT_ALPHABETIC_DESC));
        sortButton.setEnabled(_userRichtsChecker.mayEditConfig() && c.getChildren() != null);
        ((GridData) sortButton.getLayoutData()).horizontalSpan = 2;

        sortButton.addSelectionListener(new SelectionAdapter() {
            @Override
            public void widgetSelected(final SelectionEvent se) {
                sortChildren(c);
                Object[] objects = _treeViewer.getExpandedElements();
                _treeViewer.setInput(_datatypeDesc);
                for (Object o : objects) {
                    _treeViewer.setExpandedState(o, true);
                }
            }
        }); // SelectionListener

        Label ignoreLabel = new Label(_rightComposite, SWT.NONE);
        ignoreLabel.setText(NLMessages.getString("Config_ignore"));
        ignoreLabel.setLayoutData(new GridData());
        ((GridData) ignoreLabel.getLayoutData()).horizontalSpan = 1;
        ((GridData) ignoreLabel.getLayoutData()).grabExcessHorizontalSpace = true;
        ((GridData) ignoreLabel.getLayoutData()).horizontalAlignment = SWT.FILL;
        ignoreLabel.pack();

        _ignoreButton = new Button(_rightComposite, SWT.CHECK);
        _ignoreButton.setLayoutData(new GridData());
        _ignoreButton.setEnabled(_userRichtsChecker.maySetConfigIgnored());
        ((GridData) _ignoreButton.getLayoutData()).horizontalSpan = 1;
        _ignoreButton.setSelection(c.isIgnore());

        _ignoreButton.addSelectionListener(new SelectionAdapter() {
            @Override
            public void widgetSelected(final SelectionEvent se) {
                ((ConfigItem) c).setIgnore(_ignoreButton.getSelection());
                processIgnored((ConfigItem) c);
                Object[] objects = _treeViewer.getExpandedElements();
                _treeViewer.setInput(_datatypeDesc);
                for (Object o : objects) {
                    _treeViewer.setExpandedState(o, true);
                }

            }
        }); // SelectionListener
        if (c instanceof ConfigItem) {
            if (_userRichtsChecker.mayModifyMandatoryConfig()) {
                Label mandatoryLabel = new Label(_rightComposite, SWT.NONE);
                mandatoryLabel.setText(NLMessages.getString("Config_mandatory"));
                mandatoryLabel.setLayoutData(new GridData());
                ((GridData) mandatoryLabel.getLayoutData()).horizontalSpan = 1;
                ((GridData) mandatoryLabel.getLayoutData()).grabExcessHorizontalSpace = true;
                ((GridData) mandatoryLabel.getLayoutData()).horizontalAlignment = SWT.FILL;
                mandatoryLabel.pack();

                final Button mandatoryButton = new Button(_rightComposite, SWT.CHECK);
                mandatoryButton.setLayoutData(new GridData());
                mandatoryButton.setEnabled(true);
                ((GridData) mandatoryButton.getLayoutData()).horizontalSpan = 1;
                ConfigItem ci = (ConfigItem) c;
                mandatoryButton.setSelection(ci.isMandatory());

                mandatoryButton.addSelectionListener(new SelectionAdapter() {
                    @Override
                    public void widgetSelected(final SelectionEvent se) {
                        if (c instanceof ConfigItem) {
                            ((ConfigItem) c).setMandatory(mandatoryButton.getSelection());
                            Object[] objects = _treeViewer.getExpandedElements();
                            _treeViewer.setInput(_datatypeDesc);
                            for (Object o : objects) {
                                _treeViewer.setExpandedState(o, true);
                            }
                        }

                    }
                }); // SelectionListener
            }
        } else {
            Label blancLable = new Label(_rightComposite, SWT.NONE);
            blancLable.setText(""); //$NON-NLS-1$
            blancLable.setLayoutData(new GridData());
            ((GridData) blancLable.getLayoutData()).horizontalSpan = 2;
        }

        if (c instanceof IdentifierConfig) {
            final IdentifierConfig ci = (IdentifierConfig) c;
            Label urlL = new Label(_rightComposite, SWT.NONE);
            urlL.setText("URL");
            urlL.setLayoutData(new GridData());
            ((GridData) urlL.getLayoutData()).horizontalSpan = 1;
            ((GridData) urlL.getLayoutData()).grabExcessHorizontalSpace = true;
            ((GridData) urlL.getLayoutData()).horizontalAlignment = SWT.FILL;

            final Text urlT = new Text(_rightComposite, SWT.BORDER);
            urlT.setEditable(_userRichtsChecker.mayEditConfig());
            urlT.setLayoutData(new GridData());
            ((GridData) urlT.getLayoutData()).horizontalSpan = 3;
            ((GridData) urlT.getLayoutData()).grabExcessHorizontalSpace = true;
            ((GridData) urlT.getLayoutData()).horizontalAlignment = SWT.FILL;
            if (ci.getUrl() != null) {
                urlT.setText(ci.getUrl());
            }
            urlT.addFocusListener(new FocusAdapter() {
                @Override
                public void focusLost(final FocusEvent e) {
                    ci.setUrl(urlT.getText().trim());
                    // if (c instanceof ConfigItem)
                    // {
                    // ((ConfigItem) c).setLabel(labelText.getText().trim());
                    // }
                }
            });

            Label prefixL = new Label(_rightComposite, SWT.NONE);
            prefixL.setText("Prefix");
            prefixL.setLayoutData(new GridData());
            ((GridData) prefixL.getLayoutData()).horizontalSpan = 1;
            ((GridData) prefixL.getLayoutData()).grabExcessHorizontalSpace = true;
            ((GridData) prefixL.getLayoutData()).horizontalAlignment = SWT.FILL;

            final Text prefixT = new Text(_rightComposite, SWT.BORDER);
            prefixT.setEditable(_userRichtsChecker.mayEditConfig());
            prefixT.setLayoutData(new GridData());
            ((GridData) prefixT.getLayoutData()).horizontalSpan = 3;
            ((GridData) prefixT.getLayoutData()).grabExcessHorizontalSpace = true;
            ((GridData) prefixT.getLayoutData()).horizontalAlignment = SWT.FILL;
            if (ci.getPrefix() != null) {
                prefixT.setText(ci.getPrefix());
            }
            prefixT.addFocusListener(new FocusAdapter() {
                @Override
                public void focusLost(final FocusEvent e) {
                    ci.setPrefix(prefixT.getText().trim());
                }
            });

            Label suffixL = new Label(_rightComposite, SWT.NONE);
            suffixL.setText("Suffix");
            suffixL.setLayoutData(new GridData());
            ((GridData) suffixL.getLayoutData()).horizontalSpan = 1;
            ((GridData) suffixL.getLayoutData()).grabExcessHorizontalSpace = true;
            ((GridData) suffixL.getLayoutData()).horizontalAlignment = SWT.FILL;

            final Text suffixT = new Text(_rightComposite, SWT.BORDER);
            suffixT.setEditable(_userRichtsChecker.mayEditConfig());
            suffixT.setLayoutData(new GridData());
            ((GridData) suffixT.getLayoutData()).horizontalSpan = 3;
            ((GridData) suffixT.getLayoutData()).grabExcessHorizontalSpace = true;
            ((GridData) suffixT.getLayoutData()).horizontalAlignment = SWT.FILL;
            if (ci.getSuffix() != null) {
                suffixT.setText(ci.getSuffix());
            }
            suffixT.addFocusListener(new FocusAdapter() {
                @Override
                public void focusLost(final FocusEvent e) {
                    ci.setSuffix(suffixT.getText().trim());
                }
            });

            Label regexL = new Label(_rightComposite, SWT.NONE);
            regexL.setText("Regex");
            regexL.setLayoutData(new GridData());
            ((GridData) regexL.getLayoutData()).horizontalSpan = 1;
            ((GridData) regexL.getLayoutData()).grabExcessHorizontalSpace = true;
            ((GridData) regexL.getLayoutData()).horizontalAlignment = SWT.FILL;

            final Text regexT = new Text(_rightComposite, SWT.BORDER);
            regexT.setEditable(_userRichtsChecker.mayEditConfig());
            regexT.setLayoutData(new GridData());
            ((GridData) regexT.getLayoutData()).horizontalSpan = 3;
            ((GridData) regexT.getLayoutData()).grabExcessHorizontalSpace = true;
            ((GridData) regexT.getLayoutData()).horizontalAlignment = SWT.FILL;
            if (ci.getRegex() != null) {
                regexT.setText(ci.getRegex());
            }
            regexT.addFocusListener(new FocusAdapter() {
                @Override
                public void focusLost(final FocusEvent e) {
                    ci.setRegex(regexT.getText().trim());
                }
            });
        }

        Label langLabel = new Label(_rightComposite, SWT.NONE);
        langLabel.setText(NLMessages.getString("Config_language"));
        langLabel.setLayoutData(new GridData());
        ((GridData) langLabel.getLayoutData()).horizontalSpan = 1;

        _langCombo = new Combo(_rightComposite, SWT.NONE | SWT.READ_ONLY);
        _langCombo.setLayoutData(new GridData());
        ((GridData) _langCombo.getLayoutData()).horizontalSpan = 1;
        ((GridData) _langCombo.getLayoutData()).grabExcessHorizontalSpace = true;
        ((GridData) _langCombo.getLayoutData()).horizontalAlignment = SWT.FILL;
        _langCombo.setItems(_langs);

        Label docu = new Label(_rightComposite, SWT.NONE);
        docu.setText(NLMessages.getString("Config_documentation"));
        docu.setLayoutData(new GridData());
        ((GridData) docu.getLayoutData()).horizontalSpan = 2;

        _docuText = new Text(_rightComposite, SWT.MULTI | SWT.WRAP | SWT.V_SCROLL);
        _docuText.setLayoutData(new GridData());
        _docuText.setEditable(_userRichtsChecker.mayEditConfig());
        _docuText.setBackground(Display.getDefault().getSystemColor(SWT.COLOR_WHITE));
        ((GridData) _docuText.getLayoutData()).horizontalAlignment = SWT.FILL;
        ((GridData) _docuText.getLayoutData()).verticalAlignment = SWT.FILL;
        ((GridData) _docuText.getLayoutData()).grabExcessHorizontalSpace = true;
        ((GridData) _docuText.getLayoutData()).grabExcessVerticalSpace = true;

        if (c.getDocumentation() != null && c.getDocumentation().containsKey(_systemLang)) {
            _lang = _systemLang;
            _langCombo.select(_langCombo.indexOf((_systemLang)));
            _docuText.setText(c.getDocumentation().get((_systemLang)));

        } else if (c.getDocumentation() != null && c.getDocumentation().get("de") != null) //$NON-NLS-1$
        {
            _lang = "de"; //$NON-NLS-1$
            _langCombo.select(_langCombo.indexOf((_lang)));
            _docuText.setText(c.getDocumentation().get((_lang)));

        } else if (c.getDocumentation() != null && c.getDocumentation().get("en") != null) //$NON-NLS-1$
        {
            _lang = "en"; //$NON-NLS-1$

            _langCombo.select(_langCombo.indexOf((_lang)));
            _docuText.setText(c.getDocumentation().get((_lang)));

        } else if (c.getDocumentation() != null && c.getDocumentation().get("it") != null) //$NON-NLS-1$
        {
            _lang = "it"; //$NON-NLS-1$

            _langCombo.select(_langCombo.indexOf((_lang)));
            _docuText.setText(c.getDocumentation().get((_lang)));

        } else if (c.getDocumentation() != null && c.getDocumentation().get("fr") != null) //$NON-NLS-1$
        {
            _lang = "fr"; //$NON-NLS-1$

            _langCombo.select(_langCombo.indexOf((_lang)));
            _docuText.setText(c.getDocumentation().get((_lang)));

        } else {
            _langCombo.select(_langCombo.indexOf((_systemLang)));
            String doc = c.getDocumentation().get((_systemLang));
            if (doc != null) {
                _docuText.setText(doc);
            } else {
                _docuText.setText("");

            }

        }

        _langCombo.addSelectionListener(new SelectionAdapter() {
            @Override
            public void widgetSelected(final SelectionEvent se) {

                _lang = _langCombo.getItem(_langCombo.getSelectionIndex());
                if (c.getDocumentation() != null && c.getDocumentation().containsKey(_lang)) {
                    _docuText.setText(c.getDocumentation().get((_lang)));
                } else {
                    _docuText.setText(""); //$NON-NLS-1$
                }

            }
        }); // SelectionListener

        ((GridData) _docuText.getLayoutData()).horizontalSpan = 4;
        ((GridData) _docuText.getLayoutData()).grabExcessHorizontalSpace = true;
        ((GridData) _docuText.getLayoutData()).horizontalAlignment = SWT.FILL;
        ((GridData) _docuText.getLayoutData()).minimumHeight = 60;

        //

        _docuText.addFocusListener(new FocusAdapter() {
            @Override
            public void focusLost(final FocusEvent e) {
                // System.out.println(" ################# lang " + lang +
                // " docu " + docuText.getText());
                c.getDocumentation().put(_lang, _docuText.getText());
            }
        });

        if (c instanceof ConfigItem && ((ConfigItem) c).getParent().getValue().equals("aodl:semanticStm")) {
            SemanticTemplate semTemplateHelp = null;
            if (_datatypeDesc.getUsage().getTemplates() != null
                    && _datatypeDesc.getUsage().getTemplates().getChildren() != null) {
                ConfigData cd = _datatypeDesc.getUsage().getTemplates().getChildren().get("aspectTemplates");
                if (cd == null) {
                    cd = new ConfigData();
                    _datatypeDesc.getUsage().getTemplates().getChildren().put("aspectTemplates", cd);
                }
                ConfigData cd2 = cd.getChildren().get("semanticTemplates");
                if (cd2 == null) {
                    cd2 = new ConfigData();
                    cd.getChildren().put("semanticTemplates", cd2);
                }
                semTemplateHelp = (SemanticTemplate) cd2.getChildren().get(c.getValue());
                if (semTemplateHelp == null) {
                    semTemplateHelp = new SemanticTemplate(c.getValue());
                    cd2.getChildren().put(c.getValue(), semTemplateHelp);
                }
            }

            final SemanticTemplate semTemplate = semTemplateHelp;
            // template Text
            Button templateIgnoreButton = new Button(_rightComposite, SWT.CHECK);
            templateIgnoreButton.setLayoutData(new GridData());
            templateIgnoreButton.setText(NLMessages.getString("Config_use_Template"));
            templateIgnoreButton.setEnabled(_userRichtsChecker.maySetConfigIgnored());
            templateIgnoreButton.setSelection(!semTemplate.isIgnoreTemplateText());

            ((GridData) templateIgnoreButton.getLayoutData()).horizontalSpan = 2;
            templateIgnoreButton.addSelectionListener(new SelectionAdapter() {
                @Override
                public void widgetSelected(final SelectionEvent se) {
                    semTemplate.setIgnoreTemplateText(!semTemplate.isIgnoreTemplateText());
                    _semanticAspectTemplateText
                            .setEnabled(!semTemplate.isIgnoreTemplateText() && _userRichtsChecker.mayEditConfig());
                }
            }); // SelectionListener

            Label template = new Label(_rightComposite, SWT.NONE);
            template.setText(NLMessages.getString("Config_Notification_Template"));
            template.setLayoutData(new GridData());
            ((GridData) template.getLayoutData()).horizontalSpan = 2;

            _semanticAspectTemplateText = new Text(_rightComposite,
                    SWT.WRAP | SWT.BORDER | SWT.MULTI | SWT.V_SCROLL);
            _semanticAspectTemplateText.setLayoutData(new GridData());
            _semanticAspectTemplateText
                    .setEnabled(!semTemplate.isIgnoreTemplateText() && _userRichtsChecker.mayEditConfig());
            _semanticAspectTemplateText.setBackground(Display.getDefault().getSystemColor(SWT.COLOR_WHITE));
            ((GridData) _semanticAspectTemplateText.getLayoutData()).horizontalAlignment = SWT.FILL;
            ((GridData) _semanticAspectTemplateText.getLayoutData()).verticalAlignment = SWT.FILL;
            ((GridData) _semanticAspectTemplateText.getLayoutData()).grabExcessHorizontalSpace = true;
            ((GridData) _semanticAspectTemplateText.getLayoutData()).grabExcessVerticalSpace = true;
            ((GridData) _semanticAspectTemplateText.getLayoutData()).horizontalSpan = 4;

            if (semTemplate.getTemplateText() != null) {
                _semanticAspectTemplateText.setText(semTemplate.getTemplateText());
            }

            _semanticAspectTemplateText.addFocusListener(new FocusAdapter() {
                @Override
                public void focusLost(FocusEvent e) {
                    semTemplate.setTemplateText(_semanticAspectTemplateText.getText());

                }
            });

        }

        if (c.isMyHaveChildren()) {
            Label l = new Label(_rightComposite, SWT.NONE);
            l.setText(NLMessages.getString("Config_new_delete"));
            l.setLayoutData(new GridData());

            _addElement = new Text(_rightComposite, SWT.BORDER);
            _addElement.setEditable(_userRichtsChecker.mayEditConfig());

            _addElement.setLayoutData(new GridData());
            ((GridData) _addElement.getLayoutData()).grabExcessHorizontalSpace = true;
            ((GridData) _addElement.getLayoutData()).horizontalAlignment = SWT.FILL;
            ((GridData) _addElement.getLayoutData()).horizontalSpan = 2;
            _addElement.addModifyListener(new ModifyListener() {

                @Override
                public void modifyText(ModifyEvent e) {
                    String name = _addElement.getText().trim();
                    if (name.length() > 0) {
                        if (c.getChildren() != null && c.getChildren().containsKey(name)) {
                            _addToList.setEnabled(false);
                            setMessage("Warning. A Markup Element with the same name exists already!");
                        } else {
                            setMessage("");
                            _addToList.setEnabled(_userRichtsChecker.mayEditConfig());
                        }
                    } else {
                        setMessage("");
                        _addToList.setEnabled(false);
                    }

                }
            });
            _addElement.addKeyListener(new KeyListener() {

                @Override
                public void keyPressed(final KeyEvent e) {
                    if (e.keyCode == SWT.CR && _addElement.getText().trim().length() > 0) {
                        addElementToListe(c);
                    }

                }

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

                }
            });

            _addToList = new Button(_rightComposite, SWT.PUSH | SWT.END);
            _addToList.setEnabled(_userRichtsChecker.mayEditConfig());

            _addToList.setText(NLMessages.getString("Config_add"));
            _addToList.setToolTipText(NLMessages.getString("Config_add_tooltip"));

            _addToList.setLayoutData(new GridData());
            ((GridData) _addToList.getLayoutData()).verticalAlignment = SWT.FILL;
            _addElement.setEnabled(true);
            _addToList.addSelectionListener(new SelectionAdapter() {
                @Override
                public void widgetSelected(final SelectionEvent e) {
                    addElementToListe(c);

                }

            });

        }
        _deleteFromList = new Button(_rightComposite, SWT.PUSH | SWT.END);
        _deleteFromList.setText(NLMessages.getString("Config_delete_entry"));
        _deleteFromList.setToolTipText(NLMessages.getString("Config_delete_entry_tooltip"));
        _deleteFromList.setLayoutData(new GridData());
        // deleteFromList.setEnabled(false);

        if (((c instanceof ConfigItem) && _userRichtsChecker.mayEditConfig())
                && (!c.isMandatory() || _userRichtsChecker.mayModifyMandatoryConfig())) {
            _deleteFromList.setEnabled(true);
        } else if (c instanceof IdentifierConfig && _userRichtsChecker.mayEditConfig()) {
            _deleteFromList.setEnabled(true);
        } else {
            _deleteFromList.setEnabled(false);
        }

        // ((GridData) editListGroup.getLayoutData()).END ;
        // ((GridData) loadRelationList.getLayoutData()).verticalAlignment =
        // SWT.FILL;
        _deleteFromList.addSelectionListener(new SelectionAdapter() {
            @Override
            public void widgetSelected(final SelectionEvent e) {

                if (c instanceof ConfigItem || c instanceof IdentifierConfig) {
                    IStructuredSelection selection = (IStructuredSelection) _treeViewer.getSelection();
                    Object obj = selection.getFirstElement();
                    ConfigTreeNode parent = ((ConfigTreeNode) obj).getParent();
                    ((ConfigData) c).remove();

                    _treeViewer.setSelection(new StructuredSelection(parent));

                }

                Object[] objects = _treeViewer.getExpandedElements();
                _treeViewer.setInput(_datatypeDesc);
                for (Object o : objects) {
                    _treeViewer.setExpandedState(o, true);
                }
            }
        });
        if (c instanceof ConfigItem && ((ConfigItem) c).getParent().getValue().equals("aodl:semanticStm")) //$NON-NLS-1$
        {
            // name.setEditable(false);
            DataType dt = (DataType) (((ConfigItem) c).getParent());
            final DatatypeDesc dtd = dt.getDatatypeDesc();
            _setAsPersonName = new Button(_rightComposite, SWT.PUSH | SWT.END);
            _setAsPersonName.setText(NLMessages.getString("Config_as_person_name"));
            _setAsPersonName.setToolTipText(NLMessages.getString("Config_as_person_name_tooltip"));
            _setAsPersonName.setLayoutData(new GridData());
            // setAsPersonName.setEnabled(false);

            _setAsPersonName.setEnabled((c instanceof ConfigItem) && _userRichtsChecker.mayEditConfig());
            _setAsPersonName.addSelectionListener(new SelectionAdapter() {
                @Override
                public void widgetSelected(final SelectionEvent e) {
                    _setAsNormName.setEnabled(_userRichtsChecker.mayEditConfig());
                    dtd.getUsage().getUsageDisplay().getPersonNameTag().add(c.getValue());
                    loadValues(c);

                }

            });
            _setAsNormName = new Button(_rightComposite, SWT.PUSH | SWT.END);
            _setAsNormName.setText(NLMessages.getString("Config_as_display_name"));
            _setAsNormName.setToolTipText(NLMessages.getString("Config_as_display_name_tooltip"));
            _setAsNormName.setLayoutData(new GridData());
            _setAsNormName.setEnabled(false);
            if (dtd.getUsage() != null && dtd.getUsage().getUsageDisplay() != null
                    && dtd.getUsage().getUsageDisplay().getPersonNameTag() != null
                    && dtd.getUsage().getUsageDisplay().getPersonNameTag().contains(c.getValue())) {
                _setAsNormName.setEnabled(_userRichtsChecker.mayEditConfig());
            }

            _setAsNormName.addSelectionListener(new SelectionAdapter() {
                @Override
                public void widgetSelected(final SelectionEvent e) {
                    DataType dt = (DataType) (((ConfigItem) c).getParent());
                    dt.getDatatypeDesc().getUsage().getUsageDisplay().getPersonNormNameTag().add(c.getValue());

                    loadValues(c);

                }

            });
            Button removeUsageSettings = new Button(_rightComposite, SWT.PUSH | SWT.END);
            removeUsageSettings.setText(NLMessages.getString("Config_remove_person_name_settting"));
            removeUsageSettings.setToolTipText(NLMessages.getString("Config_remove_person_name_settting_tooltip"));
            removeUsageSettings.setLayoutData(new GridData());
            ((GridData) removeUsageSettings.getLayoutData()).horizontalSpan = 2;

            removeUsageSettings.setEnabled(false);
            if (dtd.getUsage() != null && dtd.getUsage().getUsageDisplay() != null
                    && dtd.getUsage().getUsageDisplay().getPersonNameTag() != null
                    && dtd.getUsage().getUsageDisplay().getPersonNameTag().contains(c.getValue())) {
                _setAsPersonName.setEnabled(false);

                if (dtd.getUsage().getUsageDisplay().getPersonNormNameTag().contains(c.getValue())) {
                    _setAsNormName.setEnabled(false);
                }
                if (dtd.getUsage().getUsageDisplay().getPersonNameTag().size() > 2
                        && dtd.getUsage().getUsageDisplay().getPersonNormNameTag().size() > 1) {
                    removeUsageSettings.setEnabled(_userRichtsChecker.mayEditConfig());
                } else {
                    removeUsageSettings.setEnabled(false);
                    _deleteFromList.setEnabled(false);
                }
            }

            removeUsageSettings.addSelectionListener(new SelectionAdapter() {
                @Override
                public void widgetSelected(final SelectionEvent e) {
                    dtd.getUsage().getUsageDisplay().getPersonNameTag().remove(c.getValue());
                    dtd.getUsage().getUsageDisplay().getPersonNormNameTag().remove(c.getValue());

                    loadValues(c);

                }

            });
        }
        _rightComposite.layout();
        _mainSashForm.setWeights(new int[] { 3, 3 });
        _mainSashForm.layout();
        // mainSashForm.pack();
    }

    private void addElementToListe(ConfigData c) {
        String addEl = _addElement.getText().trim();
        if (c.getPos() != null) {
            if (c.getPos().equals("personIdentifiers")) {
                IdentifierConfig ic = new IdentifierConfig();
                ic.setPos("personIdentifier");
                ic.setMyHaveChildren(false);
                ic.setValue(addEl);
                ic.setLabel(addEl);
                ic.setParent(c);
                ic.setPriority(c.getChildren().size() + 1);
                if (addEl.trim().length() > 0) {
                    c.getChildren().put(addEl, ic);
                    Object[] objects = _treeViewer.getExpandedElements();
                    ISelection iSelection = _treeViewer.getSelection();
                    Object obj = ((IStructuredSelection) iSelection).getFirstElement();
                    _treeViewer.setInput(_datatypeDesc);
                    for (Object o : objects) {
                        _treeViewer.setExpandedState(o, true);
                    }
                    _treeViewer.setExpandedState(obj, true);
                    _addElement.setText("");
                }
            } else {
                ConfigItem ci = new ConfigItem();
                ci.setValue(addEl);
                ci.setLabel(addEl);
                ci.setParent(c);
                if (c.getPos().startsWith("list")) //$NON-NLS-1$
                {
                    ci.setPos(("_TEXTNODE")); //$NON-NLS-1$
                    ci.setMyHaveChildren(false);
                } else if (c.getValue().equals("aodl:semanticStm")) //$NON-NLS-1$
                {
                    ci.setPos(("_TEXTNODE")); //$NON-NLS-1$
                    ci.setMyHaveChildren(false);
                } else if (c.getValue().equals("aodl:relation")) //$NON-NLS-1$
                {
                    ci.setPos(("context")); //$NON-NLS-1$
                    ci.setMyHaveChildren(true);
                } else if (c.getValue().startsWith("aodl")) //$NON-NLS-1$
                {
                    ci.setPos(("type")); //$NON-NLS-1$
                    ci.setMyHaveChildren(true);
                } else if (c.getPos().equals("type")) //$NON-NLS-1$
                {
                    ci.setPos(("subtype")); //$NON-NLS-1$
                    ci.setMyHaveChildren(true);
                } else if (c.getPos().equals("subtype")) //$NON-NLS-1$
                {
                    ci.setPos(("role")); //$NON-NLS-1$
                    ci.setMyHaveChildren(false);
                } else if (c.getPos().equals("context")) //$NON-NLS-1$
                {
                    ci.setPos(("class")); //$NON-NLS-1$
                    ci.setMyHaveChildren(true);
                } else if (c.getPos().equals("class")) //$NON-NLS-1$
                {
                    ci.setPos(("_TEXTNODE")); //$NON-NLS-1$
                    ci.setMyHaveChildren(false);
                } else if (c.getPos().equals("_TEXTNODE")) //$NON-NLS-1$
                {
                    ci.setPos(("_TEXTNODE")); //$NON-NLS-1$
                    ci.setMyHaveChildren(false);
                }
                ci.setPriority(c.getChildren().size() + 1);
                if (addEl.trim().length() > 0) {
                    c.getChildren().put(addEl, ci);
                    Object[] objects = _treeViewer.getExpandedElements();
                    ISelection iSelection = _treeViewer.getSelection();
                    Object obj = ((IStructuredSelection) iSelection).getFirstElement();
                    _treeViewer.setInput(_datatypeDesc);
                    for (Object o : objects) {
                        _treeViewer.setExpandedState(o, true);
                    }
                    _treeViewer.setExpandedState(obj, true);
                    _addElement.setText("");
                }
            }
        }
    }

    @Override
    protected final void okPressed() {
        saveInput();
        super.okPressed();
    }

    // We allow the user to resize this dialog

    /**
     * process ignored state of config items after the have been moved.
     * @param c config item
     */
    protected final void processIgnored(final ConfigItem c) {
        if (c.getChildren() != null) {
            for (String key : c.getChildren().keySet()) {
                ConfigItem ci = (ConfigItem) c.getChildren().get(key);
                ci.setIgnore(c.isIgnore());
                processIgnored(ci);
            }
        }

    }

    /**
     * save input to data store handling.
     */
    private void saveInput() {
        if (_datatypeDesc != null) {

            try {
                _cfgManager.saveConfig(_datatypeDesc);
            } catch (XMLStreamException e) {
                e.printStackTrace();
            } catch (Exception e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }

    }

    /**
     * set new configuration.
     * @param newConfiguration new configuration.
     */
    public final void setNewConfiguration(final DatatypeDesc newConfiguration) {
        this._newConfiguration = newConfiguration;
    }

    /**
     * sort children of given configData alphabetically.
     * @param c configData whoms children shall be sorted.
     */
    protected final void sortChildren(final ConfigData c) {
        if (c.getChildren() != null && !c.getChildren().isEmpty()) {
            ArrayList<ConfigData> list = new ArrayList<ConfigData>(c.getChildren().values());
            Collections.sort(list, new ConfigDataComparator(false));
            int i = 0;
            for (ConfigData cd : list) {
                // System.out.println("key " + cd.getLabel() + " priority " +
                // i);
                cd.setPriority(i);
                i = i + 2;
            }

        }

    }

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

    @Override
    public void update(final Observable arg0, final Object arg1) {
    }

    public TreeViewer getTreeViewer() {
        return _treeViewer;
    }

    public void setMessagePublic(String message) {
        setMessage(message);
    }

}