org.apache.directory.studio.ldapbrowser.common.dialogs.preferences.BinaryAttributesAndSyntaxesPreferencePage.java Source code

Java tutorial

Introduction

Here is the source code for org.apache.directory.studio.ldapbrowser.common.dialogs.preferences.BinaryAttributesAndSyntaxesPreferencePage.java

Source

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

package org.apache.directory.studio.ldapbrowser.common.dialogs.preferences;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;
import java.util.List;
import java.util.SortedMap;
import java.util.TreeMap;

import org.apache.directory.api.ldap.model.schema.AttributeType;
import org.apache.directory.api.ldap.model.schema.LdapSyntax;
import org.apache.directory.studio.common.ui.widgets.BaseWidgetUtils;
import org.apache.directory.studio.connection.core.Utils;
import org.apache.directory.studio.ldapbrowser.core.BrowserConnectionManager;
import org.apache.directory.studio.ldapbrowser.core.BrowserCorePlugin;
import org.apache.directory.studio.ldapbrowser.core.model.IBrowserConnection;
import org.apache.directory.studio.ldapbrowser.core.model.schema.BinaryAttribute;
import org.apache.directory.studio.ldapbrowser.core.model.schema.BinarySyntax;
import org.apache.directory.studio.ldapbrowser.core.model.schema.Schema;
import org.apache.directory.studio.ldapbrowser.core.model.schema.SchemaUtils;
import org.eclipse.jface.preference.PreferencePage;
import org.eclipse.jface.viewers.ArrayContentProvider;
import org.eclipse.jface.viewers.DoubleClickEvent;
import org.eclipse.jface.viewers.IDoubleClickListener;
import org.eclipse.jface.viewers.ISelectionChangedListener;
import org.eclipse.jface.viewers.ITableLabelProvider;
import org.eclipse.jface.viewers.LabelProvider;
import org.eclipse.jface.viewers.SelectionChangedEvent;
import org.eclipse.jface.viewers.StructuredSelection;
import org.eclipse.jface.viewers.TableViewer;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.graphics.Image;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;
import org.eclipse.swt.widgets.Table;
import org.eclipse.swt.widgets.TableColumn;
import org.eclipse.ui.IWorkbench;
import org.eclipse.ui.IWorkbenchPreferencePage;

/**
 * The BinaryAttributesAndSyntaxesPreferencePage is used to specify
 * binary attributes and syntaxes.
 *
 * @author <a href="mailto:dev@directory.apache.org">Apache Directory Project</a>
 */
public class BinaryAttributesAndSyntaxesPreferencePage extends PreferencePage implements IWorkbenchPreferencePage {

    /** Map with attribute OID => attribute type description */
    private SortedMap<String, AttributeType> attributeOid2AtdMap;

    /** Map with attribute name => attribute type description */
    private SortedMap<String, AttributeType> attributeNames2AtdMap;

    /** The attribute names and OIDs. */
    private String[] attributeNamesAndOids;

    /** Map with syntax OID => syntax description */
    private SortedMap<String, LdapSyntax> syntaxOid2LsdMap;

    /** Map with syntax DESC => syntax description */
    private SortedMap<String, LdapSyntax> syntaxDesc2LsdMap;

    /** The syntax OIDs. */
    private String[] syntaxOids;

    /** The attribute list. */
    private List<BinaryAttribute> attributeList;

    /** The attribute viewer. */
    private TableViewer attributeViewer;

    /** The attribute add button. */
    private Button attributeAddButton;

    /** The attribute edit button. */
    private Button attributeEditButton;

    /** The attribute remove button. */
    private Button attributeRemoveButton;

    /** The syntax list. */
    private List<BinarySyntax> syntaxList;

    /** The syntax viewer. */
    private TableViewer syntaxViewer;

    /** The syntax add button. */
    private Button syntaxAddButton;

    /** The syntax edit button. */
    private Button syntaxEditButton;

    /** The syntax remove button. */
    private Button syntaxRemoveButton;

    /**
     * Creates a new instance of BinaryAttributesAndSyntaxesPreferencePage.
     */
    public BinaryAttributesAndSyntaxesPreferencePage() {
        super(Messages.getString("BinaryAttributesAndSyntaxesPreferencePage.BinaryAttributes")); //$NON-NLS-1$
        super.setDescription(
                Messages.getString("BinaryAttributesAndSyntaxesPreferencePage.BinaryAttributesDescription")); //$NON-NLS-1$
    }

    /**
     * {@inheritDoc}
     */
    public void init(IWorkbench workbench) {
    }

    /**
     * {@inheritDoc}
     */
    protected Control createContents(Composite parent) {
        Composite composite = BaseWidgetUtils.createColumnContainer(parent, 1, 1);
        composite.setLayoutData(new GridData(GridData.FILL_BOTH));

        // init available attribute types
        attributeNames2AtdMap = new TreeMap<String, AttributeType>();
        attributeOid2AtdMap = new TreeMap<String, AttributeType>();
        BrowserConnectionManager cm = BrowserCorePlugin.getDefault().getConnectionManager();
        IBrowserConnection[] connections = cm.getBrowserConnections();
        for (IBrowserConnection browserConnection : connections) {
            Schema schema = browserConnection.getSchema();
            createAttributeMaps(schema);
        }
        createAttributeMaps(Schema.DEFAULT_SCHEMA);
        attributeNamesAndOids = new String[attributeNames2AtdMap.size() + attributeOid2AtdMap.size()];
        System.arraycopy(attributeNames2AtdMap.keySet().toArray(), 0, attributeNamesAndOids, 0,
                attributeNames2AtdMap.size());
        System.arraycopy(attributeOid2AtdMap.keySet().toArray(), 0, attributeNamesAndOids,
                attributeNames2AtdMap.size(), attributeOid2AtdMap.size());

        // init available syntaxes
        syntaxOid2LsdMap = new TreeMap<String, LdapSyntax>();
        syntaxDesc2LsdMap = new TreeMap<String, LdapSyntax>();
        for (IBrowserConnection browserConnection : connections) {
            Schema schema = browserConnection.getSchema();
            createSyntaxMaps(schema);
        }
        createSyntaxMaps(Schema.DEFAULT_SCHEMA);
        syntaxOids = new String[syntaxOid2LsdMap.size()];
        System.arraycopy(syntaxOid2LsdMap.keySet().toArray(), 0, syntaxOids, 0, syntaxOid2LsdMap.size());

        // create attribute contents
        BaseWidgetUtils.createSpacer(composite, 1);
        BaseWidgetUtils.createSpacer(composite, 1);
        createAttributeContents(composite);
        attributeList = new ArrayList<BinaryAttribute>(
                Arrays.asList(BrowserCorePlugin.getDefault().getCorePreferences().getBinaryAttributes()));
        attributeViewer.setInput(attributeList);
        attributeViewer.getTable().getColumn(0).pack();

        // create syntax contents
        BaseWidgetUtils.createSpacer(composite, 1);
        BaseWidgetUtils.createSpacer(composite, 1);
        createSyntaxContents(composite);
        syntaxList = new ArrayList<BinarySyntax>(
                Arrays.asList(BrowserCorePlugin.getDefault().getCorePreferences().getBinarySyntaxes()));
        syntaxViewer.setInput(syntaxList);
        syntaxViewer.getTable().getColumn(0).pack();
        syntaxViewer.getTable().pack();

        return composite;
    }

    private void createAttributeMaps(Schema schema) {
        Collection<AttributeType> atds = schema.getAttributeTypeDescriptions();
        for (AttributeType atd : atds) {
            attributeOid2AtdMap.put(atd.getOid(), atd);
            for (String name : atd.getNames()) {
                attributeNames2AtdMap.put(name, atd);
            }
        }
    }

    private void createSyntaxMaps(Schema schema) {
        Collection<LdapSyntax> lsds = schema.getLdapSyntaxDescriptions();
        for (LdapSyntax lsd : lsds) {
            syntaxOid2LsdMap.put(lsd.getOid(), lsd);

            if (lsd.getDescription() != null) {
                syntaxDesc2LsdMap.put(lsd.getDescription(), lsd);
            }
        }
    }

    private void createAttributeContents(Composite parent) {
        BaseWidgetUtils.createLabel(parent,
                Messages.getString("BinaryAttributesAndSyntaxesPreferencePage.BinaryAttributes"), 1); //$NON-NLS-1$

        Composite composite = BaseWidgetUtils.createColumnContainer(parent, 2, 1);
        composite.setLayoutData(new GridData(GridData.FILL_BOTH));
        Composite listComposite = BaseWidgetUtils.createColumnContainer(composite, 1, 1);
        listComposite.setLayoutData(new GridData(GridData.FILL_BOTH));
        Composite buttonComposite = BaseWidgetUtils.createColumnContainer(composite, 1, 1);
        buttonComposite.setLayoutData(new GridData(GridData.VERTICAL_ALIGN_BEGINNING));

        Table table = new Table(listComposite, SWT.SINGLE | SWT.BORDER | SWT.H_SCROLL | SWT.FULL_SELECTION);
        GridData data = new GridData(GridData.FILL_BOTH);
        data.widthHint = 360;
        data.heightHint = convertHeightInCharsToPixels(10);
        table.setLayoutData(data);
        table.setHeaderVisible(true);
        table.setLinesVisible(true);
        attributeViewer = new TableViewer(table);

        TableColumn c1 = new TableColumn(table, SWT.NONE);
        c1.setText(Messages.getString("BinaryAttributesAndSyntaxesPreferencePage.Attribute")); //$NON-NLS-1$
        c1.setWidth(300);
        TableColumn c2 = new TableColumn(table, SWT.NONE);
        c2.setText(Messages.getString("BinaryAttributesAndSyntaxesPreferencePage.Alias")); //$NON-NLS-1$
        c2.setWidth(60);

        attributeViewer.setColumnProperties(
                new String[] { Messages.getString("BinaryAttributesAndSyntaxesPreferencePage.Attribute") }); //$NON-NLS-1$
        attributeViewer.setContentProvider(new ArrayContentProvider());
        attributeViewer.setLabelProvider(new AttributeLabelProvider());

        attributeViewer.addDoubleClickListener(new IDoubleClickListener() {
            public void doubleClick(DoubleClickEvent event) {
                editAttribute();
            }
        });

        attributeViewer.addSelectionChangedListener(new ISelectionChangedListener() {
            public void selectionChanged(SelectionChangedEvent event) {
                attributeEditButton.setEnabled(!attributeViewer.getSelection().isEmpty());
                attributeRemoveButton.setEnabled(!attributeViewer.getSelection().isEmpty());
            }
        });

        attributeAddButton = BaseWidgetUtils.createButton(buttonComposite,
                Messages.getString("BinaryAttributesAndSyntaxesPreferencePage.Add"), 1); //$NON-NLS-1$
        attributeAddButton.addSelectionListener(new SelectionAdapter() {
            public void widgetSelected(SelectionEvent e) {
                addAttribute();
            }
        });
        attributeEditButton = BaseWidgetUtils.createButton(buttonComposite,
                Messages.getString("BinaryAttributesAndSyntaxesPreferencePage.Edit"), 1); //$NON-NLS-1$
        attributeEditButton.setEnabled(false);
        attributeEditButton.addSelectionListener(new SelectionAdapter() {
            public void widgetSelected(SelectionEvent e) {
                editAttribute();
            }
        });
        attributeRemoveButton = BaseWidgetUtils.createButton(buttonComposite,
                Messages.getString("BinaryAttributesAndSyntaxesPreferencePage.Remove"), 1); //$NON-NLS-1$
        attributeRemoveButton.setEnabled(false);
        attributeRemoveButton.addSelectionListener(new SelectionAdapter() {
            public void widgetSelected(SelectionEvent e) {
                removeAttribute();
            }
        });
    }

    private void createSyntaxContents(Composite parent) {
        BaseWidgetUtils.createLabel(parent,
                Messages.getString("BinaryAttributesAndSyntaxesPreferencePage.BinarySyntaxes"), 1); //$NON-NLS-1$

        Composite composite = BaseWidgetUtils.createColumnContainer(parent, 2, 1);
        composite.setLayoutData(new GridData(GridData.FILL_BOTH));
        Composite listComposite = BaseWidgetUtils.createColumnContainer(composite, 1, 1);
        listComposite.setLayoutData(new GridData(GridData.FILL_BOTH));
        Composite buttonComposite = BaseWidgetUtils.createColumnContainer(composite, 1, 1);
        buttonComposite.setLayoutData(new GridData(GridData.VERTICAL_ALIGN_BEGINNING));

        Table table = new Table(listComposite, SWT.SINGLE | SWT.BORDER | SWT.H_SCROLL | SWT.FULL_SELECTION);
        GridData data = new GridData(GridData.FILL_BOTH);
        data.widthHint = 360;
        data.heightHint = convertHeightInCharsToPixels(10);
        table.setLayoutData(data);
        table.setHeaderVisible(true);
        table.setLinesVisible(true);
        syntaxViewer = new TableViewer(table);

        TableColumn c1 = new TableColumn(table, SWT.NONE);
        c1.setText(Messages.getString("BinaryAttributesAndSyntaxesPreferencePage.Syntax")); //$NON-NLS-1$
        c1.setWidth(300);
        TableColumn c2 = new TableColumn(table, SWT.NONE);
        c2.setText(Messages.getString("BinaryAttributesAndSyntaxesPreferencePage.Desc")); //$NON-NLS-1$
        c2.setWidth(60);

        syntaxViewer.setColumnProperties(
                new String[] { Messages.getString("BinaryAttributesAndSyntaxesPreferencePage.Syntax") }); //$NON-NLS-1$
        syntaxViewer.setContentProvider(new ArrayContentProvider());
        syntaxViewer.setLabelProvider(new SyntaxLabelProvider());

        syntaxViewer.addDoubleClickListener(new IDoubleClickListener() {
            public void doubleClick(DoubleClickEvent event) {
                editSyntax();
            }
        });

        syntaxViewer.addSelectionChangedListener(new ISelectionChangedListener() {
            public void selectionChanged(SelectionChangedEvent event) {
                syntaxEditButton.setEnabled(!syntaxViewer.getSelection().isEmpty());
                syntaxRemoveButton.setEnabled(!syntaxViewer.getSelection().isEmpty());
            }
        });

        syntaxAddButton = BaseWidgetUtils.createButton(buttonComposite,
                Messages.getString("BinaryAttributesAndSyntaxesPreferencePage.Add"), 1); //$NON-NLS-1$
        syntaxAddButton.addSelectionListener(new SelectionAdapter() {
            public void widgetSelected(SelectionEvent e) {
                addSyntax();
            }
        });
        syntaxEditButton = BaseWidgetUtils.createButton(buttonComposite,
                Messages.getString("BinaryAttributesAndSyntaxesPreferencePage.Edit"), 1); //$NON-NLS-1$
        syntaxEditButton.setEnabled(false);
        syntaxEditButton.addSelectionListener(new SelectionAdapter() {
            public void widgetSelected(SelectionEvent e) {
                editSyntax();
            }
        });
        syntaxRemoveButton = BaseWidgetUtils.createButton(buttonComposite,
                Messages.getString("BinaryAttributesAndSyntaxesPreferencePage.Remove"), 1); //$NON-NLS-1$
        syntaxRemoveButton.setEnabled(false);
        syntaxRemoveButton.addSelectionListener(new SelectionAdapter() {
            public void widgetSelected(SelectionEvent e) {
                removeSyntax();
            }
        });
    }

    private void addAttribute() {
        AttributeDialog dialog = new AttributeDialog(getShell(), null, attributeNamesAndOids);
        if (dialog.open() == AttributeValueEditorDialog.OK) {
            BinaryAttribute attribute = dialog.getAttribute();

            // Ensuring we use OID for consistency in the table viewer
            if (attributeNames2AtdMap.containsKey(attribute.getAttributeNumericOidOrName())) {
                attribute = new BinaryAttribute(
                        attributeNames2AtdMap.get(attribute.getAttributeNumericOidOrName()).getOid());
            } else if (attributeOid2AtdMap.containsKey(attribute.getAttributeNumericOidOrName())) {
                attribute = new BinaryAttribute(
                        attributeOid2AtdMap.get(attribute.getAttributeNumericOidOrName()).getOid());
            }

            attributeList.add(attribute);
            attributeViewer.refresh();
        }
    }

    private void removeAttribute() {
        Object o = ((StructuredSelection) attributeViewer.getSelection()).getFirstElement();
        attributeList.remove(o);
        attributeViewer.refresh();
    }

    private void editAttribute() {
        StructuredSelection sel = (StructuredSelection) attributeViewer.getSelection();
        if (!sel.isEmpty()) {
            BinaryAttribute attribute = (BinaryAttribute) sel.getFirstElement();
            AttributeDialog dialog = new AttributeDialog(getShell(), attribute, attributeNamesAndOids);
            if (dialog.open() == AttributeValueEditorDialog.OK) {
                int index = attributeList.indexOf(attribute);
                attributeList.set(index, dialog.getAttribute());
                attributeViewer.refresh();
            }
        }
    }

    private void addSyntax() {
        SyntaxDialog dialog = new SyntaxDialog(getShell(), null, syntaxOids);
        if (dialog.open() == SyntaxValueEditorDialog.OK) {
            syntaxList.add(dialog.getSyntax());
            syntaxViewer.refresh();
        }
    }

    private void removeSyntax() {
        Object o = ((StructuredSelection) syntaxViewer.getSelection()).getFirstElement();
        syntaxList.remove(o);
        syntaxViewer.refresh();
    }

    private void editSyntax() {
        StructuredSelection sel = (StructuredSelection) syntaxViewer.getSelection();
        if (!sel.isEmpty()) {
            BinarySyntax syntax = (BinarySyntax) sel.getFirstElement();
            SyntaxDialog dialog = new SyntaxDialog(getShell(), syntax, syntaxOids);
            if (dialog.open() == SyntaxValueEditorDialog.OK) {
                int index = syntaxList.indexOf(syntax);
                syntaxList.set(index, dialog.getSyntax());
                syntaxViewer.refresh();
            }
        }
    }

    /**
     * {@inheritDoc}
     */
    public boolean performOk() {
        BinaryAttribute[] attributes = attributeList.toArray(new BinaryAttribute[attributeList.size()]);
        BrowserCorePlugin.getDefault().getCorePreferences().setBinaryAttributes(attributes);

        BinarySyntax[] syntaxes = syntaxList.toArray(new BinarySyntax[syntaxList.size()]);
        BrowserCorePlugin.getDefault().getCorePreferences().setBinarySyntaxes(syntaxes);

        return true;
    }

    /**
     * {@inheritDoc}
     */
    protected void performDefaults() {
        attributeList.clear();
        attributeList.addAll(
                Arrays.asList(BrowserCorePlugin.getDefault().getCorePreferences().getDefaultBinaryAttributes()));
        attributeViewer.refresh();

        syntaxList.clear();
        syntaxList.addAll(
                Arrays.asList(BrowserCorePlugin.getDefault().getCorePreferences().getDefaultBinarySyntaxes()));
        syntaxViewer.refresh();

        super.performDefaults();
    }

    class AttributeLabelProvider extends LabelProvider implements ITableLabelProvider {
        public String getColumnText(Object obj, int index) {
            if (obj instanceof BinaryAttribute) {
                BinaryAttribute attribute = (BinaryAttribute) obj;
                if (index == 0) {
                    return attribute.getAttributeNumericOidOrName();
                } else if (index == 1) {
                    if (attribute.getAttributeNumericOidOrName() != null) {
                        if (attributeNames2AtdMap.containsKey(attribute.getAttributeNumericOidOrName())) {
                            AttributeType atd = attributeNames2AtdMap.get(attribute.getAttributeNumericOidOrName());
                            String s = atd.getOid();
                            for (String attributeName : atd.getNames()) {
                                if (!attribute.getAttributeNumericOidOrName().equals(attributeName)) {
                                    s += ", " + attributeName; //$NON-NLS-1$
                                }
                            }
                            return s;
                        } else if (attributeOid2AtdMap.containsKey(attribute.getAttributeNumericOidOrName())) {
                            AttributeType atd = attributeOid2AtdMap.get(attribute.getAttributeNumericOidOrName());
                            return SchemaUtils.toString(atd);
                        } else if (Utils.getOidDescription(attribute.getAttributeNumericOidOrName()) != null) {
                            return Utils.getOidDescription(attribute.getAttributeNumericOidOrName());
                        }
                    }
                }
            }
            return null;
        }

        public Image getColumnImage(Object obj, int index) {
            return null;
        }
    }

    class SyntaxLabelProvider extends LabelProvider implements ITableLabelProvider {
        public String getColumnText(Object obj, int index) {
            if (obj instanceof BinarySyntax) {
                BinarySyntax syntax = (BinarySyntax) obj;
                if (index == 0) {
                    return syntax.getSyntaxNumericOid();
                } else if (index == 1) {
                    if (syntax.getSyntaxNumericOid() != null) {
                        if (syntaxOid2LsdMap.containsKey(syntax.getSyntaxNumericOid())) {
                            LdapSyntax lsd = (LdapSyntax) syntaxOid2LsdMap.get(syntax.getSyntaxNumericOid());
                            return SchemaUtils.toString(lsd);
                        } else if (Utils.getOidDescription(syntax.getSyntaxNumericOid()) != null) {
                            return Utils.getOidDescription(syntax.getSyntaxNumericOid());
                        }
                    }
                }
            }
            return null;
        }

        public Image getColumnImage(Object obj, int index) {
            return null;
        }
    }
}