package org.teiid.designer.runtime.ui.preview; import java.util.Properties; import org.eclipse.emf.ecore.EObject; import org.eclipse.jface.dialogs.TitleAreaDialog; import org.eclipse.jface.layout.GridDataFactory; import org.eclipse.jface.layout.GridLayoutFactory; import org.eclipse.jface.text.Document; import org.eclipse.jface.text.source.VerticalRuler; import org.eclipse.jface.viewers.ILabelProvider; import org.eclipse.swt.SWT; import org.eclipse.swt.custom.StyledText; import org.eclipse.swt.events.DisposeEvent; import org.eclipse.swt.events.DisposeListener; import org.eclipse.swt.events.ModifyEvent; import org.eclipse.swt.events.ModifyListener; import org.eclipse.swt.graphics.Font; import org.eclipse.swt.layout.GridData; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Control; import org.eclipse.swt.widgets.Group; import org.eclipse.swt.widgets.Shell; import org.eclipse.swt.widgets.TabFolder; import org.eclipse.swt.widgets.TabItem; import org.teiid.designer.runtime.ui.DqpUiConstants; import org.teiid.designer.runtime.ui.Messages; import org.teiid.designer.transformation.ui.editors.sqleditor.SqlTextViewer; import org.teiid.designer.ui.common.graphics.ColorManager; import org.teiid.designer.ui.common.util.WidgetFactory; import org.teiid.designer.ui.explorer.ModelExplorerLabelProvider; public class PreviewDataInputDialog extends TitleAreaDialog implements DqpUiConstants { private EObject previewableEObject; private ILabelProvider labelProvider = new ModelExplorerLabelProvider(); // Table SQL Text Tab Controls private SqlTextViewer sqlTextViewer; private Document sqlDocument; private TabItem sqlTab; private TabItem vdbXmlTab; private StyledText xmlContentsBox; Properties designerProperties; private Font monospaceFont; String sqlText; String dynVdbXml; /** * @since 5.5.3 */ public PreviewDataInputDialog(Shell parentShell, String initialSQL, String dynVdbXml) { super(parentShell); setShellStyle(getShellStyle() | SWT.RESIZE); this.sqlText = initialSQL; this.dynVdbXml = dynVdbXml; } /** * @since 5.5.3 */ public PreviewDataInputDialog(Shell parentShell, Properties properties, String initialSQL, String dynVdbXml) { this(parentShell, initialSQL, dynVdbXml); this.designerProperties = properties; } /** * @see org.eclipse.jface.dialogs.Dialog#close() * @since 5.5.3 */ @Override public boolean close() { 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("Custom Preview Data"); //$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(true); // set the first selection so that initial validation state is set // (doing it here since the selection handler uses OK // button) return buttonBar; } /** * @see org.eclipse.jface.dialogs.TitleAreaDialog#createDialogArea(org.eclipse.swt.widgets.Composite) * @since 5.5.3 */ @Override protected Control createDialogArea(Composite parent) { monospaceFont(parent); Composite pnlOuter = (Composite) super.createDialogArea(parent); GridLayoutFactory.fillDefaults().numColumns(1).margins(10, 10).applyTo(pnlOuter); GridDataFactory.fillDefaults().grab(true, true).applyTo(pnlOuter); // set title setTitle(Messages.PreviewDataInputDialog_title); setMessage(Messages.PreviewDataInputDialog_initialMessage); TabFolder folder = createTabFolder(pnlOuter); createSQLTab(folder); createVdbXmlTabTab(folder); return pnlOuter; } @Override protected Control createContents(Composite parent) { Control control = super.createContents(parent); return control; } public EObject getPreviewableEObject() { return this.previewableEObject; } protected TabFolder createTabFolder(Composite parent) { TabFolder tabFolder = new TabFolder(parent, SWT.TOP | SWT.BORDER); GridDataFactory.fillDefaults().grab(true, true).applyTo(tabFolder); return tabFolder; } /* * Create the SQL Tab */ private void createSQLTab( TabFolder folderParent ) { Composite thePanel = createSQLPanel(folderParent); this.sqlTab = new TabItem(folderParent, SWT.NONE); this.sqlTab.setControl(thePanel); this.sqlTab.setText(Messages.PreviewDataInputDialog_previewSqlLabel); } /* * Create the SQL Display tab panel */ private Composite createSQLPanel( 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); createSqlGroup(thePanel); return thePanel; } /* * The SQL Display area portion of the SQL Tab */ private void createSqlGroup( Composite parent ) { Group textTableOptionsGroup = WidgetFactory.createGroup(parent, Messages.PreviewDataInputDialog_sqlQueryLabel, SWT.NONE, 2, 1); GridDataFactory.fillDefaults().grab(true, true).span(2, 1).applyTo(textTableOptionsGroup); ColorManager colorManager = new ColorManager(); int styles = SWT.V_SCROLL | SWT.MULTI | SWT.BORDER | SWT.WRAP | SWT.FULL_SELECTION ; sqlTextViewer = new SqlTextViewer(textTableOptionsGroup, new VerticalRuler(0), styles, colorManager); sqlDocument = new Document(); sqlTextViewer.setInput(sqlDocument); sqlTextViewer.getTextWidget().setFont(monospaceFont); sqlTextViewer.getTextWidget().addModifyListener(new ModifyListener() { @Override public void modifyText(ModifyEvent e) { sqlText = sqlTextViewer.getTextWidget().getText(); } }); sqlTextViewer.setEditable(true); sqlDocument.set(this.sqlText); GridDataFactory.fillDefaults().grab(true, true).applyTo(sqlTextViewer.getControl()); } public String getSQL() { return sqlText; } /* * Create the SQL Tab */ private void createVdbXmlTabTab( TabFolder folderParent ) { Composite thePanel = createVdbXmlPanel(folderParent); this.vdbXmlTab = new TabItem(folderParent, SWT.NONE); this.vdbXmlTab.setControl(thePanel); this.vdbXmlTab.setText(Messages.PreviewDataInputDialog_previewXMLLabel); } /* * Create the SQL Display tab panel */ private Composite createVdbXmlPanel( 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); createXMLDisplayGroup(thePanel); return thePanel; } /* * Create the Group containing the DDL Contents (not editable) */ private void createXMLDisplayGroup(Composite parent) { Group theGroup = WidgetFactory.createGroup(parent, Messages.PreviewDataInputDialog_previewDynamicVdbXmlTabLabel, GridData.FILL_BOTH, 1); GridLayoutFactory.fillDefaults().numColumns(1).equalWidth(false).margins(10, 10).applyTo(theGroup); GridDataFactory.fillDefaults().grab(true, true).applyTo(theGroup); xmlContentsBox = new StyledText(theGroup, SWT.READ_ONLY | SWT.BORDER | SWT.MULTI | SWT.H_SCROLL | SWT.V_SCROLL); GridDataFactory.fillDefaults().grab(true, true).hint(400, 300).applyTo(xmlContentsBox); xmlContentsBox.setEditable(false); xmlContentsBox.setFont(monospaceFont); xmlContentsBox.setText(this.dynVdbXml); } private Font monospaceFont(Composite composite) { if (monospaceFont == null) { monospaceFont = new Font(composite.getDisplay(), "Monospace", 12, SWT.NORMAL); //$NON-NLS-1$ composite.addDisposeListener(new DisposeListener() { @Override public void widgetDisposed(DisposeEvent e) { if (monospaceFont == null) return; monospaceFont.dispose(); } }); } return monospaceFont; } }