1
0
Fork 0
mirror of https://github.com/eclipse-cdt/cdt synced 2025-04-29 19:45:01 +02:00

patch for Bugzilla 94203 by Mike Kucera

This commit is contained in:
Chris Recoskie 2006-10-18 14:55:15 +00:00
parent d5bc2d7474
commit 7dbd64ed6a
3 changed files with 106 additions and 23 deletions

View file

@ -22,6 +22,7 @@ import org.eclipse.jface.action.IMenuManager;
import org.eclipse.jface.action.IToolBarManager; import org.eclipse.jface.action.IToolBarManager;
import org.eclipse.jface.action.MenuManager; import org.eclipse.jface.action.MenuManager;
import org.eclipse.jface.action.Separator; import org.eclipse.jface.action.Separator;
import org.eclipse.jface.text.ITextSelection;
import org.eclipse.jface.viewers.AbstractTreeViewer; import org.eclipse.jface.viewers.AbstractTreeViewer;
import org.eclipse.jface.viewers.DoubleClickEvent; import org.eclipse.jface.viewers.DoubleClickEvent;
import org.eclipse.jface.viewers.IDoubleClickListener; import org.eclipse.jface.viewers.IDoubleClickListener;
@ -49,7 +50,11 @@ import org.eclipse.ui.texteditor.ITextEditorActionDefinitionIds;
import org.eclipse.ui.views.contentoutline.IContentOutlinePage; import org.eclipse.ui.views.contentoutline.IContentOutlinePage;
import org.eclipse.ui.views.navigator.LocalSelectionTransfer; import org.eclipse.ui.views.navigator.LocalSelectionTransfer;
import org.eclipse.cdt.core.model.CModelException;
import org.eclipse.cdt.core.model.ICElement; import org.eclipse.cdt.core.model.ICElement;
import org.eclipse.cdt.core.model.IParent;
import org.eclipse.cdt.core.model.ISourceRange;
import org.eclipse.cdt.core.model.ISourceReference;
import org.eclipse.cdt.core.model.ITranslationUnit; import org.eclipse.cdt.core.model.ITranslationUnit;
import org.eclipse.cdt.refactoring.actions.CRefactoringActionGroup; import org.eclipse.cdt.refactoring.actions.CRefactoringActionGroup;
import org.eclipse.cdt.ui.CUIPlugin; import org.eclipse.cdt.ui.CUIPlugin;
@ -90,6 +95,7 @@ public class CContentOutlinePage extends Page implements IContentOutlinePage, IS
protected OpenIncludeAction fOpenIncludeAction; protected OpenIncludeAction fOpenIncludeAction;
private IncludeGroupingAction fIncludeGroupingAction; private IncludeGroupingAction fIncludeGroupingAction;
private ToggleLinkingAction fToggleLinkingAction;
private MemberFilterActionGroup fMemberFilterActionGroup; private MemberFilterActionGroup fMemberFilterActionGroup;
@ -110,7 +116,8 @@ public class CContentOutlinePage extends Page implements IContentOutlinePage, IS
super(ActionMessages.getString("IncludesGroupingAction.label")); //$NON-NLS-1$ super(ActionMessages.getString("IncludesGroupingAction.label")); //$NON-NLS-1$
setDescription(ActionMessages.getString("IncludesGroupingAction.description")); //$NON-NLS-1$ setDescription(ActionMessages.getString("IncludesGroupingAction.description")); //$NON-NLS-1$
setToolTipText(ActionMessages.getString("IncludeGroupingAction.tooltip")); //$NON-NLS-1$ setToolTipText(ActionMessages.getString("IncludeGroupingAction.tooltip")); //$NON-NLS-1$
CPluginImages.setImageDescriptors(this, CPluginImages.T_LCL, "synced.gif"); //$NON-NLS-1$ //CPluginImages.setImageDescriptors(this, CPluginImages.T_LCL, "synced.gif"); //$NON-NLS-1$
CPluginImages.setImageDescriptors(this, CPluginImages.T_LCL, "open_incl.gif"); //$NON-NLS-1$
PlatformUI.getWorkbench().getHelpSystem().setHelp(this, ICHelpContextIds.LINK_EDITOR_ACTION); PlatformUI.getWorkbench().getHelpSystem().setHelp(this, ICHelpContextIds.LINK_EDITOR_ACTION);
boolean enabled= isIncludesGroupingEnabled(); boolean enabled= isIncludesGroupingEnabled();
@ -151,24 +158,27 @@ public class CContentOutlinePage extends Page implements IContentOutlinePage, IS
* @param outlinePage the Java outline page * @param outlinePage the Java outline page
*/ */
public ToggleLinkingAction(CContentOutlinePage outlinePage) { public ToggleLinkingAction(CContentOutlinePage outlinePage) {
//boolean isLinkingEnabled= PreferenceConstants.getPreferenceStore().getBoolean(PreferenceConstants.EDITOR_SYNC_OUTLINE_ON_CURSOR_MOVE); setChecked(isLinkingEnabled());
boolean isLinkingEnabled= true; fOutlinePage = outlinePage;
setChecked(isLinkingEnabled);
fOutlinePage= outlinePage;
} }
/** /**
* Runs the action. * Runs the action.
*/ */
public void run() { public void run() {
//TODO synchronize selection with editor boolean checked = isChecked();
//PreferenceConstants.getPreferenceStore().setValue(PreferenceConstants.EDITOR_SYNC_OUTLINE_ON_CURSOR_MOVE, isChecked()); PreferenceConstants.getPreferenceStore().setValue(PreferenceConstants.OUTLINE_LINK_TO_EDITOR, checked);
//if (isChecked() && fEditor != null) if (checked && fEditor != null)
// fEditor.synchronizeOutlinePage(fEditor.computeHighlightRangeSourceReference(), false); synchronizeSelectionWithEditor();
}
} }
public boolean isLinkingEnabled() {
return PreferenceConstants.getPreferenceStore().getBoolean(PreferenceConstants.OUTLINE_LINK_TO_EDITOR);
} }
public CContentOutlinePage(CEditor editor) { public CContentOutlinePage(CEditor editor) {
this("#TranslationUnitOutlinerContext", editor); //$NON-NLS-1$ this("#TranslationUnitOutlinerContext", editor); //$NON-NLS-1$
} }
@ -232,6 +242,60 @@ public class CContentOutlinePage extends Page implements IContentOutlinePage, IS
return new StructuredSelection(newSelection); return new StructuredSelection(newSelection);
} }
/**
* Sets the selected element to the one at the current line in the editor.
*/
public void synchronizeSelectionWithEditor() {
if(fInput == null || fEditor == null || fTreeViewer == null)
return;
ITextSelection editorSelection = (ITextSelection) fEditor.getSelectionProvider().getSelection();
if(editorSelection == null)
return;
int offset = editorSelection.getOffset();
ICElement editorElement;
try {
editorElement = getElementAtOffset(fInput, offset);
} catch (CModelException e) {
return;
}
IStructuredSelection selection = (editorElement == null)
? StructuredSelection.EMPTY
: new StructuredSelection(editorElement);
fTreeViewer.setSelection(selection, true);
}
/**
* Returns the smallest element at the given offset.
*/
private static ICElement getElementAtOffset(ICElement element, int offset) throws CModelException {
ISourceRange range = ((ISourceReference)element).getSourceRange();
int start = range.getStartPos();
int end = start + range.getLength();
ICElement closest = null;
if((offset >= start && offset <= end) || element instanceof ITranslationUnit) {
closest = element;
if(element instanceof IParent) {
ICElement[] children = ((IParent)element).getChildren();
for(int i = 0; i < children.length; i++) {
ICElement found = getElementAtOffset(children[i], offset);
if(found != null)
closest = found;
}
}
}
return closest;
}
/** /**
* called to create the context menu of the outline * called to create the context menu of the outline
*/ */
@ -387,8 +451,8 @@ public class CContentOutlinePage extends Page implements IContentOutlinePage, IS
IMenuManager menu= actionBars.getMenuManager(); IMenuManager menu= actionBars.getMenuManager();
menu.add(new Separator("EndFilterGroup")); //$NON-NLS-1$ menu.add(new Separator("EndFilterGroup")); //$NON-NLS-1$
//fToggleLinkingAction= new ToggleLinkingAction(this); fToggleLinkingAction= new ToggleLinkingAction(this);
//menu.add(fToggleLinkingAction); menu.add(fToggleLinkingAction);
fIncludeGroupingAction= new IncludeGroupingAction(this); fIncludeGroupingAction= new IncludeGroupingAction(this);
menu.add(fIncludeGroupingAction); menu.add(fIncludeGroupingAction);
} }

View file

@ -1831,7 +1831,7 @@ public class CEditor extends TextEditor implements ISelectionChangedListener, IR
} }
/** /**
* React to changed selection. * React to changed selection in the editor.
* *
* @since 3.0 * @since 3.0
*/ */
@ -1839,9 +1839,27 @@ public class CEditor extends TextEditor implements ISelectionChangedListener, IR
if (getSelectionProvider() == null) if (getSelectionProvider() == null)
return; return;
updateStatusLine(); updateStatusLine();
synchronizeOutlinePage();
} }
/** /**
* Synchronizes the outline view selection with the given element
* position in the editor.
*
* @since 4.0
*/
protected void synchronizeOutlinePage() {
if(fOutlinePage != null && fOutlinePage.isLinkingEnabled()) {
fOutlinePage.removeSelectionChangedListener(this);
fOutlinePage.synchronizeSelectionWithEditor();
fOutlinePage.addSelectionChangedListener(this);
}
}
/**
* React to changed selection in the outline view.
* @see org.eclipse.jface.viewers.ISelectionChangedListener#selectionChanged(org.eclipse.jface.viewers.SelectionChangedEvent) * @see org.eclipse.jface.viewers.ISelectionChangedListener#selectionChanged(org.eclipse.jface.viewers.SelectionChangedEvent)
*/ */
public void selectionChanged(SelectionChangedEvent event) { public void selectionChanged(SelectionChangedEvent event) {
@ -1867,15 +1885,6 @@ public class CEditor extends TextEditor implements ISelectionChangedListener, IR
* @param element Element to select. * @param element Element to select.
*/ */
public void setSelection(ICElement element) { public void setSelection(ICElement element) {
if (element == null || element instanceof ITranslationUnit) {
/*
* If the element is an ITranslationUnit this unit is either the input
* of this editor or not being displayed. In both cases, nothing should
* happened.
*/
return;
}
if (element instanceof ISourceReference) { if (element instanceof ISourceReference) {
ISourceReference reference = (ISourceReference) element; ISourceReference reference = (ISourceReference) element;
// set hightlight range // set hightlight range

View file

@ -756,6 +756,16 @@ public class PreferenceConstants {
*/ */
public static final String OUTLINE_GROUP_NAMESPACES= "org.eclipse.cdt.ui.outline.groupnamespaces"; //$NON-NLS-1$ public static final String OUTLINE_GROUP_NAMESPACES= "org.eclipse.cdt.ui.outline.groupnamespaces"; //$NON-NLS-1$
/**
* A named preference that controls whether the outline view
* selection should stay in sync with with the element at the current cursor position.
* <p>
* Value is of type <code>Boolean</code>.
* </p>
*/
public static final String OUTLINE_LINK_TO_EDITOR = "org.eclipse.cdt.ui.outline.linktoeditor"; //$NON-NLS-1$
/** /**
* A named preference that controls if the CView. * A named preference that controls if the CView.
* <p> * <p>