/* * 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.vdb.dynamic.ui.editor; import static org.teiid.designer.vdb.Vdb.Event.CLOSED; import static org.teiid.designer.vdb.ui.VdbUiConstants.Images.ADD; import static org.teiid.designer.vdb.ui.VdbUiConstants.Images.REMOVE; import java.beans.PropertyChangeListener; import java.io.File; import java.util.ArrayList; import java.util.List; import org.eclipse.core.resources.IFile; import org.eclipse.core.resources.IResource; import org.eclipse.core.resources.IResourceChangeEvent; import org.eclipse.core.resources.IResourceChangeListener; import org.eclipse.core.resources.ResourcesPlugin; import org.eclipse.core.runtime.IProgressMonitor; import org.eclipse.jface.dialogs.IDialogConstants; import org.eclipse.jface.dialogs.MessageDialog; import org.eclipse.jface.layout.GridDataFactory; import org.eclipse.jface.layout.GridLayoutFactory; import org.eclipse.jface.viewers.ILabelProvider; import org.eclipse.jface.viewers.ILabelProviderListener; import org.eclipse.jface.viewers.ISelectionChangedListener; import org.eclipse.jface.viewers.IStructuredContentProvider; import org.eclipse.jface.viewers.IStructuredSelection; import org.eclipse.jface.viewers.ListViewer; import org.eclipse.jface.viewers.SelectionChangedEvent; import org.eclipse.jface.viewers.Viewer; import org.eclipse.swt.SWT; import org.eclipse.swt.custom.CTabFolder; import org.eclipse.swt.custom.CTabItem; import org.eclipse.swt.custom.SashForm; 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.Color; import org.eclipse.swt.graphics.Image; import org.eclipse.swt.layout.GridData; import org.eclipse.swt.layout.GridLayout; 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.Text; import org.eclipse.ui.IEditorInput; import org.eclipse.ui.IEditorPart; import org.eclipse.ui.IEditorSite; import org.eclipse.ui.IFileEditorInput; import org.eclipse.ui.PartInitException; import org.eclipse.ui.part.EditorPart; import org.teiid.core.designer.util.CoreStringUtil; import org.teiid.core.designer.util.StringConstants; import org.teiid.designer.core.ModelerCore; import org.teiid.designer.core.workspace.ModelWorkspaceItem; import org.teiid.designer.core.workspace.ModelWorkspaceManager; import org.teiid.designer.ui.common.graphics.GlobalUiColorManager; import org.teiid.designer.ui.common.util.WidgetFactory; import org.teiid.designer.ui.common.widget.Label; import org.teiid.designer.ui.util.ErrorHandler; import org.teiid.designer.ui.viewsupport.ModelIdentifier; import org.teiid.designer.vdb.VdbUtil; import org.teiid.designer.vdb.dynamic.DynamicModel; import org.teiid.designer.vdb.dynamic.DynamicVdb; import org.teiid.designer.vdb.dynamic.ui.editor.panels.DescriptionPanel; import org.teiid.designer.vdb.dynamic.ui.editor.panels.ModelDetailsPanel; import org.teiid.designer.vdb.dynamic.ui.editor.panels.PropertiesPanel; import org.teiid.designer.vdb.dynamic.ui.editor.panels.TranslatorOverridesPanel; import org.teiid.designer.vdb.dynamic.ui.editor.panels.UserDefinedPropertiesPanel; import org.teiid.designer.vdb.ui.Messages; import org.teiid.designer.vdb.ui.VdbUiConstants; import org.teiid.designer.vdb.ui.VdbUiPlugin; /** * @author blafond * */ public class DynamicVdbEditor extends EditorPart implements IResourceChangeListener { static final String INVALID_INTEGER_INPUT_TITLE = i18n("invalidVdbVersionValueTitle"); //$NON-NLS-1$ static final String INVALID_INTEGER_INPUT_MESSAGE = i18n("invalidVdbVersionValueMessage"); //$NON-NLS-1$ static final int MODELS_PANEL_WIDTH_HINT = 300; // Models Panel Overall Width static final int MODELS_PANEL_IMAGE_COL_WIDTH = 50; // Image Cols Width static final int MODELS_PANEL_MODELNAME_COL_WIDTH_MIN = 200; // Min ModelName Width static String i18n( final String id ) { return VdbUiConstants.Util.getString(id); } private DynamicVdb vdb; private IFile dynamicVdbFile; Exception vdbLoadingException = null; private Label validationDateTimeLabel; private Label validationVersionLabel; private PropertyChangeListener vdbListener; // private DataRolesPanel dataRolesPanel; // DataRoleResolver dataRoleResolver; TranslatorOverridesPanel pnlTranslatorOverrides; @SuppressWarnings( "unused" ) private PropertiesPanel propertiesPanel; @SuppressWarnings( "unused" ) private UserDefinedPropertiesPanel userDefinedPropertiesPanel; DescriptionPanel descriptionPanel; ModelDetailsPanel modelDetailsPanel; ListViewer modelsViewer; List<String> models = new ArrayList<String>(); Button addModelButton; Button removeModelButton; boolean disposed = false; /** * */ public DynamicVdbEditor() { // TODO Auto-generated constructor stub } /** * @return the VDB being edited */ public DynamicVdb getVdb() { return vdb; } /** (non-Javadoc) * @see org.eclipse.core.resources.IResourceChangeListener#resourceChanged(org.eclipse.core.resources.IResourceChangeEvent) */ @Override public void resourceChanged(IResourceChangeEvent arg0) { // TODO Auto-generated method stub } /** (non-Javadoc) * @see org.eclipse.ui.part.EditorPart#doSave(org.eclipse.core.runtime.IProgressMonitor) */ @Override public void doSave(IProgressMonitor arg0) { // TODO Auto-generated method stub } /** (non-Javadoc) * @see org.eclipse.ui.part.EditorPart#doSaveAs() */ @Override public void doSaveAs() { // TODO Auto-generated method stub } /** (non-Javadoc) * @see org.eclipse.ui.part.EditorPart#init(org.eclipse.ui.IEditorSite, org.eclipse.ui.IEditorInput) */ @Override public void init(IEditorSite site, IEditorInput input) { IResource theFile = ((IFileEditorInput)input).getFile(); theFile.getFullPath().makeAbsolute(); dynamicVdbFile = (IFile)theFile; File actualFile = dynamicVdbFile.getRawLocation().makeAbsolute().toFile(); try { ModelWorkspaceItem item = ModelWorkspaceManager.getModelWorkspaceManager().findModelWorkspaceItem(theFile, false); IFile wsFile = ResourcesPlugin.getWorkspace().getRoot().getFile(theFile.getFullPath()); if( !VdbUtil.isDynamicVdb(dynamicVdbFile) ) { throw new PartInitException("File " + dynamicVdbFile.getName() + " is not a dynamic VDB"); } vdb = new DynamicVdb(wsFile); // vdbListener = new PropertyChangeListener() { // /** // * {@inheritDoc} // * // * @see java.beans.PropertyChangeListener#propertyChange(java.beans.PropertyChangeEvent) // */ // @Override // public void propertyChange(final PropertyChangeEvent event) { // UiUtil.runInSwtThread(new Runnable() { // /** // * {@inheritDoc} // * // * @see java.lang.Runnable#run() // */ // @Override // public void run() { // if (!disposed) { // vdbNotification(event.getPropertyName()); // } // } // }, true); // } // }; // vdb.addChangeListener(vdbListener); } catch (Exception ex) { ErrorHandler.toExceptionDialog(ex); vdbLoadingException = ex; } setSite(site); setInput(input); setPartName(dynamicVdbFile.getName()); } /** (non-Javadoc) * @see org.eclipse.ui.part.EditorPart#isDirty() */ @Override public boolean isDirty() { // TODO Auto-generated method stub return false; } /** (non-Javadoc) * @see org.eclipse.ui.part.EditorPart#isSaveAsAllowed() */ @Override public boolean isSaveAsAllowed() { // TODO Auto-generated method stub return false; } /** (non-Javadoc) * @see org.eclipse.ui.part.WorkbenchPart#createPartControl(org.eclipse.swt.widgets.Composite) */ @Override public void createPartControl(Composite parent) { parent.setLayout(new GridLayout()); parent.setLayoutData(new GridData()); if (vdb == null) { createErrorPanel(parent); return; } { // Header Panel Composite headerPanel = WidgetFactory.createPanel(parent, SWT.NONE, GridData.FILL, 1, 4); Label projectLabel = new Label(headerPanel, SWT.NONE); projectLabel.setText(Messages.vdbEditor_location); Label project = new Label(headerPanel, SWT.NONE); project.setText(dynamicVdbFile.getParent().getFullPath().toString()); project.setForeground(GlobalUiColorManager.EMPHASIS_COLOR); Label vdbVersionLabel = WidgetFactory.createLabel(headerPanel, "Version"); //$NON-NLS-1$ GridDataFactory.fillDefaults().align(SWT.CENTER, SWT.CENTER).applyTo(vdbVersionLabel); final Text vdbVersionText = WidgetFactory.createTextField(headerPanel); GridDataFactory.fillDefaults().align(SWT.CENTER, SWT.CENTER).applyTo(vdbVersionText); ((GridData)vdbVersionText.getLayoutData()).widthHint = 30; vdbVersionText.addModifyListener(new ModifyListener() { @Override public void modifyText(ModifyEvent e) { String versionValue = vdbVersionText.getText(); if (versionValue != null) { getVdb().setVersion(versionValue); } else { MessageDialog.openWarning(Display.getCurrent().getActiveShell(), INVALID_INTEGER_INPUT_TITLE, INVALID_INTEGER_INPUT_MESSAGE); vdbVersionText.setText(getVdb().getVersion()); } } }); vdbVersionText.setText(getVdb().getVersion()); } // So create another Tab Folder (bottom oriented) CTabFolder tabFolder = WidgetFactory.createTabFolder(parent); tabFolder.setTabPosition(SWT.BOTTOM); { // models tab CTabItem leftTab = new CTabItem(tabFolder, SWT.NONE); leftTab.setText(Messages.vdbEditor_content_tab_label); leftTab.setToolTipText(Messages.vdbEditor_content_tab_tooltip); Composite leftPanel = createEditorContentTab(tabFolder); leftTab.setControl(leftPanel); } { // advanced tab CTabItem rightTab = new CTabItem(tabFolder, SWT.NONE); rightTab.setText(Messages.vdbEditor_advanced_tab_label); rightTab.setToolTipText(Messages.vdbEditor_advanced_tab_tooltip); Composite rightPanel = createEditorAdancedTab(tabFolder); rightTab.setControl(rightPanel); } tabFolder.setSelection(0); ModelerCore.getWorkspace().addResourceChangeListener(this); } private Composite createEditorContentTab(Composite parent) { Composite pnlTop = new Composite(parent, SWT.BORDER); pnlTop.setLayout(new GridLayout()); pnlTop.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true)); CTabFolder tabFolder = WidgetFactory.createTabFolder(pnlTop); { // models tab CTabItem modelsTab = new CTabItem(tabFolder, SWT.NONE); modelsTab.setText(i18n("modelsTab")); //$NON-NLS-1$ modelsTab.setToolTipText(i18n("modelsTabToolTip")); //$NON-NLS-1$ Composite pnlModels = new Composite(tabFolder, SWT.NONE); pnlModels.setLayout(new GridLayout(1, false)); pnlModels .setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true)); SashForm splitter = new SashForm(pnlModels, SWT.HORIZONTAL); splitter.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true)); Composite pnlModelsList = new Composite(splitter, SWT.NONE); pnlModelsList.setLayout(new GridLayout()); pnlModelsList.setLayoutData(new GridData(SWT.FILL, SWT.FILL, false, true)); ((GridData) pnlModelsList.getLayoutData()).widthHint = MODELS_PANEL_WIDTH_HINT; createModelsSection(pnlModelsList); this.modelDetailsPanel = new ModelDetailsPanel(splitter, getVdb()); splitter.setWeights(new int[] { 35, 65 }); modelsTab.setControl(pnlModels); } { // description tab CTabItem descriptionTab = new CTabItem(tabFolder, SWT.NONE); descriptionTab.setText(i18n("descriptionTab")); //$NON-NLS-1$ descriptionTab.setToolTipText(i18n("descriptionTabToolTip")); //$NON-NLS-1$ Composite pnlDescription = new Composite(tabFolder, SWT.NONE); pnlDescription.setLayout(new GridLayout()); pnlDescription.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true)); descriptionTab.setControl(pnlDescription); descriptionPanel = new DescriptionPanel(pnlDescription, getVdb()); } tabFolder.setSelection(0); return pnlTop; } private void createModelsSection( Composite parent ) { // List Box of <model> entries // Name and ICON only // Models can be Physical or Virtual Group languageGroup = WidgetFactory.createGroup(parent, "Models", SWT.FILL, 1, 1); //$NON-NLS-1$ GridData gd_2 = new GridData(GridData.FILL_BOTH); gd_2.widthHint = 220; // gd_2.horizontalSpan = 2; languageGroup.setLayoutData(gd_2); // Add a simple list box entry form with String contents this.modelsViewer = new ListViewer(languageGroup, SWT.H_SCROLL | SWT.V_SCROLL | SWT.BORDER); GridData data = new GridData(GridData.FILL_BOTH); data.horizontalSpan=2; this.modelsViewer.getControl().setLayoutData(data); this.modelsViewer.setContentProvider(new IStructuredContentProvider() { @Override public Object[] getElements(Object inputElement) { return getVdb().getDynamicModels().toArray(); } @Override public void dispose() { } @Override public void inputChanged( Viewer viewer, Object oldInput, Object newInput) { } }); this.modelsViewer.setLabelProvider(new ILabelProvider() { @Override public void removeListener(ILabelProviderListener arg0) { // TODO Auto-generated method stub } @Override public boolean isLabelProperty(Object arg0, String arg1) { // TODO Auto-generated method stub return false; } @Override public void dispose() { // TODO Auto-generated method stub } @Override public void addListener(ILabelProviderListener arg0) { // TODO Auto-generated method stub } @Override public String getText(Object element) { if( element instanceof DynamicModel ) { return ((DynamicModel)element).getName(); } return StringConstants.EMPTY_STRING; } @Override public Image getImage(Object element) { if( element instanceof DynamicModel ) { if( ((DynamicModel)element).getModelType() == DynamicModel.Type.PHYSICAL ) { return ModelIdentifier.getImage(ModelIdentifier.RELATIONAL_SOURCE_MODEL_ID); } return ModelIdentifier.getImage(ModelIdentifier.RELATIONAL_VIEW_MODEL_ID); } return null; } }); this.modelsViewer.setInput(vdb.getDynamicModels()); // for( String value : vdb.getAllowedLanguages() ) { // this.languages.add(value); // } this.modelsViewer.addSelectionChangedListener(new ISelectionChangedListener() { /** * {@inheritDoc} * * @see org.eclipse.jface.viewers.ISelectionChangedListener#selectionChanged(org.eclipse.jface.viewers.SelectionChangedEvent) */ @Override public void selectionChanged( SelectionChangedEvent event ) { handleModelSelected(); } }); this.modelsViewer.refresh(); Composite toolbarPanel = WidgetFactory.createPanel(languageGroup, SWT.NONE, GridData.VERTICAL_ALIGN_BEGINNING, 1, 2); this.addModelButton = WidgetFactory.createButton(toolbarPanel, GridData.FILL); this.addModelButton.setImage(VdbUiPlugin.singleton.getImage(ADD)); // this.addModelButton.setToolTipText(prefixedI18n("addModelButton.tooltip")); //$NON-NLS-1$ this.addModelButton.addSelectionListener(new SelectionListener() { @Override public void widgetSelected(SelectionEvent e) { handleAddModel(); } @Override public void widgetDefaultSelected(SelectionEvent e) { } }); this.removeModelButton = WidgetFactory.createButton(toolbarPanel, GridData.FILL); this.removeModelButton.setImage(VdbUiPlugin.singleton.getImage(REMOVE)); // this.removeModelButton.setToolTipText(prefixedI18n("removeLangueButton.tooltip")); //$NON-NLS-1$ this.removeModelButton.addSelectionListener(new SelectionListener() { @Override public void widgetSelected(SelectionEvent e) { handleRemoveModel(); } @Override public void widgetDefaultSelected(SelectionEvent e) { } }); this.removeModelButton.setEnabled(false); } void handleModelSelected() { boolean hasSelection = !this.modelsViewer.getSelection().isEmpty(); this.removeModelButton.setEnabled(hasSelection); } private DynamicModel getSelectedModel() { IStructuredSelection selection = (IStructuredSelection)this.modelsViewer.getSelection(); if (selection.isEmpty()) { return null; } return (DynamicModel)selection.getFirstElement(); } void handleAddModel() { assert (!this.modelsViewer.getSelection().isEmpty()); // AddLanguagePropertyDialog dialog = new AddLanguagePropertyDialog(modelsViewer.getControl().getShell(), // vdb.getAllowedLanguages()); // // // if (dialog.open() == Window.OK) { // // update model // String language = dialog.getLanguage(); // // vdb.addAllowedLanguage(language); // // this.modelsViewer.refresh(); // // // select the new property // // // VdbEntry model = null; // // for(String item : this.modelsViewer.getList().getItems() ) { // if( item.equals(language) ) { // model = item; // break; // } // } // // if( model != null ) { // this.modelsViewer.setSelection(new StructuredSelection(model), true); // } // } } void handleRemoveModel() { DynamicModel selectedModel = getSelectedModel(); assert (selectedModel != null); // update model this.vdb.removeDynamicModel(selectedModel.getName()); // update UI this.modelsViewer.refresh(); } private Composite createEditorAdancedTab(Composite parent) { Composite pnlBottom = new Composite(parent, SWT.BORDER); pnlBottom.setLayout(new GridLayout()); pnlBottom.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true)); CTabFolder tabFolder = WidgetFactory.createTabFolder(pnlBottom); // { // roles tab // CTabItem rolesTab = new CTabItem(tabFolder, SWT.NONE); // rolesTab.setText(i18n("rolesTab")); //$NON-NLS-1$ // rolesTab.setToolTipText(i18n("rolesTabToolTip")); //$NON-NLS-1$ // Composite pnlRoles = new Composite(tabFolder, SWT.NONE); // pnlRoles.setLayout(new GridLayout()); // pnlRoles.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true)); // rolesTab.setControl(pnlRoles); // dataRolesPanel = new DataRolesPanel(pnlRoles, this); // } { // properties tab CTabItem propertiesTab = new CTabItem(tabFolder, SWT.NONE); propertiesTab.setText(i18n("propertiesTab")); //$NON-NLS-1$ propertiesTab.setToolTipText(i18n("propertiesTabToolTip")); //$NON-NLS-1$ Composite pnlProperties = new Composite(tabFolder, SWT.NONE); pnlProperties.setLayout(new GridLayout()); pnlProperties.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true)); propertiesTab.setControl(pnlProperties); propertiesPanel = new PropertiesPanel(pnlProperties, getVdb()); } { // properties tab CTabItem tab = new CTabItem(tabFolder, SWT.NONE); tab.setText(i18n("userDefinedPropertiesTab")); //$NON-NLS-1$ tab.setToolTipText(i18n("userDefinedPropertiesTabToolTip")); //$NON-NLS-1$ Composite pnlProperties = new Composite(tabFolder, SWT.NONE); pnlProperties.setLayout(new GridLayout()); pnlProperties.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true)); tab.setControl(pnlProperties); userDefinedPropertiesPanel = new UserDefinedPropertiesPanel(pnlProperties, getVdb()); } // { // translator overrides tab // CTabItem translatorOverridesTab = new CTabItem(tabFolder, SWT.NONE); // translatorOverridesTab.setText(i18n("translatorOverridesTab")); //$NON-NLS-1$ // translatorOverridesTab.setToolTipText(i18n("translatorOverridesTabToolTip")); //$NON-NLS-1$ // pnlTranslatorOverrides = new TranslatorOverridesPanel(tabFolder, this.vdb); // translatorOverridesTab.setControl(pnlTranslatorOverrides); // } tabFolder.setSelection(0); return pnlBottom; } private void createErrorPanel(Composite parent) { Color bgColour = parent.getDisplay().getSystemColor(SWT.COLOR_LIST_BACKGROUND); parent.setBackground(bgColour); final Composite errorPanel = WidgetFactory.createPanel(parent, SWT.NONE); GridDataFactory.fillDefaults().grab(true, true).applyTo(errorPanel); Composite imgMsgPanel = WidgetFactory.createPanel(errorPanel); GridLayoutFactory.fillDefaults().numColumns(2).applyTo(imgMsgPanel); Label imageLabel = WidgetFactory.createLabel(imgMsgPanel, SWT.NONE); imageLabel.setBackground(bgColour); Image image = parent.getDisplay().getSystemImage(SWT.ICON_ERROR); if (image != null) { image.setBackground(bgColour); imageLabel.setImage(image); GridDataFactory.swtDefaults().align(SWT.BEGINNING, SWT.BEGINNING).applyTo(imageLabel); } Label errLabel = WidgetFactory.createLabel(imgMsgPanel, Messages.vdbEditor_loadingErrMessage); GridDataFactory.fillDefaults().grab(true, false).applyTo(errLabel); final Button detailsButton = WidgetFactory.createButton(errorPanel, SWT.PUSH); GridDataFactory.swtDefaults().grab(true, false).applyTo(detailsButton); detailsButton.setText(IDialogConstants.SHOW_DETAILS_LABEL); detailsButton.setData(Boolean.FALSE); final Composite detailsComposite = WidgetFactory.createPanel(errorPanel); GridDataFactory.defaultsFor(detailsComposite).applyTo(detailsComposite); GridLayoutFactory.fillDefaults().margins(25, 25).applyTo(detailsComposite); detailsButton.addSelectionListener(new SelectionAdapter() { @Override public void widgetSelected(SelectionEvent e) { if (Boolean.TRUE.equals(detailsButton.getData())) { // Hide the details for (Control control : detailsComposite.getChildren()) control.dispose(); detailsButton.setText(IDialogConstants.SHOW_DETAILS_LABEL); detailsButton.setData(Boolean.FALSE); } else { // Show the details String trace = CoreStringUtil.getStackTrace(vdbLoadingException); Text exceptionText = WidgetFactory.createTextBox(detailsComposite, SWT.READ_ONLY, SWT.FILL, 1, trace); GridDataFactory.fillDefaults().grab(true, true).hint(200, 400).applyTo(exceptionText); detailsButton.setText(IDialogConstants.HIDE_DETAILS_LABEL); detailsButton.setData(Boolean.TRUE); } errorPanel.layout(true); errorPanel.getParent().layout(true); } }); detailsButton.setVisible(vdbLoadingException != null); } /** (non-Javadoc) * @see org.eclipse.ui.part.WorkbenchPart#setFocus() */ @Override public void setFocus() { // TODO Auto-generated method stub } void vdbNotification( final String property ) { if (CLOSED.equals(property)) return; // String dateTimeString = i18n("undefined"); //$NON-NLS-1$ // if( getVdb().getValidationDateTime() != null ) { // dateTimeString = getVdb().getValidationDateTime().toString(); // } // this.validationDateTimeLabel.setText(dateTimeString); // String validationString = i18n("undefined"); //$NON-NLS-1$ // if( getVdb().getValidationVersion() != null ) { // validationString = getVdb().getValidationVersion(); // } // this.validationVersionLabel.setText(validationString); firePropertyChange(IEditorPart.PROP_DIRTY); } }