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.MenuManager;
import org.eclipse.jface.action.Separator;
import org.eclipse.jface.text.ITextSelection;
import org.eclipse.jface.viewers.AbstractTreeViewer;
import org.eclipse.jface.viewers.DoubleClickEvent;
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.navigator.LocalSelectionTransfer;
import org.eclipse.cdt.core.model.CModelException;
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.refactoring.actions.CRefactoringActionGroup;
import org.eclipse.cdt.ui.CUIPlugin;
@ -89,7 +94,8 @@ public class CContentOutlinePage extends Page implements IContentOutlinePage, IS
private Menu fMenu;
protected OpenIncludeAction fOpenIncludeAction;
private IncludeGroupingAction fIncludeGroupingAction;
private IncludeGroupingAction fIncludeGroupingAction;
private ToggleLinkingAction fToggleLinkingAction;
private MemberFilterActionGroup fMemberFilterActionGroup;
@ -110,7 +116,8 @@ public class CContentOutlinePage extends Page implements IContentOutlinePage, IS
super(ActionMessages.getString("IncludesGroupingAction.label")); //$NON-NLS-1$
setDescription(ActionMessages.getString("IncludesGroupingAction.description")); //$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);
boolean enabled= isIncludesGroupingEnabled();
@ -151,24 +158,27 @@ public class CContentOutlinePage extends Page implements IContentOutlinePage, IS
* @param outlinePage the Java outline page
*/
public ToggleLinkingAction(CContentOutlinePage outlinePage) {
//boolean isLinkingEnabled= PreferenceConstants.getPreferenceStore().getBoolean(PreferenceConstants.EDITOR_SYNC_OUTLINE_ON_CURSOR_MOVE);
boolean isLinkingEnabled= true;
setChecked(isLinkingEnabled);
fOutlinePage= outlinePage;
setChecked(isLinkingEnabled());
fOutlinePage = outlinePage;
}
/**
* Runs the action.
*/
public void run() {
//TODO synchronize selection with editor
//PreferenceConstants.getPreferenceStore().setValue(PreferenceConstants.EDITOR_SYNC_OUTLINE_ON_CURSOR_MOVE, isChecked());
//if (isChecked() && fEditor != null)
// fEditor.synchronizeOutlinePage(fEditor.computeHighlightRangeSourceReference(), false);
boolean checked = isChecked();
PreferenceConstants.getPreferenceStore().setValue(PreferenceConstants.OUTLINE_LINK_TO_EDITOR, checked);
if (checked && fEditor != null)
synchronizeSelectionWithEditor();
}
}
public boolean isLinkingEnabled() {
return PreferenceConstants.getPreferenceStore().getBoolean(PreferenceConstants.OUTLINE_LINK_TO_EDITOR);
}
public CContentOutlinePage(CEditor editor) {
this("#TranslationUnitOutlinerContext", editor); //$NON-NLS-1$
}
@ -232,6 +242,60 @@ public class CContentOutlinePage extends Page implements IContentOutlinePage, IS
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
*/
@ -387,8 +451,8 @@ public class CContentOutlinePage extends Page implements IContentOutlinePage, IS
IMenuManager menu= actionBars.getMenuManager();
menu.add(new Separator("EndFilterGroup")); //$NON-NLS-1$
//fToggleLinkingAction= new ToggleLinkingAction(this);
//menu.add(fToggleLinkingAction);
fToggleLinkingAction= new ToggleLinkingAction(this);
menu.add(fToggleLinkingAction);
fIncludeGroupingAction= new IncludeGroupingAction(this);
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
*/
@ -1839,9 +1839,27 @@ public class CEditor extends TextEditor implements ISelectionChangedListener, IR
if (getSelectionProvider() == null)
return;
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)
*/
public void selectionChanged(SelectionChangedEvent event) {
@ -1867,15 +1885,6 @@ public class CEditor extends TextEditor implements ISelectionChangedListener, IR
* @param element Element to select.
*/
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) {
ISourceReference reference = (ISourceReference) element;
// 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$
/**
* 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.
* <p>