net.sf.wickedshell.ui.preferences.WickedShellStaticCompletionsPreferencePage.java Source code

Java tutorial

Introduction

Here is the source code for net.sf.wickedshell.ui.preferences.WickedShellStaticCompletionsPreferencePage.java

Source

/*
 * WickedShellPreferencePage.java
 * 
 * Copyright 2005-2006 Stefan Reichert.
 * All Rights Reserved.
 * 
 * This software is the proprietary information of Stefan Reichert.
 * Use is subject to license terms.
 * 
 */
package net.sf.wickedshell.ui.preferences;

import java.io.File;
import java.io.IOException;
import java.util.Arrays;
import java.util.List;

import net.sf.wickedshell.ShellPlugin;
import net.sf.wickedshell.action.shell.ExportShellOutputAction;
import net.sf.wickedshell.domain.DomainPlugin;
import net.sf.wickedshell.domain.completion.ICompletion;
import net.sf.wickedshell.domain.completion.ICompletion.Completion;
import net.sf.wickedshell.util.MessageDialogHandler;
import net.sf.wickedshell.util.ResourceManager;
import net.sf.wickedshell.util.ShellLogger;

import org.eclipse.jface.dialogs.Dialog;
import org.eclipse.jface.dialogs.IDialogConstants;
import org.eclipse.jface.preference.IPreferenceStore;
import org.eclipse.jface.preference.PreferencePage;
import org.eclipse.jface.viewers.ArrayContentProvider;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.jface.viewers.LabelProvider;
import org.eclipse.jface.viewers.TableViewer;
import org.eclipse.jface.viewers.Viewer;
import org.eclipse.jface.viewers.ViewerSorter;
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.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.FileDialog;
import org.eclipse.swt.widgets.Group;
import org.eclipse.swt.widgets.Table;
import org.eclipse.swt.widgets.TableColumn;
import org.eclipse.ui.IWorkbench;
import org.eclipse.ui.IWorkbenchPreferencePage;
import org.eclipse.ui.dialogs.ListSelectionDialog;

/**
 * @author Stefan Reichert
 * @since 24.03.2006
 */
public class WickedShellStaticCompletionsPreferencePage extends PreferencePage implements IWorkbenchPreferencePage {

    /** The <code>Reader</code> of the shell. */
    private final ShellLogger shellLogger = new ShellLogger(ExportShellOutputAction.class);

    /** The <code>TableViewer</code> showing the static completions. */
    private TableViewer tableViewerStaticCompletions;

    /**
     * @see org.eclipse.jface.preference.PreferencePage#createContents(org.eclipse.swt.widgets.Composite)
     */
    public Control createContents(Composite parent) {
        Composite container = new Composite(parent, SWT.NULL);
        final GridLayout gridLayoutContainer = new GridLayout();
        gridLayoutContainer.marginWidth = 2;
        gridLayoutContainer.horizontalSpacing = 2;
        gridLayoutContainer.marginHeight = 2;
        container.setLayout(gridLayoutContainer);

        final Group groupStaticCompletions = new Group(container, SWT.NONE);
        groupStaticCompletions.setText("Static completions");
        groupStaticCompletions.setLayoutData(new GridData(GridData.FILL, GridData.FILL, true, true));
        final GridLayout gridLayoutGroupStaticCompletions = new GridLayout();
        gridLayoutGroupStaticCompletions.numColumns = 2;
        groupStaticCompletions.setLayout(gridLayoutGroupStaticCompletions);

        tableViewerStaticCompletions = new TableViewer(groupStaticCompletions,
                SWT.MULTI | SWT.FULL_SELECTION | SWT.BORDER);
        tableViewerStaticCompletions.setContentProvider(new ArrayContentProvider());
        tableViewerStaticCompletions.setLabelProvider(new CompletionTableLabelProvider());
        tableViewerStaticCompletions.setSorter(new ViewerSorter() {
            /**
             * @see org.eclipse.jface.viewers.ViewerSorter#compare(org.eclipse.jface.viewers.Viewer,
             *      java.lang.Object, java.lang.Object)
             */
            public int compare(Viewer viewer, Object objectOne, Object objectTwo) {
                ICompletion completionOne = (ICompletion) objectOne;
                ICompletion completionTwo = (ICompletion) objectTwo;
                return super.compare(viewer, completionOne.getContent(), completionTwo.getContent());
            }
        });

        final Table tableStaticCompletions = tableViewerStaticCompletions.getTable();
        tableStaticCompletions.setLinesVisible(true);
        tableStaticCompletions.setHeaderVisible(true);
        final GridData gridDataTableStaticCompletions = new GridData(SWT.FILL, SWT.FILL, true, false, 1, 6);
        gridDataTableStaticCompletions.heightHint = 250;
        tableStaticCompletions.setLayoutData(gridDataTableStaticCompletions);

        final TableColumn completionTableColumn = new TableColumn(tableStaticCompletions, SWT.NONE);
        completionTableColumn.setWidth(150);
        completionTableColumn.setText("Completion");

        final TableColumn descriptionTableColumn = new TableColumn(tableStaticCompletions, SWT.NONE);
        descriptionTableColumn.setWidth(250);
        descriptionTableColumn.setText("Description");

        final Button buttonAdd = new Button(groupStaticCompletions, SWT.NONE);
        final GridData gridDataButtonAdd = new GridData(GridData.FILL, GridData.CENTER, false, false);
        gridDataButtonAdd.horizontalIndent = 10;
        buttonAdd.setLayoutData(gridDataButtonAdd);
        buttonAdd.setText("Add completion");
        buttonAdd.addSelectionListener(new SelectionAdapter() {
            /**
             * @see org.eclipse.swt.events.SelectionListener#widgetSelected(org.eclipse.swt.events.SelectionEvent)
             */
            @SuppressWarnings("unchecked")
            public void widgetSelected(SelectionEvent event) {
                StaticCompletionDialog dialog = new StaticCompletionDialog(getShell());
                if (dialog.open() == IDialogConstants.OK_ID) {
                    StringBuffer descriptionBuffer = new StringBuffer();
                    descriptionBuffer.append(dialog.getCompletion());
                    descriptionBuffer.append(" - ");
                    descriptionBuffer.append(dialog.getComment());
                    descriptionBuffer.append(" (Static)");

                    List staticCompletions = DomainPlugin.getDefault().getStaticCompletions();
                    staticCompletions.add(ICompletion.Factory.newInstance(dialog.getCompletion(),
                            descriptionBuffer.toString(), new String()));
                    tableViewerStaticCompletions.setInput(staticCompletions);
                }
            };
        });

        final Button buttonEdit = new Button(groupStaticCompletions, SWT.NONE);
        final GridData gridDataButtonEdit = new GridData(GridData.FILL, GridData.CENTER, false, false);
        gridDataButtonEdit.horizontalIndent = 10;
        buttonEdit.setLayoutData(gridDataButtonAdd);
        buttonEdit.setText("Edit completion");
        buttonEdit.addSelectionListener(new SelectionAdapter() {
            /**
             * @see org.eclipse.swt.events.SelectionListener#widgetSelected(org.eclipse.swt.events.SelectionEvent)
             */
            @SuppressWarnings("unchecked")
            public void widgetSelected(SelectionEvent event) {
                if (!tableViewerStaticCompletions.getSelection().isEmpty()) {
                    IStructuredSelection selection = (IStructuredSelection) tableViewerStaticCompletions
                            .getSelection();
                    Completion completion = (Completion) selection.getFirstElement();
                    StaticCompletionDialog dialog = new StaticCompletionDialog(getShell(), completion.getLabel(),
                            completion.getContent());
                    if (dialog.open() == IDialogConstants.OK_ID) {
                        List staticCompletions = DomainPlugin.getDefault().getStaticCompletions();
                        staticCompletions.remove(completion);
                        staticCompletions.add(ICompletion.Factory.newInstance(dialog.getCompletion(),
                                dialog.getComment(), new String()));
                        tableViewerStaticCompletions.setInput(staticCompletions);
                    }

                }
            };
        });

        final Button buttonRemove = new Button(groupStaticCompletions, SWT.NONE);
        final GridData gridDataButtonRemove = new GridData(GridData.FILL, GridData.CENTER, false, false);
        gridDataButtonRemove.horizontalIndent = 10;
        buttonRemove.setLayoutData(gridDataButtonRemove);
        buttonRemove.setText("Remove completion");
        buttonRemove.addSelectionListener(new SelectionAdapter() {
            /**
             * @see org.eclipse.swt.events.SelectionListener#widgetSelected(org.eclipse.swt.events.SelectionEvent)
             */
            @SuppressWarnings("unchecked")
            public void widgetSelected(SelectionEvent event) {
                if (!tableViewerStaticCompletions.getSelection().isEmpty()) {
                    IStructuredSelection selection = (IStructuredSelection) tableViewerStaticCompletions
                            .getSelection();
                    List staticCompletions = DomainPlugin.getDefault().getStaticCompletions();
                    staticCompletions.removeAll(selection.toList());
                    tableViewerStaticCompletions.setInput(staticCompletions);
                }
            };
        });
        // Set the viewer's input
        tableViewerStaticCompletions.setInput(DomainPlugin.getDefault().getStaticCompletions());

        final Button buttonExport = new Button(groupStaticCompletions, SWT.NONE);
        final GridData gridDataButtonExport = new GridData(SWT.FILL, SWT.CENTER, false, false);
        gridDataButtonExport.verticalIndent = 10;
        gridDataButtonExport.horizontalIndent = 10;
        buttonExport.setLayoutData(gridDataButtonExport);
        buttonExport.setText("Export completions");
        buttonExport.addSelectionListener(new SelectionAdapter() {
            /**
             * @see org.eclipse.swt.events.SelectionAdapter#widgetSelected(org.eclipse.swt.events.SelectionEvent)
             */
            public void widgetSelected(SelectionEvent event) {
                FileDialog fileDialog = new FileDialog(getShell());
                fileDialog.setText("Export Static Completions");
                fileDialog.setFilterExtensions(new String[] { "*.completions" });
                fileDialog.setFilterNames(new String[] { "Completion files (*.completions)" });
                fileDialog.setFileName("static.completions");
                String staticCompletionsFileName = fileDialog.open();
                if (staticCompletionsFileName != null) {
                    File staticCompletionsFile = new File(staticCompletionsFileName);
                    if (staticCompletionsFile.exists()) {
                        if (MessageDialogHandler.openConfirmationMessage(getShell(),
                                "The file \"" + staticCompletionsFileName
                                        + "\" already exists and will be overwritten. Do you want to proceed ?")) {
                            staticCompletionsFile.delete();
                        } else {
                            return;
                        }
                    }
                    try {
                        staticCompletionsFile.createNewFile();
                        DomainPlugin.getDefault().writeCompletionsToFile(
                                DomainPlugin.getDefault().getStaticCompletions(), staticCompletionsFile);

                    } catch (IOException exception) {
                        shellLogger.error(exception.getMessage(), exception);
                    }
                }
            }
        });

        final Button buttonImport = new Button(groupStaticCompletions, SWT.NONE);
        final GridData gridDataButtonImport = new GridData(GridData.FILL, GridData.CENTER, false, false);
        gridDataButtonImport.horizontalIndent = 10;
        buttonImport.setLayoutData(gridDataButtonImport);
        buttonImport.setText("Import completions");
        buttonImport.addSelectionListener(new SelectionAdapter() {
            /**
             * @see org.eclipse.swt.events.SelectionAdapter#widgetSelected(org.eclipse.swt.events.SelectionEvent)
             */
            @SuppressWarnings("unchecked")
            public void widgetSelected(SelectionEvent event) {
                FileDialog fileDialog = new FileDialog(getShell());
                fileDialog.setText("Import Static Completions");
                fileDialog.setFilterExtensions(new String[] { "*.completions" });
                fileDialog.setFilterNames(new String[] { "Completion files (*.completions)" });
                fileDialog.setFileName("static.completions");
                String staticCompletionsFileName = fileDialog.open();
                if (staticCompletionsFileName != null) {
                    File staticCompletionsFile = new File(staticCompletionsFileName);
                    try {
                        List completions = DomainPlugin.getDefault().readCompletionsFromFile(staticCompletionsFile);
                        List staticCompletions = DomainPlugin.getDefault().getStaticCompletions();
                        if (completions.removeAll(staticCompletions)) {
                            if (completions.isEmpty()) {
                                MessageDialogHandler.openWarningMessage(getShell(),
                                        "All entries found are already listed and will be ignored!");
                                return;
                            }
                            MessageDialogHandler.openWarningMessage(getShell(),
                                    "Duplicate entries have been found and will be ignored!");
                        }
                        ListSelectionDialog listSelectionDialog = new ListSelectionDialog(getShell(), completions,
                                new ArrayContentProvider(), new LabelProvider() {

                                    /**
                                     * @see org.eclipse.jface.viewers.LabelProvider#getText(java.lang.Object)
                                     */
                                    public String getText(Object element) {
                                        if (element instanceof ICompletion) {
                                            ICompletion completion = (ICompletion) element;
                                            return completion.getLabel();
                                        }
                                        return super.getText(element);
                                    }

                                    /**
                                     * @see org.eclipse.jface.viewers.LabelProvider#getImage(java.lang.Object)
                                     */
                                    public Image getImage(Object element) {
                                        if (element instanceof ICompletion) {
                                            ICompletion completion = (ICompletion) element;
                                            if (completion.getImagePath() != null
                                                    && completion.getImagePath().length() > 1) {
                                                return ResourceManager.getPluginImage(ShellPlugin.getDefault(),
                                                        completion.getImagePath());
                                            }
                                            return ResourceManager.getPluginImage(ShellPlugin.getDefault(),
                                                    "img/staticCompletion.gif");
                                        }
                                        return super.getImage(element);
                                    }
                                }, "Please choose from the completions found.");
                        listSelectionDialog.setTitle("Import Static Completions");
                        listSelectionDialog.setHelpAvailable(false);
                        if (listSelectionDialog.open() == Dialog.OK) {
                            staticCompletions.addAll(Arrays.asList(listSelectionDialog.getResult()));
                            tableViewerStaticCompletions.setInput(staticCompletions);
                        }

                    } catch (IOException exception) {
                        shellLogger.error(exception.getMessage(), exception);
                    }
                }
            }
        });
        return container;
    }

    /**
     * @see org.eclipse.ui.IWorkbenchPreferencePage#init(org.eclipse.ui.IWorkbench)
     */
    public void init(IWorkbench workbench) {
    }

    /**
     * @see org.eclipse.jface.preference.PreferencePage#doGetPreferenceStore()
     */
    protected IPreferenceStore doGetPreferenceStore() {
        return ShellPlugin.getDefault().getPreferenceStore();
    }

    /**
     * @see org.eclipse.jface.preference.IPreferencePage#performOk()
     */
    public boolean performOk() {
        return super.performOk();
    }

    /**
     * @see org.eclipse.jface.preference.PreferencePage#performDefaults()
     */
    protected void performDefaults() {
        DomainPlugin.getDefault().resetCompletions();
        tableViewerStaticCompletions.setInput(DomainPlugin.getDefault().getStaticCompletions());

        super.performDefaults();
    }
}