/* * 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.List; import org.eclipse.core.runtime.IStatus; import org.eclipse.core.runtime.Status; import org.eclipse.emf.ecore.EObject; import org.eclipse.jface.layout.GridDataFactory; import org.eclipse.jface.layout.GridLayoutFactory; import org.eclipse.jface.viewers.ColumnLabelProvider; import org.eclipse.jface.viewers.ITreeContentProvider; 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.events.SelectionListener; 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.TableItem; import org.eclipse.swt.widgets.Text; import org.eclipse.ui.dialogs.ISelectionStatusValidator; 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.relational.RelationalConstants; import org.teiid.designer.relational.model.RelationalColumn; import org.teiid.designer.relational.model.RelationalIndex; import org.teiid.designer.relational.model.RelationalModelFactory; 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.editor.EditRelationalObjectDialogModel; 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.StatusInfo; import org.teiid.designer.ui.viewsupport.ModelUtilities; import org.teiid.designer.ui.viewsupport.SelectFromEObjectListDialog; /** * */ public class RelationalIndexEditorPanel extends RelationalEditorPanel implements RelationalConstants { private TabItem generalPropertiesTab; private TabItem referencedColumnsTab; // table property widgets private Button autoUpdateCB, nullableCB, uniqueCB; private Text filterConditionText; private Text tableReferenceText; private Button browseForTableButton; private TableViewerBuilder columnsViewer; /** * @param parent the parent panel * @param dialogModel dialog model * @param statusListener the dialog status listener */ public RelationalIndexEditorPanel(Composite parent, EditRelationalObjectDialogModel dialogModel, IDialogStatusListener statusListener) { super(parent, dialogModel, statusListener); synchronizeUI(); } @Override protected RelationalIndex getRelationalReference() { return (RelationalIndex) super.getRelationalReference(); } @Override protected void createPanel(Composite parent) { createNameGroup(parent); TabFolder tabFolder = createTabFolder(parent); createReferencedColumnsTab(tabFolder); createPropertiestab(tabFolder); createDescriptionTab(tabFolder); } private void createPropertiestab(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.INDEX, ModelType.PHYSICAL, Status.OK_STATUS)); } private void createReferencedColumnsTab(TabFolder folderParent) { Composite thePanel = createReferencedColumnsPanel(folderParent); this.referencedColumnsTab = new TabItem(folderParent, SWT.NONE); this.referencedColumnsTab.setControl(thePanel); this.referencedColumnsTab.setText(Messages.referencedColumnsLabel); this.referencedColumnsTab.setImage(RelationalUiUtil.getRelationalImage(TYPES.COLUMN, ModelType.PHYSICAL, Status.OK_STATUS)); } @Override protected void synchronizeExtendedUI() { if( getRelationalReference().getFilterCondition() != null ) { if( WidgetUtil.widgetValueChanged(this.filterConditionText, getRelationalReference().getFilterCondition()) ) { this.filterConditionText.setText(getRelationalReference().getFilterCondition()); } } else { if( WidgetUtil.widgetValueChanged(this.filterConditionText, EMPTY_STRING) ) { this.filterConditionText.setText(EMPTY_STRING); } } if( WidgetUtil.widgetValueChanged(autoUpdateCB, getRelationalReference().isAutoUpdate())) { this.autoUpdateCB.setSelection(getRelationalReference().isAutoUpdate()); } if( WidgetUtil.widgetValueChanged(uniqueCB, getRelationalReference().isUnique())) { this.uniqueCB.setSelection(getRelationalReference().isUnique()); } if( WidgetUtil.widgetValueChanged(nullableCB, getRelationalReference().isNullable())) { this.nullableCB.setSelection(getRelationalReference().isNullable()); } generalPropertiesTab.setImage(RelationalUiUtil.getRelationalImage(TYPES.INDEX, getRelationalReference().getModelType(), getRelationalReference().getStatus())); } private Composite createPropertiesPanel(Composite parent) { Composite thePanel = WidgetFactory.createPanel(parent, SWT.NONE, 1, 2); GridLayoutFactory.fillDefaults().numColumns(3).margins(10, 10).applyTo(thePanel); GridDataFactory.fillDefaults().applyTo(thePanel); this.autoUpdateCB = new Button(thePanel, SWT.CHECK | SWT.RIGHT); GridDataFactory.fillDefaults().align(SWT.LEFT, SWT.CENTER).applyTo(this.autoUpdateCB); this.autoUpdateCB.setText(Messages.autoUpdateLabel); this.autoUpdateCB.addSelectionListener(new SelectionAdapter() { /** * {@inheritDoc} * @see org.eclipse.swt.events.SelectionAdapter#widgetSelected(org.eclipse.swt.events.SelectionEvent) */ @Override public void widgetSelected( SelectionEvent e ) { getRelationalReference().setAutoUpdate(autoUpdateCB.getSelection()); handleInfoChanged(); } }); this.nullableCB = new Button(thePanel, SWT.CHECK | SWT.RIGHT); GridDataFactory.fillDefaults().align(SWT.LEFT, SWT.CENTER).applyTo(this.nullableCB); this.nullableCB.setText(Messages.nullableLabel); this.nullableCB.addSelectionListener(new SelectionAdapter() { /** * {@inheritDoc} * @see org.eclipse.swt.events.SelectionAdapter#widgetSelected(org.eclipse.swt.events.SelectionEvent) */ @Override public void widgetSelected( SelectionEvent e ) { getRelationalReference().setNullable(nullableCB.getSelection()); handleInfoChanged(); } }); this.uniqueCB = new Button(thePanel, SWT.CHECK | SWT.RIGHT); GridDataFactory.fillDefaults().align(SWT.LEFT, SWT.CENTER).applyTo(this.uniqueCB); this.uniqueCB.setText(Messages.uniqueLabel); this.uniqueCB.addSelectionListener(new SelectionAdapter() { /** * {@inheritDoc} * @see org.eclipse.swt.events.SelectionAdapter#widgetSelected(org.eclipse.swt.events.SelectionEvent) */ @Override public void widgetSelected( SelectionEvent e ) { getRelationalReference().setUnique(uniqueCB.getSelection()); handleInfoChanged(); } }); Label label = new Label(thePanel, SWT.NONE); label.setText(Messages.filterConditionLabel); this.filterConditionText = new Text(thePanel, SWT.BORDER | SWT.SINGLE); this.filterConditionText.setForeground(Display.getCurrent().getSystemColor(SWT.COLOR_DARK_BLUE)); GridDataFactory.fillDefaults().grab(true, false).span(2, 1).applyTo(this.filterConditionText); this.filterConditionText.addModifyListener(new ModifyListener() { @Override public void modifyText( final ModifyEvent event ) { String value = filterConditionText.getText(); if( value == null ) { value = EMPTY_STRING; } getRelationalReference().setFilterCondition(value); handleInfoChanged(); } }); return thePanel; } private Composite createReferencedColumnsPanel(Composite parent) { Composite thePanel = WidgetFactory.createPanel(parent, SWT.NONE, 1, 3); GridLayoutFactory.fillDefaults().numColumns(3).margins(10, 10).applyTo(thePanel); GridDataFactory.fillDefaults().grab(true, true).applyTo(thePanel); Label label = new Label(thePanel, SWT.NONE); label.setText(Messages.tableReferenceLabel); GridDataFactory.fillDefaults().applyTo(label); this.tableReferenceText = new Text(thePanel, SWT.BORDER | SWT.SINGLE); this.tableReferenceText.setForeground(Display.getCurrent().getSystemColor(SWT.COLOR_DARK_BLUE)); GridDataFactory.fillDefaults().grab(true, false).applyTo(this.tableReferenceText); this.tableReferenceText.setEditable(false); this.tableReferenceText.setBackground(label.getBackground()); this.browseForTableButton = WidgetFactory.createButton(thePanel, UILabelUtil.getLabel(UiLabelConstants.LABEL_IDS.ELIPSIS)); this.browseForTableButton.setToolTipText(Messages.browseModelToSelectTableForIndexTooltipText); this.browseForTableButton.setEnabled(true); GridDataFactory.fillDefaults().hint(30, SWT.DEFAULT).applyTo(this.browseForTableButton); this.browseForTableButton.addSelectionListener(new SelectionAdapter() { @Override public void widgetSelected( SelectionEvent theEvent ) { handleBrowseWorkspaceForTablePressed(); } }); this.columnsViewer = new TableViewerBuilder(thePanel, SWT.MULTI | SWT.H_SCROLL | SWT.V_SCROLL | SWT.BORDER | SWT.CHECK); GridDataFactory.fillDefaults().grab(true, false).span(3, 1).hint(SWT.DEFAULT, 150).applyTo(this.columnsViewer.getTableComposite()); // create columns TableViewerColumn column = this.columnsViewer.createColumn(SWT.LEFT, 100, 40, false); column.getColumn().setText(Messages.columnNameLabel + " "); //$NON-NLS-1$ column.setLabelProvider(new ColumnDataLabelProvider(0)); this.columnsViewer.setContentProvider(new ITreeContentProvider() { @Override public void inputChanged(Viewer viewer, Object oldInput, Object newInput) { // NO OP } @Override public void dispose() { // NO OP } @Override public boolean hasChildren(Object element) { return true; } @Override public Object getParent(Object element) { return null; } @Override public Object[] getElements(Object inputElement) { if( inputElement instanceof RelationalTable ) { return ((RelationalTable)inputElement).getColumns().toArray(new Object[0]); } return new Object[0]; } @Override public Object[] getChildren(Object parentElement) { return new Object[0]; } }); if( getRelationalReference() != null ) { for( RelationalColumn col : getRelationalReference().getColumns() ) { for( TableItem item : columnsViewer.getTable().getItems() ) { if( item.getData() == col ) { item.setChecked(true); } } } } this.columnsViewer.getTable().addSelectionListener( new SelectionListener() { @Override public void widgetSelected(SelectionEvent e) { getRelationalReference().getColumns().clear(); for( TableItem item : columnsViewer.getTable().getItems() ) { if( item.getChecked() ) { getRelationalReference().addColumn((RelationalColumn)item.getData()); } } validate(); } @Override public void widgetDefaultSelected(SelectionEvent e) { } }); return thePanel; } @Override protected void validate() { getRelationalReference().validate(); setCanFinish(getRelationalReference().nameIsValid()); IStatus currentStatus = getRelationalReference().getStatus(); if( currentStatus.isOK() ) { setStatus(Status.OK_STATUS); } else { setStatus(currentStatus); } } private void handleBrowseWorkspaceForTablePressed() { ModelResource mr = ModelUtilities.getModelResourceForIFile(getModelFile(), true); List<EObject> childList = new ArrayList<EObject>(); try { childList = mr.getEObjects(); } catch (ModelWorkspaceException ex) { ex.printStackTrace(); } List<EObject> tablesOnlyList = new ArrayList<EObject>(); for( EObject child : childList) { if( child instanceof org.teiid.designer.metamodels.relational.Table ) { tablesOnlyList.add(child); } } SelectFromEObjectListDialog sdDialog = createTableSelectionDialog(tablesOnlyList); sdDialog.open(); if (sdDialog.getReturnCode() == Window.OK) { Object[] selections = sdDialog.getResult(); // should be single selection EObject tableObject = (EObject)selections[0]; // TODO: // Create RelationalTable object from EObject and get "columns" and populate the columns viewer RelationalTable relTable = (RelationalTable)RelationalModelFactory.INSTANCE.getRelationalObject(tableObject); this.tableReferenceText.setText(relTable.getName()); getRelationalReference().setRelationalTable(relTable); getRelationalReference().setUsesExistingTable(true); columnsViewer.setInput(relTable); handleInfoChanged(); } } /** * @param tableList the list of tables * @return the dialog */ private SelectFromEObjectListDialog createTableSelectionDialog(List<EObject> tableList) { String title = Messages.tableSelectionTitle; String message = Messages.selectExistingTableForIndexInitialMessage; SelectFromEObjectListDialog dialog = new SelectFromEObjectListDialog( getShell(), tableList, false, title, message, ModelUtilities.getModelObjectLabelProvider()); dialog.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)) ) { return new StatusInfo(UiConstants.PLUGIN_ID, IStatus.ERROR,Messages.noTableSelectedMessage); } return new StatusInfo(UiConstants.PLUGIN_ID); } }); return dialog; } 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(); } } } 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$ } } 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; } } }