/*************************************************************************************************** * Copyright (c) 2007 Eteration A.S. and Gorkem Ercan. All rights reserved. This program and the * accompanying materials are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at * http://www.eclipse.org/legal/epl-v10.html * * Contributors: Gorkem Ercan - initial API and implementation * **************************************************************************************************/ package org.eclipse.jst.server.generic.ui.internal.editor; import java.beans.PropertyChangeEvent; import java.beans.PropertyChangeListener; import java.io.File; import java.util.Locale; 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.ResourcesPlugin; import org.eclipse.core.runtime.CoreException; import org.eclipse.core.runtime.IStatus; import org.eclipse.core.runtime.NullProgressMonitor; import org.eclipse.core.runtime.Status; import org.eclipse.core.runtime.content.IContentType; import org.eclipse.core.variables.VariablesPlugin; import org.eclipse.jface.viewers.Viewer; import org.eclipse.jface.viewers.ViewerFilter; import org.eclipse.jface.window.Window; import org.eclipse.jst.server.generic.core.internal.GenericServer; import org.eclipse.jst.server.generic.core.internal.GenericServerRuntime; import org.eclipse.jst.server.generic.ui.internal.GenericServerUIMessages; import org.eclipse.jst.server.generic.ui.internal.GenericUiPlugin; import org.eclipse.swt.SWT; 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.Event; import org.eclipse.swt.widgets.Label; import org.eclipse.swt.widgets.Listener; import org.eclipse.swt.widgets.Text; import org.eclipse.ui.IEditorInput; import org.eclipse.ui.IEditorSite; import org.eclipse.ui.dialogs.ElementTreeSelectionDialog; import org.eclipse.ui.forms.IFormColors; import org.eclipse.ui.forms.widgets.ExpandableComposite; import org.eclipse.ui.forms.widgets.FormToolkit; import org.eclipse.ui.forms.widgets.Section; import org.eclipse.ui.ide.IDE; import org.eclipse.ui.model.WorkbenchContentProvider; import org.eclipse.ui.model.WorkbenchLabelProvider; import org.eclipse.wst.server.ui.editor.ServerEditorSection; public class AntBuildFileSelectionEditorSection extends ServerEditorSection{ protected GenericServer fServer; private PropertyChangeListener fPropertyChangeListener; protected Text buildFileText; protected boolean fUpdating; private class BuildFileFilter extends ViewerFilter{ public boolean select(Viewer viewer, Object parentElement, Object element) { if (element instanceof IFile) { IFile file = ((IFile)element); if (file.getName().toLowerCase(Locale.ENGLISH).endsWith(".xml")){ //$NON-NLS-1$ IContentType contentType = IDE.getContentType(file); if( contentType != null){ return "org.eclipse.ant.core.antBuildFile".equals(contentType.getId()); //$NON-NLS-1$ } } return false; } if (element instanceof IProject && !((IProject)element).isOpen()) return false; if (element instanceof IContainer){ // i.e. IProject, IFolder try { IResource[] resources = ((IContainer)element).members(); for (int i = 0; i < resources.length; i++){ if (select(viewer, parentElement, resources[i])) return true; } } catch (CoreException e) { //Ignored } } return false; } } public void init(final IEditorSite site, IEditorInput input) { super.init(site, input); if( server != null ){ fServer = (GenericServer)server.loadAdapter(GenericServer.class, new NullProgressMonitor()); } fPropertyChangeListener = new PropertyChangeListener(){ public void propertyChange( PropertyChangeEvent evt ) { if(evt.getPropertyName().equals( GenericServerRuntime.SERVER_INSTANCE_PROPERTIES )) { if ( !fUpdating ){ fUpdating = true; Object value = fServer.getServerInstanceProperties().get(GenericServer.PROP_CUSTOM_BUILD_SCRIPT); buildFileText.setText(value == null? "": (String)value ); //$NON-NLS-1$ fUpdating = false; } } } }; server.addPropertyChangeListener( fPropertyChangeListener ); } public void createSection(final Composite parent) { super.createSection(parent); FormToolkit formToolkit = getFormToolkit(parent.getDisplay()); Section section = formToolkit.createSection(parent, ExpandableComposite.TWISTIE | ExpandableComposite.EXPANDED | ExpandableComposite.TITLE_BAR | Section.DESCRIPTION | ExpandableComposite.FOCUS_TITLE); section.setText(GenericServerUIMessages.AntPublisherSectionHeading); section.setDescription(GenericServerUIMessages.AntPublisherSectionDescription); section.setLayoutData(new GridData(SWT.FILL,SWT.NONE,true,false)); Composite composite = formToolkit.createComposite(section); GridLayout layout = new GridLayout(); layout.numColumns=3; layout.marginHeight = 5; layout.marginWidth = 10; layout.verticalSpacing = 5; layout.horizontalSpacing = 15; composite.setLayout(layout); composite.setLayoutData(new GridData(SWT.FILL,SWT.NONE,true,false)); Label buildFileLabel = formToolkit.createLabel(composite, GenericServerUIMessages.LabelBuildFile); buildFileLabel.setForeground(formToolkit.getColors().getColor(IFormColors.TITLE)); buildFileText = formToolkit.createText(composite, ""); //$NON-NLS-1$ String oldValue = fServer.getServerInstanceProperties().get(GenericServer.PROP_CUSTOM_BUILD_SCRIPT)==null ?"": //$NON-NLS-1$ (String)fServer.getServerInstanceProperties().get(GenericServer.PROP_CUSTOM_BUILD_SCRIPT) ; buildFileText.setText(oldValue); buildFileText.addListener(SWT.Modify, new Listener() { public void handleEvent(Event event) { executeUpdateOperation( GenericServer.PROP_CUSTOM_BUILD_SCRIPT, buildFileText.getText() ); } }); GridData gridData = new GridData(GridData.FILL_HORIZONTAL | GridData.GRAB_HORIZONTAL); buildFileText.setLayoutData(gridData); Button buildFileBtn = formToolkit.createButton(composite, GenericServerUIMessages.ButtonBrowseForBuildFile, SWT.PUSH); buildFileBtn.addListener(SWT.Selection, new Listener() { public void handleEvent(Event event) { ElementTreeSelectionDialog dialog = new ElementTreeSelectionDialog( parent.getShell(), new WorkbenchLabelProvider(), new WorkbenchContentProvider()); // dialog.setValidator(new FileValidator()); dialog.setAllowMultiple(false); dialog.setTitle(GenericServerUIMessages.AntBuildDialogTitle); dialog.setMessage(GenericServerUIMessages.AntBuildDialogDescription); dialog.addFilter(new BuildFileFilter()); dialog.setInput(ResourcesPlugin.getWorkspace().getRoot()); if (dialog.open() == Window.OK) { IFile file = (IFile) dialog.getFirstResult(); buildFileText.setText(VariablesPlugin.getDefault().getStringVariableManager().generateVariableExpression("workspace_loc",file.getFullPath().toString())); //$NON-NLS-1$ } } }); formToolkit.paintBordersFor(composite); section.setClient(composite); } public void dispose() { super.dispose(); if( server!= null ) server.removePropertyChangeListener( fPropertyChangeListener ); } public IStatus[] getSaveStatus() { try { String filename = VariablesPlugin.getDefault().getStringVariableManager().performStringSubstitution(buildFileText.getText()); if ( filename!= null && filename.length()>0 ) { File f = new File(filename); if ( !f.exists() ){ IStatus[] st = new Status[1]; st[0] = new Status(IStatus.ERROR,GenericUiPlugin.PLUGIN_ID,GenericServerUIMessages.ErrorNoAntBuildFile); return st; } } } catch (CoreException e) { GenericUiPlugin.getDefault().getLog().log(e.getStatus()); } return super.getSaveStatus(); } protected void executeUpdateOperation(String propertyName, String propertyValue) { if (!fUpdating) { fUpdating = true; execute(new UpdateServerPropertyOperation(server, GenericServerUIMessages.UpdateOperationDescription, propertyName, propertyValue)); fUpdating = false; } } }