org.eclipse.datatools.connectivity.internal.ui.DriverListCombo.java Source code

Java tutorial

Introduction

Here is the source code for org.eclipse.datatools.connectivity.internal.ui.DriverListCombo.java

Source

/*******************************************************************************
 * Copyright (c) 2004, 2010 Sybase, Inc. and others
 * 
 * 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: brianf - initial API and implementation
 *         IBM Corporation - defect fix #213266
 ******************************************************************************/
package org.eclipse.datatools.connectivity.internal.ui;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.Comparator;
import java.util.Iterator;
import java.util.List;
import java.util.Properties;

import javax.swing.event.ChangeEvent;
import javax.swing.event.ChangeListener;

import org.eclipse.core.runtime.ListenerList;
import org.eclipse.datatools.connectivity.drivers.DriverInstance;
import org.eclipse.datatools.connectivity.drivers.DriverManager;
import org.eclipse.datatools.connectivity.drivers.DriverMgmtMessages;
import org.eclipse.datatools.connectivity.drivers.DriverValidator;
import org.eclipse.datatools.connectivity.drivers.IDriverMgmtConstants;
import org.eclipse.datatools.connectivity.drivers.IPropertySet;
import org.eclipse.datatools.connectivity.drivers.PropertySetImpl;
import org.eclipse.datatools.connectivity.drivers.models.CategoryDescriptor;
import org.eclipse.datatools.connectivity.drivers.models.TemplateDescriptor;
import org.eclipse.datatools.connectivity.internal.ui.dialogs.DriverDialog;
import org.eclipse.jface.resource.ImageDescriptor;
import org.eclipse.jface.viewers.DecorationOverlayIcon;
import org.eclipse.jface.viewers.IDecoration;
import org.eclipse.jface.window.Window;
import org.eclipse.swt.SWT;
import org.eclipse.swt.accessibility.AccessibleAdapter;
import org.eclipse.swt.accessibility.AccessibleEvent;
import org.eclipse.swt.events.ModifyEvent;
import org.eclipse.swt.events.ModifyListener;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.events.SelectionListener;
import org.eclipse.swt.graphics.Image;
import org.eclipse.swt.graphics.Point;
import org.eclipse.swt.graphics.Rectangle;
import org.eclipse.swt.layout.FillLayout;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Combo;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.Listener;
import org.eclipse.swt.widgets.Menu;
import org.eclipse.swt.widgets.MenuItem;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.swt.widgets.ToolBar;
import org.eclipse.swt.widgets.ToolItem;
import org.eclipse.ui.plugin.AbstractUIPlugin;

import com.ibm.icu.util.StringTokenizer;

/**
 * Composite that provides a drop-down list of available drivers as well as a
 * button to launch the Driver Management dialog to manage those drivers.
 * 
 * @author brianf
 */
public class DriverListCombo {

    // ui pieces
    private Composite mPanel;
    private Combo mComboList;
    private Label mLabel;
    private String mLabelText;
    private String mCategoryId;
    private String mErrorMessage;
    private String mInitialDriverName;
    private boolean mNullDriverValid = true;
    private String mFilter = null;
    private boolean isReadOnly = false;

    // show the label?
    private boolean mShowLabel = true;

    // change listeners
    private ListenerList changeListeners;

    private Image mDriverImage = null;
    private Image mDriverWithPlusImage = null;
    private Image mChangeImage = null;

    private static ImageDescriptor PLUS = null;

    private static ImageDescriptor ARROW = null;

    private static ImageDescriptor CHANGE = null;

    private Image mArrowImage = null;

    // show the new driver button?
    private boolean mShowNewDriverButton = true;
    private boolean mShowGenericDriverButton = false;
    private boolean mShowMenu = false;
    private boolean mShowEditButton = true;
    private ToolItem mTBButtonEdit;
    private ToolItem item1;
    private ToolItem item2;
    private ToolItem item3;

    /**
     * Constructor
     * 
     * @param parent
     * @param style
     */
    public DriverListCombo() {
        this(false);
    }

    public DriverListCombo(boolean isReadOnly) {
        this.changeListeners = new ListenerList();
        this.isReadOnly = isReadOnly;
    }

    /**
     * Return the error message back to the consumer.
     * 
     * @return
     */
    public String getErrorMessage() {
        return this.mErrorMessage;
    }

    /**
     * Set the initial driver name to be selected.
     * 
     * @param driverName
     */
    public void setInitialDriverName(String driverName) {
        this.mInitialDriverName = driverName;
    }

    /**
     * Return the initial driver name to be selected.
     * 
     * @return
     */
    public String getInitialDriverName() {
        return this.mInitialDriverName;
    }

    /**
     * Set the category to display in the drop-down.
     * 
     * @param category
     */
    public void setCategory(String category) {
        this.mCategoryId = category;
    }

    /**
     * Return the category.
     * 
     * @return
     */
    public String getCategory() {
        return this.mCategoryId;
    }

    public void setFilter(String filter) {
        this.mFilter = filter;
    }

    public String getFilter() {
        return this.mFilter;
    }

    /**
     * Indicate whether the default label should be shown or not.
     * 
     * @param flag
     */
    public void setShowLabel(boolean flag) {
        this.mShowLabel = flag;
    }

    public void setShowNewDriverButton(boolean flag) {
        this.mShowNewDriverButton = flag;
    }

    public void setShowGenericDriverButton(boolean flag) {
        this.mShowGenericDriverButton = flag;
    }

    public void setShowMenu(boolean flag) {
        this.mShowMenu = flag;
    }

    public void setShowEditButton(boolean flag) {
        this.mShowEditButton = flag;
    }

    /**
     * Indicate the state of the "show label" flag
     * 
     * @return
     */
    public boolean getShowLabel() {
        return this.mShowLabel;
    }

    /**
     * Change the text of the label
     * 
     * @param label
     */
    public void setLabelText(String label) {
        this.mLabelText = label;
    }

    /**
     * Return the text of the label
     * 
     * @return
     */
    public String getLabelText() {
        return this.mLabelText;
    }

    public boolean getNullDriverIsValid() {
        return this.mNullDriverValid;
    }

    public void setNullDriverIsValid(boolean flag) {
        this.mNullDriverValid = flag;
    }

    /**
     * Create the UI contents
     * 
     * @param parent
     */
    public void createContents(Composite parent) {
        makeImages();
        this.mPanel = new Composite(parent, SWT.NULL);

        GridData vdata = new GridData(GridData.FILL_HORIZONTAL);
        this.mPanel.setLayoutData(vdata);

        GridLayout gridLayout = new GridLayout();
        gridLayout.numColumns = 3;
        gridLayout.marginWidth = 0;
        gridLayout.marginHeight = 0;
        this.mPanel.setLayout(gridLayout);

        if (this.mShowLabel) {
            this.mLabel = new Label(this.mPanel, SWT.NONE);
            GridData ldata = new GridData(GridData.HORIZONTAL_ALIGN_FILL);
            ldata.horizontalSpan = 1;
            this.mLabel.setLayoutData(ldata);
            this.mLabel.setText(this.mLabelText);
        }

        this.mComboList = new Combo(this.mPanel, SWT.DROP_DOWN | SWT.BORDER | SWT.READ_ONLY);
        this.mComboList.setEnabled(!isReadOnly);
        GridData cdata = new GridData(GridData.FILL_HORIZONTAL | GridData.GRAB_HORIZONTAL);
        cdata.widthHint = 20;
        this.mComboList.setLayoutData(cdata);

        ComboSelectionListener listener = new ComboSelectionListener(this);

        this.mComboList.addModifyListener(listener);
        this.mComboList.addSelectionListener(listener);

        Composite tempComposite = new Composite(this.mPanel, SWT.NONE);
        tempComposite.setLayout(new FillLayout());

        if (mShowNewDriverButton) {
            final ToolBar toolBar = new ToolBar(tempComposite/*this.mPanel*/, SWT.FLAT);
            /*final ToolItem*/ item1 = new ToolItem(toolBar, SWT.PUSH);
            item1.setImage(mDriverWithPlusImage);
            item1.setToolTipText(DriverMgmtMessages.getString("DriverListCombo.button.newdriver")); //$NON-NLS-1$
            item1.addSelectionListener(new NewButtonSelectionChangedListener(this));
            item1.setEnabled(!isReadOnly);
            toolBar.getAccessible().addAccessibleListener(new AccessibleAdapter() {
                public void getName(AccessibleEvent e) {
                    e.result = DriverMgmtMessages.getString("DriverListCombo.button.newdriver"); //$NON-NLS-1$
                }
            });
        }

        if (mShowGenericDriverButton) {
            final ToolBar toolBar = new ToolBar(tempComposite/*this.mPanel*/, SWT.FLAT);
            /*final ToolItem*/ item2 = new ToolItem(toolBar, SWT.PUSH);
            item2.setImage(mDriverImage);
            item2.setToolTipText(DriverMgmtMessages.getString("DriverListCombo.button.generic")); //$NON-NLS-1$
            item2.addSelectionListener(new NewGenericSelectionChangedListener(this));
            item2.setEnabled(!isReadOnly);
            toolBar.getAccessible().addAccessibleListener(new AccessibleAdapter() {
                public void getName(AccessibleEvent e) {
                    e.result = DriverMgmtMessages.getString("DriverListCombo.button.generic"); //$NON-NLS-1$
                }
            });
        }

        if (mShowEditButton) {
            final ToolBar toolBar = new ToolBar(tempComposite/*this.mPanel*/, SWT.FLAT);
            mTBButtonEdit = new ToolItem(toolBar, SWT.PUSH);
            mTBButtonEdit.setImage(mChangeImage);
            mTBButtonEdit.setToolTipText(DriverMgmtMessages.getString("DriverListCombo.EditDriverButton.tooltip")); //$NON-NLS-1$
            mTBButtonEdit.addSelectionListener(new EditButtonSelectionChangedListener(this));
            toolBar.getAccessible().addAccessibleListener(new AccessibleAdapter() {
                public void getName(AccessibleEvent e) {
                    e.result = DriverMgmtMessages.getString("DriverListCombo.EditDriverButton.tooltip"); //$NON-NLS-1$
                }
            });
        }

        if (mShowMenu) {
            final ToolBar toolBar = new ToolBar(tempComposite/*this.mPanel*/, SWT.FLAT);
            final Menu menu = new Menu(this.mPanel.getShell(), SWT.POP_UP);
            MenuItem mitem1 = new MenuItem(menu, SWT.PUSH);
            mitem1.setText(DriverMgmtMessages.getString("DriverListCombo.button.newdriver")); //$NON-NLS-1$
            mitem1.addSelectionListener(new NewButtonSelectionChangedListener(this));
            MenuItem mitem2 = new MenuItem(menu, SWT.PUSH);
            mitem2.setText(DriverMgmtMessages.getString("DriverListCombo.button.generic")); //$NON-NLS-1$
            mitem2.addSelectionListener(new NewGenericSelectionChangedListener(this));

            /*final ToolItem*/ item3 = new ToolItem(toolBar, SWT.PUSH);
            item3.setImage(mArrowImage);
            item3.addListener(SWT.Selection, new Listener() {
                public void handleEvent(org.eclipse.swt.widgets.Event event) {
                    Rectangle rect = item3.getBounds();
                    Point pt = new Point(rect.x, rect.y + rect.height);
                    pt = toolBar.toDisplay(pt);
                    menu.setLocation(pt.x, pt.y);
                    menu.setVisible(true);
                }
            });
            item3.setEnabled(!isReadOnly);
        }
        refreshCombo();
    }

    /**
     * Return the combo list
     * 
     * @return
     */
    public Combo getCombo() {
        return this.mComboList;
    }

    /**
     * If we changed, fire a changed event.
     * 
     * @param source
     */
    private void fireChangedEvent(Object source) {
        ChangeEvent e = new ChangeEvent(source);
        // inform any listeners of the resize event
        Object[] listeners = this.changeListeners.getListeners();
        for (int i = 0; i < listeners.length; ++i) {
            ((ChangeListener) listeners[i]).stateChanged(e);
        }
    }

    /**
     * Add a change listener
     * 
     * @param listener
     */
    public void addChangeListener(ChangeListener listener) {
        this.changeListeners.add(listener);
    }

    /**
     * Remove a change listener.
     * 
     * @param listener
     */
    public void removeChangeListener(ChangeListener listener) {
        this.changeListeners.remove(listener);
    }

    /**
     * Parse the list of jars
     * 
     * @param str_list
     * @return
     */
    protected String[] parseString(String str_list) {
        return parseString(str_list, IDriverMgmtConstants.PATH_DELIMITER);
    }

    protected String[] parseString(String str_list, String token) {
        StringTokenizer tk = new StringTokenizer(str_list, token);
        String[] pieces = new String[tk.countTokens()];
        int index = 0;
        while (tk.hasMoreTokens())
            pieces[index++] = tk.nextToken();
        return pieces;
    }

    /**
     * Return the instance of the selected driver.
     * 
     * @return
     */
    private IPropertySet getSelectedDriver() {
        int keyIndex = this.mComboList.getSelectionIndex();
        if (keyIndex > -1) {
            String keyString = this.mComboList.getItem(keyIndex);
            if (this.mComboList.getData(keyString) != null) {
                IPropertySet ps = (IPropertySet) this.mComboList.getData(keyString);
                return ps;
            }
        }
        return null;
    }

    /**
     * Return a Driver Instance from the combo.
     * 
     * @return
     */
    public DriverInstance getSelectedDriverInstance() {
        IPropertySet ps = getSelectedDriver();
        if (ps != null)
            return new DriverInstance(ps);
        return null;
    }

    /**
     * Return the name of the selected driver.
     * 
     * @return
     */
    public String getSelectedDriverName() {
        IPropertySet ps = getSelectedDriver();
        if (ps != null) {
            return ps.getName();
        }
        return null;
    }

    /**
     * Return the ID of the selected driver.
     * 
     * @return
     */
    public String getSelectedDriverID() {
        IPropertySet ps = getSelectedDriver();
        if (ps != null) {
            return ps.getID();
        }
        return null;
    }

    /**
     * Set the initial selection
     * 
     * @param name
     */
    public void setSelection(String name) {
        List list = Arrays.asList(this.mComboList.getItems());
        if (list.contains(name)) {
            this.mComboList.select(list.indexOf(name));
            this.mComboList.setText(name);
        }
    }

    public void setSelectionToID(String id) {
        String driverName = null;
        List list = Arrays.asList(this.mComboList.getItems());
        for (int i = 0; i < list.size(); i++) {
            String keyString = DriverListCombo.this.mComboList.getItem(i);
            if (DriverListCombo.this.mComboList.getData(keyString) != null) {
                IPropertySet ps = (IPropertySet) DriverListCombo.this.mComboList.getData(keyString);
                if (ps.getID().equals(id)) {
                    driverName = keyString;
                    break;
                }
            }
        }
        if (driverName != null) {
            this.mComboList.select(list.indexOf(driverName));
            this.mComboList.setText(driverName);
        }
    }

    public void selectFirstItem() {
        if (this.mComboList.getItemCount() > 0) {
            this.mComboList.select(0);
        } else {
            if (DriverListCombo.this.mNullDriverValid)
                DriverListCombo.this.mErrorMessage = null;
            else
                DriverListCombo.this.mErrorMessage = DriverMgmtMessages
                        .getString("DriverValidator.msg.no_driver_selected"); //$NON-NLS-1$
        }

        fireChangedEvent(this.mComboList.getParent());
    }

    private boolean passesFilter(TemplateDescriptor template, IPropertySet pset) {
        boolean rtn = true;
        if (this.mFilter != null && template != null && pset != null) {
            String[] filters = parseString(this.mFilter, ","); //$NON-NLS-1$
            for (int i = 0; i < filters.length; i++) {
                String filter = filters[i];
                String args[] = parseString(filter, "="); //$NON-NLS-1$
                String arg = args[0].trim();
                String value = args[1].trim();
                if (arg.equals("id")) { //$NON-NLS-1$
                    if (pset.getID().indexOf(value) == -1) {
                        rtn = false;
                        break;
                    }
                } else if (arg.equals("name")) { //$NON-NLS-1$
                    if (pset.getName().indexOf(value) == -1) {
                        rtn = false;
                        break;
                    }
                } else if (arg.equals("templateID")) { //$NON-NLS-1$
                    if (template.getId().indexOf(value) == -1) {
                        rtn = false;
                        break;
                    }
                } else if (arg.equals("templateIDStartsWith")) { //$NON-NLS-1$
                    if (!template.getId().startsWith(value)) {
                        rtn = false;
                        break;
                    }
                } else if (arg.equals("templateIDEndsWith")) { //$NON-NLS-1$
                    if (!template.getId().endsWith(value)) {
                        rtn = false;
                        break;
                    }
                } else if (arg.equals("templateIDContains")) { //$NON-NLS-1$
                    if (template.getId().indexOf(value) == -1) {
                        rtn = false;
                        break;
                    }
                }
            }
        }
        return rtn;
    }

    private class TemplateDescriptorComparator implements Comparator {

        public int compare(Object arg0, Object arg1) {
            TemplateDescriptor td1 = (TemplateDescriptor) arg0;
            TemplateDescriptor td2 = (TemplateDescriptor) arg1;
            return td1.getName().compareToIgnoreCase(td2.getName());
        }

    }

    private class PropertySetComparator implements Comparator {

        public int compare(Object arg0, Object arg1) {
            IPropertySet ps1 = (IPropertySet) arg0;
            IPropertySet ps2 = (IPropertySet) arg1;
            return ps1.getName().compareToIgnoreCase(ps2.getName());
        }

    }

    /**
     * Refresh the combo list
     */
    public void refreshCombo() {

        getCombo().removeAll();

        IPropertySet[] psets = new IPropertySet[0];
        IPropertySet[] comboPsets = new IPropertySet[0];
        DriverInstance[] dilist = DriverManager.getInstance().getAllDriverInstances();
        if (dilist != null && dilist.length > 0) {
            psets = new IPropertySet[dilist.length];
            for (int i = 0; i < psets.length; i++) {
                psets[i] = dilist[i].getPropertySet();
            }
        }

        if (this.mCategoryId != null) {
            CategoryDescriptor category = CategoryDescriptor.getCategoryDescriptor(this.mCategoryId);
            List templates = new ArrayList();
            if (category == null) {
                CategoryDescriptor[] categories = CategoryDescriptor.getRootCategories();
                for (int index = 0, count = categories.length; index < count; ++index) {
                    populateAssociatedDriverTypes(categories[index], templates);
                }
            } else {
                populateAssociatedDriverTypes(category, templates);
            }
            TemplateDescriptorComparator comparator = new TemplateDescriptorComparator();
            Object[] templatesArray = templates.toArray();
            Arrays.sort(templatesArray, comparator);
            Arrays.sort(psets, new PropertySetComparator());

            ArrayList listForCombo = new ArrayList();
            for (int i = 0; i < templatesArray.length; i++) {
                TemplateDescriptor template = (TemplateDescriptor) templatesArray[i];
                for (int j = 0; j < psets.length; j++) {
                    IPropertySet pset = psets[j];
                    String driverType = pset.getBaseProperties().getProperty(IDriverMgmtConstants.PROP_DEFN_TYPE); //$NON-NLS-1$
                    if (driverType.equals(template.getId())) {
                        if (passesFilter(template, pset)) {
                            listForCombo.add(pset);
                        }
                    }
                }
            }
            comboPsets = (IPropertySet[]) listForCombo.toArray(new IPropertySet[listForCombo.size()]);
        } else {
            comboPsets = psets;
        }

        if (comboPsets != null && comboPsets.length > 0) {
            PropertySetComparator comparator = new PropertySetComparator();
            Arrays.sort(comboPsets, comparator);
            for (int i = 0; i < comboPsets.length; i++) {
                IPropertySet pset = comboPsets[i];
                getCombo().add(pset.getName());
                getCombo().setData(pset.getName(), pset);
            }
        }

        if (mTBButtonEdit != null) // && !isReadOnly)
            mTBButtonEdit.setEnabled(false);
        String text = getCombo().getText();
        if (text != null && text.trim().length() > 0) {
            for (int i = 0; i < getCombo().getItemCount(); i++) {
                if (getCombo().getItem(i).equals(text)) {
                    getCombo().select(i);
                    break;
                }
            }
        } else {
            if (getCombo().getItemCount() > 0) { // && !isReadOnly) {
                if (mTBButtonEdit != null) {
                    mTBButtonEdit.setEnabled(true);
                }
            }
        }
    }

    private void populateAssociatedDriverTypes(CategoryDescriptor category, List templates) {
        templates.addAll(category.getAssociatedDriverTypes());
        for (Iterator it = category.getChildCategories().iterator(); it.hasNext();) {
            populateAssociatedDriverTypes((CategoryDescriptor) it.next(), templates);
        }
    }

    /**
     * Listener for combo selection events
     * 
     * @author brianf
     */
    private class ComboSelectionListener implements SelectionListener, ModifyListener {

        private DriverListCombo parent;

        public ComboSelectionListener(DriverListCombo combo) {
            this.parent = combo;
        }

        public void widgetSelected(SelectionEvent e) {
            int keyIndex = DriverListCombo.this.mComboList.getSelectionIndex();
            if (keyIndex == -1 && mTBButtonEdit != null) // && !isReadOnly)
                mTBButtonEdit.setEnabled(false);
            else if (keyIndex > -1 && mTBButtonEdit != null) // && !isReadOnly)
                mTBButtonEdit.setEnabled(true);
            if (keyIndex > -1) {

                String keyString = DriverListCombo.this.mComboList.getItem(keyIndex);
                if (DriverListCombo.this.mComboList.getData(keyString) != null) {
                    IPropertySet ps = (IPropertySet) DriverListCombo.this.mComboList.getData(keyString);
                    if (ps != null) {
                        String driverType = ps.getBaseProperties().getProperty(IDriverMgmtConstants.PROP_DEFN_TYPE); //$NON-NLS-1$
                        if (driverType != null) {
                            TemplateDescriptor template = TemplateDescriptor
                                    .getDriverTemplateDescriptor(driverType);
                            if (template != null) {
                                DriverValidator validator = new DriverValidator(template, ps);
                                DriverListCombo.this.mErrorMessage = null;
                                if (!validator.isValid(false)) {
                                    DriverListCombo.this.mErrorMessage = validator.getMessage();
                                }
                            }
                        }
                    }
                }
            } else {
                if (DriverListCombo.this.mNullDriverValid)
                    DriverListCombo.this.mErrorMessage = null;
                else
                    DriverListCombo.this.mErrorMessage = DriverMgmtMessages
                            .getString("DriverValidator.msg.no_driver_selected"); //$NON-NLS-1$
            }

            fireChangedEvent(this.parent);
        }

        public void widgetDefaultSelected(SelectionEvent e) {
            widgetSelected(e);
        }

        /*
         * (non-Javadoc)
         * 
         * @see org.eclipse.swt.events.ModifyListener#modifyText(org.eclipse.swt.events.ModifyEvent)
         */
        public void modifyText(ModifyEvent e) {
            String keyString = DriverListCombo.this.mComboList.getText();
            if (keyString.length() > 0) {
                if (DriverListCombo.this.mComboList.getData(keyString) != null) {
                    IPropertySet ps = (IPropertySet) DriverListCombo.this.mComboList.getData(keyString);
                    if (ps != null) {
                        String driverType = ps.getBaseProperties().getProperty(IDriverMgmtConstants.PROP_DEFN_TYPE); //$NON-NLS-1$
                        if (driverType != null) {
                            TemplateDescriptor template = TemplateDescriptor
                                    .getDriverTemplateDescriptor(driverType);
                            if (template != null) {
                                DriverValidator validator = new DriverValidator(template, ps);
                                DriverListCombo.this.mErrorMessage = null;
                                if (!validator.isValid(false)) {
                                    DriverListCombo.this.mErrorMessage = validator.getMessage();
                                }
                            }
                        }
                    }
                }
            } else {
                if (DriverListCombo.this.mNullDriverValid)
                    DriverListCombo.this.mErrorMessage = null;
                else
                    DriverListCombo.this.mErrorMessage = DriverMgmtMessages
                            .getString("DriverValidator.msg.no_driver_selected"); //$NON-NLS-1$
            }
            fireChangedEvent(this.parent);
        }

    }

    /**
     * Listener for edit button clicks events
     * 
     * @author brianf
     */
    public class NewButtonSelectionChangedListener implements SelectionListener {

        private DriverListCombo parent;

        public NewButtonSelectionChangedListener(DriverListCombo combo) {
            this.parent = combo;
        }

        public void widgetSelected(SelectionEvent e) {
            Shell newShell = parent.getCombo().getShell();
            DriverDialog dlg;
            if (DriverListCombo.this.mCategoryId != null) {
                dlg = new DriverDialog(newShell, DriverListCombo.this.mCategoryId);
            } else {
                dlg = new DriverDialog(newShell);
            }

            int rtn = dlg.open();
            if (rtn != Window.OK)
                return;

            String tempStore = DriverListCombo.this.mComboList.getText();

            if (dlg.getPropertySet() != null) {
                DriverManager.getInstance().addDriverInstance(dlg.getPropertySet());
                //            saveChanges();
            }

            refreshCombo();

            boolean fireEvent = false;
            if (dlg.getSelectedDefinition() != null) {
                fireEvent = true;
                String driverName = dlg.getSelectedDefinition().getName();
                String[] itemList = DriverListCombo.this.mComboList.getItems();
                if (itemList.length > 0) {
                    for (int i = 0; i < itemList.length; i++) {
                        String item = itemList[i];
                        IPropertySet temp = (IPropertySet) DriverListCombo.this.mComboList.getData(item);
                        if (temp.getID().equals(dlg.getSelectedDefinition().getID())) {
                            DriverListCombo.this.mComboList.setText(driverName);
                            DriverListCombo.this.mComboList.select(i);

                            String driverType = temp.getBaseProperties()
                                    .getProperty(IDriverMgmtConstants.PROP_DEFN_TYPE); //$NON-NLS-1$
                            if (driverType != null) {
                                TemplateDescriptor template = TemplateDescriptor
                                        .getDriverTemplateDescriptor(driverType);
                                if (template != null) {
                                    DriverValidator validator = new DriverValidator(template, temp);
                                    DriverListCombo.this.mErrorMessage = null;
                                    if (!validator.isValid(false)) {
                                        DriverListCombo.this.mErrorMessage = validator.getMessage();
                                    }
                                }
                            }
                            break;
                        }
                    }
                }
            } else
                DriverListCombo.this.mComboList.setText(tempStore);

            int keyIndex = DriverListCombo.this.mComboList.getSelectionIndex();
            if (keyIndex == -1 && mTBButtonEdit != null) // && !isReadOnly)
                mTBButtonEdit.setEnabled(false);
            else if (keyIndex > -1 && mTBButtonEdit != null) // && !isReadOnly)
                mTBButtonEdit.setEnabled(true);

            if (fireEvent)
                fireChangedEvent(this.parent);
        }

        public void widgetDefaultSelected(SelectionEvent e) {
            widgetSelected(e);
        }
    }

    public class NewGenericSelectionChangedListener implements SelectionListener {

        private DriverListCombo parent;

        public NewGenericSelectionChangedListener(DriverListCombo combo) {
            this.parent = combo;
        }

        public void widgetSelected(SelectionEvent e) {
            Shell newShell = parent.getCombo().getShell();
            DriverDialog dlg;
            if (DriverListCombo.this.mCategoryId != null) {
                dlg = new DriverDialog(newShell, DriverListCombo.this.mCategoryId);
            } else {
                dlg = new DriverDialog(newShell);
            }
            dlg.setHideDriverList(true);
            dlg.setInitialTemplate("org.eclipse.datatools.connectivity.db.generic.genericDriverTemplate"); //$NON-NLS-1$

            int rtn = dlg.open();
            if (rtn != Window.OK)
                return;

            String tempStore = DriverListCombo.this.mComboList.getText();

            if (dlg.getPropertySet() != null) {
                DriverManager.getInstance().addDriverInstance(dlg.getPropertySet());
                //            saveChanges();
            }

            refreshCombo();

            boolean fireEvent = false;
            if (dlg.getSelectedDefinition() != null) {
                fireEvent = true;
                String driverName = dlg.getSelectedDefinition().getName();
                String[] itemList = DriverListCombo.this.mComboList.getItems();
                if (itemList.length > 0) {
                    for (int i = 0; i < itemList.length; i++) {
                        String item = itemList[i];
                        IPropertySet temp = (IPropertySet) DriverListCombo.this.mComboList.getData(item);
                        if (temp.getID().equals(dlg.getSelectedDefinition().getID())) {
                            DriverListCombo.this.mComboList.setText(driverName);
                            DriverListCombo.this.mComboList.select(i);

                            String driverType = temp.getBaseProperties()
                                    .getProperty(IDriverMgmtConstants.PROP_DEFN_TYPE); //$NON-NLS-1$
                            if (driverType != null) {
                                TemplateDescriptor template = TemplateDescriptor
                                        .getDriverTemplateDescriptor(driverType);
                                if (template != null) {
                                    DriverValidator validator = new DriverValidator(template, temp);
                                    DriverListCombo.this.mErrorMessage = null;
                                    if (!validator.isValid(false)) {
                                        DriverListCombo.this.mErrorMessage = validator.getMessage();
                                    }
                                }
                            }
                            break;
                        }
                    }
                }
            } else
                DriverListCombo.this.mComboList.setText(tempStore);

            int keyIndex = DriverListCombo.this.mComboList.getSelectionIndex();
            if (keyIndex == -1 && mTBButtonEdit != null) // && !isReadOnly)
                mTBButtonEdit.setEnabled(false);
            else if (keyIndex > -1 && mTBButtonEdit != null) // && !isReadOnly)
                mTBButtonEdit.setEnabled(true);

            if (fireEvent)
                fireChangedEvent(this.parent);
        }

        public void widgetDefaultSelected(SelectionEvent e) {
            widgetSelected(e);
        }
    }

    /**
     * Listener for edit button clicks events
     * 
     * @author brianf
     */
    public class EditButtonSelectionChangedListener implements SelectionListener {

        private DriverListCombo parent;

        public EditButtonSelectionChangedListener(DriverListCombo combo) {
            this.parent = combo;
        }

        public void widgetSelected(SelectionEvent e) {
            Shell newShell = parent.getCombo().getShell();
            DriverDialog dlg;
            if (DriverListCombo.this.mCategoryId != null) {
                dlg = new DriverDialog(newShell, DriverListCombo.this.mCategoryId);
            } else {
                dlg = new DriverDialog(newShell);
            }
            dlg.setIsEditable(!isReadOnly);
            if (parent.getSelectedDriver() == null)
                return;

            IPropertySet copy = duplicatePropertySet(parent.getSelectedDriver());
            dlg.setPropertySet(copy);
            dlg.setEditMode(true);

            int rtn = dlg.open();
            if (rtn != Window.OK)
                return;

            copy = dlg.getPropertySet();
            copyPropertySet(copy, parent.getSelectedDriver());
            DriverManager.getInstance().removeDriverInstance(parent.getSelectedDriver().getID());

            /*
             * This call to garbage collect is to try and reclaim
             * the classloader held by the last instance of the 
             * DriverInstance that is being dropped and re-added.
             * Note that if the class is in use (i.e. any profile
             * is connected that uses the referenced driver), it 
             * won't be unloaded and subsequent connections will 
             * fail.
             */
            System.gc();

            DriverManager.getInstance().addDriverInstance(copy);

            refreshCombo();

            boolean fireEvent = false;
            if (dlg.getSelectedDefinition() != null) {
                fireEvent = true;
                String driverName = dlg.getSelectedDefinition().getName();
                String[] itemList = DriverListCombo.this.mComboList.getItems();
                if (itemList.length > 0) {
                    for (int i = 0; i < itemList.length; i++) {
                        String item = itemList[i];
                        IPropertySet temp = (IPropertySet) DriverListCombo.this.mComboList.getData(item);
                        if (temp.getID().equals(dlg.getSelectedDefinition().getID())) {
                            DriverListCombo.this.mComboList.setText(driverName);
                            DriverListCombo.this.mComboList.select(i);

                            String driverType = temp.getBaseProperties()
                                    .getProperty(IDriverMgmtConstants.PROP_DEFN_TYPE); //$NON-NLS-1$
                            if (driverType != null) {
                                TemplateDescriptor template = TemplateDescriptor
                                        .getDriverTemplateDescriptor(driverType);
                                if (template != null) {
                                    DriverValidator validator = new DriverValidator(template, temp);
                                    DriverListCombo.this.mErrorMessage = null;
                                    if (!validator.isValid(false)) {
                                        DriverListCombo.this.mErrorMessage = validator.getMessage();
                                    }
                                }
                            }
                            break;
                        }
                    }
                }
            } else
                DriverListCombo.this.mComboList.setText(copy.getName());

            int keyIndex = DriverListCombo.this.mComboList.getSelectionIndex();
            if (keyIndex == -1 && mTBButtonEdit != null) // && !isReadOnly)
                mTBButtonEdit.setEnabled(false);
            else if (keyIndex > -1 && mTBButtonEdit != null) // && !isReadOnly)
                mTBButtonEdit.setEnabled(true);

            if (fireEvent)
                fireChangedEvent(this.parent);
        }

        public void widgetDefaultSelected(SelectionEvent e) {
            widgetSelected(e);
        }
    }

    public void dispose() {
        if (this.mDriverImage != null)
            this.mDriverImage.dispose();
        if (this.mDriverWithPlusImage != null)
            this.mDriverWithPlusImage.dispose();
        if (this.mChangeImage != null)
            this.mChangeImage.dispose();
        if (this.mArrowImage != null)
            this.mArrowImage.dispose();
    }

    private void makeImages() {
        mDriverImage = DriverImages.DRIVER.createImage();

        PLUS = AbstractUIPlugin.imageDescriptorFromPlugin(
                ConnectivityUIPlugin.getDefault().getBundle().getSymbolicName(), "icons/add_obj2.gif"); //$NON-NLS-1$

        DecorationOverlayIcon icon = new DecorationOverlayIcon(mDriverImage, PLUS, IDecoration.TOP_RIGHT);
        mDriverWithPlusImage = icon.createImage();

        ARROW = AbstractUIPlugin.imageDescriptorFromPlugin(
                ConnectivityUIPlugin.getDefault().getBundle().getSymbolicName(), "icons/view_menu.gif"); //$NON-NLS-1$

        mArrowImage = ARROW.createImage();

        CHANGE = AbstractUIPlugin.imageDescriptorFromPlugin(
                ConnectivityUIPlugin.getDefault().getBundle().getSymbolicName(), "icons/change_obj.gif"); //$NON-NLS-1$

        mChangeImage = CHANGE.createImage();
    }

    private IPropertySet duplicatePropertySet(IPropertySet pset) {
        IPropertySet newPset = new PropertySetImpl(pset.getName(), pset.getID());
        if (pset.getBaseProperties().size() > 0) {
            Properties newProps = new Properties();
            newPset.setBaseProperties(newProps);
            newPset.getBaseProperties().putAll(pset.getBaseProperties());
        }
        return newPset;
    }

    private void copyPropertySet(IPropertySet fromPset, IPropertySet topset) {
        topset.setID(fromPset.getID());
        topset.setName(fromPset.getName());
        if (topset.getBaseProperties().size() > 0) {
            topset.getBaseProperties().putAll(fromPset.getBaseProperties());
        }
    }
}