### Eclipse Workspace Patch 1.0 #P org.eclipse.jdt.ui Index: ui/org/eclipse/jdt/internal/ui/IJavaThemeConstants.java =================================================================== RCS file: /cvsroot/eclipse/org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/IJavaThemeConstants.java,v retrieving revision 1.6 diff -u -r1.6 IJavaThemeConstants.java --- ui/org/eclipse/jdt/internal/ui/IJavaThemeConstants.java 11 Sep 2008 11:59:33 -0000 1.6 +++ ui/org/eclipse/jdt/internal/ui/IJavaThemeConstants.java 10 Nov 2010 18:45:05 -0000 @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (c) 2007, 2008 IBM Corporation and others. + * Copyright (c) 2007, 2010 IBM Corporation and others. * 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 @@ -29,6 +29,11 @@ public final String EDITOR_MATCHING_BRACKETS_COLOR= ID_PREFIX + PreferenceConstants.EDITOR_MATCHING_BRACKETS_COLOR; /** + * Theme constant for the color used to render method boundary lines. + */ + public final String METHOD_BOUNDARY_LINES_COLOR= ID_PREFIX + PreferenceConstants.METHOD_BOUNDARY_LINES_COLOR; + + /** * Theme constant for the color used to render multi-line comments. */ public final String EDITOR_MULTI_LINE_COMMENT_COLOR= ID_PREFIX + PreferenceConstants.EDITOR_MULTI_LINE_COMMENT_COLOR; Index: ui/org/eclipse/jdt/internal/ui/JavaUIPreferenceInitializer.java =================================================================== RCS file: /cvsroot/eclipse/org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/JavaUIPreferenceInitializer.java,v retrieving revision 1.5 diff -u -r1.5 JavaUIPreferenceInitializer.java --- ui/org/eclipse/jdt/internal/ui/JavaUIPreferenceInitializer.java 11 Sep 2008 11:59:34 -0000 1.5 +++ ui/org/eclipse/jdt/internal/ui/JavaUIPreferenceInitializer.java 10 Nov 2010 18:45:05 -0000 @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (c) 2000, 2008 IBM Corporation and others. + * Copyright (c) 2000, 2010 IBM Corporation and others. * 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 @@ -125,6 +125,10 @@ findRGB(registry, IJavaThemeConstants.CODEASSIST_REPLACEMENT_BACKGROUND, new RGB(255, 255, 0)), fireEvent); setDefault( store, + PreferenceConstants.METHOD_BOUNDARY_LINES_COLOR, + findRGB(registry, IJavaThemeConstants.METHOD_BOUNDARY_LINES_COLOR, new RGB(192, 192, 192)), fireEvent); + setDefault( + store, PreferenceConstants.CODEASSIST_REPLACEMENT_FOREGROUND, findRGB(registry, IJavaThemeConstants.CODEASSIST_REPLACEMENT_FOREGROUND, new RGB(255, 0, 0)), fireEvent); Index: ui/org/eclipse/jdt/internal/ui/javaeditor/JavaEditor.java =================================================================== RCS file: /cvsroot/eclipse/org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/javaeditor/JavaEditor.java,v retrieving revision 1.485 diff -u -r1.485 JavaEditor.java --- ui/org/eclipse/jdt/internal/ui/javaeditor/JavaEditor.java 5 Nov 2010 11:12:57 -0000 1.485 +++ ui/org/eclipse/jdt/internal/ui/javaeditor/JavaEditor.java 10 Nov 2010 18:45:09 -0000 @@ -30,6 +30,9 @@ import org.eclipse.swt.SWT; import org.eclipse.swt.custom.ST; import org.eclipse.swt.custom.StyledText; +import org.eclipse.swt.events.PaintEvent; +import org.eclipse.swt.events.PaintListener; +import org.eclipse.swt.graphics.Color; import org.eclipse.swt.graphics.Image; import org.eclipse.swt.graphics.Point; import org.eclipse.swt.layout.FillLayout; @@ -63,6 +66,7 @@ import org.eclipse.jface.action.IMenuManager; import org.eclipse.jface.action.MenuManager; import org.eclipse.jface.preference.IPreferenceStore; +import org.eclipse.jface.preference.PreferenceConverter; import org.eclipse.jface.util.IPropertyChangeListener; import org.eclipse.jface.util.PropertyChangeEvent; import org.eclipse.jface.viewers.DoubleClickEvent; @@ -82,6 +86,8 @@ import org.eclipse.jface.text.IDocumentListener; import org.eclipse.jface.text.IInformationControl; import org.eclipse.jface.text.IInformationControlCreator; +import org.eclipse.jface.text.IPaintPositionManager; +import org.eclipse.jface.text.IPainter; import org.eclipse.jface.text.IRegion; import org.eclipse.jface.text.ISelectionValidator; import org.eclipse.jface.text.ISynchronizable; @@ -114,6 +120,7 @@ import org.eclipse.jface.text.source.IVerticalRulerColumn; import org.eclipse.jface.text.source.LineChangeHover; import org.eclipse.jface.text.source.SourceViewerConfiguration; +import org.eclipse.jface.text.source.projection.ProjectionAnnotation; import org.eclipse.jface.text.source.projection.ProjectionSupport; import org.eclipse.jface.text.source.projection.ProjectionViewer; @@ -1507,6 +1514,206 @@ } + /** + * Draws lines that demarcate the boundary of a method in the editor. + * + * @since 3.7 + */ + private class MethodBoundaryLinesProvider { + + /** + * Paints the method boundary lines. + */ + private class MethodBoundaryLinesPainter implements IPainter, PaintListener { + + /** + * Tracks if the painter has been deactivated or not. + */ + private boolean fIsActive= false; + + /** + * The text widget associated with the source viewer. + */ + private StyledText fTextWidget; + + /** + * Constructs a new MethodSeparatorPainter. + */ + public MethodBoundaryLinesPainter() { + fTextWidget= fViewer.getTextWidget(); + } + + /* + * @see org.eclipse.swt.events.PaintListener#paintControl(org.eclipse.swt.events.PaintEvent) + * Paints the method boundary lines by locating the method elements in the damaged area. + */ + public void paintControl(PaintEvent event) { + if (fTextWidget != null) { + boolean drawBoundaryForCollapsedMethods= true; + event.gc.setForeground(fMethodBoundaryLinesColor); + int eventRegionTopLine= fTextWidget.getLineIndex(event.y); + //Accounting for partial line at the top + if (eventRegionTopLine > 0) + eventRegionTopLine--; + int eventRegionLastLine= fTextWidget.getLineIndex(event.y + event.height); + //Accounting for partial line at the bottom + if (eventRegionLastLine < fTextWidget.getLineCount() - 1) + eventRegionLastLine++; + + int currentLine= eventRegionTopLine; + while (currentLine <= eventRegionLastLine) { + int currentLineLength= fTextWidget.getLine(currentLine).length(); + if (currentLineLength > 0) + currentLineLength--; + int currentLineOffset= fTextWidget.getOffsetAtLine(currentLine) + currentLineLength; + IJavaElement element= getElementAt(fViewer.widgetOffset2ModelOffset(currentLineOffset), true); + try { + if (element != null && element.getElementType() == IJavaElement.METHOD) { + ISourceRange elementModelRegion= ((ISourceReference)element).getSourceRange(); + IRegion elementWidgetRegion= fViewer.modelRange2WidgetRange(new Region(elementModelRegion.getOffset(), elementModelRegion.getLength())); + int elementWidgetRegionOffset= elementWidgetRegion.getOffset(); + int elementWidgetRegionLength= elementWidgetRegion.getLength(); + + if (drawBoundaryForCollapsedMethods || !isElementCollapsed(elementModelRegion)) { + int boundaryLineWidth= fTextWidget.getClientArea().width; + int elementTopLine= fTextWidget.getLineAtOffset(elementWidgetRegionOffset); + int visibleRegionTopLine= fTextWidget.getLineIndex(0); + if (elementTopLine >= visibleRegionTopLine) { + int eventRegionOffset= fTextWidget.getOffsetAtLine(eventRegionTopLine); + if (elementWidgetRegionOffset >= eventRegionOffset) { + int elementTopY= fTextWidget.getLocationAtOffset(elementWidgetRegionOffset).y; + event.gc.drawLine(2, elementTopY, boundaryLineWidth, elementTopY); + } + } + int visibleRegionLastLine= fTextWidget.getLineIndex((fTextWidget.getClientArea().height - 1)); + int elementBottomOffset= elementWidgetRegionOffset + elementWidgetRegionLength - 1; + int elementLastLine= fTextWidget.getLineAtOffset(elementBottomOffset); + if (elementLastLine <= visibleRegionLastLine) { + if (elementLastLine <= eventRegionLastLine) { + int elementBottomY= fTextWidget.getLocationAtOffset(elementBottomOffset).y + fTextWidget.getLineHeight(elementBottomOffset); + event.gc.drawLine(2, elementBottomY, boundaryLineWidth, elementBottomY); + } + } + } + currentLine= fTextWidget.getLineAtOffset(elementWidgetRegionOffset + elementWidgetRegionLength) + 1; + } else { + currentLine++; + } + } catch (JavaModelException exception) { + JavaPlugin.log(exception); + } + } + } + } + + /** + * Checks with the projection annotation model if a element is collapsed. + * + * @param elementModelRange the source range for the element + * @return true if the element is in collapsed state + */ + private boolean isElementCollapsed(ISourceRange elementModelRange) { + Iterator annotationIterator= (fViewer.getProjectionAnnotationModel().getAnnotationIterator(elementModelRange.getOffset(), elementModelRange.getLength(), true, true)); + while (annotationIterator.hasNext()) { + ProjectionAnnotation annotation= (ProjectionAnnotation)(annotationIterator.next()); + if (annotation != null && !annotation.isCollapsed()) + return false; + } + return true; + } + + /* + * @see IPainter#dispose() + */ + public void dispose() { + fTextWidget= null; + } + + /* + * @see IPainter#paint(int) + */ + public void paint(int reason) { + if (!fIsActive) { + fIsActive= true; + fTextWidget.addPaintListener(this); + fTextWidget.redraw(); + } else if (CONFIGURATION == reason || INTERNAL == reason) + fTextWidget.redraw(); + } + + /* + * @see IPainter#deactivate(boolean) + */ + public void deactivate(boolean redraw) { + if (fIsActive) { + fIsActive= false; + fTextWidget.removePaintListener(this); + if (redraw) + fTextWidget.redraw(); + } + } + + /* + * @see IPainter#setPositionManager(IPaintPositionManager) + */ + public void setPositionManager(IPaintPositionManager manager) { + } + } + + /** + * The source viewer associated with the editor. + */ + private JavaSourceViewer fViewer; + + /** + * The the method boundary lines color. + */ + private Color fMethodBoundaryLinesColor; + + /** + * The method boundary painter that paints the boundary lines. + */ + private MethodBoundaryLinesPainter fPainter; + + /** + * Constructs the MethodBoundaryLinesProvider. + * + * @param viewer the source viewer associated with the editor. + * @param methodBoundaryColor the color to be used for drawing the method boundary lines. + */ + public MethodBoundaryLinesProvider(JavaSourceViewer viewer, Color methodBoundaryColor) { + fViewer= viewer; + fMethodBoundaryLinesColor= methodBoundaryColor; + if (fPainter == null) { + fPainter= new MethodBoundaryLinesPainter(); + fViewer.addPainter(fPainter); + } + } + + /** + * Disposes the method boundary lines provider and associated painter. + */ + public void dispose() { + if (fPainter != null) { + fViewer.removePainter(fPainter); + fPainter.deactivate(false); + fPainter.dispose(); + fPainter= null; + } + fMethodBoundaryLinesColor= null; + } + + /** + * Sets the color for the method boundary lines. + * + * @param methodBoundaryColor the color to be used for drawing the method boundary lines. + */ + public void setColor(Color methodBoundaryColor) { + fMethodBoundaryLinesColor= methodBoundaryColor; + fPainter.paint(IPainter.CONFIGURATION); + } + } + /** Preference key for matching brackets */ protected final static String MATCHING_BRACKETS= PreferenceConstants.EDITOR_MATCHING_BRACKETS; @@ -1743,6 +1950,13 @@ private long fErrorMessageTime; /** + * The method boundary lines capability provider. + * + * @since 3.7 + */ + private MethodBoundaryLinesProvider fMethodBoundaryLinesProvider; + + /** * Timeout for the error message. * * @since 3.5 @@ -1885,6 +2099,11 @@ fProjectionModelUpdater.install(this, (ProjectionViewer)sourceViewer); } + if (JavaPlugin.getDefault().getPreferenceStore().getBoolean(PreferenceConstants.SHOW_METHOD_BOUNDARY_LINES)) { + Color methodBoundaryColor= getSharedColors().getColor(PreferenceConverter.getColor(getPreferenceStore(), PreferenceConstants.METHOD_BOUNDARY_LINES_COLOR)); + fMethodBoundaryLinesProvider= new MethodBoundaryLinesProvider((JavaSourceViewer)sourceViewer, methodBoundaryColor); + } + // ensure source viewer decoration support has been created and configured getSourceViewerDecorationSupport(sourceViewer); @@ -2586,6 +2805,11 @@ fProjectionSupport= null; } + if (fMethodBoundaryLinesProvider != null) { + fMethodBoundaryLinesProvider.dispose(); + fMethodBoundaryLinesProvider= null; + } + // cancel possible running computation fMarkOccurrenceAnnotations= false; uninstallOccurrencesFinder(); @@ -2944,6 +3168,27 @@ return; } + if (PreferenceConstants.METHOD_BOUNDARY_LINES_COLOR.equals(property)) { + if (fMethodBoundaryLinesProvider != null) { + Color methodBoundaryColor= getSharedColors().getColor(PreferenceConverter.getColor(getPreferenceStore(), PreferenceConstants.METHOD_BOUNDARY_LINES_COLOR)); + fMethodBoundaryLinesProvider.setColor(methodBoundaryColor); + } + } + + if (PreferenceConstants.SHOW_METHOD_BOUNDARY_LINES.equals(property)) { + if (!JavaPlugin.getDefault().getPreferenceStore().getBoolean(PreferenceConstants.SHOW_METHOD_BOUNDARY_LINES)) { + if (fMethodBoundaryLinesProvider != null) { + fMethodBoundaryLinesProvider.dispose(); + fMethodBoundaryLinesProvider= null; + } + } else { + if (fMethodBoundaryLinesProvider == null) { + Color methodBoundaryColor= getSharedColors().getColor(PreferenceConverter.getColor(getPreferenceStore(), PreferenceConstants.METHOD_BOUNDARY_LINES_COLOR)); + fMethodBoundaryLinesProvider= new MethodBoundaryLinesProvider((JavaSourceViewer)sourceViewer, methodBoundaryColor); + } + } + } + } finally { super.handlePreferenceStoreChanged(event); } Index: ui/org/eclipse/jdt/internal/ui/preferences/JavaEditorAppearanceConfigurationBlock.java =================================================================== RCS file: /cvsroot/eclipse/org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/preferences/JavaEditorAppearanceConfigurationBlock.java,v retrieving revision 1.29 diff -u -r1.29 JavaEditorAppearanceConfigurationBlock.java --- ui/org/eclipse/jdt/internal/ui/preferences/JavaEditorAppearanceConfigurationBlock.java 7 Oct 2010 09:57:54 -0000 1.29 +++ ui/org/eclipse/jdt/internal/ui/preferences/JavaEditorAppearanceConfigurationBlock.java 10 Nov 2010 18:45:09 -0000 @@ -59,6 +59,7 @@ {PreferencesMessages.JavaEditorPreferencePage_backgroundForCompletionReplacement, PreferenceConstants.CODEASSIST_REPLACEMENT_BACKGROUND, null }, {PreferencesMessages.JavaEditorPreferencePage_foregroundForCompletionReplacement, PreferenceConstants.CODEASSIST_REPLACEMENT_FOREGROUND, null }, {PreferencesMessages.JavaEditorPreferencePage_sourceHoverBackgroundColor, PreferenceConstants.EDITOR_SOURCE_HOVER_BACKGROUND_COLOR, PreferenceConstants.EDITOR_SOURCE_HOVER_BACKGROUND_COLOR_SYSTEM_DEFAULT}, + { PreferencesMessages.JavaEditorPreferencePage_methodBoundaryLinesColor, PreferenceConstants.METHOD_BOUNDARY_LINES_COLOR, null }, }; @@ -84,6 +85,8 @@ overlayKeys.add(new OverlayPreferenceStore.OverlayKey(OverlayPreferenceStore.BOOLEAN, PreferenceConstants.EDITOR_SUB_WORD_NAVIGATION)); overlayKeys.add(new OverlayPreferenceStore.OverlayKey(OverlayPreferenceStore.BOOLEAN, PreferenceConstants.EDITOR_EVALUTE_TEMPORARY_PROBLEMS)); overlayKeys.add(new OverlayPreferenceStore.OverlayKey(OverlayPreferenceStore.BOOLEAN, PreferenceConstants.EDITOR_SHOW_SEGMENTS)); + overlayKeys.add(new OverlayPreferenceStore.OverlayKey(OverlayPreferenceStore.BOOLEAN, PreferenceConstants.SHOW_METHOD_BOUNDARY_LINES)); + overlayKeys.add(new OverlayPreferenceStore.OverlayKey(OverlayPreferenceStore.STRING, PreferenceConstants.METHOD_BOUNDARY_LINES_COLOR)); overlayKeys.add(new OverlayPreferenceStore.OverlayKey(OverlayPreferenceStore.STRING, PreferenceConstants.CODEASSIST_PARAMETERS_BACKGROUND)); overlayKeys.add(new OverlayPreferenceStore.OverlayKey(OverlayPreferenceStore.STRING, PreferenceConstants.CODEASSIST_PARAMETERS_FOREGROUND)); overlayKeys.add(new OverlayPreferenceStore.OverlayKey(OverlayPreferenceStore.STRING, PreferenceConstants.CODEASSIST_REPLACEMENT_BACKGROUND)); @@ -234,6 +237,9 @@ label= PreferencesMessages.JavaEditorPreferencePage_showJavaElementOnly; addCheckBox(appearanceComposite, label, PreferenceConstants.EDITOR_SHOW_SEGMENTS, 0); + label= PreferencesMessages.JavaEditorPreferencePage_ShowMethodBoundaryLines; + addCheckBox(appearanceComposite, label, PreferenceConstants.SHOW_METHOD_BOUNDARY_LINES, 0); + Label l= new Label(appearanceComposite, SWT.LEFT ); gd= new GridData(GridData.HORIZONTAL_ALIGN_FILL); gd.horizontalSpan= 2; Index: ui/org/eclipse/jdt/internal/ui/preferences/PreferencesMessages.java =================================================================== RCS file: /cvsroot/eclipse/org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/preferences/PreferencesMessages.java,v retrieving revision 1.137 diff -u -r1.137 PreferencesMessages.java --- ui/org/eclipse/jdt/internal/ui/preferences/PreferencesMessages.java 5 Nov 2010 05:49:58 -0000 1.137 +++ ui/org/eclipse/jdt/internal/ui/preferences/PreferencesMessages.java 10 Nov 2010 18:45:10 -0000 @@ -151,6 +151,8 @@ public static String JavaEditorPreferencePage_enable; public static String JavaEditorPreferencePage_preview; public static String JavaEditorPreferencePage_highlightMatchingBrackets; + + public static String JavaEditorPreferencePage_ShowMethodBoundaryLines; public static String JavaEditorPreferencePage_insertSingleProposalsAutomatically; public static String JavaEditorPreferencePage_showOnlyProposalsVisibleInTheInvocationContext; public static String JavaEditorPreferencePage_presentProposalsInAlphabeticalOrder; @@ -178,6 +180,8 @@ public static String JavaEditorPreferencePage_empty_input; public static String JavaEditorPreferencePage_invalid_input; public static String JavaEditorPreferencePage_matchingBracketsHighlightColor2; + + public static String JavaEditorPreferencePage_methodBoundaryLinesColor; public static String JavaEditorPreferencePage_appearanceOptions; public static String JavaEditorPreferencePage_typing_tabTitle; public static String JavaEditorPreferencePage_closeStrings; Index: ui/org/eclipse/jdt/internal/ui/preferences/PreferencesMessages.properties =================================================================== RCS file: /cvsroot/eclipse/org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/preferences/PreferencesMessages.properties,v retrieving revision 1.521 diff -u -r1.521 PreferencesMessages.properties --- ui/org/eclipse/jdt/internal/ui/preferences/PreferencesMessages.properties 5 Nov 2010 05:49:58 -0000 1.521 +++ ui/org/eclipse/jdt/internal/ui/preferences/PreferencesMessages.properties 10 Nov 2010 18:45:12 -0000 @@ -131,6 +131,7 @@ JavaEditorPreferencePage_enable=Enab&le JavaEditorPreferencePage_preview=Previe&w: JavaEditorPreferencePage_highlightMatchingBrackets=Highlight &matching brackets +JavaEditorPreferencePage_ShowMethodBoundaryLines=Method &boundary lines JavaEditorPreferencePage_insertSingleProposalsAutomatically=Insert single &proposals automatically JavaEditorPreferencePage_showOnlyProposalsVisibleInTheInvocationContext=Hide proposals not visible in the in&vocation context JavaEditorPreferencePage_presentProposalsInAlphabeticalOrder=&Sort proposals @@ -160,6 +161,7 @@ JavaEditorPreferencePage_empty_input=Empty input JavaEditorPreferencePage_invalid_input=''{0}'' is not a valid input. JavaEditorPreferencePage_matchingBracketsHighlightColor2=Matching brackets highlight +JavaEditorPreferencePage_methodBoundaryLinesColor= Method boundary lines JavaEditorPreferencePage_appearanceOptions=Appearance co&lor options: JavaEditorPreferencePage_typing_tabTitle=T&yping Index: ui/org/eclipse/jdt/ui/PreferenceConstants.java =================================================================== RCS file: /cvsroot/eclipse/org.eclipse.jdt.ui/ui/org/eclipse/jdt/ui/PreferenceConstants.java,v retrieving revision 1.257 diff -u -r1.257 PreferenceConstants.java --- ui/org/eclipse/jdt/ui/PreferenceConstants.java 5 Nov 2010 05:49:58 -0000 1.257 +++ ui/org/eclipse/jdt/ui/PreferenceConstants.java 10 Nov 2010 18:45:15 -0000 @@ -2275,11 +2275,32 @@ public static final String EDITOR_BROWSER_LIKE_LINKS_KEY_MODIFIER_MASK= "browserLikeLinksKeyModifierMask"; //$NON-NLS-1$ /** + * A named preference that controls whether method boundary lines are shown in the editor. + *

+ * Value is of type Boolean. + *

+ * + * @since 3.7 + */ + public static final String SHOW_METHOD_BOUNDARY_LINES= "showMethodBoundaryLines"; //$NON-NLS-1$ + + /** + * A named preference that holds the color used for method boundary lines. + *

+ * Value is of type String. A RGB color value encoded as a string using class + * PreferenceConverter + *

+ * + * @since 3.7 + */ + public static final String METHOD_BOUNDARY_LINES_COLOR= "methodBoundaryLinesColor"; //$NON-NLS-1$ + + /** * A named preference that controls whether occurrences are marked in the editor. *

* Value is of type Boolean. *

- * + * * @since 3.0 */ public static final String EDITOR_MARK_OCCURRENCES= "markOccurrences"; //$NON-NLS-1$ @@ -3707,6 +3728,7 @@ // JavaEditorPreferencePage store.setDefault(PreferenceConstants.EDITOR_MATCHING_BRACKETS, true); + store.setDefault(PreferenceConstants.SHOW_METHOD_BOUNDARY_LINES, false); store.setDefault(PreferenceConstants.EDITOR_CORRECTION_INDICATION, true); store.setDefault(PreferenceConstants.EDITOR_SYNC_OUTLINE_ON_CURSOR_MOVE, true);