/* * 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.runtime.ui.dialogs; import java.util.Collection; import java.util.HashMap; import java.util.List; import java.util.Map; import org.eclipse.core.runtime.IStatus; import org.eclipse.emf.ecore.EObject; import org.eclipse.jface.dialogs.TitleAreaDialog; import org.eclipse.jface.viewers.ILabelProvider; import org.eclipse.jface.viewers.ISelectionChangedListener; import org.eclipse.jface.viewers.IStructuredContentProvider; import org.eclipse.jface.viewers.SelectionChangedEvent; import org.eclipse.jface.viewers.StructuredSelection; import org.eclipse.jface.viewers.TableViewer; import org.eclipse.jface.viewers.Viewer; import org.eclipse.swt.SWT; import org.eclipse.swt.custom.SashForm; import org.eclipse.swt.custom.StackLayout; import org.eclipse.swt.layout.GridData; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Control; import org.eclipse.swt.widgets.Shell; import org.eclipse.swt.widgets.Table; import org.teiid.core.designer.event.IChangeListener; import org.teiid.core.designer.event.IChangeNotifier; import org.teiid.core.designer.util.I18nUtil; import org.teiid.designer.core.metamodel.aspect.sql.SqlAspectHelper; import org.teiid.designer.core.metamodel.aspect.sql.SqlColumnSetAspect; import org.teiid.designer.runtime.ui.DqpUiConstants; import org.teiid.designer.ui.common.util.WidgetFactory; import org.teiid.designer.ui.explorer.ModelExplorerLabelProvider; /** * @since 8.0 */ public class AccessPatternColumnsDialog extends TitleAreaDialog implements DqpUiConstants, ISelectionChangedListener, IChangeListener { private static final String PREFIX = I18nUtil.getPropertyPrefix(AccessPatternColumnsDialog.class); private final EObject[] accessPatterns; private List<String> columnValues; private ILabelProvider labelProvider = new ModelExplorerLabelProvider(); private Map<EObject, PreviewParameterPanel> patternPanelMap = new HashMap<EObject, PreviewParameterPanel>(); private Composite pnlParams; // parent of all access pattern panels private EObject selectedPattern; private StackLayout stackLayout; private TableViewer viewer; /** * @since 5.5.3 */ public AccessPatternColumnsDialog( Shell parentShell, Collection<EObject> accessPatterns ) { super(parentShell); this.accessPatterns = accessPatterns.toArray(new EObject[accessPatterns.size()]); setShellStyle(getShellStyle() | SWT.RESIZE); } EObject[] accessAccessPatterns() { return this.accessPatterns; } /** * @see org.eclipse.jface.dialogs.Dialog#close() * @since 5.5.3 */ @Override public boolean close() { // save column values if (getReturnCode() == OK) { this.columnValues = this.patternPanelMap.get(getSelectedAccessPattern()).getColumnValues(); } if (this.labelProvider != null) { this.labelProvider.dispose(); } return super.close(); } /** * @see org.eclipse.jface.window.Window#configureShell(org.eclipse.swt.widgets.Shell) * @since 5.5.3 */ @Override protected void configureShell( Shell shell ) { super.configureShell(shell); shell.setText(UTIL.getString(PREFIX + "title")); //$NON-NLS-1$ } /** * @see org.eclipse.jface.dialogs.Dialog#createButtonBar(org.eclipse.swt.widgets.Composite) * @since 5.5.3 */ @Override protected Control createButtonBar( Composite parent ) { Control buttonBar = super.createButtonBar(parent); getButton(OK).setEnabled(false); // set the first selection so that initial validation state is set (doing it here since the selection handler uses OK // button) this.viewer.setSelection(new StructuredSelection(this.accessPatterns[0]), false); return buttonBar; } /** * @see org.eclipse.jface.dialogs.TitleAreaDialog#createDialogArea(org.eclipse.swt.widgets.Composite) * @since 5.5.3 */ @Override protected Control createDialogArea( Composite parent ) { SashForm splitter = WidgetFactory.createSplitter((Composite)super.createDialogArea(parent), SWT.HORIZONTAL); GridData gid = new GridData(); gid.grabExcessHorizontalSpace = gid.grabExcessVerticalSpace = true; gid.horizontalAlignment = gid.verticalAlignment = GridData.FILL; splitter.setLayoutData(gid); // create panel that is a list that holds access patterns createList(splitter); // create panel that contains one or more other panels that have one or more textfields this.pnlParams = WidgetFactory.createGroup(splitter, UTIL.getString(PREFIX + "requiredColumns")); //$NON-NLS-1$ this.pnlParams.setLayout(this.stackLayout = new StackLayout()); this.pnlParams.setLayoutData(new GridData(GridData.FILL_BOTH)); // position the splitter splitter.setWeights(new int[] {4, 6}); splitter.layout(); // create first panel (others created when needed) this.selectedPattern = this.accessPatterns[0]; getPanel(this.selectedPattern); // set title setTitle(UTIL.getString(PREFIX + "header")); //$NON-NLS-1$ return splitter; } private void createList( Composite parent ) { Composite listPanel = WidgetFactory.createGroup(parent, UTIL.getString(PREFIX + "patternsGroupTitle"), GridData.FILL_BOTH); //$NON-NLS-1$ this.viewer = new TableViewer(listPanel, SWT.BORDER | SWT.V_SCROLL | SWT.H_SCROLL | SWT.FULL_SELECTION); this.viewer.addSelectionChangedListener(this); this.viewer.setLabelProvider(this.labelProvider); this.viewer.setContentProvider(new AccessPatternContentProvider()); this.viewer.setInput(this); // configure table Table table = this.viewer.getTable(); table.setLayoutData(new GridData(GridData.FILL_BOTH)); } /** * Obtains the <code>EObject</code>s for the columns referenced by the selected <code>AccessPattern</code>. Throws an * exception if called when the dialog was cancelled. * * @return the columns * @since 5.5.3 */ public List getColumns() { assert (getReturnCode() == OK); return ((SqlColumnSetAspect)SqlAspectHelper.getSqlAspect(getSelectedAccessPattern())).getColumns(getSelectedAccessPattern()); } /** * Obtains the ordered column values of the selected access pattern. Throws an exception if called when the dialog was * cancelled. * * @return the column values * @since 5.5.3 */ public List<String> getColumnValues() { assert (getReturnCode() == OK); return this.columnValues; } private PreviewParameterPanel getPanel( EObject accessPattern ) { PreviewParameterPanel panel = this.patternPanelMap.get(accessPattern); if (panel == null) { panel = new PreviewParameterPanel(this.pnlParams, accessPattern); panel.addChangeListener(this); this.patternPanelMap.put(accessPattern, panel); } return panel; } private EObject getSelectedAccessPattern() { return this.selectedPattern; } private PreviewParameterPanel getSelectedPanel() { return getPanel(getSelectedAccessPattern()); } /** * @see org.eclipse.jface.viewers.ISelectionChangedListener#selectionChanged(org.eclipse.jface.viewers.SelectionChangedEvent) * @since 5.5.3 */ @Override public void selectionChanged( SelectionChangedEvent event ) { StructuredSelection selection = (StructuredSelection)this.viewer.getSelection(); if (selection.isEmpty()) { this.selectedPattern = null; } else { this.selectedPattern = (EObject)selection.getFirstElement(); setTopControl(getSelectedPanel()); } updateState(); } /** * @see org.teiid.core.designer.event.IChangeListener#stateChanged(org.teiid.core.designer.event.IChangeNotifier) * @since 5.5.3 */ @Override public void stateChanged( IChangeNotifier theSource ) { updateState(); } private void setTopControl( Control newTopControl ) { this.stackLayout.topControl = newTopControl; this.pnlParams.layout(true, true); } private void updateState() { IStatus status = getSelectedPanel().getStatus(); if (status.getSeverity() == IStatus.ERROR) { getButton(OK).setEnabled(false); setErrorMessage(status.getMessage()); } else { getButton(OK).setEnabled(true); setErrorMessage(null); setMessage(UTIL.getString(PREFIX + "okMsg")); //$NON-NLS-1$ } } class AccessPatternContentProvider implements IStructuredContentProvider { /** * @see org.eclipse.jface.viewers.IStructuredContentProvider#getElements(java.lang.Object) * @since 5.5.3 */ @Override public Object[] getElements( Object inputElement ) { return accessAccessPatterns(); } /** * @see org.eclipse.jface.viewers.IContentProvider#dispose() * @since 5.5.3 */ @Override public void dispose() { } /** * @see org.eclipse.jface.viewers.IContentProvider#inputChanged(org.eclipse.jface.viewers.Viewer, java.lang.Object, * java.lang.Object) * @since 5.5.3 */ @Override public void inputChanged( Viewer viewer, Object oldInput, Object newInput ) { } } }