package org.teiid.designer.runtime.ui.connection;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.Status;
import org.eclipse.jface.viewers.ISelectionChangedListener;
import org.eclipse.jface.viewers.SelectionChangedEvent;
import org.eclipse.jface.viewers.TreeSelection;
import org.eclipse.jface.viewers.TreeViewer;
import org.eclipse.jface.viewers.Viewer;
import org.eclipse.jface.viewers.ViewerFilter;
import org.eclipse.jface.viewers.ViewerSorter;
import org.eclipse.swt.SWT;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;
import org.eclipse.swt.widgets.Group;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.swt.widgets.Text;
import org.eclipse.ui.dialogs.ElementTreeSelectionDialog;
import org.teiid.designer.runtime.DqpPlugin;
import org.teiid.designer.runtime.spi.ITeiidDataSource;
import org.teiid.designer.runtime.spi.ITeiidServer;
import org.teiid.designer.runtime.ui.DqpUiConstants;
import org.teiid.designer.runtime.ui.views.TeiidServerContentProvider;
import org.teiid.designer.runtime.ui.views.TeiidServerLabelProvider;
import org.teiid.designer.ui.common.util.WidgetFactory;
import org.teiid.designer.ui.common.widget.MessageLabel;
import org.teiid.designer.vdb.Vdb;
/**
* Provides dialog for selecting a JNDI Data Source from existing Teiid Instances.
*
* @since 8.0
*/
public class SelectJndiDataSourceDialog extends ElementTreeSelectionDialog implements ISelectionChangedListener {
private static final String DEFAULT_TITLE = DqpUiConstants.UTIL.getString("SelectJndiDataSourceDialog.title"); //$NON-NLS-1$
private static final String DEFAULT_MESSAGE = DqpUiConstants.UTIL.getString("SelectJndiDataSourceDialog.defaultMessage"); //$NON-NLS-1$
private static final String UNDEFINED = DqpUiConstants.UTIL.getString("SelectJndiDataSourceDialog.undefined"); //$NON-NLS-1$
private Text dataSourceNameText;
private MessageLabel statusMessageLabel;
private ITeiidDataSource selectedDataSource;
public SelectJndiDataSourceDialog( Shell parent ) {
super(parent, new TeiidServerLabelProvider(), new TeiidServerContentProvider(false, false, true));
setTitle(DEFAULT_TITLE);
setMessage(DEFAULT_MESSAGE);
setInput(DqpPlugin.getInstance().getServerManager());
setAllowMultiple(false);
}
@Override
protected Control createDialogArea( Composite parent ) {
Composite panel = new Composite(parent, SWT.NONE);
panel.setLayout(new GridLayout());
GridData panelData = new GridData(GridData.FILL_BOTH);
panel.setLayoutData(panelData);
Group selectedGroup = WidgetFactory.createGroup(panel, "Selected JNDI Data Source", GridData.FILL_HORIZONTAL, 1, 2); //$NON-NLS-1$
this.dataSourceNameText = WidgetFactory.createTextField(selectedGroup, GridData.FILL_HORIZONTAL, UNDEFINED);
GridData data = new GridData(GridData.FILL_HORIZONTAL);
data.heightHint = convertHeightInCharsToPixels(1);
this.dataSourceNameText.setLayoutData(data);
this.dataSourceNameText.setEditable(false);
this.dataSourceNameText.setBackground(panel.getBackground());
this.dataSourceNameText.setText(UNDEFINED);
super.createDialogArea(panel);
this.statusMessageLabel = new MessageLabel(panel);
GridData statusData = new GridData(GridData.FILL_HORIZONTAL);
data.heightHint = convertHeightInCharsToPixels(1);
this.statusMessageLabel.setLayoutData(statusData);
this.statusMessageLabel.setEnabled(false);
this.statusMessageLabel.setText(UNDEFINED);
getTreeViewer().expandToLevel(3);
return panel;
}
/**
* {@inheritDoc}
*
* @see org.eclipse.ui.dialogs.ElementTreeSelectionDialog#createTreeViewer(org.eclipse.swt.widgets.Composite)
*/
@Override
protected TreeViewer createTreeViewer( Composite parent ) {
TreeViewer viewer = super.createTreeViewer(parent);
viewer.addSelectionChangedListener(this);
viewer.getTree().setEnabled(true);
viewer.setSorter(new ViewerSorter());
viewer.setFilters(new ViewerFilter[] { new ViewerFilter() {
@Override
public boolean select( Viewer viewer,
Object parentElement,
Object element ) {
if (element instanceof ITeiidServer) {
return element.equals(DqpPlugin.getInstance().getServerManager().getDefaultServer());
}
return true;
}
}, new ViewerFilter() {
@Override
public boolean select( Viewer viewer,
Object parentElement,
Object element ) {
if (element instanceof ITeiidDataSource) {
String name = ((ITeiidDataSource)element).getName();
return !name.startsWith(Vdb.PREVIEW_PREFIX);
}
return true;
}
} });
return viewer;
}
@Override
public void selectionChanged( SelectionChangedEvent event ) {
TreeSelection selection = (TreeSelection)event.getSelection();
if (selection.isEmpty()) {
this.selectedDataSource = null;
this.dataSourceNameText.setText(UNDEFINED);
updateOnSelection(null);
return;
}
Object firstElement = selection.getFirstElement();
if (!(firstElement instanceof ITeiidDataSource)) {
this.selectedDataSource = null;
this.dataSourceNameText.setText(UNDEFINED);
} else {
this.selectedDataSource = (ITeiidDataSource)selection.getFirstElement();
this.dataSourceNameText.setText(selectedDataSource.getName());
}
updateOnSelection(firstElement);
}
private void updateOnSelection( Object selectedObject ) {
IStatus status = new Status(IStatus.INFO,
DqpUiConstants.PLUGIN_ID,
DqpUiConstants.UTIL.getString("SelectJndiDataSourceDialog.okSelectionMessage")); //$NON-NLS-1$
if (selectedObject != null) {
if (!(selectedObject instanceof ITeiidDataSource)) {
status = new Status(IStatus.ERROR,
DqpUiConstants.PLUGIN_ID,
DqpUiConstants.UTIL.getString("SelectJndiDataSourceDialog.invalidSelectionMessage")); //$NON-NLS-1$
getOkButton().setEnabled(false);
} else {
getOkButton().setEnabled(true);
}
} else {
status = new Status(IStatus.ERROR,
DqpUiConstants.PLUGIN_ID,
DqpUiConstants.UTIL.getString("SelectJndiDataSourceDialog.invalidSelectionMessage")); //$NON-NLS-1$
getOkButton().setEnabled(false);
}
this.statusMessageLabel.setErrorStatus(status);
}
/**
* Returns the current TeiidDataSource
*
* @return the TeiidDataSource. may return null
*/
public ITeiidDataSource getSelectedTranslator() {
return this.selectedDataSource;
}
}