org.apache.directory.studio.openldap.config.acl.dialogs.OpenLdapAclDialog.java Source code

Java tutorial

Introduction

Here is the source code for org.apache.directory.studio.openldap.config.acl.dialogs.OpenLdapAclDialog.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.openldap.config.acl.dialogs;

import java.text.ParseException;

import org.apache.directory.studio.common.ui.widgets.BaseWidgetUtils;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.Status;
import org.eclipse.jface.dialogs.Dialog;
import org.eclipse.jface.dialogs.ErrorDialog;
import org.eclipse.jface.dialogs.IDialogConstants;
import org.eclipse.jface.dialogs.MessageDialog;
import org.eclipse.swt.SWT;
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.Composite;
import org.eclipse.swt.widgets.Control;
import org.eclipse.swt.widgets.Group;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.swt.widgets.Spinner;

import org.apache.directory.studio.openldap.config.acl.OpenLdapAclEditorPlugin;
import org.apache.directory.studio.openldap.config.acl.OpenLdapAclEditorPluginConstants;
import org.apache.directory.studio.openldap.config.acl.OpenLdapAclValueWithContext;
import org.apache.directory.studio.openldap.config.acl.widgets.OpenLdapAclTabFolderComposite;

/**
 * The OpenLDAP ACL Dialog is used to edit ACL values on an OpenLDAP server connection.
 * 
 * @author <a href="mailto:dev@directory.apache.org">Apache Directory Project</a>
 */
public class OpenLdapAclDialog extends Dialog {
    /** The ID for the 'Format' button */
    private static final int FORMAT_BUTTON = 999999;

    /** The ID for the 'Check Syntax' button */
    private static final int CHECK_SYNTAX_BUTTON = 999998;

    /** The context containing the initial value, passed by the constructor */
    private OpenLdapAclValueWithContext context;

    /** The ACL value */
    private String aclValue;

    /** The precendence checkbox */
    private Button precedenceCheckbox;

    /** The precedence spinner */
    private Spinner precedenceSpinner;

    /** The precedence flag */
    private int precedence;

    /** The tab folder composite */
    private OpenLdapAclTabFolderComposite tabFolderComposite;

    /**
     * A listener on the Precedence Checkbox. It will enable or disable the precedence spinner.
     */
    private SelectionAdapter precedenceCheckBoxSelectionListener = new SelectionAdapter() {
        public void widgetSelected(SelectionEvent e) {
            precedenceSpinner.setEnabled(precedenceCheckbox.getSelection());
        }
    };

    /**
     * The precedence spinner modify listener
     */
    private ModifyListener precedenceSpinnerModifyListener = new ModifyListener() {
        public void modifyText(ModifyEvent e) {
            precedence = precedenceSpinner.getSelection();
        }
    };

    /**
     * Creates a new instance of OpenLdapAclDialog.
     * 
     * @param parentShell the parent shell
     * @param context the ACL context
     */
    public OpenLdapAclDialog(Shell parentShell, OpenLdapAclValueWithContext context) {
        super(parentShell);
        super.setShellStyle(super.getShellStyle() | SWT.RESIZE);
        this.context = context;
        context.setAclDialog(this);
    }

    /**
     * @see org.eclipse.jface.window.Window#configureShell(org.eclipse.swt.widgets.Shell)
     */
    protected void configureShell(Shell shell) {
        super.configureShell(shell);
        shell.setText("OpenLDAP ACL Editor");
        shell.setImage(OpenLdapAclEditorPlugin.getDefault().getImage(OpenLdapAclEditorPluginConstants.IMG_EDITOR));
    }

    /**
     * @see org.eclipse.jface.dialogs.Dialog#createButtonsForButtonBar(org.eclipse.swt.widgets.Composite)
     */
    protected void createButtonsForButtonBar(Composite parent) {
        createButton(parent, FORMAT_BUTTON, "Format", false);
        createButton(parent, CHECK_SYNTAX_BUTTON, "Check Syntax", false);
        createButton(parent, IDialogConstants.OK_ID, IDialogConstants.OK_LABEL, false);
        createButton(parent, IDialogConstants.CANCEL_ID, IDialogConstants.CANCEL_LABEL, false);
    }

    /**
     * {@inheritDoc}
     * 
     * This implementation checks if the Format button was pressed.
     */
    protected void buttonPressed(int buttonId) {
        if (buttonId == FORMAT_BUTTON) {
            tabFolderComposite.format();
        }
        if (buttonId == CHECK_SYNTAX_BUTTON) {
            try {
                tabFolderComposite.getInput();
                MessageDialog.openInformation(getShell(), "Correct Syntax", "Correct Syntax");
            } catch (ParseException pe) {
                IStatus status = new Status(IStatus.ERROR, OpenLdapAclEditorPluginConstants.PLUGIN_ID, 1,
                        "Invalid syntax.", pe);
                ErrorDialog.openError(getShell(), "Syntax Error", null, status);
            }
        }

        // call super implementation
        super.buttonPressed(buttonId);
    }

    /**
     * {@inheritDoc}
     */
    protected void okPressed() {
        try {
            aclValue = tabFolderComposite.getInput();
            tabFolderComposite.saveWidgetSettings();

            super.okPressed();
        } catch (ParseException pe) {
            IStatus status = new Status(IStatus.ERROR, OpenLdapAclEditorPluginConstants.PLUGIN_ID, 1,
                    "Invalid syntax.", pe);
            ErrorDialog.openError(getShell(), "Syntax Error", null, status);
        }
    }

    /**
     * Return the OK button instance
     */
    public Button getOKButton() {
        return getButton(IDialogConstants.OK_ID);
    }

    /**
     * @see org.eclipse.jface.dialogs.Dialog#createDialogArea(org.eclipse.swt.widgets.Composite)
     */
    protected Control createDialogArea(Composite parent) {
        Composite composite = (Composite) super.createDialogArea(parent);
        GridData gd = new GridData(SWT.FILL, SWT.FILL, true, true);
        gd.widthHint = convertHorizontalDLUsToPixels(IDialogConstants.MINIMUM_MESSAGE_AREA_WIDTH) * 4 / 3;
        gd.heightHint = convertVerticalDLUsToPixels(IDialogConstants.MINIMUM_MESSAGE_AREA_WIDTH) * 4 / 3;
        composite.setLayoutData(gd);

        // Creating UI : first the precedence
        createPrecedenceGroup(composite);

        // the tab for the source/visual editor 
        createTabFolderComposite(composite);

        // Setting default focus on the composite
        composite.setFocus();

        applyDialogFont(composite);

        return composite;
    }

    /**
     * Creates the precedence group. We handle the checkbox and the value for precedence.
     * 
     * <pre>
     * +-----------------------------------------+
     * | [ ] Precedence : [---] 8                |
     * +-----------------------------------------+
     * </pre>
     * @param parent the parent composite
     */
    private void createPrecedenceGroup(Composite parent) {
        // Precendence group
        Group precendenceGroup = BaseWidgetUtils.createGroup(parent, "", 1);
        GridLayout precedenceGroupLayout = new GridLayout(2, false);
        precedenceGroupLayout.horizontalSpacing = precedenceGroupLayout.verticalSpacing = 10;
        precendenceGroup.setLayout(precedenceGroupLayout);
        GridData gd2 = new GridData(SWT.FILL, SWT.NONE, true, false);
        precendenceGroup.setLayoutData(gd2);

        // Precendence values
        precedence = context.getPrecedence();

        // Precedence checkbox
        precedenceCheckbox = BaseWidgetUtils.createCheckbox(precendenceGroup, "Precedence:", 1);
        precedenceCheckbox.setSelection(context.hasPrecedence());
        precedenceCheckbox.addSelectionListener(precedenceCheckBoxSelectionListener);

        // Precedence spinner
        precedenceSpinner = new Spinner(precendenceGroup, SWT.BORDER);
        precedenceSpinner.setEnabled(context.hasPrecedence());
        precedenceSpinner.setSelection(precedence);
        precedenceSpinner.setLayoutData(new GridData(SWT.BEGINNING, SWT.CENTER, true, false));
        precedenceSpinner.addModifyListener(precedenceSpinnerModifyListener);
    }

    /**
     * Creates the tab folder composite.
     *
     * @param parent the parent composite
     */
    private void createTabFolderComposite(Composite parent) {
        // Creating the tab folder composite
        tabFolderComposite = new OpenLdapAclTabFolderComposite(parent, context, SWT.NONE);
        tabFolderComposite.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true, 2, 1));
    }

    /**
     * Gets the ACL value.
     * 
     * @return the ACL value
     */
    public String getAclValue() {
        return aclValue;
    }

    /**
     * @return the precedence value
     */
    public int getPrecedence() {
        return precedence;
    }

    /**
     * @return whether precedence is used or not
     */
    public boolean hasPrecedence() {
        return precedence != -1;
    }
}