blob: af98f014c18bbab505ec5db75f02ce489b7f8e09 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2004-2008 Sybase, Inc.
*
* 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
******************************************************************************/
package org.eclipse.datatools.connectivity.internal.ui.dialogs;
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.IDriverValuesProvider;
import org.eclipse.datatools.connectivity.drivers.IPropertySet;
import org.eclipse.datatools.connectivity.drivers.models.CategoryDescriptor;
import org.eclipse.datatools.connectivity.drivers.models.DriversProvider;
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.DriverTreeContentProvider;
import org.eclipse.datatools.connectivity.internal.ui.DriverTreeFilter;
import org.eclipse.datatools.connectivity.internal.ui.DriverTreeLabelProvider;
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.TitleAreaDialog;
import org.eclipse.jface.viewers.DoubleClickEvent;
import org.eclipse.jface.viewers.IDoubleClickListener;
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.swt.SWT;
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.SelectionEvent;
import org.eclipse.swt.events.SelectionListener;
import org.eclipse.swt.graphics.Font;
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.Composite;
import org.eclipse.swt.widgets.Control;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.swt.widgets.Text;
/**
* Driver to add a new instance of a driver template.
*
* @author brianf
*/
public class NewDriverDialog extends TitleAreaDialog {
// Memento flags
public final static String MEMENTO_ROOT = "Drivers New 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$
public final static String MEMENTO_DIALOG_EDIT_IMMEDIATELY = "Edit Immediately";//$NON-NLS-1$
// local shell
private Shell shell;
// ui elements
private TreeViewer mTreeViewer;
private Text mDriverNameText;
private Button mEditImmediatelyButton;
private Button mOKButton;
// tree filter
private DriverTreeFilter mViewerFilter;
// template descriptor
private TemplateDescriptor mDriverTemplateDescriptor = null;
// driver instance
private IPropertySet mPropertySet = null;
// new driver name
private String mDriverName;
// flag indicating whether we should edit the new
// instance immediately or not.
// NOTE: this flag only remembers user's choice, so when the driver don't support
// editImmediately, we won't change this flag.
private boolean mEditImmediately = true;
private String mErrorMessage = null;
private ContextProviderDelegate contextProviderDelegate =
new ContextProviderDelegate(ConnectivityUIPlugin.getDefault().getBundle().getSymbolicName());
/**
* Constructor
*
* @param parentShell
*/
public NewDriverDialog(Shell parentShell) {
super(parentShell);
this.setShellStyle(getShellStyle() | SWT.RESIZE | SWT.DIALOG_TRIM);
}
/**
* Constructor
*
* @param parentShell
* @param category
*/
public NewDriverDialog(Shell parentShell, String category) {
this(parentShell);
if (CategoryDescriptor.getCategoryDescriptor(category) != null) {
this.mViewerFilter = new DriverTreeFilter();
this.mViewerFilter.setCategoryId(category);
}
}
/*
* (non-Javadoc)
*
* @see org.eclipse.jface.dialogs.Dialog#createDialogArea(org.eclipse.swt.widgets.Composite)
*/
protected Control createDialogArea(Composite parent) {
getShell().setData( HelpUtil.CONTEXT_PROVIDER_KEY, this);
HelpUtil.setHelp( getShell(),
HelpUtil.getContextId(IHelpConstants.CONTEXT_ID_NEW_DRIVER_DIALOG,
ConnectivityUIPlugin.getDefault().getBundle().getSymbolicName()));
Font font = parent.getFont();
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) {
saveState();
}});
Label label = new Label(contents, 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);
label.setFont(font);
this.mTreeViewer = new TreeViewer(contents, SWT.BORDER);
data = new GridData(GridData.FILL_HORIZONTAL | GridData.FILL_VERTICAL);
this.mTreeViewer.getTree().setLayoutData(data);
this.mTreeViewer.getTree().setFont(font);
this.mTreeViewer
.setContentProvider(new DriverTreeContentProvider(true));
this.mTreeViewer.setLabelProvider(new DriverTreeLabelProvider());
if (this.mViewerFilter != null) {
this.mTreeViewer.addFilter(this.mViewerFilter);
}
this.mTreeViewer.setInput(DriversProvider.getInstance());
this.mTreeViewer.expandToLevel(3);
this.mTreeViewer
.addSelectionChangedListener(new ISelectionChangedListener() {
public void selectionChanged(SelectionChangedEvent event) {
StructuredSelection selection = (StructuredSelection) NewDriverDialog.this.mTreeViewer
.getSelection();
if (selection.getFirstElement() instanceof TemplateDescriptor) {
TemplateDescriptor descriptor = (TemplateDescriptor) selection
.getFirstElement();
String name = descriptor.getDefaultDefinitionName();
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();
}
if (driverValsProvider != null) {
String driverValsName = driverValsProvider.createDefaultValue(IDriverValuesProvider.VALUE_NAME);
if (driverValsName != null) {
name = driverValsName;
}
String driverValsDefaultDefinitionName = driverValsProvider.createDefaultValue(IDriverValuesProvider.VALUE_DEFAULT_DEFINITION_NAME);
if (driverValsDefaultDefinitionName != null) {
name = driverValsDefaultDefinitionName;
}
}
if (overrideDriverValsProvider != null) {
String overrideDriverValsName = overrideDriverValsProvider.createDefaultValue(IDriverValuesProvider.VALUE_NAME);
if (overrideDriverValsName != null) {
name = overrideDriverValsName;
}
String overrideDriverValsDefaultDefinitionName = overrideDriverValsProvider.createDefaultValue(IDriverValuesProvider.VALUE_DEFAULT_DEFINITION_NAME);
if (overrideDriverValsDefaultDefinitionName != null) {
name = overrideDriverValsDefaultDefinitionName;
}
}
NewDriverDialog.this.mDriverNameText
.setText(name);
NewDriverDialog.this.mDriverTemplateDescriptor = descriptor;
// NewDriverDialog.this.mOKButton.setEnabled(true);
if (!needEditImmediately(descriptor)) {
NewDriverDialog.this.mEditImmediatelyButton.setEnabled(false);
NewDriverDialog.this.mEditImmediatelyButton.setSelection(false);
}
else {
NewDriverDialog.this.mEditImmediatelyButton.setEnabled(true);
NewDriverDialog.this.mEditImmediatelyButton.setSelection(mEditImmediately);
}
}
// else {
// NewDriverDialog.this.mOKButton.setEnabled(false);
// }
validateName();
}
});
this.mTreeViewer.addDoubleClickListener( new IDoubleClickListener() {
public void doubleClick(DoubleClickEvent event) {
StructuredSelection selection = (StructuredSelection) NewDriverDialog.this.mTreeViewer
.getSelection();
if (selection.getFirstElement() instanceof TemplateDescriptor) {
if (NewDriverDialog.this.mErrorMessage == null)
okPressed();
}
}
});
label = new Label(contents, SWT.NONE);
label.setText(DriverMgmtMessages
.getString("NewDriverDialog.label.driverNameText")); //$NON-NLS-1$
this.mDriverNameText = new Text(contents, SWT.BORDER);
this.mDriverNameText.setLayoutData(new GridData(
GridData.FILL_HORIZONTAL));
this.mDriverNameText.addModifyListener(new ModifyListener() {
public void modifyText(ModifyEvent e) {
NewDriverDialog.this.mDriverName = NewDriverDialog.this.mDriverNameText
.getText();
validateName();
}
});
this.mEditImmediatelyButton = new Button(contents, SWT.CHECK);
this.mEditImmediatelyButton.setText(DriverMgmtMessages
.getString("NewDriverDialog.button.edit_immediately"));//$NON-NLS-1$
this.mEditImmediatelyButton.setSelection(true);
this.mEditImmediatelyButton
.addSelectionListener(new SelectionListener() {
public void widgetSelected(SelectionEvent e) {
NewDriverDialog.this.mEditImmediately = NewDriverDialog.this.mEditImmediatelyButton
.getSelection();
}
public void widgetDefaultSelected(SelectionEvent e) {
widgetSelected(e);
}
});
setTitle(DriverMgmtMessages.getString("NewDriverDialog.title")); //$NON-NLS-1$
setMessage(DriverMgmtMessages.getString("NewDriverDialog.message")); //$NON-NLS-1$
getEditImmediatelyState();
this.mEditImmediatelyButton.setSelection(this.mEditImmediately);
return area;
}
private void validateName() {
boolean isOk = false;
String testName = this.mDriverName;
Object obj = DriverManager.getInstance().getDriverInstanceByName(
testName);
if (obj == null) {
isOk = true;
this.setErrorMessage(null);
this.mErrorMessage = null;
}
else {
isOk = false;
String errorMessage = DriverMgmtMessages
.getString("NewDriverDialog.driverExistsWithName"); //$NON-NLS-1$
this.setErrorMessage(errorMessage);
this.mErrorMessage = errorMessage;
}
if (testName != null
&& (testName.startsWith(" ") || testName.endsWith(" "))) { //$NON-NLS-1$ //$NON-NLS-2$
isOk = false;
String errorMessage = DriverMgmtMessages
.getString("NewDriverDialog.driverNameNoSpaces"); //$NON-NLS-1$
this.setErrorMessage(errorMessage);
this.mErrorMessage = errorMessage;
}
StructuredSelection selection = (StructuredSelection) NewDriverDialog.this.mTreeViewer
.getSelection();
boolean isOkSelection = false;
if (selection.getFirstElement() instanceof TemplateDescriptor) {
isOkSelection = true;
}
else {
isOkSelection = false;
}
this.mOKButton.setEnabled(isOk && isOkSelection);
}
/*
* (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);
this.mOKButton.setEnabled(false);
createButton(parent, IDialogConstants.CANCEL_ID,
IDialogConstants.CANCEL_LABEL, false);
}
/*
* (non-Javadoc)
*
* @see org.eclipse.jface.window.Window#configureShell(org.eclipse.swt.widgets.Shell)
*/
protected void configureShell(Shell newShell) {
super.configureShell(newShell);
this.shell = newShell;
int width = 400;
int height = 500;
newShell.setText(DriverMgmtMessages
.getString("NewDriverDialog.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);
}
}
}
this.shell.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));
}
/**
* Return the state of the edit immediately.
*
* @return
*/
public boolean getEditImmediately() {
return this.mEditImmediately;
}
/**
* Return the template descriptor.
*
* @return
*/
public TemplateDescriptor getDriverTypeDescriptor() {
return this.mDriverTemplateDescriptor;
}
/**
* Return the driver instance.
*
* @return
*/
public IPropertySet getNewDriverInstance() {
return this.mPropertySet;
}
/*
* (non-Javadoc)
*
* @see org.eclipse.jface.dialogs.Dialog#okPressed()
*/
protected void okPressed() {
if (this.mDriverTemplateDescriptor != null) {
String propId = DriverMgmtMessages
.getString("NewDriverDialog.text.id_prefix") + this.mDriverName; //$NON-NLS-1$
if (this.mPropertySet == null) {
DriverInstance newDriver =
DriverManager.getInstance().createNewDriverInstance(this.mDriverTemplateDescriptor.getId(),
this.mDriverName.trim(), null);
this.mPropertySet = newDriver.getPropertySet();
}
this.mPropertySet.setID(propId);
}
// after saveState, user's choice of "edit immediately" has been saved,
// we reset this flag to the current selection's corresponding state, so
// getEditImmediately() will return correct value.
mEditImmediately = mEditImmediatelyButton.getSelection();
super.okPressed();
}
/* (non-Javadoc)
* @see org.eclipse.jface.dialogs.Dialog#cancelPressed()
*/
protected void cancelPressed() {
if (this.mPropertySet != null) {
// just make sure that the marker is removed
DriverValidator.removeOldProblemMarkers(this.mPropertySet.getName());
}
super.cancelPressed();
}
/**
* Return the category descriptor
*
* @return
*/
public CategoryDescriptor getCategoryDescriptor() {
if (this.mDriverTemplateDescriptor != null) {
CategoryDescriptor category = CategoryDescriptor
.getCategoryDescriptor(this.mDriverTemplateDescriptor
.getParentCategory());
return category;
}
return null;
}
/*
* Save the property sets
*/
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);
dSection.put(MEMENTO_DIALOG_EDIT_IMMEDIATELY,
this.mEditImmediately);
}
}
}
/*
* Return the state of the edit immediately state from the dialog settings.
*/
private void getEditImmediatelyState() {
IDialogSettings dset = ConnectivityUIPlugin.getDefault()
.getDialogSettings();
if (dset != null) {
IDialogSettings dSection = dset.getSection(MEMENTO_ROOT);
if (dSection != null) {
if (dSection.get(MEMENTO_DIALOG_EDIT_IMMEDIATELY) != null) {
this.mEditImmediately = dSection
.getBoolean(MEMENTO_DIALOG_EDIT_IMMEDIATELY);
}
}
}
}
protected boolean needEditImmediately(TemplateDescriptor descriptor) {
return !descriptor.getEmptyJarListIsOKFlag() || descriptor.hasVisibleProperties();
}
public IContext getContext(Object target) {
return contextProviderDelegate.getContext(target);
}
public int getContextChangeMask() {
return contextProviderDelegate.getContextChangeMask();
}
public String getSearchExpression(Object target) {
return contextProviderDelegate.getSearchExpression(target);
}
}