### Eclipse Workspace Patch 1.0 #P org.teiid.designer.dqp.ui Index: src/org/teiid/designer/runtime/ui/connection/VdbSourceConnectionHandler.java =================================================================== --- src/org/teiid/designer/runtime/ui/connection/VdbSourceConnectionHandler.java (revision 1634) +++ src/org/teiid/designer/runtime/ui/connection/VdbSourceConnectionHandler.java (working copy) @@ -7,6 +7,8 @@ */ package org.teiid.designer.runtime.ui.connection; +import static com.metamatrix.modeler.dqp.ui.DqpUiConstants.UTIL; + import java.util.ArrayList; import java.util.Collection; import java.util.Properties; @@ -14,8 +16,8 @@ import org.eclipse.core.runtime.IStatus; import org.eclipse.jface.action.Action; import org.eclipse.jface.action.IAction; -import org.eclipse.jface.dialogs.Dialog; import org.eclipse.jface.viewers.IStructuredSelection; +import org.eclipse.jface.window.Window; import org.eclipse.swt.widgets.Display; import org.teiid.designer.runtime.ExecutionAdmin; import org.teiid.designer.runtime.Server; @@ -32,12 +34,9 @@ import com.metamatrix.modeler.core.ModelerCore; import com.metamatrix.modeler.core.workspace.ModelWorkspaceException; import com.metamatrix.modeler.dqp.DqpPlugin; -import com.metamatrix.modeler.dqp.ui.DqpUiConstants; -import com.metamatrix.modeler.dqp.ui.DqpUiPlugin; /** - * Implements the SourceHandler interface which provides the VDB Editor the ability to access DQP-related connection - * info. + * Implements the SourceHandler interface which provides the VDB Editor the ability to access DQP-related connection info. * */ public class VdbSourceConnectionHandler implements SourceHandler { @@ -52,27 +51,28 @@ private static boolean initialized = false; static String getString( final String stringId ) { - return DqpUiConstants.UTIL.getString(PREFIX + stringId); + return UTIL.getString(PREFIX + stringId); } @Override - public VdbSourceConnection ensureVdbSourceConnection ( - String sourceModelname, Properties properties) throws Exception { + public VdbSourceConnection ensureVdbSourceConnection( String sourceModelname, + Properties properties ) throws Exception { CoreArgCheck.isNotNull(properties, "properties"); //$NON-NLS-1$ ModelConnectionMapper mapper = new ModelConnectionMapper(sourceModelname, properties); VdbSourceConnection vdbSourceConnection = null; - ExecutionAdmin defaultAdmin = DqpPlugin.getInstance().getServerManager().getDefaultServer().getAdmin(); + ExecutionAdmin defaultAdmin = getDefaultServer().getAdmin(); String uuid = ModelerCore.workspaceUuid().toString(); try { vdbSourceConnection = mapper.getVdbSourceConnection(defaultAdmin, uuid); } catch (ModelWorkspaceException e) { - DqpUiPlugin.UTIL.log(IStatus.ERROR, e, - DqpUiConstants.UTIL.getString("VdbSourceConnectionHandler.Error_could_not_find_source_connection_info_for_{0}_model", sourceModelname)); //$NON-NLS-1$ + UTIL.log(IStatus.ERROR, + e, + UTIL.getString("VdbSourceConnectionHandler.Error_could_not_find_source_connection_info_for_{0}_model", sourceModelname)); //$NON-NLS-1$ } // TODO: vdbSourceConnection may be NULL, so query the user for translator name & jndi name @@ -85,7 +85,7 @@ if( !initialized ) { initialize(); } - Server defServer = DqpPlugin.getInstance().getServerManager().getDefaultServer(); + Server defServer = getDefaultServer(); if( defServer == null || !defServer.isConnected() ) { return null; } @@ -141,20 +141,21 @@ SelectJndiDataSourceDialog dialog = new SelectJndiDataSourceDialog(Display.getCurrent().getActiveShell()); TeiidDataSource initialSelection = null; - Server defServer = DqpPlugin.getInstance().getServerManager().getDefaultServer(); + Server defServer = getDefaultServer(); if( defServer != null && defServer.isConnected() ) { try { initialSelection = defServer.getAdmin().getDataSource(jndiName); } catch (Exception e) { - DqpUiPlugin.UTIL.log(IStatus.ERROR, e, - DqpUiConstants.UTIL.getString("VdbSourceConnectionHandler.Error_could_not_find_data_source_for_name", jndiName)); //$NON-NLS-1$ + UTIL.log(IStatus.ERROR, + e, + UTIL.getString("VdbSourceConnectionHandler.Error_could_not_find_data_source_for_name", jndiName)); //$NON-NLS-1$ } dialog.setInitialSelection(initialSelection); } dialog.open(); - if( dialog.getReturnCode() == Dialog.OK) { + if (dialog.getReturnCode() == Window.OK) { Object result = dialog.getFirstResult(); if( result != null && result instanceof TeiidDataSource) { vdbModelEntry.setJndiName(((TeiidDataSource)result).getName()); @@ -188,20 +189,21 @@ SelectTranslatorDialog dialog = new SelectTranslatorDialog(Display.getCurrent().getActiveShell()); TeiidTranslator initialSelection = null; - Server defServer = DqpPlugin.getInstance().getServerManager().getDefaultServer(); + Server defServer = getDefaultServer(); if( defServer != null && defServer.isConnected() ) { try { initialSelection = defServer.getAdmin().getTranslator(transName); } catch (Exception e) { - DqpUiPlugin.UTIL.log(IStatus.ERROR, e, - DqpUiConstants.UTIL.getString("VdbSourceConnectionHandler.Error_could_not_find_translator_for_name", transName)); //$NON-NLS-1$ + UTIL.log(IStatus.ERROR, + e, + UTIL.getString("VdbSourceConnectionHandler.Error_could_not_find_translator_for_name", transName)); //$NON-NLS-1$ } dialog.setInitialSelection(initialSelection); } dialog.open(); - if( dialog.getReturnCode() == Dialog.OK) { + if (dialog.getReturnCode() == Window.OK) { Object result = dialog.getFirstResult(); if( result != null && result instanceof TeiidTranslator) { vdbModelEntry.setTranslator(((TeiidTranslator)result).getName()); @@ -211,5 +213,76 @@ } } - + /** + * {@inheritDoc} + * + * @see org.teiid.designer.vdb.connections.SourceHandler#getDataSourceNames() + */ + @Override + public String[] getDataSourceNames() { + Server defaultServer = getDefaultServer(); + + if ((defaultServer != null) && defaultServer.isConnected()) { + Collection dataSources = null; + + try { + dataSources = defaultServer.getAdmin().getDataSources(); + } catch (Exception e) { + UTIL.log(IStatus.ERROR, + e, + UTIL.getString("VdbSourceConnectionHandler.errorObtainingDataSources", defaultServer.getTeiidAdminInfo().getURL())); //$NON-NLS-1$ + } + + if (dataSources != null) { + Collection dataSourceNames = new ArrayList(); + + for (TeiidDataSource dataSource : dataSources) { + dataSourceNames.add(dataSource.getName()); + } + + return dataSourceNames.toArray(new String[dataSourceNames.size()]); + } + } + + return null; + } + + Server getDefaultServer() { + return DqpPlugin.getInstance().getServerManager().getDefaultServer(); + } + + /** + * {@inheritDoc} + * + * @see org.teiid.designer.vdb.connections.SourceHandler#getTranslatorTypes() + */ + @Override + public String[] getTranslatorTypes() { + Server defaultServer = getDefaultServer(); + + if ((defaultServer != null) && defaultServer.isConnected()) { + Collection translators = null; + + try { + translators = defaultServer.getAdmin().getTranslators(); + } catch (Exception e) { + UTIL.log(IStatus.ERROR, + e, + UTIL.getString("VdbSourceConnectionHandler.errorObtainingTranslators", defaultServer.getTeiidAdminInfo().getURL())); //$NON-NLS-1$ + } + + if (translators != null) { + Collection translatorTypes = new ArrayList(); + + for (TeiidTranslator translator : translators) { + translatorTypes.add(translator.getName()); + } + + return translatorTypes.toArray(new String[translatorTypes.size()]); + } + } + + return null; + } + } #P org.teiid.designer.vdb Index: src/org/teiid/designer/vdb/connections/SourceHandler.java =================================================================== --- src/org/teiid/designer/vdb/connections/SourceHandler.java (revision 1634) +++ src/org/teiid/designer/vdb/connections/SourceHandler.java (working copy) @@ -27,7 +27,7 @@ * @return the vdb source connection object * @throws Exception */ - public VdbSourceConnection ensureVdbSourceConnection(String sourceModelName, Properties connectionProperties) throws Exception; + VdbSourceConnection ensureVdbSourceConnection(String sourceModelName, Properties connectionProperties) throws Exception; /** * Method provides a means for the VDB Editor to get actions associated or applicable to a given object. The original @@ -36,5 +36,16 @@ * @param iSelection * @return the list of applicable actions */ - public Object[] getApplicableActions(Object iSelection); + Object[] getApplicableActions( Object iSelection ); + + /** + * @return the data source names (can be null) + */ + String[] getDataSourceNames(); + + /** + * @return the translator types available on the current Teiid server that can be overridden (can be null or empty) + */ + String[] getTranslatorTypes(); + } #P org.teiid.designer.vdb.ui Index: src/com/metamatrix/modeler/vdb/ui/VdbUiConstants.java =================================================================== --- src/com/metamatrix/modeler/vdb/ui/VdbUiConstants.java (revision 1634) +++ src/com/metamatrix/modeler/vdb/ui/VdbUiConstants.java (working copy) @@ -8,6 +8,7 @@ package com.metamatrix.modeler.vdb.ui; import java.util.ResourceBundle; + import com.metamatrix.core.PluginUtil; import com.metamatrix.core.util.PluginUtilImpl; import com.metamatrix.ui.UiConstants; @@ -81,6 +82,14 @@ String REBUILD_VDB_ICON = CTOOL16 + "rebuild_vdb.gif"; //$NON-NLS-1$ String SYNCHRONIZE_MODELS_ICON = CVIEW16 + "synchronizemodels.gif"; //$NON-NLS-1$ String VISIBLE_ICON = CVIEW16 + "visible.gif"; //$NON-NLS-1$ + + String ADD_FILE = CTOOL16 + "add-file.png"; //$NON-NLS-1$ + String ADD_MODEL = CTOOL16 + "add-model.png"; //$NON-NLS-1$ + String ADD_ROLE = CTOOL16 + "add-role.png"; //$NON-NLS-1$ + String EDIT_ROLE = CTOOL16 + "edit-role.png"; //$NON-NLS-1$ + String REMOVE_FILE = CTOOL16 + "remove-file.png"; //$NON-NLS-1$ + String REMOVE_MODEL = CTOOL16 + "remove-model.png"; //$NON-NLS-1$ + String REMOVE_ROLE = CTOOL16 + "remove-role.png"; //$NON-NLS-1$ } /** Index: src/com/metamatrix/modeler/vdb/ui/i18n.properties =================================================================== --- src/com/metamatrix/modeler/vdb/ui/i18n.properties (revision 1634) +++ src/com/metamatrix/modeler/vdb/ui/i18n.properties (working copy) @@ -19,18 +19,15 @@ \n\nAdding models to this VDB will NOT automatically add permissions to these data roles.\ \n\nEdit each data role to add newly added model permissions. descriptionColumnName = Description -descriptionGroup = Description fileColumnName = File jndiNameColumnName = JNDI Name modelColumnName = Model -modelsGroup = Models -otherFilesGroup = Other Files pathColumnName = Path sourceNameColumnName = Source Name -dataPolicyGroup = VDB Data Roles dataPolicyName = Data Role synchronizationNotApplicableTooltip = This entry has no corresponding file in the workspace synchronizeAllButton = Synchronize All +synchronizeAllButtonToolTip = Synchronize all VDB entries with their corresponding workspace file synchronizedColumnName = Sync'd? synchronizedTooltip = This entry is synchronized with its corresponding file in the workspace unsynchronizedTooltip = Click this checkBox to synchronize this entry\nwith its corresponding file in the workspace @@ -40,6 +37,23 @@ notVisibleTooltip = This model's metadata contents are not visible to\nusers when viewing contents of VDB cloneDataRoleActionLabel=Clone Data Role cloneDataRoleAction.copySuffix=_COPY +addFileToolTip = Add file +addModelToolTip = Add model +addRoleToolTip = Add data role +editRoleToolTip = Edit selected data role +removeFileToolTip = Remove selected file(s) +removeModelToolTip = Remove selected model(s) +removeRoleToolTip = Remove selected data role(s) +rolesTab = Data Roles +rolesTabToolTip = The data roles defined in the VDB +descriptionTab = VDB Description +descriptionTabToolTip = The VDB description +modelsTab = Models +modelsTabToolTip = The models included in the VDB +filesTab = Other Files +filesTabToolTip = The non-model files included in the VDB +translatorOverridesTab = Translator Overrides +translatorOverridesTabToolTip = The translator overrides in the VDB NewVdbWizard.title = New VDB @@ -78,26 +92,6 @@ PasteInResourceAction.Error_executing_paste_in_resource_action_1=Error executing paste in resource action -VdbEditorWsdlPage.title = Web Services - -# Labels -VdbEditorWsdlPage.message = This VDB contains one or more Web Service models. The WSDL generated \ - for the VDB can be customized to specify the following information: -VdbEditorWsdlPage.disableMessage = This VDB contains no Web Service models. -VdbEditorWsdlPage.namespaceLabel = Target namespace URI for the WSDL: -VdbEditorWsdlPage.defaultNamespaceLabel = Default WSDL namespace: -VdbEditorWsdlPage.none = None -VdbEditorWsdlPage.viewWsdlMessage = Press the "Preview WSDL" button to display the WSDL file that will be generated for the VDB: -VdbEditorWsdlPage.viewWsdlButton = Preview WSDL... -VdbEditorWsdlPage.invalidUri = The value entered is not a valid URI -VdbEditorWsdlPage.WsdlDialog.title = Generated WSDL -VdbEditorWsdlPage.errorTitle = Error -VdbEditorWsdlPage.errorMessage = An error occurred. See the Message Log for details. -VdbEditorWsdlPage.readOnlyVDBDialogTitle=Read-Only VDB -VdbEditorWsdlPage.readOnlyVDBDialogMessage=Target namespace cannot be edited for a read-only VDB -VdbEditorWsdlPage.redoLabel=Redo WSDL URI -VdbEditorWsdlPage.undoLabel=Undo WSDL URI - NewVdbAction.noProjectTitle=No Open Projects NewVdbAction.noProjectMessage=You must create a project before you can create a VDB. NewVdbAction.noOpenProjectMessage=There are no open projects in your workspace. \nYou must open or create a project before you can create a VDB. Index: src/com/metamatrix/modeler/internal/vdb/ui/editor/VdbEditor.java =================================================================== --- src/com/metamatrix/modeler/internal/vdb/ui/editor/VdbEditor.java (revision 1634) +++ src/com/metamatrix/modeler/internal/vdb/ui/editor/VdbEditor.java (working copy) @@ -16,7 +16,10 @@ import java.beans.PropertyChangeEvent; import java.beans.PropertyChangeListener; import java.io.File; +import java.util.ArrayList; +import java.util.Arrays; import java.util.Collection; +import java.util.Collections; import java.util.HashSet; import java.util.List; import java.util.Set; @@ -40,10 +43,12 @@ import org.eclipse.jface.action.Action; import org.eclipse.jface.action.IAction; import org.eclipse.jface.action.MenuManager; -import org.eclipse.jface.dialogs.Dialog; import org.eclipse.jface.dialogs.MessageDialog; +import org.eclipse.jface.resource.ImageDescriptor; import org.eclipse.jface.text.DocumentEvent; import org.eclipse.jface.text.IDocumentListener; +import org.eclipse.jface.viewers.ColumnViewer; +import org.eclipse.jface.viewers.EditingSupport; import org.eclipse.jface.viewers.ISelectionChangedListener; import org.eclipse.jface.viewers.IStructuredSelection; import org.eclipse.jface.viewers.LabelProvider; @@ -56,10 +61,12 @@ import org.eclipse.jface.window.Window; import org.eclipse.jface.wizard.WizardDialog; import org.eclipse.swt.SWT; +import org.eclipse.swt.custom.CTabFolder; +import org.eclipse.swt.custom.CTabItem; +import org.eclipse.swt.custom.SashForm; import org.eclipse.swt.custom.ScrolledComposite; import org.eclipse.swt.events.SelectionAdapter; import org.eclipse.swt.events.SelectionEvent; -import org.eclipse.swt.graphics.GC; import org.eclipse.swt.graphics.Image; import org.eclipse.swt.layout.GridData; import org.eclipse.swt.layout.GridLayout; @@ -67,8 +74,6 @@ import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Control; import org.eclipse.swt.widgets.Display; -import org.eclipse.swt.widgets.Group; -import org.eclipse.swt.widgets.ScrollBar; import org.eclipse.ui.IEditorInput; import org.eclipse.ui.IEditorPart; import org.eclipse.ui.IEditorSite; @@ -83,8 +88,8 @@ import org.teiid.designer.vdb.Vdb; import org.teiid.designer.vdb.VdbDataRole; import org.teiid.designer.vdb.VdbEntry; -import org.teiid.designer.vdb.VdbModelEntry; import org.teiid.designer.vdb.VdbEntry.Synchronization; +import org.teiid.designer.vdb.VdbModelEntry; import org.teiid.designer.vdb.connections.SourceHandlerExtensionManager; import com.metamatrix.metamodels.core.ModelAnnotation; @@ -101,16 +106,18 @@ import com.metamatrix.modeler.ui.UiPlugin; import com.metamatrix.modeler.ui.viewsupport.ModelingResourceFilter; import com.metamatrix.modeler.vdb.ui.VdbUiConstants; +import com.metamatrix.modeler.vdb.ui.VdbUiConstants.Images; import com.metamatrix.modeler.vdb.ui.VdbUiPlugin; import com.metamatrix.ui.internal.util.UiUtil; import com.metamatrix.ui.internal.util.WidgetFactory; import com.metamatrix.ui.internal.util.WidgetUtil; +import com.metamatrix.ui.internal.widget.ButtonProvider; import com.metamatrix.ui.internal.widget.DefaultContentProvider; import com.metamatrix.ui.table.CheckBoxColumnProvider; import com.metamatrix.ui.table.DefaultTableProvider; -import com.metamatrix.ui.table.TableAndButtonsGroup; +import com.metamatrix.ui.table.ResourceEditingSupport; +import com.metamatrix.ui.table.TableAndToolBar; import com.metamatrix.ui.table.TextColumnProvider; -import com.metamatrix.ui.table.TableAndButtonsGroup.RemoveButtonProvider; import com.metamatrix.ui.text.StyledTextEditor; /** @@ -119,14 +126,8 @@ // TODO: read-only, undo/redo, function model 259 public final class VdbEditor extends EditorPart implements IResourceChangeListener { - private static final String DESCRIPTION_GROUP = i18n("descriptionGroup"); //$NON-NLS-1$ - private static final String MODELS_GROUP = i18n("modelsGroup"); //$NON-NLS-1$ - private static final String OTHER_FILES_GROUP = i18n("otherFilesGroup"); //$NON-NLS-1$ - private static final String DATA_POLICY_GROUP = i18n("dataPolicyGroup"); //$NON-NLS-1$ - static final String MODEL_COLUMN_NAME = i18n("modelColumnName"); //$NON-NLS-1$ static final String FILE_COLUMN_NAME = i18n("fileColumnName"); //$NON-NLS-1$ - static final String DATA_POLICY_COLUMN_NAME = i18n("dataPolicyName"); //$NON-NLS-1$ static final String PATH_COLUMN_NAME = i18n("pathColumnName"); //$NON-NLS-1$ static final String SYNCHRONIZED_COLUMN_NAME = i18n("synchronizedColumnName"); //$NON-NLS-1$ static final String VISIBLE_COLUMN_NAME = i18n("visibleColumnName"); //$NON-NLS-1$; @@ -153,25 +154,17 @@ static final String CONFIRM_REMOVE_IMPORTED_BY_MESSAGE = i18n("confirmRemoveImportedByMessage"); //$NON-NLS-1$ static final String INFORM_DATA_ROLES_ON_ADD_MESSAGE = i18n("informDataRolesExistOnAddMessage"); //$NON-NLS-1$ - - static final String SYNCHRONIZE_ALL_BUTTON = i18n("synchronizeAllButton"); //$NON-NLS-1$ - static final String COPY_SUFFIX = i18n("cloneDataRoleAction.copySuffix"); //$NON-NLS-1$ - static final String CLONE_DATA_ROLE_LABEL = i18n("cloneDataRoleActionLabel"); //$NON-NLS-1$ - static final String WEB_SERVICES_VIEW_MODEL_URI = "http://www.metamatrix.com/metamodels/WebService"; //$NON-NLS-1$ - private static String i18n( final String id ) { + static String i18n( final String id ) { return VdbUiConstants.Util.getString(id); } - Vdb vdb; + private Vdb vdb; StyledTextEditor textEditor; - @SuppressWarnings( "unchecked" ) - TableAndButtonsGroup modelsGroup; - @SuppressWarnings( "unchecked" ) - TableAndButtonsGroup otherFilesGroup; - @SuppressWarnings( "unchecked" ) - TableAndButtonsGroup dataRolesGroup; + TableAndToolBar modelsGroup; + TableAndToolBar otherFilesGroup; + TableAndToolBar dataRolesGroup; private Button synchronizeAllButton; private PropertyChangeListener vdbListener; @@ -181,95 +174,119 @@ boolean disposed = false; + private final TextColumnProvider descriptionColumnProvider = new TextColumnProvider() { /** - * Method which adds models to the VDB. + * {@inheritDoc} * - * @param models + * @see com.metamatrix.ui.table.ColumnProvider#getName() */ - public void addModels( final List models ) { - for (final Object model : models) - vdb.addModelEntry(((IFile)model).getFullPath(), new NullProgressMonitor()); + @Override + public String getName() { + return DESCRIPTION_COLUMN_NAME; + } - modelsGroup.getTable().getViewer().refresh(); + /** + * {@inheritDoc} + * + * @see com.metamatrix.ui.table.ColumnProvider#getImage() + */ + @Override + public Image getImage() { + return null; } /** * {@inheritDoc} * - * @see org.eclipse.ui.part.WorkbenchPart#createPartControl(org.eclipse.swt.widgets.Composite) + * @see com.metamatrix.ui.table.ColumnProvider#getValue(java.lang.Object) */ - @SuppressWarnings( "unchecked" ) @Override - public void createPartControl( final Composite parent ) { - // Compute height of description text area - // For some reason, this can't be less than 4, or the vertical scrollbar widgets never appear (at least on a OSX) - final GC gc = new GC(parent); - gc.setFont(parent.getFont()); - final int height = Dialog.convertHeightInCharsToPixels(gc.getFontMetrics(), 4); - gc.dispose(); - - // Insert a ScrolledComposite so controls don't disappear if the panel shrinks - final ScrolledComposite scroller = new ScrolledComposite(parent, SWT.V_SCROLL | SWT.H_SCROLL); - scroller.setLayout(new GridLayout()); - scroller.setExpandHorizontal(true); - scroller.setExpandVertical(true); - // Tweak the scroll bars to give better scrolling behavior: - ScrollBar bar = scroller.getHorizontalBar(); - if (bar != null) bar.setIncrement(height / 4); - bar = scroller.getVerticalBar(); - if (bar != null) bar.setIncrement(height / 4); - - final Composite pg = WidgetFactory.createPanel(scroller, SWT.NONE, GridData.FILL_BOTH, 1, 2); - scroller.setContent(pg); - - final Group group = WidgetFactory.createGroup(pg, DESCRIPTION_GROUP, GridData.FILL_HORIZONTAL, 2); - this.textEditor = new StyledTextEditor(group, SWT.MULTI | SWT.H_SCROLL | SWT.V_SCROLL | SWT.WRAP); - final GridData gridData = new GridData(GridData.FILL_BOTH); - gridData.horizontalSpan = 1; - gridData.heightHint = height; - gridData.minimumHeight = height; - this.textEditor.setLayoutData(gridData); - this.textEditor.setText(vdb.getDescription()); - this.textEditor.getDocument().addDocumentListener(new IDocumentListener() { + public String getValue( final VdbEntry element ) { + return element.getDescription(); + } - public void documentAboutToBeChanged( final DocumentEvent event ) { + /** + * {@inheritDoc} + * + * @see com.metamatrix.ui.table.DefaultColumnProvider#isEditable(java.lang.Object) + */ + @Override + public boolean isEditable( final VdbEntry element ) { + return true; } - public void documentChanged( final DocumentEvent event ) { - vdb.setDescription(textEditor.getText()); + /** + * {@inheritDoc} + * + * @see com.metamatrix.ui.table.DefaultColumnProvider#setValue(java.lang.Object, java.lang.Object) + */ + @Override + public void setValue( final VdbEntry element, + final String value ) { + element.setDescription(value); } - - }); + }; - final TextColumnProvider pathColumnProvider = new TextColumnProvider() { + private final ModelLabelProvider modelLabelProvider = new ModelLabelProvider(); + private final TextColumnProvider pathColumnProvider = new TextColumnProvider() { + /** + * {@inheritDoc} + * + * @see com.metamatrix.ui.table.ColumnProvider#getName() + */ @Override public String getName() { return PATH_COLUMN_NAME; } + /** + * {@inheritDoc} + * + * @see com.metamatrix.ui.table.ColumnProvider#getImage() + */ @Override public Image getImage() { return null; } + /** + * {@inheritDoc} + * + * @see com.metamatrix.ui.table.ColumnProvider#getValue(java.lang.Object) + */ @Override public String getValue( final VdbEntry element ) { return element.getName().removeLastSegments(1).toString(); } }; - final CheckBoxColumnProvider syncColumnProvider = new CheckBoxColumnProvider() { + private final CheckBoxColumnProvider syncColumnProvider = new CheckBoxColumnProvider() { + /** + * {@inheritDoc} + * + * @see com.metamatrix.ui.table.ColumnProvider#getName() + */ @Override public String getName() { return null; } + /** + * {@inheritDoc} + * + * @see com.metamatrix.ui.table.ColumnProvider#getImage() + */ @Override public Image getImage() { return VdbUiPlugin.singleton.getImage(VdbUiConstants.Images.SYNCHRONIZE_MODELS_ICON); } + /** + * {@inheritDoc} + * + * @see com.metamatrix.ui.table.DefaultColumnProvider#getToolTip(java.lang.Object) + */ @Override public String getToolTip( final VdbEntry element ) { if (element.getSynchronization() == Synchronization.Synchronized) return SYNCHRONIZED_TOOLTIP; @@ -277,277 +294,833 @@ return SYNCHRONIZATION_NOT_APPLICABLE_TOOLTIP; } + /** + * {@inheritDoc} + * + * @see com.metamatrix.ui.table.ColumnProvider#getValue(java.lang.Object) + */ @Override public Boolean getValue( final VdbEntry element ) { return element.getSynchronization() == Synchronization.Synchronized; } + /** + * {@inheritDoc} + * + * @see com.metamatrix.ui.table.DefaultColumnProvider#isEditable(java.lang.Object) + */ @Override public boolean isEditable( final VdbEntry element ) { return element.getSynchronization() == Synchronization.NotSynchronized; } - @Override - public void setValue( final VdbEntry element, - final Boolean value ) { - if (ConfirmationDialog.confirm(CONFIRM_SYNCHRONIZE_MESSAGE)) { - element.synchronize(new NullProgressMonitor()); - - dataRoleResolver.modelSynchronized(element); - VdbEditor.this.doSave(new NullProgressMonitor()); - } + /** + * {@inheritDoc} + * + * @see com.metamatrix.ui.table.DefaultColumnProvider#setValue(java.lang.Object, + * java.lang.Object) + */ + @Override + public void setValue(final VdbEntry element, final Boolean value) { + if (ConfirmationDialog.confirm(CONFIRM_SYNCHRONIZE_MESSAGE)) { + element.synchronize(new NullProgressMonitor()); + + dataRoleResolver.modelSynchronized(element); + VdbEditor.this.doSave(new NullProgressMonitor()); + } + } + }; + + private final ISelectionStatusValidator validator = new ISelectionStatusValidator() { + /** + * {@inheritDoc} + * + * @see org.eclipse.ui.dialogs.ISelectionStatusValidator#validate(java.lang.Object[]) + */ + @Override + public IStatus validate( final Object[] selection ) { + for (int ndx = selection.length; --ndx >= 0;) + if (selection[ndx] instanceof IContainer) + return new Status(IStatus.ERROR, + VdbUiConstants.PLUGIN_ID, + 0, + ADD_FILE_DIALOG_INVALID_SELECTION_MESSAGE, + null); + return new Status(IStatus.OK, VdbUiConstants.PLUGIN_ID, 0, EMPTY_STRING, null); } }; - final TextColumnProvider descriptionColumnProvider = new TextColumnProvider() { - @Override - public String getName() { - return DESCRIPTION_COLUMN_NAME; - } - - @Override - public Image getImage() { - return null; - } + /** + * Method which adds models to the VDB. + * + * @param models + */ + public void addModels( final List models ) { + for (final Object model : models) { + vdb.addModelEntry(((IFile)model).getFullPath(), new NullProgressMonitor()); + } - @Override - public String getValue( final VdbEntry element ) { - return element.getDescription(); - } + modelsGroup.getTable().getViewer().refresh(); + } + + private void createDataRolesControl(Composite parent) { + final String DATA_POLICY_COLUMN_NAME = i18n("dataPolicyName"); //$NON-NLS-1$ - @Override - public boolean isEditable( final VdbEntry element ) { - return true; - } + final ButtonProvider editProvider = new ButtonProvider() { + /** + * {@inheritDoc} + * + * @see com.metamatrix.ui.internal.widget.ButtonProvider#getImageDescriptor() + */ + @Override + public ImageDescriptor getImageDescriptor() { + return VdbUiPlugin.singleton.getImageDescriptor(Images.EDIT_ROLE); + } - @Override - public void setValue( final VdbEntry element, - final String value ) { - element.setDescription(value); - } - }; - modelsGroup = new TableAndButtonsGroup(pg, MODELS_GROUP, 2, new DefaultTableProvider() { + /** + * {@inheritDoc} + * + * @see com.metamatrix.ui.internal.widget.ButtonProvider#getText() + */ + @Override + public String getText() { + return null; + } - @Override - public void doubleClicked( final VdbModelEntry element ) { - openEditor(element); - } + /** + * {@inheritDoc} + * + * @see com.metamatrix.ui.internal.widget.ButtonProvider#getToolTip() + */ + @Override + public String getToolTip() { + return i18n("editRoleToolTip"); //$NON-NLS-1$ + } - @Override - public VdbModelEntry[] getElements() { - final Set modelEntries = vdb.getModelEntries(); - return modelEntries.toArray(new VdbModelEntry[modelEntries.size()]); - } + /** + * {@inheritDoc} + * + * @see com.metamatrix.ui.internal.widget.ButtonProvider#isEnabled(org.eclipse.jface.viewers.IStructuredSelection) + */ + @Override + public boolean isEnabled(IStructuredSelection selection) { + return (selection.size() == 1); + } - @Override - public boolean isDoubleClickSupported() { - return true; - } - }, new TextColumnProvider() { + /** + * {@inheritDoc} + * + * @see com.metamatrix.ui.internal.widget.ButtonProvider#selected(org.eclipse.jface.viewers.IStructuredSelection) + */ + @Override + public void selected(IStructuredSelection selection) { + VdbDataRole vdbDataRole = (VdbDataRole) selection.getFirstElement(); + if (vdbDataRole == null) { + return; + } + ContainerImpl tempContainer = null; + try { + Collection modelFiles = getVdb().getModelFiles(); - @Override - public Image getImage( final VdbModelEntry element ) { - return ModelIdentifier.getModelImage(element.findFileInWorkspace()); - } + tempContainer = (ContainerImpl) ModelerCore.createContainer("tempVdbModelContainer"); //$NON-NLS-1$ + ModelEditorImpl.setContainer(tempContainer); + for (File modelFile : modelFiles) { + boolean isVisible = true; - @Override - public String getName() { - return MODEL_COLUMN_NAME; - } - - @Override - public Image getImage() { - return null; - } + Resource r = tempContainer.getResource(URI.createFileURI(modelFile.getPath()), true); + if (isVisible && ModelUtil.isModelFile(r) && !ModelUtil.isXsdFile(r)) { + EObject firstEObj = r.getContents().get(0); + ModelAnnotation ma = ModelerCore.getModelEditor().getModelAnnotation(firstEObj); + String mmURI = ma.getPrimaryMetamodelUri(); + if (RelationalPackage.eNS_URI.equalsIgnoreCase(mmURI) + || XmlDocumentPackage.eNS_URI.equalsIgnoreCase(mmURI) + || WEB_SERVICES_VIEW_MODEL_URI.equalsIgnoreCase(mmURI)) { + // DO NOTHING. This leaves the resource in the + // temp container + } else { + tempContainer.getResources().remove(r); + } + } else { + tempContainer.getResources().remove(r); + } + } + } catch (CoreException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } finally { + ModelEditorImpl.setContainer(null); + } - @Override - public String getValue( final VdbModelEntry element ) { - return element.getName().lastSegment(); - } - }, pathColumnProvider, syncColumnProvider, new CheckBoxColumnProvider() { + DataRole dataPolicy = new DataRole(vdbDataRole.getName(), vdbDataRole.getDescription(), + vdbDataRole.isAnyAuthenticated(), vdbDataRole.getMappedRoleNames(), + vdbDataRole.getPermissions()); - @Override - public String getName() { - return null; - } - - @Override - public Image getImage() { - return VdbUiPlugin.singleton.getImage(VdbUiConstants.Images.VISIBLE_ICON); - } + final IWorkbenchWindow iww = VdbUiPlugin.singleton.getCurrentWorkbenchWindow(); + final NewDataRoleWizard wizard = new NewDataRoleWizard(tempContainer, dataPolicy); - @Override - public String getToolTip( final VdbModelEntry element ) { - return element.isVisible() ? VISIBLE_TOOLTIP : NOT_VISIBLE_TOOLTIP; - } + wizard.init(iww.getWorkbench(), new StructuredSelection(getVdb().getModelEntries())); + final WizardDialog dialog = new WizardDialog(wizard.getShell(), wizard); + final int rc = dialog.open(); + if (rc == Window.OK) { + // Get the Data Policy + DataRole dp = wizard.getDataRole(); + if (dp != null) { + getVdb().removeDataPolicy(vdbDataRole); + getVdb().addDataPolicy(dp, new NullProgressMonitor()); + } - @Override - public Boolean getValue( final VdbModelEntry element ) { - return element.isVisible(); - } + } + } + }; - @Override - public boolean isEditable( final VdbModelEntry element ) { - return true; - } + dataRolesGroup = new TableAndToolBar(parent, 1, new DefaultTableProvider() { + /** + * {@inheritDoc} + * + * @see com.metamatrix.ui.table.DefaultTableProvider#doubleClicked(java.lang.Object) + */ + @Override + public void doubleClicked(VdbDataRole element) { + editProvider.selected(new StructuredSelection(element)); + } + + /** + * {@inheritDoc} + * + * @see com.metamatrix.ui.table.TableProvider#getElements() + */ + @Override + public VdbDataRole[] getElements() { + final Set entries = getVdb().getDataPolicyEntries(); + return entries.toArray(new VdbDataRole[entries.size()]); + } + + /** + * {@inheritDoc} + * + * @see com.metamatrix.ui.table.DefaultTableProvider#isDoubleClickSupported() + */ + @Override + public boolean isDoubleClickSupported() { + return true; + } + }, new TextColumnProvider() { + /** + * {@inheritDoc} + * + * @see com.metamatrix.ui.table.DefaultColumnProvider#getImage(java.lang.Object) + */ + @Override + public Image getImage(final VdbDataRole element) { + return null; + } + + /** + * {@inheritDoc} + * + * @see com.metamatrix.ui.table.ColumnProvider#getName() + */ + @Override + public String getName() { + return DATA_POLICY_COLUMN_NAME; + } + + /** + * {@inheritDoc} + * + * @see com.metamatrix.ui.table.ColumnProvider#getImage() + */ + @Override + public Image getImage() { + return null; + } + + /** + * {@inheritDoc} + * + * @see com.metamatrix.ui.table.ColumnProvider#getValue(java.lang.Object) + */ + @Override + public String getValue(final VdbDataRole element) { + return element.getName(); + } + }, new TextColumnProvider() { + /** + * {@inheritDoc} + * + * @see com.metamatrix.ui.table.ColumnProvider#getName() + */ + @Override + public String getName() { + return DESCRIPTION_COLUMN_NAME; + } + + /** + * {@inheritDoc} + * + * @see com.metamatrix.ui.table.ColumnProvider#getImage() + */ + @Override + public Image getImage() { + return null; + } + + /** + * {@inheritDoc} + * + * @see com.metamatrix.ui.table.ColumnProvider#getValue(java.lang.Object) + */ + @Override + public String getValue(final VdbDataRole element) { + return element.getDescription(); + } + + /** + * {@inheritDoc} + * + * @see com.metamatrix.ui.table.DefaultColumnProvider#isEditable(java.lang.Object) + */ + @Override + public boolean isEditable(final VdbDataRole element) { + return true; + } + + /** + * {@inheritDoc} + * + * @see com.metamatrix.ui.table.DefaultColumnProvider#setValue(java.lang.Object, + * java.lang.Object) + */ + @Override + public void setValue(final VdbDataRole element, final String value) { + element.setDescription(value); + } + }); + + ButtonProvider newProvider = new ButtonProvider() { + /** + * {@inheritDoc} + * + * @see com.metamatrix.ui.internal.widget.ButtonProvider#getImageDescriptor() + */ + @Override + public ImageDescriptor getImageDescriptor() { + return VdbUiPlugin.singleton.getImageDescriptor(Images.ADD_ROLE); + } + + /** + * {@inheritDoc} + * + * @see com.metamatrix.ui.internal.widget.ButtonProvider#getText() + */ + @Override + public String getText() { + return null; + } + + /** + * {@inheritDoc} + * + * @see com.metamatrix.ui.internal.widget.ButtonProvider#getToolTip() + */ + @Override + public String getToolTip() { + return i18n("addRoleToolTip"); //$NON-NLS-1$ + } + + /** + * {@inheritDoc} + * + * @see com.metamatrix.ui.internal.widget.ButtonProvider#isEnabled(org.eclipse.jface.viewers.IStructuredSelection) + */ + @Override + public boolean isEnabled(IStructuredSelection selection) { + return true; + } + + /** + * {@inheritDoc} + * + * @see com.metamatrix.ui.internal.widget.ButtonProvider#selected(org.eclipse.jface.viewers.IStructuredSelection) + */ + @Override + public void selected(IStructuredSelection selection) { + ContainerImpl tempContainer = null; + try { + Collection modelFiles = getVdb().getModelFiles(); + + tempContainer = (ContainerImpl) ModelerCore.createContainer("tempVdbModelContainer"); //$NON-NLS-1$ + ModelEditorImpl.setContainer(tempContainer); + for (File modelFile : modelFiles) { + boolean isVisible = true; + + Resource r = tempContainer.getResource(URI.createFileURI(modelFile.getPath()), true); + if (isVisible && ModelUtil.isModelFile(r) && !ModelUtil.isXsdFile(r)) { + EObject firstEObj = r.getContents().get(0); + ModelAnnotation ma = ModelerCore.getModelEditor().getModelAnnotation(firstEObj); + String mmURI = ma.getPrimaryMetamodelUri(); + if (RelationalPackage.eNS_URI.equalsIgnoreCase(mmURI) + || XmlDocumentPackage.eNS_URI.equalsIgnoreCase(mmURI) + || WEB_SERVICES_VIEW_MODEL_URI.equalsIgnoreCase(mmURI)) { + // DO NOTHING. This leaves the resource in the + // temp container + } else { + tempContainer.getResources().remove(r); + } + } else { + tempContainer.getResources().remove(r); + } + } + } catch (CoreException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } finally { + ModelEditorImpl.setContainer(null); + } + + final IWorkbenchWindow iww = VdbUiPlugin.singleton.getCurrentWorkbenchWindow(); + final NewDataRoleWizard wizard = new NewDataRoleWizard(tempContainer, null); + + wizard.init(iww.getWorkbench(), new StructuredSelection(getVdb().getModelEntries())); + final WizardDialog dialog = new WizardDialog(wizard.getShell(), wizard); + final int rc = dialog.open(); + if (rc == Window.OK) { + // Get the Data Policy + DataRole dp = wizard.getDataRole(); + if (dp != null) { + getVdb().addDataPolicy(dp, new NullProgressMonitor()); + } + + } + } + }; + + dataRolesGroup.add(newProvider); + dataRolesGroup.add(editProvider); + + ButtonProvider removeProvider = new ButtonProvider() { + /** + * {@inheritDoc} + * + * @see com.metamatrix.ui.internal.widget.ButtonProvider#getImageDescriptor() + */ + @Override + public ImageDescriptor getImageDescriptor() { + return VdbUiPlugin.singleton.getImageDescriptor(Images.REMOVE_ROLE); + } + + /** + * {@inheritDoc} + * + * @see com.metamatrix.ui.internal.widget.ButtonProvider#getText() + */ + @Override + public String getText() { + return null; + } + + /** + * {@inheritDoc} + * + * @see com.metamatrix.ui.internal.widget.ButtonProvider#getToolTip() + */ + @Override + public String getToolTip() { + return i18n("removeRoleToolTip"); //$NON-NLS-1$ + } + + /** + * {@inheritDoc} + * + * @see com.metamatrix.ui.internal.widget.ButtonProvider#isEnabled(org.eclipse.jface.viewers.IStructuredSelection) + */ + @Override + public boolean isEnabled(IStructuredSelection selection) { + return !selection.isEmpty(); + } + + /** + * {@inheritDoc} + * + * @see com.metamatrix.ui.internal.widget.ButtonProvider#selected(org.eclipse.jface.viewers.IStructuredSelection) + */ + @Override + public void selected(IStructuredSelection selection) { + if (ConfirmationDialog.confirm(CONFIRM_REMOVE_MESSAGE)) { + for (final Object element : selection.toList()) { + if (element instanceof VdbDataRole) { + getVdb().removeDataPolicy((VdbDataRole) element); + } + + } + } + } + }; + + dataRolesGroup.add(removeProvider); + dataRolesGroup.setInput(vdb); + + this.cloneDataRoleAction = new Action(i18n("cloneDataRoleActionLabel")) { //$NON-NLS-1$ + /** + * {@inheritDoc} + * + * @see org.eclipse.jface.action.Action#run() + */ + @Override + public void run() { + + if (selectedDataRole != null) { + DataRole newDR = new DataRole(selectedDataRole.getName() + i18n("cloneDataRoleAction.copySuffix"), //$NON-NLS-1$ + selectedDataRole.getDescription(), selectedDataRole.isAnyAuthenticated(), + selectedDataRole.getMappedRoleNames(), selectedDataRole.getPermissions()); + getVdb().addDataPolicy(newDR, new NullProgressMonitor()); + dataRolesGroup.getTable().getViewer().refresh(); + } + + } + }; + + this.cloneDataRoleAction.setEnabled(true); + + // Add selection changed listener so if a Physical Source model is + // selected, the applicable menu actions are + // retrieved via the SourceHandler extension point and interface. + // This allows changing Translator and JNDI names via existing deployed + // objects on Teiid Servers that are + // connected in the user's workspace. + final TableViewer dataRolesViewer = dataRolesGroup.getTable().getViewer(); + final MenuManager dataRolesMenuManager = new MenuManager(); + dataRolesViewer.getControl().setMenu(dataRolesMenuManager.createContextMenu(parent)); + dataRolesViewer.addSelectionChangedListener(new ISelectionChangedListener() { + /** + * {@inheritDoc} + * + * @see org.eclipse.jface.viewers.ISelectionChangedListener#selectionChanged(org.eclipse.jface.viewers.SelectionChangedEvent) + */ + @Override + public void selectionChanged(final SelectionChangedEvent event) { + dataRolesMenuManager.removeAll(); + IStructuredSelection sel = (IStructuredSelection) dataRolesViewer.getSelection(); + if (sel.size() == 1) { + selectedDataRole = (VdbDataRole) sel.getFirstElement(); + dataRolesMenuManager.add(cloneDataRoleAction); + } + + } + }); + } + + private void createDescriptionControl( Composite parent ) { + this.textEditor = new StyledTextEditor(parent, SWT.MULTI | SWT.H_SCROLL | SWT.V_SCROLL | SWT.WRAP); + final GridData gridData = new GridData(GridData.FILL_BOTH); + this.textEditor.setLayoutData(gridData); + this.textEditor.setText(vdb.getDescription()); + this.textEditor.getDocument().addDocumentListener(new IDocumentListener() { + /** + * {@inheritDoc} + * + * @see org.eclipse.jface.text.IDocumentListener#documentAboutToBeChanged(org.eclipse.jface.text.DocumentEvent) + */ @Override - public void setValue( final VdbModelEntry element, - final Boolean value ) { - element.setVisible(value); + public void documentAboutToBeChanged( final DocumentEvent event ) { + // nothing to do } - }, new TextColumnProvider() { + /** + * {@inheritDoc} + * + * @see org.eclipse.jface.text.IDocumentListener#documentChanged(org.eclipse.jface.text.DocumentEvent) + */ @Override - public String getName() { - return SOURCE_NAME_COLUMN_NAME; + public void documentChanged( final DocumentEvent event ) { + getVdb().setDescription(textEditor.getText()); } + + }); + } + + private void createEditorBottom( Composite parent ) { + Composite pnlBottom = new Composite(parent, SWT.BORDER); + pnlBottom.setLayout(new GridLayout()); + pnlBottom.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true)); + CTabFolder tabFolder = WidgetFactory.createTabFolder(pnlBottom); + + { // roles tab + CTabItem rolesTab = new CTabItem(tabFolder, SWT.NONE); + rolesTab.setText(i18n("rolesTab")); //$NON-NLS-1$ + rolesTab.setToolTipText(i18n("rolesTabToolTip")); //$NON-NLS-1$ + Composite pnlRoles = new Composite(tabFolder, SWT.NONE); + pnlRoles.setLayout(new GridLayout()); + pnlRoles.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true)); + rolesTab.setControl(pnlRoles); + createDataRolesControl(pnlRoles); + } + + { // description tab + CTabItem descriptionTab = new CTabItem(tabFolder, SWT.NONE); + descriptionTab.setText(i18n("descriptionTab")); //$NON-NLS-1$ + descriptionTab.setToolTipText(i18n("descriptionTabToolTip")); //$NON-NLS-1$ + Composite pnlDescription = new Composite(tabFolder, SWT.NONE); + pnlDescription.setLayout(new GridLayout()); + pnlDescription.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true)); + descriptionTab.setControl(pnlDescription); + createDescriptionControl(pnlDescription); + } + + tabFolder.setSelection(0); + } + private void createOtherFilesControl ( Composite parent ) { + final WorkbenchLabelProvider workbenchLabelProvider = new WorkbenchLabelProvider(); + otherFilesGroup = new TableAndToolBar(parent, 1, new DefaultTableProvider() { //$NON-NLS-1$ + /** + * {@inheritDoc} + * + * @see com.metamatrix.ui.table.DefaultTableProvider#doubleClicked(java.lang.Object) + */ @Override - public Image getImage() { - return null; + public void doubleClicked( VdbEntry element ) { + openEditor(element); } + /** + * {@inheritDoc} + * + * @see com.metamatrix.ui.table.TableProvider#getElements() + */ @Override - public String getValue( final VdbModelEntry element ) { - final String value = element.getSourceName(); - return value == null ? EMPTY_STRING : value; + public VdbEntry[] getElements() { + final Set entries = getVdb().getEntries(); + return entries.toArray(new VdbEntry[entries.size()]); } + /** + * {@inheritDoc} + * + * @see com.metamatrix.ui.table.DefaultTableProvider#isDoubleClickSupported() + */ @Override - public boolean isEditable( final VdbModelEntry element ) { + public boolean isDoubleClickSupported() { return true; } - @Override - public void setValue( final VdbModelEntry element, - final String value ) { - element.setSourceName(value); + void openEditor( final VdbEntry entry ) { + try { + IDE.openEditor(UiUtil.getWorkbenchPage(), entry.findFileInWorkspace()); + } catch (final Exception error) { + throw new RuntimeException(error); + } } - }, new TextColumnProvider() { - + }, new TextColumnProvider() { + /** + * {@inheritDoc} + * + * @see com.metamatrix.ui.table.DefaultColumnProvider#getImage(java.lang.Object) + */ @Override - public String getName() { - return TRANSLATOR_COLUMN_NAME; + public Image getImage( final VdbEntry element ) { + return workbenchLabelProvider.getImage(element.findFileInWorkspace()); } + /** + * {@inheritDoc} + * + * @see com.metamatrix.ui.table.ColumnProvider#getImage() + */ @Override public Image getImage() { return null; } + /** + * {@inheritDoc} + * + * @see com.metamatrix.ui.table.ColumnProvider#getName() + */ @Override - public String getValue( final VdbModelEntry element ) { - final String value = element.getTranslator(); - return value == null ? EMPTY_STRING : value; + public String getName() { + return FILE_COLUMN_NAME; } - + + /** + * {@inheritDoc} + * + * @see com.metamatrix.ui.table.ColumnProvider#getValue(java.lang.Object) + */ @Override - public boolean isEditable( final VdbModelEntry element ) { - return true; + public String getValue( final VdbEntry element ) { + return element.getName().lastSegment(); } + }, this.pathColumnProvider, this.syncColumnProvider, this.descriptionColumnProvider); + ButtonProvider addProvider = new ButtonProvider() { + /** + * {@inheritDoc} + * + * @see com.metamatrix.ui.internal.widget.ButtonProvider#getImageDescriptor() + */ @Override - public void setValue( final VdbModelEntry element, - final String value ) { - element.setTranslator(value); + public ImageDescriptor getImageDescriptor() { + return VdbUiPlugin.singleton.getImageDescriptor(Images.ADD_FILE); } - }, new TextColumnProvider() { - @Override - public String getName() { - return JNDI_NAME_COLUMN_NAME; - } - + /** + * {@inheritDoc} + * + * @see com.metamatrix.ui.internal.widget.ButtonProvider#getText() + */ @Override - public Image getImage() { + public String getText() { return null; } + /** + * {@inheritDoc} + * + * @see com.metamatrix.ui.internal.widget.ButtonProvider#getToolTip() + */ @Override - public String getValue( final VdbModelEntry element ) { - final String value = element.getJndiName(); - return value == null ? EMPTY_STRING : value; + public String getToolTip() { + return i18n("addFileToolTip"); //$NON-NLS-1$ } + /** + * {@inheritDoc} + * + * @see com.metamatrix.ui.internal.widget.ButtonProvider#isEnabled(org.eclipse.jface.viewers.IStructuredSelection) + */ @Override - public boolean isEditable( final VdbModelEntry element ) { + public boolean isEnabled( IStructuredSelection selection ) { return true; } - @Override - public void setValue( final VdbModelEntry element, - final String value ) { - element.setJndiName(value); - } - }, descriptionColumnProvider); - final ModelLabelProvider modelLabelProvider = new ModelLabelProvider(); - final ISelectionStatusValidator validator = new ISelectionStatusValidator() { - - public IStatus validate( final Object[] selection ) { - for (int ndx = selection.length; --ndx >= 0;) - if (selection[ndx] instanceof IContainer) return new Status(IStatus.ERROR, VdbUiConstants.PLUGIN_ID, 0, - ADD_FILE_DIALOG_INVALID_SELECTION_MESSAGE, null); - return new Status(IStatus.OK, VdbUiConstants.PLUGIN_ID, 0, EMPTY_STRING, null); - } - }; - modelsGroup.add(modelsGroup.new AddButtonProvider() { - + /** + * {@inheritDoc} + * + * @see com.metamatrix.ui.internal.widget.ButtonProvider#selected(org.eclipse.jface.viewers.IStructuredSelection) + */ @Override - protected void add() { + public void selected( IStructuredSelection selection ) { final ViewerFilter filter = new ViewerFilter() { - + /** + * {@inheritDoc} + * + * @see org.eclipse.jface.viewers.ViewerFilter#select(org.eclipse.jface.viewers.Viewer, java.lang.Object, java.lang.Object) + */ @Override public boolean select( final Viewer viewer, final Object parent, final Object element ) { if (element instanceof IContainer) return true; final IFile file = (IFile)element; - if (!ModelUtilities.isModelFile(file) && !ModelUtil.isXsdFile(file)) return false; - for (final VdbModelEntry modelEntry : vdb.getModelEntries()) - if (file.equals(modelEntry.findFileInWorkspace())) return false; + if (ModelUtilities.isModelFile(file) || ModelUtil.isXsdFile(file) || ModelUtil.isVdbArchiveFile(file)) return false; + for (final VdbEntry entry : getVdb().getEntries()) + if (file.equals(entry.findFileInWorkspace())) return false; return true; } }; - ModelingResourceFilter wsFilter = new ModelingResourceFilter(filter); - wsFilter.setShowHiddenProjects(true); - final Object[] models = WidgetUtil.showWorkspaceObjectSelectionDialog(ADD_FILE_DIALOG_TITLE, + final Object[] files = WidgetUtil.showWorkspaceObjectSelectionDialog(ADD_FILE_DIALOG_TITLE, ADD_FILE_DIALOG_MESSAGE, true, null, - wsFilter, - validator, - modelLabelProvider); - if( !vdb.getDataPolicyEntries().isEmpty() ) { - MessageDialog.openInformation(Display.getCurrent().getActiveShell(), - VdbEditor.CONFIRM_DIALOG_TITLE, INFORM_DATA_ROLES_ON_ADD_MESSAGE); + new ModelingResourceFilter(filter), + getValidator(), + getModelLabelProvider()); + + // indicates if this is the first time models are being added + boolean firstTime = (otherFilesGroup.getTable().getViewer().getTable().getItemCount() == 0); + + for (final Object file : files) + getVdb().addEntry(((IFile)file).getFullPath(), new NullProgressMonitor()); + + // refresh table from model + otherFilesGroup.getTable().getViewer().refresh(); + + // pack columns if first time a file is added + if (firstTime) { + WidgetUtil.pack(otherFilesGroup.getTable().getViewer()); + } + } + }; + otherFilesGroup.add(addProvider); + + ButtonProvider removeProvider = new ButtonProvider() { + /** + * {@inheritDoc} + * + * @see com.metamatrix.ui.internal.widget.ButtonProvider#getImageDescriptor() + */ + @Override + public ImageDescriptor getImageDescriptor() { + return VdbUiPlugin.singleton.getImageDescriptor(Images.REMOVE_FILE); + } + + /** + * {@inheritDoc} + * + * @see com.metamatrix.ui.internal.widget.ButtonProvider#getText() + */ + @Override + public String getText() { + return null; } - for (final Object model : models) - vdb.addModelEntry(((IFile)model).getFullPath(), new NullProgressMonitor()); + /** + * {@inheritDoc} + * + * @see com.metamatrix.ui.internal.widget.ButtonProvider#getToolTip() + */ + @Override + public String getToolTip() { + return i18n("removeFileToolTip"); //$NON-NLS-1$ } - }); - final RemoveButtonProvider removeButtonProvider = modelsGroup.new RemoveButtonProvider() { + + /** + * {@inheritDoc} + * + * @see com.metamatrix.ui.internal.widget.ButtonProvider#isEnabled(org.eclipse.jface.viewers.IStructuredSelection) + */ + @Override + public boolean isEnabled( IStructuredSelection selection ) { + return !selection.isEmpty(); + } + /** + * {@inheritDoc} + * + * @see com.metamatrix.ui.internal.widget.ButtonProvider#selected(org.eclipse.jface.viewers.IStructuredSelection) + */ @Override - public void selected( final IStructuredSelection selection ) { - if (!ConfirmationDialog.confirm(CONFIRM_REMOVE_MESSAGE)) return; + public void selected( IStructuredSelection selection ) { + if (!ConfirmationDialog.confirm(CONFIRM_REMOVE_MESSAGE)) + return; final Set entries = new HashSet(); final Set importedBy = new HashSet(); for (final Object element : selection.toList()) { entries.add((VdbEntry)element); - if (element instanceof VdbModelEntry) importedBy.addAll(((VdbModelEntry)element).getImportedBy()); + if (element instanceof VdbModelEntry) + importedBy.addAll(((VdbModelEntry)element).getImportedBy()); } - if (!importedBy.isEmpty()) importedBy.removeAll(entries); + if (!importedBy.isEmpty()) + importedBy.removeAll(entries); if (!importedBy.isEmpty()) { if (!ConfirmationDialog.confirm(new ConfirmationDialog(CONFIRM_REMOVE_IMPORTED_BY_MESSAGE) { - + /** + * {@inheritDoc} + * + * @see org.eclipse.jface.dialogs.MessageDialog#createCustomArea(org.eclipse.swt.widgets.Composite) + */ @Override protected Control createCustomArea( final Composite parent ) { final ListViewer viewer = new ListViewer(parent); viewer.setContentProvider(new DefaultContentProvider()); viewer.setLabelProvider(new LabelProvider() { - + /** + * {@inheritDoc} + * + * @see org.eclipse.jface.viewers.LabelProvider#getText(java.lang.Object) + */ @Override public String getText( final Object element ) { return ((VdbEntry)element).getName().toString(); @@ -557,352 +1130,633 @@ viewer.setInput(importedBy); return viewer.getControl(); } - })) return; + })) + return; entries.addAll(importedBy); } dataRoleResolver.modelEntriesRemoved(entries); - for (final VdbEntry entry : entries) - vdb.removeEntry(entry); + for (final VdbEntry entry : entries) { + getVdb().removeEntry(entry); + } } }; - modelsGroup.add(removeButtonProvider); - // Add selection changed listener so if a Physical Source model is selected, the applicable menu actions are - // retrieved via the SourceHandler extension point and interface. - // This allows changing Translator and JNDI names via existing deployed objects on Teiid Servers that are - // connected in the user's workspace. - final TableViewer viewer = modelsGroup.getTable().getViewer(); - final MenuManager menuManager = new MenuManager(); - viewer.getControl().setMenu(menuManager.createContextMenu(pg)); - viewer.addSelectionChangedListener(new ISelectionChangedListener() { - public void selectionChanged( final SelectionChangedEvent event ) { - menuManager.removeAll(); - final Object[] actions = SourceHandlerExtensionManager.findApplicableActions(viewer.getSelection()); - if (actions != null) for (final Object action : actions) { - if (action instanceof IAction) menuManager.add((IAction)action); + + otherFilesGroup.add(removeProvider); + otherFilesGroup.setInput(vdb); } - } - }); - modelsGroup.setInput(vdb); - final WorkbenchLabelProvider workbenchLabelProvider = new WorkbenchLabelProvider(); - otherFilesGroup = new TableAndButtonsGroup(pg, OTHER_FILES_GROUP, 1, new DefaultTableProvider() { + /** + * {@inheritDoc} + * + * @see org.eclipse.ui.part.WorkbenchPart#createPartControl(org.eclipse.swt.widgets.Composite) + */ + @Override + public void createPartControl( final Composite parent ) { + parent.setLayout(new GridLayout()); + parent.setLayoutData(new GridData()); - @Override - public VdbEntry[] getElements() { - final Set entries = vdb.getEntries(); - return entries.toArray(new VdbEntry[entries.size()]); - } - }, new TextColumnProvider() { + // Insert a ScrolledComposite so controls don't disappear if the panel shrinks + final ScrolledComposite scroller = new ScrolledComposite(parent, SWT.V_SCROLL | SWT.H_SCROLL); + scroller.setLayout(new GridLayout()); + scroller.setLayoutData(new GridData(GridData.FILL_BOTH)); + scroller.setExpandHorizontal(true); + scroller.setExpandVertical(true); - @Override - public Image getImage( final VdbEntry element ) { - return workbenchLabelProvider.getImage(element.findFileInWorkspace()); - } - - @Override - public Image getImage() { - return null; - } + SashForm sash = new SashForm(scroller, SWT.VERTICAL); + sash.setLayoutData(new GridData(GridData.FILL_BOTH)); + scroller.setContent(sash); + + createEditorTop(sash); + createEditorBottom(sash); + sash.setWeights(new int[] {50, 50}); - @Override - public String getName() { - return FILE_COLUMN_NAME; - } + ResourcesPlugin.getWorkspace().addResourceChangeListener(this); + } - @Override - public String getValue( final VdbEntry element ) { - return element.getName().lastSegment(); - } - }, pathColumnProvider, syncColumnProvider, descriptionColumnProvider); - otherFilesGroup.add(otherFilesGroup.new AddButtonProvider() { + private void createEditorTop( Composite parent ) { + Composite pnlTop = new Composite(parent, SWT.BORDER); + pnlTop.setLayout(new GridLayout()); + pnlTop.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true)); + CTabFolder tabFolder = WidgetFactory.createTabFolder(pnlTop); - @Override - protected void add() { - final ViewerFilter filter = new ViewerFilter() { + { // models tab + CTabItem modelsTab = new CTabItem(tabFolder, SWT.NONE); + modelsTab.setText(i18n("modelsTab")); //$NON-NLS-1$ + modelsTab.setToolTipText(i18n("modelsTabToolTip")); //$NON-NLS-1$ + Composite pnlModels = new Composite(tabFolder, SWT.NONE); + pnlModels.setLayout(new GridLayout()); + pnlModels.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true)); + modelsTab.setControl(pnlModels); + createModelsSection(pnlModels); + } - @Override - public boolean select( final Viewer viewer, - final Object parent, - final Object element ) { - if (element instanceof IContainer) return true; - final IFile file = (IFile)element; - if (ModelUtilities.isModelFile(file) || ModelUtil.isXsdFile(file) || ModelUtil.isVdbArchiveFile(file)) return false; - for (final VdbEntry entry : vdb.getEntries()) - if (file.equals(entry.findFileInWorkspace())) return false; - return true; - } - }; - final Object[] files = WidgetUtil.showWorkspaceObjectSelectionDialog(ADD_FILE_DIALOG_TITLE, - ADD_FILE_DIALOG_MESSAGE, - true, - null, - new ModelingResourceFilter(filter), - validator, - modelLabelProvider); - for (final Object file : files) - vdb.addEntry(((IFile)file).getFullPath(), new NullProgressMonitor()); + { // other files tab + CTabItem filesTab = new CTabItem(tabFolder, SWT.NONE); + filesTab.setText(i18n("filesTab")); //$NON-NLS-1$ + filesTab.setToolTipText(i18n("filesTabToolTip")); //$NON-NLS-1$ + Composite pnlFiles = new Composite(tabFolder, SWT.NONE); + pnlFiles.setLayout(new GridLayout()); + pnlFiles.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true)); + filesTab.setControl(pnlFiles); + createOtherFilesControl(pnlFiles); } - }); - otherFilesGroup.add(removeButtonProvider); - otherFilesGroup.setInput(vdb); - - // ======================= DATA POLICIES GROUP START ================================ - dataRolesGroup = new TableAndButtonsGroup(pg, DATA_POLICY_GROUP, 1, new DefaultTableProvider() { - @Override - public VdbDataRole[] getElements() { - final Set entries = vdb.getDataPolicyEntries(); - return entries.toArray(new VdbDataRole[entries.size()]); - } - }, new TextColumnProvider() { + { // synchronize button + synchronizeAllButton = WidgetFactory.createButton(pnlTop, i18n("synchronizeAllButton"), //$NON-NLS-1$ + GridData.HORIZONTAL_ALIGN_BEGINNING); + synchronizeAllButton.setToolTipText(i18n("synchronizeAllButtonToolTip")); //$NON-NLS-1$ + synchronizeAllButton.addSelectionListener(new SelectionAdapter() { + /** + * {@inheritDoc} + * + * @see org.eclipse.swt.events.SelectionAdapter#widgetSelected(org.eclipse.swt.events.SelectionEvent) + */ + @Override + public void widgetSelected(final SelectionEvent event) { + if (!ConfirmationDialog.confirm(CONFIRM_SYNCHRONIZE_ALL_MESSAGE)) + return; + vdb.synchronize(new NullProgressMonitor()); + modelsGroup.getTable().getViewer().refresh(); + otherFilesGroup.getTable().getViewer().refresh(); - @Override - public Image getImage( final VdbDataRole element ) { - return null; - } + dataRoleResolver.allSynchronized(); + VdbEditor.this.doSave(new NullProgressMonitor()); + } + }); + synchronizeAllButton.setEnabled(!vdb.isSynchronized()); + } - @Override - public String getName() { - return DATA_POLICY_COLUMN_NAME; - } - - @Override - public Image getImage() { - return null; - } + tabFolder.setSelection(0); + } - @Override - public String getValue( final VdbDataRole element ) { - return element.getName(); - } - }, new TextColumnProvider() { + private void createModelsSection(Composite parent) { + modelsGroup = new TableAndToolBar(parent, 1, new DefaultTableProvider() { //$NON-NLS-1$ + /** + * {@inheritDoc} + * + * @see com.metamatrix.ui.table.DefaultTableProvider#doubleClicked(java.lang.Object) + */ + @Override + public void doubleClicked(final VdbModelEntry element) { + openEditor(element); + } - @Override - public String getName() { - return DESCRIPTION_COLUMN_NAME; - } - - @Override - public Image getImage() { - return null; - } + /** + * {@inheritDoc} + * + * @see com.metamatrix.ui.table.TableProvider#getElements() + */ + @Override + public VdbModelEntry[] getElements() { + final Set modelEntries = getVdb().getModelEntries(); + return modelEntries.toArray(new VdbModelEntry[modelEntries.size()]); + } - @Override - public String getValue( final VdbDataRole element ) { - return element.getDescription(); - } + /** + * {@inheritDoc} + * + * @see com.metamatrix.ui.table.DefaultTableProvider#isDoubleClickSupported() + */ + @Override + public boolean isDoubleClickSupported() { + return true; + } + }, new TextColumnProvider() { + /** + * {@inheritDoc} + * + * @see com.metamatrix.ui.table.DefaultColumnProvider#getImage(java.lang.Object) + */ + @Override + public Image getImage(final VdbModelEntry element) { + return ModelIdentifier.getModelImage(element.findFileInWorkspace()); + } - @Override - public boolean isEditable( final VdbDataRole element ) { - return true; - } + /** + * {@inheritDoc} + * + * @see com.metamatrix.ui.table.ColumnProvider#getName() + */ + @Override + public String getName() { + return MODEL_COLUMN_NAME; + } - @Override - public void setValue( final VdbDataRole element, - final String value ) { - element.setDescription(value); - } - }); - - dataRolesGroup.add(dataRolesGroup.new NewButtonProvider() { + /** + * {@inheritDoc} + * + * @see com.metamatrix.ui.table.ColumnProvider#getImage() + */ + @Override + public Image getImage() { + return null; + } - @Override - public void selected(IStructuredSelection selection) { - ContainerImpl tempContainer = null; - try { - Collection modelFiles = vdb.getModelFiles(); + /** + * {@inheritDoc} + * + * @see com.metamatrix.ui.table.ColumnProvider#getValue(java.lang.Object) + */ + @Override + public String getValue(final VdbModelEntry element) { + return element.getName().lastSegment(); + } + }, this.pathColumnProvider, this.syncColumnProvider, new CheckBoxColumnProvider() { + /** + * {@inheritDoc} + * + * @see com.metamatrix.ui.table.ColumnProvider#getName() + */ + @Override + public String getName() { + return null; + } - tempContainer = (ContainerImpl)ModelerCore.createContainer("tempVdbModelContainer"); //$NON-NLS-1$ - ModelEditorImpl.setContainer(tempContainer); - for (File modelFile : modelFiles) { - boolean isVisible = true; + /** + * {@inheritDoc} + * + * @see com.metamatrix.ui.table.ColumnProvider#getImage() + */ + @Override + public Image getImage() { + return VdbUiPlugin.singleton.getImage(VdbUiConstants.Images.VISIBLE_ICON); + } - Resource r = tempContainer.getResource(URI.createFileURI(modelFile.getPath()), true); - if (isVisible && ModelUtil.isModelFile(r) && !ModelUtil.isXsdFile(r)) { - EObject firstEObj = r.getContents().get(0); - ModelAnnotation ma = ModelerCore.getModelEditor().getModelAnnotation(firstEObj); - String mmURI = ma.getPrimaryMetamodelUri(); - if (RelationalPackage.eNS_URI.equalsIgnoreCase(mmURI) || - XmlDocumentPackage.eNS_URI.equalsIgnoreCase(mmURI) || - WEB_SERVICES_VIEW_MODEL_URI.equalsIgnoreCase(mmURI)) { - // DO NOTHING. This leaves the resource in the temp container - } else { - tempContainer.getResources().remove(r); - } - } else { - tempContainer.getResources().remove(r); - } - } - } catch (CoreException e) { - // TODO Auto-generated catch block - e.printStackTrace(); - } finally { - ModelEditorImpl.setContainer(null); - } + /** + * {@inheritDoc} + * + * @see com.metamatrix.ui.table.DefaultColumnProvider#getToolTip(java.lang.Object) + */ + @Override + public String getToolTip(final VdbModelEntry element) { + return element.isVisible() ? VISIBLE_TOOLTIP : NOT_VISIBLE_TOOLTIP; + } - final IWorkbenchWindow iww = VdbUiPlugin.singleton.getCurrentWorkbenchWindow(); - final NewDataRoleWizard wizard = new NewDataRoleWizard(tempContainer, null); + /** + * {@inheritDoc} + * + * @see com.metamatrix.ui.table.ColumnProvider#getValue(java.lang.Object) + */ + @Override + public Boolean getValue(final VdbModelEntry element) { + return element.isVisible(); + } - wizard.init(iww.getWorkbench(), new StructuredSelection(vdb - .getModelEntries())); - final WizardDialog dialog = new WizardDialog(wizard.getShell(), - wizard); - final int rc = dialog.open(); - if( rc == Window.OK ) { - // Get the Data Policy - DataRole dp = wizard.getDataRole(); - if( dp != null ) { - vdb.addDataPolicy(dp, new NullProgressMonitor()); + /** + * {@inheritDoc} + * + * @see com.metamatrix.ui.table.DefaultColumnProvider#isEditable(java.lang.Object) + */ + @Override + public boolean isEditable(final VdbModelEntry element) { + return true; + } + + /** + * {@inheritDoc} + * + * @see com.metamatrix.ui.table.DefaultColumnProvider#setValue(java.lang.Object, + * java.lang.Object) + */ + @Override + public void setValue(final VdbModelEntry element, final Boolean value) { + element.setVisible(value); + } + }, new TextColumnProvider() { + /** + * {@inheritDoc} + * + * @see com.metamatrix.ui.table.ColumnProvider#getName() + */ + @Override + public String getName() { + return SOURCE_NAME_COLUMN_NAME; + } + + /** + * {@inheritDoc} + * + * @see com.metamatrix.ui.table.ColumnProvider#getImage() + */ + @Override + public Image getImage() { + return null; + } + + /** + * {@inheritDoc} + * + * @see com.metamatrix.ui.table.ColumnProvider#getValue(java.lang.Object) + */ + @Override + public String getValue(final VdbModelEntry element) { + final String value = element.getSourceName(); + return value == null ? EMPTY_STRING : value; + } + + /** + * {@inheritDoc} + * + * @see com.metamatrix.ui.table.DefaultColumnProvider#isEditable(java.lang.Object) + */ + @Override + public boolean isEditable(final VdbModelEntry element) { + return true; + } + + /** + * {@inheritDoc} + * + * @see com.metamatrix.ui.table.DefaultColumnProvider#setValue(java.lang.Object, + * java.lang.Object) + */ + @Override + public void setValue(final VdbModelEntry element, final String value) { + element.setSourceName(value); + } + }, new TextColumnProvider() { + /** + * {@inheritDoc} + * + * @see com.metamatrix.ui.table.ColumnProvider#getName() + */ + @Override + public String getName() { + return TRANSLATOR_COLUMN_NAME; + } + + /** + * {@inheritDoc} + * + * @see com.metamatrix.ui.table.ColumnProvider#getImage() + */ + @Override + public Image getImage() { + return null; + } + + /** + * {@inheritDoc} + * + * @see com.metamatrix.ui.table.ColumnProvider#getValue(java.lang.Object) + */ + @Override + public String getValue(final VdbModelEntry element) { + final String value = element.getTranslator(); + return value == null ? EMPTY_STRING : value; + } + + /** + * {@inheritDoc} + * + * @see com.metamatrix.ui.table.DefaultColumnProvider#isEditable(java.lang.Object) + */ + @Override + public boolean isEditable(final VdbModelEntry element) { + return true; + } + + /** + * {@inheritDoc} + * + * @see com.metamatrix.ui.table.DefaultColumnProvider#setValue(java.lang.Object, + * java.lang.Object) + */ + @Override + public void setValue(final VdbModelEntry element, final String value) { + element.setTranslator(value); + } + }, new TextColumnProvider() { + /** + * {@inheritDoc} + * + * @see com.metamatrix.ui.table.ColumnProvider#getName() + */ + @Override + public String getName() { + return JNDI_NAME_COLUMN_NAME; + } + + /** + * {@inheritDoc} + * + * @see com.metamatrix.ui.table.ColumnProvider#getImage() + */ + @Override + public Image getImage() { + return null; + } + + /** + * {@inheritDoc} + * + * @see com.metamatrix.ui.table.ColumnProvider#getValue(java.lang.Object) + */ + @Override + public String getValue(final VdbModelEntry element) { + final String value = element.getJndiName(); + return value == null ? EMPTY_STRING : value; + } + + /** + * {@inheritDoc} + * + * @see com.metamatrix.ui.table.DefaultColumnProvider#isEditable(java.lang.Object) + */ + @Override + public boolean isEditable(final VdbModelEntry element) { + return true; + } + + /** + * {@inheritDoc} + * + * @see com.metamatrix.ui.table.DefaultColumnProvider#setValue(java.lang.Object, + * java.lang.Object) + */ + @Override + public void setValue(final VdbModelEntry element, final String value) { + element.setJndiName(value); + } + }, this.descriptionColumnProvider); + + ButtonProvider addProvider = new ButtonProvider() { + /** + * {@inheritDoc} + * + * @see com.metamatrix.ui.internal.widget.ButtonProvider#getImageDescriptor() + */ + @Override + public ImageDescriptor getImageDescriptor() { + return VdbUiPlugin.singleton.getImageDescriptor(Images.ADD_MODEL); + } + + /** + * {@inheritDoc} + * + * @see com.metamatrix.ui.internal.widget.ButtonProvider#getText() + */ + @Override + public String getText() { + return null; + } + + /** + * {@inheritDoc} + * + * @see com.metamatrix.ui.internal.widget.ButtonProvider#getToolTip() + */ + @Override + public String getToolTip() { + return i18n("addModelToolTip"); //$NON-NLS-1$ + } + + /** + * {@inheritDoc} + * + * @see com.metamatrix.ui.internal.widget.ButtonProvider#isEnabled(org.eclipse.jface.viewers.IStructuredSelection) + */ + @Override + public boolean isEnabled(IStructuredSelection selection) { + return true; + } + + /** + * {@inheritDoc} + * + * @see com.metamatrix.ui.internal.widget.ButtonProvider#selected(org.eclipse.jface.viewers.IStructuredSelection) + */ + @Override + public void selected(IStructuredSelection selection) { + final ViewerFilter filter = new ViewerFilter() { + /** + * {@inheritDoc} + * + * @see org.eclipse.jface.viewers.ViewerFilter#select(org.eclipse.jface.viewers.Viewer, + * java.lang.Object, java.lang.Object) + */ + @Override + public boolean select(final Viewer viewer, final Object parent, final Object element) { + if (element instanceof IContainer) + return true; + final IFile file = (IFile) element; + if (!ModelUtilities.isModelFile(file) && !ModelUtil.isXsdFile(file)) + return false; + for (final VdbModelEntry modelEntry : getVdb().getModelEntries()) + if (file.equals(modelEntry.findFileInWorkspace())) + return false; + return true; } + }; + ModelingResourceFilter wsFilter = new ModelingResourceFilter(filter); + wsFilter.setShowHiddenProjects(true); + final Object[] models = WidgetUtil.showWorkspaceObjectSelectionDialog(ADD_FILE_DIALOG_TITLE, + ADD_FILE_DIALOG_MESSAGE, true, null, wsFilter, getValidator(), getModelLabelProvider()); + if (!getVdb().getDataPolicyEntries().isEmpty()) { + MessageDialog.openInformation(Display.getCurrent().getActiveShell(), + VdbEditor.CONFIRM_DIALOG_TITLE, INFORM_DATA_ROLES_ON_ADD_MESSAGE); + } + + // indicates if this is the first time models are being added + boolean firstTime = (modelsGroup.getTable().getViewer().getTable().getItemCount() == 0); + + // add the models + for (final Object model : models) + getVdb().addModelEntry(((IFile) model).getFullPath(), new NullProgressMonitor()); + + // refresh table from model + modelsGroup.getTable().getViewer().refresh(); + // pack columns if first time a model is added + if (firstTime) { + WidgetUtil.pack(modelsGroup.getTable().getViewer()); } - } - }); - dataRolesGroup.add(dataRolesGroup.new EditButtonProvider() { + } + }; - @Override - public void selected( IStructuredSelection selection ) { - VdbDataRole vdbDataRole = (VdbDataRole)selection.getFirstElement(); - if (vdbDataRole == null) { - return; - } - ContainerImpl tempContainer = null; - try { - Collection modelFiles = vdb.getModelFiles(); + modelsGroup.add(addProvider); - tempContainer = (ContainerImpl)ModelerCore.createContainer("tempVdbModelContainer"); //$NON-NLS-1$ - ModelEditorImpl.setContainer(tempContainer); - for (File modelFile : modelFiles) { - boolean isVisible = true; + ButtonProvider removeProvider = new ButtonProvider() { + /** + * {@inheritDoc} + * + * @see com.metamatrix.ui.internal.widget.ButtonProvider#getImageDescriptor() + */ + @Override + public ImageDescriptor getImageDescriptor() { + return VdbUiPlugin.singleton.getImageDescriptor(Images.REMOVE_MODEL); + } - Resource r = tempContainer.getResource(URI.createFileURI(modelFile.getPath()), true); - if (isVisible && ModelUtil.isModelFile(r) && !ModelUtil.isXsdFile(r)) { - EObject firstEObj = r.getContents().get(0); - ModelAnnotation ma = ModelerCore.getModelEditor().getModelAnnotation(firstEObj); - String mmURI = ma.getPrimaryMetamodelUri(); - if (RelationalPackage.eNS_URI.equalsIgnoreCase(mmURI) || - XmlDocumentPackage.eNS_URI.equalsIgnoreCase(mmURI) || - WEB_SERVICES_VIEW_MODEL_URI.equalsIgnoreCase(mmURI)) { - // DO NOTHING. This leaves the resource in the temp container - } else { - tempContainer.getResources().remove(r); - } - } else { - tempContainer.getResources().remove(r); - } - } - } catch (CoreException e) { - // TODO Auto-generated catch block - e.printStackTrace(); - } finally { - ModelEditorImpl.setContainer(null); - } + /** + * {@inheritDoc} + * + * @see com.metamatrix.ui.internal.widget.ButtonProvider#getText() + */ + @Override + public String getText() { + return null; + } - DataRole dataPolicy = - new DataRole(vdbDataRole.getName(), - vdbDataRole.getDescription(), - vdbDataRole.isAnyAuthenticated(), - vdbDataRole.getMappedRoleNames(), vdbDataRole.getPermissions()); + /** + * {@inheritDoc} + * + * @see com.metamatrix.ui.internal.widget.ButtonProvider#getToolTip() + */ + @Override + public String getToolTip() { + return i18n("removeModelToolTip"); //$NON-NLS-1$ + } - final IWorkbenchWindow iww = VdbUiPlugin.singleton.getCurrentWorkbenchWindow(); - final NewDataRoleWizard wizard = new NewDataRoleWizard(tempContainer, dataPolicy); - - wizard.init(iww.getWorkbench(), new StructuredSelection(vdb.getModelEntries())); - final WizardDialog dialog = new WizardDialog(wizard.getShell(), wizard); - final int rc = dialog.open(); - if (rc == Window.OK ) { - // Get the Data Policy - DataRole dp = wizard.getDataRole(); - if( dp != null ) { - vdb.removeDataPolicy(vdbDataRole); - vdb.addDataPolicy(dp, new NullProgressMonitor()); - } + /** + * {@inheritDoc} + * + * @see com.metamatrix.ui.internal.widget.ButtonProvider#isEnabled(org.eclipse.jface.viewers.IStructuredSelection) + */ + @Override + public boolean isEnabled(IStructuredSelection selection) { + return !selection.isEmpty(); + } - } - } - }); - dataRolesGroup.add(dataRolesGroup.new RemoveButtonProvider() { + /** + * {@inheritDoc} + * + * @see com.metamatrix.ui.internal.widget.ButtonProvider#selected(org.eclipse.jface.viewers.IStructuredSelection) + */ + @Override + public void selected(IStructuredSelection selection) { + if (!ConfirmationDialog.confirm(CONFIRM_REMOVE_MESSAGE)) + return; + final Set entries = new HashSet(); + final Set importedBy = new HashSet(); + for (final Object element : selection.toList()) { + entries.add((VdbEntry) element); + if (element instanceof VdbModelEntry) + importedBy.addAll(((VdbModelEntry) element).getImportedBy()); + } + if (!importedBy.isEmpty()) + importedBy.removeAll(entries); + if (!importedBy.isEmpty()) { + if (!ConfirmationDialog.confirm(new ConfirmationDialog(CONFIRM_REMOVE_IMPORTED_BY_MESSAGE) { + /** + * {@inheritDoc} + * + * @see org.eclipse.jface.dialogs.MessageDialog#createCustomArea(org.eclipse.swt.widgets.Composite) + */ + @Override + protected Control createCustomArea(final Composite parent) { + final ListViewer viewer = new ListViewer(parent); + viewer.setContentProvider(new DefaultContentProvider()); + viewer.setLabelProvider(new LabelProvider() { + /** + * {@inheritDoc} + * + * @see org.eclipse.jface.viewers.LabelProvider#getText(java.lang.Object) + */ + @Override + public String getText(final Object element) { + return ((VdbEntry) element).getName().toString(); + } + }); + viewer.getList().setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true)); + viewer.setInput(importedBy); + return viewer.getControl(); + } + })) + return; + entries.addAll(importedBy); + } - @Override - public void selected(IStructuredSelection selection) { - - for (final Object element : selection.toList()) { - if( element instanceof VdbDataRole ) { - vdb.removeDataPolicy((VdbDataRole)element); - } + dataRoleResolver.modelEntriesRemoved(entries); - } - } - }); - dataRolesGroup.setInput(vdb); - - this.cloneDataRoleAction = new Action(CLONE_DATA_ROLE_LABEL) { - - @Override - public void run() { - - if( selectedDataRole != null ) { - DataRole newDR = new DataRole( - selectedDataRole.getName() + COPY_SUFFIX, - selectedDataRole.getDescription(), - selectedDataRole.isAnyAuthenticated(), - selectedDataRole.getMappedRoleNames(), - selectedDataRole.getPermissions()); - vdb.addDataPolicy(newDR, new NullProgressMonitor()); - dataRolesGroup.getTable().getViewer().refresh(); - } + for (final VdbEntry entry : entries) { + getVdb().removeEntry(entry); + } - } - }; + } + }; - this.cloneDataRoleAction.setEnabled(true); - - // Add selection changed listener so if a Physical Source model is selected, the applicable menu actions are - // retrieved via the SourceHandler extension point and interface. - // This allows changing Translator and JNDI names via existing deployed objects on Teiid Servers that are - // connected in the user's workspace. - final TableViewer dataRolesViewer = dataRolesGroup.getTable().getViewer(); - final MenuManager dataRolesMenuManager = new MenuManager(); - dataRolesViewer.getControl().setMenu(dataRolesMenuManager.createContextMenu(pg)); - dataRolesViewer.addSelectionChangedListener(new ISelectionChangedListener() { - public void selectionChanged( final SelectionChangedEvent event ) { - dataRolesMenuManager.removeAll(); - IStructuredSelection sel = (IStructuredSelection)dataRolesViewer.getSelection(); - if( sel.size() == 1 ) { - selectedDataRole = (VdbDataRole)sel.getFirstElement(); - dataRolesMenuManager.add(cloneDataRoleAction); - } - - } - }); - - // ======================= DATA POLICIES GROUP END ================================ - - synchronizeAllButton = WidgetFactory.createButton(pg, SYNCHRONIZE_ALL_BUTTON, GridData.HORIZONTAL_ALIGN_CENTER); - synchronizeAllButton.addSelectionListener(new SelectionAdapter() { + modelsGroup.add(removeProvider); - @Override - public void widgetSelected( final SelectionEvent event ) { - if (!ConfirmationDialog.confirm(CONFIRM_SYNCHRONIZE_ALL_MESSAGE)) return; - vdb.synchronize(new NullProgressMonitor()); - modelsGroup.getTable().getViewer().refresh(); - otherFilesGroup.getTable().getViewer().refresh(); - - dataRoleResolver.allSynchronized(); - VdbEditor.this.doSave(new NullProgressMonitor()); - } - }); - synchronizeAllButton.setEnabled(!vdb.isSynchronized()); + // Add selection changed listener so if a Physical Source model is + // selected, the applicable menu actions are + // retrieved via the SourceHandler extension point and interface. + // This allows changing Translator and JNDI names via existing deployed + // objects on Teiid Servers that are + // connected in the user's workspace. + final TableViewer viewer = modelsGroup.getTable().getViewer(); + final MenuManager menuManager = new MenuManager(); + viewer.getControl().setMenu(menuManager.createContextMenu(parent)); + viewer.addSelectionChangedListener(new ISelectionChangedListener() { + /** + * {@inheritDoc} + * + * @see org.eclipse.jface.viewers.ISelectionChangedListener#selectionChanged(org.eclipse.jface.viewers.SelectionChangedEvent) + */ + @Override + public void selectionChanged(final SelectionChangedEvent event) { + menuManager.removeAll(); + final Object[] actions = SourceHandlerExtensionManager.findApplicableActions(viewer.getSelection()); + if (actions != null) + for (final Object action : actions) { + if (action instanceof IAction) + menuManager.add((IAction) action); + } - group.setFont(modelsGroup.getGroup().getFont()); + } + }); - // pack and resize: - pg.pack(true); - - ResourcesPlugin.getWorkspace().addResourceChangeListener(this); - } + // set a custom cell editor on translator column + EditingSupport editor = new TranslatorEditingSupport(modelsGroup.getViewer(), getVdb().getFile()); + modelsGroup.getTable().getColumn(5).setEditingSupport(editor); + + // set a custom cell editor on JNDI column + editor = new JndiEditingSupport(modelsGroup.getViewer(), getVdb().getFile()); + modelsGroup.getTable().getColumn(6).setEditingSupport(editor); + + modelsGroup.setInput(vdb); + } /** * {@inheritDoc} @@ -960,6 +1814,14 @@ return vdb; } + ModelLabelProvider getModelLabelProvider() { + return this.modelLabelProvider; + } + + ISelectionStatusValidator getValidator() { + return this.validator; + } + /** * {@inheritDoc} * @@ -971,10 +1833,19 @@ final IFile file = ((IFileEditorInput)input).getFile(); vdb = new Vdb(file, new NullProgressMonitor()); vdbListener = new PropertyChangeListener() { - + /** + * {@inheritDoc} + * + * @see java.beans.PropertyChangeListener#propertyChange(java.beans.PropertyChangeEvent) + */ @Override public void propertyChange( final PropertyChangeEvent event ) { UiUtil.runInSwtThread(new Runnable() { + /** + * {@inheritDoc} + * + * @see java.lang.Runnable#run() + */ @Override public void run() { if( !disposed ) { @@ -1035,6 +1906,7 @@ || MODEL_JNDI_NAME.equals(property)) { modelsGroup.getTable().getViewer().refresh(); otherFilesGroup.getTable().getViewer().refresh(); + modelsGroup.getTable().getViewer().getTable().redraw(); // needed to update the synchronized image } boolean syncChanged = false; for(VdbEntry entry : vdb.getEntries() ) { @@ -1057,6 +1929,7 @@ * @param event * @see org.eclipse.core.resources.IResourceChangeListener#resourceChanged(org.eclipse.core.resources.IResourceChangeEvent) */ + @Override public void resourceChanged( IResourceChangeEvent event ) { int type = event.getType(); if (type == IResourceChangeEvent.POST_CHANGE) { @@ -1064,12 +1937,22 @@ IResourceDelta delta = event.getDelta(); if (delta != null) { delta.accept(new IResourceDeltaVisitor() { - + /** + * {@inheritDoc} + * + * @see org.eclipse.core.resources.IResourceDeltaVisitor#visit(org.eclipse.core.resources.IResourceDelta) + */ + @Override public boolean visit( IResourceDelta delta ) { - if (delta.getResource().equals(vdb.getFile()) && ((delta.getKind() & IResourceDelta.REMOVED) != 0)) { + if (delta.getResource().equals(getVdb().getFile()) && ((delta.getKind() & IResourceDelta.REMOVED) != 0)) { Display.getDefault().asyncExec(new Runnable() { - + /** + * {@inheritDoc} + * + * @see java.lang.Runnable#run() + */ + @Override public void run() { if (Display.getDefault().isDisposed()) { return; @@ -1094,4 +1977,127 @@ } } + class TranslatorEditingSupport extends ResourceEditingSupport { + + /** + * @param viewer + * @param vdb + */ + public TranslatorEditingSupport( ColumnViewer viewer, + IResource vdb ) { + super(viewer, vdb); + } + + /** + * {@inheritDoc} + * + * @see com.metamatrix.ui.table.ResourceEditingSupport#canAddNewValue(java.lang.Object) + */ + @Override + protected boolean canAddNewValue( Object element ) { + return true; + } + + /** + * {@inheritDoc} + * + * @see com.metamatrix.ui.table.ResourceEditingSupport#getElementValue(java.lang.Object) + */ + @Override + protected String getElementValue( Object element ) { + return ((VdbModelEntry)element).getTranslator(); + } + + /** + * {@inheritDoc} + * + * @see com.metamatrix.ui.table.ResourceEditingSupport#refreshItems(java.lang.Object) + */ + @Override + protected String[] refreshItems( Object element ) { + List translators = new ArrayList(); + // get the available translators from the server + String[] serverTypes = SourceHandlerExtensionManager.getVdbConnectionFinder().getTranslatorTypes(); + + if (serverTypes != null) { + translators.addAll(Arrays.asList(serverTypes)); + Collections.sort(translators); + } + + return translators.toArray(new String[translators.size()]); + } + + /** + * {@inheritDoc} + * + * @see com.metamatrix.ui.table.ResourceEditingSupport#setElementValue(java.lang.Object, java.lang.String) + */ + @Override + protected void setElementValue( Object element, + String newValue ) { + if (newValue == null) { + newValue = ""; //$NON-NLS-1$ + } + + ((VdbModelEntry)element).setTranslator(newValue); + } + } + + class JndiEditingSupport extends ResourceEditingSupport { + + /** + * @param viewer + * @param vdb + */ + public JndiEditingSupport( ColumnViewer viewer, + IResource vdb ) { + super(viewer, vdb); + } + + /** + * {@inheritDoc} + * + * @see com.metamatrix.ui.table.ResourceEditingSupport#canAddNewValue(java.lang.Object) + */ + @Override + protected boolean canAddNewValue( Object element ) { + return true; + } + + /** + * {@inheritDoc} + * + * @see com.metamatrix.ui.table.ResourceEditingSupport#getElementValue(java.lang.Object) + */ + @Override + protected String getElementValue( Object element ) { + return ((VdbModelEntry)element).getJndiName(); + } + + /** + * {@inheritDoc} + * + * @see com.metamatrix.ui.table.ResourceEditingSupport#refreshItems(java.lang.Object) + */ + @Override + protected String[] refreshItems( Object element ) { + return SourceHandlerExtensionManager.getVdbConnectionFinder().getDataSourceNames(); + } + + /** + * {@inheritDoc} + * + * @see com.metamatrix.ui.table.ResourceEditingSupport#setElementValue(java.lang.Object, java.lang.String) + */ + @Override + protected void setElementValue( Object element, + String newValue ) { + if (newValue == null) { + newValue = ""; //$NON-NLS-1$ + } + + ((VdbModelEntry)element).setJndiName(newValue); + } + } + } #P org.teiid.designer.ui.common Index: src/com/metamatrix/ui/internal/widget/ButtonProvider.java =================================================================== --- src/com/metamatrix/ui/internal/widget/ButtonProvider.java (revision 1634) +++ src/com/metamatrix/ui/internal/widget/ButtonProvider.java (working copy) @@ -7,18 +7,28 @@ */ package com.metamatrix.ui.internal.widget; +import org.eclipse.jface.resource.ImageDescriptor; import org.eclipse.jface.viewers.IStructuredSelection; -import org.eclipse.swt.widgets.Button; /** * */ public interface ButtonProvider { + + /** + * @return the image descriptor or null + */ + ImageDescriptor getImageDescriptor(); /** * @return the {@link Button button's} text */ String getText(); + + /** + * @return the {@link Button button's} tooltip (null or empty of no tooltip) + */ + String getToolTip(); /** * @param selection Index: src/com/metamatrix/ui/table/ResourceEditingSupport.java =================================================================== --- src/com/metamatrix/ui/table/ResourceEditingSupport.java (revision 0) +++ src/com/metamatrix/ui/table/ResourceEditingSupport.java (revision 0) @@ -0,0 +1,198 @@ +/* + * JBoss, Home of Professional Open Source. + * + * See the LEGAL.txt file distributed with this work for information regarding copyright ownership and licensing. + * + * See the AUTHORS.txt file distributed with this work for a full listing of individual contributors. + */ +package com.metamatrix.ui.table; + +import org.eclipse.core.resources.IResource; +import org.eclipse.jface.viewers.CellEditor; +import org.eclipse.jface.viewers.ColumnViewer; +import org.eclipse.jface.viewers.ComboBoxCellEditor; +import org.eclipse.jface.viewers.EditingSupport; +import org.eclipse.jface.viewers.ICellEditorValidator; +import org.eclipse.jface.viewers.TextCellEditor; +import org.eclipse.swt.SWT; +import org.eclipse.swt.custom.CCombo; +import org.eclipse.swt.widgets.Composite; + +/** + * The ResourceEditingSupport class provides cell editing support for a resource. A combobox editor is used when there + * are known values. Otherwise a text editor is used. + */ +public abstract class ResourceEditingSupport extends EditingSupport { + + /** + * The current {@link CellEditor}. + */ + protected CellEditor currentEditor; + + /** + * The editors allowed values (null or empty if a text cell editor should be used). + */ + private String[] allowedValues; + + /** + * An optional validator. + */ + private ICellEditorValidator validator; + + /** + * The resource whose attributes are used to determine if the cell editor value is editable. + */ + private IResource resource; + + /** + * @param viewer the table viewer (may not be null) + * @param resource the resource being edited (may not be null) + */ + public ResourceEditingSupport( ColumnViewer viewer, + IResource resource ) { + super(viewer); + this.resource = resource; + } + + /** + * @param element the element being edited + * @return true if the ComboBox editor should be editable + */ + protected boolean canAddNewValue( Object element ) { + return false; + } + + /** + * {@inheritDoc} + * + * @see org.eclipse.jface.viewers.EditingSupport#canEdit(java.lang.Object) + */ + @Override + protected boolean canEdit( Object element ) { + return !this.resource.getResourceAttributes().isReadOnly(); + } + + /** + * {@inheritDoc} + * + * @see org.eclipse.jface.viewers.EditingSupport#getCellEditor(java.lang.Object) + */ + @Override + protected CellEditor getCellEditor( Object element ) { + this.allowedValues = refreshItems(element); + + // makes sure items is null if empty + if ((this.allowedValues != null) && (this.allowedValues.length == 0)) { + this.allowedValues = null; + } + + if (this.allowedValues == null) { + // use text editor since there are no known values + this.currentEditor = new TextCellEditor((Composite)getViewer().getControl()); + + // hook validator up + if (this.validator != null) { + this.currentEditor.setValidator(this.validator); + } + } else { + // use combobox editor since we do have known values + int style = (canAddNewValue(element) ? SWT.NONE : SWT.READ_ONLY); + ComboBoxCellEditor comboEditor = new ComboBoxCellEditor((Composite)getViewer().getControl(), new String[0], style); + comboEditor.setItems(this.allowedValues); + this.currentEditor = comboEditor; + } + + return this.currentEditor; + } + + /** + * @param element the object whose value is being obtained + * @return the value + */ + protected abstract String getElementValue( Object element ); + + /** + * {@inheritDoc} + * + * @see org.eclipse.jface.viewers.EditingSupport#getValue(java.lang.Object) + */ + @Override + protected Object getValue( Object element ) { + String value = getElementValue(element); + + if (value == null) { + value = ""; //$NON-NLS-1$ + } + + // when using text editor just return the value + if (this.allowedValues == null) { + return value; + } + + // when using combobox editor return index of value + for (int i = 0; i < this.allowedValues.length; ++i) { + if (value.equals(this.allowedValues[i])) { + return i; + } + } + + // current value is not found on server insert it at index zero + String[] temp = new String[this.allowedValues.length + 1]; + temp[0] = value; + System.arraycopy(this.allowedValues, 0, temp, 1, this.allowedValues.length); + this.allowedValues = temp; + ((ComboBoxCellEditor)this.currentEditor).setItems(this.allowedValues); + return 0; + } + + /** + * @param element the element whose items are being requested (never null) + * @return the list of known values (can be null or empty) + */ + protected abstract String[] refreshItems( Object element ); + + /** + * @param element the element whose value needs to be set + * @param newValue the new value + */ + protected abstract void setElementValue( Object element, + String newValue ); + + /** + * {@inheritDoc} + * + * @see org.eclipse.jface.viewers.EditingSupport#setValue(java.lang.Object, java.lang.Object) + */ + @Override + protected void setValue( Object element, + Object value ) { + String newValue; + + if (value instanceof Integer) { + // using the combobox editor + int index = (Integer)value; + + if (index == -1) { + // user typed in a new value + newValue = ((CCombo)((ComboBoxCellEditor)this.currentEditor).getControl()).getText(); + } else { + // user picked an existing value + newValue = this.allowedValues[index]; + } + } else { + // using the text editor + newValue = (String)value; + } + + setElementValue(element, newValue); + getViewer().refresh(element); + } + + /** + * @param validator the validator to use when editing a cell (can be null if no validation should be done) + */ + public void setValidator( ICellEditorValidator validator ) { + this.validator = validator; + } + +} Index: src/com/metamatrix/ui/table/TableAndToolBar.java =================================================================== --- src/com/metamatrix/ui/table/TableAndToolBar.java (revision 0) +++ src/com/metamatrix/ui/table/TableAndToolBar.java (revision 0) @@ -0,0 +1,130 @@ +/* + * JBoss, Home of Professional Open Source. + * + * See the LEGAL.txt file distributed with this work for information regarding copyright ownership and licensing. + * + * See the AUTHORS.txt file distributed with this work for a full listing of individual contributors. + */ +package com.metamatrix.ui.table; + +import org.eclipse.jface.action.Action; +import org.eclipse.jface.action.IAction; +import org.eclipse.jface.action.Separator; +import org.eclipse.jface.action.ToolBarManager; +import org.eclipse.jface.viewers.DoubleClickEvent; +import org.eclipse.jface.viewers.IDoubleClickListener; +import org.eclipse.jface.viewers.ISelectionChangedListener; +import org.eclipse.jface.viewers.IStructuredSelection; +import org.eclipse.jface.viewers.SelectionChangedEvent; +import org.eclipse.jface.viewers.TableViewer; +import org.eclipse.swt.SWT; +import org.eclipse.swt.widgets.Composite; +import org.eclipse.swt.widgets.ToolBar; + +import com.metamatrix.ui.internal.widget.ButtonProvider; + +/** + * @param + */ +public final class TableAndToolBar { + + private final Table table; + private final ToolBarManager toolBarMgr; + + /** + * @param + * @param parent the parent panel (never null) + * @param span the layout data horizontal span + * @param tableProvider + * @param columnProviders + */ + public TableAndToolBar( final Composite parent, + final int span, + final TableProvider tableProvider, + final ColumnProvider... columnProviders ) { + // Create table + table = new Table(parent, tableProvider, columnProviders); + + // Create button bar + ToolBar toolBar = new ToolBar(parent, SWT.PUSH | SWT.BORDER); + this.toolBarMgr = new ToolBarManager(toolBar); + + // add doubleclick listener + if (tableProvider.isDoubleClickSupported()) { + getViewer().addDoubleClickListener(new IDoubleClickListener() { + @Override + public void doubleClick( final DoubleClickEvent event ) { + tableProvider.doubleClicked((T)((IStructuredSelection)event.getSelection()).getFirstElement()); + } + }); + } + } + + /** + * @param buttonProvider the button provider (may not be null) + */ + public void add( final ButtonProvider buttonProvider ) { + assert (buttonProvider != null); + + // add a separator between toolbar buttons + if (this.toolBarMgr.getItems().length != 0) { + this.toolBarMgr.add(new Separator()); + } + + // create action using information from button provider + final IAction action = new Action(buttonProvider.getText(), SWT.BORDER) { + @Override + public void run() { + // let provider know button was pushed and refresh tree + buttonProvider.selected((IStructuredSelection)getViewer().getSelection()); + getViewer().refresh(); + } + }; + + action.setToolTipText(buttonProvider.getToolTip()); + action.setImageDescriptor(buttonProvider.getImageDescriptor()); + this.toolBarMgr.add(action); // add to toolbar + + // initial enablement + if (!buttonProvider.isEnabled((IStructuredSelection)getViewer().getSelection())) { + action.setEnabled(false); + } + + // update toolbar to show new action + this.toolBarMgr.update(true); + + // add viewer selection listener + getViewer().addSelectionChangedListener(new ISelectionChangedListener() { + @Override + public void selectionChanged(SelectionChangedEvent event) { + boolean enabled = buttonProvider.isEnabled((IStructuredSelection)event.getSelection()); + + if (enabled != action.isEnabled()) { + action.setEnabled(enabled); + } + } + }); + } + + /** + * @return table the table (never null) + */ + public Table getTable() { + return table; + } + + /** + * @return the table viewer (never null) + */ + public TableViewer getViewer() { + return table.getViewer(); + } + + /** + * @param input the viewer input + */ + public void setInput( final Object input ) { + table.setInput(input); + } + +} Index: src/com/metamatrix/ui/table/Table.java =================================================================== --- src/com/metamatrix/ui/table/Table.java (revision 1634) +++ src/com/metamatrix/ui/table/Table.java (working copy) @@ -33,6 +33,7 @@ public class Table { final TableViewer viewer; + final List columns; /** * @param @@ -72,8 +73,11 @@ table.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true)); // Create table columns + this.columns = new ArrayList(); + for (final ColumnProvider columnProvider : columnProviders) { final TableViewerColumn viewerCol = new TableViewerColumn(viewer, columnProvider.getAlignment()); + this.columns.add(viewerCol); viewerCol.setLabelProvider(new ColumnLabelProvider() { @SuppressWarnings( "unchecked" ) @@ -137,7 +141,7 @@ } // Create listener to control position of images within cells final Listener paintListener = new Listener() { - + @Override @SuppressWarnings( "unchecked" ) public void handleEvent( final Event event ) { final ColumnProvider columnProvider = columnProviders[event.index]; @@ -190,6 +194,15 @@ } /** + * @param index the index of the column being requested + * @return the column + * @throws IndexOutOfBoundsException if index is not valid + */ + public TableViewerColumn getColumn( int index ) { + return this.columns.get(index); + } + + /** * @return viewer */ public TableViewer getViewer() { #P org.teiid.designer.vdb.test Index: src/org/teiid/designer/vdb/VdbModelEntryTest.java =================================================================== --- src/org/teiid/designer/vdb/VdbModelEntryTest.java (revision 1634) +++ src/org/teiid/designer/vdb/VdbModelEntryTest.java (working copy) @@ -17,7 +17,9 @@ import static org.mockito.Mockito.mock; import static org.mockito.Mockito.when; import static org.powermock.api.mockito.PowerMockito.mockStatic; + import javax.xml.bind.JAXBContext; + import org.eclipse.core.resources.IFile; import org.eclipse.core.resources.IMarker; import org.eclipse.core.resources.ResourcesPlugin; @@ -31,6 +33,7 @@ import org.powermock.modules.junit4.PowerMockRunner; import org.teiid.core.designer.EclipseMock; import org.teiid.designer.core.ModelWorkspaceMock; + import com.metamatrix.core.modeler.util.FileUtils; import com.metamatrix.core.modeler.util.OperationUtil; import com.metamatrix.core.modeler.util.OperationUtil.ReturningUnreliable; @@ -89,6 +92,7 @@ when(ModelUtil.isPhysical(model)).thenReturn(true); final ModelResource modelResource = mock(ModelResource.class); when(ModelerCore.getModelEditor().findModelResource(model)).thenReturn(modelResource); + when(ModelerCore.getModelEditor().findModelResource(file)).thenReturn(modelResource); final ModelObjectAnnotations annotations = mock(ModelObjectAnnotations.class); when(modelResource.getAnnotations()).thenReturn(annotations); entry = vdb.addModelEntry(modelPath, null);