package org.zend.php.zendserver.deployment.ui.editors; import java.io.ByteArrayInputStream; import java.io.File; import java.io.IOException; import java.io.InputStream; 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.runtime.CoreException; import org.eclipse.core.runtime.IPath; import org.eclipse.core.runtime.IProgressMonitor; import org.eclipse.core.runtime.IStatus; import org.eclipse.core.runtime.Path; import org.eclipse.core.runtime.Status; import org.eclipse.core.runtime.jobs.Job; import org.eclipse.jface.dialogs.MessageDialog; import org.eclipse.jface.text.IDocument; import org.eclipse.jface.viewers.DoubleClickEvent; import org.eclipse.jface.viewers.IDoubleClickListener; import org.eclipse.jface.viewers.IStructuredSelection; import org.eclipse.jface.viewers.TreeViewer; import org.eclipse.swt.SWT; import org.eclipse.swt.layout.GridData; import org.eclipse.swt.layout.GridLayout; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Label; import org.eclipse.swt.widgets.Tree; import org.eclipse.ui.IEditorDescriptor; import org.eclipse.ui.IWorkbenchPage; import org.eclipse.ui.PartInitException; import org.eclipse.ui.PlatformUI; import org.eclipse.ui.forms.IManagedForm; import org.eclipse.ui.forms.widgets.FormToolkit; import org.eclipse.ui.forms.widgets.Section; import org.eclipse.ui.forms.widgets.TableWrapData; import org.eclipse.ui.part.FileEditorInput; import org.zend.php.zendserver.deployment.core.descriptor.DeploymentDescriptorPackage; import org.zend.php.zendserver.deployment.core.sdk.EclipseMappingModelLoader; import org.zend.php.zendserver.deployment.core.sdk.StatusChangeListener; import org.zend.php.zendserver.deployment.ui.Activator; import org.zend.php.zendserver.deployment.ui.Messages; import org.zend.php.zendserver.deployment.ui.editors.ScriptsContentProvider.Script; import org.zend.sdklib.application.ZendProject; import org.zend.sdklib.mapping.IMappingModel; import org.zend.sdklib.project.DeploymentScriptTypes; public class ScriptsSection { private DeploymentDescriptorEditor editor; private TextField scriptsDir; private TreeViewer scriptsTree; public ScriptsSection(DeploymentDescriptorEditor editor) { this.editor = editor; } private void openScript(final String name) { Job job = new Job(Messages.OverviewPage_CreatingDeploymentScript) { @Override protected IStatus run(IProgressMonitor monitor) { StatusChangeListener listener = new StatusChangeListener(monitor); try { IFile file = getScript(name); if (file == null || !file.exists()) { createScript(name, monitor, listener); refreshScriptsTree(); } openEditor(getScript(name)); scriptsTree.getControl().getDisplay().asyncExec(new Runnable() { public void run() { scriptsDir.refresh(); } }); } catch (CoreException e) { return new Status(IStatus.ERROR, Activator.PLUGIN_ID, e.getMessage(), e); } catch (IOException e) { return new Status(IStatus.ERROR, Activator.PLUGIN_ID, e.getMessage(), e); } return Status.OK_STATUS; } }; job.setUser(true); job.schedule(); } protected void refreshScriptsTree() { scriptsTree.getControl().getDisplay().asyncExec(new Runnable() { public void run() { scriptsTree.refresh(); // update created script icon } }); } private void createScript(final String scriptName, IProgressMonitor monitor, StatusChangeListener listener) throws CoreException, IOException { File projLocation = editor.getProject().getLocation().toFile(); IDocument document = editor.getPropertiesDocument(); final ZendProject zp = new ZendProject(projLocation, new EclipseMappingModelLoader(document)); zp.addStatusChangeListener(listener); editor.getSite().getShell().getDisplay().syncExec(new Runnable() { public void run() { if (zp.update(scriptName, false, true)) { String currentValue = editor.getModel().get( DeploymentDescriptorPackage.SCRIPTSDIR); if (currentValue == null || currentValue.isEmpty()) { editor.getModel().set(DeploymentDescriptorPackage.SCRIPTSDIR, "scripts"); //$NON-NLS-1$ } } } }); InputStream stream = new ByteArrayInputStream(document.get().getBytes()); editor.getDescriptorContainer().getMappingModel().load(stream); editor.getProject().refreshLocal(IProject.DEPTH_INFINITE, monitor); } protected void openEditor(final IFile file) throws PartInitException { editor.getSite().getShell().getDisplay().asyncExec(new Runnable() { public void run() { IWorkbenchPage page = editor.getSite().getPage(); try { IEditorDescriptor desc = PlatformUI.getWorkbench() .getEditorRegistry() .getDefaultEditor(file.getName()); page.openEditor(new FileEditorInput(file), desc.getId()); } catch (PartInitException e) { // TODO Log exception e.printStackTrace(); } } }); } public void refresh() { scriptsDir.refresh(); } public void createDeploymentScriptsSection(IManagedForm managedForm, Composite parent) { FormToolkit toolkit = managedForm.getToolkit(); Section section = toolkit.createSection(parent, Section.DESCRIPTION | Section.TITLE_BAR | Section.TWISTIE | Section.EXPANDED); section.marginWidth = 5; section.setText(Messages.OverviewPage_DeploymentScripts); section.setDescription(Messages.OverviewPage_ScriptsDescription); Composite sectionClient = toolkit.createComposite(section); section.setClient(sectionClient); section.setLayoutData(new TableWrapData(TableWrapData.FILL_GRAB, TableWrapData.BOTTOM)); sectionClient.setLayout(new GridLayout(3, false)); scriptsDir = new TextField(editor.getModel(), DeploymentDescriptorPackage.SCRIPTSDIR, Messages.OverviewPage_Scriptsdir, managedForm.getMessageManager()); scriptsDir.create(sectionClient, toolkit); Label label = toolkit.createLabel(sectionClient, Messages.OverviewPage_Doubleclick); GridData gd = new GridData(SWT.FILL, SWT.CENTER, true, false); gd.horizontalSpan = 3; label.setLayoutData(gd); scriptsTree = new TreeViewer(sectionClient, SWT.BORDER); Tree tree = scriptsTree.getTree(); gd = new GridData(SWT.FILL, SWT.DEFAULT, true, true); gd.horizontalSpan = 3; gd.heightHint = 100; tree.setLayoutData(gd); ScriptsContentProvider cp = new ScriptsContentProvider(); scriptsTree.setContentProvider(cp); scriptsTree.setLabelProvider(new ScriptsLabelProvider(this)); scriptsTree.setInput(cp.model); scriptsTree.expandAll(); scriptsTree.addDoubleClickListener(new IDoubleClickListener() { public void doubleClick(DoubleClickEvent event) { Object element = ((IStructuredSelection) event.getSelection()) .getFirstElement(); if (element instanceof ScriptsContentProvider.Script) { ScriptsContentProvider.Script script = (Script) element; IFile file = getScript(script.name); if (file == null || !file.exists()) { boolean canCreate = MessageDialog.openQuestion( editor.getSite().getShell(), Messages.OverviewPage_OpenScript, Messages.OverviewPage_SelectedScriptDoesntExist); if (!canCreate) { return; } } openScript(script.name); } } }); toolkit.paintBordersFor(sectionClient); } protected IFile getScript(String scriptName) { DeploymentScriptTypes name = DeploymentScriptTypes.byName(scriptName); if (name == null) { return null; } IMappingModel mapping = editor.getDescriptorContainer().getMappingModel(); if (mapping == null || !mapping.isLoaded()) { return editor.getProject().getFile(name.getFilename()); } try { String folder = mapping.getPath(name.getFilename()); IContainer container = editor.getDescriptorContainer().getFile().getParent(); if (folder != null) { IPath path = new Path(folder); IResource resource = container.findMember(path.makeRelativeTo(container .getLocation())); return resource != null ? (IFile) resource : null; } } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } return null; } }