net.sf.eclipsecs.ui.config.RuleConfigurationEditDialog.java Source code

Java tutorial

Introduction

Here is the source code for net.sf.eclipsecs.ui.config.RuleConfigurationEditDialog.java

Source

//============================================================================
//
// Copyright (C) 2002-2014  David Schneider, Lars Kdderitzsch
//
// This library 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 2.1 of the License, or (at your option) any later version.
//
// This library 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 this library; if not, write to the Free Software
// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
//
//============================================================================

package net.sf.eclipsecs.ui.config;

import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.TreeSet;

import net.sf.eclipsecs.core.config.ConfigProperty;
import net.sf.eclipsecs.core.config.Module;
import net.sf.eclipsecs.core.config.Severity;
import net.sf.eclipsecs.core.config.meta.MetadataFactory;
import net.sf.eclipsecs.core.util.CheckstyleLog;
import net.sf.eclipsecs.core.util.CheckstylePluginException;
import net.sf.eclipsecs.ui.CheckstyleUIPlugin;
import net.sf.eclipsecs.ui.CheckstyleUIPluginImages;
import net.sf.eclipsecs.ui.CheckstyleUIPluginPrefs;
import net.sf.eclipsecs.ui.Messages;
import net.sf.eclipsecs.ui.config.widgets.ConfigPropertyWidgetFactory;
import net.sf.eclipsecs.ui.config.widgets.IConfigPropertyWidget;
import net.sf.eclipsecs.ui.util.SWTUtil;

import org.apache.commons.lang.StringUtils;
import org.eclipse.jface.dialogs.IDialogConstants;
import org.eclipse.jface.dialogs.MessageDialog;
import org.eclipse.jface.dialogs.TitleAreaDialog;
import org.eclipse.jface.viewers.ArrayContentProvider;
import org.eclipse.jface.viewers.ComboViewer;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.jface.viewers.LabelProvider;
import org.eclipse.jface.viewers.StructuredSelection;
import org.eclipse.osgi.util.NLS;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.FocusEvent;
import org.eclipse.swt.events.FocusListener;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.events.SelectionListener;
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.Display;
import org.eclipse.swt.widgets.Group;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.swt.widgets.TabFolder;
import org.eclipse.swt.widgets.TabItem;
import org.eclipse.swt.widgets.Text;
import org.osgi.service.prefs.BackingStoreException;

/**
 * Edit dialog for property values.
 */
public class RuleConfigurationEditDialog extends TitleAreaDialog {

    private final Module mRule;

    private TabFolder mMainTab;

    private Text mCommentText;

    private Text mIdText;

    private ComboViewer mSeverityCombo;

    private IConfigPropertyWidget[] mConfigPropertyWidgets;

    private Button mBtnTranslate;

    private Button mBtnSort;

    private Map<String, Text> mCustomMessages;

    private boolean mReadonly = false;

    private final String mTitle;

    /**
     * Constructor.
     * 
     * @param parent Parent shell.
     * @param rule Rule being edited.
     */
    RuleConfigurationEditDialog(Shell parent, Module rule, boolean readonly, String title) {
        super(parent);
        setShellStyle(getShellStyle() | SWT.RESIZE);
        mRule = rule;
        mReadonly = readonly;
        mTitle = title;
    }

    /**
     * @see org.eclipse.jface.dialogs.Dialog#createDialogArea(org.eclipse.swt.widgets.Composite)
     */
    protected Control createDialogArea(Composite parent) {
        Composite composite = (Composite) super.createDialogArea(parent);

        mMainTab = new TabFolder(composite, SWT.NULL);
        mMainTab.setLayoutData(new GridData(GridData.FILL_BOTH));

        Composite generalSettings = createGeneralSection();
        Composite advancedSettings = createAdvancedSection();

        TabItem mainItem = new TabItem(mMainTab, SWT.NULL);
        mainItem.setControl(generalSettings);
        mainItem.setText(Messages.RuleConfigurationEditDialog_tabGeneral);

        TabItem advancedItem = new TabItem(mMainTab, SWT.NULL);
        advancedItem.setControl(advancedSettings);
        advancedItem.setText(Messages.RuleConfigurationEditDialog_tabAdvanced);

        initialize();
        return composite;
    }

    private Composite createGeneralSection() {
        Composite generalSettings = new Composite(mMainTab, SWT.NULL);
        generalSettings.setLayoutData(new GridData(GridData.FILL_BOTH));
        GridLayout layout = new GridLayout(2, false);
        generalSettings.setLayout(layout);

        // Build severity
        Label lblSeverity = new Label(generalSettings, SWT.NULL);
        lblSeverity.setText(Messages.RuleConfigurationEditDialog_lblSeverity);
        lblSeverity.setLayoutData(new GridData());

        mSeverityCombo = new ComboViewer(generalSettings);
        mSeverityCombo.setContentProvider(new ArrayContentProvider());
        mSeverityCombo.setLabelProvider(new LabelProvider() {
            /**
             * @see org.eclipse.jface.viewers.LabelProvider#getText(java.lang.Object)
             */
            public String getText(Object element) {
                return ((Severity) element).name();
            }
        });
        mSeverityCombo.getControl().setLayoutData(new GridData());

        Group properties = new Group(generalSettings, SWT.NULL);
        properties.setLayout(new GridLayout(3, false));
        properties.setText(Messages.RuleConfigurationEditDialog_lblProperties);
        GridData gd = new GridData(GridData.FILL_BOTH);
        gd.horizontalSpan = 2;
        properties.setLayoutData(gd);

        createConfigPropertyEntries(properties);

        if (mConfigPropertyWidgets == null || mConfigPropertyWidgets.length == 0) {

            properties.dispose();
        }
        return generalSettings;
    }

    private Composite createAdvancedSection() {

        Composite advancedSettings = new Composite(mMainTab, SWT.NULL);
        advancedSettings.setLayoutData(new GridData(GridData.FILL_BOTH));
        GridLayout layout = new GridLayout(2, false);
        advancedSettings.setLayout(layout);

        // Build comment
        Label commentLabel = new Label(advancedSettings, SWT.NULL);
        commentLabel.setText(Messages.RuleConfigurationEditDialog_lblComment);
        commentLabel.setLayoutData(new GridData());

        mCommentText = new Text(advancedSettings, SWT.SINGLE | SWT.BORDER);
        mCommentText.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));

        Label idLabel = new Label(advancedSettings, SWT.NULL);
        idLabel.setText(Messages.RuleConfigurationEditDialog_lblId);
        idLabel.setLayoutData(new GridData());

        mIdText = new Text(advancedSettings, SWT.SINGLE | SWT.BORDER);
        mIdText.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));

        Group messagesGroup = new Group(advancedSettings, SWT.NULL);
        messagesGroup.setText(Messages.RuleConfigurationEditDialog_titleCustMsg);
        messagesGroup.setLayout(new GridLayout(2, false));
        GridData d = new GridData(GridData.FILL_HORIZONTAL);
        d.horizontalSpan = 2;
        messagesGroup.setLayoutData(d);

        mCustomMessages = new HashMap<String, Text>();

        // take keys from metadata as well as predefined from the
        // configuration. This way we don't lose keys not defined in metadata.
        Set<String> msgKeys = new TreeSet<String>();
        msgKeys.addAll(mRule.getMetaData().getMessageKeys());
        msgKeys.addAll(mRule.getCustomMessages().keySet());

        for (String msgKey : msgKeys) {

            Label msgLabel = new Label(messagesGroup, SWT.NULL);
            msgLabel.setText(msgKey);
            msgLabel.setLayoutData(new GridData());

            final Text msgText = new Text(messagesGroup, SWT.SINGLE | SWT.BORDER); //| SWT.SEARCH see below
            msgText.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));

            final String standardMessage = MetadataFactory.getStandardMessage(msgKey,
                    mRule.getMetaData().getInternalName());

            //msgText.setMessage(standardMessage); //a nice solution, sadly only for Eclipse 3.3+

            //alternative for above 
            if (standardMessage != null) {
                msgText.setText(standardMessage);
            }
            msgText.addFocusListener(new FocusListener() {

                public void focusGained(FocusEvent e) {
                    Display.getCurrent().asyncExec(new Runnable() {

                        public void run() {
                            if (msgText.getText().equals(standardMessage)) {
                                msgText.selectAll();
                            }
                        }
                    });
                }

                public void focusLost(FocusEvent e) {
                    // NOOP
                }
            });

            String message = mRule.getCustomMessages().get(msgKey);
            if (StringUtils.trimToNull(message) != null) {
                msgText.setText(message);
            }
            msgText.setEnabled(!mReadonly);

            mCustomMessages.put(msgKey, msgText);
        }

        return advancedSettings;
    }

    protected Control createButtonBar(Composite parent) {

        Composite composite = new Composite(parent, SWT.NONE);
        GridLayout layout = new GridLayout(3, false);
        layout.marginHeight = 0;
        layout.marginWidth = 0;
        composite.setLayout(layout);
        composite.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));

        mBtnTranslate = new Button(composite, SWT.CHECK);
        mBtnTranslate.setText(Messages.RuleConfigurationEditDialog_btnTranslateTokens);
        GridData gd = new GridData();
        gd.horizontalAlignment = GridData.BEGINNING;
        gd.horizontalIndent = 5;
        mBtnTranslate.setLayoutData(gd);

        // Init the translate tokens preference
        mBtnTranslate
                .setSelection(CheckstyleUIPluginPrefs.getBoolean(CheckstyleUIPluginPrefs.PREF_TRANSLATE_TOKENS));
        mBtnTranslate.addSelectionListener(new SelectionListener() {

            public void widgetSelected(SelectionEvent e) {
                // store translation preference
                try {
                    CheckstyleUIPluginPrefs.setBoolean(CheckstyleUIPluginPrefs.PREF_TRANSLATE_TOKENS,
                            ((Button) e.widget).getSelection());
                } catch (BackingStoreException e1) {
                    CheckstyleLog.log(e1);
                }
            }

            public void widgetDefaultSelected(SelectionEvent e) {
                // NOOP
            }
        });

        mBtnSort = new Button(composite, SWT.CHECK);
        mBtnSort.setText(Messages.RuleConfigurationEditDialog_btnSortTokens);
        gd = new GridData();
        gd.horizontalAlignment = GridData.BEGINNING;
        gd.horizontalIndent = 5;
        mBtnSort.setLayoutData(gd);

        // Init the sort tokens preference
        mBtnSort.setSelection(CheckstyleUIPluginPrefs.getBoolean(CheckstyleUIPluginPrefs.PREF_SORT_TOKENS));
        mBtnSort.addSelectionListener(new SelectionListener() {

            public void widgetSelected(SelectionEvent e) {

                // store translation preference
                try {
                    CheckstyleUIPluginPrefs.setBoolean(CheckstyleUIPluginPrefs.PREF_SORT_TOKENS,
                            ((Button) e.widget).getSelection());
                } catch (BackingStoreException e1) {
                    CheckstyleLog.log(e1);
                }
            }

            public void widgetDefaultSelected(SelectionEvent e) {
                // NOOP
            }
        });

        Control buttonBar = super.createButtonBar(composite);
        gd = new GridData(GridData.FILL_HORIZONTAL);
        gd.horizontalAlignment = GridData.END;
        buttonBar.setLayoutData(gd);

        return composite;
    }

    protected void createButtonsForButtonBar(Composite parent) {

        Button defautlt = createButton(parent, IDialogConstants.BACK_ID,
                Messages.RuleConfigurationEditDialog_btnDefaul, false);
        defautlt.setEnabled(!mReadonly);

        // create OK and Cancel buttons by default
        createButton(parent, IDialogConstants.OK_ID, IDialogConstants.OK_LABEL, true);
        createButton(parent, IDialogConstants.CANCEL_ID, IDialogConstants.CANCEL_LABEL, false);
    }

    private void initialize() {

        this.setTitle(NLS.bind(Messages.RuleConfigurationEditDialog_titleRuleConfigEditor, mRule.getName()));
        if (!mReadonly) {
            this.setMessage(Messages.RuleConfigurationEditDialog_msgEditRuleConfig);
        } else {
            this.setMessage(Messages.RuleConfigurationEditDialog_msgReadonlyModule);
        }

        String comment = mRule.getComment();
        if (comment != null) {
            mCommentText.setText(comment);
        }

        String id = mRule.getId();
        if (id != null) {
            mIdText.setText(id);
        }

        mIdText.setEnabled(!mReadonly);
        // mCustomMessageText.setEditable(!mReadonly);
        mCommentText.setEnabled(!mReadonly);

        mSeverityCombo.setInput(Severity.values());
        mSeverityCombo.getCombo().setEnabled(!mReadonly);
        if (mRule.getMetaData().hasSeverity()) {
            mSeverityCombo.setSelection(new StructuredSelection(mRule.getSeverity()));
        } else {
            mSeverityCombo.getCombo().setEnabled(false);
        }

        // set the logo
        this.setTitleImage(CheckstyleUIPluginImages.getImage(CheckstyleUIPluginImages.PLUGIN_LOGO));

    }

    /**
     * @see org.eclipse.jface.dialogs.Dialog#buttonPressed(int)
     */
    protected void buttonPressed(int buttonId) {
        if (IDialogConstants.BACK_ID == buttonId) {

            if (MessageDialog.openConfirm(getShell(), Messages.RuleConfigurationEditDialog_titleRestoreDefault,
                    Messages.RuleConfigurationEditDialog_msgRestoreDefault)) {

                if (mRule.getMetaData().hasSeverity()) {
                    mSeverityCombo
                            .setSelection(new StructuredSelection(mRule.getMetaData().getDefaultSeverityLevel()));
                    mCommentText.setText(new String());
                }

                // restore the default value for the properties
                int size = mConfigPropertyWidgets != null ? mConfigPropertyWidgets.length : 0;
                for (int i = 0; i < size; i++) {
                    mConfigPropertyWidgets[i].restorePropertyDefault();
                }
            }
        } else {
            super.buttonPressed(buttonId);
        }
    }

    /**
     * OK button was selected.
     */
    protected void okPressed() {
        //
        // Get the selected severity level.
        //
        Severity severity = mRule.getSeverity();
        try {
            severity = (Severity) ((IStructuredSelection) mSeverityCombo.getSelection()).getFirstElement();
        } catch (IllegalArgumentException e) {
            CheckstyleLog.log(e);
        }

        // Get the comment.
        String comment = StringUtils.trimToNull(mCommentText.getText());

        // Get the id
        String id = StringUtils.trimToNull(mIdText.getText());

        // Get the custom message
        for (Map.Entry<String, Text> entry : mCustomMessages.entrySet()) {

            String msgKey = entry.getKey();

            String standardMessage = MetadataFactory.getStandardMessage(msgKey,
                    mRule.getMetaData().getInternalName());
            if (standardMessage == null) {
                standardMessage = ""; //$NON-NLS-1$
            }

            String message = StringUtils.trimToNull(entry.getValue().getText());
            if (message != null && !message.equals(standardMessage)) {
                mRule.getCustomMessages().put(msgKey, message);
            } else {
                mRule.getCustomMessages().remove(msgKey);
            }
        }

        //
        // Build a new collection of configuration properties.
        //
        // Note: if the rule does not have any configuration properties then
        // skip over the populating of the config property hash map.
        //
        if (mConfigPropertyWidgets != null) {
            for (int i = 0; i < mConfigPropertyWidgets.length; i++) {
                IConfigPropertyWidget widget = mConfigPropertyWidgets[i];
                ConfigProperty property = widget.getConfigProperty();

                try {
                    widget.validate();
                } catch (CheckstylePluginException e) {
                    String message = NLS.bind(Messages.RuleConfigurationEditDialog_msgInvalidPropertyValue,
                            property.getMetaData().getName());
                    this.setErrorMessage(message);
                    return;
                }
                property.setValue(widget.getValue());
            }
        }

        //
        // If we made it this far then all of the user input validated and we
        // can
        // update the final rule with the values the user entered.
        //
        mRule.setSeverity(severity);
        mRule.setComment(comment);
        mRule.setId(id);

        super.okPressed();

    }

    private void createConfigPropertyEntries(Composite parent) {

        List<ConfigProperty> configItemMetadata = mRule.getProperties();
        if (configItemMetadata.size() <= 0) {
            return;
        }

        mConfigPropertyWidgets = new IConfigPropertyWidget[configItemMetadata.size()];
        Iterator<ConfigProperty> iter = configItemMetadata.iterator();
        for (int i = 0; iter.hasNext(); i++) {
            ConfigProperty prop = iter.next();

            //
            // Add an input widget for the properties value.
            //
            mConfigPropertyWidgets[i] = ConfigPropertyWidgetFactory.createWidget(parent, prop, getShell());
            mConfigPropertyWidgets[i].setEnabled(!mReadonly);
        }
    }

    /**
     * @see org.eclipse.jface.window.Window#create()
     */
    public void create() {
        super.create();

        // add resize support - for each different module the settings will be
        // stored separately
        SWTUtil.addResizeSupport(this, CheckstyleUIPlugin.getDefault().getDialogSettings(),
                RuleConfigurationEditDialog.class.getName() + "#" //$NON-NLS-1$
                        + mRule.getMetaData().getInternalName());
    }

    /**
     * Over-rides method from Window to configure the shell (e.g. the enclosing
     * window).
     */
    protected void configureShell(Shell shell) {
        super.configureShell(shell);

        shell.setText(mTitle);
    }
}