org.tigris.subversion.subclipse.ui.comments.CommentTemplatesPreferencePage.java Source code

Java tutorial

Introduction

Here is the source code for org.tigris.subversion.subclipse.ui.comments.CommentTemplatesPreferencePage.java

Source

/*******************************************************************************
 * Copyright (c) 2005 Maik Schreiber.
 * All rights reserved. This program and the accompanying materials
 * are made available under the terms of the Eclipse Public License v1.0
 * which accompanies this distribution, and is available at
 * http://www.eclipse.org/legal/epl-v10.html
 *
 * Contributors:
 *    Maik Schreiber - initial API and implementation
 *******************************************************************************/

package org.tigris.subversion.subclipse.ui.comments;

import org.eclipse.jface.dialogs.Dialog;
import org.eclipse.jface.dialogs.IDialogConstants;
import org.eclipse.jface.preference.PreferencePage;
import org.eclipse.jface.viewers.DoubleClickEvent;
import org.eclipse.jface.viewers.IDoubleClickListener;
import org.eclipse.jface.viewers.ISelectionChangedListener;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.jface.viewers.LabelProvider;
import org.eclipse.jface.viewers.ListViewer;
import org.eclipse.jface.viewers.SelectionChangedEvent;
import org.eclipse.jface.viewers.Viewer;
import org.eclipse.jface.viewers.ViewerComparator;
import org.eclipse.jface.window.Window;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.FocusAdapter;
import org.eclipse.swt.events.FocusEvent;
import org.eclipse.swt.events.ModifyEvent;
import org.eclipse.swt.events.ModifyListener;
import org.eclipse.swt.events.VerifyEvent;
import org.eclipse.swt.events.VerifyListener;
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.Event;
import org.eclipse.swt.widgets.Group;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.List;
import org.eclipse.swt.widgets.Listener;
import org.eclipse.swt.widgets.Text;
import org.eclipse.team.core.TeamException;
import org.eclipse.ui.IWorkbench;
import org.eclipse.ui.IWorkbenchPreferencePage;
import org.eclipse.ui.PlatformUI;
import org.tigris.subversion.subclipse.core.util.Util;
import org.tigris.subversion.subclipse.ui.IHelpContextIds;
import org.tigris.subversion.subclipse.ui.ISVNUIConstants;
import org.tigris.subversion.subclipse.ui.Policy;
import org.tigris.subversion.subclipse.ui.SVNUIPlugin;

public class CommentTemplatesPreferencePage extends PreferencePage
        implements IWorkbenchPreferencePage, ISelectionChangedListener {

    private ListViewer viewer;
    private Button editButton;
    private Button removeButton;
    private Text preview;
    private Text commentsText;

    public static final int MAX_COMMENTS_TO_SAVE = 100;

    protected Control createContents(Composite ancestor) {
        Composite parent = new Composite(ancestor, SWT.NONE);
        GridLayout layout = new GridLayout();
        layout.marginWidth = 0;
        layout.marginHeight = 0;
        layout.numColumns = 1;
        parent.setLayout(layout);
        parent.setLayoutData(new GridData(GridData.FILL_BOTH));

        Composite templateGroup = createListAndButtons(parent);

        Group previewGroup = new Group(templateGroup, SWT.NONE);
        previewGroup.setText(Policy.bind("CommentTemplatesPreferencePage.Preview")); //$NON-NLS-1$
        GridLayout previewLayout = new GridLayout();
        previewLayout.marginWidth = 0;
        previewLayout.marginHeight = 0;
        previewGroup.setLayout(previewLayout);
        previewGroup.setLayoutData(new GridData(GridData.FILL_BOTH));

        preview = new Text(previewGroup, SWT.MULTI | SWT.READ_ONLY);
        GridData gd = new GridData(GridData.FILL_HORIZONTAL);
        gd.heightHint = convertHeightInCharsToPixels(5);
        preview.setLayoutData(gd);

        Composite commentsGroup = new Composite(parent, SWT.NONE);
        GridLayout commentsLayout = new GridLayout();
        commentsLayout.marginWidth = 0;
        commentsLayout.marginHeight = 0;
        commentsLayout.numColumns = 3;
        commentsGroup.setLayout(commentsLayout);
        commentsGroup.setLayoutData(new GridData());

        Label commentsLabel = new Label(commentsGroup, SWT.NONE);
        commentsLabel.setText(Policy.bind("CommentTemplatesPreferencePage.0")); //$NON-NLS-1$

        commentsText = new Text(commentsGroup, SWT.BORDER);
        gd = new GridData();
        gd.widthHint = 50;
        commentsText.setLayoutData(gd);
        commentsText.setText(Integer.toString(
                SVNUIPlugin.getPlugin().getPreferenceStore().getInt(ISVNUIConstants.PREF_COMMENTS_TO_SAVE)));

        commentsText.addFocusListener(new FocusAdapter() {
            public void focusGained(FocusEvent e) {
                ((Text) e.getSource()).selectAll();
            }
        });
        commentsText.addVerifyListener(new VerifyListener() {
            public void verifyText(VerifyEvent e) {
                String text = e.text;
                for (int i = 0; i < text.length(); i++) {
                    if ("0123456789".indexOf(text.substring(i, i + 1)) == -1) { //$NON-NLS-1$
                        e.doit = false;
                        break;
                    }
                }
            }
        });
        commentsText.addModifyListener(new ModifyListener() {
            public void modifyText(ModifyEvent e) {
                if (getCommentsToSave() > MAX_COMMENTS_TO_SAVE) {
                    setValid(false);
                    setErrorMessage(
                            Policy.bind("CommentTemplatesPreferencePage.1") + " " + MAX_COMMENTS_TO_SAVE + "."); //$NON-NLS-1$
                } else {
                    setValid(true);
                    setErrorMessage(null);
                }
            }
        });

        Label rangeLabel = new Label(commentsGroup, SWT.NONE);
        rangeLabel.setText("(0-" + MAX_COMMENTS_TO_SAVE + ")");

        PlatformUI.getWorkbench().getHelpSystem().setHelp(getControl(),
                IHelpContextIds.COMMENT_TEMPLATE_PREFERENCE_PAGE);
        Dialog.applyDialogFont(ancestor);

        return parent;
    }

    private Composite createListAndButtons(Composite parent) {
        Group templateGroup = new Group(parent, SWT.NONE);
        templateGroup.setText(Policy.bind("CommentTemplatesPreferencePage.2")); //$NON-NLS-1$
        GridLayout templateLayout = new GridLayout();
        templateLayout.marginWidth = 0;
        templateLayout.marginHeight = 0;
        templateGroup.setLayout(templateLayout);
        templateGroup.setLayoutData(new GridData(GridData.FILL_BOTH));

        Composite listAndButtons = new Composite(templateGroup, SWT.NONE);
        GridLayout layout = new GridLayout();
        layout.marginWidth = 0;
        layout.marginHeight = 0;
        layout.numColumns = 2;
        listAndButtons.setLayout(layout);
        listAndButtons.setLayoutData(new GridData(GridData.FILL_BOTH));

        viewer = new ListViewer(listAndButtons);
        viewer.setLabelProvider(new LabelProvider() {
            public String getText(Object element) {
                String template = (String) element;
                return Util.flattenText(template);
            }
        });
        viewer.addSelectionChangedListener(this);
        viewer.setComparator(new ViewerComparator() {
            public int compare(Viewer viewer, Object e1, Object e2) {
                String template1 = Util.flattenText((String) e1);
                String template2 = Util.flattenText((String) e2);
                return template1.compareToIgnoreCase(template2);
            }
        });
        viewer.addDoubleClickListener(new IDoubleClickListener() {
            public void doubleClick(DoubleClickEvent event) {
                editTemplate();
            }
        });
        List list = viewer.getList();
        list.setLayoutData(new GridData(GridData.FILL_BOTH));

        // populate list
        String[] templates = SVNUIPlugin.getPlugin().getRepositoryManager().getCommentsManager()
                .getCommentTemplates();
        for (int i = 0; i < templates.length; i++) {
            viewer.add(templates[i]);
        }

        createButtons(listAndButtons);
        return templateGroup;
    }

    private void createButtons(Composite parent) {
        Composite buttons = new Composite(parent, SWT.NONE);
        buttons.setLayoutData(new GridData(GridData.VERTICAL_ALIGN_BEGINNING));
        GridLayout layout = new GridLayout();
        layout.marginHeight = 0;
        layout.marginWidth = 0;
        buttons.setLayout(layout);

        Button newButton = new Button(buttons, SWT.PUSH);
        newButton.setText(Policy.bind("CommentTemplatesPreferencePage.New")); //$NON-NLS-1$
        GridData data = new GridData();
        data.horizontalAlignment = GridData.FILL;
        int widthHint = convertHorizontalDLUsToPixels(IDialogConstants.BUTTON_WIDTH);
        data.widthHint = Math.max(widthHint, newButton.computeSize(SWT.DEFAULT, SWT.DEFAULT, true).x);
        newButton.setLayoutData(data);
        newButton.setEnabled(true);
        newButton.addListener(SWT.Selection, new Listener() {
            public void handleEvent(Event event) {
                newTemplate();
            }
        });

        editButton = new Button(buttons, SWT.PUSH);
        editButton.setText(Policy.bind("CommentTemplatesPreferencePage.Edit")); //$NON-NLS-1$

        data = new GridData();
        data.horizontalAlignment = GridData.FILL;
        widthHint = convertHorizontalDLUsToPixels(IDialogConstants.BUTTON_WIDTH);
        data.widthHint = Math.max(widthHint, editButton.computeSize(SWT.DEFAULT, SWT.DEFAULT, true).x);
        editButton.setLayoutData(data);
        editButton.setEnabled(false);
        editButton.addListener(SWT.Selection, new Listener() {
            public void handleEvent(Event e) {
                editTemplate();
            }
        });

        removeButton = new Button(buttons, SWT.PUSH);
        removeButton.setText(Policy.bind("CommentTemplatesPreferencePage.Remove")); //$NON-NLS-1$
        data = new GridData();
        data.horizontalAlignment = GridData.FILL;
        widthHint = convertHorizontalDLUsToPixels(IDialogConstants.BUTTON_WIDTH);
        data.widthHint = Math.max(widthHint, removeButton.computeSize(SWT.DEFAULT, SWT.DEFAULT, true).x);
        removeButton.setLayoutData(data);
        removeButton.setEnabled(false);
        removeButton.addListener(SWT.Selection, new Listener() {
            public void handleEvent(Event e) {
                remove();
            }
        });
    }

    public void init(IWorkbench workbench) {
    }

    public void selectionChanged(SelectionChangedEvent event) {
        IStructuredSelection selection = (IStructuredSelection) event.getSelection();
        switch (selection.size()) {
        case 0:
            editButton.setEnabled(false);
            removeButton.setEnabled(false);
            preview.setText(""); //$NON-NLS-1$
            break;

        case 1:
            editButton.setEnabled(true);
            removeButton.setEnabled(true);
            preview.setText((String) selection.getFirstElement());
            break;

        default:
            editButton.setEnabled(false);
            removeButton.setEnabled(true);
            preview.setText(""); //$NON-NLS-1$
            break;
        }
    }

    void newTemplate() {
        CommentTemplateEditDialog dialog = new CommentTemplateEditDialog(getShell(),
                Policy.bind("CommentTemplatesPreferencePage.EditCommentTemplateTitle"), //$NON-NLS-1$
                Policy.bind("CommentTemplatesPreferencePage.EditCommentTemplateMessage"), //$NON-NLS-1$
                "", null); //$NON-NLS-1$
        if (dialog.open() == Window.OK) {
            viewer.add(dialog.getValue());
        }
    }

    void editTemplate() {
        IStructuredSelection selection = (IStructuredSelection) viewer.getSelection();
        if (selection.size() == 1) {
            String oldTemplate = (String) selection.getFirstElement();
            CommentTemplateEditDialog dialog = new CommentTemplateEditDialog(getShell(),
                    Policy.bind("CommentTemplatesPreferencePage.EditCommentTemplateTitle"), //$NON-NLS-1$
                    Policy.bind("CommentTemplatesPreferencePage.EditCommentTemplateMessage"), //$NON-NLS-1$
                    oldTemplate, null);
            if (dialog.open() == Window.OK) {
                viewer.remove(oldTemplate);
                viewer.add(dialog.getValue());
            }
        }
    }

    void remove() {
        IStructuredSelection selection = (IStructuredSelection) viewer.getSelection();
        viewer.remove(selection.toArray());
    }

    public boolean performOk() {
        int numTemplates = viewer.getList().getItemCount();
        String[] templates = new String[numTemplates];
        for (int i = 0; i < numTemplates; i++) {
            templates[i] = (String) viewer.getElementAt(i);
        }
        try {
            SVNUIPlugin.getPlugin().getRepositoryManager().getCommentsManager()
                    .replaceAndSaveCommentTemplates(templates);
        } catch (TeamException e) {
            SVNUIPlugin.openError(getShell(), null, null, e, SVNUIPlugin.LOG_OTHER_EXCEPTIONS);
        }

        SVNUIPlugin.getPlugin().getPreferenceStore().setValue(ISVNUIConstants.PREF_COMMENTS_TO_SAVE,
                getCommentsToSave());

        return super.performOk();
    }

    private int getCommentsToSave() {
        int commentsToRemember;
        if (commentsText.getText().trim().length() == 0) {
            commentsToRemember = 0;
        } else {
            commentsToRemember = Integer.parseInt(commentsText.getText());
        }
        return commentsToRemember;
    }
}