org.apache.directory.studio.schemaeditor.view.dialogs.ObjectClassSelectionDialog.java Source code

Java tutorial

Introduction

Here is the source code for org.apache.directory.studio.schemaeditor.view.dialogs.ObjectClassSelectionDialog.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.schemaeditor.view.dialogs;

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

import org.apache.directory.api.ldap.model.schema.ObjectClass;
import org.apache.directory.studio.schemaeditor.Activator;
import org.apache.directory.studio.schemaeditor.PluginConstants;
import org.eclipse.jface.dialogs.Dialog;
import org.eclipse.jface.dialogs.IDialogConstants;
import org.eclipse.jface.dialogs.MessageDialog;
import org.eclipse.jface.viewers.DecoratingLabelProvider;
import org.eclipse.jface.viewers.ISelectionChangedListener;
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.KeyAdapter;
import org.eclipse.swt.events.KeyEvent;
import org.eclipse.swt.events.ModifyEvent;
import org.eclipse.swt.events.ModifyListener;
import org.eclipse.swt.events.MouseAdapter;
import org.eclipse.swt.events.MouseEvent;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.swt.widgets.Table;
import org.eclipse.swt.widgets.Text;
import org.eclipse.ui.PlatformUI;

/**
 * This class is the Object Class Selection Dialog, that allows user to select an object class.
 *
 * @author <a href="mailto:dev@directory.apache.org">Apache Directory Project</a>
 */
public class ObjectClassSelectionDialog extends Dialog {
    /** The selected object class */
    private ObjectClass selectedObjectClass;

    /** The hidden Object Classes */
    private List<ObjectClass> hiddenObjectClasses;

    // UI Fields
    private Text searchText;
    private Table objectClassesTable;
    private TableViewer objectClassesTableViewer;
    private Label schemaIconLabel;
    private Label schemaNameLabel;
    private Button chooseButton;

    /**
     * Creates a new instance of ObjectClassSelectionDialog.
     */
    public ObjectClassSelectionDialog() {
        super(PlatformUI.getWorkbench().getActiveWorkbenchWindow().getShell());
        hiddenObjectClasses = new ArrayList<ObjectClass>();
    }

    /**
     * {@inheritDoc}
     */
    protected void configureShell(Shell newShell) {
        super.configureShell(newShell);
        newShell.setText(Messages.getString("ObjectClassSelectionDialog.ClassSelection")); //$NON-NLS-1$
    }

    /**
     * {@inheritDoc}
     */
    protected Control createDialogArea(Composite parent) {
        Composite composite = new Composite(parent, SWT.NONE);
        GridLayout layout = new GridLayout(1, false);
        composite.setLayout(layout);

        Label chooseLabel = new Label(composite, SWT.NONE);
        chooseLabel.setText(Messages.getString("ObjectClassSelectionDialog.ChooseClass")); //$NON-NLS-1$
        chooseLabel.setLayoutData(new GridData(SWT.FILL, SWT.NONE, true, false));

        searchText = new Text(composite, SWT.BORDER | SWT.SEARCH);
        searchText.setLayoutData(new GridData(SWT.FILL, SWT.NONE, true, false));
        searchText.addModifyListener(new ModifyListener() {
            public void modifyText(ModifyEvent e) {
                setSearchInput(searchText.getText());
            }
        });
        searchText.addKeyListener(new KeyAdapter() {
            public void keyPressed(KeyEvent e) {
                if (e.keyCode == SWT.ARROW_DOWN) {
                    objectClassesTable.setFocus();
                }
            }
        });

        Label matchingLabel = new Label(composite, SWT.NONE);
        matchingLabel.setText(Messages.getString("ObjectClassSelectionDialog.MatchingClasses")); //$NON-NLS-1$
        matchingLabel.setLayoutData(new GridData(SWT.FILL, SWT.None, true, false));

        objectClassesTable = new Table(composite,
                SWT.SINGLE | SWT.BORDER | SWT.H_SCROLL | SWT.V_SCROLL | SWT.FULL_SELECTION | SWT.HIDE_SELECTION);
        GridData gridData = new GridData(SWT.FILL, SWT.FILL, true, true);
        gridData.heightHint = 148;
        gridData.minimumHeight = 148;
        gridData.widthHint = 350;
        gridData.minimumWidth = 350;
        objectClassesTable.setLayoutData(gridData);
        objectClassesTable.addMouseListener(new MouseAdapter() {
            public void mouseDoubleClick(MouseEvent e) {
                if (objectClassesTable.getSelectionIndex() != -1) {
                    okPressed();
                }
            }
        });

        objectClassesTableViewer = new TableViewer(objectClassesTable);
        objectClassesTableViewer
                .setContentProvider(new ObjectClassSelectionDialogContentProvider(hiddenObjectClasses));
        objectClassesTableViewer
                .setLabelProvider(new DecoratingLabelProvider(new ObjectClassSelectionDialogLabelProvider(),
                        Activator.getDefault().getWorkbench().getDecoratorManager().getLabelDecorator()));
        objectClassesTableViewer.addSelectionChangedListener(new ISelectionChangedListener() {
            public void selectionChanged(SelectionChangedEvent event) {
                StructuredSelection selection = (StructuredSelection) objectClassesTableViewer.getSelection();
                if (selection.isEmpty()) {
                    if ((chooseButton != null) && (!chooseButton.isDisposed())) {
                        chooseButton.setEnabled(false);
                    }
                    schemaIconLabel
                            .setImage(Activator.getDefault().getImage(PluginConstants.IMG_TRANSPARENT_16X16));
                    schemaNameLabel.setText(""); //$NON-NLS-1$
                } else {
                    if ((chooseButton != null) && (!chooseButton.isDisposed())) {
                        chooseButton.setEnabled(true);
                    }
                    schemaIconLabel.setImage(Activator.getDefault().getImage(PluginConstants.IMG_SCHEMA));
                    schemaNameLabel.setText(((ObjectClass) selection.getFirstElement()).getSchemaName());
                }
            }
        });

        // Schema Composite
        Composite schemaComposite = new Composite(composite, SWT.BORDER);
        schemaComposite.setLayoutData(new GridData(SWT.FILL, SWT.NONE, true, false));
        GridLayout schemaCompositeGridLayout = new GridLayout(2, false);
        schemaCompositeGridLayout.horizontalSpacing = 0;
        schemaCompositeGridLayout.verticalSpacing = 0;
        schemaCompositeGridLayout.marginWidth = 2;
        schemaCompositeGridLayout.marginHeight = 2;
        schemaComposite.setLayout(schemaCompositeGridLayout);

        // Schema Icon Label
        schemaIconLabel = new Label(schemaComposite, SWT.NONE);
        GridData schemaIconLabelGridData = new GridData(SWT.NONE, SWT.BOTTOM, false, false);
        schemaIconLabelGridData.widthHint = 18;
        schemaIconLabelGridData.heightHint = 16;
        schemaIconLabel.setLayoutData(schemaIconLabelGridData);
        schemaIconLabel.setImage(Activator.getDefault().getImage(PluginConstants.IMG_TRANSPARENT_16X16));

        // Schema Name Label
        schemaNameLabel = new Label(schemaComposite, SWT.NONE);
        schemaNameLabel.setLayoutData(new GridData(SWT.FILL, SWT.BOTTOM, true, false));
        schemaNameLabel.setText(""); //$NON-NLS-1$

        // We need to force the input to load the complete list of attribute types
        setSearchInput(""); //$NON-NLS-1$

        return composite;
    }

    /**
     * {@inheritDoc}
     */
    protected void createButtonsForButtonBar(Composite parent) {
        chooseButton = createButton(parent, IDialogConstants.OK_ID,
                Messages.getString("ObjectClassSelectionDialog.Choose"), true); //$NON-NLS-1$
        createButton(parent, IDialogConstants.CANCEL_ID, IDialogConstants.CANCEL_LABEL, false);

        StructuredSelection selection = (StructuredSelection) objectClassesTableViewer.getSelection();
        if (selection.isEmpty()) {
            if ((chooseButton != null) && (!chooseButton.isDisposed())) {
                chooseButton.setEnabled(false);
            }
        } else {
            if ((chooseButton != null) && (!chooseButton.isDisposed())) {
                chooseButton.setEnabled(true);
            }
        }
    }

    /**
     * {@inheritDoc}
     */
    protected void okPressed() {
        StructuredSelection selection = (StructuredSelection) objectClassesTableViewer.getSelection();

        if (selection.isEmpty()) {
            MessageDialog.openError(getShell(), Messages.getString("ObjectClassSelectionDialog.InvalidSelection"), //$NON-NLS-1$
                    Messages.getString("ObjectClassSelectionDialog.MustChooseClass")); //$NON-NLS-1$
            return;
        } else {
            selectedObjectClass = (ObjectClass) selection.getFirstElement();
        }

        super.okPressed();
    }

    /**
     * Returns the selected Object Class.
     * 
     * @return 
     *      the selected Object Class
     */
    public ObjectClass getSelectedObjectClass() {
        return selectedObjectClass;
    }

    /**
     * Set the hidden Object Classes.
     *
     * @param list
     *      a list of Object Classes to hide
     */
    public void setHiddenObjectClasses(List<ObjectClass> list) {
        hiddenObjectClasses = list;
    }

    /**
     * Sets the hidden Object Classes.
     *
     * @param objectClasses
     *      an array of Object Classes to hide
     */
    public void setHiddenObjectClasses(ObjectClass[] objectClasses) {
        for (ObjectClass objectClass : objectClasses) {
            hiddenObjectClasses.add(objectClass);
        }
    }

    /**
     * Set the Search Input.
     *
     * @param searchString
     *      the Search String
     */
    private void setSearchInput(String searchString) {
        objectClassesTableViewer.setInput(searchString);

        Object firstElement = objectClassesTableViewer.getElementAt(0);
        if (firstElement != null) {
            objectClassesTableViewer.setSelection(new StructuredSelection(firstElement), true);
        }
    }

    /**
     * {@inheritDoc}
     */
    public boolean close() {
        hiddenObjectClasses.clear();
        hiddenObjectClasses = null;

        objectClassesTableViewer = null;

        objectClassesTable.dispose();
        objectClassesTable = null;

        searchText.dispose();
        searchText = null;

        schemaIconLabel.dispose();
        schemaIconLabel = null;

        schemaNameLabel.dispose();
        schemaNameLabel = null;

        return super.close();
    }
}