/* * 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 org.teiid.designer.relational.ui.edit; import java.util.ArrayList; import java.util.Collection; import java.util.Collections; import java.util.HashSet; import java.util.List; import java.util.Properties; import java.util.Set; import org.eclipse.core.runtime.IStatus; import org.eclipse.core.runtime.Status; import org.eclipse.emf.ecore.EObject; import org.eclipse.jface.dialogs.IDialogConstants; import org.eclipse.jface.dialogs.MessageDialog; import org.eclipse.jface.dialogs.TitleAreaDialog; import org.eclipse.jface.layout.GridDataFactory; import org.eclipse.jface.layout.GridLayoutFactory; import org.eclipse.jface.viewers.ColumnLabelProvider; 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.ITreeContentProvider; import org.eclipse.jface.viewers.SelectionChangedEvent; import org.eclipse.jface.viewers.TableLayout; import org.eclipse.jface.viewers.TableViewer; import org.eclipse.jface.viewers.TableViewerColumn; import org.eclipse.jface.viewers.Viewer; import org.eclipse.jface.window.Window; import org.eclipse.swt.SWT; import org.eclipse.swt.events.ModifyEvent; import org.eclipse.swt.events.ModifyListener; import org.eclipse.swt.events.SelectionAdapter; import org.eclipse.swt.events.SelectionEvent; import org.eclipse.swt.graphics.Image; import org.eclipse.swt.layout.GridData; import org.eclipse.swt.widgets.Button; 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.Label; import org.eclipse.swt.widgets.Shell; import org.eclipse.swt.widgets.TabFolder; import org.eclipse.swt.widgets.TabItem; import org.eclipse.swt.widgets.Table; import org.eclipse.swt.widgets.TableItem; import org.eclipse.swt.widgets.Text; import org.eclipse.ui.dialogs.ISelectionStatusValidator; import org.teiid.core.designer.util.StringUtilities; import org.teiid.designer.core.ModelerCore; import org.teiid.designer.core.workspace.ModelResource; import org.teiid.designer.core.workspace.ModelWorkspaceException; import org.teiid.designer.metamodels.core.ModelType; import org.teiid.designer.metamodels.relational.View; import org.teiid.designer.relational.RelationalConstants; import org.teiid.designer.relational.model.RelationalColumn; import org.teiid.designer.relational.model.RelationalForeignKey; import org.teiid.designer.relational.model.RelationalIndex; import org.teiid.designer.relational.model.RelationalPrimaryKey; import org.teiid.designer.relational.model.RelationalTable; import org.teiid.designer.relational.model.RelationalUniqueConstraint; import org.teiid.designer.relational.ui.Messages; import org.teiid.designer.relational.ui.UiConstants; import org.teiid.designer.relational.ui.UiPlugin; import org.teiid.designer.relational.ui.util.RelationalUiUtil; import org.teiid.designer.ui.common.UILabelUtil; import org.teiid.designer.ui.common.UiLabelConstants; import org.teiid.designer.ui.common.eventsupport.IDialogStatusListener; import org.teiid.designer.ui.common.table.TableViewerBuilder; import org.teiid.designer.ui.common.text.StyledTextEditor; import org.teiid.designer.ui.common.util.WidgetFactory; import org.teiid.designer.ui.common.util.WidgetUtil; import org.teiid.designer.ui.common.viewsupport.ClosedProjectFilter; import org.teiid.designer.ui.common.viewsupport.StatusInfo; import org.teiid.designer.ui.explorer.ModelExplorerContentProvider; import org.teiid.designer.ui.explorer.ModelExplorerLabelProvider; import org.teiid.designer.ui.viewsupport.DesignerPropertiesUtil; import org.teiid.designer.ui.viewsupport.ModelUtilities; import org.teiid.designer.ui.viewsupport.ModelWorkspaceDialog; import org.teiid.designer.ui.viewsupport.SingleProjectFilter; /** * @since 8.0 */ public class RelationalTableEditorPanel extends RelationalEditorPanel implements RelationalConstants { private List<String> MULTIPLICITY_LIST; private TabItem generalPropertiesTab; private TabItem columnsTab; private TabItem primaryKeyTab; private TabItem uniqueConstraintTab; private TabItem foreignKeysTab; private TabItem nativeQueryTab; private TabItem indexesTab; // table property widgets private Button materializedCB, supportsUpdateCB, isSystemTableCB, includePrimaryKeyCB; private Button findTableReferenceButton; private Label materializedTableLabel; private Text cardinalityText, materializedTableText, primaryKeyNameText, primaryKeyNISText, nativeQueryHelpText; private StyledTextEditor nativeQueryTextEditor; // column widgets private Button addColumnButton, editColumnButton, deleteColumnButton, upColumnButton, downColumnButton; private Button changePkColumnsButton, addFKButton, editFKButton, deleteFKButton; private Button addUCButton, editUCButton, deleteUCButton; private Button addIndexButton, deleteIndexButton, editIndexButton; private TableViewerBuilder columnsViewer; private TableViewerBuilder pkColumnsViewer, fkViewer; //ucColumnsViewer, private TableViewerBuilder uniqueConstraintsViewer, indexesViewer; private boolean validationPerformed = false; private int HEIGHT_HINT_80 = 80; /** * @param parent the parent panel * @param dialogModel dialog model * @param statusListener the status listener */ public RelationalTableEditorPanel(Composite parent, RelationalDialogModel dialogModel, IDialogStatusListener statusListener) { super(parent, dialogModel, statusListener); MULTIPLICITY_LIST = new ArrayList<String>(); for( String str : MULTIPLICITY.AS_ARRAY ) { MULTIPLICITY_LIST.add(str); } } @Override protected RelationalTable getRelationalReference() { return (RelationalTable) super.getRelationalReference(); } @Override protected void createPanel(Composite parent) { createNameGroup(parent); TabFolder tabFolder = createTabFolder(parent); createGeneralPropertiesTab(tabFolder); createColumnsTab(tabFolder); createPrimaryKeyTab(tabFolder); createUniqueConstraintTab(tabFolder); createForeignKeysTab(tabFolder); createIndexesTab(tabFolder); createNativeQueryTab(tabFolder); } private void createGeneralPropertiesTab(TabFolder folderParent) { // build the SELECT tab Composite thePanel = createPropertiesPanel(folderParent); this.generalPropertiesTab = new TabItem(folderParent, SWT.NONE); this.generalPropertiesTab.setControl(thePanel); this.generalPropertiesTab.setText(UILabelUtil.getLabel(UiLabelConstants.LABEL_IDS.PROPERTIES)); this.generalPropertiesTab.setImage(RelationalUiUtil.getRelationalImage(TYPES.TABLE, ModelType.PHYSICAL, Status.OK_STATUS)); } private void createColumnsTab(TabFolder folderParent) { Composite thePanel = createColumnTableGroup(folderParent); this.columnsTab = new TabItem(folderParent, SWT.NONE); this.columnsTab.setControl(thePanel); this.columnsTab.setText(Messages.columnsLabel); this.columnsTab.setImage(RelationalUiUtil.getRelationalImage(TYPES.COLUMN, ModelType.PHYSICAL, Status.OK_STATUS)); } private void createPrimaryKeyTab(TabFolder folderParent) { Composite thePanel = createPrimaryKeyPanel(folderParent); this.primaryKeyTab = new TabItem(folderParent, SWT.NONE); this.primaryKeyTab.setControl(thePanel); this.primaryKeyTab.setText(Messages.primaryKeyLabel); this.primaryKeyTab.setImage(RelationalUiUtil.getRelationalImage(TYPES.PK, ModelType.PHYSICAL, Status.OK_STATUS)); } private void createUniqueConstraintTab(TabFolder folderParent) { Composite thePanel = createUniqueConstraintPanel(folderParent); this.uniqueConstraintTab = new TabItem(folderParent, SWT.NONE); this.uniqueConstraintTab.setControl(thePanel); this.uniqueConstraintTab.setText(Messages.uniqueConstraintLabel); this.uniqueConstraintTab.setImage(RelationalUiUtil.getRelationalImage(TYPES.UC, ModelType.PHYSICAL, Status.OK_STATUS)); } private void createForeignKeysTab(TabFolder folderParent) { Composite thePanel = createForeignKeysPanel(folderParent); this.foreignKeysTab = new TabItem(folderParent, SWT.NONE); this.foreignKeysTab.setControl(thePanel); this.foreignKeysTab.setText(Messages.foreignKeysLabel); this.foreignKeysTab.setImage(RelationalUiUtil.getRelationalImage(TYPES.FK, ModelType.PHYSICAL, Status.OK_STATUS)); } private void createIndexesTab(TabFolder folderParent) { Composite thePanel = createIndexesPanel(folderParent); this.indexesTab = new TabItem(folderParent, SWT.NONE); this.indexesTab.setControl(thePanel); this.indexesTab.setText(Messages.indexesLabel); this.indexesTab.setImage(RelationalUiUtil.getRelationalImage(TYPES.INDEX, ModelType.PHYSICAL, Status.OK_STATUS)); } private void createNativeQueryTab(TabFolder folderParent) { Composite thePanel = createNativeQueryPanel(folderParent); this.nativeQueryTab = new TabItem(folderParent, SWT.NONE); this.nativeQueryTab.setControl(thePanel); this.nativeQueryTab.setText(Messages.nativeQueryLabel); this.nativeQueryTab.setImage(RelationalUiUtil.getNativeSQLImage(Status.OK_STATUS)); } @Override protected void synchronizeExtendedUI() { synchronizePropertiesTab(); synchronizeColumnsTab(); synchronizePrimaryKeyTab(); synchronizeForeignKeyTab(); synchronizeUniqueConstraintTab(); synchronizeIndexTab(); synchronizeNativeQueryTab(); setNativeQueryEnablement(true ); setKeyTabsEnablement(true); } /** * Properties Tab */ private void synchronizePropertiesTab() { if (generalPropertiesTab == null) return; if( WidgetUtil.widgetValueChanged(this.cardinalityText, getRelationalReference().getCardinality()) ) { this.cardinalityText.setText(Integer.toString(getRelationalReference().getCardinality())); } if (this.materializedCB != null) { boolean isMaterialized = getRelationalReference().isMaterialized(); if (WidgetUtil.widgetValueChanged(materializedCB, isMaterialized)) { this.materializedCB.setSelection(isMaterialized); } this.materializedTableText.setEnabled(isMaterialized); this.findTableReferenceButton.setEnabled(isMaterialized); if (WidgetUtil.widgetValueChanged(materializedCB, getRelationalReference().getSupportsUpdate())) { this.supportsUpdateCB.setSelection(getRelationalReference().getSupportsUpdate()); } } if( WidgetUtil.widgetValueChanged(isSystemTableCB, getRelationalReference().isSystem())) { this.isSystemTableCB.setSelection(getRelationalReference().isSystem()); } generalPropertiesTab.setImage(RelationalUiUtil.getRelationalImage(TYPES.TABLE, getRelationalReference().getModelType(), Status.OK_STATUS)); } private void synchronizeColumnsTab() { /* * Columns Tab */ this.columnsViewer.getTable().removeAll(); IStatus maxStatus = Status.OK_STATUS; for( RelationalColumn row : getRelationalReference().getColumns() ) { if( row.getStatus().getSeverity() > maxStatus.getSeverity() ) { maxStatus = row.getStatus(); } this.columnsViewer.add(row); } columnsTab.setImage(RelationalUiUtil.getRelationalImage(TYPES.COLUMN, getRelationalReference().getModelType(), maxStatus)); } /** * Foreign Keys Tab */ private void synchronizeForeignKeyTab() { if (foreignKeysTab == null) return; IStatus maxStatus; maxStatus = Status.OK_STATUS; this.fkViewer.getTable().removeAll(); for( RelationalForeignKey row : getRelationalReference().getForeignKeys()) { if( row.getStatus().getSeverity() > maxStatus.getSeverity() ) { maxStatus = row.getStatus(); } this.fkViewer.add(row); } foreignKeysTab.setImage(RelationalUiUtil.getRelationalImage(TYPES.FK, getRelationalReference().getModelType(), maxStatus)); } /** * Primary Key Tab */ private void synchronizePrimaryKeyTab() { if (primaryKeyTab == null) return; if( getRelationalReference().getPrimaryKey() == null ) { if( WidgetUtil.widgetValueChanged(includePrimaryKeyCB, false)) { this.includePrimaryKeyCB.setSelection(false); } this.primaryKeyNameText.setEnabled(false); if( WidgetUtil.widgetValueChanged(primaryKeyNameText, EMPTY_STRING)) { this.primaryKeyNameText.setText(EMPTY_STRING); } this.primaryKeyNISText.setEnabled(false); if( WidgetUtil.widgetValueChanged(primaryKeyNISText, EMPTY_STRING)) { this.primaryKeyNISText.setText(EMPTY_STRING); } this.changePkColumnsButton.setEnabled(false); this.pkColumnsViewer.getTable().removeAll(); this.pkColumnsViewer.getTable().setEnabled(false); this.primaryKeyTab.setImage(UiPlugin.getDefault().getImage(UiConstants.Images.PK_ICON)); } else { this.pkColumnsViewer.getTable().setEnabled(true); if( WidgetUtil.widgetValueChanged(includePrimaryKeyCB, true)) { this.includePrimaryKeyCB.setSelection(true); } this.primaryKeyNameText.setEnabled(true); if( getRelationalReference().getPrimaryKey().getName() != null && WidgetUtil.widgetValueChanged(primaryKeyNameText, getRelationalReference().getPrimaryKey().getName())) { this.primaryKeyNameText.setText(getRelationalReference().getPrimaryKey().getName()); } this.primaryKeyNISText.setEnabled(true); if( getRelationalReference().getPrimaryKey().getNameInSource() != null && WidgetUtil.widgetValueChanged(primaryKeyNISText, getRelationalReference().getPrimaryKey().getNameInSource())) { this.primaryKeyNISText.setText(getRelationalReference().getPrimaryKey().getNameInSource()); } this.pkColumnsViewer.getTable().removeAll(); if( !getRelationalReference().getPrimaryKey().getColumns().isEmpty() ) { for( RelationalColumn column : getRelationalReference().getPrimaryKey().getColumns() ) { this.pkColumnsViewer.add(column); } } this.changePkColumnsButton.setEnabled(true); primaryKeyTab.setImage(RelationalUiUtil.getRelationalImage(TYPES.PK, getRelationalReference().getModelType(), getRelationalReference().getPrimaryKey().getStatus())); } } /** * Unique Constraint Tab */ private void synchronizeUniqueConstraintTab() { if (uniqueConstraintTab == null) return; if( getRelationalReference().getUniqueConstraints().isEmpty() ) { this.uniqueConstraintsViewer.getTable().removeAll(); this.uniqueConstraintsViewer.getTable().setEnabled(false); } else { this.uniqueConstraintsViewer.getTable().setEnabled(true); this.uniqueConstraintsViewer.getTable().removeAll(); if( !getRelationalReference().getUniqueConstraints().isEmpty() ) { for( RelationalUniqueConstraint column : getRelationalReference().getUniqueConstraints() ) { this.uniqueConstraintsViewer.add(column); } } // Find highest severity status IStatus ucStatus = Status.OK_STATUS; for( RelationalUniqueConstraint constraint : getRelationalReference().getUniqueConstraints() ) { if( constraint.getStatus().getSeverity() > ucStatus.getSeverity() ) { ucStatus = constraint.getStatus(); } } uniqueConstraintTab.setImage(RelationalUiUtil.getRelationalImage(TYPES.UC, getRelationalReference().getModelType(), ucStatus)); } } /** * Index Tab */ private void synchronizeIndexTab() { if (indexesTab == null) return; IStatus maxStatus; maxStatus = Status.OK_STATUS; this.indexesViewer.getTable().removeAll(); for( RelationalIndex row : getRelationalReference().getIndexes()) { if( row.getStatus().getSeverity() > maxStatus.getSeverity() ) { maxStatus = row.getStatus(); } this.indexesViewer.add(row); } indexesTab.setImage(RelationalUiUtil.getRelationalImage(TYPES.INDEX, getRelationalReference().getModelType(), maxStatus)); } /** * Native Query Tab */ private void synchronizeNativeQueryTab() { if (nativeQueryTab == null) return; if( getRelationalReference().getNativeQuery() != null ) { if( !StringUtilities.equals(this.nativeQueryTextEditor.getText(), getRelationalReference().getNativeQuery()) ) { this.nativeQueryTextEditor.setText(getRelationalReference().getNativeQuery()); } } else { this.nativeQueryTextEditor.setText(EMPTY_STRING); } } private void setNativeQueryEnablement(boolean enable) { // if( enable ) { // this.nativeQueryHelpText.setText(Messages.nativeQueryHelpText); // } else { // this.nativeQueryHelpText.setText(Messages.nativeQueryNotSupportedForViews); // } // this.nativeQueryTextEditor.getTextWidget().setEnabled(enable); // if( enable ) { // nativeQueryTextEditor.getTextWidget().setBackground(Display.getCurrent().getSystemColor(SWT.COLOR_WHITE)); // } else { // nativeQueryTextEditor.getTextWidget().setBackground(nativeQueryTextEditor.getTextWidget().getParent().getBackground()); // } } private void setKeyTabsEnablement(boolean enable) { addFKButton.setEnabled(enable); editFKButton.setEnabled(false); deleteFKButton.setEnabled(false); includePrimaryKeyCB.setEnabled(enable); addUCButton.setEnabled(enable); editUCButton.setEnabled(false); deleteUCButton.setEnabled(false); addIndexButton.setEnabled(enable); editIndexButton.setEnabled(false); deleteIndexButton.setEnabled(false); // Update buttons { IStructuredSelection selection = (IStructuredSelection)uniqueConstraintsViewer.getSelection(); boolean value = ! selection.isEmpty(); editUCButton.setEnabled(value); deleteUCButton.setEnabled(value); } { IStructuredSelection selection = (IStructuredSelection)fkViewer.getSelection(); boolean value = ! selection.isEmpty(); editFKButton.setEnabled(value); deleteFKButton.setEnabled(value); } { IStructuredSelection selection = (IStructuredSelection)indexesViewer.getSelection(); boolean value = ! selection.isEmpty(); editIndexButton.setEnabled(value); deleteIndexButton.setEnabled(value); } } private Composite createPropertiesPanel(Composite parent) { Composite thePanel = WidgetFactory.createPanel(parent, SWT.NONE, 1, 3); GridLayoutFactory.fillDefaults().margins(10, 10).applyTo(thePanel); GridDataFactory.fillDefaults().grab(true, true).applyTo(thePanel); Composite cardinalityPanel = new Composite(thePanel, SWT.NONE); GridDataFactory.fillDefaults().grab(true, false).applyTo(cardinalityPanel); GridLayoutFactory.fillDefaults().numColumns(2).equalWidth(false).applyTo(cardinalityPanel); Label label = new Label(cardinalityPanel, SWT.NONE); label.setText(Messages.cardinalityLabel); this.cardinalityText = new Text(cardinalityPanel, SWT.BORDER | SWT.SINGLE); this.cardinalityText.setForeground(Display.getCurrent().getSystemColor(SWT.COLOR_DARK_BLUE)); GridDataFactory.fillDefaults().grab(true, false).applyTo(this.cardinalityText); this.cardinalityText.addModifyListener(new ModifyListener() { @Override public void modifyText( final ModifyEvent event ) { if( isSynchronizing() ) return; if( !cardinalityText.getText().isEmpty()) { try { int value = Integer.parseInt(cardinalityText.getText()); getRelationalReference().setCardinality(value); handleInfoChanged(); } catch (NumberFormatException ex) { MessageDialog.openError( getShell(), Messages.cardinalityErrorTitle, Messages.cardinalityMustBeAnInteger); return; } } } }); Composite checkButtonPanel = new Composite(thePanel, SWT.NONE); GridDataFactory.fillDefaults().grab(true, false).applyTo(checkButtonPanel); GridLayoutFactory.fillDefaults().numColumns(3).applyTo(checkButtonPanel); this.supportsUpdateCB = new Button(checkButtonPanel, SWT.CHECK | SWT.RIGHT); GridDataFactory.fillDefaults().align(SWT.LEFT, SWT.CENTER).applyTo(this.supportsUpdateCB); this.supportsUpdateCB.setText(Messages.supportsUpdateLabel); this.supportsUpdateCB.addSelectionListener(new SelectionAdapter() { /** * {@inheritDoc} * @see org.eclipse.swt.events.SelectionAdapter#widgetSelected(org.eclipse.swt.events.SelectionEvent) */ @Override public void widgetSelected( SelectionEvent e ) { getRelationalReference().setSupportsUpdate(supportsUpdateCB.getSelection()); handleInfoChanged(); } }); this.isSystemTableCB = new Button(checkButtonPanel, SWT.CHECK | SWT.RIGHT); GridDataFactory.fillDefaults().align(SWT.LEFT, SWT.CENTER).applyTo(this.isSystemTableCB); this.isSystemTableCB.setText(Messages.systemTableLabel); this.isSystemTableCB.addSelectionListener(new SelectionAdapter() { /** * {@inheritDoc} * @see org.eclipse.swt.events.SelectionAdapter#widgetSelected(org.eclipse.swt.events.SelectionEvent) */ @Override public void widgetSelected( SelectionEvent e ) { getRelationalReference().setSystem(isSystemTableCB.getSelection()); handleInfoChanged(); } }); this.materializedCB = new Button(checkButtonPanel, SWT.CHECK | SWT.RIGHT); GridDataFactory.fillDefaults().align(SWT.LEFT, SWT.CENTER).applyTo(this.materializedCB); this.materializedCB.setText(Messages.materializedLabel); this.materializedCB.addSelectionListener(new SelectionAdapter() { /** * {@inheritDoc} * @see org.eclipse.swt.events.SelectionAdapter#widgetSelected(org.eclipse.swt.events.SelectionEvent) */ @Override public void widgetSelected(SelectionEvent e) { getRelationalReference().setMaterialized(materializedCB.getSelection()); if (!materializedCB.getSelection()) { getRelationalReference().setMaterializedTable(null); } handleInfoChanged(); } }); Composite materializedPanel = new Composite(thePanel, SWT.NONE); GridDataFactory.fillDefaults().grab(true, false).applyTo(materializedPanel); GridLayoutFactory.fillDefaults().numColumns(3).applyTo(materializedPanel); materializedTableLabel = new Label(materializedPanel, SWT.NONE | SWT.RIGHT); materializedTableLabel.setText(Messages.tableReferenceLabel); GridDataFactory.fillDefaults().align(SWT.RIGHT, SWT.CENTER).applyTo(materializedTableLabel); this.materializedTableText = new Text(materializedPanel, SWT.BORDER | SWT.SINGLE); this.materializedTableText.setForeground(Display.getCurrent().getSystemColor(SWT.COLOR_DARK_BLUE)); GridDataFactory.fillDefaults().grab(true, false).applyTo(this.materializedTableText); this.materializedTableText.setEditable(false); this.findTableReferenceButton = new Button(materializedPanel, SWT.PUSH); this.findTableReferenceButton.setText(UILabelUtil.getLabel(UiLabelConstants.LABEL_IDS.ELIPSIS)); GridDataFactory.fillDefaults().hint(30, SWT.DEFAULT).applyTo(this.findTableReferenceButton); this.findTableReferenceButton.addSelectionListener(new SelectionAdapter() { @Override public void widgetSelected(SelectionEvent e) { handleBrowseWorkspaceForMatTablePressed(); } }); createDescriptionPanel(thePanel); return thePanel; } /* * Simple panel containing name, name in source values as well as a list of primary key columns from this table */ private Composite createPrimaryKeyPanel(Composite parent) { Composite thePanel = WidgetFactory.createPanel(parent, SWT.NONE, 1, 2); GridLayoutFactory.fillDefaults().numColumns(2).margins(10, 10).applyTo(thePanel); GridDataFactory.fillDefaults().grab(true, true).applyTo(thePanel); this.includePrimaryKeyCB = new Button(thePanel, SWT.CHECK | SWT.RIGHT); GridDataFactory.fillDefaults().align(SWT.LEFT, SWT.CENTER).span(2, 1).applyTo(this.includePrimaryKeyCB); this.includePrimaryKeyCB.setText(UILabelUtil.getLabel(UiLabelConstants.LABEL_IDS.INCLUDE)); this.includePrimaryKeyCB.addSelectionListener(new SelectionAdapter() { /** * {@inheritDoc} * @see org.eclipse.swt.events.SelectionAdapter#widgetSelected(org.eclipse.swt.events.SelectionEvent) */ @Override public void widgetSelected( SelectionEvent e ) { if( includePrimaryKeyCB.getSelection() ) { if( getRelationalReference().getPrimaryKey() == null ) { RelationalPrimaryKey key = new RelationalPrimaryKey(); if( primaryKeyNameText.getText() != null ) { key.setName(primaryKeyNameText.getText()); } getRelationalReference().setPrimaryKey(key); } } else { getRelationalReference().setPrimaryKey(null); } handleInfoChanged(); } }); Label label = new Label(thePanel, SWT.NONE | SWT.RIGHT); label.setText(UILabelUtil.getLabel(UiLabelConstants.LABEL_IDS.NAME)); GridDataFactory.fillDefaults().applyTo(label); this.primaryKeyNameText = new Text(thePanel, SWT.BORDER | SWT.SINGLE); this.primaryKeyNameText.setForeground(Display.getCurrent().getSystemColor(SWT.COLOR_DARK_BLUE)); GridDataFactory.fillDefaults().applyTo(this.primaryKeyNameText); this.primaryKeyNameText.addModifyListener(new ModifyListener() { @Override public void modifyText( final ModifyEvent event ) { String value = primaryKeyNameText.getText(); if( value == null ) { value = EMPTY_STRING; } if( getRelationalReference().getPrimaryKey() != null ) { RelationalPrimaryKey key = getRelationalReference().getPrimaryKey(); key.setName(value); } handleInfoChanged(); } }); label = new Label(thePanel, SWT.NONE | SWT.RIGHT); label.setText(Messages.nameInSourceLabel); GridDataFactory.fillDefaults().applyTo(label); this.primaryKeyNISText = new Text(thePanel, SWT.BORDER | SWT.SINGLE); this.primaryKeyNISText.setForeground(Display.getCurrent().getSystemColor(SWT.COLOR_DARK_BLUE)); GridDataFactory.fillDefaults().applyTo(this.primaryKeyNISText); this.primaryKeyNISText.addModifyListener(new ModifyListener() { @Override public void modifyText( final ModifyEvent event ) { String value = primaryKeyNISText.getText(); if( value == null ) { value = EMPTY_STRING; } if( getRelationalReference().getPrimaryKey() != null ) { RelationalPrimaryKey key = getRelationalReference().getPrimaryKey(); key.setNameInSource(value); } handleInfoChanged(); } }); Composite buttonPanel = new Composite(thePanel, SWT.NONE); GridLayoutFactory.fillDefaults().applyTo(buttonPanel); GridDataFactory.fillDefaults().align(SWT.LEFT, SWT.BEGINNING).applyTo(buttonPanel); this.changePkColumnsButton = new Button(buttonPanel, SWT.PUSH); this.changePkColumnsButton.setText(UILabelUtil.getLabel(UiLabelConstants.LABEL_IDS.CHANGE_ELIPSIS)); GridDataFactory.fillDefaults().applyTo(this.changePkColumnsButton); this.changePkColumnsButton.addSelectionListener(new SelectionAdapter() { @Override public void widgetSelected(SelectionEvent e) { SelectColumnsDialog dialog = new SelectColumnsDialog(getShell(), getRelationalReference(), true); int result = dialog.open(); if( result == Window.OK) { Collection<RelationalColumn> selectedColumns = dialog.getSelectedColumns(); if( !selectedColumns.isEmpty() ) { getRelationalReference().getPrimaryKey().setColumns(selectedColumns); } else { getRelationalReference().getPrimaryKey().setColumns(Collections.<RelationalColumn> emptyList()); } } handleInfoChanged(); } }); this.pkColumnsViewer = new TableViewerBuilder(thePanel, SWT.SINGLE | SWT.H_SCROLL | SWT.V_SCROLL | SWT.BORDER); GridDataFactory.fillDefaults().grab(true, true).hint(SWT.DEFAULT, HEIGHT_HINT_80).applyTo(this.pkColumnsViewer.getTableComposite()); // create columns TableViewerColumn column = pkColumnsViewer.createColumn(SWT.LEFT, 100, 40, true); column.getColumn().setText(Messages.columnNameLabel); column.setLabelProvider(new ColumnDataLabelProvider(0)); if( getRelationalReference() != null && getRelationalReference().getPrimaryKey() != null ) { for( RelationalColumn row : getRelationalReference().getPrimaryKey().getColumns() ) { this.columnsViewer.add(row); } } return thePanel; } private Composite createUniqueConstraintPanel(Composite parent) { // TODO: This panel needs to operate like the Foreign Key panel to allow multiple Unique Constraints // These constraints will behave just like Primary Keys so they won't need to referenced external columns/tables Composite thePanel = WidgetFactory.createPanel(parent, SWT.NONE, 1, 2); GridLayoutFactory.fillDefaults().margins(10, 10).applyTo(thePanel); GridDataFactory.fillDefaults().grab(true, true).applyTo(thePanel); // Create 1 panels // Top is just a Table of current FK with Add/Edit/Delete buttons // Bottom panel is the "Edit Composite buttonPanel = new Composite(thePanel, SWT.NONE); GridLayoutFactory.fillDefaults().numColumns(3).applyTo(buttonPanel); GridDataFactory.fillDefaults().grab(true, false).applyTo(buttonPanel); this.addUCButton = new Button(buttonPanel, SWT.PUSH); this.addUCButton.setText(UILabelUtil.getLabel(UiLabelConstants.LABEL_IDS.ADD)); GridDataFactory.fillDefaults().applyTo(this.addUCButton); this.addUCButton.addSelectionListener(new SelectionAdapter() { @Override public void widgetSelected(SelectionEvent e) { RelationalUniqueConstraint newUC = new RelationalUniqueConstraint(); EditUniqueConstraintDialog dialog = new EditUniqueConstraintDialog(getShell(), getRelationalReference(), newUC, false); int result = dialog.open(); if( result == Window.OK) { getRelationalReference().addUniqueConstraint(newUC); } handleInfoChanged(); setUCButtonsState(); } }); this.editUCButton = new Button(buttonPanel, SWT.PUSH); this.editUCButton.setText(UILabelUtil.getLabel(UiLabelConstants.LABEL_IDS.EDIT_ELIPSIS)); GridDataFactory.fillDefaults().applyTo(this.editUCButton); this.editUCButton.addSelectionListener(new SelectionAdapter() { @Override public void widgetSelected(SelectionEvent e) { RelationalUniqueConstraint uc = null; IStructuredSelection selection = (IStructuredSelection)uniqueConstraintsViewer.getSelection(); for( Object obj : selection.toArray()) { if( obj instanceof RelationalUniqueConstraint ) { uc = (RelationalUniqueConstraint) obj; break; } } if( uc != null ) { EditUniqueConstraintDialog dialog = new EditUniqueConstraintDialog(getShell(), getRelationalReference(), uc, true); dialog.open(); handleInfoChanged(); } setUCButtonsState(); } }); this.editUCButton.setEnabled(false); this.deleteUCButton = new Button(buttonPanel, SWT.PUSH); this.deleteUCButton.setText(UILabelUtil.getLabel(UiLabelConstants.LABEL_IDS.DELETE)); GridDataFactory.fillDefaults().applyTo(this.deleteUCButton); this.deleteUCButton.addSelectionListener(new SelectionAdapter() { @Override public void widgetSelected(SelectionEvent e) { RelationalUniqueConstraint uc= null; IStructuredSelection selection = (IStructuredSelection)uniqueConstraintsViewer.getSelection(); for( Object obj : selection.toArray()) { if( obj instanceof RelationalUniqueConstraint ) { uc = (RelationalUniqueConstraint) obj; break; } } if( uc != null ) { getRelationalReference().removeUniqueConstraint(uc); handleInfoChanged(); } setUCButtonsState(); } }); this.deleteUCButton.setEnabled(false); this.uniqueConstraintsViewer = new TableViewerBuilder(thePanel, SWT.SINGLE | SWT.H_SCROLL | SWT.V_SCROLL | SWT.BORDER); GridDataFactory.fillDefaults().grab(true, true).hint(SWT.DEFAULT, HEIGHT_HINT_80).applyTo(this.uniqueConstraintsViewer.getTableComposite()); // create columns TableViewerColumn column = uniqueConstraintsViewer.createColumn(SWT.LEFT, 100, 40, false); column.getColumn().setText(Messages.uniqueConstraintsLabel); column.setLabelProvider(new UniqueConstraintLabelProvider(0)); if( getRelationalReference() != null && getRelationalReference().getUniqueConstraints() != null ) { for( RelationalUniqueConstraint row : getRelationalReference().getUniqueConstraints() ) { this.uniqueConstraintsViewer.add(row); } } this.uniqueConstraintsViewer.addSelectionChangedListener(new ISelectionChangedListener() { @Override public void selectionChanged(SelectionChangedEvent event) { setUCButtonsState(); } }); this.uniqueConstraintsViewer.addDoubleClickListener(new IDoubleClickListener() { @Override public void doubleClick(DoubleClickEvent event) { IStructuredSelection sel = (IStructuredSelection)event.getSelection(); Object[] objs = sel.toArray(); if( objs.length == 1 && objs[0] instanceof RelationalUniqueConstraint) { EditUniqueConstraintDialog dialog = new EditUniqueConstraintDialog(getShell(), getRelationalReference(), (RelationalUniqueConstraint)objs[0], true); int result = dialog.open(); if( result == Window.OK) { // } handleInfoChanged(); } } }); return thePanel; } private void setUCButtonsState() { IStructuredSelection selection = (IStructuredSelection)this.uniqueConstraintsViewer.getSelection(); boolean enable = selection != null && !selection.isEmpty(); deleteUCButton.setEnabled(enable); editUCButton.setEnabled(enable); } private Composite createForeignKeysPanel(Composite parent) { Composite thePanel = WidgetFactory.createPanel(parent, SWT.NONE, 1, 2); GridLayoutFactory.fillDefaults().margins(10, 10).applyTo(thePanel); GridDataFactory.fillDefaults().grab(true, true).applyTo(thePanel); // Create 1 panels // Top is just a Table of current FK with Add/Edit/Delete buttons // Bottom panel is the "Edit Composite buttonPanel = new Composite(thePanel, SWT.NONE); GridLayoutFactory.fillDefaults().numColumns(3).applyTo(buttonPanel); GridDataFactory.fillDefaults().grab(true, false).applyTo(buttonPanel); this.addFKButton = new Button(buttonPanel, SWT.PUSH); this.addFKButton.setText(UILabelUtil.getLabel(UiLabelConstants.LABEL_IDS.ADD)); GridDataFactory.fillDefaults().applyTo(this.addFKButton); this.addFKButton.addSelectionListener(new SelectionAdapter() { @Override public void widgetSelected(SelectionEvent e) { RelationalForeignKey newFK = new RelationalForeignKey(); EditForeignKeyDialog dialog = new EditForeignKeyDialog(getShell(), getModelFile(), getRelationalReference(), newFK, false); int result = dialog.open(); if( result == Window.OK) { getRelationalReference().addForeignKey(newFK); } handleInfoChanged(); setFKButtonsState(); } }); this.editFKButton = new Button(buttonPanel, SWT.PUSH); this.editFKButton.setText(UILabelUtil.getLabel(UiLabelConstants.LABEL_IDS.EDIT_ELIPSIS)); GridDataFactory.fillDefaults().applyTo(this.editFKButton); this.editFKButton.addSelectionListener(new SelectionAdapter() { @Override public void widgetSelected(SelectionEvent e) { RelationalForeignKey fk = null; IStructuredSelection selection = (IStructuredSelection)fkViewer.getSelection(); for( Object obj : selection.toArray()) { if( obj instanceof RelationalForeignKey ) { fk = (RelationalForeignKey) obj; break; } } if( fk != null ) { EditForeignKeyDialog dialog = new EditForeignKeyDialog(getShell(), getModelFile(), getRelationalReference(), fk, true); int result = dialog.open(); if( result == Window.OK) { // TODO: inject info from tempFK if dialog isn't cancelled } handleInfoChanged(); } setFKButtonsState(); } }); this.editFKButton.setEnabled(false); this.deleteFKButton = new Button(buttonPanel, SWT.PUSH); this.deleteFKButton.setText(UILabelUtil.getLabel(UiLabelConstants.LABEL_IDS.DELETE)); GridDataFactory.fillDefaults().applyTo(this.deleteFKButton); this.deleteFKButton.addSelectionListener(new SelectionAdapter() { @Override public void widgetSelected(SelectionEvent e) { RelationalForeignKey fk = null; IStructuredSelection selection = (IStructuredSelection)fkViewer.getSelection(); for( Object obj : selection.toArray()) { if( obj instanceof RelationalForeignKey ) { fk = (RelationalForeignKey) obj; break; } } if( fk != null ) { getRelationalReference().removeForeignKey(fk); handleInfoChanged(); } setFKButtonsState(); } }); this.deleteFKButton.setEnabled(false); this.fkViewer = new TableViewerBuilder(thePanel, SWT.SINGLE | SWT.H_SCROLL | SWT.V_SCROLL | SWT.BORDER); GridDataFactory.fillDefaults().grab(true, true).hint(SWT.DEFAULT, HEIGHT_HINT_80).applyTo(this.fkViewer.getTableComposite()); // create columns TableViewerColumn column = fkViewer.createColumn(SWT.LEFT, 100, 40, false); column.getColumn().setText(Messages.fkNameLabel); column.setLabelProvider(new FKDataLabelProvider(0)); if( getRelationalReference() != null) { for( RelationalForeignKey row : getRelationalReference().getForeignKeys()) { this.fkViewer.add(row); } } this.fkViewer.addSelectionChangedListener(new ISelectionChangedListener() { @Override public void selectionChanged(SelectionChangedEvent event) { setFKButtonsState(); } }); this.fkViewer.addDoubleClickListener(new IDoubleClickListener() { @Override public void doubleClick(DoubleClickEvent event) { IStructuredSelection sel = (IStructuredSelection)event.getSelection(); Object[] objs = sel.toArray(); if( objs.length == 1 && objs[0] instanceof RelationalForeignKey) { EditForeignKeyDialog dialog = new EditForeignKeyDialog(getShell(), getModelFile(), getRelationalReference(), (RelationalForeignKey)objs[0], true); int result = dialog.open(); if( result == Window.OK) { // } handleInfoChanged(); } } }); return thePanel; } private void setFKButtonsState() { IStructuredSelection selection = (IStructuredSelection)this.fkViewer.getSelection(); boolean enable = selection != null && !selection.isEmpty(); deleteFKButton.setEnabled(enable); editFKButton.setEnabled(enable); } private Composite createIndexesPanel(Composite parent) { Composite thePanel = WidgetFactory.createPanel(parent, SWT.NONE, 1, 2); GridLayoutFactory.fillDefaults().margins(10, 10).applyTo(thePanel); GridDataFactory.fillDefaults().grab(true, true).applyTo(thePanel); Composite buttonPanel = new Composite(thePanel, SWT.NONE); GridLayoutFactory.fillDefaults().numColumns(3).applyTo(buttonPanel); GridDataFactory.fillDefaults().grab(true, false).applyTo(buttonPanel); this.addIndexButton = new Button(buttonPanel, SWT.PUSH); this.addIndexButton.setText(UILabelUtil.getLabel(UiLabelConstants.LABEL_IDS.ADD)); GridDataFactory.fillDefaults().applyTo(this.addIndexButton); this.addIndexButton.addSelectionListener(new SelectionAdapter() { @Override public void widgetSelected(SelectionEvent e) { RelationalIndex newIndex = new RelationalIndex(); EditIndexDialog dialog = new EditIndexDialog(getShell(), getRelationalReference(), newIndex, false); int result = dialog.open(); if( result == Window.OK) { getRelationalReference().addIndex(newIndex); } handleInfoChanged(); setIndexButtonsState(); } }); this.editIndexButton = new Button(buttonPanel, SWT.PUSH); this.editIndexButton.setText(UILabelUtil.getLabel(UiLabelConstants.LABEL_IDS.EDIT_ELIPSIS)); GridDataFactory.fillDefaults().applyTo(this.editIndexButton); this.editIndexButton.addSelectionListener(new SelectionAdapter() { @Override public void widgetSelected(SelectionEvent e) { RelationalIndex index = null; IStructuredSelection selection = (IStructuredSelection)indexesViewer.getSelection(); for( Object obj : selection.toArray()) { if( obj instanceof RelationalIndex ) { index = (RelationalIndex) obj; break; } } if( index != null ) { EditIndexDialog dialog = new EditIndexDialog(getShell(), getRelationalReference(), index, true); int result = dialog.open(); if( result == Window.OK) { // } handleInfoChanged(); } setIndexButtonsState(); } }); this.editIndexButton.setEnabled(false); this.deleteIndexButton = new Button(buttonPanel, SWT.PUSH); this.deleteIndexButton.setText(UILabelUtil.getLabel(UiLabelConstants.LABEL_IDS.DELETE)); GridDataFactory.fillDefaults().applyTo(this.deleteIndexButton); this.deleteIndexButton.addSelectionListener(new SelectionAdapter() { @Override public void widgetSelected(SelectionEvent e) { RelationalIndex index = null; IStructuredSelection selection = (IStructuredSelection)indexesViewer.getSelection(); for( Object obj : selection.toArray()) { if( obj instanceof RelationalIndex ) { index = (RelationalIndex) obj; break; } } if( index != null ) { getRelationalReference().removeIndex(index); handleInfoChanged(); } setIndexButtonsState(); } }); this.deleteIndexButton.setEnabled(false); this.indexesViewer = new TableViewerBuilder(thePanel, SWT.SINGLE | SWT.H_SCROLL | SWT.V_SCROLL | SWT.BORDER); GridDataFactory.fillDefaults().grab(true, true).hint(SWT.DEFAULT, HEIGHT_HINT_80).applyTo(this.indexesViewer.getTableComposite()); // create columns TableViewerColumn column = indexesViewer.createColumn(SWT.LEFT, 100, 40, false); column.getColumn().setText(Messages.indexLabel); column.setLabelProvider(new IndexDataLabelProvider(0)); if( getRelationalReference() != null && getRelationalReference().getIndexes() != null ) { for( RelationalIndex row : getRelationalReference().getIndexes() ) { this.indexesViewer.add(row); } } this.indexesViewer.addSelectionChangedListener(new ISelectionChangedListener() { @Override public void selectionChanged(SelectionChangedEvent event) { setIndexButtonsState(); } }); this.indexesViewer.addDoubleClickListener(new IDoubleClickListener() { @Override public void doubleClick(DoubleClickEvent event) { IStructuredSelection sel = (IStructuredSelection)event.getSelection(); Object[] objs = sel.toArray(); if( objs.length == 1 && objs[0] instanceof RelationalIndex) { EditIndexDialog dialog = new EditIndexDialog(getShell(), getRelationalReference(), (RelationalIndex)objs[0], true); int result = dialog.open(); if( result == Window.OK) { // } handleInfoChanged(); } setIndexButtonsState(); } }); return thePanel; } private void setIndexButtonsState() { IStructuredSelection selection = (IStructuredSelection)this.indexesViewer.getSelection(); boolean enable = selection != null && !selection.isEmpty(); deleteIndexButton.setEnabled(enable); editIndexButton.setEnabled(enable); } /* * Simple panel containing name, name in source values as well as a list of primary key columns from this table */ private Composite createNativeQueryPanel(Composite parent) { Composite thePanel = WidgetFactory.createPanel(parent, SWT.NONE, 1, 3); GridLayoutFactory.fillDefaults().margins(10, 10).applyTo(thePanel); GridDataFactory.fillDefaults().grab(true, false).applyTo(thePanel); nativeQueryHelpText = new Text(thePanel, SWT.WRAP | SWT.READ_ONLY); nativeQueryHelpText.setBackground(parent.getBackground()); nativeQueryHelpText.setForeground(Display.getCurrent().getSystemColor(SWT.COLOR_DARK_BLUE)); GridDataFactory.fillDefaults().align(SWT.FILL, SWT.BEGINNING).hint(250, 40).applyTo(nativeQueryHelpText); nativeQueryHelpText.setText(Messages.nativeQueryHelpText); final Group descGroup = WidgetFactory.createGroup(thePanel, Messages.sqlLabel, GridData.FILL_BOTH, 3); nativeQueryTextEditor = new StyledTextEditor(descGroup, SWT.MULTI | SWT.H_SCROLL | SWT.V_SCROLL | SWT.WRAP | SWT.BORDER); GridDataFactory.fillDefaults().grab(true, true).hint(SWT.DEFAULT, 200).minSize(SWT.DEFAULT, 30).applyTo(nativeQueryTextEditor.getTextWidget()); nativeQueryTextEditor.setText(""); //$NON-NLS-1$ nativeQueryTextEditor.getTextWidget().setBackground(Display.getCurrent().getSystemColor(SWT.COLOR_WHITE)); nativeQueryTextEditor.getTextWidget().addModifyListener(new ModifyListener() { @Override public void modifyText(ModifyEvent e) { getRelationalReference().setNativeQuery(nativeQueryTextEditor.getText()); handleInfoChanged(); } }); return thePanel; } private Composite createColumnTableGroup(Composite parent) { Composite thePanel = WidgetFactory.createPanel(parent, SWT.NONE, 1, 1); GridLayoutFactory.fillDefaults().margins(10, 10).applyTo(thePanel); GridDataFactory.fillDefaults().grab(true, true).applyTo(thePanel); Composite buttonPanel = WidgetFactory.createPanel(thePanel, SWT.NONE, 1, 5); GridLayoutFactory.fillDefaults().numColumns(5).applyTo(buttonPanel); GridDataFactory.fillDefaults().grab(true, false).applyTo(buttonPanel); addColumnButton = new Button(buttonPanel, SWT.PUSH); addColumnButton.setText(UILabelUtil.getLabel(UiLabelConstants.LABEL_IDS.ADD)); GridDataFactory.fillDefaults().applyTo(addColumnButton); addColumnButton.addSelectionListener(new SelectionAdapter() { @Override public void widgetSelected(SelectionEvent e) { getRelationalReference().createColumn(); handleInfoChanged(); setColumnButtonsState(); } }); editColumnButton = new Button(buttonPanel, SWT.PUSH); editColumnButton.setText(Messages.Edit); GridDataFactory.fillDefaults().applyTo(editColumnButton); editColumnButton.setEnabled(false); editColumnButton.addSelectionListener(new SelectionAdapter() { @Override public void widgetSelected(SelectionEvent e) { RelationalColumn column = null; IStructuredSelection selection = (IStructuredSelection)columnsViewer.getSelection(); for( Object obj : selection.toArray()) { if( obj instanceof RelationalColumn ) { column = (RelationalColumn) obj; break; } } if( column != null ) { EditColumnDialog dialog = new EditColumnDialog(getShell(), column); dialog.open(); handleInfoChanged(); } setColumnButtonsState(); } }); deleteColumnButton = new Button(buttonPanel, SWT.PUSH); deleteColumnButton.setText(UILabelUtil.getLabel(UiLabelConstants.LABEL_IDS.DELETE)); GridDataFactory.fillDefaults().applyTo(deleteColumnButton); deleteColumnButton.setEnabled(false); deleteColumnButton.addSelectionListener(new SelectionAdapter() { @Override public void widgetSelected(SelectionEvent e) { RelationalColumn column = null; IStructuredSelection selection = (IStructuredSelection)columnsViewer.getSelection(); for( Object obj : selection.toArray()) { if( obj instanceof RelationalColumn ) { column = (RelationalColumn) obj; break; } } if( column != null ) { getRelationalReference().removeColumn(column); handleInfoChanged(); } setColumnButtonsState(); } }); upColumnButton = new Button(buttonPanel, SWT.PUSH); upColumnButton.setText(UILabelUtil.getLabel(UiLabelConstants.LABEL_IDS.MOVE_UP)); GridDataFactory.fillDefaults().applyTo(upColumnButton); upColumnButton.setEnabled(false); upColumnButton.addSelectionListener(new SelectionAdapter() { @Override public void widgetSelected(SelectionEvent e) { RelationalColumn info = null; IStructuredSelection selection = (IStructuredSelection)columnsViewer.getSelection(); for( Object obj : selection.toArray()) { if( obj instanceof RelationalColumn ) { info = (RelationalColumn) obj; break; } } if( info != null ) { int selectedIndex = columnsViewer.getTable().getSelectionIndex(); getRelationalReference().moveColumnUp(info); handleInfoChanged(); columnsViewer.getTable().select(selectedIndex-1); } setColumnButtonsState(); } }); downColumnButton = new Button(buttonPanel, SWT.PUSH); downColumnButton.setText(UILabelUtil.getLabel(UiLabelConstants.LABEL_IDS.MOVE_DOWN)); GridDataFactory.fillDefaults().applyTo(downColumnButton); downColumnButton.setEnabled(false); downColumnButton.addSelectionListener(new SelectionAdapter() { @Override public void widgetSelected(SelectionEvent e) { RelationalColumn info = null; IStructuredSelection selection = (IStructuredSelection)columnsViewer.getSelection(); for( Object obj : selection.toArray()) { if( obj instanceof RelationalColumn ) { info = (RelationalColumn) obj; break; } } if( info != null ) { int selectedIndex = columnsViewer.getTable().getSelectionIndex(); getRelationalReference().moveColumnDown(info); handleInfoChanged(); columnsViewer.getTable().select(selectedIndex+1); } setColumnButtonsState(); } }); this.columnsViewer = new TableViewerBuilder(thePanel, (SWT.SINGLE | SWT.FULL_SELECTION | SWT.H_SCROLL | SWT.V_SCROLL | SWT.BORDER)); // create columns TableViewerColumn column = this.columnsViewer.createColumn(SWT.LEFT, 30, 40, true); column.getColumn().setText(Messages.columnNameLabel); column.setLabelProvider(new ColumnDataLabelProvider(0)); column = this.columnsViewer.createColumn(SWT.LEFT, 30, 40, true); column.getColumn().setText(Messages.dataTypeLabel); column.setLabelProvider(new ColumnDataLabelProvider(1)); column = this.columnsViewer.createColumn(SWT.LEFT, 30, 40, true); column.getColumn().setText(Messages.lengthLabel); column.setLabelProvider(new ColumnDataLabelProvider(2)); if( getRelationalReference() != null ) { for( RelationalColumn row : getRelationalReference().getColumns() ) { this.columnsViewer.add(row); } } this.columnsViewer.addSelectionChangedListener(new ISelectionChangedListener() { @Override public void selectionChanged(SelectionChangedEvent event) { setColumnButtonsState(); } }); this.columnsViewer.addDoubleClickListener(new IDoubleClickListener() { @Override public void doubleClick(DoubleClickEvent event) { IStructuredSelection sel = (IStructuredSelection)event.getSelection(); Object[] objs = sel.toArray(); if( objs.length == 1 && objs[0] instanceof RelationalColumn) { EditColumnDialog dialog = new EditColumnDialog(getShell(), (RelationalColumn)objs[0]); dialog.open(); handleInfoChanged(); } setColumnButtonsState(); } }); return thePanel; } private void setColumnButtonsState() { IStructuredSelection selection = (IStructuredSelection)this.columnsViewer.getSelection(); boolean enable = selection != null && !selection.isEmpty(); deleteColumnButton.setEnabled(enable); editColumnButton.setEnabled(enable); if( enable ) { Object[] objs = selection.toArray(); RelationalColumn columnInfo = (RelationalColumn)objs[0]; upColumnButton.setEnabled(getRelationalReference().canMoveColumnUp(columnInfo)); downColumnButton.setEnabled(getRelationalReference().canMoveColumnDown(columnInfo)); } else { upColumnButton.setEnabled(false); downColumnButton.setEnabled(false); } } @Override protected void validate() { getRelationalReference().validate(); setCanFinish(getRelationalReference().nameIsValid()); IStatus currentStatus = getRelationalReference().getStatus(); if( currentStatus.isOK() ) { setStatus(Status.OK_STATUS); } else { setStatus(currentStatus); } validationPerformed = true; } @Override public boolean canFinish() { // check if procedure name is not-null if( !validationPerformed && this.getRelationalReference().getName() != null ) { return true; } else if( validationPerformed) { return this.getRelationalReference().getName() != null; } return false; } private void handleBrowseWorkspaceForMatTablePressed() { ModelWorkspaceDialog sdDialog = createTableOrViewSelector(); // add filters sdDialog.addFilter(new ClosedProjectFilter()); Properties props = new Properties(); DesignerPropertiesUtil.setProjectName(props, getModelFile().getProject().getName()); sdDialog.addFilter(new SingleProjectFilter(props)); sdDialog.open(); if (sdDialog.getReturnCode() == Window.OK) { Object[] selections = sdDialog.getResult(); // should be single selection EObject matTableOrView = (EObject)selections[0]; String name = ModelerCore.getModelEditor().getName(matTableOrView); this.materializedTableText.setText(name); getRelationalReference().setMaterializedTable(name); ModelResource mr = ModelUtilities.getModelResource(matTableOrView); try { getRelationalReference().setMaterializedTableModelPath(mr.getCorrespondingResource().getFullPath().toString()); } catch (ModelWorkspaceException e) { e.printStackTrace(); } validate(); } } private ModelWorkspaceDialog createTableOrViewSelector() { ModelWorkspaceDialog result = new ModelWorkspaceDialog(getShell(), null, new ModelExplorerLabelProvider(), new ModelExplorerContentProvider()); String title = "Select referenced table or view"; //$NON-NLS-1$ String message = "Select referenced materialized table or view"; //$NON-NLS-1$ result.setTitle(title); result.setMessage(message); result.setAllowMultiple(false); result.setInput(ModelerCore.getWorkspace().getRoot()); result.setValidator(new ISelectionStatusValidator() { @Override public IStatus validate(Object[] selection) { if (selection == null || selection.length == 0 || selection[0] == null || (!(selection[0] instanceof org.teiid.designer.metamodels.relational.Table) && !(selection[0] instanceof View)) ) { String msg = "Selection is not a table or view"; //$NON-NLS-1$ return new StatusInfo(UiConstants.PLUGIN_ID, IStatus.ERROR,msg); } return new StatusInfo(UiConstants.PLUGIN_ID); } }); return result; } class ColumnDataLabelProvider extends ColumnLabelProvider { private final int columnNumber; public ColumnDataLabelProvider(int columnNumber) { this.columnNumber = columnNumber; } /** * {@inheritDoc} * * @see org.eclipse.jface.viewers.ColumnLabelProvider#getText(java.lang.Object) */ @Override public String getText(Object element) { if( element instanceof RelationalColumn ) { switch (this.columnNumber) { case 0: { return ((RelationalColumn)element).getName(); } case 1: { return ((RelationalColumn)element).getDatatype(); } case 2: { return Integer.toString(((RelationalColumn)element).getLength()); } } } return EMPTY_STRING; } /** * {@inheritDoc} * * @see org.eclipse.jface.viewers.CellLabelProvider#getToolTipText(java.lang.Object) */ @Override public String getToolTipText(Object element) { switch (this.columnNumber) { case 0: { return "Tooltip 1"; //getString("columnNameColumnTooltip"); //$NON-NLS-1$ } case 1: { return "Tooltip 2"; //getString("datatypeColumnTooltip"); //$NON-NLS-1$ } } return "unknown tooltip"; //$NON-NLS-1$ } @Override public Image getImage(Object element) { if( this.columnNumber == 0 ) { return UiPlugin.getDefault().getImage(UiConstants.Images.COLUMN_ICON); } return null; } } class FKDataLabelProvider extends ColumnLabelProvider { private final int columnNumber; public FKDataLabelProvider(int columnNumber) { this.columnNumber = columnNumber; } /** * {@inheritDoc} * * @see org.eclipse.jface.viewers.ColumnLabelProvider#getText(java.lang.Object) */ @Override public String getText(Object element) { if( element instanceof RelationalForeignKey ) { switch (this.columnNumber) { case 0: { if(element instanceof RelationalForeignKey) { return ((RelationalForeignKey)element).getName(); } } } } return EMPTY_STRING; } /** * {@inheritDoc} * * @see org.eclipse.jface.viewers.CellLabelProvider#getToolTipText(java.lang.Object) */ @Override public String getToolTipText(Object element) { switch (this.columnNumber) { case 0: { return "Tooltip 1"; //getString("columnNameColumnTooltip"); //$NON-NLS-1$ } case 1: { return "Tooltip 2"; //getString("datatypeColumnTooltip"); //$NON-NLS-1$ } } return "unknown tooltip"; //$NON-NLS-1$ } @Override public Image getImage(Object element) { if( this.columnNumber == 0 ) { return UiPlugin.getDefault().getImage(UiConstants.Images.FK_ICON); } return null; } } class SelectColumnsDialog extends TitleAreaDialog { private final String TITLE = Messages.selectColumnsTitle; //============================================================= // Instance variables //============================================================= private RelationalTable theTable; TableViewer columnDataViewer; private Set<RelationalColumn> selectedColumns = new HashSet<RelationalColumn>(); //============================================================= // Constructors //============================================================= /** * @param parent the parent shell * @param theTable the relational table * @param isPrimaryKeyColumns the primary key columns * */ public SelectColumnsDialog(Shell parent, RelationalTable theTable, boolean isPrimaryKeyColumns) { super(parent); this.theTable = theTable; } @Override protected void configureShell( Shell shell ) { super.configureShell(shell); shell.setText(TITLE); } /* (non-Javadoc) * @see org.eclipse.jface.window.Window#setShellStyle(int) */ @Override protected void setShellStyle( int newShellStyle ) { super.setShellStyle(newShellStyle | SWT.RESIZE | SWT.MAX); } //============================================================= // Instance methods //============================================================= @Override protected Control createDialogArea(Composite parent) { setTitle(Messages.selectColumnsSubTitle); Composite composite = (Composite)super.createDialogArea(parent); //------------------------------ // Set layout for the Composite //------------------------------ GridLayoutFactory.fillDefaults().applyTo(composite); GridDataFactory.fillDefaults().grab(true, false).applyTo(composite); Group columnsGroup = WidgetFactory.createGroup(composite, Messages.selectColumnsTitle, SWT.NONE, 1, 2); GridDataFactory.fillDefaults().grab(true, true).applyTo(columnsGroup); Table table = new Table(columnsGroup, SWT.MULTI | SWT.H_SCROLL | SWT.V_SCROLL | SWT.BORDER | SWT.CHECK); table.setHeaderVisible(false); table.setLinesVisible(true); table.setLayout(new TableLayout()); this.columnDataViewer = new TableViewer(table); GridDataFactory.fillDefaults().grab(true, false).hint(SWT.DEFAULT, 100).span(2, 1).applyTo(this.columnDataViewer.getControl()); this.columnDataViewer.setContentProvider(new ITreeContentProvider() { @Override public void inputChanged(Viewer viewer, Object oldInput, Object newInput) { // TODO Auto-generated method stub } @Override public void dispose() { // TODO Auto-generated method stub } @Override public boolean hasChildren(Object element) { return !theTable.getColumns().isEmpty(); } @Override public Object getParent(Object element) { return null; } @Override public Object[] getElements(Object inputElement) { if( inputElement instanceof RelationalTable ) { return theTable.getColumns().toArray(new Object[0]); } return new Object[0]; } @Override public Object[] getChildren(Object parentElement) { // TODO Auto-generated method stub return new Object[0]; } }); this.columnDataViewer.setLabelProvider(new ColumnDataLabelProvider(0)); this.columnDataViewer.setInput(this.theTable); for( RelationalColumn col : this.theTable.getPrimaryKey().getColumns() ) { for( TableItem item : columnDataViewer.getTable().getItems() ) { if( item.getData() == col ) { item.setChecked(true); } } } setMessage(Messages.selectColumnsMessage); return composite; } @Override public void create() { super.create(); getButton(IDialogConstants.OK_ID).setEnabled(true); } @Override protected void okPressed() { for( TableItem item : columnDataViewer.getTable().getItems() ) { if( item.getChecked() ) { this.selectedColumns.add((RelationalColumn)item.getData()); } } super.okPressed(); } public Collection<RelationalColumn> getSelectedColumns() { return selectedColumns; } } class IndexDataLabelProvider extends ColumnLabelProvider { private final int columnNumber; public IndexDataLabelProvider(int columnNumber) { this.columnNumber = columnNumber; } /** * {@inheritDoc} * * @see org.eclipse.jface.viewers.ColumnLabelProvider#getText(java.lang.Object) */ @Override public String getText(Object element) { if( element instanceof RelationalIndex ) { switch (this.columnNumber) { case 0: { if(element instanceof RelationalIndex) { RelationalIndex index = (RelationalIndex)element; String value = index.getName(); if(! index.getColumns().isEmpty() ) { int i=0; value = value + " : "; //$NON-NLS-1$ for( RelationalColumn col : index.getColumns()) { value += col.getName(); i++; if( i < index.getColumns().size()) { value += ", "; //$NON-NLS-1$ } } } return value; } } } } return EMPTY_STRING; } /** * {@inheritDoc} * * @see org.eclipse.jface.viewers.CellLabelProvider#getToolTipText(java.lang.Object) */ @Override public String getToolTipText(Object element) { switch (this.columnNumber) { case 0: { return "Tooltip 1"; //getString("columnNameColumnTooltip"); //$NON-NLS-1$ } case 1: { return "Tooltip 2"; //getString("datatypeColumnTooltip"); //$NON-NLS-1$ } } return "unknown tooltip"; //$NON-NLS-1$ } @Override public Image getImage(Object element) { if( this.columnNumber == 0 ) { return UiPlugin.getDefault().getImage(UiConstants.Images.INDEX_ICON); } return null; } } class UniqueConstraintLabelProvider extends ColumnLabelProvider { private final int columnNumber; public UniqueConstraintLabelProvider(int columnNumber) { this.columnNumber = columnNumber; } /** * {@inheritDoc} * * @see org.eclipse.jface.viewers.ColumnLabelProvider#getText(java.lang.Object) */ @Override public String getText(Object element) { if( element instanceof RelationalUniqueConstraint ) { switch (this.columnNumber) { case 0: { if(element instanceof RelationalUniqueConstraint) { RelationalUniqueConstraint index = (RelationalUniqueConstraint)element; String value = index.getName(); if(! index.getColumns().isEmpty() ) { int i=0; value = value + " : "; //$NON-NLS-1$ for( RelationalColumn col : index.getColumns()) { value += col.getName(); i++; if( i < index.getColumns().size()) { value += ", "; //$NON-NLS-1$ } } } return value; } } } } return EMPTY_STRING; } /** * {@inheritDoc} * * @see org.eclipse.jface.viewers.CellLabelProvider#getToolTipText(java.lang.Object) */ @Override public String getToolTipText(Object element) { switch (this.columnNumber) { case 0: { return "Tooltip 1"; //getString("columnNameColumnTooltip"); //$NON-NLS-1$ } case 1: { return "Tooltip 2"; //getString("datatypeColumnTooltip"); //$NON-NLS-1$ } } return "unknown tooltip"; //$NON-NLS-1$ } @Override public Image getImage(Object element) { if( this.columnNumber == 0 ) { return UiPlugin.getDefault().getImage(UiConstants.Images.UC_ICON); } return null; } } }