org.eclipse.datatools.connectivity.internal.ui.dialogs.DriverDialog.java Source code

Java tutorial

Introduction

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

Source

/*******************************************************************************
 * Copyright (c) 2008 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 - fix for 243829
 ******************************************************************************/
package org.eclipse.datatools.connectivity.internal.ui.dialogs;

import java.io.File;
import java.util.Arrays;
import java.util.Properties;

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

import org.eclipse.core.resources.ResourcesPlugin;
import org.eclipse.core.runtime.IConfigurationElement;
import org.eclipse.core.runtime.Path;
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.IDriverValuesProvider;
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.OverrideTemplateDescriptor;
import org.eclipse.datatools.connectivity.drivers.models.TemplateDescriptor;
import org.eclipse.datatools.connectivity.internal.ui.ConnectivityUIPlugin;
import org.eclipse.datatools.connectivity.internal.ui.DriverPropertySourceProvider;
import org.eclipse.datatools.connectivity.internal.ui.DriverTreeFilter;
import org.eclipse.datatools.connectivity.internal.ui.IHelpConstants;
import org.eclipse.datatools.help.ContextProviderDelegate;
import org.eclipse.datatools.help.HelpUtil;
import org.eclipse.help.IContext;
import org.eclipse.jface.dialogs.IDialogConstants;
import org.eclipse.jface.dialogs.IDialogSettings;
import org.eclipse.jface.dialogs.MessageDialog;
import org.eclipse.jface.dialogs.TitleAreaDialog;
import org.eclipse.jface.viewers.ISelectionChangedListener;
import org.eclipse.jface.viewers.SelectionChangedEvent;
import org.eclipse.jface.viewers.StructuredSelection;
import org.eclipse.jface.viewers.TreeViewer;
import org.eclipse.jface.viewers.Viewer;
import org.eclipse.jface.viewers.ViewerSorter;
import org.eclipse.swt.SWT;
import org.eclipse.swt.SWTException;
import org.eclipse.swt.events.DisposeEvent;
import org.eclipse.swt.events.DisposeListener;
import org.eclipse.swt.events.ModifyEvent;
import org.eclipse.swt.events.ModifyListener;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.events.SelectionListener;
import org.eclipse.swt.graphics.GC;
import org.eclipse.swt.graphics.Point;
import org.eclipse.swt.graphics.Rectangle;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.widgets.Combo;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;
import org.eclipse.swt.widgets.FileDialog;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.List;
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.eclipse.swt.widgets.TreeColumn;
import org.eclipse.ui.part.IPage;
import org.eclipse.ui.part.PageBook;
import org.eclipse.ui.views.properties.PropertySheetPage;

import com.ibm.icu.text.Collator;
import com.ibm.icu.util.StringTokenizer;

public class DriverDialog extends TitleAreaDialog {

    // memento keys
    public final static String MEMENTO_ROOT = "Alt Drivers Definitions Driver_Dialog_Root";//$NON-NLS-1$
    public final static String MEMENTO_DIALOG_SIZE_HEIGHT = "Dialog_Size_Height";//$NON-NLS-1$
    public final static String MEMENTO_DIALOG_SIZE_WIDTH = "Dialog_Size_Width";//$NON-NLS-1$

    private Text mDriverNameText;
    private Combo mTypeCombo;
    private Combo mVendorCombo;
    private TreeViewer mTreeViewer;
    private PageBook book = null;
    private List list;
    private Text mDriverTypeText;
    private Button mAddJar;
    private Button mEditJar;
    private Button mRemoveJar;
    private Button mClearAll;
    private Button mOKButton;
    private TemplateDescriptor descriptor = null;
    private IPropertySet mPropertySet = null;
    private IPropertySet mInitialPropertySet = null;
    private boolean hideDriverList = false;
    private DriverPropertySourceProvider mpsp = null;

    private static String ALL_STRING = DriverMgmtMessages.getString("DriverDialog.AllFilter"); //$NON-NLS-1$

    // driver properties
    private String mDriverName;
    private String mJarList;
    private boolean mInEdit = false;
    private boolean mIsEditable = true;
    private static String previouslyBrowsedDirectory = ""; //$NON-NLS-1$

    // tree filter
    private DriverTreeFilter mViewerFilter;
    private DriverTreeFilter mTypeFilter;
    private DriverTreeFilter mVendorFilter;

    //tabs
    private TabItem generalTab;
    private TabItem jarListTab;
    private TabItem propertiesTab;
    private Composite generalComposite;
    private Composite jarListComposite;
    private Composite propertiesComposite;

    private ContextProviderDelegate contextProviderDelegate = new ContextProviderDelegate(
            ConnectivityUIPlugin.getDefault().getBundle().getSymbolicName());

    // listener for property changes to re-validate 
    private ChangeListener psetChangedListener = new ChangeListener() {

        public void stateChanged(ChangeEvent arg0) {
            boolean flag = isValid(true);
            validateName();
            if (DriverDialog.this.mOKButton != null && !DriverDialog.this.mOKButton.isDisposed())
                DriverDialog.this.mOKButton.setEnabled(flag);
        }
    };

    public void setIsEditable(boolean flag) {
        this.mIsEditable = flag;
    }

    public void setEditMode(boolean flag) {
        this.mInEdit = flag;
    }

    public DriverDialog(Shell parentShell) {
        super(parentShell);
        this.setShellStyle(getShellStyle() | SWT.RESIZE | SWT.DIALOG_TRIM);
    }

    /**
     * Constructor
     * 
     * @param parentShell
     * @param category
     */
    public DriverDialog(Shell parentShell, String category) {
        this(parentShell);

        if (CategoryDescriptor.getCategoryDescriptor(category) != null) {
            this.mViewerFilter = new DriverTreeFilter();
            this.mViewerFilter.setCategoryId(category);
        }
    }

    private void handleSelection() {
        if (this.mTreeViewer != null && !this.mTreeViewer.getTree().isDisposed())
            this.mTreeViewer.getTree().setRedraw(false);
        if (mTypeFilter != null && mTreeViewer != null) {
            mTreeViewer.removeFilter(mTypeFilter);
        }
        mVendorCombo.removeAll();
        if (mTypeCombo.getSelectionIndex() > -1) {
            mVendorCombo.setEnabled(true);
            String selectedText = mTypeCombo.getText();
            if (selectedText.trim().length() > 0) {
                CategoryDescriptor[] kids = null;
                if (mTypeCombo.getData(selectedText) instanceof CategoryDescriptor) {
                    CategoryDescriptor cd = (CategoryDescriptor) mTypeCombo.getData(selectedText);
                    kids = CategoryUtils.getOrderedChildCategories(cd.getId());
                    if (cd != null && mTreeViewer != null) {
                        mTypeFilter = new DriverTreeFilter();
                        mTypeFilter.setCategoryId(cd.getId());
                        mTreeViewer.addFilter(mTypeFilter);
                        mTreeViewer.refresh();
                        mTreeViewer.expandToLevel(2);
                    }
                } else if (mTypeCombo.getData(selectedText) instanceof CategoryDescriptor[]) {
                    kids = (CategoryDescriptor[]) mTypeCombo.getData(selectedText);
                    Arrays.sort(kids, new CategoryDescriptorNameComparator());
                    mTreeViewer.expandToLevel(2);
                }
                if (kids != null && !selectedText.equals(ALL_STRING)) {
                    mVendorCombo.add(ALL_STRING);
                    for (int j = 0; j < kids.length; j++) {
                        mVendorCombo.add(kids[j].getName());
                        mVendorCombo.setData(kids[j].getName(), kids[j]);
                    }
                    if (mVendorCombo.getItemCount() == 0) {
                        mVendorCombo.setEnabled(false);
                    }
                } else {
                    mVendorCombo.add(ALL_STRING);
                    for (int j = 0; j < kids.length; j++) {
                        CategoryDescriptor[] details = CategoryUtils.getOrderedChildCategories(kids[j].getId());
                        if (details != null && details.length > 0) {
                            for (int i = 0; i < details.length; i++) {
                                mVendorCombo.add(details[i].getName());
                                mVendorCombo.setData(details[i].getName(), details[i]);
                            }
                        }
                    }
                    if (mVendorCombo.getItemCount() == 0) {
                        mVendorCombo.setEnabled(false);
                    }
                }
                mVendorCombo.select(0);
            }
        } else {
            mVendorCombo.setEnabled(false);
        }
        if (this.mTreeViewer != null && !this.mTreeViewer.getTree().isDisposed())
            this.mTreeViewer.getTree().setRedraw(true);
    }

    private void handleVendorSelected() {
        if (this.mTreeViewer != null && !this.mTreeViewer.getTree().isDisposed())
            this.mTreeViewer.getTree().setRedraw(false);
        if (mVendorFilter != null && mTreeViewer != null) {
            mTreeViewer.removeFilter(mVendorFilter);
        }
        if (mTreeViewer != null && mVendorCombo != null && mVendorCombo.getText().trim().length() > 0) {
            String selText = mVendorCombo.getText().trim();
            CategoryDescriptor cd = (CategoryDescriptor) mVendorCombo.getData(selText);
            if (cd != null) {
                mVendorFilter = new DriverTreeFilter();
                mVendorFilter.setCategoryId(cd.getId());
                mTreeViewer.addFilter(mVendorFilter);
                mTreeViewer.refresh();
                mTreeViewer.expandToLevel(2);
            }
        }
        if (this.mTreeViewer != null && !this.mTreeViewer.getTree().isDisposed())
            this.mTreeViewer.getTree().setRedraw(true);
    }

    private void processEnabledStateForComposite(Composite parent, boolean enabled) {
        if (parent != null && parent.equals(jarListComposite)) {
            parent.setEnabled(enabled);
            mAddJar.setEnabled(enabled);
            mEditJar.setEnabled(enabled);
            mClearAll.setEnabled(enabled);
            mRemoveJar.setEnabled(enabled);
        } else if (parent != null && parent.equals(propertiesComposite)) {
            parent.setEnabled(enabled);
            book.setEnabled(enabled);
        }
    }

    protected Control createDialogArea(Composite parent) {
        getShell().setData(HelpUtil.CONTEXT_PROVIDER_KEY, this);
        if (!this.mInEdit)
            HelpUtil.setHelp(getShell(), HelpUtil.getContextId(IHelpConstants.CONTEXT_ID_NEW_DRIVER_DIALOG,
                    ConnectivityUIPlugin.getDefault().getBundle().getSymbolicName()));
        else
            HelpUtil.setHelp(getShell(), HelpUtil.getContextId(IHelpConstants.CONTEXT_ID_EDIT_DRIVER_DIALOG,
                    ConnectivityUIPlugin.getDefault().getBundle().getSymbolicName()));

        Composite area = (Composite) super.createDialogArea(parent);

        Composite contents = new Composite(area, SWT.NONE);
        contents.setLayout(new GridLayout());
        contents.setLayoutData(new GridData(GridData.FILL_BOTH));
        contents.addDisposeListener(new DisposeListener() {
            public void widgetDisposed(DisposeEvent e) {
            }
        });

        TabFolder baseComposite = new TabFolder(contents, SWT.TOP);
        baseComposite.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));

        generalTab = new TabItem(baseComposite, SWT.None);
        generalTab.setText(DriverMgmtMessages.getString("DriverDialog.Name.Type.Tab")); //$NON-NLS-1$

        jarListTab = new TabItem(baseComposite, SWT.None);
        jarListTab.setText(DriverMgmtMessages.getString("DriverDialog.JarList.Tab")); //$NON-NLS-1$

        propertiesTab = new TabItem(baseComposite, SWT.None);
        propertiesTab.setText(DriverMgmtMessages.getString("DriverDialog.Properties.Tab")); //$NON-NLS-1$

        generalComposite = new Composite(baseComposite, SWT.NULL);
        GridLayout layout = new GridLayout();
        generalComposite.setLayout(layout);
        generalTab.setControl(generalComposite);

        jarListComposite = new Composite(baseComposite, SWT.NULL);
        GridLayout jl_layout = new GridLayout();
        jarListComposite.setLayout(jl_layout);
        jarListTab.setControl(jarListComposite);

        propertiesComposite = new Composite(baseComposite, SWT.NULL);
        GridLayout p_layout = new GridLayout();
        propertiesComposite.setLayout(p_layout);
        propertiesTab.setControl(propertiesComposite);

        if (!mInEdit && !hideDriverList) {
            Composite comboComposite = null;

            CategoryDescriptor[] roots = CategoryUtils.getOrderedRootCategories();
            if (mViewerFilter != null) {
                roots = new CategoryDescriptor[] { ((DriverTreeFilter) mViewerFilter).getCategoryDescriptor() };
            }
            if (roots != null && roots.length > 1) {
                if (comboComposite == null)
                    comboComposite = createComboComposite(generalComposite);
                Label tlabel = new Label(comboComposite, SWT.LEFT);
                tlabel.setText(DriverMgmtMessages.getString("DriverDialog.DriverTypeFilter")); //$NON-NLS-1$
                tlabel.setLayoutData(new GridData());

                mTypeCombo = new Combo(comboComposite, SWT.BORDER | SWT.READ_ONLY);
                mTypeCombo.setLayoutData(new GridData(SWT.FILL, SWT.NONE, true, false));

                mTypeCombo.add(ALL_STRING);
                mTypeCombo.setData(ALL_STRING, roots);

                for (int i = 0; i < roots.length; i++) {
                    mTypeCombo.add(roots[i].getName());
                    mTypeCombo.setData(roots[i].getName(), roots[i]);
                }

                mTypeCombo.addSelectionListener(new SelectionListener() {

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

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

            if (roots[0] != null && roots[0].getParent() != null && roots[0].getParent().getParent() == null) {
                // too deep
            } else {
                if (comboComposite == null)
                    comboComposite = createComboComposite(generalComposite);

                Label vLabel = new Label(comboComposite, SWT.LEFT);
                vLabel.setText(DriverMgmtMessages.getString("DriverDialog.VendorFilter")); //$NON-NLS-1$
                vLabel.setLayoutData(new GridData());

                mVendorCombo = new Combo(comboComposite, SWT.BORDER | SWT.READ_ONLY);
                mVendorCombo.setLayoutData(new GridData(SWT.FILL, SWT.NONE, true, false));

                mVendorCombo.addSelectionListener(new SelectionListener() {

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

                    public void widgetSelected(SelectionEvent e) {
                        widgetDefaultSelected(e);
                    }
                });
                mVendorCombo.setEnabled(mIsEditable);

                if (roots != null && roots.length == 1 && roots[0] != null) {
                    CategoryDescriptor[] children = CategoryUtils.getOrderedChildCategories(roots[0].getId());
                    if (children != null && children.length > 0) {
                        mVendorCombo.add(ALL_STRING);
                        for (int i = 0; i < children.length; i++) {
                            mVendorCombo.add(children[i].getName());
                            mVendorCombo.setData(children[i].getName(), children[i]);
                        }
                    } else if (mIsEditable) {
                        mVendorCombo.setEnabled(false);
                    }
                }
            }

            Label label = new Label(generalComposite, SWT.LEFT);
            label.setText(DriverMgmtMessages.getString("NewDriverDialog.label.availableTemplates")); //$NON-NLS-1$
            GridData data = new GridData();
            data.horizontalAlignment = GridData.FILL;
            data.horizontalSpan = 2;
            label.setLayoutData(data);

            mTreeViewer = new TreeViewer(generalComposite,
                    SWT.BORDER | SWT.H_SCROLL | SWT.V_SCROLL | SWT.FULL_SELECTION);
            mTreeViewer.setContentProvider(new DriverTreeTableContentProvider());
            mTreeViewer.setLabelProvider(new DriverTreeTableLabelProvider());
            mTreeViewer.setSorter(new ViewerSorter());
            GridData tvGD = new GridData(SWT.FILL, SWT.FILL, true, true);
            mTreeViewer.getTree().setLayoutData(tvGD);
            mTreeViewer.getTree().setHeaderVisible(true);
            if (this.mViewerFilter != null) {
                mTreeViewer.addFilter(this.mViewerFilter);
            }

            TreeSortSelectionListener tssl1 = createTableColumn(mTreeViewer,
                    DriverMgmtMessages.getString("DriverDialog.NameColumn"), //$NON-NLS-1$
                    DriverMgmtMessages.getString("DriverDialog.DriverNameColumn"), //$NON-NLS-1$
                    new TextSorter(0), SWT.UP, false);
            tssl1.getColumn().setWidth(200);
            tssl1.getColumn().setResizable(true);
            tssl1.chooseColumnForSorting();

            TreeSortSelectionListener tssl2 = createTableColumn(mTreeViewer,
                    DriverMgmtMessages.getString("DriverDialog.VendorColumn"), //$NON-NLS-1$
                    DriverMgmtMessages.getString("DriverDialog.DriverVendorColumn"), //$NON-NLS-1$
                    new TextSorter(1), SWT.UP, true);
            tssl2.getColumn().setWidth(200);
            tssl2.getColumn().setResizable(true);

            TreeSortSelectionListener tssl3 = createTableColumn(mTreeViewer,
                    DriverMgmtMessages.getString("DriverDialog.Version"), //$NON-NLS-1$
                    DriverMgmtMessages.getString("DriverDialog.DriverVersionColumn"), //$NON-NLS-1$
                    new TextSorter(2), SWT.UP, false);
            tssl3.getColumn().setWidth(100);
            tssl3.getColumn().setResizable(true);

            mTreeViewer.setInput(new CategoryRoot());
            mTreeViewer.expandToLevel(2);

            mTreeViewer.addSelectionChangedListener(new ISelectionChangedListener() {

                public void selectionChanged(SelectionChangedEvent event) {
                    DriverDialog.this.setErrorMessage(null);
                    StructuredSelection selection = (StructuredSelection) DriverDialog.this.mTreeViewer
                            .getSelection();
                    if (selection.getFirstElement() instanceof TemplateDescriptor) {
                        TemplateDescriptor descriptor = (TemplateDescriptor) selection.getFirstElement();
                        // added for bug 249424 - BTF
                        if (DriverDialog.this.descriptor != null
                                && DriverDialog.this.descriptor.equals(descriptor)) {
                            return;
                        }
                        DriverDialog.this.updateFromDescriptor(descriptor);
                        DriverDialog.this.mDriverNameText.setEnabled(true);
                    } else if (selection.getFirstElement() instanceof CategoryDescriptor) {
                        DriverDialog.this.updateFromDescriptor(null);
                        DriverDialog.this.mDriverNameText.setEnabled(false);
                    }
                }
            });

            mTreeViewer.getTree().setEnabled(mIsEditable);
        }

        Label label = new Label(generalComposite, SWT.NONE);
        label.setText(DriverMgmtMessages.getString("NewDriverDialog.label.driverNameText")); //$NON-NLS-1$

        this.mDriverNameText = new Text(generalComposite, SWT.BORDER);
        this.mDriverNameText.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
        this.mDriverNameText.setEnabled(mIsEditable);
        this.mDriverNameText.addModifyListener(new ModifyListener() {

            public void modifyText(ModifyEvent e) {
                DriverDialog.this.mDriverName = DriverDialog.this.mDriverNameText.getText();
                validateName();
            }
        });

        {
            final Label label2 = new Label(generalComposite, SWT.NONE);
            label2.setText(DriverMgmtMessages.getString("EditDriverDialog.label.driverTypeText")); //$NON-NLS-1$
        }
        {
            this.mDriverTypeText = new Text(generalComposite, SWT.BORDER | SWT.READ_ONLY);
            this.mDriverTypeText.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
        }
        {
            final Composite composite_1 = new Composite(jarListComposite, SWT.NONE);
            GridData gridData = new GridData(GridData.FILL_BOTH | GridData.GRAB_VERTICAL);
            gridData.horizontalIndent = -5;
            gridData.horizontalSpan = 2;
            composite_1.setLayoutData(gridData);
            final GridLayout gridLayout_1 = new GridLayout();
            gridLayout_1.numColumns = 3;
            composite_1.setLayout(gridLayout_1);

            {
                final Label label1 = new Label(composite_1, SWT.NONE);
                label1.setText(DriverMgmtMessages.getString("EditDriverDialog.label.driverFileList")); //$NON-NLS-1$
                gridData = new GridData();
                gridData.horizontalSpan = 2;
                label1.setLayoutData(gridData);
            }

            {
                this.list = new List(composite_1, SWT.BORDER | SWT.H_SCROLL | SWT.V_SCROLL);
                final GridData gridData_1 = new GridData(GridData.FILL_BOTH);
                gridData_1.verticalSpan = 4;
                gridData_1.horizontalSpan = 2;
                this.list.setLayoutData(gridData_1);

                this.list.addSelectionListener(new SelectionListener() {

                    public void widgetSelected(SelectionEvent e) {
                        boolean enabled = (DriverDialog.this.list.getSelectionCount() > 0);
                        DriverDialog.this.mEditJar.setEnabled(enabled);
                        DriverDialog.this.mRemoveJar.setEnabled(enabled);
                    }

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

                });
                this.list.setEnabled(mIsEditable);
            }
            {
                this.mAddJar = new Button(composite_1, SWT.NONE);
                this.mAddJar.addSelectionListener(new SelectionAdapter() {

                    public void widgetSelected(SelectionEvent e) {
                        handleLocationBrowseButtonPressed();
                        updateJarList();
                    }
                });
                this.mAddJar.setLayoutData(new GridData(GridData.HORIZONTAL_ALIGN_FILL));
                this.mAddJar.setText(DriverMgmtMessages.getString("EditDriverDialog.button.addJar")); //$NON-NLS-1$
                this.mAddJar.setEnabled(mIsEditable);
            }
            {
                this.mEditJar = new Button(composite_1, SWT.NONE);
                this.mEditJar.addSelectionListener(new SelectionAdapter() {

                    public void widgetSelected(SelectionEvent e) {
                        if (DriverDialog.this.list.getSelectionCount() > 0) {
                            String selectedItem = DriverDialog.this.list
                                    .getItem(DriverDialog.this.list.getSelectionIndex());
                            handleLocationEditButtonPressed(selectedItem);
                            updateJarList();
                        }
                    }
                });
                this.mEditJar.setLayoutData(new GridData(GridData.HORIZONTAL_ALIGN_FILL));
                this.mEditJar.setText(DriverMgmtMessages.getString("EditDriverDialog.button.editJar")); //$NON-NLS-1$
                this.mEditJar.setEnabled(mIsEditable);
            }
            {
                this.mRemoveJar = new Button(composite_1, SWT.NONE);
                this.mRemoveJar.addSelectionListener(new SelectionAdapter() {

                    public void widgetSelected(SelectionEvent e) {
                        if (DriverDialog.this.list.getSelectionCount() > 0) {
                            String[] selected = DriverDialog.this.list.getSelection();
                            int selIndex = DriverDialog.this.list.getSelectionIndex();
                            for (int i = 0; i < selected.length; i++) {
                                DriverDialog.this.list.remove(selected[i]);
                            }
                            if (selIndex < DriverDialog.this.list.getItemCount() && selIndex > -1) {
                                DriverDialog.this.list.setSelection(selIndex);
                            } else if ((selIndex - 1) > -1) {
                                selIndex = selIndex - 1;
                                if (DriverDialog.this.list.getItem(selIndex) != null) {
                                    DriverDialog.this.list.setSelection(selIndex);
                                }
                            } else {
                                DriverDialog.this.mEditJar.setEnabled(false);
                                DriverDialog.this.mRemoveJar.setEnabled(false);
                            }
                            updateJarList();
                        }
                    }
                });
                this.mRemoveJar.setLayoutData(new GridData(GridData.HORIZONTAL_ALIGN_FILL));
                this.mRemoveJar.setText(DriverMgmtMessages.getString("EditDriverDialog.button.removeJar")); //$NON-NLS-1$
                this.mRemoveJar.setEnabled(mIsEditable);
            }
            {
                this.mClearAll = new Button(composite_1, SWT.NONE);
                this.mClearAll.setLayoutData(
                        new GridData(GridData.HORIZONTAL_ALIGN_FILL | GridData.VERTICAL_ALIGN_BEGINNING));
                this.mClearAll.setText(DriverMgmtMessages.getString("EditDriverDialog.button.clearAllJars")); //$NON-NLS-1$
                this.mClearAll.addSelectionListener(new SelectionAdapter() {

                    public void widgetSelected(SelectionEvent e) {
                        DriverDialog.this.list.removeAll();
                        updateJarList();
                    }
                });
                this.mClearAll.setEnabled(mIsEditable);
            }
        }

        final Composite composite_2 = new Composite(propertiesComposite, SWT.NONE);
        GridData gridData = new GridData(GridData.FILL_BOTH);
        gridData.horizontalIndent = -5;
        gridData.horizontalSpan = 2;
        composite_2.setLayoutData(gridData);
        final GridLayout gridLayout_2 = new GridLayout();
        gridLayout_2.numColumns = 1;
        composite_2.setLayout(gridLayout_2);

        final Label label3 = new Label(composite_2, SWT.NONE);
        label3.setText(DriverMgmtMessages.getString("EditDriverDialog.label.properties")); //$NON-NLS-1$
        gridData = new GridData();
        gridData.horizontalSpan = 2;
        label3.setLayoutData(gridData);

        {
            book = new PageBook(composite_2, SWT.BORDER);
            book.setLayoutData(new GridData(GridData.FILL_BOTH));
            PropertySheetPage page = new PropertySheetPage();
            page.createControl(book);
            if (mpsp != null) {
                mpsp.removeChangeListener(psetChangedListener);
            }
            mpsp = null;
            if (this.mPropertySet != null) {
                mpsp = new DriverPropertySourceProvider(this.mPropertySet, this.descriptor);
            } else {
                mpsp = new DriverPropertySourceProvider();
            }
            mpsp.addChangeListener(psetChangedListener);
            page.setPropertySourceProvider(mpsp);
            book.showPage(page.getControl());
            if (this.mPropertySet != null)
                page.selectionChanged(null, new StructuredSelection(this.mPropertySet));
            book.setEnabled(mIsEditable);
        }

        this.mDriverNameText.setEnabled(false);
        if (mTypeCombo != null) {
            if (mTypeFilter != null && mTreeViewer != null) {
                mTreeViewer.addFilter(mTypeFilter);
                mTypeCombo.setText(mTypeFilter.getCategoryDescriptor().getName());
            } else {
                mTypeCombo.select(0);
            }
            handleSelection();
        }
        if (mVendorCombo != null && mVendorCombo.getItemCount() > 0) {
            if (mVendorFilter != null && mTreeViewer != null) {
                mTreeViewer.addFilter(mVendorFilter);
                mVendorCombo.setText(mVendorFilter.getCategoryDescriptor().getName());
            } else {
                mVendorCombo.select(0);
            }
            handleVendorSelected();
        }

        if (!mInEdit) {
            setTitle(DriverMgmtMessages.getString("NewDriverDialog.title")); //$NON-NLS-1$
            setMessage(DriverMgmtMessages.getString("DriverDialog.DialogMessage")); //$NON-NLS-1$

            if (this.descriptor != null) {
                this.mDriverName = this.descriptor.getName();
            }
            String quickName = DriverMgmtMessages.format("DriverDialog.quickdriver.name", //$NON-NLS-1$
                    new String[] { this.mDriverName });
            if (this.descriptor != null && this.mTreeViewer != null) {
                mTreeViewer.setSelection(new StructuredSelection(this.descriptor), true);
                this.mDriverName = quickName;
                this.mDriverNameText.setText(this.mDriverName);
            } else if (this.descriptor != null) {
                updateFromDescriptor(descriptor);
                this.mDriverName = quickName;
                this.mDriverNameText.setText(this.mDriverName);
            }
            processEnabledStateForComposite(jarListComposite, false);
            processEnabledStateForComposite(propertiesComposite, false);

        } else {
            DriverInstance di = new DriverInstance(mInitialPropertySet);
            if (di != null) {
                this.mPropertySet = di.getPropertySet();
                this.descriptor = di.getTemplate();
                updateFromPropertySet();
                updatePropertyDescriptors();
            }
            setTitle(DriverMgmtMessages.getString("EditDriverDialog.title")); //$NON-NLS-1$
            setMessage(DriverMgmtMessages.getString("DriverDialog.EditDriver.message")); //$NON-NLS-1$
        }
        return area;
    }

    /* (non-Javadoc)
     * @see org.eclipse.jface.dialogs.TitleAreaDialog#createContents(org.eclipse.swt.widgets.Composite)
     */
    protected Control createContents(Composite parent) {
        Control dialogComposite = super.createContents(parent);

        // to fix NPE reported in bug 233518, this code was moved here so OK button has been created - BTF
        if (this.mOKButton != null || (this.mOKButton != null && !mIsEditable))
            this.mOKButton.setEnabled(false);
        return dialogComposite;
    }

    private Composite createComboComposite(Composite parent) {
        Composite comboComposite = new Composite(parent, SWT.NONE);
        comboComposite.setLayout(new GridLayout(2, false));
        GridData CCdata = new GridData();
        CCdata.horizontalAlignment = GridData.FILL;
        CCdata.horizontalSpan = 2;
        comboComposite.setLayoutData(CCdata);
        return comboComposite;
    }

    private class TextSorter extends AbstractInvertableTableSorter {

        private int mColumn = -1;

        public TextSorter(int column) {
            super();
            this.mColumn = column;
        }

        public int compare(Viewer viewer, Object e1, Object e2) {
            if (viewer instanceof TreeViewer) {
                TreeViewer tv = (TreeViewer) viewer;
                if (tv.getLabelProvider() instanceof DriverTreeTableLabelProvider) {
                    DriverTreeTableLabelProvider dtlp = (DriverTreeTableLabelProvider) tv.getLabelProvider();
                    String text1 = dtlp.getColumnText(e1, this.mColumn);
                    String text2 = dtlp.getColumnText(e2, this.mColumn);
                    return Collator.getInstance().compare(text1, text2);
                }
            }
            if (e1 instanceof CategoryDescriptor && e2 instanceof CategoryDescriptor) {
                String name1 = ((CategoryDescriptor) e1).getName();
                String name2 = ((CategoryDescriptor) e2).getName();
                return Collator.getInstance().compare(name1, name2);
            } else if (e1 instanceof TemplateDescriptor && e2 instanceof TemplateDescriptor) {
                String name1 = ((TemplateDescriptor) e1).getName();
                String name2 = ((TemplateDescriptor) e2).getName();
                return Collator.getInstance().compare(name1, name2);
            }
            return Collator.getInstance().compare((String) e1, (String) e2);
        }
    }

    public static TreeSortSelectionListener createTableColumn(TreeViewer viewer, String text, String tooltip,
            AbstractInvertableTableSorter sorter, int initialDirection, boolean keepDirection) {
        TreeColumn column = new TreeColumn(viewer.getTree(), SWT.LEFT);
        column.setText(text);
        column.setToolTipText(tooltip);
        return new TreeSortSelectionListener(viewer, column, sorter, initialDirection, keepDirection);
    }

    /*
     * Create the property sheet page
     * @param book
     * @return
     */
    protected IPage createDefaultPage(PageBook book) {
        PropertySheetPage page = new PropertySheetPage();
        page.createControl(book);
        return page;
    }

    /*
     * Is the property set valid?
     */
    private boolean isValid() {
        return isValid(false);
    }

    /*
     * Is the property set valid?
     */
    private boolean isValid(boolean inflag) {
        IPropertySet testSet = null;
        if (inflag == true && this.mPropertySet != null) {
            testSet = this.mPropertySet;
        } else if (this.descriptor != null) {
            testSet = createTestPSet();
        }
        if (testSet != null) {
            DriverValidator testValidator = new DriverValidator(this.descriptor, testSet);
            boolean flag = testValidator.isValid(false);
            if (!flag) {
                try {
                    setErrorMessage(testValidator.getMessage());
                    return flag;
                } catch (SWTException e) {
                    if (e.code == SWT.ERROR_WIDGET_DISPOSED) {
                        // move on... this is to get around a weird
                        // bug in the platform having to do with
                        // custom property descriptors 
                    } else
                        throw e;
                }
            } else
                try {
                    setErrorMessage(null);
                    return flag;
                } catch (SWTException e) {
                    if (e.code == SWT.ERROR_WIDGET_DISPOSED) {
                        // move on... this is to get around a weird
                        // bug in the platform having to do with
                        // custom property descriptors 
                    } else
                        throw e;
                }

            if (this.mOKButton != null && !this.mOKButton.isDisposed())
                this.mOKButton.setEnabled(flag);
        } else {
            if (this.mOKButton != null && !this.mOKButton.isDisposed())
                this.mOKButton.setEnabled(false);
            return false;
        }
        return true;
    }

    /*
     * Create a test set for validation
     */
    private IPropertySet createTestPSet() {
        String propIdPrefix = DriverMgmtMessages.getString("EditDriverDialog.text.id_test_prefix"); //$NON-NLS-1$
        String propId = propIdPrefix + this.mDriverName;
        IPropertySet testPropertySet = DriverManager.getInstance().createDefaultInstance(this.descriptor.getId());
        testPropertySet.setID(propId);

        Properties props = testPropertySet.getBaseProperties();
        if (props.getProperty(IDriverMgmtConstants.PROP_DEFN_JARLIST) != null) {
            String jarlist = props.getProperty(IDriverMgmtConstants.PROP_DEFN_JARLIST);
            this.mJarList = jarlist.trim();
        }

        testPropertySet.setName(this.mDriverName);
        props = new Properties();
        if (this.mJarList == null) {
            String jarList = DriverManager.getInstance().updatePluginJarList(this.descriptor);
            this.mJarList = jarList;
        }
        props.setProperty(IDriverMgmtConstants.PROP_DEFN_JARLIST, this.mJarList);

        IConfigurationElement[] templateprops = this.descriptor.getProperties();
        if (templateprops != null && templateprops.length > 0) {
            for (int i = 0; i < templateprops.length; i++) {
                IConfigurationElement prop = templateprops[i];

                String propid = prop.getAttribute("id"); //$NON-NLS-1$
                String propvalue = prop.getAttribute("value"); //$NON-NLS-1$

                IDriverValuesProvider driverValsProvider = null;
                IDriverValuesProvider overrideDriverValsProvider = null;

                OverrideTemplateDescriptor[] otds = null;

                if (descriptor != null) {

                    otds = OverrideTemplateDescriptor.getByDriverTemplate(descriptor.getId());
                    if (otds != null && otds.length > 0) {
                        overrideDriverValsProvider = otds[0].getValuesProviderClass();
                    }
                    driverValsProvider = (IDriverValuesProvider) descriptor.getValuesProviderClass();
                }

                boolean removeIt = false;
                if (driverValsProvider != null) {
                    String valsPropValue = driverValsProvider.createDefaultValue(propid);
                    if (valsPropValue != null) {
                        propvalue = valsPropValue;
                    }
                }
                if (overrideDriverValsProvider != null) {
                    String overrideValsPropValue = overrideDriverValsProvider.createDefaultValue(propid);
                    if (overrideValsPropValue != null) {
                        propvalue = overrideValsPropValue;
                    }
                }
                if (otds != null && otds.length > 0) {
                    String temp = otds[0].getPropertyValueFromId(propid);
                    if (temp != null && temp.length() > 0) {
                        propvalue = temp;
                    }
                    if (otds[0].getPropertyRemoveFlagFromID(propid)) {
                        removeIt = true;
                    }
                }
                if (this.mPropertySet != null && this.mPropertySet.getBaseProperties() != null) {
                    propvalue = this.mPropertySet.getBaseProperties().getProperty(propid);
                }
                if (propvalue == null) {
                    if (!removeIt)
                        props.setProperty(propid, propvalue == null ? new String() : propvalue);
                    else
                        props.remove(propid);
                }
                if (propvalue == null)
                    propvalue = ""; //$NON-NLS-1$
                props.setProperty(propid, propvalue);
            }
        }
        props.setProperty(IDriverMgmtConstants.PROP_DEFN_TYPE, this.descriptor.getId());
        testPropertySet.setBaseProperties(props);
        return testPropertySet;
    }

    /**
     * Return the property set
     */
    public IPropertySet getPropertySet() {
        return this.mPropertySet;
    }

    /**
     * Return the initial property set (used to cancel pending changes)
     */
    public IPropertySet getInitialPropertySet() {
        return this.mInitialPropertySet;
    }

    /*
     * Make sure the name isn't used already
     */
    private void validateName() {
        /*
         * Name is valid if:
         * 1) It's not null or an empty string
         * 2) If we're creating a new driver (i.e. !mInEdit),
         *       check name. If name brings back a driver, 
         *       check the IDs.
         * 3) If we're editing a new driver (i.e. mInEdit),
         *       if name stays same, we're ok. If name brings back
         *       a different driver, it's not ok.
         */

        boolean isOk = false;
        String testName = "";//$NON-NLS-1$
        if (this.mDriverName != null)
            testName = this.mDriverName.trim();
        else if (this.mDriverName == null) {
            return;
        }

        // changed the if slightly to fix BZ 176781 - BTF
        if (testName.trim().length() == 0 && this.mPropertySet != null) {
            String errorMessage = DriverMgmtMessages.getString("DriverValidator.msg.empty_name"); //$NON-NLS-1$
            this.setErrorMessage(errorMessage);
            return;
        }

        String propId = null;
        if (this.mPropertySet != null) {
            propId = this.mPropertySet.getID();
        }

        // Check to see if we got back something by name
        Object obj = DriverManager.getInstance().getDriverInstanceByName(testName);
        if (obj != null) {
            if (!mInEdit) {
                // creating new driver, name matches existing driver
                String errorMessage = DriverMgmtMessages.getString("NewDriverDialog.driverExistsWithName"); //$NON-NLS-1$
                try {
                    this.setErrorMessage(errorMessage);
                } catch (SWTException swt_e) {
                    // just in case the message widget is disposed, since we can't grab
                    // it directly
                }
                return;
            } else {
                // We're in edit mode and user cannot change the name so do nothing
                isOk = true;
            }
        } else if (obj == null) {
            isOk = true;
        }

        if (isOk && this.mTreeViewer != null && this.descriptor == null) {
            StructuredSelection selection = (StructuredSelection) DriverDialog.this.mTreeViewer.getSelection();
            if (selection != null && selection.getFirstElement() instanceof TemplateDescriptor) {
                TemplateDescriptor descriptor = (TemplateDescriptor) selection.getFirstElement();
                this.descriptor = descriptor;
            }
            isOk = isValid(true);
        } else if (this.descriptor != null) {
            isOk = isValid(true);
        }

        if (this.mOKButton != null && !this.mOKButton.isDisposed())
            this.mOKButton.setEnabled(isOk);
    }

    /*
     * (non-Javadoc)
     * 
     * @see org.eclipse.jface.dialogs.Dialog#createButtonsForButtonBar(org.eclipse.swt.widgets.Composite)
     */
    protected void createButtonsForButtonBar(Composite parent) {
        this.mOKButton = createButton(parent, IDialogConstants.OK_ID, IDialogConstants.OK_LABEL, true);
        createButton(parent, IDialogConstants.CANCEL_ID, IDialogConstants.CANCEL_LABEL, false);
    }

    /**
     * Set the instance
     * 
     * @param propset
     */
    public void setPropertySet(IPropertySet propset) {
        this.mPropertySet = propset;
        this.mInitialPropertySet = DuplicatePropertySet(propset);
    }

    public void setInitialTemplate(String templateID) {
        TemplateDescriptor td = TemplateDescriptor.getDriverTemplateDescriptor(templateID);
        if (td != null) {
            this.descriptor = td;
        }
    }

    /*
     * Duplicates the passed in property set
     * @param pset
     * @return
     */
    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;
    }

    /*
     * Open an appropriate directory browser
     */
    private void handleLocationBrowseButtonPressed() {
        FileDialog dialog = new FileDialog(getShell());
        dialog.setText(DriverMgmtMessages.getString("EditDriverDialog.title.filebrowse")); //$NON-NLS-1$

        String dirName = previouslyBrowsedDirectory;

        if (dirName.length() == 0) //$NON-NLS-1$
            dialog.setFilterPath(ResourcesPlugin.getWorkspace().getRoot().getLocation().toOSString());
        else {
            File path = new File(dirName);
            if (path.exists()) {
                dialog.setFilterPath(new Path(dirName).toOSString());
            } else {
                dialog.setFilterPath(new Path(System.getProperty("user.home")).toOSString());
            }
        }

        String selectedDirectory = dialog.open();
        if (selectedDirectory != null) {
            previouslyBrowsedDirectory = new Path(selectedDirectory).removeLastSegments(1).toOSString();
            this.list.add(selectedDirectory);
        }
    }

    /*
     * Update the jar list
     */
    private void updateJarList() {
        this.mJarList = createList(this.list.getItems());
        if (this.mPropertySet != null)
            this.mPropertySet.getBaseProperties().setProperty(IDriverMgmtConstants.PROP_DEFN_JARLIST,
                    this.mJarList);
        validateName();
        updatePropertyDescriptors();
        if (this.mJarList.trim().length() > 0) {
            this.mClearAll.setEnabled(true);
        } else {
            this.mClearAll.setEnabled(false);
        }
    }

    /*
     * Create a list from an array of strings
     * 
     * @param items
     * @return
     */
    private String createList(String[] items) {
        StringBuffer buffer = new StringBuffer();
        for (int i = 0; i < items.length; i++) {
            if (items[i] != null) {
                buffer.append(items[i]);
                if (i + 1 < items.length)
                    buffer.append(IDriverMgmtConstants.PATH_DELIMITER);
            }
        }
        return buffer.toString();
    }

    /*
     * Update property descriptors for the selected instance
     */
    private void updatePropertyDescriptors() {
        PropertySheetPage page = new PropertySheetPage();
        page.createControl(book);
        DriverPropertySourceProvider mpsp = null;
        if (this.mPropertySet != null && this.descriptor != null) {
            mpsp = new DriverPropertySourceProvider(this.mPropertySet, this.descriptor);
        } else {
            mpsp = new DriverPropertySourceProvider();
        }
        page.setPropertySourceProvider(mpsp);
        book.showPage(page.getControl());
        if (this.mPropertySet != null) {
            page.selectionChanged(null, new StructuredSelection(this.mPropertySet));
        }
    }

    private void updateFromDescriptor(TemplateDescriptor descriptor) {

        if (descriptor != null) {
            this.descriptor = descriptor;
            processEnabledStateForComposite(jarListComposite, true);
            processEnabledStateForComposite(propertiesComposite, true);
            this.mDriverTypeText.setText(DriverDialog.this.descriptor.getName());
            this.mPropertySet = null;
            this.mJarList = null;
            this.list.removeAll();
            if (!mInEdit) {
                this.mPropertySet = createTestPSet();
                this.mPropertySet.setName(descriptor.getName());
            }
            updateFromPropertySet();
            updatePropertyDescriptors();
            validateName();
            boolean isOk = isValid();
            if (this.mOKButton != null)
                this.mOKButton.setEnabled(isOk);
        } else {
            this.descriptor = null;
            this.mPropertySet = null;
            this.mJarList = null;
            this.mDriverName = "";
            this.mDriverTypeText.setText("");
            this.mDriverNameText.setText("");
            this.list.removeAll();
            updateJarList();
            updateFromPropertySet();
            updatePropertyDescriptors();
            validateName();
            boolean isOk = isValid();
            if (this.mOKButton != null)
                this.mOKButton.setEnabled(isOk);
        }
    }

    /*
     * Update the UI from the property set
     */
    private void updateFromPropertySet() {
        if (this.descriptor != null) {
            this.mDriverTypeText.setText(this.descriptor.getName());
            if (this.descriptor.getJarList() != null && this.descriptor.getJarList().length() > 0) {
                String[] jarListArray = parseString(this.descriptor.getJarList());
                this.list.removeAll();
                for (int i = 0; i < jarListArray.length; i++) {
                    this.list.add(jarListArray[i]);
                }
            }
        }

        if (mIsEditable) {
            mAddJar.setEnabled(true);
            mEditJar.setEnabled(false);
            mRemoveJar.setEnabled(false);
            mClearAll.setEnabled(false);
        }

        if (this.mPropertySet != null) {
            this.mDriverNameText.setText(this.mPropertySet.getName());
            this.mDriverName = this.mPropertySet.getName();

            String jarList = this.mPropertySet.getBaseProperties()
                    .getProperty(IDriverMgmtConstants.PROP_DEFN_JARLIST);
            this.mJarList = jarList;
            String[] jarListArray = parseString(jarList);
            this.list.removeAll();
            for (int i = 0; i < jarListArray.length; i++) {
                this.list.add(jarListArray[i]);
            }
            if (jarList != null && jarList.trim().length() > 0 && mIsEditable) {
                mClearAll.setEnabled(true);
            }
        } else {
            mAddJar.setEnabled(false);
        }

        isValid(true);
        if (this.mPropertySet != null)
            validateName();
    }

    /*
     * Parse a string into an array
     */
    private String[] parseString(String str_list) {
        StringTokenizer tk = new StringTokenizer(str_list, IDriverMgmtConstants.PATH_DELIMITER);
        String[] pieces = new String[tk.countTokens()];
        int index = 0;
        while (tk.hasMoreTokens())
            pieces[index++] = tk.nextToken();
        return pieces;
    }

    /*
     * Browse for a location, with the location passed in as the default
     */
    private void handleLocationEditButtonPressed(String editLocation) {
        FileDialog dialog = new FileDialog(getShell());
        dialog.setText(DriverMgmtMessages.getString("EditDriverDialog.title.filebrowse")); //$NON-NLS-1$

        String dirName = editLocation;

        dialog.setFileName(dirName);
        if (dirName.length() == 0) //$NON-NLS-1$
            dialog.setFilterPath(ResourcesPlugin.getWorkspace().getRoot().getLocation().toOSString());
        else {
            File path = new File(dirName);
            if (path.exists())
                dialog.setFilterPath(new Path(dirName).toOSString());
            else {
                dialog.setFilterPath(dirName);
            }
        }

        String selectedDirectory = dialog.open();
        if (selectedDirectory != null) {
            previouslyBrowsedDirectory = new Path(selectedDirectory).removeLastSegments(1).toOSString();
            this.list.remove(editLocation);
            this.list.add(selectedDirectory);

            if (this.list.getItemCount() > 1) {
                if (MessageDialog.openQuestion(this.getShell(),
                        DriverMgmtMessages.getString("EditDriverDialog.msg.updateAllJarsToSamePath.title"), //$NON-NLS-1$
                        DriverMgmtMessages
                                .getString("EditDriverDialog.msg.updateAllJarsToSamePath.message")) == true) { //$NON-NLS-1$
                    String[] items = this.list.getItems();

                    String separator = "\\";//$NON-NLS-1$
                    if (selectedDirectory.indexOf("/") > -1)//$NON-NLS-1$
                        separator = "/";//$NON-NLS-1$

                    int location = selectedDirectory.lastIndexOf(separator);
                    if (location > -1 && location < selectedDirectory.length() - 1) {
                        String path = selectedDirectory.substring(0, location);
                        for (int i = 0; i < items.length; i++) {
                            String directory = items[i];
                            if (!directory.equals(selectedDirectory)) {
                                int location2 = directory.lastIndexOf(separator);
                                String filename = directory;
                                if (location2 > -1 && location2 < directory.length() - 1) {
                                    filename = directory.substring(location2 + 1, directory.length());
                                }
                                String newdirectory = path + separator + filename;
                                this.list.remove(directory);
                                this.list.add(newdirectory);
                            }
                        }
                    }
                }
            }
        }
    }

    protected void okPressed() {

        if (!this.mInEdit) {
            if (this.descriptor != null) {
                String propId = DriverMgmtMessages.getString("NewDriverDialog.text.id_prefix") + this.mDriverName; //$NON-NLS-1$

                if (this.mPropertySet == null) {
                    DriverInstance newDriver = DriverManager.getInstance()
                            .createNewDriverInstance(this.descriptor.getId(), this.mDriverName.trim(), null);
                    this.mPropertySet = newDriver.getPropertySet();
                }
                this.mPropertySet.setID(propId);
            }
        }

        String propIdPrefix = DriverMgmtMessages.getString("EditDriverDialog.text.id_prefix"); //$NON-NLS-1$
        String propId = propIdPrefix + this.descriptor.getId() + "." + this.mDriverName; //$NON-NLS-1$
        //      String propId = propIdPrefix + this.mDriverName;
        if (this.mPropertySet == null) {
            this.mPropertySet = new PropertySetImpl(propId, this.mDriverName);
        } else {
            this.mPropertySet.setID(propId);
        }
        this.mPropertySet.setName(this.mDriverName);
        Properties props = new Properties();
        props.setProperty(IDriverMgmtConstants.PROP_DEFN_JARLIST, this.mJarList);

        IConfigurationElement[] templateprops = this.descriptor.getProperties();
        if (templateprops != null && templateprops.length > 0) {
            for (int i = 0; i < templateprops.length; i++) {
                IConfigurationElement prop = templateprops[i];
                String id = prop.getAttribute("id"); //$NON-NLS-1$
                String value = this.mPropertySet.getBaseProperties().getProperty(id);
                if (value == null) {
                    value = prop.getAttribute("value"); //$NON-NLS-1$
                    OverrideTemplateDescriptor[] otds = OverrideTemplateDescriptor
                            .getByDriverTemplate(this.descriptor.getId());
                    if (otds != null && otds.length > 0) {
                        boolean removetemp = otds[0].getPropertyRemoveFlagFromID(id);
                        if (removetemp)
                            continue;
                        String valuetemp = otds[0].getPropertyValueFromId(id);
                        if (valuetemp != null && valuetemp.length() > 0)
                            value = valuetemp;
                    }
                }
                props.setProperty(id, value);
            }
        }
        props.setProperty(IDriverMgmtConstants.PROP_DEFN_TYPE, this.descriptor.getId());
        this.mPropertySet.setBaseProperties(props);

        this.psetChangedListener = null;

        saveState();

        super.okPressed();
    }

    /**
     * Retrieve the selected instance
     * 
     * @return
     */
    public IPropertySet getSelectedDefinition() {
        return this.mPropertySet;
    }

    public void setHideDriverList(boolean flag) {
        this.hideDriverList = flag;
    }

    public boolean getHideDriverList() {
        return this.hideDriverList;
    }

    protected void configureShell(Shell newShell) {
        super.configureShell(newShell);

        int width = 600;
        int height = 500;

        if (!this.mInEdit)
            newShell.setText(DriverMgmtMessages.getString("NewDriverDialog.windowTitle")); //$NON-NLS-1$
        else
            newShell.setText(DriverMgmtMessages.getString("EditDriverDialog.windowTitle")); //$NON-NLS-1$

        IDialogSettings dset = ConnectivityUIPlugin.getDefault().getDialogSettings();
        if (dset != null) {
            IDialogSettings dSection = dset.getSection(MEMENTO_ROOT);
            if (dSection != null) {
                if (dSection.get(MEMENTO_DIALOG_SIZE_HEIGHT) != null
                        && dSection.get(MEMENTO_DIALOG_SIZE_HEIGHT).trim().length() > 0) {
                    height = dSection.getInt(MEMENTO_DIALOG_SIZE_HEIGHT);
                    width = dSection.getInt(MEMENTO_DIALOG_SIZE_WIDTH);
                }
            }
        }
        newShell.setSize(width, height);
        centerDialog(newShell);
    }

    /*
     * Center the dialog relative to its parent
     */
    private void centerDialog(Shell newShell) {
        Composite parent = newShell.getParent();
        Rectangle parentSize = parent.getBounds();
        Rectangle newShellSize = newShell.getBounds();

        int x, y;
        x = (parentSize.width - newShellSize.width) / 2 + parentSize.x;
        y = (parentSize.height - newShellSize.height) / 2 + parentSize.y;

        newShell.setLocation(new Point(x, y));
    }

    /*
     * Save the dialog settings
     */
    private void saveState() {
        IDialogSettings dset = ConnectivityUIPlugin.getDefault().getDialogSettings();
        if (dset != null) {
            IDialogSettings dSection = dset.getSection(MEMENTO_ROOT);
            if (dSection == null)
                dSection = dset.addNewSection(MEMENTO_ROOT);
            if (dSection != null) {
                Point size = getShell().getSize();
                dSection.put(MEMENTO_DIALOG_SIZE_HEIGHT, size.y);
                dSection.put(MEMENTO_DIALOG_SIZE_WIDTH, size.x);
            }
        }
    }

    public void setVendorFilter(DriverTreeFilter filter) {
        this.mViewerFilter = filter;
    }

    public void setTypeFilter(DriverTreeFilter filter) {
        this.mTypeFilter = filter;
    }

    public IContext getContext(Object target) {
        return contextProviderDelegate.getContext(target);
    }

    public int getContextChangeMask() {
        return contextProviderDelegate.getContextChangeMask();
    }

    public String getSearchExpression(Object target) {
        return contextProviderDelegate.getSearchExpression(target);
    }

    /**
      * Initializes the bounds (location, size) of the dialog.  This implementation adjusts the width of
      * the dialog so that the complete current message can be displayed.
      * </p>
      */
    protected void initializeBounds() {
        super.initializeBounds();

        Shell shell = getShell();
        Rectangle boundsRect = shell.getBounds();
        int dialogWidth = boundsRect.width;

        int preferredMsgAreaWidth = getPreferredMessageAreaWidth();
        int preferredDialogWidth = preferredMsgAreaWidth + 20; // add some dialog border width
        if (dialogWidth < preferredDialogWidth) {
            Rectangle newBoundsRect = new Rectangle(boundsRect.x, boundsRect.y, preferredDialogWidth,
                    boundsRect.height);
            Rectangle constrainedBoundsRect = getConstrainedShellBounds(newBoundsRect);
            shell.setBounds(constrainedBoundsRect);
        }
    }

    /**
     * Gets the preferred width for the message area.  The message area for a TitleAreaDialog is hard-coded 
     * to show only two lines for the message, so our preferred width is the width of the current message 
     * divided by two plus a "fudge factor" to account for the message image area and word-wrapping variances.
     *  
     * @return the preferred message area width
     */
    private int getPreferredMessageAreaWidth() {
        int msgWidth = 0;

        Control dialogArea = getDialogArea();
        if (dialogArea != null) {
            GC gc = new GC(dialogArea);
            String dialogMessage = DriverMgmtMessages.getString("DriverDialog.DialogMessage");
            Point strExtent = gc.stringExtent(dialogMessage);
            int strWidth = strExtent.x;
            gc.dispose();
            msgWidth = (strWidth / 2) + 100; // add fudge factor
        }

        return msgWidth;
    }
}