ASSIGNED - bug 420195: Proposal support in Java editor
https://bugs.eclipse.org/bugs/show_bug.cgi?id=420195
Code Content Assist.
diff --git a/org.eclipse.scout.sdk.ui/plugin.xml b/org.eclipse.scout.sdk.ui/plugin.xml
index 6e167be..10d286e 100644
--- a/org.eclipse.scout.sdk.ui/plugin.xml
+++ b/org.eclipse.scout.sdk.ui/plugin.xml
@@ -687,6 +687,27 @@
</proposalCategory>
</extension>
<extension
+ id="org.eclipse.scout.sdk.ui.formfield"
+ name="Scout form field proposals"
+ point="org.eclipse.jdt.ui.javaCompletionProposalComputer">
+ <javaCompletionProposalComputer
+ activate="true"
+ categoryId="org.eclipse.scout.sdk.ui.proposalCategory"
+ class="org.eclipse.scout.sdk.ui.internal.extensions.codecompletion.ScoutSdkProposalComputer">
+ <partition
+ type="__dftl_partition_content_type">
+ </partition>
+ </javaCompletionProposalComputer>
+ </extension>
+ <extension
+ id="org.eclipse.scout.sdk.ui.proposalCategory"
+ name="Scout Items"
+ point="org.eclipse.jdt.ui.javaCompletionProposalComputer">
+ <proposalCategory
+ icon="resources/icons/eclipse_scout.gif">
+ </proposalCategory>
+ </extension>
+ <extension
id="product"
point="org.eclipse.core.runtime.products">
<product
diff --git a/org.eclipse.scout.sdk.ui/src/org/eclipse/scout/sdk/ui/internal/extensions/codecompletion/AbstractSdkProposal.java b/org.eclipse.scout.sdk.ui/src/org/eclipse/scout/sdk/ui/internal/extensions/codecompletion/AbstractSdkProposal.java
new file mode 100644
index 0000000..32ad937
--- /dev/null
+++ b/org.eclipse.scout.sdk.ui/src/org/eclipse/scout/sdk/ui/internal/extensions/codecompletion/AbstractSdkProposal.java
@@ -0,0 +1,174 @@
+/*******************************************************************************
+ * Copyright (c) 2013 BSI Business Systems Integration AG.
+ * 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:
+ * BSI Business Systems Integration AG - initial API and implementation
+ ******************************************************************************/
+package org.eclipse.scout.sdk.ui.internal.extensions.codecompletion;
+
+import org.eclipse.jdt.core.IJavaElement;
+import org.eclipse.jdt.core.ISourceRange;
+import org.eclipse.jdt.core.IType;
+import org.eclipse.jdt.core.JavaModelException;
+import org.eclipse.jdt.ui.text.java.IJavaCompletionProposal;
+import org.eclipse.jface.text.BadLocationException;
+import org.eclipse.jface.text.IDocument;
+import org.eclipse.jface.text.IInformationControlCreator;
+import org.eclipse.jface.text.IRegion;
+import org.eclipse.jface.text.ITextViewer;
+import org.eclipse.jface.text.contentassist.ICompletionProposalExtension;
+import org.eclipse.jface.text.contentassist.ICompletionProposalExtension2;
+import org.eclipse.jface.text.contentassist.ICompletionProposalExtension3;
+import org.eclipse.jface.text.contentassist.ICompletionProposalExtension4;
+import org.eclipse.jface.text.contentassist.IContextInformation;
+import org.eclipse.scout.sdk.util.type.ITypeFilter;
+import org.eclipse.scout.sdk.util.type.TypeComparators;
+import org.eclipse.scout.sdk.util.type.TypeUtility;
+import org.eclipse.swt.graphics.Point;
+
+/**
+ * <h3>{@link AbstractSdkProposal}</h3>
+ *
+ * @author aho
+ * @since 3.10.0 25.10.2013
+ */
+public abstract class AbstractSdkProposal implements IJavaCompletionProposal, ICompletionProposalExtension, ICompletionProposalExtension2, ICompletionProposalExtension3, ICompletionProposalExtension4 {
+
+ @Override
+ public int getRelevance() {
+ return 0;
+ }
+
+ @Override
+ public void apply(IDocument document) {
+ }
+
+ @Override
+ public void apply(IDocument document, char trigger, int offset) {
+ }
+
+ @Override
+ public String getAdditionalProposalInfo() {
+ return null;
+ }
+
+ @Override
+ public IContextInformation getContextInformation() {
+ return null;
+ }
+
+ @Override
+ public int getContextInformationPosition() {
+ return 0;
+ }
+
+ @Override
+ public IInformationControlCreator getInformationControlCreator() {
+ return null;
+ }
+
+ @Override
+ public int getPrefixCompletionStart(IDocument document, int completionOffset) {
+ return 0;
+ }
+
+ @Override
+ public CharSequence getPrefixCompletionText(IDocument document, int completionOffset) {
+ return null;
+ }
+
+ @Override
+ public Point getSelection(IDocument document) {
+ return null;
+ }
+
+ @Override
+ public boolean isValidFor(IDocument document, int offset) {
+ return false;
+ }
+
+ @Override
+ public char[] getTriggerCharacters() {
+ return null;
+ }
+
+ @Override
+ public boolean isAutoInsertable() {
+ return false;
+ }
+
+ @Override
+ public void unselected(ITextViewer viewer) {
+ }
+
+ protected Point findTriggerWordRange(IDocument document, int offset) throws BadLocationException {
+ IRegion lineRange = document.getLineInformationOfOffset(offset);
+ // find start
+ int startOffest = -1;
+ int index = offset - 1;
+
+ while (index > 0 && index > lineRange.getOffset() && isValidChar(document.getChar(index))) {
+ index--;
+ }
+ startOffest = index;
+
+ // find end
+ int endOffset = -1;
+ index = offset;
+ while ((document.getLength() > index && index < (lineRange.getOffset() + lineRange.getLength())) && isValidChar(document.getChar(index))) {
+ index++;
+ }
+ endOffset = index;
+ if (startOffest > -1 && endOffset > -1 && startOffest <= endOffset) {
+ return new Point(startOffest, endOffset);
+ }
+ return null;
+ }
+
+ /**
+ * @param declaringType
+ * @param offset
+ * @param subtypeFilter
+ * @return
+ * @throws JavaModelException
+ */
+ protected IJavaElement findSibling(IType declaringType, int offset, ITypeFilter subtypeFilter) throws JavaModelException {
+ IType[] innerTypes = TypeUtility.getInnerTypes(declaringType, subtypeFilter, TypeComparators.getSourceRangeComparator());
+ IType sibling = null;
+ for (IType t : innerTypes) {
+ ISourceRange sourceRange = t.getSourceRange();
+ if (sourceRange.getOffset() > offset) {
+ sibling = t;
+ break;
+ }
+ }
+
+ return sibling;
+ }
+
+ private boolean isValidChar(char c) {
+ // 0-9
+ if (c >= 48 && c <= 57) {
+ return true;
+ }
+ // A-Z
+ if (c >= 65 && c <= 90) {
+ return true;
+ }
+ // a-z
+ if (c >= 97 && c <= 122) {
+ return true;
+ }
+ // special characters
+ switch (c) {
+ case '-':
+ case '_':
+ return true;
+ }
+ return false;
+ }
+}
diff --git a/org.eclipse.scout.sdk.ui/src/org/eclipse/scout/sdk/ui/internal/extensions/codecompletion/CodeNewProposal.java b/org.eclipse.scout.sdk.ui/src/org/eclipse/scout/sdk/ui/internal/extensions/codecompletion/CodeNewProposal.java
new file mode 100644
index 0000000..607193f
--- /dev/null
+++ b/org.eclipse.scout.sdk.ui/src/org/eclipse/scout/sdk/ui/internal/extensions/codecompletion/CodeNewProposal.java
@@ -0,0 +1,110 @@
+/*******************************************************************************
+ * Copyright (c) 2013 BSI Business Systems Integration AG.
+ * 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:
+ * BSI Business Systems Integration AG - initial API and implementation
+ ******************************************************************************/
+package org.eclipse.scout.sdk.ui.internal.extensions.codecompletion;
+
+import org.eclipse.jdt.core.IJavaElement;
+import org.eclipse.jdt.core.IType;
+import org.eclipse.jdt.core.JavaModelException;
+import org.eclipse.jface.text.BadLocationException;
+import org.eclipse.jface.text.DocumentEvent;
+import org.eclipse.jface.text.IDocument;
+import org.eclipse.jface.text.ITextViewer;
+import org.eclipse.scout.sdk.Texts;
+import org.eclipse.scout.sdk.extensions.runtime.classes.IRuntimeClasses;
+import org.eclipse.scout.sdk.ui.fields.proposal.SiblingProposal;
+import org.eclipse.scout.sdk.ui.internal.ScoutSdkUi;
+import org.eclipse.scout.sdk.ui.internal.SdkIcons;
+import org.eclipse.scout.sdk.ui.operation.sourceedit.SourceEditOperation;
+import org.eclipse.scout.sdk.ui.wizard.IWorkspaceWizard;
+import org.eclipse.scout.sdk.ui.wizard.ScoutWizardDialog;
+import org.eclipse.scout.sdk.ui.wizard.code.CodeNewWizard;
+import org.eclipse.scout.sdk.util.type.TypeFilters;
+import org.eclipse.scout.sdk.util.type.TypeUtility;
+import org.eclipse.swt.graphics.Image;
+import org.eclipse.swt.graphics.Point;
+import org.eclipse.text.edits.ReplaceEdit;
+
+/**
+ * <h3>{@link CodeNewProposal}</h3>
+ *
+ * @author aho
+ * @since 3.10.0 25.10.2013
+ */
+public class CodeNewProposal extends AbstractSdkProposal {
+
+ private IType m_declaringType;
+
+ CodeNewProposal(IType declaringType) {
+ m_declaringType = declaringType;
+ }
+
+ public IType getDeclaringType() {
+ return m_declaringType;
+ }
+
+ @Override
+ public String getDisplayString() {
+ return Texts.get("Action_newTypeX", "Code");
+ }
+
+ @Override
+ public Image getImage() {
+ return ScoutSdkUi.getImage(SdkIcons.CodeAdd);
+ }
+
+ @Override
+ public void apply(ITextViewer viewer, char trigger, int stateMask, int offset) {
+ CodeNewWizard wizard = new CodeNewWizard();
+
+ String codeName = null;
+ try {
+ IDocument document = viewer.getDocument();
+ Point wordRange = findTriggerWordRange(document, offset);
+ if (wordRange != null) {
+ codeName = document.get(wordRange.x, wordRange.y - wordRange.x);
+ // remove proposal text
+ SourceEditOperation removeProposalTextOp = new SourceEditOperation(new ReplaceEdit(wordRange.x, wordRange.y - wordRange.x, ""), viewer.getDocument(), ScoutSdkUi.getDisplay());
+ wizard.addAdditionalPerformFinishOperation(removeProposalTextOp, IWorkspaceWizard.ORDER_BEFORE_WIZARD);
+ }
+ }
+ catch (BadLocationException e) {
+ ScoutSdkUi.logWarning(e);
+ }
+
+ wizard.initWizard(getDeclaringType());
+ if (codeName != null) {
+ wizard.getCodeNewWizardPage().setTypeName(codeName.trim());
+ }
+ // sibling check
+ try {
+ IJavaElement sibling = findSibling(getDeclaringType(), offset, TypeFilters.getSubtypeFilter(TypeUtility.getType(IRuntimeClasses.ICode), TypeUtility.getLocalTypeHierarchy(getDeclaringType())));
+ if (sibling != null) {
+ wizard.getCodeNewWizardPage().setSibling(new SiblingProposal(sibling));
+ }
+ }
+ catch (JavaModelException e) {
+ ScoutSdkUi.logWarning("could not find sibling.", e);
+ }
+
+ ScoutWizardDialog wizardDialog = new ScoutWizardDialog(wizard);
+ wizardDialog.open();
+ }
+
+ @Override
+ public void selected(ITextViewer viewer, boolean smartToggle) {
+ }
+
+ @Override
+ public boolean validate(IDocument document, int offset, DocumentEvent event) {
+ return true;
+ }
+
+}
diff --git a/org.eclipse.scout.sdk.ui/src/org/eclipse/scout/sdk/ui/internal/extensions/codecompletion/ScoutSdkProposalComputer.java b/org.eclipse.scout.sdk.ui/src/org/eclipse/scout/sdk/ui/internal/extensions/codecompletion/ScoutSdkProposalComputer.java
new file mode 100644
index 0000000..256252e
--- /dev/null
+++ b/org.eclipse.scout.sdk.ui/src/org/eclipse/scout/sdk/ui/internal/extensions/codecompletion/ScoutSdkProposalComputer.java
@@ -0,0 +1,85 @@
+/*******************************************************************************
+ * Copyright (c) 2013 BSI Business Systems Integration AG.
+ * 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:
+ * BSI Business Systems Integration AG - initial API and implementation
+ ******************************************************************************/
+package org.eclipse.scout.sdk.ui.internal.extensions.codecompletion;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.core.runtime.Platform;
+import org.eclipse.jdt.core.ICompilationUnit;
+import org.eclipse.jdt.core.IJavaElement;
+import org.eclipse.jdt.core.IType;
+import org.eclipse.jdt.ui.text.java.ContentAssistInvocationContext;
+import org.eclipse.jdt.ui.text.java.IJavaCompletionProposalComputer;
+import org.eclipse.jdt.ui.text.java.JavaContentAssistInvocationContext;
+import org.eclipse.jface.text.contentassist.ICompletionProposal;
+import org.eclipse.jface.text.contentassist.IContextInformation;
+import org.eclipse.scout.sdk.extensions.runtime.classes.IRuntimeClasses;
+import org.eclipse.scout.sdk.ui.internal.ScoutSdkUi;
+import org.eclipse.scout.sdk.util.jdt.JdtUtility;
+import org.eclipse.scout.sdk.util.type.TypeUtility;
+import org.osgi.framework.Bundle;
+
+/**
+ * <h3>{@link ScoutSdkProposalComputer}</h3>
+ *
+ * @author Andreas Hoegger
+ * @since 3.10.0 25.10.2013
+ */
+public class ScoutSdkProposalComputer implements IJavaCompletionProposalComputer {
+
+ @Override
+ public void sessionStarted() {
+ }
+
+ @Override
+ public List<ICompletionProposal> computeCompletionProposals(ContentAssistInvocationContext context, IProgressMonitor monitor) {
+ List<ICompletionProposal> proposals = new ArrayList<ICompletionProposal>();
+ if (!(context instanceof JavaContentAssistInvocationContext)
+ || Platform.getBundle(ScoutSdkUi.PLUGIN_ID).getState() != Bundle.ACTIVE) {
+ return proposals;
+ }
+ try {
+ JavaContentAssistInvocationContext javaContext = (JavaContentAssistInvocationContext) context;
+ ICompilationUnit icu = javaContext.getCompilationUnit();
+ IJavaElement element = JdtUtility.findJavaElement(icu, context.getInvocationOffset(), 0);
+ if (element.getElementType() == IJavaElement.TYPE) {
+ IType declaringType = (IType) element;
+ if (TypeUtility.isSubtype(TypeUtility.getType(IRuntimeClasses.ICodeType), declaringType, declaringType.newSupertypeHierarchy(monitor)) ||
+ TypeUtility.isSubtype(TypeUtility.getType(IRuntimeClasses.ICode), declaringType, declaringType.newSupertypeHierarchy(monitor))) {
+ proposals.add(new CodeNewProposal(declaringType));
+ }
+ }
+ }
+ catch (CoreException e) {
+ e.printStackTrace();
+ }
+
+ return proposals;
+ }
+
+ @Override
+ public List<IContextInformation> computeContextInformation(ContentAssistInvocationContext context, IProgressMonitor monitor) {
+ return null;
+ }
+
+ @Override
+ public void sessionEnded() {
+ }
+
+ @Override
+ public String getErrorMessage() {
+ return null;
+ }
+
+}
diff --git a/org.eclipse.scout.sdk.ui/src/org/eclipse/scout/sdk/ui/operation/sourceedit/SourceEditOperation.java b/org.eclipse.scout.sdk.ui/src/org/eclipse/scout/sdk/ui/operation/sourceedit/SourceEditOperation.java
new file mode 100644
index 0000000..76441e1
--- /dev/null
+++ b/org.eclipse.scout.sdk.ui/src/org/eclipse/scout/sdk/ui/operation/sourceedit/SourceEditOperation.java
@@ -0,0 +1,95 @@
+/*******************************************************************************
+ * Copyright (c) 2013 BSI Business Systems Integration AG.
+ * 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:
+ * BSI Business Systems Integration AG - initial API and implementation
+ ******************************************************************************/
+package org.eclipse.scout.sdk.ui.operation.sourceedit;
+
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.Status;
+import org.eclipse.jface.text.BadLocationException;
+import org.eclipse.jface.text.IDocument;
+import org.eclipse.scout.commons.holders.Holder;
+import org.eclipse.scout.sdk.operation.IOperation;
+import org.eclipse.scout.sdk.ui.internal.ScoutSdkUi;
+import org.eclipse.scout.sdk.util.typecache.IWorkingCopyManager;
+import org.eclipse.swt.widgets.Display;
+import org.eclipse.text.edits.MalformedTreeException;
+import org.eclipse.text.edits.TextEdit;
+
+/**
+ * <h3>{@link SourceEditOperation}</h3>
+ *
+ * @author Andreas Hoegger
+ * @since 3.10.0 28.10.2013
+ */
+public class SourceEditOperation implements IOperation {
+
+ private TextEdit m_edit;
+ private IDocument m_document;
+ private Display m_display;
+
+ public SourceEditOperation(TextEdit edit, IDocument document, Display display) {
+ m_edit = edit;
+ m_document = document;
+ m_display = display;
+
+ }
+
+ @Override
+ public String getOperationName() {
+ return "Replace source...";
+ }
+
+ @Override
+ public void validate() throws IllegalArgumentException {
+ if (getEdit() == null) {
+ throw new IllegalArgumentException("Edit can not be null.");
+ }
+ if (getDocument() == null) {
+ throw new IllegalArgumentException("Document can not be null.");
+ }
+ }
+
+ @Override
+ public void run(IProgressMonitor monitor, IWorkingCopyManager workingCopyManager) throws CoreException, IllegalArgumentException {
+ final Holder<CoreException> exceptionHolder = new Holder<CoreException>(CoreException.class);
+ getDisplay().syncExec(new Runnable() {
+ @Override
+ public void run() {
+ try {
+ getEdit().apply(getDocument());
+ }
+ catch (MalformedTreeException e) {
+ exceptionHolder.setValue(new CoreException(new Status(IStatus.ERROR, ScoutSdkUi.PLUGIN_ID, "Edit could not be applied", e)));
+ }
+ catch (BadLocationException e) {
+ exceptionHolder.setValue(new CoreException(new Status(IStatus.ERROR, ScoutSdkUi.PLUGIN_ID, "Edit could not be applied", e)));
+ }
+ }
+ });
+ if (exceptionHolder.getValue() != null) {
+ throw exceptionHolder.getValue();
+ }
+ }
+
+ public TextEdit getEdit() {
+ return m_edit;
+ }
+
+ public IDocument getDocument() {
+ return m_document;
+ }
+
+ public Display getDisplay() {
+ return m_display;
+ }
+
+}
diff --git a/org.eclipse.scout.sdk.ui/src/org/eclipse/scout/sdk/ui/wizard/AbstractWorkspaceWizard.java b/org.eclipse.scout.sdk.ui/src/org/eclipse/scout/sdk/ui/wizard/AbstractWorkspaceWizard.java
index 3b69b83..e912cbf 100644
--- a/org.eclipse.scout.sdk.ui/src/org/eclipse/scout/sdk/ui/wizard/AbstractWorkspaceWizard.java
+++ b/org.eclipse.scout.sdk.ui/src/org/eclipse/scout/sdk/ui/wizard/AbstractWorkspaceWizard.java
@@ -10,9 +10,15 @@
******************************************************************************/
package org.eclipse.scout.sdk.ui.wizard;
+import java.util.Map;
+import java.util.Map.Entry;
+import java.util.TreeMap;
+
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.jface.wizard.IWizardPage;
+import org.eclipse.scout.commons.CompareUtility;
+import org.eclipse.scout.commons.CompositeObject;
import org.eclipse.scout.sdk.jobs.OperationJob;
import org.eclipse.scout.sdk.operation.IOperation;
import org.eclipse.scout.sdk.ui.internal.ScoutSdkUi;
@@ -22,9 +28,32 @@
/**
* <h3>AbstractProcessWizard</h3> ...
*/
-public class AbstractWorkspaceWizard extends AbstractWizard {
+public class AbstractWorkspaceWizard extends AbstractWizard implements IWorkspaceWizard {
+
+ public Map<CompositeObject, IOperation> m_performFinishOperations;
public AbstractWorkspaceWizard() {
+ m_performFinishOperations = new TreeMap<CompositeObject, IOperation>();
+ }
+
+ @Override
+ public IOperation addAdditionalPerformFinishOperation(IOperation op, double orderNr) {
+ return m_performFinishOperations.put(new CompositeObject(orderNr, op), op);
+ }
+
+ @Override
+ public IOperation removeAdditionalPerformFinishOperation(IOperation op) {
+ CompositeObject key = null;
+ for (Entry<CompositeObject, IOperation> e : m_performFinishOperations.entrySet()) {
+ if (CompareUtility.equals(e.getValue(), op)) {
+ key = e.getKey();
+ break;
+ }
+ }
+ if (key != null) {
+ return m_performFinishOperations.remove(key);
+ }
+ return null;
}
@Override
@@ -45,7 +74,9 @@
return false;
}
P_PerformFinishOperation performFinishOperation = new P_PerformFinishOperation(getShell().getDisplay());
- OperationJob job = new OperationJob(performFinishOperation);
+ m_performFinishOperations.put(new CompositeObject(IWorkspaceWizard.ORDER_DEFAULT, performFinishOperation), performFinishOperation);
+
+ OperationJob job = new OperationJob(m_performFinishOperations.values());
job.schedule();
return true;
}
diff --git a/org.eclipse.scout.sdk.ui/src/org/eclipse/scout/sdk/ui/wizard/IWorkspaceWizard.java b/org.eclipse.scout.sdk.ui/src/org/eclipse/scout/sdk/ui/wizard/IWorkspaceWizard.java
new file mode 100644
index 0000000..8d2a83e
--- /dev/null
+++ b/org.eclipse.scout.sdk.ui/src/org/eclipse/scout/sdk/ui/wizard/IWorkspaceWizard.java
@@ -0,0 +1,31 @@
+/*******************************************************************************
+ * Copyright (c) 2013 BSI Business Systems Integration AG.
+ * 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:
+ * BSI Business Systems Integration AG - initial API and implementation
+ ******************************************************************************/
+package org.eclipse.scout.sdk.ui.wizard;
+
+import org.eclipse.scout.sdk.operation.IOperation;
+
+/**
+ * <h3>{@link IWorkspaceWizard}</h3>
+ *
+ * @author aho
+ * @since 3.10.0 28.10.2013
+ */
+public interface IWorkspaceWizard {
+
+ public static final double ORDER_DEFAULT = 0;
+ public static final double ORDER_BEFORE_WIZARD = -10;
+ public static final double ORDER_AFTER_WIZARD = 10;
+
+ IOperation addAdditionalPerformFinishOperation(IOperation op, double orderNr);
+
+ IOperation removeAdditionalPerformFinishOperation(IOperation op);
+
+}
diff --git a/org.eclipse.scout.sdk.ui/src/org/eclipse/scout/sdk/ui/wizard/code/CodeNewWizard.java b/org.eclipse.scout.sdk.ui/src/org/eclipse/scout/sdk/ui/wizard/code/CodeNewWizard.java
index f132f2f..e2b1b09 100644
--- a/org.eclipse.scout.sdk.ui/src/org/eclipse/scout/sdk/ui/wizard/code/CodeNewWizard.java
+++ b/org.eclipse.scout.sdk.ui/src/org/eclipse/scout/sdk/ui/wizard/code/CodeNewWizard.java
@@ -36,6 +36,10 @@
m_page1.setSuperType(superType);
}
+ public CodeNewWizardPage getCodeNewWizardPage() {
+ return m_page1;
+ }
+
@Override
protected void postFinishDisplayThread() {
IType createdField = m_page1.getCreatedCode();
diff --git a/org.eclipse.scout.sdk.ui/src/org/eclipse/scout/sdk/ui/wizard/code/CodeNewWizardPage.java b/org.eclipse.scout.sdk.ui/src/org/eclipse/scout/sdk/ui/wizard/code/CodeNewWizardPage.java
index e1c0102..27b1a9b 100644
--- a/org.eclipse.scout.sdk.ui/src/org/eclipse/scout/sdk/ui/wizard/code/CodeNewWizardPage.java
+++ b/org.eclipse.scout.sdk.ui/src/org/eclipse/scout/sdk/ui/wizard/code/CodeNewWizardPage.java
@@ -129,7 +129,6 @@
m_typeNameField = getFieldToolkit().createStyledTextField(parent, Texts.get("TypeName"), labelColWidthPercent);
m_typeNameField.setReadOnlySuffix(SdkProperties.SUFFIX_CODE);
- m_typeNameField.setText(m_typeName);
m_typeNameField.addModifyListener(new ModifyListener() {
@Override
public void modifyText(ModifyEvent e) {
@@ -137,6 +136,7 @@
pingStateChanging();
}
});
+ m_typeNameField.setText(m_typeName);
m_superTypeField = getFieldToolkit().createJavaElementProposalField(parent, Texts.get("SuperType"),
new AbstractJavaElementContentProvider() {
@@ -341,10 +341,10 @@
public void setTypeName(String typeName) {
try {
setStateChanging(true);
- m_typeName = typeName;
if (isControlCreated()) {
m_typeNameField.setText(typeName);
}
+ m_typeName = typeName;
}
finally {
setStateChanging(false);
diff --git a/org.eclipse.scout.sdk.util/src/org/eclipse/scout/sdk/util/internal/typecache/WorkingCopyManager.java b/org.eclipse.scout.sdk.util/src/org/eclipse/scout/sdk/util/internal/typecache/WorkingCopyManager.java
index c818dd2..a81bea8 100644
--- a/org.eclipse.scout.sdk.util/src/org/eclipse/scout/sdk/util/internal/typecache/WorkingCopyManager.java
+++ b/org.eclipse.scout.sdk.util/src/org/eclipse/scout/sdk/util/internal/typecache/WorkingCopyManager.java
@@ -43,6 +43,7 @@
@Override
public boolean register(ICompilationUnit icu, IProgressMonitor monitor) throws JavaModelException {
+ SdkUtilActivator.logInfo(getClass().getSimpleName() + ": register workingcopy for " + icu.getElementName());
if (icu.isReadOnly()) {
throw new IllegalArgumentException("try to get a working copy of the read only icu '" + icu.getElementName() + "'.");
}
@@ -58,6 +59,7 @@
@Override
public void unregisterAll(IProgressMonitor monitor) {
+ SdkUtilActivator.logInfo(getClass().getSimpleName() + ": unregister all workingcopies");
synchronized (LOCK) {
for (Iterator<ICompilationUnit> it = m_workingCopies.iterator(); it.hasNext();) {
releaseCompilationUnit(it.next(), monitor);
@@ -68,6 +70,7 @@
@Override
public void unregister(ICompilationUnit icu, IProgressMonitor monitor) {
+ SdkUtilActivator.logInfo(getClass().getSimpleName() + ": unregister workingcopy for: '" + icu.getElementName() + "'");
synchronized (LOCK) {
if (m_workingCopies.remove(icu)) {
releaseCompilationUnit(icu, monitor);
@@ -75,7 +78,12 @@
}
}
+ public void discardAll(IProgressMonitor monitor) {
+
+ }
+
private void releaseCompilationUnit(ICompilationUnit icu, IProgressMonitor monitor) {
+
try {
if (!monitor.isCanceled()) {
icu.commitWorkingCopy(true, monitor);
@@ -107,6 +115,7 @@
@Override
public void reconcile(ICompilationUnit icu, IProgressMonitor monitor) throws CoreException {
+ SdkUtilActivator.logInfo(getClass().getSimpleName() + ": reconcile compilation unit '" + icu.getElementName() + "'");
synchronized (LOCK) {
if (!m_workingCopies.contains(icu)) {
throw new CoreException(new ScoutStatus("compilation unit " + icu.getElementName() + " has not been registered"));
diff --git a/org.eclipse.scout.sdk.util/src/org/eclipse/scout/sdk/util/type/TypeComparators.java b/org.eclipse.scout.sdk.util/src/org/eclipse/scout/sdk/util/type/TypeComparators.java
index fd6ef55..24e0597 100644
--- a/org.eclipse.scout.sdk.util/src/org/eclipse/scout/sdk/util/type/TypeComparators.java
+++ b/org.eclipse.scout.sdk.util/src/org/eclipse/scout/sdk/util/type/TypeComparators.java
@@ -12,7 +12,9 @@
import java.util.Comparator;
+import org.eclipse.jdt.core.ISourceRange;
import org.eclipse.jdt.core.IType;
+import org.eclipse.jdt.core.JavaModelException;
import org.eclipse.scout.commons.CompositeObject;
/**
@@ -47,6 +49,33 @@
}
};
+ protected final static Comparator<IType> SOURCE_RANGE_COMPARATOR = new Comparator<IType>() {
+
+ @Override
+ public int compare(IType t1, IType t2) {
+ if (t1 == null && t2 == null) {
+ return 0;
+ }
+ else if (t1 == null) {
+ return -1;
+ }
+ else if (t2 == null) {
+ return 1;
+ }
+ else {
+ try {
+ ISourceRange t1Range = t1.getSourceRange();
+ ISourceRange t2Range = t2.getSourceRange();
+ return t1Range.getOffset() - t2Range.getOffset();
+ }
+ catch (JavaModelException e) {
+ throw new IllegalArgumentException(e);
+ }
+
+ }
+ }
+ };
+
public static Comparator<IType> getTypeNameComparator() {
return NAME_COMPARATOR;
}
@@ -54,4 +83,8 @@
public static Comparator<IType> getHashCodeComparator() {
return HASH_CODE_COMPARATOR;
}
+
+ public static Comparator<IType> getSourceRangeComparator() {
+ return SOURCE_RANGE_COMPARATOR;
+ }
}
diff --git a/org.eclipse.scout.sdk/src/org/eclipse/scout/sdk/jobs/AbstractWorkspaceBlockingJob.java b/org.eclipse.scout.sdk/src/org/eclipse/scout/sdk/jobs/AbstractWorkspaceBlockingJob.java
index 398199d..66da84d 100644
--- a/org.eclipse.scout.sdk/src/org/eclipse/scout/sdk/jobs/AbstractWorkspaceBlockingJob.java
+++ b/org.eclipse.scout.sdk/src/org/eclipse/scout/sdk/jobs/AbstractWorkspaceBlockingJob.java
@@ -69,6 +69,7 @@
}
Status errorStatus = new Status(Status.ERROR, ScoutSdk.PLUGIN_ID, e.getMessage(), e);
ScoutSdk.log(errorStatus);
+ monitor.setCanceled(true);
return errorStatus;
}
}