private boolean folderInModelProject() { boolean result = false; if (this.folder != null) { IProject project = this.folder.getProject(); try { if (project != null && project.getNature(PluginConstants.MODEL_PROJECT_NATURE_ID) != null) { result = true; } } catch (CoreException ex) { VdbUiConstants.Util.log(ex); } } return result; }
/** @since 4.0 */ private void validatePage() { final IContainer folder; try { folder = WizardUtil.validateFileAndFolder( this.nameText, this.folderText, this.mainPage, ModelerCore.VDB_FILE_EXTENSION, false); if (this.mainPage.getMessageType() == IMessageProvider.ERROR) { // WizardUtil.validateFileAndFolder can set error message and message type so no need to do // further // validation if an error was already found (JBEDSP-588) return; } IStatus status = projectValidator.validate(new Object[] {folder}); String proposedName = this.nameText.getText(); if (!status.isOK()) { // only update the message if the vFolder is non-null; // if WizardUtil returned null, it already set the status // this corrects the case where the wrong message shows for // a bad filename. if (folder != null) { this.mainPage.setErrorMessage(status.getMessage()); this.mainPage.setPageComplete(false); } // endif } else if (!nameValidator.isValidName(proposedName)) { this.mainPage.setErrorMessage(VDB_NAME_ERROR); this.mainPage.setPageComplete(false); } else if (ModelUtilities.vdbNameReservedValidation(proposedName) != null) { this.mainPage.setErrorMessage(ModelUtilities.vdbNameReservedValidation(proposedName)); this.mainPage.setPageComplete(false); } else { this.mainPage.setErrorMessage(null); this.mainPage.setPageComplete(true); } if (this.mainPage.isPageComplete()) { this.name = proposedName; this.folder = folder; } } catch (final CoreException err) { VdbUiConstants.Util.log(err); WizardUtil.setPageComplete(this.mainPage, err.getLocalizedMessage(), IMessageProvider.ERROR); } }
static String i18n(final String id) { return VdbUiConstants.Util.getString(id); }
/** @since 8.0 */ public final class NewVdbWizard extends AbstractWizard implements IPropertiesContext, INewWizard, InternalUiConstants.Widgets, CoreStringUtil.Constants, UiConstants { private static final String I18N_PREFIX = I18nUtil.getPropertyPrefix(NewVdbWizard.class); private static final String TITLE = getString("title"); // $NON-NLS-1$ private static final String PAGE_TITLE = getString("pageTitle"); // $NON-NLS-1$ private static final String VDB_NAME_ERROR = getString("vdbNameError"); // $NON-NLS-1$ private static final int COLUMN_COUNT = 3; private static final String NAME_LABEL = getString("nameLabel"); // $NON-NLS-1$ private static final String FOLDER_LABEL = getString("folderLabel"); // $NON-NLS-1$ private static final String INITIAL_MESSAGE = getString("initialMessage"); // $NON-NLS-1$ private static final String CREATE_FILE_ERROR_MESSAGE = getString("createFileErrorMessage"); // $NON-NLS-1$ private static final String NOT_MODEL_PROJECT_MSG = getString("notModelProjectMessage"); // $NON-NLS-1$ private static final String SELECT_FOLDER_MESSAGE = getString("selectFolderMessage"); // $NON-NLS-1$ static final String ADD_FILE_DIALOG_INVALID_SELECTION_MESSAGE = VdbUiConstants.Util.getString("addFileDialogInvalidSelectionMessage"); // $NON-NLS-1$ static final String ADD_FILE_DIALOG_NON_MODEL_SELECTED_MESSAGE = VdbUiConstants.Util.getString("addFileDialogNonModelSelectedMessage"); // $NON-NLS-1$ static final String ADD_FILE_DIALOG_VDB_SOURCE_MODEL_SELECTED_MESSAGE = VdbUiConstants.Util.getString("addFileDialogVdbSourceModelSelectedMessage"); // $NON-NLS-1$ private static final StringNameValidator nameValidator = new StringNameValidator( StringNameValidator.DEFAULT_MINIMUM_LENGTH, StringNameValidator.DEFAULT_MAXIMUM_LENGTH); static String getString(final String id) { return VdbUiConstants.Util.getString(I18N_PREFIX + id); } String name; IContainer folder; private WizardPage mainPage; Text nameText, folderText; TableViewer modelsViewer; StyledTextEditor descriptionTextEditor; Button btnBrowse; Button addModelsButton; Button removeModelsButton; private ISelectionStatusValidator projectValidator = new ModelProjectSelectionStatusValidator(); final ModelLabelProvider modelLabelProvider = new ModelLabelProvider(); IStructuredSelection initialSelection; List<IResource> modelsForVdb; Properties designerProperties; private boolean openProjectExists = true; private IProject newProject; final ISelectionStatusValidator validator = new ISelectionStatusValidator() { /** * {@inheritDoc} * * @see org.eclipse.ui.dialogs.ISelectionStatusValidator#validate(java.lang.Object[]) */ @Override public IStatus validate(final Object[] selection) { for (int ndx = selection.length; --ndx >= 0; ) { Object obj = selection[ndx]; if (obj instanceof IContainer) { return new Status( IStatus.ERROR, VdbUiConstants.PLUGIN_ID, 0, ADD_FILE_DIALOG_INVALID_SELECTION_MESSAGE, null); } else if (obj instanceof IFile) { IFile file = (IFile) obj; if (!ModelUtilities.isModelFile(file) && !ModelUtil.isXsdFile(file)) { return new Status( IStatus.ERROR, VdbUiConstants.PLUGIN_ID, 0, ADD_FILE_DIALOG_NON_MODEL_SELECTED_MESSAGE, null); } if (ModelUtilities.isVdbSourceModel(file)) { return new Status( IStatus.ERROR, VdbUiConstants.PLUGIN_ID, 0, ADD_FILE_DIALOG_VDB_SOURCE_MODEL_SELECTED_MESSAGE, null); } } } return new Status(IStatus.OK, VdbUiConstants.PLUGIN_ID, 0, EMPTY_STRING, null); } }; /** @since 4.0 */ public NewVdbWizard() { super(UiPlugin.getDefault(), TITLE, null); this.modelsForVdb = new ArrayList<IResource>(); } /** * @see org.eclipse.jface.wizard.IWizard#performFinish() * @since 4.0 */ @Override public boolean finish() { // append VDB file extension if needed if (!name.endsWith(ModelerCore.VDB_FILE_EXTENSION)) { name += ModelerCore.VDB_FILE_EXTENSION; } if (designerProperties != null) { DesignerPropertiesUtil.setVdbName(designerProperties, name); } // create VDB resource final IRunnableWithProgress op = new IRunnableWithProgress() { @Override public void run(final IProgressMonitor monitor) throws InvocationTargetException { try { final IFile vdbFile = NewVdbWizard.this.folder.getFile(new Path(NewVdbWizard.this.name)); vdbFile.create(new ByteArrayInputStream(new byte[0]), false, monitor); Vdb newVdb = new Vdb(vdbFile, false, monitor); String desc = descriptionTextEditor.getText(); if (desc != null && desc.length() > 0) { newVdb.setDescription(desc); } newVdb.save(monitor); NewVdbWizard.this.folder.refreshLocal(IResource.DEPTH_INFINITE, monitor); // open editor IWorkbenchPage page = UiPlugin.getDefault().getCurrentWorkbenchWindow().getActivePage(); IDE.openEditor(page, vdbFile); // Thread.sleep(200); if (modelsForVdb != null && !modelsForVdb.isEmpty()) { VdbEditor editor = getVdbEditor(vdbFile); if (editor != null) { List<IFile> models = new ArrayList<IFile>(); for (IResource nextModel : modelsForVdb) { models.add((IFile) nextModel); } editor.addModels(models); editor.doSave(new NullProgressMonitor()); } } } catch (final Exception err) { throw new InvocationTargetException(err); } finally { monitor.done(); } } }; try { new ProgressMonitorDialog(getShell()).run(false, true, op); return true; } catch (Throwable err) { if (err instanceof InvocationTargetException) { err = ((InvocationTargetException) err).getTargetException(); } VdbUiConstants.Util.log(err); WidgetUtil.showError(CREATE_FILE_ERROR_MESSAGE); return false; } } /** * @see org.eclipse.ui.IWorkbenchWizard#init(org.eclipse.ui.IWorkbench, * org.eclipse.jface.viewers.IStructuredSelection) * @since 4.0 */ @Override public void init(final IWorkbench workbench, final IStructuredSelection originalSelection) { IStructuredSelection selection = originalSelection; openProjectExists = ModelerUiViewUtils.workspaceHasOpenModelProjects(); if (!openProjectExists) { newProject = ModelerUiViewUtils.queryUserToCreateModelProject(); if (newProject != null) { selection = new StructuredSelection(newProject); openProjectExists = true; } else { openProjectExists = false; } } if (isAllModelsSelected(selection)) { initialSelection = new StructuredSelection(selection.toArray()); } if (selection != null && !selection.isEmpty()) { this.folder = ModelUtil.getContainer(selection.getFirstElement()); } if (folder != null && !folderInModelProject()) { // Create empty page this.mainPage = new WizardPage(NewVdbWizard.class.getSimpleName(), PAGE_TITLE, null) { @Override public void createControl(final Composite parent) { setControl(createEmptyPageControl(parent)); } }; this.mainPage.setMessage(NOT_MODEL_PROJECT_MSG, IMessageProvider.ERROR); } else { // Create and add page this.mainPage = new WizardPage(NewVdbWizard.class.getSimpleName(), PAGE_TITLE, null) { @Override public void createControl(final Composite parent) { setControl(createPageControl(parent)); } }; this.mainPage.setMessage(INITIAL_MESSAGE); // If current selection not null, set folder to selection if a folder, or to containing folder // if not if (this.folder != null) { if (!projectValidator.validate(new Object[] {this.folder}).isOK()) { this.folder = null; } } else { // folder == null this.mainPage.setMessage(SELECT_FOLDER_MESSAGE, IMessageProvider.ERROR); } } this.mainPage.setPageComplete(false); addPage(mainPage); } private boolean folderInModelProject() { boolean result = false; if (this.folder != null) { IProject project = this.folder.getProject(); try { if (project != null && project.getNature(PluginConstants.MODEL_PROJECT_NATURE_ID) != null) { result = true; } } catch (CoreException ex) { VdbUiConstants.Util.log(ex); } } return result; } /** * Indicates if all selected objects are {@link IResource}s. * * @param theSelection the selection being checked * @return <code>true</code> if all selected objects are <code>EObject</code>; <code>false</code> * otherwise. */ boolean isAllModelsSelected(ISelection theSelection) { if ((theSelection == null) || theSelection.isEmpty()) { return true; } boolean result = (theSelection instanceof IStructuredSelection) && SelectionUtilities.isAllIResourceObjects(theSelection); if (result) { @SuppressWarnings("rawtypes") List selectedObjects = SelectionUtilities.getSelectedObjects(theSelection); for (@SuppressWarnings("rawtypes") Iterator iter = selectedObjects.iterator(); iter.hasNext(); ) { IResource res = (IResource) iter.next(); if (!ModelUtilities.isModelFile(res)) { result = false; break; } } } return result; } /** * @see org.eclipse.jface.wizard.IWizard#canFinish() * @since 4.0 */ @Override public boolean canFinish() { // defect 16154 -- Finish can be enabled even if errors on page. // check the page's isComplete status (in super) -- just follow its advice. return super.canFinish(); } Composite createEmptyPageControl(final Composite parent) { return new Composite(parent, SWT.NONE); } /** * @param parent * @return composite the page * @since 4.0 */ @SuppressWarnings({"unused", "unchecked"}) Composite createPageControl(final Composite parent) { // Create page final Composite mainPanel = new Composite(parent, SWT.NONE); mainPanel.setLayout(new GridLayout(COLUMN_COUNT, false)); // Add widgets to page WidgetFactory.createLabel(mainPanel, FOLDER_LABEL); final String name = (this.folder == null ? null : this.folder.getFullPath().makeRelative().toString()); this.folderText = WidgetFactory.createTextField(mainPanel, GridData.FILL_HORIZONTAL, 1, name, SWT.READ_ONLY); this.folderText.addModifyListener( new ModifyListener() { @Override public void modifyText(final ModifyEvent event) { folderModified(); } }); btnBrowse = WidgetFactory.createButton(mainPanel, BROWSE_BUTTON); btnBrowse.addSelectionListener( new SelectionAdapter() { @Override public void widgetSelected(final SelectionEvent event) { browseButtonSelected(); } }); WidgetFactory.createLabel(mainPanel, NAME_LABEL); this.nameText = WidgetFactory.createTextField(mainPanel, GridData.HORIZONTAL_ALIGN_FILL, COLUMN_COUNT - 1); this.nameText.addModifyListener( new ModifyListener() { @Override public void modifyText(final ModifyEvent event) { nameModified(); } }); // set focus to browse button if no folder selected. otherwise set focus to text field if (folder == null) { btnBrowse.setFocus(); } else { nameText.setFocus(); } DESCRIPTION_GROUP: { final Group descGroup = WidgetFactory.createGroup( mainPanel, getString("description"), GridData.FILL_HORIZONTAL, 3); // $NON-NLS-1$ descriptionTextEditor = new StyledTextEditor( descGroup, SWT.MULTI | SWT.H_SCROLL | SWT.V_SCROLL | SWT.WRAP | SWT.BORDER); final GridData descGridData = new GridData(GridData.FILL_BOTH); descGridData.horizontalSpan = 1; descGridData.heightHint = 50; descGridData.minimumHeight = 30; descGridData.grabExcessVerticalSpace = true; descriptionTextEditor.setLayoutData(descGridData); descriptionTextEditor.setText(""); // $NON-NLS-1$ } MODELS_GROUP: { Group group = WidgetFactory.createGroup( mainPanel, getString("selectedModelsGroupTitle"), GridData.FILL_BOTH, COLUMN_COUNT, COLUMN_COUNT); //$NON-NLS-1$ group.setLayout(new GridLayout(2, false)); GridData gd = new GridData(GridData.FILL_BOTH); gd.heightHint = 200; gd.horizontalSpan = 3; group.setLayoutData(gd); Composite leftToolbarPanel = new Composite(group, SWT.NONE); leftToolbarPanel.setLayout(new GridLayout()); GridData ltpGD = new GridData(GridData.FILL_VERTICAL); ltpGD.heightHint = 120; leftToolbarPanel.setLayoutData(ltpGD); addModelsButton = new Button(leftToolbarPanel, SWT.PUSH); addModelsButton.setText(getString("add")); // $NON-NLS-1$ addModelsButton.setToolTipText(getString("addModelsTooltip")); // $NON-NLS-1$ addModelsButton.setLayoutData(new GridData(GridData.FILL_HORIZONTAL)); addModelsButton.addSelectionListener( new SelectionAdapter() { @Override public void widgetSelected(SelectionEvent e) { handleAddModelsSelected(); if (!modelsViewer.getSelection().isEmpty()) { removeModelsButton.setEnabled(true); } } }); removeModelsButton = new Button(leftToolbarPanel, SWT.PUSH); removeModelsButton.setText(getString("remove")); // $NON-NLS-1$ removeModelsButton.setLayoutData(new GridData(GridData.FILL_HORIZONTAL)); removeModelsButton.setEnabled(false); removeModelsButton.addSelectionListener( new SelectionAdapter() { @Override public void widgetSelected(SelectionEvent e) { Collection<IResource> models = new ArrayList<IResource>(); IStructuredSelection selection = (IStructuredSelection) modelsViewer.getSelection(); for (Object obj : selection.toArray()) { if (obj instanceof IResource) { models.add((IResource) obj); } } removeModels(models); removeModelsButton.setEnabled(false); } }); this.modelsViewer = new TableViewer(group); GridData gdv = new GridData(GridData.FILL_BOTH); // gdv.horizontalSpan = COLUMN_COUNT; modelsViewer.getControl().setLayoutData(gdv); modelsViewer.setContentProvider(new ListContentProvider()); modelsViewer.setLabelProvider(new ModelExplorerLabelProvider()); // Add Models from properties if available if (this.designerProperties != null && !this.designerProperties.isEmpty()) { IFile sourceMdl = DesignerPropertiesUtil.getSourceModel(this.designerProperties); IFile viewMdl = DesignerPropertiesUtil.getViewModel(this.designerProperties); if (sourceMdl != null) this.modelsForVdb.add(sourceMdl); if (viewMdl != null) this.modelsForVdb.add(viewMdl); } else { this.modelsForVdb.addAll(SelectionUtilities.getSelectedIResourceObjects(initialSelection)); } modelsViewer.setInput(this.modelsForVdb); modelsViewer.addSelectionChangedListener( new ISelectionChangedListener() { @Override public void selectionChanged(SelectionChangedEvent event) { removeModelsButton.setEnabled(!event.getSelection().isEmpty()); } }); } updateForProperties(); return mainPanel; } void handleAddModelsSelected() { final ViewerFilter filter = new ViewerFilter() { /** * {@inheritDoc} * * @see org.eclipse.jface.viewers.ViewerFilter#select(org.eclipse.jface.viewers.Viewer, * java.lang.Object, java.lang.Object) */ @Override public boolean select(final Viewer viewer, final Object parent, final Object element) { if (element instanceof IContainer) return true; final IFile file = (IFile) element; if (ModelUtilities.isModelFile(file) || ModelUtil.isXsdFile(file)) { return true; } return false; } }; ModelingResourceFilter wsFilter = new ModelingResourceFilter(filter); wsFilter.setShowHiddenProjects(true); final Object[] models = WidgetUtil.showWorkspaceObjectSelectionDialog( getString("selectModelsTitle"), // $NON-NLS-1$ getString("selectModelsMessage"), // $NON-NLS-1$ true, null, wsFilter, validator, modelLabelProvider); addModels(models); } void addModels(Object[] models) { for (Object model : models) { if (!modelsForVdb.contains(model)) { modelsForVdb.add((IResource) model); } } this.modelsViewer.refresh(); } void removeModels(Collection<IResource> models) { for (IResource model : models) { modelsForVdb.remove(model); } this.modelsViewer.refresh(); } /** @since 4.0 */ void browseButtonSelected() { ModelingResourceFilter resFilter = new ModelingResourceFilter(); resFilter.addFilter(new SingleProjectFilter(this.designerProperties)); this.folder = WidgetUtil.showFolderSelectionDialog(this.folder, resFilter, projectValidator); if (folder != null) { this.folderText.setText(folder.getFullPath().makeRelative().toString()); if (CoreStringUtil.isEmpty(nameText.getText())) { nameText.setFocus(); } } validatePage(); } /** @since 4.0 */ void folderModified() { validatePage(); } /** @since 4.0 */ void nameModified() { validatePage(); } /** @since 4.0 */ private void validatePage() { final IContainer folder; try { folder = WizardUtil.validateFileAndFolder( this.nameText, this.folderText, this.mainPage, ModelerCore.VDB_FILE_EXTENSION, false); if (this.mainPage.getMessageType() == IMessageProvider.ERROR) { // WizardUtil.validateFileAndFolder can set error message and message type so no need to do // further // validation if an error was already found (JBEDSP-588) return; } IStatus status = projectValidator.validate(new Object[] {folder}); String proposedName = this.nameText.getText(); if (!status.isOK()) { // only update the message if the vFolder is non-null; // if WizardUtil returned null, it already set the status // this corrects the case where the wrong message shows for // a bad filename. if (folder != null) { this.mainPage.setErrorMessage(status.getMessage()); this.mainPage.setPageComplete(false); } // endif } else if (!nameValidator.isValidName(proposedName)) { this.mainPage.setErrorMessage(VDB_NAME_ERROR); this.mainPage.setPageComplete(false); } else if (ModelUtilities.vdbNameReservedValidation(proposedName) != null) { this.mainPage.setErrorMessage(ModelUtilities.vdbNameReservedValidation(proposedName)); this.mainPage.setPageComplete(false); } else { this.mainPage.setErrorMessage(null); this.mainPage.setPageComplete(true); } if (this.mainPage.isPageComplete()) { this.name = proposedName; this.folder = folder; } } catch (final CoreException err) { VdbUiConstants.Util.log(err); WizardUtil.setPageComplete(this.mainPage, err.getLocalizedMessage(), IMessageProvider.ERROR); } } /** * Finds the visible VDB Editor for the supplied VDB * * <p>If an editor is NOT open for this vdb, then null is returned. * * @param vdb * @return the VdbEditor */ public VdbEditor getVdbEditor(final IFile vdb) { final IWorkbenchWindow window = UiPlugin.getDefault().getCurrentWorkbenchWindow(); if (window != null) { final IWorkbenchPage page = window.getActivePage(); if (page != null) { VdbEditor editor = findEditorPart(page, vdb); if (editor != null) { return editor; } } } return null; } private VdbEditor findEditorPart(final IWorkbenchPage page, IFile vdbFile) { // look through the open editors and see if there is one available for // this model file. final IEditorReference[] editors = page.getEditorReferences(); for (int i = 0; i < editors.length; ++i) { final IEditorPart editor = editors[i].getEditor(false); if (editor instanceof VdbEditor) { final VdbEditor vdbEditor = (VdbEditor) editor; final IPath editorVdbPath = vdbEditor.getVdb().getName(); if (vdbFile.getFullPath().equals(editorVdbPath)) return vdbEditor; } } return null; } /** */ @Override public void setProperties(Properties properties) { this.designerProperties = properties; } private void updateForProperties() { if (this.folder == null && this.designerProperties != null) { // Get Project from Properties - if it exists. IProject project = DesignerPropertiesUtil.getProject(this.designerProperties); if (project != null) { this.folder = project; this.folderText.setText(this.folder.getFullPath().makeRelative().toString()); if (CoreStringUtil.isEmpty(nameText.getText())) { nameText.setFocus(); } } } if (this.designerProperties != null && !this.openProjectExists) { DesignerPropertiesUtil.setProjectStatus( this.designerProperties, IPropertiesContext.NO_OPEN_PROJECT); } } }
/** * @see org.eclipse.jface.wizard.IWizard#performFinish() * @since 4.0 */ @Override public boolean finish() { // append VDB file extension if needed if (!name.endsWith(ModelerCore.VDB_FILE_EXTENSION)) { name += ModelerCore.VDB_FILE_EXTENSION; } if (designerProperties != null) { DesignerPropertiesUtil.setVdbName(designerProperties, name); } // create VDB resource final IRunnableWithProgress op = new IRunnableWithProgress() { @Override public void run(final IProgressMonitor monitor) throws InvocationTargetException { try { final IFile vdbFile = NewVdbWizard.this.folder.getFile(new Path(NewVdbWizard.this.name)); vdbFile.create(new ByteArrayInputStream(new byte[0]), false, monitor); Vdb newVdb = new Vdb(vdbFile, false, monitor); String desc = descriptionTextEditor.getText(); if (desc != null && desc.length() > 0) { newVdb.setDescription(desc); } newVdb.save(monitor); NewVdbWizard.this.folder.refreshLocal(IResource.DEPTH_INFINITE, monitor); // open editor IWorkbenchPage page = UiPlugin.getDefault().getCurrentWorkbenchWindow().getActivePage(); IDE.openEditor(page, vdbFile); // Thread.sleep(200); if (modelsForVdb != null && !modelsForVdb.isEmpty()) { VdbEditor editor = getVdbEditor(vdbFile); if (editor != null) { List<IFile> models = new ArrayList<IFile>(); for (IResource nextModel : modelsForVdb) { models.add((IFile) nextModel); } editor.addModels(models); editor.doSave(new NullProgressMonitor()); } } } catch (final Exception err) { throw new InvocationTargetException(err); } finally { monitor.done(); } } }; try { new ProgressMonitorDialog(getShell()).run(false, true, op); return true; } catch (Throwable err) { if (err instanceof InvocationTargetException) { err = ((InvocationTargetException) err).getTargetException(); } VdbUiConstants.Util.log(err); WidgetUtil.showError(CREATE_FILE_ERROR_MESSAGE); return false; } }
static String getString(final String id) { return VdbUiConstants.Util.getString(I18N_PREFIX + id); }