package org.teiid.designer.relational.ui.edit; import java.util.ArrayList; import java.util.List; import java.util.Properties; import org.eclipse.core.runtime.IStatus; import org.eclipse.core.runtime.Status; import org.eclipse.emf.ecore.EObject; import org.eclipse.jface.dialogs.MessageDialog; 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.SelectionChangedEvent; import org.eclipse.jface.viewers.TableViewerColumn; 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.widgets.Button; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Display; import org.eclipse.swt.widgets.Label; import org.eclipse.swt.widgets.TabFolder; import org.eclipse.swt.widgets.TabItem; import org.eclipse.swt.widgets.Text; import org.eclipse.ui.dialogs.ISelectionStatusValidator; 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.Table; 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.RelationalTable; 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.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; public class RelationalViewEditorPanel extends RelationalEditorPanel implements RelationalConstants { private List<String> MULTIPLICITY_LIST; private TabItem generalPropertiesTab; private TabItem columnsTab; // table property widgets private Button materializedCB, supportsUpdateCB, isSystemTableCB; private Button findTableReferenceButton; private Label materializedTableLabel; private Text cardinalityText, materializedTableText; // column widgets private Button addColumnButton, editColumnButton, deleteColumnButton, upColumnButton, downColumnButton; private TableViewerBuilder columnsViewer; private boolean validationPerformed = false; /** * @param parent the parent panel * @param dialogModel dialog model * @param statusListener the status listener */ public RelationalViewEditorPanel(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); } 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)); } @Override protected void synchronizeExtendedUI() { synchronizePropertiesTab(); synchronizeColumnsTab(); } /** * 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)); } 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.setData("cardinalityText"); 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; } 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)); this.columnsViewer.getTable().setData("view columns viewer table"); // 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(); } } }); 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 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; } } }