/* * JBoss, Home of Professional Open Source * Copyright 2006, JBoss Inc., and others contributors as indicated * by the @authors tag. All rights reserved. * See the copyright.txt in the distribution for a * full listing of individual contributors. * This copyrighted material is made available to anyone wishing to use, * modify, copy, or redistribute it subject to the terms and conditions * of the GNU Lesser General Public License, v. 2.1. * This program is distributed in the hope that it will be useful, but WITHOUT A * 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, * v.2.1 along with this distribution; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, * MA 02110-1301, USA. * * (C) 2005-2006, JBoss Inc. */ package org.jboss.tools.smooks.launch; 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.CoreException; import org.eclipse.core.runtime.IPath; import org.eclipse.core.runtime.IStatus; import org.eclipse.core.runtime.Path; import org.eclipse.debug.core.ILaunchConfiguration; import org.eclipse.debug.core.ILaunchConfigurationWorkingCopy; import org.eclipse.debug.ui.AbstractLaunchConfigurationTab; import org.eclipse.jdt.core.IJavaModel; import org.eclipse.jdt.core.IJavaProject; import org.eclipse.jdt.core.JavaCore; import org.eclipse.jdt.core.JavaModelException; import org.eclipse.jdt.launching.IJavaLaunchConfigurationConstants; import org.eclipse.jdt.ui.JavaElementLabelProvider; import org.eclipse.jface.dialogs.Dialog; import org.eclipse.jface.viewers.ILabelProvider; import org.eclipse.jface.viewers.ISelection; import org.eclipse.jface.viewers.IStructuredSelection; import org.eclipse.jface.window.Window; 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.IEditorInput; import org.eclipse.ui.IEditorPart; import org.eclipse.ui.IWorkbenchPage; import org.eclipse.ui.PlatformUI; import org.eclipse.ui.dialogs.ElementListSelectionDialog; import org.eclipse.ui.dialogs.ElementTreeSelectionDialog; import org.eclipse.ui.model.WorkbenchContentProvider; import org.eclipse.ui.model.WorkbenchLabelProvider; import org.eclipse.ui.part.FileEditorInput; import org.jboss.tools.smooks.configuration.RuntimeMetadata; import org.jboss.tools.smooks.editor.AbstractSmooksFormEditor; /** * Smooks Run Tab. * @author <a href="mailto:tom.fennelly@jboss.com">tom.fennelly@jboss.com</a> */ public class SmooksRunTab extends AbstractLaunchConfigurationTab { // Project UI widgets private Text fProjText; private Button fProjButton; private Text fConfigurationText; private Button fSearchButton; private RuntimeMetadata launchMetaData = new RuntimeMetadata(); /* (non-Javadoc) * @see org.eclipse.debug.ui.ILaunchConfigurationTab#createControl(org.eclipse.swt.widgets.Composite) */ public void createControl(Composite parent) { Composite comp = new Composite(parent, SWT.NONE); setControl(comp); GridLayout topLayout = new GridLayout(); topLayout.numColumns= 3; comp.setLayout(topLayout); createFormElements(comp); Dialog.applyDialogFont(comp); validatePage(); } // private void createSpacer(Composite comp) { // Label label= new Label(comp, SWT.NONE); // GridData gd= new GridData(); // gd.horizontalSpan= 3; // label.setLayoutData(gd); // } private void createFormElements(Composite comp) { GridData gd = new GridData(); Label fProjLabel = new Label(comp, SWT.NONE); gd.horizontalIndent = 10; fProjLabel.setText(Messages.SmooksRunTab_Label_Project); fProjLabel.setLayoutData(gd); fProjText= new Text(comp, SWT.SINGLE | SWT.BORDER); fProjText.setLayoutData(new GridData(GridData.FILL_HORIZONTAL)); fProjText.addModifyListener(new ModifyListener() { public void modifyText(ModifyEvent evt) { validatePage(); updateLaunchConfigurationDialog(); fSearchButton.setEnabled(fProjText.getText().length() > 0); } }); fProjButton = new Button(comp, SWT.PUSH); fProjButton.setText(Messages.SmooksRunTab_Button_Browse); fProjButton.addSelectionListener(new SelectionAdapter() { public void widgetSelected(SelectionEvent evt) { handleProjectButtonSelected(); } }); setButtonGridData(fProjButton); Label fConfigLabel = new Label(comp, SWT.NONE); gd = new GridData(); gd.horizontalIndent = 10; fConfigLabel.setLayoutData(gd); fConfigLabel.setText(Messages.SmooksRunTab_Label_Configuration); fConfigurationText = new Text(comp, SWT.SINGLE | SWT.BORDER); fConfigurationText.setLayoutData(new GridData(GridData.FILL_HORIZONTAL)); fConfigurationText.addModifyListener(new ModifyListener() { public void modifyText(ModifyEvent evt) { handleSmooksConfigChange(); validatePage(); updateLaunchConfigurationDialog(); } }); fSearchButton = new Button(comp, SWT.PUSH); fSearchButton.setEnabled(fProjText.getText().length() > 0); fSearchButton.setText(Messages.SmooksRunTab_Button_Search); fSearchButton.addSelectionListener(new SelectionAdapter() { public void widgetSelected(SelectionEvent evt) { handleSearchButtonSelected(); } }); setButtonGridData(fSearchButton); } /* (non-Javadoc) * @see org.eclipse.debug.ui.ILaunchConfigurationTab#setDefaults(org.eclipse.debug.core.ILaunchConfigurationWorkingCopy) */ public void setDefaults(ILaunchConfigurationWorkingCopy launchConfigWC) { IWorkbenchPage activePage = PlatformUI.getWorkbench().getActiveWorkbenchWindow().getActivePage(); launchConfigWC.setAttribute(IJavaLaunchConfigurationConstants.ATTR_PROJECT_NAME, ""); //$NON-NLS-1$ launchConfigWC.setAttribute(IJavaLaunchConfigurationConstants.ATTR_MAIN_TYPE_NAME, ""); //$NON-NLS-1$ if(activePage != null) { IEditorPart editor = activePage.getActiveEditor(); // added for Issue JBIDE-5360 - now will get defaults from the navigator first (if valid smooks config) or the smooks editor if it's open boolean foundInNavigator = false; if (activePage.getActivePart().getSite().getSelectionProvider() != null) { ISelection selection = activePage.getActivePart().getSite().getSelectionProvider().getSelection(); if (selection instanceof IStructuredSelection) { IStructuredSelection ssel = (IStructuredSelection) selection; if (!ssel.isEmpty() && ssel.getFirstElement() instanceof IFile) { IFile file = (IFile) ssel.getFirstElement(); RuntimeMetadata metadata = new RuntimeMetadata(); metadata.setSmooksConfig(file); if (metadata.isValidSmooksConfig()) { String configName = getLaunchManager().generateUniqueLaunchConfigurationNameFrom(file.getName()); launchConfigWC.rename(configName); launchConfigWC.setAttribute(IJavaLaunchConfigurationConstants.ATTR_PROJECT_NAME, file.getProject().getName()); //$NON-NLS-1$ launchConfigWC.setAttribute(IJavaLaunchConfigurationConstants.ATTR_MAIN_TYPE_NAME, file.getProjectRelativePath().toString()); //$NON-NLS-1$ foundInNavigator = true; } } } } if (editor instanceof AbstractSmooksFormEditor && !foundInNavigator ) { IEditorInput editorInput = editor.getEditorInput(); if (editorInput instanceof FileEditorInput && !foundInNavigator) { FileEditorInput fileEI = (FileEditorInput) editorInput; IFile file = fileEI.getFile(); String configName = getLaunchManager().generateUniqueLaunchConfigurationNameFrom(editor.getTitle()); launchConfigWC.rename(configName); launchConfigWC.setAttribute(IJavaLaunchConfigurationConstants.ATTR_PROJECT_NAME, file.getProject().getName()); //$NON-NLS-1$ launchConfigWC.setAttribute(IJavaLaunchConfigurationConstants.ATTR_MAIN_TYPE_NAME, file.getProjectRelativePath().toString()); //$NON-NLS-1$ } } } } /* (non-Javadoc) * @see org.eclipse.debug.ui.ILaunchConfigurationTab#initializeFrom(org.eclipse.debug.core.ILaunchConfiguration) */ public void initializeFrom(ILaunchConfiguration config) { try { fProjText.setText(config.getAttribute(IJavaLaunchConfigurationConstants.ATTR_PROJECT_NAME, "")); //$NON-NLS-1$ fConfigurationText.setText(config.getAttribute(IJavaLaunchConfigurationConstants.ATTR_MAIN_TYPE_NAME, "")); //$NON-NLS-1$ } catch (CoreException ce) { } IResource smooksConfig = getSmooksConfig(); if(smooksConfig != null) { launchMetaData.setSmooksConfig(smooksConfig); } validatePage(); } /* * (non-Javadoc) * @see org.eclipse.debug.ui.ILaunchConfigurationTab#performApply(org.eclipse.debug.core.ILaunchConfigurationWorkingCopy) */ public void performApply(ILaunchConfigurationWorkingCopy launchConfigWC) { launchConfigWC.setAttribute(IJavaLaunchConfigurationConstants.ATTR_PROJECT_NAME, fProjText.getText()); launchConfigWC.setAttribute(IJavaLaunchConfigurationConstants.ATTR_MAIN_TYPE_NAME, fConfigurationText.getText()); } /* * Show a dialog that lists all main types */ private void handleSearchButtonSelected() { ElementTreeSelectionDialog dialog = new ElementTreeSelectionDialog(getShell(), new WorkbenchLabelProvider(), new WorkbenchContentProvider()); IWorkspaceRoot root = ResourcesPlugin.getWorkspace().getRoot(); IProject project = root.getProject(fProjText.getText()); if(assertProjectOK(project)) { dialog.setInput(project); } else { dialog.setInput(root); } dialog.setTitle(Messages.SmooksRunTab_Dialog_Title_Select_Config); if (dialog.open() == Window.CANCEL) { return; } Object[] results = dialog.getResult(); if ((results == null) || (results.length < 1)) { return; } IResource resource = (IResource)results[0]; fConfigurationText.setText(resource.getProjectRelativePath().toString()); } private void handleSmooksConfigChange() { launchMetaData.setSmooksConfig(getSmooksConfig()); } /* * Show a dialog that lets the user select a project. This in turn provides * context for the main type, allowing the user to key a main type name, or * constraining the search for main types to the specified project. */ private void handleProjectButtonSelected() { IJavaProject project = chooseJavaProject(); if (project == null) { return; } String projectName = project.getElementName(); fProjText.setText(projectName); } /* * Realize a Java Project selection dialog and return the first selected project, * or null if there was none. */ private IJavaProject chooseJavaProject() { IJavaProject[] projects; try { projects= JavaCore.create(getWorkspaceRoot()).getJavaProjects(); } catch (JavaModelException e) { projects= new IJavaProject[0]; } ILabelProvider labelProvider= new JavaElementLabelProvider(JavaElementLabelProvider.SHOW_DEFAULT); ElementListSelectionDialog dialog= new ElementListSelectionDialog(getShell(), labelProvider); dialog.setTitle(Messages.SmooksRunTab_Title_Select_Config); dialog.setMessage(Messages.SmooksRunTab_Message_Select_Config); dialog.setElements(projects); IJavaProject javaProject = getJavaProject(); if (javaProject != null) { dialog.setInitialSelections(new Object[] { javaProject }); } if (dialog.open() == Window.OK) { return (IJavaProject) dialog.getFirstResult(); } return null; } /* * Return the IJavaProject corresponding to the project name in the project name * text field, or null if the text does not match a project name. */ private IJavaProject getJavaProject() { String projectName = fProjText.getText().trim(); if (projectName.length() < 1) { return null; } return getJavaModel().getJavaProject(projectName); } /* * Convenience method to get the workspace root. */ private static IWorkspaceRoot getWorkspaceRoot() { return ResourcesPlugin.getWorkspace().getRoot(); } /* * Convenience method to get access to the java model. */ private IJavaModel getJavaModel() { return JavaCore.create(getWorkspaceRoot()); } /* (non-Javadoc) * @see org.eclipse.debug.ui.AbstractLaunchConfigurationTab#isValid(org.eclipse.debug.core.ILaunchConfiguration) */ public boolean isValid(ILaunchConfiguration config) { validatePage(); return getErrorMessage() == null; } private void validatePage() { setErrorMessage(null); setMessage(null); String projectName= fProjText.getText().trim(); if (projectName.length() == 0) { setErrorMessage(Messages.SmooksRunTab_Error_Need_Project_Name); return; } IStatus status= ResourcesPlugin.getWorkspace().validatePath(IPath.SEPARATOR + projectName, IResource.PROJECT); if (!status.isOK() || !Path.ROOT.isValidSegment(projectName)) { setErrorMessage(Messages.SmooksRunTab_Error_Invalid_Project_Name + projectName + "'."); //$NON-NLS-1$ return; } IProject project= getWorkspaceRoot().getProject(projectName); if (!project.exists()) { setErrorMessage(Messages.SmooksRunTab_Error_Unknown_Project_Name + projectName + "'."); //$NON-NLS-1$ return; } String configName= fConfigurationText.getText().trim(); try { if (!project.hasNature(JavaCore.NATURE_ID)) { setErrorMessage(Messages.SmooksRunTab_Error_Not_A_Java_Project + projectName + Messages.SmooksRunTab_Error_Not_A_Java_Project2); return; } if (configName.length() == 0) { setErrorMessage(Messages.SmooksRunTab_Error_Smooks_Configuration_Missing); return; } } catch (CoreException e) { setErrorMessage(Messages.SmooksRunTab_Error_Validation + e.getMessage()); } if(!launchMetaData.isValidSmooksConfig()) { setErrorMessage(launchMetaData.getErrorMessage()); } } private IResource getSmooksConfig() { String projectName = fProjText.getText(); String configName = fConfigurationText.getText(); return getSmooksConfig(projectName, configName); } public static IResource getSmooksConfig(ILaunchConfiguration launchConfig) { try { String projectName = launchConfig.getAttribute(IJavaLaunchConfigurationConstants.ATTR_PROJECT_NAME, ""); //$NON-NLS-1$; String configName = launchConfig.getAttribute(IJavaLaunchConfigurationConstants.ATTR_MAIN_TYPE_NAME, ""); //$NON-NLS-1$; return getSmooksConfig(projectName, configName); } catch (CoreException e) { return null; } } private static IResource getSmooksConfig(String projectName, String configName) { if(projectName != null && !projectName.trim().equals("") && configName != null && !configName.trim().equals("")) { //$NON-NLS-1$ //$NON-NLS-2$ IProject project = getWorkspaceRoot().getProject(projectName); if(assertProjectOK(project)) { return project.findMember(configName); } } return null; } /* (non-Javadoc) * @see org.eclipse.debug.ui.ILaunchConfigurationTab#getName() */ public String getName() { return Messages.SmooksRunTab_Tab_Name; } private void setButtonGridData(Button button) { GridData gridData= new GridData(); button.setLayoutData(gridData); } private static boolean assertProjectOK(IProject project) { return (project != null && project.exists() && project.isAccessible() && !project.isHidden()); } }