Index: ui/org/eclipse/jdt/internal/ui/javaeditor/CompilationUnitEditor.java =================================================================== RCS file: /home/eclipse/org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/javaeditor/CompilationUnitEditor.java,v retrieving revision 1.277 diff -u -r1.277 CompilationUnitEditor.java --- ui/org/eclipse/jdt/internal/ui/javaeditor/CompilationUnitEditor.java 2 May 2005 21:35:40 -0000 1.277 +++ ui/org/eclipse/jdt/internal/ui/javaeditor/CompilationUnitEditor.java 28 May 2005 10:21:43 -0000 @@ -1146,7 +1146,7 @@ * The remembered selection. * @since 3.0 */ - private RememberedSelection fRememberedSelection= new RememberedSelection(); + private RememberedSelection fRememberedSelection; /** The bracket inserter. */ private BracketInserter fBracketInserter= new BracketInserter(); @@ -1875,6 +1875,8 @@ * @see AbstractTextEditor#rememberSelection() */ protected void rememberSelection() { + if (fRememberedSelection == null) + fRememberedSelection= new RememberedSelection(); fRememberedSelection.remember(); } @@ -1882,7 +1884,10 @@ * @see AbstractTextEditor#restoreSelection() */ protected void restoreSelection() { - fRememberedSelection.restore(); + if (fRememberedSelection != null) + fRememberedSelection.restore(); + else + super.restoreSelection(); } /* Index: ui/org/eclipse/jdt/internal/ui/javaeditor/EditorUtility.java =================================================================== RCS file: /home/eclipse/org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/javaeditor/EditorUtility.java,v retrieving revision 1.61 diff -u -r1.61 EditorUtility.java --- ui/org/eclipse/jdt/internal/ui/javaeditor/EditorUtility.java 19 Apr 2005 12:47:30 -0000 1.61 +++ ui/org/eclipse/jdt/internal/ui/javaeditor/EditorUtility.java 28 May 2005 10:21:44 -0000 @@ -14,8 +14,6 @@ import java.lang.reflect.InvocationTargetException; -import org.eclipse.swt.SWT; - import org.eclipse.core.runtime.CoreException; import org.eclipse.core.runtime.IProgressMonitor; @@ -25,12 +23,15 @@ import org.eclipse.core.resources.IResource; import org.eclipse.core.resources.IStorage; +import org.eclipse.swt.SWT; + import org.eclipse.jface.action.Action; import org.eclipse.jface.action.IAction; import org.eclipse.jface.viewers.ISelectionProvider; import org.eclipse.jface.text.Assert; import org.eclipse.jface.text.IRegion; +import org.eclipse.jface.text.ITextSelection; import org.eclipse.jface.text.TextSelection; import org.eclipse.ui.IEditorDescriptor; @@ -41,19 +42,22 @@ import org.eclipse.ui.IWorkbenchPage; import org.eclipse.ui.PartInitException; import org.eclipse.ui.actions.WorkspaceModifyOperation; -import org.eclipse.ui.ide.IDE; -import org.eclipse.ui.ide.IGotoMarker; import org.eclipse.ui.part.FileEditorInput; import org.eclipse.ui.texteditor.ITextEditor; import org.eclipse.ui.texteditor.ITextEditorActionDefinitionIds; import org.eclipse.ui.texteditor.TextEditorAction; +import org.eclipse.ui.ide.IDE; +import org.eclipse.ui.ide.IGotoMarker; + import org.eclipse.jdt.core.IClassFile; import org.eclipse.jdt.core.ICompilationUnit; +import org.eclipse.jdt.core.IImportDeclaration; import org.eclipse.jdt.core.IJavaElement; import org.eclipse.jdt.core.IJavaProject; import org.eclipse.jdt.core.ILocalVariable; import org.eclipse.jdt.core.IMember; +import org.eclipse.jdt.core.IPackageDeclaration; import org.eclipse.jdt.core.ISourceRange; import org.eclipse.jdt.core.ISourceReference; import org.eclipse.jdt.core.ITypeParameter; @@ -63,6 +67,8 @@ import org.eclipse.jdt.internal.corext.util.JavaModelUtil; import org.eclipse.jdt.internal.corext.util.Messages; +import org.eclipse.jdt.ui.PreferenceConstants; + import org.eclipse.jdt.internal.ui.JavaPlugin; /** @@ -128,11 +134,6 @@ return openInEditor((IFile) inputElement, activate); IEditorInput input= getEditorInput(inputElement); - if (input instanceof IFileEditorInput) { - IFileEditorInput fileInput= (IFileEditorInput) input; - return openInEditor(fileInput.getFile(), activate); - } - if (input != null) return openInEditor(input, getEditorID(input, inputElement), activate); @@ -268,7 +269,12 @@ private static void initializeHighlightRange(IEditorPart editorPart) { if (editorPart instanceof ITextEditor) { IAction toggleAction= editorPart.getEditorSite().getActionBars().getGlobalActionHandler(ITextEditorActionDefinitionIds.TOGGLE_SHOW_SELECTED_ELEMENT_ONLY); - if (toggleAction != null && toggleAction.isEnabled() && toggleAction.isChecked()) { + boolean enable= toggleAction != null; + if (enable && editorPart instanceof JavaEditor) + enable= JavaPlugin.getDefault().getPreferenceStore().getBoolean(PreferenceConstants.EDITOR_SHOW_SEGMENTS); + else + enable= enable && toggleAction.isEnabled() && toggleAction.isChecked(); + if (enable) { if (toggleAction instanceof TextEditorAction) { // Reset the action ((TextEditorAction)toggleAction).setEditor(null); @@ -301,17 +307,30 @@ return null; } - private static IEditorInput getEditorInput(IJavaElement element) throws JavaModelException { + private static IEditorInput getEditorInput(IJavaElement je) throws JavaModelException { + final ITextSelection textSelection= getTextSelection(je); + IJavaElement element= je; while (element != null) { if (element instanceof ICompilationUnit) { ICompilationUnit unit= JavaModelUtil.toOriginal((ICompilationUnit) element); IResource resource= unit.getResource(); - if (resource instanceof IFile) - return new FileEditorInput((IFile) resource); + if (resource instanceof IFile) { + return new FileEditorInput((IFile) resource) { + public Object getAdapter(Class adapter) { + if (adapter == ITextSelection.class) + return textSelection; + return super.getAdapter(adapter); + } + }; + } } - if (element instanceof IClassFile) - return new InternalClassFileEditorInput((IClassFile) element); + if (element instanceof IClassFile) { + if (textSelection != null) + return new InternalClassFileEditorInput((IClassFile) element, textSelection); + else + return new InternalClassFileEditorInput((IClassFile) element); + } element= element.getParent(); } @@ -319,6 +338,96 @@ return null; } + /** + * Returns the text selection for the given Java element. + * + * @param je the Java element + * @return the text selection or null + */ + public static ITextSelection getTextSelection(IJavaElement je) { + if (je instanceof ISourceReference) + return getTextSelection((ISourceReference)je); + return null; + } + + /** + * Returns the text selection for the given source reference. + * + * @param reference the source reference + * @return the text selection or null + */ + public static ITextSelection getTextSelection(ISourceReference reference) { + if (reference == null) + return null; + + try { + ISourceRange range= null; + if (reference instanceof ILocalVariable) { + IJavaElement je2= ((ILocalVariable)reference).getParent(); + if (je2 instanceof ISourceReference) + range= ((ISourceReference)je2).getSourceRange(); + } else + range= reference.getSourceRange(); + + if (range == null) + return null; + + int offset= range.getOffset(); + int length= range.getLength(); + + if (offset < 0 || length < 0) + return null; + + offset= -1; + length= -1; + + if (reference instanceof IMember) { + range= ((IMember) reference).getNameRange(); + if (range != null) { + offset= range.getOffset(); + length= range.getLength(); + } + } else if (reference instanceof ITypeParameter) { + range= ((ITypeParameter) reference).getNameRange(); + if (range != null) { + offset= range.getOffset(); + length= range.getLength(); + } + } else if (reference instanceof ILocalVariable) { + range= ((ILocalVariable)reference).getNameRange(); + if (range != null) { + offset= range.getOffset(); + length= range.getLength(); + } + } else if (reference instanceof IImportDeclaration) { + String name= ((IImportDeclaration) reference).getElementName(); + if (name != null && name.length() > 0) { + String content= reference.getSource(); + if (content != null) { + offset= range.getOffset() + content.indexOf(name); + length= name.length(); + } + } + } else if (reference instanceof IPackageDeclaration) { + String name= ((IPackageDeclaration) reference).getElementName(); + if (name != null && name.length() > 0) { + String content= reference.getSource(); + if (content != null) { + offset= range.getOffset() + content.indexOf(name); + length= name.length(); + } + } + } + if (offset >= 0 && length >= 0) + return new TextSelection(offset, length); + + } catch (JavaModelException x) { + } catch (IllegalArgumentException x) { + } + + return null; + } + public static IEditorInput getEditorInput(Object input) throws JavaModelException { if (input instanceof IJavaElement) return getEditorInput((IJavaElement) input); Index: ui/org/eclipse/jdt/internal/ui/javaeditor/InternalClassFileEditorInput.java =================================================================== RCS file: /home/eclipse/org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/javaeditor/InternalClassFileEditorInput.java,v retrieving revision 1.9 diff -u -r1.9 InternalClassFileEditorInput.java --- ui/org/eclipse/jdt/internal/ui/javaeditor/InternalClassFileEditorInput.java 19 Apr 2005 12:47:30 -0000 1.9 +++ ui/org/eclipse/jdt/internal/ui/javaeditor/InternalClassFileEditorInput.java 28 May 2005 10:21:44 -0000 @@ -12,8 +12,12 @@ package org.eclipse.jdt.internal.ui.javaeditor; +import org.eclipse.core.runtime.IAdaptable; + import org.eclipse.jface.resource.ImageDescriptor; +import org.eclipse.jface.text.ITextSelection; + import org.eclipse.ui.IMemento; import org.eclipse.ui.IPersistableElement; @@ -26,13 +30,19 @@ /** * Class file considered as editor input. */ -public class InternalClassFileEditorInput implements IClassFileEditorInput, IPersistableElement { +public class InternalClassFileEditorInput implements IClassFileEditorInput, IPersistableElement, IAdaptable { private IClassFile fClassFile; + private ITextSelection fInitialSelection; public InternalClassFileEditorInput(IClassFile classFile) { fClassFile= classFile; } + + public InternalClassFileEditorInput(IClassFile classFile, ITextSelection initialSelection) { + fClassFile= classFile; + fInitialSelection= initialSelection; + } /* * @see Object#equals(Object) @@ -112,6 +122,10 @@ public Object getAdapter(Class adapter) { if (adapter == IClassFile.class) return fClassFile; + + if (adapter == ITextSelection.class) + return fInitialSelection; + return fClassFile.getAdapter(adapter); } @@ -128,6 +142,7 @@ public String getFactoryId() { return ClassFileEditorInputFactory.ID; } + } Index: ui/org/eclipse/jdt/internal/ui/javaeditor/JavaEditor.java =================================================================== RCS file: /home/eclipse/org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/javaeditor/JavaEditor.java,v retrieving revision 1.361 diff -u -r1.361 JavaEditor.java --- ui/org/eclipse/jdt/internal/ui/javaeditor/JavaEditor.java 26 May 2005 15:13:55 -0000 1.361 +++ ui/org/eclipse/jdt/internal/ui/javaeditor/JavaEditor.java 28 May 2005 10:21:49 -0000 @@ -166,11 +166,8 @@ import org.eclipse.jdt.core.IJavaElement; import org.eclipse.jdt.core.IJavaProject; import org.eclipse.jdt.core.ILocalVariable; -import org.eclipse.jdt.core.IMember; -import org.eclipse.jdt.core.IPackageDeclaration; import org.eclipse.jdt.core.ISourceRange; import org.eclipse.jdt.core.ISourceReference; -import org.eclipse.jdt.core.ITypeParameter; import org.eclipse.jdt.core.JavaCore; import org.eclipse.jdt.core.JavaModelException; import org.eclipse.jdt.core.dom.ASTNode; @@ -1927,13 +1924,16 @@ if (getSelectionProvider() == null) return; + ITextSelection newSelection= EditorUtility.getTextSelection(reference); ISelection selection= getSelectionProvider().getSelection(); if (selection instanceof TextSelection) { - TextSelection textSelection= (TextSelection) selection; + TextSelection currentSelection= (TextSelection) selection; + if (newSelection != null && newSelection.getOffset() == currentSelection.getOffset() && newSelection.getLength() == currentSelection.getLength()) + return; // PR 39995: [navigation] Forward history cleared after going back in navigation history: // mark only in navigation history if the cursor is being moved (which it isn't if // this is called from a PostSelectionEvent that should only update the magnet) - if (moveCursor && (textSelection.getOffset() != 0 || textSelection.getLength() != 0)) + if (moveCursor && (currentSelection.getOffset() != 0 || currentSelection.getLength() != 0)) markInNavigationHistory(); } @@ -1971,53 +1971,12 @@ if (!moveCursor) return; - offset= -1; - length= -1; - - if (reference instanceof IMember) { - range= ((IMember) reference).getNameRange(); - if (range != null) { - offset= range.getOffset(); - length= range.getLength(); - } - } else if (reference instanceof ITypeParameter) { - range= ((ITypeParameter) reference).getNameRange(); - if (range != null) { - offset= range.getOffset(); - length= range.getLength(); - } - } else if (reference instanceof ILocalVariable) { - range= ((ILocalVariable)reference).getNameRange(); - if (range != null) { - offset= range.getOffset(); - length= range.getLength(); - } - } else if (reference instanceof IImportDeclaration) { - String name= ((IImportDeclaration) reference).getElementName(); - if (name != null && name.length() > 0) { - String content= reference.getSource(); - if (content != null) { - offset= range.getOffset() + content.indexOf(name); - length= name.length(); - } - } - } else if (reference instanceof IPackageDeclaration) { - String name= ((IPackageDeclaration) reference).getElementName(); - if (name != null && name.length() > 0) { - String content= reference.getSource(); - if (content != null) { - offset= range.getOffset() + content.indexOf(name); - length= name.length(); - } - } - } - - if (offset > -1 && length > 0) { + if (newSelection != null && newSelection.getOffset() > -1 && newSelection.getLength() > 0) { try { textWidget.setRedraw(false); - sourceViewer.revealRange(offset, length); - sourceViewer.setSelectedRange(offset, length); + sourceViewer.revealRange(newSelection.getOffset(), newSelection.getLength()); + sourceViewer.setSelectedRange(newSelection.getOffset(), newSelection.getLength()); } finally { textWidget.setRedraw(true); } @@ -2045,7 +2004,14 @@ */ return; } - + + if (getSelectionProvider().getSelection() instanceof ITextSelection) { + ITextSelection currentSelection= (ITextSelection)getSelectionProvider().getSelection(); + ITextSelection newSelection= EditorUtility.getTextSelection(element); + if (newSelection != null && newSelection.getOffset() == currentSelection.getOffset() && newSelection.getLength() == currentSelection.getLength()) + return; + } + IJavaElement corresponding= getCorrespondingElement(element); if (corresponding instanceof ISourceReference) { ISourceReference reference= (ISourceReference) corresponding;