/* * JBoss, Home of Professional Open Source * Copyright 2005, JBoss Inc., and individual contributors as indicated * by the @authors tag. See the copyright.txt in the distribution for a * full listing of individual contributors. * * This is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as * published by the Free Software Foundation; either version 2.1 of * the License, or (at your option) any later version. * * This software is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this software; if not, write to the Free * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA * 02110-1301 USA, or see the FSF site: http://www.fsf.org. */ package org.jbpm.gd.jpdl.wizard; import org.eclipse.core.resources.IContainer; import org.eclipse.core.resources.IFile; import org.eclipse.core.resources.IProject; import org.eclipse.core.resources.IResource; import org.eclipse.core.resources.IWorkspaceRoot; import org.eclipse.core.resources.ResourcesPlugin; import org.eclipse.core.runtime.IPath; import org.eclipse.core.runtime.Path; import org.eclipse.jface.dialogs.Dialog; import org.eclipse.jface.viewers.ILabelProvider; import org.eclipse.jface.viewers.IStructuredSelection; import org.eclipse.jface.viewers.Viewer; import org.eclipse.jface.viewers.ViewerFilter; import org.eclipse.jface.wizard.WizardPage; 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.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.Label; import org.eclipse.swt.widgets.Text; import org.eclipse.ui.dialogs.ElementTreeSelectionDialog; import org.eclipse.ui.model.WorkbenchContentProvider; import org.eclipse.ui.model.WorkbenchLabelProvider; public class NewProcessDefinitionWizardPage extends WizardPage { private Text containerText; private Text processNameText; private Button browseButton; private IWorkspaceRoot workspaceRoot; private String containerName; public NewProcessDefinitionWizardPage() { super("Process Definition"); setTitle("Create Process Definition"); setDescription("Create a new process definition"); workspaceRoot = ResourcesPlugin.getWorkspace().getRoot(); } public void init(IStructuredSelection selection) { IContainer container = null; if (selection != null && !selection.isEmpty()) { Object object = selection.getFirstElement(); if (IFile.class.isInstance(object) && !IContainer.class.isInstance(object)) { container = ((IFile)object).getParent(); } else if (IContainer.class.isInstance(object)) { container = (IContainer)object; } } else { IWorkspaceRoot workspaceRoot = ResourcesPlugin.getWorkspace().getRoot(); IProject[] projects = workspaceRoot.getProjects(); if (projects != null && projects.length != 0) { container = projects[0]; } } initContainerName(container); } public void createControl(Composite parent) { initializeDialogUnits(parent); Composite composite = createClientArea(parent); createProcessNameField(composite); createContainerField(composite); setControl(composite); Dialog.applyDialogFont(composite); checkPage(); } private Composite createClientArea(Composite parent) { Composite composite= new Composite(parent, SWT.NONE); GridLayout layout= new GridLayout(); layout.marginWidth= 0; layout.marginHeight= 0; layout.numColumns= 3; composite.setLayout(layout); return composite; } private void createContainerField(Composite parent) { Label label = new Label(parent, SWT.NONE); label.setText("Source Folder: "); containerText = new Text(parent, SWT.BORDER); containerText.setText(containerName); containerText.addModifyListener(new ModifyListener() { public void modifyText(ModifyEvent e) { checkPage(); } }); GridData gd = new GridData(GridData.FILL_HORIZONTAL); containerText.setLayoutData(gd); browseButton = new Button(parent, SWT.PUSH); browseButton.setText("Browse..."); browseButton.addSelectionListener(new SelectionAdapter() { public void widgetSelected(SelectionEvent e) { chooseContainer(); } }); gd = new GridData(); gd.widthHint = convertWidthInCharsToPixels(15); gd.heightHint = 18; browseButton.setLayoutData(gd); } private void createProcessNameField(Composite parent) { Label label = new Label(parent, SWT.NONE); label.setText("Process Name: "); processNameText = new Text(parent, SWT.BORDER); processNameText.setText(findInitialProcessName()); processNameText.addModifyListener(new ModifyListener() { public void modifyText(ModifyEvent e) { checkPage(); } }); processNameText.setLayoutData(new GridData(GridData.FILL_HORIZONTAL)); new Label(parent, SWT.NONE); } private String findInitialProcessName() { String baseName = "process"; String result = baseName; if (processExists(result)) { int runner = 1; do { result = baseName + "-" + runner; } while (processExists(result)); } return result; } private boolean processExists(String name) { IResource resource = workspaceRoot.findMember(new Path(containerName).append(name + ".jpdl.xml")); return resource != null && resource.exists(); } private void chooseContainer() { WorkbenchContentProvider provider= new WorkbenchContentProvider(); ILabelProvider labelProvider= new WorkbenchLabelProvider(); ElementTreeSelectionDialog dialog= new ElementTreeSelectionDialog(getShell(), labelProvider, provider); dialog.setTitle("Folder Selection"); dialog.setMessage("Choose a folder"); dialog.setInput(ResourcesPlugin.getWorkspace()); dialog.addFilter(createViewerFilter()); dialog.open(); initContainerName((IContainer)dialog.getFirstResult()); containerText.setText(containerName); } private ViewerFilter createViewerFilter() { ViewerFilter filter= new ViewerFilter() { public boolean select(Viewer viewer, Object parent, Object element) { return element instanceof IContainer; } }; return filter; } private void initContainerName(IContainer elem) { containerName = (elem == null) ? "" : elem.getFullPath().makeRelative().toString(); } private void checkPage() { if (!checkContainerText()) return; if (!checkProcessNameText()) return; } private boolean checkContainerText() { if ("".equals(containerText.getText())) { setMessage("Select the source folder or enter its name."); setPageComplete(false); return false; } else if (!projectExists()) { setMessage("The source folder needs to be contained in an existing project"); setPageComplete(false); return false; } else if (!containerExists()) { setMessage("The source folder does not exist and will be created."); setPageComplete(true); return true; } else { setMessage(null); setPageComplete(true); return true; } } private boolean projectExists() { IPath path = new Path(containerText.getText()); String project = path.segment(0); IResource resource = workspaceRoot.getProject(project); return resource != null && resource.exists(); } private boolean containerExists() { IPath path = new Path(containerText.getText()); IResource resource = workspaceRoot.findMember(path); return resource != null && resource.exists(); } private boolean checkProcessNameText() { if ("".equals(processNameText.getText())) { setMessage("Enter a name for the process."); setPageComplete(false); return false; } else if (processExists()) { setMessage("A process with this name already exists in this container."); setPageComplete(false); return false; } else { setMessage(null); setPageComplete(true); return true; } } private boolean processExists() { return getProcessDefinitionFile().exists() || getGpdFile().exists(); } private IPath getProcessDefinitionFilePath() { String path = containerText.getText() + "/" + getProcessName() + ".jpdl.xml"; return new Path(path); } private IPath getGpdFilePath() { String path = containerText.getText() + "/." + getProcessName() + ".gpd.xml"; return new Path(path); } IFile getProcessDefinitionFile() { return workspaceRoot.getFile(getProcessDefinitionFilePath()); } IFile getGpdFile() { return workspaceRoot.getFile(getGpdFilePath()); } public String getProcessName() { return processNameText.getText(); } }