From c358a8c35572c82238d64836114dfcd4d0f4bb4d Mon Sep 17 00:00:00 2001 From: Alain Magloire Date: Fri, 25 Feb 2005 19:46:32 +0000 Subject: [PATCH] 2005-02-25 Alain Magloire Fix PR 86647: remove the hyperlink preference page in the CEditor preference Use the Text Editors * src/org/eclipse/cdt/internal/ui/editor/CEditor.java + src/org/eclipse/cdt/internal/ui/editor/CElementHyperlink.java = src/org/eclipse/cdt/internal/ui/editor/CElementHperlinkDetector.java - src/org/eclipse/cdt/internal/ui/editor/IPositionManager.java - src/org/eclipse/cdt/internal/ui/editor/MouseClickListener.java * src/org/eclipse/cdt/internal/ui/preferences/CEditorPreferencePage.java * src/org/eclipse/cdt/internal/ui/preferences/PreferencesMessages.properties * src/org/eclipse/cdt/internal/ui/text/CSourceViewerConfiguration.java --- core/org.eclipse.cdt.ui/ChangeLog | 14 +- .../cdt/internal/ui/editor/CEditor.java | 52 +- .../internal/ui/editor/CElementHyperlink.java | 73 ++ .../ui/editor/CElementHyperlinkDetector.java | 166 +++++ .../internal/ui/editor/IPositionManager.java | 18 - .../ui/editor/MouseClickListener.java | 675 ------------------ .../ui/preferences/CEditorPreferencePage.java | 23 - .../PreferencesMessages.properties | 2 +- .../ui/text/CSourceViewerConfiguration.java | 27 +- 9 files changed, 280 insertions(+), 770 deletions(-) create mode 100644 core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/editor/CElementHyperlink.java create mode 100644 core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/editor/CElementHyperlinkDetector.java delete mode 100644 core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/editor/IPositionManager.java delete mode 100644 core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/editor/MouseClickListener.java diff --git a/core/org.eclipse.cdt.ui/ChangeLog b/core/org.eclipse.cdt.ui/ChangeLog index 0a07ab9ebfd..c42142148a5 100644 --- a/core/org.eclipse.cdt.ui/ChangeLog +++ b/core/org.eclipse.cdt.ui/ChangeLog @@ -1,4 +1,16 @@ -2005-02-24 Alain Magloire +2005-02-25 Alain Magloire + Fix PR 86647: remove the hyperlink preference page in the CEditor preference + Use the Text Editors + * src/org/eclipse/cdt/internal/ui/editor/CEditor.java + + src/org/eclipse/cdt/internal/ui/editor/CElementHyperlink.java + = src/org/eclipse/cdt/internal/ui/editor/CElementHperlinkDetector.java + - src/org/eclipse/cdt/internal/ui/editor/IPositionManager.java + - src/org/eclipse/cdt/internal/ui/editor/MouseClickListener.java + * src/org/eclipse/cdt/internal/ui/preferences/CEditorPreferencePage.java + * src/org/eclipse/cdt/internal/ui/preferences/PreferencesMessages.properties + * src/org/eclipse/cdt/internal/ui/text/CSourceViewerConfiguration.java + +2005-02-25 Alain Magloire Fix PR 86655: adds a link to the Text Editor preference Remove some warning, WorkbenchHelp was deprecated. * src/org/eclipse/cdt/internal/ui/editor/CEditor.java diff --git a/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/editor/CEditor.java b/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/editor/CEditor.java index 1a0a540871a..b23014efe3d 100644 --- a/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/editor/CEditor.java +++ b/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/editor/CEditor.java @@ -149,9 +149,6 @@ public class CEditor extends TextEditor implements ISelectionChangedListener, IS protected ISelectionChangedListener fStatusLineClearer; protected ISelectionChangedListener fSelectionUpdateListener; - /** The mouse listener */ - private MouseClickListener fMouseListener; - /** Pairs of brackets, used to match. */ protected final static char[] BRACKETS = { '{', '}', '(', ')', '[', ']', '<', '>' }; @@ -176,9 +173,6 @@ public class CEditor extends TextEditor implements ISelectionChangedListener, IS /** Preference key for compiler task tags */ private final static String TRANSLATION_TASK_TAGS= CCorePreferenceConstants.TRANSLATION_TASK_TAGS; - /** Preference key for hyperlink enablement */ - public final static String HYPERLINK_ENABLED = "hyperlinkEnable"; //$NON-NLS-1$ - /** * This editor's projection support */ @@ -348,14 +342,6 @@ public class CEditor extends TextEditor implements ISelectionChangedListener, IS return; } - if (HYPERLINK_ENABLED.equals(property)) { - if (hyperLinkEnabled()) - enableBrowserLikeLinks(); - else - disableBrowserLikeLinks(); - return; - } - // Not implemented ... for the future. if (TRANSLATION_TASK_TAGS.equals(event.getProperty())) { ISourceViewer sourceViewer= getSourceViewer(); @@ -604,7 +590,6 @@ public class CEditor extends TextEditor implements ISelectionChangedListener, IS } stopTabConversion(); - disableBrowserLikeLinks(); super.dispose(); } @@ -718,12 +703,7 @@ public class CEditor extends TextEditor implements ISelectionChangedListener, IS //Assorted action groupings fSelectionSearchGroup = new SelectionSearchGroup(this); - fRefactoringActionGroup = new RefactoringActionGroup(this, null); - - if (hyperLinkEnabled()){ - enableBrowserLikeLinks(); - } - + fRefactoringActionGroup = new RefactoringActionGroup(this, null); } /** @@ -1303,36 +1283,6 @@ public class CEditor extends TextEditor implements ISelectionChangedListener, IS statusLine.setMessage(false, msg, null); } - /** - * Enables browser like links, requires disable to clean up - */ - private void enableBrowserLikeLinks() { - if (fMouseListener == null) { - IAction openDeclAction = getAction("OpenDeclarations"); //$NON-NLS-1$ - fMouseListener= new MouseClickListener(this, getSourceViewer(), getPreferenceStore(), openDeclAction); - fMouseListener.install(); - } - } - - /** - * Disable browser like links, clean up resources - */ - private void disableBrowserLikeLinks() { - if (fMouseListener != null) { - fMouseListener.uninstall(); - fMouseListener= null; - } - } - - /** - * Determine if the hyperlink capability is enabled - * @return boolean indicating if hyperlinking is enabled - */ - private boolean hyperLinkEnabled() { - IPreferenceStore store= getPreferenceStore(); - return store.getBoolean(HYPERLINK_ENABLED); - } - /* (non-Javadoc) * @see org.eclipse.cdt.internal.ui.editor.IReconcilingParticipant#reconciled() */ diff --git a/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/editor/CElementHyperlink.java b/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/editor/CElementHyperlink.java new file mode 100644 index 00000000000..b1691771844 --- /dev/null +++ b/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/editor/CElementHyperlink.java @@ -0,0 +1,73 @@ +/******************************************************************************* + * Copyright (c) 2000, 2004 IBM Corporation and others. + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Common Public License v1.0 + * which accompanies this distribution, and is available at + * http://www.eclipse.org/legal/cpl-v10.html + * + * Contributors: + * IBM Corporation - initial API and implementation + *******************************************************************************/ +package org.eclipse.cdt.internal.ui.editor; + +import org.eclipse.jface.action.IAction; + +import org.eclipse.jface.text.Assert; +import org.eclipse.jface.text.IRegion; +import org.eclipse.jface.text.hyperlink.IHyperlink; + + +/** + * C element hyperlink. + * + * @since 3.0 + */ +public class CElementHyperlink implements IHyperlink { + + private final IRegion fRegion; + private final IAction fOpenAction; + + + /** + * Creates a new Java element hyperlink. + */ + public CElementHyperlink(IRegion region, IAction openAction) { + Assert.isNotNull(openAction); + Assert.isNotNull(region); + + fRegion= region; + fOpenAction= openAction; + } + + /* + * @see org.eclipse.jdt.internal.ui.javaeditor.IHyperlink#getHyperlinkRegion() + * @since 3.1 + */ + public IRegion getHyperlinkRegion() { + return fRegion; + } + + /* + * @see org.eclipse.jdt.internal.ui.javaeditor.IHyperlink#open() + * @since 3.1 + */ + public void open() { + fOpenAction.run(); + } + + /* + * @see org.eclipse.jdt.internal.ui.javaeditor.IHyperlink#getTypeLabel() + * @since 3.1 + */ + public String getTypeLabel() { + return null; + } + + /* + * @see org.eclipse.jdt.internal.ui.javaeditor.IHyperlink#getHyperlinkText() + * @since 3.1 + */ + public String getHyperlinkText() { + return null; + } +} diff --git a/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/editor/CElementHyperlinkDetector.java b/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/editor/CElementHyperlinkDetector.java new file mode 100644 index 00000000000..52399f481c8 --- /dev/null +++ b/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/editor/CElementHyperlinkDetector.java @@ -0,0 +1,166 @@ +/******************************************************************************* + * Copyright (c) 2000, 2004 QNX Software Systems and others. + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Common Public License v1.0 + * which accompanies this distribution, and is available at + * http://www.eclipse.org/legal/cpl-v10.html + * + * Contributors: + * QNX Software Systems - Initial API and implementation + *******************************************************************************/ + +package org.eclipse.cdt.internal.ui.editor; + +import java.util.Iterator; +import java.util.Set; + +import org.eclipse.cdt.core.parser.KeywordSetKey; +import org.eclipse.cdt.core.parser.ParserLanguage; +import org.eclipse.cdt.internal.core.parser.token.KeywordSets; +import org.eclipse.jface.action.IAction; +import org.eclipse.jface.text.BadLocationException; +import org.eclipse.jface.text.IDocument; +import org.eclipse.jface.text.IRegion; +import org.eclipse.jface.text.ITextViewer; +import org.eclipse.jface.text.Region; +import org.eclipse.jface.text.hyperlink.IHyperlink; +import org.eclipse.jface.text.hyperlink.IHyperlinkDetector; +import org.eclipse.ui.texteditor.ITextEditor; + +public class CElementHyperlinkDetector implements IHyperlinkDetector{ + + private ITextEditor fTextEditor; + //TODO: Replace Keywords + //Temp. Keywords: Once the selection parser is complete, we can use + //it to determine if a word can be underlined + private Set fgKeywords; + + public CElementHyperlinkDetector(ITextEditor editor) { + fTextEditor= editor; + fgKeywords = KeywordSets.getKeywords(KeywordSetKey.ALL,ParserLanguage.CPP); + } + + public IHyperlink[] detectHyperlinks(ITextViewer textViewer, IRegion region, boolean canShowMultipleHyperlinks) { + if (region == null || canShowMultipleHyperlinks || !(fTextEditor instanceof CEditor)) + return null; + + IAction openAction= fTextEditor.getAction("OpenDeclarations"); //$NON-NLS-1$ + if (openAction == null) + return null; + + // TODO: + //Need some code in here to determine if the selected input should + //be selected - the JDT does this by doing a code complete on the input - + //if there are any elements presented it selects the word + + int offset= region.getOffset(); + IDocument document= fTextEditor.getDocumentProvider().getDocument(fTextEditor.getEditorInput()); + + IRegion cregion = selectWord(document, offset); + if (cregion != null) { + return new IHyperlink[] {new CElementHyperlink(cregion, openAction)}; + } + return null; + } + + private IRegion selectWord(IDocument document, int anchor) { + //TODO: Modify this to work with qualified name + + try { + int offset= anchor; + char c; + + while (offset >= 0) { + c= document.getChar(offset); + if (!Character.isJavaIdentifierPart(c)) + break; + --offset; + } + + int start= offset; + + offset= anchor; + int length= document.getLength(); + + while (offset < length) { + c= document.getChar(offset); + if (!Character.isJavaIdentifierPart(c)) + break; + ++offset; + } + + int end= offset; + //Allow for new lines + if (start == end) + return new Region(start, 0); + + String selWord = null; + String slas = document.get(start,1); + if (slas.equals("\n") || //$NON-NLS-1$ + slas.equals("\t") || //$NON-NLS-1$ + slas.equals(" ")) //$NON-NLS-1$ + { + + selWord =document.get(start+1, end - start - 1); + } + else{ + selWord =document.get(start, end - start); + } + //Check for keyword + if (isKeyWord(selWord)) + return null; + //Avoid selecting literals, includes etc. + char charX = selWord.charAt(0); + if (charX == '"' || + charX == '.' || + charX == '<' || + charX == '>') + return null; + + if (selWord.equals("#include")) //$NON-NLS-1$ + { + //get start of next identifier + + + int end2 = end; + + while (!Character.isJavaIdentifierPart(document.getChar(end2))){ + ++end2; + } + + while (end2 < length){ + c = document.getChar(end2); + + if (!Character.isJavaIdentifierPart(c) && + c != '.') + break; + ++end2; + } + + int finalEnd = end2; + selWord =document.get(start, finalEnd - start); + end = finalEnd + 1; + start--; + } + + return new Region(start + 1, end - start - 1); + + } catch (BadLocationException x) { + return null; + } + } + + private boolean isKeyWord(String selWord) { + Iterator i = fgKeywords.iterator(); + + while (i.hasNext()){ + String tempWord = (String) i.next(); + if (selWord.equals(tempWord)) + return true; + } + + return false; + } + + +} diff --git a/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/editor/IPositionManager.java b/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/editor/IPositionManager.java deleted file mode 100644 index bc495ee970a..00000000000 --- a/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/editor/IPositionManager.java +++ /dev/null @@ -1,18 +0,0 @@ -package org.eclipse.cdt.internal.ui.editor; - -/* - * (c) Copyright IBM Corp. 2000, 2001. - * All Rights Reserved. - */ - -import org.eclipse.jface.text.Position; - - -public interface IPositionManager { - - void addManagedPosition(Position position); - - void removeManagedPosition(Position position); -} - - diff --git a/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/editor/MouseClickListener.java b/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/editor/MouseClickListener.java deleted file mode 100644 index 7f89765461d..00000000000 --- a/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/editor/MouseClickListener.java +++ /dev/null @@ -1,675 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2004 IBM Corporation and others. - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Common Public License v1.0 - * which accompanies this distribution, and is available at - * http://www.eclipse.org/legal/cpl-v10.html - * - * Contributors: - * IBM Corporation - initial API and implementation - *******************************************************************************/ -/* - * Created on Mar 5, 2004 - * - * To change the template for this generated file go to - * Window - Preferences - Java - Code Generation - Code and Comments - */ -package org.eclipse.cdt.internal.ui.editor; - -import java.util.Iterator; -import java.util.Set; - -import org.eclipse.cdt.core.ICLogConstants; -import org.eclipse.cdt.core.parser.KeywordSetKey; -import org.eclipse.cdt.core.parser.ParserLanguage; -import org.eclipse.cdt.internal.core.parser.token.KeywordSets; -import org.eclipse.jface.action.IAction; -import org.eclipse.jface.preference.IPreferenceStore; -import org.eclipse.jface.preference.PreferenceConverter; -import org.eclipse.jface.text.BadLocationException; -import org.eclipse.jface.text.IDocument; -import org.eclipse.jface.text.IRegion; -import org.eclipse.jface.text.ITextViewerExtension2; -import org.eclipse.jface.text.ITextViewerExtension5; -import org.eclipse.jface.text.Position; -import org.eclipse.jface.text.Region; -import org.eclipse.jface.text.source.ISourceViewer; -import org.eclipse.jface.util.IPropertyChangeListener; -import org.eclipse.jface.util.PropertyChangeEvent; -import org.eclipse.swt.SWT; -import org.eclipse.swt.custom.StyleRange; -import org.eclipse.swt.custom.StyledText; -import org.eclipse.swt.events.FocusEvent; -import org.eclipse.swt.events.FocusListener; -import org.eclipse.swt.events.KeyEvent; -import org.eclipse.swt.events.KeyListener; -import org.eclipse.swt.events.MouseEvent; -import org.eclipse.swt.events.MouseListener; -import org.eclipse.swt.events.MouseMoveListener; -import org.eclipse.swt.events.PaintEvent; -import org.eclipse.swt.events.PaintListener; -import org.eclipse.swt.graphics.Color; -import org.eclipse.swt.graphics.Cursor; -import org.eclipse.swt.graphics.GC; -import org.eclipse.swt.graphics.Point; -import org.eclipse.swt.graphics.RGB; -import org.eclipse.swt.widgets.Control; -import org.eclipse.swt.widgets.Display; - - -class MouseClickListener -implements -MouseListener, -KeyListener, -MouseMoveListener, -FocusListener, -PaintListener, -IPropertyChangeListener{ - - private final CEditor fEditor; - - private ISourceViewer fViewer; - - private IPreferenceStore fPrefStore; - - private IAction fOpenDeclAction; - - /** - * @param editor - * @param viewer - * @param store - */ - public MouseClickListener(CEditor editor, ISourceViewer viewer, IPreferenceStore store, IAction openDeclAction) { - this.fEditor = editor; - this.fViewer = viewer; - this.fPrefStore = store; - this.fOpenDeclAction = openDeclAction; - this.fgKeywords = KeywordSets.getKeywords(KeywordSetKey.ALL,ParserLanguage.CPP); - } - - /** The session is active. */ - private boolean fActive; - - /** The currently active style range. */ - private IRegion fActiveRegion; - /** The currently active style range as position. */ - private Position fRememberedPosition; - /** The hand cursor. */ - private Cursor fCursor; - /** The link color. */ - private Color fColor; - /** The key modifier mask. */ - private int fKeyModifierMask; - /** The key modifier mask. */ - private boolean fIncludeMode; - - //TODO: Replace Keywords - //Temp. Keywords: Once the selection parser is complete, we can use - //it to determine if a word can be underlined - - private Set fgKeywords; - - public void deactivate() { - deactivate(false); - } - - public void deactivate(boolean redrawAll) { - if (!fActive) - return; - - repairRepresentation(redrawAll); - fActive= false; - fIncludeMode = false; - } - - private void repairRepresentation(boolean redrawAll) { - - if (fActiveRegion == null) - return; - - ISourceViewer viewer= fViewer; - if (viewer != null) { - resetCursor(viewer); - - int offset= fActiveRegion.getOffset(); - int length= fActiveRegion.getLength(); - - // remove style - if (!redrawAll && viewer instanceof ITextViewerExtension2) - ((ITextViewerExtension2) viewer).invalidateTextPresentation(offset, length); - else - viewer.invalidateTextPresentation(); - - // remove underline - if (viewer instanceof ITextViewerExtension5) { - ITextViewerExtension5 extension= (ITextViewerExtension5) viewer; - offset= extension.modelOffset2WidgetOffset(offset); - } else { - offset -= viewer.getVisibleRegion().getOffset(); - } - - StyledText text= viewer.getTextWidget(); - try { - text.redrawRange(offset, length, true); - } catch (IllegalArgumentException x) { - org.eclipse.cdt.internal.core.model.Util.log(x, "Error in CEditor.MouseClickListener.repairRepresentation", ICLogConstants.CDT); //$NON-NLS-1$ - } - } - - fActiveRegion= null; - } - - private void activateCursor(ISourceViewer viewer) { - StyledText text= viewer.getTextWidget(); - if (text == null || text.isDisposed()) - return; - Display display= text.getDisplay(); - if (fCursor == null) - fCursor= new Cursor(display, SWT.CURSOR_HAND); - text.setCursor(fCursor); - } - - private void resetCursor(ISourceViewer viewer) { - StyledText text= viewer.getTextWidget(); - if (text != null && !text.isDisposed()) - text.setCursor(null); - - if (fCursor != null) { - fCursor.dispose(); - fCursor= null; - } - } - - public void install() { - - ISourceViewer sourceViewer= fViewer; - if (sourceViewer == null) - return; - - StyledText text= sourceViewer.getTextWidget(); - if (text == null || text.isDisposed()) - return; - - updateColor(sourceViewer); - - text.addKeyListener(this); - text.addMouseListener(this); - text.addMouseMoveListener(this); - text.addFocusListener(this); - text.addPaintListener(this); - - updateKeyModifierMask(); - - IPreferenceStore preferenceStore= fPrefStore; - preferenceStore.addPropertyChangeListener(this); - } - - public void uninstall() { - - if (fColor != null) { - fColor.dispose(); - fColor= null; - } - - if (fCursor != null) { - fCursor.dispose(); - fCursor= null; - } - - IPreferenceStore preferenceStore= fPrefStore; - if (preferenceStore != null) - preferenceStore.removePropertyChangeListener(this); - - ISourceViewer sourceViewer= fViewer; - if (sourceViewer == null) - return; - - StyledText text= sourceViewer.getTextWidget(); - if (text == null || text.isDisposed()) - return; - - text.removeKeyListener(this); - text.removeMouseListener(this); - text.removeMouseMoveListener(this); - text.removeFocusListener(this); - text.removePaintListener(this); - } - private void updateKeyModifierMask() { - //Add code here to allow for specification of hyperlink trigger key - fKeyModifierMask=262144; - } - - private void updateColor(ISourceViewer viewer) { - if (fColor != null) - fColor.dispose(); - - StyledText text= viewer.getTextWidget(); - if (text == null || text.isDisposed()) - return; - - Display display= text.getDisplay(); - fColor= createColor(fPrefStore, CEditor.LINKED_POSITION_COLOR, display); - } - - /** - * Creates a color from the information stored in the given preference store. - * Returns null if there is no such information available. - */ - private Color createColor(IPreferenceStore store, String key, Display display) { - - RGB rgb= null; - - if (store.contains(key)) { - - if (store.isDefault(key)) - rgb= PreferenceConverter.getDefaultColor(store, key); - else - rgb= PreferenceConverter.getColor(store, key); - - if (rgb != null) - return new Color(display, rgb); - } - - return null; - } - - public void mouseDoubleClick(MouseEvent e) {} - - public void mouseDown(MouseEvent event) { - if (!fActive) - return; - - if (event.stateMask != fKeyModifierMask) { - deactivate(); - return; - } - - if (event.button != 1) { - deactivate(); - return; - } - } - - public void mouseUp(MouseEvent e) { - if (!fActive) - return; - - if (e.button != 1) { - deactivate(); - return; - } - - boolean wasActive= fCursor != null; - boolean wasInclude = fIncludeMode; - - deactivate(); - - if (wasActive) { - if (wasInclude){ - /* IAction action= getAction("OpenInclude"); //$NON-NLS-1$ - if (action != null){ - action.run(); - }*/ - } - else { - if (fOpenDeclAction != null) - fOpenDeclAction.run(); - } - } - } - - public void keyPressed(KeyEvent event) { - if (fActive) { - deactivate(); - return; - } - - if (event.keyCode != fKeyModifierMask) { - deactivate(); - return; - } - - fActive= true; - } - - public void keyReleased(KeyEvent event) { - if (!fActive) - return; - - deactivate(); - } - - public void mouseMove(MouseEvent event) { - if (event.widget instanceof Control && !((Control) event.widget).isFocusControl()) { - deactivate(); - return; - } - - if (!fActive) { - if (event.stateMask != fKeyModifierMask) - return; - // modifier was already pressed - fActive= true; - } - - ISourceViewer viewer= fViewer; - if (viewer == null) { - deactivate(); - return; - } - - StyledText text= viewer.getTextWidget(); - if (text == null || text.isDisposed()) { - deactivate(); - return; - } - - if ((event.stateMask & SWT.BUTTON1) != 0 && text.getSelectionCount() != 0) { - deactivate(); - return; - } - - IRegion region= getCurrentTextRegion(viewer); - if (region == null || region.getLength() == 0) { - repairRepresentation(); - return; - } - - highlightRegion(viewer, region); - activateCursor(viewer); - } - - IRegion getCurrentTextRegion(ISourceViewer viewer) { - int offset= getCurrentTextOffset(viewer); - if (offset == -1) - return null; - - //Need some code in here to determine if the selected input should - //be selected - the JDT does this by doing a code complete on the input - - //if there are any elements presented it selects the word - - return selectWord(viewer.getDocument(), offset); - } - //TODO: Modify this to work with qualified name - private IRegion selectWord(IDocument document, int anchor) { - - try { - int offset= anchor; - char c; - - while (offset >= 0) { - c= document.getChar(offset); - if (!Character.isJavaIdentifierPart(c)) - break; - --offset; - } - - int start= offset; - - offset= anchor; - int length= document.getLength(); - - while (offset < length) { - c= document.getChar(offset); - if (!Character.isJavaIdentifierPart(c)) - break; - ++offset; - } - - int end= offset; - //Allow for new lines - if (start == end) - return new Region(start, 0); - - String selWord = null; - String slas = document.get(start,1); - if (slas.equals("\n") || //$NON-NLS-1$ - slas.equals("\t") || //$NON-NLS-1$ - slas.equals(" ")) //$NON-NLS-1$ - { - - selWord =document.get(start+1, end - start - 1); - } - else{ - selWord =document.get(start, end - start); - } - //Check for keyword - if (isKeyWord(selWord)) - return null; - //Avoid selecting literals, includes etc. - char charX = selWord.charAt(0); - if (charX == '"' || - charX == '.' || - charX == '<' || - charX == '>') - return null; - - if (selWord.equals("#include")) //$NON-NLS-1$ - { - //get start of next identifier - - - int end2 = end; - - while (!Character.isJavaIdentifierPart(document.getChar(end2))){ - ++end2; - - } - - while (end2 < length){ - c = document.getChar(end2); - - if (!Character.isJavaIdentifierPart(c) && - c != '.') - break; - ++end2; - } - - int finalEnd = end2; - selWord =document.get(start, finalEnd - start); - end = finalEnd + 1; - start--; - fIncludeMode = true; - } - - return new Region(start + 1, end - start - 1); - - } catch (BadLocationException x) { - return null; - } - } - - private boolean isKeyWord(String selWord) { - Iterator i = fgKeywords.iterator(); - - while (i.hasNext()){ - String tempWord = (String) i.next(); - if (selWord.equals(tempWord)) - return true; - } - - return false; - } - - private int getCurrentTextOffset(ISourceViewer viewer) { - - try { - StyledText text= viewer.getTextWidget(); - if (text == null || text.isDisposed()) - return -1; - - Display display= text.getDisplay(); - Point absolutePosition= display.getCursorLocation(); - Point relativePosition= text.toControl(absolutePosition); - - int widgetOffset= text.getOffsetAtLocation(relativePosition); - if (viewer instanceof ITextViewerExtension5) { - ITextViewerExtension5 extension= (ITextViewerExtension5) viewer; - return extension.widgetOffset2ModelOffset(widgetOffset); - } - return widgetOffset + viewer.getVisibleRegion().getOffset(); - - } catch (IllegalArgumentException e) { - return -1; - } - } - - private void highlightRegion(ISourceViewer viewer, IRegion region) { - - if (region.equals(fActiveRegion)) - return; - - repairRepresentation(); - - StyledText text= viewer.getTextWidget(); - if (text == null || text.isDisposed()) - return; - - // highlight region - int offset= 0; - int length= 0; - - if (viewer instanceof ITextViewerExtension5) { - ITextViewerExtension5 extension= (ITextViewerExtension5) viewer; - IRegion widgetRange= extension.modelRange2WidgetRange(region); - if (widgetRange == null) - return; - - offset= widgetRange.getOffset(); - length= widgetRange.getLength(); - - } else { - offset= region.getOffset() - viewer.getVisibleRegion().getOffset(); - length= region.getLength(); - } - - StyleRange oldStyleRange= text.getStyleRangeAtOffset(offset); - Color foregroundColor= fColor; - Color backgroundColor= oldStyleRange == null ? text.getBackground() : oldStyleRange.background; - StyleRange styleRange= new StyleRange(offset, length, foregroundColor, backgroundColor); - text.setStyleRange(styleRange); - - // underline - text.redrawRange(offset, length, true); - - fActiveRegion= region; - } - - - private void repairRepresentation() { - repairRepresentation(false); - } - - /* (non-Javadoc) - * @see java.awt.event.FocusListener#focusGained(java.awt.event.FocusEvent) - */ - public void focusGained(FocusEvent arg0) { - } - - /* (non-Javadoc) - * @see java.awt.event.FocusListener#focusLost(java.awt.event.FocusEvent) - */ - public void focusLost(FocusEvent arg0) { - deactivate(); - } - - /* (non-Javadoc) - * @see org.eclipse.swt.events.PaintListener#paintControl(org.eclipse.swt.events.PaintEvent) - */ - public void paintControl(PaintEvent event) { - if (fActiveRegion == null) - return; - - ISourceViewer viewer= fViewer; - if (viewer == null) - return; - - StyledText text= viewer.getTextWidget(); - if (text == null || text.isDisposed()) - return; - - - int offset= 0; - int length= 0; - - if (viewer instanceof ITextViewerExtension5) { - - ITextViewerExtension5 extension= (ITextViewerExtension5) viewer; - IRegion widgetRange= extension.modelRange2WidgetRange(new Region(offset, length)); - if (widgetRange == null) - return; - - offset= widgetRange.getOffset(); - length= widgetRange.getLength(); - - } else { - - IRegion region= viewer.getVisibleRegion(); - if (!includes(region, fActiveRegion)) - return; - - offset= fActiveRegion.getOffset() - region.getOffset(); - length= fActiveRegion.getLength(); - } - - // support for bidi - Point minLocation= getMinimumLocation(text, offset, length); - Point maxLocation= getMaximumLocation(text, offset, length); - - int x1= minLocation.x; - int x2= minLocation.x + maxLocation.x - minLocation.x - 1; - int y= minLocation.y + text.getLineHeight() - 1; - - GC gc= event.gc; - if (fColor != null && !fColor.isDisposed()) - gc.setForeground(fColor); - gc.drawLine(x1, y, x2, y); - - } - - private boolean includes(IRegion region, IRegion position) { - return - position.getOffset() >= region.getOffset() && - position.getOffset() + position.getLength() <= region.getOffset() + region.getLength(); - } - - private Point getMinimumLocation(StyledText text, int offset, int length) { - Point minLocation= new Point(Integer.MAX_VALUE, Integer.MAX_VALUE); - - for (int i= 0; i <= length; i++) { - Point location= text.getLocationAtOffset(offset + i); - - if (location.x < minLocation.x) - minLocation.x= location.x; - if (location.y < minLocation.y) - minLocation.y= location.y; - } - - return minLocation; - } - - private Point getMaximumLocation(StyledText text, int offset, int length) { - Point maxLocation= new Point(Integer.MIN_VALUE, Integer.MIN_VALUE); - - for (int i= 0; i <= length; i++) { - Point location= text.getLocationAtOffset(offset + i); - - if (location.x > maxLocation.x) - maxLocation.x= location.x; - if (location.y > maxLocation.y) - maxLocation.y= location.y; - } - - return maxLocation; - } - - public void propertyChange(PropertyChangeEvent event) { - if (event.getProperty().equals(CEditor.LINKED_POSITION_COLOR)) { - ISourceViewer viewer= fViewer; - if (viewer != null) - updateColor(viewer); - } - } - - -} diff --git a/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/preferences/CEditorPreferencePage.java b/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/preferences/CEditorPreferencePage.java index 32ae2e147e6..69ad9b1c9e8 100644 --- a/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/preferences/CEditorPreferencePage.java +++ b/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/preferences/CEditorPreferencePage.java @@ -125,7 +125,6 @@ public class CEditorPreferencePage extends AbstractPreferencePage implements IWo overlayKeys.add(new OverlayPreferenceStore.OverlayKey(OverlayPreferenceStore.STRING, PreferenceConstants.EDITOR_TASK_INDICATION_COLOR)); overlayKeys.add(new OverlayPreferenceStore.OverlayKey(OverlayPreferenceStore.BOOLEAN, PreferenceConstants.EDITOR_TASK_INDICATION)); overlayKeys.add(new OverlayPreferenceStore.OverlayKey(OverlayPreferenceStore.BOOLEAN, PreferenceConstants.EDITOR_TASK_INDICATION_IN_OVERVIEW_RULER)); - overlayKeys.add(new OverlayPreferenceStore.OverlayKey(OverlayPreferenceStore.BOOLEAN, CEditor.HYPERLINK_ENABLED)); OverlayPreferenceStore.OverlayKey[] keys = new OverlayPreferenceStore.OverlayKey[overlayKeys.size()]; overlayKeys.toArray(keys); @@ -170,7 +169,6 @@ public class CEditorPreferencePage extends AbstractPreferencePage implements IWo PreferenceConverter.setDefault(store, CEditor.LINKED_POSITION_COLOR, new RGB(0, 200, 100)); - store.setDefault(CEditor.HYPERLINK_ENABLED,true); } /* @@ -402,32 +400,11 @@ public class CEditorPreferencePage extends AbstractPreferencePage implements IWo item.setText(PreferencesMessages.getString("CEditorPreferencePage.folding.title")); //$NON-NLS-1$ item.setControl(fFoldingConfigurationBlock.createControl(folder)); - item = new TabItem(folder, SWT.NONE); - item.setText(PreferencesMessages.getString("CEditorPreferencePage.Navigation")); //$NON-NLS-1$ - item.setControl(createNavPage(folder)); - initialize(); return folder; } - /** - * @param folder - * @return - */ - private Control createNavPage(Composite parent) { - Composite navComposite = new Composite(parent, SWT.NULL); - GridLayout layout = new GridLayout(); - layout.numColumns = 2; - navComposite.setLayout(layout); - - String label = PreferencesMessages.getString("CEditorPreferencePage.Enable_Hyperlink_Navigation"); //$NON-NLS-1$ - addCheckBox(navComposite, label, CEditor.HYPERLINK_ENABLED, 0); - - PlatformUI.getWorkbench().getHelpSystem().setHelp(navComposite, ICHelpContextIds.C_EDITOR_NAVIGATION_PAGE); - return navComposite; - } - private void initialize() { initializeFields(); diff --git a/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/preferences/PreferencesMessages.properties b/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/preferences/PreferencesMessages.properties index 4aa47d84aa0..e836e62cadd 100644 --- a/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/preferences/PreferencesMessages.properties +++ b/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/preferences/PreferencesMessages.properties @@ -61,7 +61,7 @@ TodoTaskInputDialog.error.noSpace=Name can not start or end with a whitespace. CEditorPreferencePage.cCommentTaskTags=Task Tags -CEditorPreferencePage.link=Note that some preferences may be set on the General Text preference page. +CEditorPreferencePage.link=Note that some preferences may be set on the Text Editors preference page. CEditorPreferencePage.generalTabTitle=Appeara&nce CEditorPreferencePage.annotationTabTitle= &Annotations CEditorPreferencePage.colorsTabTitle=Synta&x diff --git a/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/text/CSourceViewerConfiguration.java b/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/text/CSourceViewerConfiguration.java index bd3e7c6e317..df117fc6d39 100644 --- a/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/text/CSourceViewerConfiguration.java +++ b/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/text/CSourceViewerConfiguration.java @@ -7,6 +7,7 @@ package org.eclipse.cdt.internal.ui.text; import java.util.Vector; import org.eclipse.cdt.internal.ui.editor.CEditor; +import org.eclipse.cdt.internal.ui.editor.CElementHyperlinkDetector; import org.eclipse.cdt.internal.ui.editor.CSourceViewer; import org.eclipse.cdt.internal.ui.text.c.hover.CEditorTextHoverDescriptor; import org.eclipse.cdt.internal.ui.text.c.hover.CEditorTextHoverProxy; @@ -30,6 +31,7 @@ import org.eclipse.jface.text.contentassist.IContentAssistProcessor; import org.eclipse.jface.text.contentassist.IContentAssistant; import org.eclipse.jface.text.formatter.IContentFormatter; import org.eclipse.jface.text.formatter.MultiPassContentFormatter; +import org.eclipse.jface.text.hyperlink.IHyperlinkDetector; import org.eclipse.jface.text.information.IInformationPresenter; import org.eclipse.jface.text.information.IInformationProvider; import org.eclipse.jface.text.information.InformationPresenter; @@ -45,6 +47,7 @@ import org.eclipse.jface.text.source.SourceViewerConfiguration; import org.eclipse.swt.SWT; import org.eclipse.swt.widgets.Shell; import org.eclipse.ui.editors.text.TextSourceViewerConfiguration; +import org.eclipse.ui.texteditor.AbstractDecoratedTextEditorPreferenceConstants; import org.eclipse.ui.texteditor.ITextEditor; @@ -429,7 +432,29 @@ public class CSourceViewerConfiguration extends TextSourceViewerConfiguration { return super.getInformationPresenter(sourceViewer); } - + /* + * @see org.eclipse.jface.text.source.SourceViewerConfiguration#getHyperlinkDetectors(org.eclipse.jface.text.source.ISourceViewer) + * @since 3.1 + */ + public IHyperlinkDetector[] getHyperlinkDetectors(ISourceViewer sourceViewer) { + if (!fPreferenceStore.getBoolean(AbstractDecoratedTextEditorPreferenceConstants.EDITOR_HYPERLINKS_ENABLED)) + return null; + + IHyperlinkDetector[] inheritedDetectors= super.getHyperlinkDetectors(sourceViewer); + + if (fEditor == null) + return inheritedDetectors; + + int inheritedDetectorsLength= inheritedDetectors != null ? inheritedDetectors.length : 0; + IHyperlinkDetector[] detectors= new IHyperlinkDetector[inheritedDetectorsLength + 1]; + detectors[0]= new CElementHyperlinkDetector(fEditor); + for (int i= 0; i < inheritedDetectorsLength; i++) { + detectors[i+1]= inheritedDetectors[i]; + } + + return detectors; + } + /** * Creates control for outline presentation in editor. * @param editor Editor.