diff options
author | Lucas Bullen | 2017-07-31 17:19:42 +0000 |
---|---|---|
committer | Lucas Bullen | 2017-08-21 14:47:42 +0000 |
commit | 32c56e10e86ba1147e64db6af1b4cd1e3b578fc5 (patch) | |
tree | c7f38f18e3fffc007ca9edaced8ec8456432d0ae | |
parent | 65b67ddf98b557a1bbe172ca1af5f6625e1d79a5 (diff) | |
download | eclipse.pde.ui-32c56e10e86ba1147e64db6af1b4cd1e3b578fc5.tar.gz eclipse.pde.ui-32c56e10e86ba1147e64db6af1b4cd1e3b578fc5.tar.xz eclipse.pde.ui-32c56e10e86ba1147e64db6af1b4cd1e3b578fc5.zip |
Bug 520216 - Add generic target definition editor as a tabI20170823-2000I20170822-2000
Change-Id: Ic7a9865db6bb88ad27d973b5948351a07661d05d
Signed-off-by: Lucas Bullen <lbullen@redhat.com>
5 files changed, 106 insertions, 23 deletions
diff --git a/ui/org.eclipse.pde.ui/META-INF/MANIFEST.MF b/ui/org.eclipse.pde.ui/META-INF/MANIFEST.MF index 37d9115abc..7c24474c6a 100644 --- a/ui/org.eclipse.pde.ui/META-INF/MANIFEST.MF +++ b/ui/org.eclipse.pde.ui/META-INF/MANIFEST.MF @@ -125,6 +125,7 @@ Require-Bundle: Eclipse-LazyStart: true Import-Package: com.ibm.icu.text, org.eclipse.jdt.debug.core, - org.eclipse.jdt.debug.ui.console + org.eclipse.jdt.debug.ui.console, + org.eclipse.ui.internal.genericeditor Bundle-RequiredExecutionEnvironment: JavaSE-1.8 Bundle-ActivationPolicy: lazy diff --git a/ui/org.eclipse.pde.ui/src/org/eclipse/pde/internal/ui/PDEUIMessages.java b/ui/org.eclipse.pde.ui/src/org/eclipse/pde/internal/ui/PDEUIMessages.java index ad1779b0f8..fcef6e6661 100644 --- a/ui/org.eclipse.pde.ui/src/org/eclipse/pde/internal/ui/PDEUIMessages.java +++ b/ui/org.eclipse.pde.ui/src/org/eclipse/pde/internal/ui/PDEUIMessages.java @@ -2675,6 +2675,8 @@ public class PDEUIMessages extends NLS { public static String ManifestContentMergeViewer_title; + public static String GenericEditorTab_title; + public static String EnvironmentPage_title; public static String JRESection_description; diff --git a/ui/org.eclipse.pde.ui/src/org/eclipse/pde/internal/ui/editor/targetdefinition/JRESection.java b/ui/org.eclipse.pde.ui/src/org/eclipse/pde/internal/ui/editor/targetdefinition/JRESection.java index 06fa04abd1..81a59b98e9 100644 --- a/ui/org.eclipse.pde.ui/src/org/eclipse/pde/internal/ui/editor/targetdefinition/JRESection.java +++ b/ui/org.eclipse.pde.ui/src/org/eclipse/pde/internal/ui/editor/targetdefinition/JRESection.java @@ -10,8 +10,6 @@ *******************************************************************************/ package org.eclipse.pde.internal.ui.editor.targetdefinition;
-import org.eclipse.pde.core.target.ITargetDefinition;
-
import static org.eclipse.swt.events.SelectionListener.widgetSelectedAdapter;
import java.util.TreeSet;
@@ -19,6 +17,7 @@ import org.eclipse.core.runtime.IPath; import org.eclipse.jdt.launching.JavaRuntime;
import org.eclipse.jdt.launching.environments.IExecutionEnvironment;
import org.eclipse.jdt.launching.environments.IExecutionEnvironmentsManager;
+import org.eclipse.pde.core.target.ITargetDefinition;
import org.eclipse.pde.internal.core.util.VMUtil;
import org.eclipse.pde.internal.ui.PDEUIMessages;
import org.eclipse.pde.internal.ui.SWTFactory;
diff --git a/ui/org.eclipse.pde.ui/src/org/eclipse/pde/internal/ui/editor/targetdefinition/TargetEditor.java b/ui/org.eclipse.pde.ui/src/org/eclipse/pde/internal/ui/editor/targetdefinition/TargetEditor.java index e3ede0bd5f..5001efda59 100644 --- a/ui/org.eclipse.pde.ui/src/org/eclipse/pde/internal/ui/editor/targetdefinition/TargetEditor.java +++ b/ui/org.eclipse.pde.ui/src/org/eclipse/pde/internal/ui/editor/targetdefinition/TargetEditor.java @@ -7,12 +7,16 @@ * * Contributors: * IBM Corporation - initial API and implementation + * Lucas Bullen (Red Hat Inc.) - Bug 520216 - Add generic editor as a tab *******************************************************************************/ package org.eclipse.pde.internal.ui.editor.targetdefinition; -import java.io.File; +import java.io.*; +import java.nio.charset.StandardCharsets; import java.util.ArrayList; import java.util.List; +import javax.xml.parsers.ParserConfigurationException; +import javax.xml.transform.TransformerException; import org.eclipse.core.resources.*; import org.eclipse.core.runtime.*; import org.eclipse.core.runtime.jobs.Job; @@ -21,10 +25,12 @@ import org.eclipse.jface.action.Action; import org.eclipse.jface.action.ControlContribution; import org.eclipse.jface.dialogs.ErrorDialog; import org.eclipse.jface.dialogs.IMessageProvider; +import org.eclipse.jface.text.*; import org.eclipse.jface.wizard.WizardDialog; import org.eclipse.osgi.util.NLS; import org.eclipse.pde.core.target.*; import org.eclipse.pde.internal.core.*; +import org.eclipse.pde.internal.core.target.TargetDefinitionPersistenceHelper; import org.eclipse.pde.internal.core.target.WorkspaceFileTargetHandle; import org.eclipse.pde.internal.ui.*; import org.eclipse.pde.internal.ui.shared.target.*; @@ -39,8 +45,10 @@ import org.eclipse.ui.forms.editor.FormEditor; import org.eclipse.ui.forms.events.HyperlinkEvent; import org.eclipse.ui.forms.events.IHyperlinkListener; import org.eclipse.ui.forms.widgets.*; +import org.eclipse.ui.internal.genericeditor.ExtensionBasedTextEditor; import org.eclipse.ui.part.FileEditorInput; import org.eclipse.ui.progress.UIJob; +import org.xml.sax.SAXException; /** * Editor for target definition (*.target) files. Interacts with the ITargetDefinition model @@ -53,6 +61,10 @@ import org.eclipse.ui.progress.UIJob; public class TargetEditor extends FormEditor { private List<IManagedForm> fManagedFormPages = new ArrayList<>(2); + private ExtensionBasedTextEditor fTextualEditor; + private IDocument fTargetDocument; + private IDocumentListener fTargetDocumentListener; + private InputHandler fInputHandler = new InputHandler(); private TargetChangedListener fTargetChangedListener; private boolean fDirty; @@ -69,20 +81,23 @@ public class TargetEditor extends FormEditor { addPage(new DefinitionPage(this)); addPage(new ContentPage(this)); addPage(new EnvironmentPage(this)); - } catch (PartInitException e) { + addTextualEditorPage(); + } catch (CoreException e) { PDEPlugin.log(e); } } @Override public void doSave(IProgressMonitor monitor) { - commitPages(true); - try { - fInputHandler.saveTargetDefinition(); - } catch (CoreException e) { - PDEPlugin.log(e); - showError(PDEUIMessages.TargetEditor_3, e); + fInputHandler.setSaving(true); + if (!isActiveTabTextualEditor()) { + markStale(); + updateTextualEditor(); } + fTextualEditor.doSave(monitor); + fDirty = false; + editorDirtyStateChanged(); + fInputHandler.setSaving(false); } @Override @@ -131,6 +146,9 @@ public class TargetEditor extends FormEditor { protected void setDirty(boolean dirty) { fDirty = fDirty || dirty; editorDirtyStateChanged(); + if (fDirty && isActiveTabTextualEditor()) { + updateTextualEditor(); + } } @Override @@ -138,6 +156,18 @@ public class TargetEditor extends FormEditor { return fDirty || super.isDirty(); } + public void markStale() { + for (IManagedForm form : fManagedFormPages) { + IFormPart[] parts = form.getParts(); + for (IFormPart part : parts) { + if (part instanceof AbstractFormPart) { + ((AbstractFormPart) part).markStale(); + } + } + } + editorDirtyStateChanged(); + } + /* * @see org.eclipse.ui.forms.editor.FormEditor#init(org.eclipse.ui.IEditorSite, org.eclipse.ui.IEditorInput) * @since 3.7 @@ -350,6 +380,10 @@ public class TargetEditor extends FormEditor { setInput(fInput); } + public void setSaving(boolean saving) { + this.fSaving = saving; + } + public void setInput(IEditorInput input) { fInput = input; fTargetFileInWorkspace = null; @@ -373,6 +407,15 @@ public class TargetEditor extends FormEditor { } /** + * Resets the target definition to be newly generated by the target + * platform + */ + public void formatTarget() throws CoreException { + ITargetPlatformService service = getTargetPlatformService(); + fTarget = service.newTarget(); + } + + /** * @return the target definition that is the input to the editor */ public ITargetDefinition getTarget() { @@ -410,18 +453,6 @@ public class TargetEditor extends FormEditor { return fTarget; } - public void saveTargetDefinition() throws CoreException { - ITargetPlatformService service = getTargetPlatformService(); - fSaving = true; - try { - service.saveTargetDefinition(fTarget); - TargetEditor.this.fDirty = false; - TargetEditor.this.editorDirtyStateChanged(); - } finally { - fSaving = false; - } - } - private ITargetPlatformService getTargetPlatformService() throws CoreException { ITargetPlatformService service = (ITargetPlatformService) PDECore.getDefault().acquireService(ITargetPlatformService.class.getName()); if (service == null) { @@ -452,6 +483,55 @@ public class TargetEditor extends FormEditor { } /** + * initializes fTargetDocument and fTargetDocumentListener + * + * @throws PartInitException + */ + private void addTextualEditorPage() throws PartInitException { + fTextualEditor = new ExtensionBasedTextEditor(); + int tabIndex = addPage(fTextualEditor, getEditorInput()); + setPageText(tabIndex, PDEUIMessages.GenericEditorTab_title); + + fTargetDocument = fTextualEditor.getDocumentProvider().getDocument(getEditorInput()); + + fTargetDocumentListener = new IDocumentListener() { + @Override + public void documentChanged(DocumentEvent event) { + try { + fInputHandler.formatTarget(); + TargetDefinitionPersistenceHelper.initFromXML(getTarget(), + new ByteArrayInputStream(event.getDocument().get().getBytes(StandardCharsets.UTF_8))); + markStale(); + } catch (CoreException | ParserConfigurationException | SAXException | IOException e) { + PDEPlugin.log(e); + } + } + + @Override + public void documentAboutToBeChanged(DocumentEvent event) { + // documentChanged used instead + } + }; + fTargetDocument.addDocumentListener(fTargetDocumentListener); + } + + private void updateTextualEditor() { + fTargetDocument.removeDocumentListener(fTargetDocumentListener); + ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream(); + try { + TargetDefinitionPersistenceHelper.persistXML(getTarget(), byteArrayOutputStream); + fTargetDocument.set(new String(byteArrayOutputStream.toByteArray())); + } catch (CoreException | ParserConfigurationException | TransformerException | IOException | SAXException e) { + PDEPlugin.log(e); + } + fTargetDocument.addDocumentListener(fTargetDocumentListener); + } + + private boolean isActiveTabTextualEditor() { + return getActivePage() == getPageCount() - 1; + } + + /** * When changes are noticed in the target, this listener will resolve the * target and update the necessary pages in the editor. */ diff --git a/ui/org.eclipse.pde.ui/src/org/eclipse/pde/internal/ui/pderesources.properties b/ui/org.eclipse.pde.ui/src/org/eclipse/pde/internal/ui/pderesources.properties index 833fa9f6d0..0b363a7a56 100644 --- a/ui/org.eclipse.pde.ui/src/org/eclipse/pde/internal/ui/pderesources.properties +++ b/ui/org.eclipse.pde.ui/src/org/eclipse/pde/internal/ui/pderesources.properties @@ -1929,6 +1929,7 @@ EnvironmentSection_description=Specify the target environment. If left blank, t EnvironmentSection_operationSystem=Operating System: EnvironmentSection_windowingSystem=Windowing System: EnvironmentSection_architecture=Architecture: +GenericEditorTab_title=Source ################Product Editor##################### Product_overview_configuration = <form><p>The <a href="navigate.configuration">product configuration</a> is based on:</p></form> |