org.eclipse.jubula.client.ui.preferences.DatabaseConnectionPreferencePage.java Source code

Java tutorial

Introduction

Here is the source code for org.eclipse.jubula.client.ui.preferences.DatabaseConnectionPreferencePage.java

Source

/*******************************************************************************
 * Copyright (c) 2004, 2010 BREDEX GmbH.
 * 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:
 *     BREDEX GmbH - initial API and implementation and/or initial documentation
 *******************************************************************************/
package org.eclipse.jubula.client.ui.preferences;

import java.lang.reflect.InvocationTargetException;
import java.util.List;

import org.eclipse.core.databinding.beans.BeanProperties;
import org.eclipse.core.databinding.observable.list.IObservableList;
import org.eclipse.core.databinding.observable.list.WritableList;
import org.eclipse.core.runtime.preferences.InstanceScope;
import org.eclipse.jface.databinding.viewers.ViewerSupport;
import org.eclipse.jface.dialogs.IDialogConstants;
import org.eclipse.jface.dialogs.IDialogLabelKeys;
import org.eclipse.jface.layout.GridDataFactory;
import org.eclipse.jface.layout.GridLayoutFactory;
import org.eclipse.jface.preference.IPreferenceStore;
import org.eclipse.jface.preference.PreferencePage;
import org.eclipse.jface.resource.JFaceResources;
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.ListViewer;
import org.eclipse.jface.viewers.SelectionChangedEvent;
import org.eclipse.jface.window.Window;
import org.eclipse.jface.wizard.WizardDialog;
import org.eclipse.jubula.client.core.Activator;
import org.eclipse.jubula.client.core.preferences.database.DatabaseConnection;
import org.eclipse.jubula.client.core.preferences.database.DatabaseConnectionConverter;
import org.eclipse.jubula.client.ui.dialogs.DatabaseConnectionDialog;
import org.eclipse.jubula.client.ui.i18n.Messages;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
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.Event;
import org.eclipse.swt.widgets.Listener;
import org.eclipse.swt.widgets.Text;
import org.eclipse.ui.IWorkbench;
import org.eclipse.ui.IWorkbenchPreferencePage;
import org.eclipse.ui.preferences.ScopedPreferenceStore;

/**
 * Preference page for configuring Database Connections.
 * 
 * @author BREDEX GmbH
 * @created 10.01.2011
 */
public class DatabaseConnectionPreferencePage extends PreferencePage implements IWorkbenchPreferencePage {

    /** 
     * pre-configured factory for creating grid data for the buttons on the 
     * side of the database list 
     */
    private static final GridDataFactory BUTTON_DATA_FACTORY = GridDataFactory.fillDefaults().align(SWT.FILL,
            SWT.BEGINNING);

    /** 
     * global listener to select/deselect text in text fields during widget 
     * traversal 
     */
    private static final Listener SELECT_ALL_LISTENER = new Listener() {
        private boolean m_isTraversing = false;

        public void handleEvent(Event event) {
            switch (event.type) {
            case SWT.FocusIn:
                if (m_isTraversing) {
                    m_isTraversing = false;
                    if (event.widget instanceof Text) {
                        ((Text) event.widget).selectAll();
                    }
                }
                break;
            case SWT.FocusOut:
                if (event.widget instanceof Text) {
                    ((Text) event.widget).clearSelection();
                }
                break;
            case SWT.Traverse:
                if (event.doit) {
                    m_isTraversing = true;
                }
                break;

            default:
                break;
            }
        }
    };

    /** list of managed connections */
    private IObservableList m_connectionList;

    /**
     * 
     * {@inheritDoc}
     */
    public void init(IWorkbench workbench) {
        setPreferenceStore(new ScopedPreferenceStore(InstanceScope.INSTANCE, Activator.PLUGIN_ID));
    }

    @Override
    protected Control createContents(Composite parent) {
        Composite composite = new Composite(parent, SWT.NONE);
        GridDataFactory.fillDefaults().grab(true, true).applyTo(composite);
        GridLayoutFactory.fillDefaults().numColumns(2).applyTo(composite);

        m_connectionList = new WritableList(parsePreferences(getPreferenceStore()), DatabaseConnection.class);
        final ListViewer connectionViewer = new ListViewer(composite);
        Control listControl = connectionViewer.getControl();
        GridDataFactory.fillDefaults().grab(true, true).span(1, 3).hint(SWT.DEFAULT, SWT.DEFAULT)
                .applyTo(listControl);
        ViewerSupport.bind(connectionViewer, m_connectionList,
                BeanProperties.value(DatabaseConnection.PROP_NAME_NAME));

        createAddButton(composite, m_connectionList);

        createRemoveButton(composite, m_connectionList, connectionViewer);

        createEditButton(composite, connectionViewer);

        return composite;
    }

    /**
     * 
     * @param parent The parent composite.
     * @param connectionViewer The viewer containing the elements affected by 
     *                         pressing the created button.
     */
    private void createEditButton(Composite parent, final ListViewer connectionViewer) {

        final IDoubleClickListener editListener = new IDoubleClickListener() {
            public void doubleClick(DoubleClickEvent event) {
                Object selectedObj = ((IStructuredSelection) event.getSelection()).getFirstElement();
                if (selectedObj instanceof DatabaseConnection) {
                    DatabaseConnection selectedConn = (DatabaseConnection) selectedObj;

                    try {
                        DatabaseConnectionDialog databaseConnectionWizard = new DatabaseConnectionDialog(
                                new DatabaseConnection(selectedConn));

                        if (showDialog(databaseConnectionWizard,
                                event.getViewer().getControl().getDisplay()) == Window.OK) {
                            DatabaseConnection modifiedConn = databaseConnectionWizard.getEditedConnection();
                            selectedConn.setName(modifiedConn.getName());
                            selectedConn.setConnectionInfo(modifiedConn.getConnectionInfo());
                        }
                    } catch (IllegalAccessException e) {
                        throw new RuntimeException(e);
                    } catch (InstantiationException e) {
                        throw new RuntimeException(e);
                    } catch (InvocationTargetException e) {
                        throw new RuntimeException(e);
                    } catch (NoSuchMethodException e) {
                        throw new RuntimeException(e);
                    }
                } else if (selectedObj != null) {
                    throw new RuntimeException(Messages.DatabaseConnectionPrefPageSelecObjIsOfIncorrectType);
                }
            }
        };

        connectionViewer.addDoubleClickListener(editListener);

        final Button editButton = new Button(parent, SWT.NONE);
        BUTTON_DATA_FACTORY.applyTo(editButton);
        editButton.setEnabled(false);
        connectionViewer.addSelectionChangedListener(new ISelectionChangedListener() {
            public void selectionChanged(SelectionChangedEvent event) {
                IStructuredSelection sel = (IStructuredSelection) event.getSelection();
                editButton.setEnabled(sel.size() == 1);
            }
        });
        editButton.setText(Messages.DatabaseConnectionPreferencePageEditButtonLabel);
        editButton.addSelectionListener(new SelectionAdapter() {
            @Override
            public void widgetSelected(SelectionEvent event) {
                editListener.doubleClick(new DoubleClickEvent(connectionViewer, connectionViewer.getSelection()));
            }

        });

    }

    /**
     * Displays a dialog for the given wizard.
     * 
     * @param databaseConnectionWizard The wizard to display in the dialog.
     * @param display Used for registering/deregistering global listeners.
     * @return the result of {@link Window#open()}.
     */
    private static int showDialog(DatabaseConnectionDialog databaseConnectionWizard, Display display) {
        WizardDialog dialog = new WizardDialog(display.getActiveShell(), databaseConnectionWizard) {
            protected void createButtonsForButtonBar(Composite parent) {
                super.createButtonsForButtonBar(parent);
                Button finishButton = getButton(IDialogConstants.FINISH_ID);
                finishButton.setText(JFaceResources.getString(IDialogLabelKeys.OK_LABEL_KEY));
            }
        };
        databaseConnectionWizard.setWindowTitle(Messages.DatabaseConnectionDialogTitle);
        dialog.setHelpAvailable(true);

        display.addFilter(SWT.FocusIn, SELECT_ALL_LISTENER);
        display.addFilter(SWT.FocusOut, SELECT_ALL_LISTENER);
        display.addFilter(SWT.Traverse, SELECT_ALL_LISTENER);

        try {
            return dialog.open();
        } finally {
            display.removeFilter(SWT.FocusIn, SELECT_ALL_LISTENER);
            display.removeFilter(SWT.FocusOut, SELECT_ALL_LISTENER);
            display.removeFilter(SWT.Traverse, SELECT_ALL_LISTENER);
        }
    }

    /**
     * 
     * @param parent The parent composite.
     * @param existingConnections List of connections contained in the viewer.
     * @param connectionViewer The viewer containing the elements affected by 
     *                         pressing the created button.
     */
    private void createRemoveButton(Composite parent, final IObservableList existingConnections,
            final ListViewer connectionViewer) {
        final Button removeButton = new Button(parent, SWT.NONE);
        BUTTON_DATA_FACTORY.applyTo(removeButton);
        removeButton.setEnabled(false);
        connectionViewer.addSelectionChangedListener(new ISelectionChangedListener() {
            public void selectionChanged(SelectionChangedEvent event) {
                removeButton.setEnabled(!event.getSelection().isEmpty());
            }
        });
        removeButton.setText(Messages.DatabaseConnectionPreferencePageRemoveButtonLabel);
        removeButton.addSelectionListener(new SelectionAdapter() {
            @Override
            public void widgetSelected(SelectionEvent e) {
                existingConnections.removeAll(((IStructuredSelection) connectionViewer.getSelection()).toList());
            }
        });
    }

    /**
     * 
     * @param parent The parent composite.
     * @param existingConnections List of connections contained in the viewer.
     */
    private void createAddButton(Composite parent, final IObservableList existingConnections) {
        Button addButton = new Button(parent, SWT.NONE);
        BUTTON_DATA_FACTORY.applyTo(addButton);
        addButton.setText(Messages.DatabaseConnectionPreferencePageAddButtonLabel);
        addButton.addSelectionListener(new SelectionAdapter() {
            @Override
            public void widgetSelected(SelectionEvent event) {
                DatabaseConnectionDialog databaseConnectionWizard = new DatabaseConnectionDialog();

                if (showDialog(databaseConnectionWizard, event.display) == Window.OK) {
                    existingConnections.add(databaseConnectionWizard.getEditedConnection());
                }
            }
        });
    }

    @Override
    public boolean performOk() {
        getPreferenceStore().setValue(DatabaseConnectionConverter.PREF_DATABASE_CONNECTIONS,
                DatabaseConnectionConverter.convert((DatabaseConnection[]) m_connectionList
                        .toArray(new DatabaseConnection[m_connectionList.size()])));
        return super.performOk();
    }

    @Override
    protected void performDefaults() {
        getPreferenceStore().setToDefault(DatabaseConnectionConverter.PREF_DATABASE_CONNECTIONS);
        m_connectionList.clear();
        m_connectionList.addAll(parsePreferences(getPreferenceStore()));
        super.performDefaults();
    }

    /**
     * Parses the configured database connections from the information 
     * contained in the given preference store.
     * 
     * @param prefStore The preference store that contains the database 
     *                  connection information.
     * @return the list of configured database connections found in the given
     *         preference store.
     */
    private static List<DatabaseConnection> parsePreferences(IPreferenceStore prefStore) {

        return DatabaseConnectionConverter
                .convert(prefStore.getString(DatabaseConnectionConverter.PREF_DATABASE_CONNECTIONS));
    }

}