mirror of
https://github.com/eclipse-cdt/cdt
synced 2025-08-09 09:15:38 +02:00
Fix for 206288: Provide outline view for assembly files
This commit is contained in:
parent
18fa1c4fc2
commit
50fd24cadc
13 changed files with 1238 additions and 672 deletions
BIN
core/org.eclipse.cdt.ui/icons/obj16/label_obj.gif
Normal file
BIN
core/org.eclipse.cdt.ui/icons/obj16/label_obj.gif
Normal file
Binary file not shown.
After Width: | Height: | Size: 868 B |
|
@ -131,7 +131,7 @@
|
||||||
class="org.eclipse.cdt.internal.ui.filters.NonCElementFilter"
|
class="org.eclipse.cdt.internal.ui.filters.NonCElementFilter"
|
||||||
id="org.eclipse.cdt.internal.ui.CView.NonCElementFilter">
|
id="org.eclipse.cdt.internal.ui.CView.NonCElementFilter">
|
||||||
</filter>
|
</filter>
|
||||||
<!-- Outline Page -->
|
<!-- C/C++ Outline Page -->
|
||||||
<filter
|
<filter
|
||||||
targetId="org.eclipse.cdt.ui.COutlinePage"
|
targetId="org.eclipse.cdt.ui.COutlinePage"
|
||||||
name="%HideUsingDirective.label"
|
name="%HideUsingDirective.label"
|
||||||
|
@ -148,6 +148,15 @@
|
||||||
class="org.eclipse.cdt.internal.ui.filters.MacroDirectiveFilter"
|
class="org.eclipse.cdt.internal.ui.filters.MacroDirectiveFilter"
|
||||||
id="org.eclipse.cdt.ui.COutlinePage.MacroDirectiveFilter">
|
id="org.eclipse.cdt.ui.COutlinePage.MacroDirectiveFilter">
|
||||||
</filter>
|
</filter>
|
||||||
|
<!-- Asm Outline Page -->
|
||||||
|
<filter
|
||||||
|
targetId="org.eclipse.cdt.ui.AsmOutlinePage"
|
||||||
|
name="%HideMacroDirective.label"
|
||||||
|
enabled="false"
|
||||||
|
description="%HideMacroDirective.description"
|
||||||
|
class="org.eclipse.cdt.internal.ui.filters.MacroDirectiveFilter"
|
||||||
|
id="org.eclipse.cdt.ui.AsmOutlinePage.MacroDirectiveFilter">
|
||||||
|
</filter>
|
||||||
</extension>
|
</extension>
|
||||||
<extension
|
<extension
|
||||||
point="org.eclipse.cdt.ui.textHovers">
|
point="org.eclipse.cdt.ui.textHovers">
|
||||||
|
|
|
@ -81,6 +81,7 @@ public class CPluginImages {
|
||||||
public static final String IMG_OBJS_VAR_DECLARATION= NAME_PREFIX + "var_declaration_obj.gif"; //$NON-NLS-1$
|
public static final String IMG_OBJS_VAR_DECLARATION= NAME_PREFIX + "var_declaration_obj.gif"; //$NON-NLS-1$
|
||||||
public static final String IMG_OBJS_INCLUDE= NAME_PREFIX + "include_obj.gif"; //$NON-NLS-1$
|
public static final String IMG_OBJS_INCLUDE= NAME_PREFIX + "include_obj.gif"; //$NON-NLS-1$
|
||||||
public static final String IMG_OBJS_MACRO= NAME_PREFIX + "define_obj.gif"; //$NON-NLS-1$
|
public static final String IMG_OBJS_MACRO= NAME_PREFIX + "define_obj.gif"; //$NON-NLS-1$
|
||||||
|
public static final String IMG_OBJS_LABEL= NAME_PREFIX + "label_obj.gif"; //$NON-NLS-1$
|
||||||
public static final String IMG_OBJS_TUNIT= NAME_PREFIX + "c_file_obj.gif"; //$NON-NLS-1$
|
public static final String IMG_OBJS_TUNIT= NAME_PREFIX + "c_file_obj.gif"; //$NON-NLS-1$
|
||||||
public static final String IMG_OBJS_TUNIT_HEADER= NAME_PREFIX + "h_file_obj.gif"; //$NON-NLS-1$
|
public static final String IMG_OBJS_TUNIT_HEADER= NAME_PREFIX + "h_file_obj.gif"; //$NON-NLS-1$
|
||||||
public static final String IMG_OBJS_TUNIT_ASM= NAME_PREFIX + "s_file_obj.gif"; //$NON-NLS-1$
|
public static final String IMG_OBJS_TUNIT_ASM= NAME_PREFIX + "s_file_obj.gif"; //$NON-NLS-1$
|
||||||
|
@ -161,6 +162,7 @@ public class CPluginImages {
|
||||||
public static final ImageDescriptor DESC_OBJS_VAR_DECLARARION= createManaged(T_OBJ, IMG_OBJS_VAR_DECLARATION);
|
public static final ImageDescriptor DESC_OBJS_VAR_DECLARARION= createManaged(T_OBJ, IMG_OBJS_VAR_DECLARATION);
|
||||||
public static final ImageDescriptor DESC_OBJS_INCLUDE= createManaged(T_OBJ, IMG_OBJS_INCLUDE);
|
public static final ImageDescriptor DESC_OBJS_INCLUDE= createManaged(T_OBJ, IMG_OBJS_INCLUDE);
|
||||||
public static final ImageDescriptor DESC_OBJS_MACRO= createManaged(T_OBJ, IMG_OBJS_MACRO);
|
public static final ImageDescriptor DESC_OBJS_MACRO= createManaged(T_OBJ, IMG_OBJS_MACRO);
|
||||||
|
public static final ImageDescriptor DESC_OBJS_LABEL= createManaged(T_OBJ, IMG_OBJS_LABEL);
|
||||||
public static final ImageDescriptor DESC_OBJS_TUNIT= createManaged(T_OBJ, IMG_OBJS_TUNIT);
|
public static final ImageDescriptor DESC_OBJS_TUNIT= createManaged(T_OBJ, IMG_OBJS_TUNIT);
|
||||||
public static final ImageDescriptor DESC_OBJS_TUNIT_HEADER= createManaged(T_OBJ, IMG_OBJS_TUNIT_HEADER);
|
public static final ImageDescriptor DESC_OBJS_TUNIT_HEADER= createManaged(T_OBJ, IMG_OBJS_TUNIT_HEADER);
|
||||||
public static final ImageDescriptor DESC_OBJS_TUNIT_ASM= createManaged(T_OBJ, IMG_OBJS_TUNIT_ASM);
|
public static final ImageDescriptor DESC_OBJS_TUNIT_ASM= createManaged(T_OBJ, IMG_OBJS_TUNIT_ASM);
|
||||||
|
|
|
@ -0,0 +1,563 @@
|
||||||
|
/*******************************************************************************
|
||||||
|
* Copyright (c) 2005, 2007 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
|
||||||
|
* http://www.eclipse.org/legal/epl-v10.html
|
||||||
|
*
|
||||||
|
* Contributors:
|
||||||
|
* IBM Corporation - initial API and implementation
|
||||||
|
* QNX Software System
|
||||||
|
* Markus Schorn (Wind River Systems)
|
||||||
|
* Anton Leherbauer (Wind River Systems)
|
||||||
|
*******************************************************************************/
|
||||||
|
package org.eclipse.cdt.internal.ui.editor;
|
||||||
|
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.Iterator;
|
||||||
|
|
||||||
|
import org.eclipse.core.runtime.ListenerList;
|
||||||
|
import org.eclipse.jface.action.Action;
|
||||||
|
import org.eclipse.jface.action.IMenuListener;
|
||||||
|
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;
|
||||||
|
import org.eclipse.jface.viewers.ISelection;
|
||||||
|
import org.eclipse.jface.viewers.ISelectionChangedListener;
|
||||||
|
import org.eclipse.jface.viewers.IStructuredSelection;
|
||||||
|
import org.eclipse.jface.viewers.SelectionChangedEvent;
|
||||||
|
import org.eclipse.jface.viewers.StructuredSelection;
|
||||||
|
import org.eclipse.jface.viewers.TreeViewer;
|
||||||
|
import org.eclipse.swt.SWT;
|
||||||
|
import org.eclipse.swt.dnd.DND;
|
||||||
|
import org.eclipse.swt.dnd.Transfer;
|
||||||
|
import org.eclipse.swt.widgets.Composite;
|
||||||
|
import org.eclipse.swt.widgets.Control;
|
||||||
|
import org.eclipse.swt.widgets.Menu;
|
||||||
|
import org.eclipse.ui.IActionBars;
|
||||||
|
import org.eclipse.ui.IWorkbenchActionConstants;
|
||||||
|
import org.eclipse.ui.IWorkbenchPart;
|
||||||
|
import org.eclipse.ui.PlatformUI;
|
||||||
|
import org.eclipse.ui.actions.ActionContext;
|
||||||
|
import org.eclipse.ui.actions.ActionGroup;
|
||||||
|
import org.eclipse.ui.part.IPageSite;
|
||||||
|
import org.eclipse.ui.part.Page;
|
||||||
|
import org.eclipse.ui.texteditor.ITextEditor;
|
||||||
|
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.ITranslationUnit;
|
||||||
|
import org.eclipse.cdt.core.model.util.CElementBaseLabels;
|
||||||
|
import org.eclipse.cdt.ui.CUIPlugin;
|
||||||
|
import org.eclipse.cdt.ui.PreferenceConstants;
|
||||||
|
import org.eclipse.cdt.ui.actions.OpenViewActionGroup;
|
||||||
|
|
||||||
|
import org.eclipse.cdt.internal.ui.CPluginImages;
|
||||||
|
import org.eclipse.cdt.internal.ui.ICHelpContextIds;
|
||||||
|
import org.eclipse.cdt.internal.ui.IContextMenuConstants;
|
||||||
|
import org.eclipse.cdt.internal.ui.actions.AbstractToggleLinkingAction;
|
||||||
|
import org.eclipse.cdt.internal.ui.actions.ActionMessages;
|
||||||
|
import org.eclipse.cdt.internal.ui.cview.SelectionTransferDragAdapter;
|
||||||
|
import org.eclipse.cdt.internal.ui.cview.SelectionTransferDropAdapter;
|
||||||
|
import org.eclipse.cdt.internal.ui.dnd.CDTViewerDragAdapter;
|
||||||
|
import org.eclipse.cdt.internal.ui.dnd.DelegatingDropAdapter;
|
||||||
|
import org.eclipse.cdt.internal.ui.dnd.TransferDragSourceListener;
|
||||||
|
import org.eclipse.cdt.internal.ui.dnd.TransferDropTargetListener;
|
||||||
|
import org.eclipse.cdt.internal.ui.search.actions.SelectionSearchGroup;
|
||||||
|
import org.eclipse.cdt.internal.ui.util.ProblemTreeViewer;
|
||||||
|
import org.eclipse.cdt.internal.ui.viewsupport.AppearanceAwareLabelProvider;
|
||||||
|
import org.eclipse.cdt.internal.ui.viewsupport.DecoratingCLabelProvider;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Abstract outline page based on CModel.
|
||||||
|
*
|
||||||
|
* @since 5.0
|
||||||
|
*/
|
||||||
|
public abstract class AbstractCModelOutlinePage extends Page implements IContentOutlinePage, ISelectionChangedListener {
|
||||||
|
|
||||||
|
protected static class IncludeGroupingAction extends Action {
|
||||||
|
AbstractCModelOutlinePage fOutLinePage;
|
||||||
|
|
||||||
|
public IncludeGroupingAction(AbstractCModelOutlinePage outlinePage) {
|
||||||
|
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, CPluginImages.IMG_MENU_GROUP_INCLUDE);
|
||||||
|
|
||||||
|
boolean enabled= isIncludesGroupingEnabled();
|
||||||
|
setChecked(enabled);
|
||||||
|
fOutLinePage = outlinePage;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Runs the action.
|
||||||
|
*/
|
||||||
|
public void run() {
|
||||||
|
boolean oldValue = isIncludesGroupingEnabled();
|
||||||
|
PreferenceConstants.getPreferenceStore().setValue(PreferenceConstants.OUTLINE_GROUP_INCLUDES, isChecked());
|
||||||
|
if (oldValue != isChecked()) {
|
||||||
|
fOutLinePage.contentUpdated();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean isIncludesGroupingEnabled () {
|
||||||
|
return PreferenceConstants.getPreferenceStore().getBoolean(PreferenceConstants.OUTLINE_GROUP_INCLUDES);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* This action toggles whether this C Outline page links
|
||||||
|
* its selection to the active editor.
|
||||||
|
*
|
||||||
|
* @since 3.0
|
||||||
|
*/
|
||||||
|
public class ToggleLinkingAction extends AbstractToggleLinkingAction {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Constructs a new action.
|
||||||
|
*/
|
||||||
|
public ToggleLinkingAction() {
|
||||||
|
setChecked(isLinkingEnabled());
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Runs the action.
|
||||||
|
*/
|
||||||
|
public void run() {
|
||||||
|
boolean checked = isChecked();
|
||||||
|
PreferenceConstants.getPreferenceStore().setValue(PreferenceConstants.OUTLINE_LINK_TO_EDITOR, checked);
|
||||||
|
if (checked && fEditor != null)
|
||||||
|
synchronizeSelectionWithEditor();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private static final int TEXT_FLAGS = AppearanceAwareLabelProvider.DEFAULT_TEXTFLAGS | CElementBaseLabels.F_APP_TYPE_SIGNATURE | CElementBaseLabels.M_APP_RETURNTYPE;
|
||||||
|
private static final int IMAGE_FLAGS = AppearanceAwareLabelProvider.DEFAULT_IMAGEFLAGS;
|
||||||
|
protected ITextEditor fEditor;
|
||||||
|
protected ITranslationUnit fInput;
|
||||||
|
private ProblemTreeViewer fTreeViewer;
|
||||||
|
private ListenerList fSelectionChangedListeners = new ListenerList(ListenerList.IDENTITY);
|
||||||
|
protected TogglePresentationAction fTogglePresentation;
|
||||||
|
protected String fContextMenuId;
|
||||||
|
private Menu fMenu;
|
||||||
|
protected OpenIncludeAction fOpenIncludeAction;
|
||||||
|
private IncludeGroupingAction fIncludeGroupingAction;
|
||||||
|
private ToggleLinkingAction fToggleLinkingAction;
|
||||||
|
private ActionGroup fMemberFilterActionGroup;
|
||||||
|
private SelectionSearchGroup fSelectionSearchGroup;
|
||||||
|
private ActionGroup fRefactoringActionGroup;
|
||||||
|
private OpenViewActionGroup fOpenViewActionGroup;
|
||||||
|
/**
|
||||||
|
* Custom filter action group.
|
||||||
|
* @since 3.0
|
||||||
|
*/
|
||||||
|
private ActionGroup fCustomFiltersActionGroup;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Create a new outline page for the given editor.
|
||||||
|
* @param contextMenuId The id of this page's context menu
|
||||||
|
* @param editor the editor associated with this outline page
|
||||||
|
*/
|
||||||
|
public AbstractCModelOutlinePage(String contextMenuId, ITextEditor editor) {
|
||||||
|
super();
|
||||||
|
fEditor= editor;
|
||||||
|
fInput= null;
|
||||||
|
fContextMenuId= contextMenuId;
|
||||||
|
|
||||||
|
fTogglePresentation= new TogglePresentationAction();
|
||||||
|
fTogglePresentation.setEditor(editor);
|
||||||
|
|
||||||
|
fOpenIncludeAction= new OpenIncludeAction(this);
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean isLinkingEnabled() {
|
||||||
|
return PreferenceConstants.getPreferenceStore().getBoolean(PreferenceConstants.OUTLINE_LINK_TO_EDITOR);
|
||||||
|
}
|
||||||
|
|
||||||
|
public ICElement getRoot() {
|
||||||
|
return fInput;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Called by the editor to signal that the content has updated.
|
||||||
|
*/
|
||||||
|
public void contentUpdated() {
|
||||||
|
if (fInput != null) {
|
||||||
|
final TreeViewer treeViewer= getTreeViewer();
|
||||||
|
if (treeViewer != null && !treeViewer.getControl().isDisposed()) {
|
||||||
|
treeViewer.getControl().getDisplay().asyncExec(new Runnable() {
|
||||||
|
public void run() {
|
||||||
|
if (!treeViewer.getControl().isDisposed()) {
|
||||||
|
ISelection sel= treeViewer.getSelection();
|
||||||
|
treeViewer.setSelection(updateSelection(sel));
|
||||||
|
treeViewer.refresh();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
protected ISelection updateSelection(ISelection sel) {
|
||||||
|
ArrayList newSelection= new ArrayList();
|
||||||
|
if (sel instanceof IStructuredSelection) {
|
||||||
|
Iterator iter= ((IStructuredSelection)sel).iterator();
|
||||||
|
for (;iter.hasNext();) {
|
||||||
|
//ICElement elem= fInput.findEqualMember((ICElement)iter.next());
|
||||||
|
Object o = iter.next();
|
||||||
|
if (o instanceof ICElement) {
|
||||||
|
newSelection.add(o);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return new StructuredSelection(newSelection);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Sets the selected element to the one at the current cursor position 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 = fInput.getElementAtOffset(offset);
|
||||||
|
} catch (CModelException e) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (editorElement != null) {
|
||||||
|
IStructuredSelection selection = new StructuredSelection(editorElement);
|
||||||
|
fTreeViewer.setSelection(selection, true);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* called to create the context menu of the outline
|
||||||
|
*/
|
||||||
|
protected void contextMenuAboutToShow(IMenuManager menu) {
|
||||||
|
CUIPlugin.createStandardGroups(menu);
|
||||||
|
|
||||||
|
ISelection selection= getSelection();
|
||||||
|
if (fOpenViewActionGroup != null && OpenViewActionGroup.canActionBeAdded(selection)){
|
||||||
|
fOpenViewActionGroup.fillContextMenu(menu);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (OpenIncludeAction.canActionBeAdded(selection)) {
|
||||||
|
menu.appendToGroup(IContextMenuConstants.GROUP_OPEN, fOpenIncludeAction);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (fSelectionSearchGroup != null && SelectionSearchGroup.canActionBeAdded(selection)){
|
||||||
|
fSelectionSearchGroup.fillContextMenu(menu);
|
||||||
|
menu.add(new Separator(IWorkbenchActionConstants.MB_ADDITIONS));
|
||||||
|
}
|
||||||
|
|
||||||
|
if (fRefactoringActionGroup != null) {
|
||||||
|
fRefactoringActionGroup.fillContextMenu(menu);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
protected CContentOutlinerProvider createContentProvider(TreeViewer viewer) {
|
||||||
|
IWorkbenchPart part= getSite().getPage().getActivePart();
|
||||||
|
if (part == null) {
|
||||||
|
return new CContentOutlinerProvider(viewer);
|
||||||
|
}
|
||||||
|
return new CContentOutlinerProvider(viewer, part.getSite());
|
||||||
|
}
|
||||||
|
|
||||||
|
protected ProblemTreeViewer createTreeViewer(Composite parent) {
|
||||||
|
fTreeViewer = new ProblemTreeViewer(parent, SWT.MULTI | SWT.H_SCROLL | SWT.V_SCROLL);
|
||||||
|
fTreeViewer.setContentProvider(createContentProvider(fTreeViewer));
|
||||||
|
fTreeViewer.setLabelProvider(new DecoratingCLabelProvider(new AppearanceAwareLabelProvider(TEXT_FLAGS, IMAGE_FLAGS), true));
|
||||||
|
fTreeViewer.setAutoExpandLevel(AbstractTreeViewer.ALL_LEVELS);
|
||||||
|
fTreeViewer.setUseHashlookup(true);
|
||||||
|
fTreeViewer.addSelectionChangedListener(this);
|
||||||
|
return fTreeViewer;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void createControl(Composite parent) {
|
||||||
|
fTreeViewer = createTreeViewer(parent);
|
||||||
|
initDragAndDrop();
|
||||||
|
|
||||||
|
MenuManager manager= new MenuManager(fContextMenuId);
|
||||||
|
manager.setRemoveAllWhenShown(true);
|
||||||
|
manager.addMenuListener(new IMenuListener() {
|
||||||
|
public void menuAboutToShow(IMenuManager manager) {
|
||||||
|
contextMenuAboutToShow(manager);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
Control control= fTreeViewer.getControl();
|
||||||
|
fMenu= manager.createContextMenu(control);
|
||||||
|
control.setMenu(fMenu);
|
||||||
|
|
||||||
|
fTreeViewer.addDoubleClickListener(new IDoubleClickListener() {
|
||||||
|
public void doubleClick(DoubleClickEvent event) {
|
||||||
|
if (fOpenIncludeAction != null) {
|
||||||
|
fOpenIncludeAction.run();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
// register global actions
|
||||||
|
IPageSite site= getSite();
|
||||||
|
site.registerContextMenu(fContextMenuId, manager, fTreeViewer);
|
||||||
|
site.setSelectionProvider(fTreeViewer);
|
||||||
|
|
||||||
|
IActionBars bars= site.getActionBars();
|
||||||
|
bars.setGlobalActionHandler(ITextEditorActionDefinitionIds.TOGGLE_SHOW_SELECTED_ELEMENT_ONLY, fTogglePresentation);
|
||||||
|
|
||||||
|
fSelectionSearchGroup = createSearchActionGroup();
|
||||||
|
fOpenViewActionGroup = createOpenViewActionGroup();
|
||||||
|
fRefactoringActionGroup= createRefactoringActionGroup();
|
||||||
|
// Custom filter group
|
||||||
|
fCustomFiltersActionGroup= createCustomFiltersActionGroup();
|
||||||
|
|
||||||
|
// Do this before setting input but after the initializations of the fields filtering
|
||||||
|
registerActionBars(bars);
|
||||||
|
|
||||||
|
fTreeViewer.setInput(fInput);
|
||||||
|
PlatformUI.getWorkbench().getHelpSystem().setHelp(control, ICHelpContextIds.COUTLINE_VIEW);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void dispose() {
|
||||||
|
if (fTreeViewer != null) {
|
||||||
|
fTreeViewer.removeSelectionChangedListener(this);
|
||||||
|
fTreeViewer= null;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (fTogglePresentation != null) {
|
||||||
|
fTogglePresentation.setEditor(null);
|
||||||
|
fTogglePresentation= null;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (fMemberFilterActionGroup != null) {
|
||||||
|
fMemberFilterActionGroup.dispose();
|
||||||
|
fMemberFilterActionGroup= null;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (fOpenViewActionGroup != null) {
|
||||||
|
fOpenViewActionGroup.dispose();
|
||||||
|
fOpenViewActionGroup= null;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (fRefactoringActionGroup != null) {
|
||||||
|
fRefactoringActionGroup.dispose();
|
||||||
|
fRefactoringActionGroup= null;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (fSelectionSearchGroup != null) {
|
||||||
|
fSelectionSearchGroup.dispose();
|
||||||
|
fSelectionSearchGroup= null;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (fCustomFiltersActionGroup != null) {
|
||||||
|
fCustomFiltersActionGroup.dispose();
|
||||||
|
fCustomFiltersActionGroup= null;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (fSelectionChangedListeners != null) {
|
||||||
|
fSelectionChangedListeners.clear();
|
||||||
|
// don't set the listeners to null, the outline page may be reused.
|
||||||
|
}
|
||||||
|
|
||||||
|
if (fMenu != null && !fMenu.isDisposed()) {
|
||||||
|
fMenu.dispose();
|
||||||
|
fMenu= null;
|
||||||
|
}
|
||||||
|
|
||||||
|
fInput= null;
|
||||||
|
|
||||||
|
super.dispose();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Register actions to the action bars.
|
||||||
|
*
|
||||||
|
* @param actionBars
|
||||||
|
*/
|
||||||
|
protected void registerActionBars(IActionBars actionBars) {
|
||||||
|
IToolBarManager toolBarManager= actionBars.getToolBarManager();
|
||||||
|
|
||||||
|
LexicalSortingAction action= new LexicalSortingAction(getTreeViewer());
|
||||||
|
toolBarManager.add(action);
|
||||||
|
|
||||||
|
fMemberFilterActionGroup= createMemberFilterActionGroup();
|
||||||
|
if (fMemberFilterActionGroup != null) {
|
||||||
|
fMemberFilterActionGroup.fillActionBars(actionBars);
|
||||||
|
}
|
||||||
|
if (fCustomFiltersActionGroup != null) {
|
||||||
|
fCustomFiltersActionGroup.fillActionBars(actionBars);
|
||||||
|
}
|
||||||
|
if (fOpenViewActionGroup != null) {
|
||||||
|
fOpenViewActionGroup.fillActionBars(actionBars);
|
||||||
|
}
|
||||||
|
if (fRefactoringActionGroup != null) {
|
||||||
|
fRefactoringActionGroup.fillActionBars(actionBars);
|
||||||
|
}
|
||||||
|
|
||||||
|
IMenuManager menu= actionBars.getMenuManager();
|
||||||
|
menu.add(new Separator("EndFilterGroup")); //$NON-NLS-1$
|
||||||
|
|
||||||
|
fToggleLinkingAction= new ToggleLinkingAction();
|
||||||
|
menu.add(fToggleLinkingAction);
|
||||||
|
fIncludeGroupingAction= new IncludeGroupingAction(this);
|
||||||
|
menu.add(fIncludeGroupingAction);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* return an ActionGroup contributing search actions or
|
||||||
|
* <code>null</code> if search is not supported
|
||||||
|
*/
|
||||||
|
protected SelectionSearchGroup createSearchActionGroup() {
|
||||||
|
// default: no search action group
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return an OpenViewActionGroup contributing open view actions or
|
||||||
|
* <code>null</code> if open view actions are not wanted
|
||||||
|
*/
|
||||||
|
protected OpenViewActionGroup createOpenViewActionGroup() {
|
||||||
|
// default: no open view action group
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return an ActionGroup contributing refactoring actions or
|
||||||
|
* <code>null</code> if refactoring is not supported
|
||||||
|
*/
|
||||||
|
protected ActionGroup createRefactoringActionGroup() {
|
||||||
|
// default: no refactoring actions
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return an ActionGroup instance to provide custom filters or
|
||||||
|
* <code>null</code> if this action group is not wanted
|
||||||
|
*/
|
||||||
|
protected ActionGroup createCustomFiltersActionGroup() {
|
||||||
|
// default: no custom filters
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return an ActionGroup contributing member filters or <code>null</code>
|
||||||
|
* if member filters are not wanted
|
||||||
|
*/
|
||||||
|
protected ActionGroup createMemberFilterActionGroup() {
|
||||||
|
// default: no member filters
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void addSelectionChangedListener(ISelectionChangedListener listener) {
|
||||||
|
fSelectionChangedListeners.add(listener);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Fires a selection changed event.
|
||||||
|
*
|
||||||
|
* @param selection the new selection
|
||||||
|
*/
|
||||||
|
protected void fireSelectionChanged(ISelection selection) {
|
||||||
|
// create an event
|
||||||
|
SelectionChangedEvent event = new SelectionChangedEvent(this, selection);
|
||||||
|
|
||||||
|
// fire the event
|
||||||
|
Object[] listeners = fSelectionChangedListeners.getListeners();
|
||||||
|
for (int i = 0; i < listeners.length; ++i) {
|
||||||
|
((ISelectionChangedListener) listeners[i]).selectionChanged(event);
|
||||||
|
}
|
||||||
|
if (fRefactoringActionGroup != null) {
|
||||||
|
fRefactoringActionGroup.setContext(new ActionContext(selection));
|
||||||
|
fRefactoringActionGroup.updateActionBars();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public Control getControl() {
|
||||||
|
if (fTreeViewer == null)
|
||||||
|
return null;
|
||||||
|
return fTreeViewer.getControl();
|
||||||
|
}
|
||||||
|
|
||||||
|
public ISelection getSelection() {
|
||||||
|
if (fTreeViewer == null)
|
||||||
|
return StructuredSelection.EMPTY;
|
||||||
|
return fTreeViewer.getSelection();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns this page's tree viewer.
|
||||||
|
*
|
||||||
|
* @return this page's tree viewer, or <code>null</code> if
|
||||||
|
* <code>createControl</code> has not been called yet
|
||||||
|
*/
|
||||||
|
protected TreeViewer getTreeViewer() {
|
||||||
|
return fTreeViewer;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void removeSelectionChangedListener(ISelectionChangedListener listener) {
|
||||||
|
fSelectionChangedListeners.remove(listener);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void selectionChanged(SelectionChangedEvent event) {
|
||||||
|
fireSelectionChanged(event.getSelection());
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Sets focus to a part in the page.
|
||||||
|
*/
|
||||||
|
public void setFocus() {
|
||||||
|
fTreeViewer.getControl().setFocus();
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setSelection(ISelection selection) {
|
||||||
|
if (fTreeViewer != null)
|
||||||
|
fTreeViewer.setSelection(selection);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Set the current input to the content provider.
|
||||||
|
* @param unit
|
||||||
|
*/
|
||||||
|
public void setInput(ITranslationUnit unit) {
|
||||||
|
fInput = unit;
|
||||||
|
if (fTreeViewer != null) {
|
||||||
|
fTreeViewer.setInput (fInput);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void initDragAndDrop() {
|
||||||
|
int ops= DND.DROP_COPY | DND.DROP_MOVE | DND.DROP_LINK;
|
||||||
|
Transfer[] transfers= new Transfer[] {
|
||||||
|
LocalSelectionTransfer.getInstance()
|
||||||
|
};
|
||||||
|
|
||||||
|
// Drop Adapter
|
||||||
|
TransferDropTargetListener[] dropListeners= new TransferDropTargetListener[] {
|
||||||
|
new SelectionTransferDropAdapter(fTreeViewer)
|
||||||
|
};
|
||||||
|
fTreeViewer.addDropSupport(ops | DND.DROP_DEFAULT, transfers, new DelegatingDropAdapter(dropListeners));
|
||||||
|
|
||||||
|
// Drag Adapter
|
||||||
|
TransferDragSourceListener[] dragListeners= new TransferDragSourceListener[] {
|
||||||
|
new SelectionTransferDragAdapter(fTreeViewer)
|
||||||
|
};
|
||||||
|
fTreeViewer.addDragSupport(ops, transfers, new CDTViewerDragAdapter(fTreeViewer, dragListeners));
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -13,185 +13,23 @@
|
||||||
*******************************************************************************/
|
*******************************************************************************/
|
||||||
package org.eclipse.cdt.internal.ui.editor;
|
package org.eclipse.cdt.internal.ui.editor;
|
||||||
|
|
||||||
import java.util.ArrayList;
|
|
||||||
import java.util.Iterator;
|
|
||||||
|
|
||||||
import org.eclipse.core.runtime.ListenerList;
|
|
||||||
import org.eclipse.jface.action.Action;
|
|
||||||
import org.eclipse.jface.action.IMenuListener;
|
|
||||||
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;
|
|
||||||
import org.eclipse.jface.viewers.ISelection;
|
|
||||||
import org.eclipse.jface.viewers.ISelectionChangedListener;
|
|
||||||
import org.eclipse.jface.viewers.IStructuredSelection;
|
|
||||||
import org.eclipse.jface.viewers.SelectionChangedEvent;
|
|
||||||
import org.eclipse.jface.viewers.StructuredSelection;
|
|
||||||
import org.eclipse.jface.viewers.TreeViewer;
|
|
||||||
import org.eclipse.swt.SWT;
|
|
||||||
import org.eclipse.swt.dnd.DND;
|
|
||||||
import org.eclipse.swt.dnd.Transfer;
|
|
||||||
import org.eclipse.swt.widgets.Composite;
|
|
||||||
import org.eclipse.swt.widgets.Control;
|
|
||||||
import org.eclipse.swt.widgets.Menu;
|
|
||||||
import org.eclipse.ui.IActionBars;
|
|
||||||
import org.eclipse.ui.IWorkbenchActionConstants;
|
|
||||||
import org.eclipse.ui.IWorkbenchPart;
|
|
||||||
import org.eclipse.ui.PlatformUI;
|
|
||||||
import org.eclipse.ui.actions.ActionContext;
|
|
||||||
import org.eclipse.ui.actions.ActionGroup;
|
import org.eclipse.ui.actions.ActionGroup;
|
||||||
import org.eclipse.ui.part.IPageSite;
|
|
||||||
import org.eclipse.ui.part.Page;
|
|
||||||
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.ITranslationUnit;
|
|
||||||
import org.eclipse.cdt.core.model.util.CElementBaseLabels;
|
|
||||||
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.PreferenceConstants;
|
|
||||||
import org.eclipse.cdt.ui.actions.CustomFiltersActionGroup;
|
import org.eclipse.cdt.ui.actions.CustomFiltersActionGroup;
|
||||||
import org.eclipse.cdt.ui.actions.MemberFilterActionGroup;
|
import org.eclipse.cdt.ui.actions.MemberFilterActionGroup;
|
||||||
import org.eclipse.cdt.ui.actions.OpenViewActionGroup;
|
import org.eclipse.cdt.ui.actions.OpenViewActionGroup;
|
||||||
|
|
||||||
import org.eclipse.cdt.internal.ui.CPluginImages;
|
|
||||||
import org.eclipse.cdt.internal.ui.ICHelpContextIds;
|
|
||||||
import org.eclipse.cdt.internal.ui.IContextMenuConstants;
|
|
||||||
import org.eclipse.cdt.internal.ui.actions.AbstractToggleLinkingAction;
|
|
||||||
import org.eclipse.cdt.internal.ui.actions.ActionMessages;
|
|
||||||
import org.eclipse.cdt.internal.ui.cview.SelectionTransferDragAdapter;
|
|
||||||
import org.eclipse.cdt.internal.ui.cview.SelectionTransferDropAdapter;
|
|
||||||
import org.eclipse.cdt.internal.ui.dnd.CDTViewerDragAdapter;
|
|
||||||
import org.eclipse.cdt.internal.ui.dnd.DelegatingDropAdapter;
|
|
||||||
import org.eclipse.cdt.internal.ui.dnd.TransferDragSourceListener;
|
|
||||||
import org.eclipse.cdt.internal.ui.dnd.TransferDropTargetListener;
|
|
||||||
import org.eclipse.cdt.internal.ui.search.actions.SelectionSearchGroup;
|
import org.eclipse.cdt.internal.ui.search.actions.SelectionSearchGroup;
|
||||||
import org.eclipse.cdt.internal.ui.util.ProblemTreeViewer;
|
|
||||||
import org.eclipse.cdt.internal.ui.viewsupport.AppearanceAwareLabelProvider;
|
|
||||||
import org.eclipse.cdt.internal.ui.viewsupport.DecoratingCLabelProvider;
|
|
||||||
|
|
||||||
public class CContentOutlinePage extends Page implements IContentOutlinePage, ISelectionChangedListener {
|
|
||||||
private static final int TEXT_FLAGS = AppearanceAwareLabelProvider.DEFAULT_TEXTFLAGS | CElementBaseLabels.F_APP_TYPE_SIGNATURE | CElementBaseLabels.M_APP_RETURNTYPE;
|
|
||||||
private static final int IMAGE_FLAGS = AppearanceAwareLabelProvider.DEFAULT_IMAGEFLAGS;
|
|
||||||
|
|
||||||
private CEditor fEditor;
|
/**
|
||||||
private ITranslationUnit fInput;
|
* Outline page for C/C++ translation units.
|
||||||
private ProblemTreeViewer fTreeViewer;
|
|
||||||
private ListenerList selectionChangedListeners = new ListenerList(ListenerList.IDENTITY);
|
|
||||||
private TogglePresentationAction fTogglePresentation;
|
|
||||||
private String fContextMenuId;
|
|
||||||
private Menu fMenu;
|
|
||||||
|
|
||||||
protected OpenIncludeAction fOpenIncludeAction;
|
|
||||||
private IncludeGroupingAction fIncludeGroupingAction;
|
|
||||||
private ToggleLinkingAction fToggleLinkingAction;
|
|
||||||
|
|
||||||
private MemberFilterActionGroup fMemberFilterActionGroup;
|
|
||||||
|
|
||||||
private ActionGroup fSelectionSearchGroup;
|
|
||||||
private OpenViewActionGroup fOpenViewActionGroup;
|
|
||||||
private ActionGroup fRefactoringActionGroup;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Custom filter action group.
|
|
||||||
* @since 3.0
|
|
||||||
*/
|
*/
|
||||||
private CustomFiltersActionGroup fCustomFiltersActionGroup;
|
public class CContentOutlinePage extends AbstractCModelOutlinePage {
|
||||||
|
|
||||||
public class IncludeGroupingAction extends Action {
|
|
||||||
CContentOutlinePage outLine;
|
|
||||||
|
|
||||||
public IncludeGroupingAction(CContentOutlinePage outlinePage) {
|
|
||||||
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, CPluginImages.IMG_MENU_GROUP_INCLUDE);
|
|
||||||
|
|
||||||
boolean enabled= isIncludesGroupingEnabled();
|
|
||||||
setChecked(enabled);
|
|
||||||
outLine = outlinePage;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Runs the action.
|
|
||||||
*/
|
|
||||||
public void run() {
|
|
||||||
boolean oldValue = isIncludesGroupingEnabled();
|
|
||||||
PreferenceConstants.getPreferenceStore().setValue(PreferenceConstants.OUTLINE_GROUP_INCLUDES, isChecked());
|
|
||||||
if (oldValue != isChecked()) {
|
|
||||||
outLine.contentUpdated();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public boolean isIncludesGroupingEnabled () {
|
|
||||||
return PreferenceConstants.getPreferenceStore().getBoolean(PreferenceConstants.OUTLINE_GROUP_INCLUDES);
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* This action toggles whether this C Outline page links
|
|
||||||
* its selection to the active editor.
|
|
||||||
*
|
|
||||||
* @since 3.0
|
|
||||||
*/
|
|
||||||
public class ToggleLinkingAction extends AbstractToggleLinkingAction {
|
|
||||||
|
|
||||||
CContentOutlinePage fOutlinePage;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Constructs a new action.
|
|
||||||
*
|
|
||||||
* @param outlinePage the Java outline page
|
|
||||||
*/
|
|
||||||
public ToggleLinkingAction(CContentOutlinePage outlinePage) {
|
|
||||||
setChecked(isLinkingEnabled());
|
|
||||||
fOutlinePage = outlinePage;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Runs the action.
|
|
||||||
*/
|
|
||||||
public void run() {
|
|
||||||
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) {
|
public CContentOutlinePage(CEditor editor) {
|
||||||
this("#TranslationUnitOutlinerContext", editor); //$NON-NLS-1$
|
super("#TranslationUnitOutlinerContext", editor); //$NON-NLS-1$
|
||||||
}
|
|
||||||
|
|
||||||
public CContentOutlinePage(String contextMenuID, CEditor editor) {
|
|
||||||
super();
|
|
||||||
fEditor= editor;
|
|
||||||
fInput= null;
|
|
||||||
fContextMenuId = contextMenuID;
|
|
||||||
|
|
||||||
fTogglePresentation= new TogglePresentationAction();
|
|
||||||
fTogglePresentation.setEditor(editor);
|
|
||||||
|
|
||||||
fOpenIncludeAction= new OpenIncludeAction(this);
|
|
||||||
}
|
|
||||||
|
|
||||||
public ICElement getRoot() {
|
|
||||||
return fInput;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -199,345 +37,29 @@ public class CContentOutlinePage extends Page implements IContentOutlinePage, IS
|
||||||
* @returns the CEditor corresponding to this CContentOutlinePage.
|
* @returns the CEditor corresponding to this CContentOutlinePage.
|
||||||
*/
|
*/
|
||||||
public CEditor getEditor() {
|
public CEditor getEditor() {
|
||||||
return fEditor;
|
return (CEditor)fEditor;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
protected SelectionSearchGroup createSearchActionGroup() {
|
||||||
* Called by the editor to signal that the content has updated.
|
return new SelectionSearchGroup(this);
|
||||||
*/
|
|
||||||
public void contentUpdated() {
|
|
||||||
if (fInput != null) {
|
|
||||||
final TreeViewer treeViewer= getTreeViewer();
|
|
||||||
if (treeViewer != null && !treeViewer.getControl().isDisposed()) {
|
|
||||||
treeViewer.getControl().getDisplay().asyncExec(new Runnable() {
|
|
||||||
public void run() {
|
|
||||||
if (!treeViewer.getControl().isDisposed()) {
|
|
||||||
ISelection sel= treeViewer.getSelection();
|
|
||||||
treeViewer.setSelection(updateSelection(sel));
|
|
||||||
treeViewer.refresh();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
protected ISelection updateSelection(ISelection sel) {
|
protected OpenViewActionGroup createOpenViewActionGroup() {
|
||||||
ArrayList newSelection= new ArrayList();
|
OpenViewActionGroup ovag= new OpenViewActionGroup(this);
|
||||||
if (sel instanceof IStructuredSelection) {
|
ovag.setEnableIncludeBrowser(true);
|
||||||
Iterator iter= ((IStructuredSelection)sel).iterator();
|
return ovag;
|
||||||
for (;iter.hasNext();) {
|
|
||||||
//ICElement elem= fInput.findEqualMember((ICElement)iter.next());
|
|
||||||
Object o = iter.next();
|
|
||||||
if (o instanceof ICElement) {
|
|
||||||
newSelection.add(o);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return new StructuredSelection(newSelection);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
protected ActionGroup createRefactoringActionGroup() {
|
||||||
/**
|
return new CRefactoringActionGroup(this);
|
||||||
* Sets the selected element to the one at the current cursor position 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 = fInput.getElementAtOffset(offset);
|
|
||||||
} catch (CModelException e) {
|
|
||||||
return;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (editorElement != null) {
|
protected ActionGroup createCustomFiltersActionGroup() {
|
||||||
IStructuredSelection selection = new StructuredSelection(editorElement);
|
return new CustomFiltersActionGroup("org.eclipse.cdt.ui.COutlinePage", getTreeViewer()); //$NON-NLS-1$
|
||||||
fTreeViewer.setSelection(selection, true);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
protected ActionGroup createMemberFilterActionGroup() {
|
||||||
* called to create the context menu of the outline
|
return new MemberFilterActionGroup(getTreeViewer(), "COutlineViewer"); //$NON-NLS-1$
|
||||||
*/
|
|
||||||
protected void contextMenuAboutToShow(IMenuManager menu) {
|
|
||||||
CUIPlugin.createStandardGroups(menu);
|
|
||||||
|
|
||||||
ISelection selection= getSelection();
|
|
||||||
if (OpenViewActionGroup.canActionBeAdded(selection)){
|
|
||||||
fOpenViewActionGroup.fillContextMenu(menu);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (OpenIncludeAction.canActionBeAdded(selection)) {
|
|
||||||
menu.appendToGroup(IContextMenuConstants.GROUP_OPEN, fOpenIncludeAction);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (SelectionSearchGroup.canActionBeAdded(selection)){
|
|
||||||
fSelectionSearchGroup.fillContextMenu(menu);
|
|
||||||
menu.add(new Separator(IWorkbenchActionConstants.MB_ADDITIONS));
|
|
||||||
}
|
|
||||||
|
|
||||||
fRefactoringActionGroup.fillContextMenu(menu);
|
|
||||||
}
|
|
||||||
|
|
||||||
protected CContentOutlinerProvider createContentProvider(TreeViewer viewer) {
|
|
||||||
IWorkbenchPart part= getSite().getPage().getActivePart();
|
|
||||||
if (part == null) {
|
|
||||||
return new CContentOutlinerProvider(viewer);
|
|
||||||
}
|
|
||||||
return new CContentOutlinerProvider(viewer, part.getSite());
|
|
||||||
}
|
|
||||||
|
|
||||||
protected ProblemTreeViewer createTreeViewer(Composite parent) {
|
|
||||||
fTreeViewer = new ProblemTreeViewer(parent, SWT.MULTI | SWT.H_SCROLL | SWT.V_SCROLL);
|
|
||||||
fTreeViewer.setContentProvider(createContentProvider(fTreeViewer));
|
|
||||||
fTreeViewer.setLabelProvider(new DecoratingCLabelProvider(new AppearanceAwareLabelProvider(TEXT_FLAGS, IMAGE_FLAGS), true));
|
|
||||||
fTreeViewer.setAutoExpandLevel(AbstractTreeViewer.ALL_LEVELS);
|
|
||||||
fTreeViewer.setUseHashlookup(true);
|
|
||||||
fTreeViewer.addSelectionChangedListener(this);
|
|
||||||
return fTreeViewer;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* (non-Javadoc)
|
|
||||||
* @see org.eclipse.ui.part.IPage#createControl(org.eclipse.swt.widgets.Composite)
|
|
||||||
*/
|
|
||||||
public void createControl(Composite parent) {
|
|
||||||
fTreeViewer = createTreeViewer(parent);
|
|
||||||
initDragAndDrop();
|
|
||||||
|
|
||||||
MenuManager manager= new MenuManager(fContextMenuId);
|
|
||||||
manager.setRemoveAllWhenShown(true);
|
|
||||||
manager.addMenuListener(new IMenuListener() {
|
|
||||||
public void menuAboutToShow(IMenuManager manager) {
|
|
||||||
contextMenuAboutToShow(manager);
|
|
||||||
}
|
|
||||||
});
|
|
||||||
Control control= fTreeViewer.getControl();
|
|
||||||
fMenu= manager.createContextMenu(control);
|
|
||||||
control.setMenu(fMenu);
|
|
||||||
|
|
||||||
fTreeViewer.addDoubleClickListener(new IDoubleClickListener() {
|
|
||||||
/* (non-Javadoc)
|
|
||||||
* @see org.eclipse.jface.viewers.IDoubleClickListener#doubleClick(org.eclipse.jface.viewers.DoubleClickEvent)
|
|
||||||
*/
|
|
||||||
public void doubleClick(DoubleClickEvent event) {
|
|
||||||
if (fOpenIncludeAction != null) {
|
|
||||||
fOpenIncludeAction.run();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
});
|
|
||||||
// register global actions
|
|
||||||
IPageSite site= getSite();
|
|
||||||
site.registerContextMenu(fContextMenuId, manager, fTreeViewer);
|
|
||||||
site.setSelectionProvider(fTreeViewer);
|
|
||||||
|
|
||||||
IActionBars bars= site.getActionBars();
|
|
||||||
bars.setGlobalActionHandler(ITextEditorActionDefinitionIds.TOGGLE_SHOW_SELECTED_ELEMENT_ONLY, fTogglePresentation);
|
|
||||||
|
|
||||||
fSelectionSearchGroup = new SelectionSearchGroup(this);
|
|
||||||
fOpenViewActionGroup = new OpenViewActionGroup(this);
|
|
||||||
fOpenViewActionGroup.setEnableIncludeBrowser(true);
|
|
||||||
fRefactoringActionGroup= new CRefactoringActionGroup(this);
|
|
||||||
// Custom filter group
|
|
||||||
fCustomFiltersActionGroup= new CustomFiltersActionGroup("org.eclipse.cdt.ui.COutlinePage", getTreeViewer()); //$NON-NLS-1$
|
|
||||||
|
|
||||||
// Do this before setting input but after the initializations of the fields filtering
|
|
||||||
registerActionBars(bars);
|
|
||||||
|
|
||||||
fTreeViewer.setInput(fInput);
|
|
||||||
PlatformUI.getWorkbench().getHelpSystem().setHelp(control, ICHelpContextIds.COUTLINE_VIEW);
|
|
||||||
}
|
|
||||||
|
|
||||||
public void dispose() {
|
|
||||||
if (fTreeViewer != null) {
|
|
||||||
fTreeViewer.removeSelectionChangedListener(this);
|
|
||||||
fTreeViewer= null;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (fTogglePresentation != null) {
|
|
||||||
fTogglePresentation.setEditor(null);
|
|
||||||
fTogglePresentation= null;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (fMemberFilterActionGroup != null) {
|
|
||||||
fMemberFilterActionGroup.dispose();
|
|
||||||
fMemberFilterActionGroup= null;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (fOpenViewActionGroup != null) {
|
|
||||||
fOpenViewActionGroup.dispose();
|
|
||||||
fOpenViewActionGroup= null;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (fRefactoringActionGroup != null) {
|
|
||||||
fRefactoringActionGroup.dispose();
|
|
||||||
fRefactoringActionGroup= null;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (fSelectionSearchGroup != null) {
|
|
||||||
fSelectionSearchGroup.dispose();
|
|
||||||
fSelectionSearchGroup= null;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (fCustomFiltersActionGroup != null) {
|
|
||||||
fCustomFiltersActionGroup.dispose();
|
|
||||||
fCustomFiltersActionGroup= null;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (selectionChangedListeners != null) {
|
|
||||||
selectionChangedListeners.clear();
|
|
||||||
// don't set the listeners to null, the outline page may be reused.
|
|
||||||
}
|
|
||||||
|
|
||||||
if (fMenu != null && !fMenu.isDisposed()) {
|
|
||||||
fMenu.dispose();
|
|
||||||
fMenu= null;
|
|
||||||
}
|
|
||||||
|
|
||||||
fInput= null;
|
|
||||||
|
|
||||||
super.dispose();
|
|
||||||
}
|
|
||||||
|
|
||||||
private void registerActionBars(IActionBars actionBars) {
|
|
||||||
IToolBarManager toolBarManager= actionBars.getToolBarManager();
|
|
||||||
|
|
||||||
LexicalSortingAction action= new LexicalSortingAction(getTreeViewer());
|
|
||||||
toolBarManager.add(action);
|
|
||||||
|
|
||||||
fMemberFilterActionGroup= new MemberFilterActionGroup(fTreeViewer, "COutlineViewer"); //$NON-NLS-1$
|
|
||||||
fMemberFilterActionGroup.fillActionBars(actionBars);
|
|
||||||
fCustomFiltersActionGroup.fillActionBars(actionBars);
|
|
||||||
fOpenViewActionGroup.fillActionBars(actionBars);
|
|
||||||
fRefactoringActionGroup.fillActionBars(actionBars);
|
|
||||||
|
|
||||||
IMenuManager menu= actionBars.getMenuManager();
|
|
||||||
menu.add(new Separator("EndFilterGroup")); //$NON-NLS-1$
|
|
||||||
|
|
||||||
fToggleLinkingAction= new ToggleLinkingAction(this);
|
|
||||||
menu.add(fToggleLinkingAction);
|
|
||||||
fIncludeGroupingAction= new IncludeGroupingAction(this);
|
|
||||||
menu.add(fIncludeGroupingAction);
|
|
||||||
}
|
|
||||||
|
|
||||||
/* (non-Javadoc)
|
|
||||||
* Method declared on ISelectionProvider.
|
|
||||||
*/
|
|
||||||
public void addSelectionChangedListener(ISelectionChangedListener listener) {
|
|
||||||
selectionChangedListeners.add(listener);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Fires a selection changed event.
|
|
||||||
*
|
|
||||||
* @param selection the new selection
|
|
||||||
*/
|
|
||||||
protected void fireSelectionChanged(ISelection selection) {
|
|
||||||
// create an event
|
|
||||||
SelectionChangedEvent event = new SelectionChangedEvent(this, selection);
|
|
||||||
|
|
||||||
// fire the event
|
|
||||||
Object[] listeners = selectionChangedListeners.getListeners();
|
|
||||||
for (int i = 0; i < listeners.length; ++i) {
|
|
||||||
((ISelectionChangedListener) listeners[i]).selectionChanged(event);
|
|
||||||
}
|
|
||||||
fRefactoringActionGroup.setContext(new ActionContext(selection));
|
|
||||||
fRefactoringActionGroup.updateActionBars();
|
|
||||||
}
|
|
||||||
|
|
||||||
/* (non-Javadoc)
|
|
||||||
* Method declared on IPage (and Page).
|
|
||||||
*/
|
|
||||||
public Control getControl() {
|
|
||||||
if (fTreeViewer == null)
|
|
||||||
return null;
|
|
||||||
return fTreeViewer.getControl();
|
|
||||||
}
|
|
||||||
|
|
||||||
/* (non-Javadoc)
|
|
||||||
* Method declared on ISelectionProvider.
|
|
||||||
*/
|
|
||||||
public ISelection getSelection() {
|
|
||||||
if (fTreeViewer == null)
|
|
||||||
return StructuredSelection.EMPTY;
|
|
||||||
return fTreeViewer.getSelection();
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Returns this page's tree viewer.
|
|
||||||
*
|
|
||||||
* @return this page's tree viewer, or <code>null</code> if
|
|
||||||
* <code>createControl</code> has not been called yet
|
|
||||||
*/
|
|
||||||
protected TreeViewer getTreeViewer() {
|
|
||||||
return fTreeViewer;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* (non-Javadoc)
|
|
||||||
* Method declared on ISelectionProvider.
|
|
||||||
*/
|
|
||||||
public void removeSelectionChangedListener(ISelectionChangedListener listener) {
|
|
||||||
selectionChangedListeners.remove(listener);
|
|
||||||
}
|
|
||||||
|
|
||||||
/* (non-Javadoc)
|
|
||||||
* Method declared on ISelectionChangeListener.
|
|
||||||
* Gives notification that the tree selection has changed.
|
|
||||||
*/
|
|
||||||
public void selectionChanged(SelectionChangedEvent event) {
|
|
||||||
fireSelectionChanged(event.getSelection());
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Sets focus to a part in the page.
|
|
||||||
*/
|
|
||||||
public void setFocus() {
|
|
||||||
fTreeViewer.getControl().setFocus();
|
|
||||||
}
|
|
||||||
|
|
||||||
/* (non-Javadoc)
|
|
||||||
* Method declared on ISelectionProvider.
|
|
||||||
*/
|
|
||||||
public void setSelection(ISelection selection) {
|
|
||||||
if (fTreeViewer != null)
|
|
||||||
fTreeViewer.setSelection(selection);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Set the current input to the content provider.
|
|
||||||
* @param unit
|
|
||||||
*/
|
|
||||||
public void setInput(ITranslationUnit unit) {
|
|
||||||
fInput = unit;
|
|
||||||
if (fTreeViewer != null) {
|
|
||||||
fTreeViewer.setInput (fInput);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private void initDragAndDrop() {
|
|
||||||
int ops= DND.DROP_COPY | DND.DROP_MOVE | DND.DROP_LINK;
|
|
||||||
Transfer[] transfers= new Transfer[] {
|
|
||||||
LocalSelectionTransfer.getInstance()
|
|
||||||
};
|
|
||||||
|
|
||||||
// Drop Adapter
|
|
||||||
TransferDropTargetListener[] dropListeners= new TransferDropTargetListener[] {
|
|
||||||
new SelectionTransferDropAdapter(fTreeViewer)
|
|
||||||
};
|
|
||||||
fTreeViewer.addDropSupport(ops | DND.DROP_DEFAULT, transfers, new DelegatingDropAdapter(dropListeners));
|
|
||||||
|
|
||||||
// Drag Adapter
|
|
||||||
TransferDragSourceListener[] dragListeners= new TransferDragSourceListener[] {
|
|
||||||
new SelectionTransferDragAdapter(fTreeViewer)
|
|
||||||
};
|
|
||||||
fTreeViewer.addDragSupport(ops, transfers, new CDTViewerDragAdapter(fTreeViewer, dragListeners));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,138 +0,0 @@
|
||||||
/*******************************************************************************
|
|
||||||
* Copyright (c) 2003, 2005 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
|
|
||||||
* http://www.eclipse.org/legal/epl-v10.html
|
|
||||||
*
|
|
||||||
* Contributors:
|
|
||||||
* IBM Corporation - initial API and implementation
|
|
||||||
*******************************************************************************/
|
|
||||||
/*
|
|
||||||
* Created on Aug 12, 2003
|
|
||||||
*
|
|
||||||
* 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.List;
|
|
||||||
|
|
||||||
import org.eclipse.cdt.core.model.ICElement;
|
|
||||||
import org.eclipse.cdt.internal.ui.CPluginImages;
|
|
||||||
import org.eclipse.cdt.ui.CUIPlugin;
|
|
||||||
import org.eclipse.jface.action.Action;
|
|
||||||
import org.eclipse.jface.text.ITextSelection;
|
|
||||||
import org.eclipse.jface.viewers.ISelection;
|
|
||||||
import org.eclipse.jface.viewers.ISelectionProvider;
|
|
||||||
import org.eclipse.jface.viewers.IStructuredSelection;
|
|
||||||
import org.eclipse.search.ui.NewSearchUI;
|
|
||||||
import org.eclipse.ui.IEditorDescriptor;
|
|
||||||
import org.eclipse.ui.IEditorRegistry;
|
|
||||||
import org.eclipse.ui.IWorkbenchWindow;
|
|
||||||
import org.eclipse.ui.PlatformUI;
|
|
||||||
import org.eclipse.ui.texteditor.ITextEditor;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @author bgheorgh
|
|
||||||
*
|
|
||||||
* To change the template for this generated type comment go to
|
|
||||||
* Window>Preferences>Java>Code Generation>Code and Comments
|
|
||||||
*/
|
|
||||||
public class SearchDialogAction extends Action {
|
|
||||||
private static final String PREFIX= "SearchDialogAction."; //$NON-NLS-1$
|
|
||||||
private static final String C_SEARCH_PAGE_ID= "org.eclipse.cdt.ui.CSearchPage"; //$NON-NLS-1$
|
|
||||||
|
|
||||||
private ISelectionProvider fSelectionProvider;
|
|
||||||
private ITextEditor fEditor;
|
|
||||||
private IWorkbenchWindow fWorkbenchWindow;
|
|
||||||
|
|
||||||
public SearchDialogAction(ISelectionProvider provider, CEditor editor) {
|
|
||||||
super(CUIPlugin.getResourceString(PREFIX + "label")); //$NON-NLS-1$
|
|
||||||
setDescription(CUIPlugin.getResourceString(PREFIX + "description")); //$NON-NLS-1$
|
|
||||||
setToolTipText(CUIPlugin.getResourceString(PREFIX + "tooltip")); //$NON-NLS-1$
|
|
||||||
|
|
||||||
if(provider instanceof CContentOutlinePage) {
|
|
||||||
setImageDescriptor( CPluginImages.DESC_OBJS_CSEARCH );
|
|
||||||
}
|
|
||||||
|
|
||||||
fSelectionProvider= provider;
|
|
||||||
fEditor = editor;
|
|
||||||
}
|
|
||||||
|
|
||||||
public SearchDialogAction(ISelectionProvider provider, IWorkbenchWindow window) {
|
|
||||||
|
|
||||||
super(CUIPlugin.getResourceString(PREFIX + "label")); //$NON-NLS-1$
|
|
||||||
setDescription(CUIPlugin.getResourceString(PREFIX + "description")); //$NON-NLS-1$
|
|
||||||
setToolTipText(CUIPlugin.getResourceString(PREFIX + "tooltip")); //$NON-NLS-1$
|
|
||||||
|
|
||||||
if(provider instanceof CContentOutlinePage) {
|
|
||||||
setImageDescriptor( CPluginImages.DESC_OBJS_CSEARCH );
|
|
||||||
}
|
|
||||||
|
|
||||||
fSelectionProvider= provider;
|
|
||||||
fWorkbenchWindow = window;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void run() {
|
|
||||||
String search_name;
|
|
||||||
|
|
||||||
ISelection selection= fSelectionProvider.getSelection();
|
|
||||||
if(selection instanceof ITextSelection) {
|
|
||||||
search_name = ((ITextSelection)selection).getText();
|
|
||||||
if(search_name.length() == 0) return;
|
|
||||||
} else {
|
|
||||||
ICElement element= getElement(selection);
|
|
||||||
if (element == null) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
search_name = element.getElementName();
|
|
||||||
}
|
|
||||||
|
|
||||||
if (fEditor != null){
|
|
||||||
NewSearchUI.openSearchDialog(fEditor.getEditorSite().getWorkbenchWindow(),C_SEARCH_PAGE_ID);
|
|
||||||
}
|
|
||||||
else if (fWorkbenchWindow != null){
|
|
||||||
NewSearchUI.openSearchDialog(fWorkbenchWindow,C_SEARCH_PAGE_ID);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
private static ICElement getElement(ISelection sel) {
|
|
||||||
if (!sel.isEmpty() && sel instanceof IStructuredSelection) {
|
|
||||||
List list= ((IStructuredSelection)sel).toList();
|
|
||||||
if (list.size() == 1) {
|
|
||||||
Object element= list.get(0);
|
|
||||||
if (element instanceof ICElement) {
|
|
||||||
return (ICElement)element;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
public static boolean canActionBeAdded(ISelection selection) {
|
|
||||||
if(selection instanceof ITextSelection) {
|
|
||||||
return (((ITextSelection)selection).getLength() > 0);
|
|
||||||
} else {
|
|
||||||
return getElement(selection) != null;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
public static String getEditorID(String name) {
|
|
||||||
IEditorRegistry registry = PlatformUI.getWorkbench().getEditorRegistry();
|
|
||||||
if (registry != null) {
|
|
||||||
IEditorDescriptor descriptor = registry.getDefaultEditor(name);
|
|
||||||
if (descriptor != null) {
|
|
||||||
return descriptor.getId();
|
|
||||||
} else {
|
|
||||||
//getDefaultEditor is deprecated, The system external editor is the default editor
|
|
||||||
return IEditorRegistry.SYSTEM_EXTERNAL_EDITOR_ID;
|
|
||||||
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
|
@ -1,9 +1,64 @@
|
||||||
|
/*******************************************************************************
|
||||||
|
* Copyright (c) 2007 Wind River Systems, Inc. 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
|
||||||
|
* http://www.eclipse.org/legal/epl-v10.html
|
||||||
|
*
|
||||||
|
* Contributors:
|
||||||
|
* Anton Leherbauer (Wind River Systems) - initial API and implementation
|
||||||
|
*******************************************************************************/
|
||||||
package org.eclipse.cdt.internal.ui.editor.asm;
|
package org.eclipse.cdt.internal.ui.editor.asm;
|
||||||
|
|
||||||
|
import org.eclipse.ui.IActionBars;
|
||||||
|
import org.eclipse.ui.IEditorPart;
|
||||||
import org.eclipse.ui.editors.text.TextEditorActionContributor;
|
import org.eclipse.ui.editors.text.TextEditorActionContributor;
|
||||||
|
import org.eclipse.ui.texteditor.ITextEditor;
|
||||||
|
import org.eclipse.ui.texteditor.ITextEditorActionDefinitionIds;
|
||||||
|
|
||||||
public class ASMEditorActionContributor extends
|
import org.eclipse.cdt.internal.ui.editor.TogglePresentationAction;
|
||||||
TextEditorActionContributor {
|
|
||||||
|
|
||||||
// nothing for now
|
public class ASMEditorActionContributor extends TextEditorActionContributor {
|
||||||
|
|
||||||
|
private TogglePresentationAction fTogglePresentation;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Default constructor is mandatory (executable extension).
|
||||||
|
*/
|
||||||
|
public ASMEditorActionContributor() {
|
||||||
|
fTogglePresentation= new TogglePresentationAction();
|
||||||
|
fTogglePresentation.setActionDefinitionId(ITextEditorActionDefinitionIds.TOGGLE_SHOW_SELECTED_ELEMENT_ONLY);
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* @see org.eclipse.ui.editors.text.TextEditorActionContributor#init(org.eclipse.ui.IActionBars)
|
||||||
|
*/
|
||||||
|
public void init(IActionBars bars) {
|
||||||
|
super.init(bars);
|
||||||
|
bars.setGlobalActionHandler(ITextEditorActionDefinitionIds.TOGGLE_SHOW_SELECTED_ELEMENT_ONLY, fTogglePresentation);
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* @see org.eclipse.ui.editors.text.TextEditorActionContributor#setActiveEditor(org.eclipse.ui.IEditorPart)
|
||||||
|
*/
|
||||||
|
public void setActiveEditor(IEditorPart part) {
|
||||||
|
super.setActiveEditor(part);
|
||||||
|
internalSetActiveEditor(part);
|
||||||
|
}
|
||||||
|
|
||||||
|
private void internalSetActiveEditor(IEditorPart part) {
|
||||||
|
ITextEditor textEditor= null;
|
||||||
|
if (part instanceof ITextEditor)
|
||||||
|
textEditor= (ITextEditor) part;
|
||||||
|
|
||||||
|
fTogglePresentation.setEditor(textEditor);
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* @see org.eclipse.ui.editors.text.TextEditorActionContributor#dispose()
|
||||||
|
*/
|
||||||
|
public void dispose() {
|
||||||
|
internalSetActiveEditor(null);
|
||||||
|
super.dispose();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -0,0 +1,48 @@
|
||||||
|
/*******************************************************************************
|
||||||
|
* Copyright (c) 2007 Wind River Systems, Inc. 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
|
||||||
|
* http://www.eclipse.org/legal/epl-v10.html
|
||||||
|
*
|
||||||
|
* Contributors:
|
||||||
|
* Anton Leherbauer (Wind River Systems) - initial API and implementation
|
||||||
|
*******************************************************************************/
|
||||||
|
package org.eclipse.cdt.internal.ui.editor.asm;
|
||||||
|
|
||||||
|
import org.eclipse.ui.actions.ActionGroup;
|
||||||
|
import org.eclipse.ui.texteditor.ITextEditor;
|
||||||
|
|
||||||
|
import org.eclipse.cdt.ui.actions.CustomFiltersActionGroup;
|
||||||
|
import org.eclipse.cdt.ui.actions.OpenViewActionGroup;
|
||||||
|
|
||||||
|
import org.eclipse.cdt.internal.ui.editor.AbstractCModelOutlinePage;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Content outline page for assembly translation units.
|
||||||
|
*
|
||||||
|
* @since 5.0
|
||||||
|
*/
|
||||||
|
public class AsmContentOutlinePage extends AbstractCModelOutlinePage {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Creates a new outline page for the given editor.
|
||||||
|
* @param editor
|
||||||
|
*/
|
||||||
|
public AsmContentOutlinePage(ITextEditor editor) {
|
||||||
|
super("#ASMOutlineContext", editor); //$NON-NLS-1$
|
||||||
|
}
|
||||||
|
|
||||||
|
protected OpenViewActionGroup createOpenViewActionGroup() {
|
||||||
|
OpenViewActionGroup ovag= new OpenViewActionGroup(this);
|
||||||
|
ovag.setEnableIncludeBrowser(false);
|
||||||
|
ovag.setSuppressCallHierarchy(true);
|
||||||
|
ovag.setSuppressTypeHierarchy(true);
|
||||||
|
return ovag;
|
||||||
|
}
|
||||||
|
|
||||||
|
protected ActionGroup createCustomFiltersActionGroup() {
|
||||||
|
return new CustomFiltersActionGroup("org.eclipse.cdt.ui.AsmOutlinePage", getTreeViewer()); //$NON-NLS-1$
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,98 @@
|
||||||
|
/*******************************************************************************
|
||||||
|
* Copyright (c) 2007 Wind River Systems, Inc. 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
|
||||||
|
* http://www.eclipse.org/legal/epl-v10.html
|
||||||
|
*
|
||||||
|
* Contributors:
|
||||||
|
* Anton Leherbauer (Wind River Systems) - initial API and implementation
|
||||||
|
*******************************************************************************/
|
||||||
|
package org.eclipse.cdt.internal.ui.editor.asm;
|
||||||
|
|
||||||
|
import org.eclipse.core.runtime.IProgressMonitor;
|
||||||
|
import org.eclipse.core.runtime.IStatus;
|
||||||
|
import org.eclipse.core.runtime.OperationCanceledException;
|
||||||
|
import org.eclipse.core.runtime.Status;
|
||||||
|
import org.eclipse.jface.text.IDocument;
|
||||||
|
import org.eclipse.jface.text.IRegion;
|
||||||
|
import org.eclipse.jface.text.reconciler.DirtyRegion;
|
||||||
|
import org.eclipse.jface.text.reconciler.IReconcilingStrategy;
|
||||||
|
import org.eclipse.jface.text.reconciler.IReconcilingStrategyExtension;
|
||||||
|
import org.eclipse.ui.texteditor.ITextEditor;
|
||||||
|
|
||||||
|
import org.eclipse.cdt.core.model.CModelException;
|
||||||
|
import org.eclipse.cdt.core.model.IWorkingCopy;
|
||||||
|
import org.eclipse.cdt.ui.CUIPlugin;
|
||||||
|
import org.eclipse.cdt.ui.IWorkingCopyManager;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Reconciling strategy for assembly translation units.
|
||||||
|
*
|
||||||
|
* @since 5.0
|
||||||
|
*/
|
||||||
|
public class AsmReconcilingStrategy implements IReconcilingStrategy, IReconcilingStrategyExtension {
|
||||||
|
|
||||||
|
private ITextEditor fEditor;
|
||||||
|
|
||||||
|
public AsmReconcilingStrategy(ITextEditor editor) {
|
||||||
|
fEditor= editor;
|
||||||
|
}
|
||||||
|
|
||||||
|
private IProgressMonitor fProgressMonitor;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* @see IReconcilingStrategy#reconcile(org.eclipse.jface.text.IRegion)
|
||||||
|
*/
|
||||||
|
public void reconcile(IRegion partition) {
|
||||||
|
reconcile(false);
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* @see IReconcilingStrategy#reconcile(org.eclipse.jface.text.reconciler.DirtyRegion, org.eclipse.jface.text.IRegion)
|
||||||
|
*/
|
||||||
|
public void reconcile(DirtyRegion dirtyRegion, IRegion subRegion) {
|
||||||
|
// unused - non-incremental reconciler
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* @see IReconcilingStrategy#setDocument(org.eclipse.jface.text.IDocument)
|
||||||
|
*/
|
||||||
|
public void setDocument(IDocument document) {
|
||||||
|
// no-op
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* @see IReconcilingStrategyExtension#setProgressMonitor(IProgressMonitor)
|
||||||
|
*/
|
||||||
|
public void setProgressMonitor(IProgressMonitor monitor) {
|
||||||
|
fProgressMonitor= monitor;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* @see IReconcilingStrategyExtension#initialReconcile()
|
||||||
|
*/
|
||||||
|
public void initialReconcile() {
|
||||||
|
reconcile(true);
|
||||||
|
}
|
||||||
|
|
||||||
|
private void reconcile(final boolean initialReconcile) {
|
||||||
|
IWorkingCopyManager fManager = CUIPlugin.getDefault().getWorkingCopyManager();
|
||||||
|
IWorkingCopy workingCopy= fManager.getWorkingCopy(fEditor.getEditorInput());
|
||||||
|
if (workingCopy == null) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
try {
|
||||||
|
// reconcile
|
||||||
|
synchronized (workingCopy) {
|
||||||
|
workingCopy.reconcile(false, true, fProgressMonitor);
|
||||||
|
}
|
||||||
|
} catch (OperationCanceledException oce) {
|
||||||
|
// document was modified while parsing
|
||||||
|
} catch (CModelException e) {
|
||||||
|
IStatus status= new Status(IStatus.ERROR, CUIPlugin.PLUGIN_ID, IStatus.OK, "Error in CDT UI during reconcile", e); //$NON-NLS-1$
|
||||||
|
CUIPlugin.getDefault().log(status);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -12,15 +12,20 @@
|
||||||
package org.eclipse.cdt.internal.ui.editor.asm;
|
package org.eclipse.cdt.internal.ui.editor.asm;
|
||||||
|
|
||||||
|
|
||||||
|
import org.eclipse.core.runtime.NullProgressMonitor;
|
||||||
import org.eclipse.jface.preference.IPreferenceStore;
|
import org.eclipse.jface.preference.IPreferenceStore;
|
||||||
import org.eclipse.jface.text.IDocument;
|
import org.eclipse.jface.text.IDocument;
|
||||||
import org.eclipse.jface.text.presentation.IPresentationReconciler;
|
import org.eclipse.jface.text.presentation.IPresentationReconciler;
|
||||||
import org.eclipse.jface.text.presentation.PresentationReconciler;
|
import org.eclipse.jface.text.presentation.PresentationReconciler;
|
||||||
|
import org.eclipse.jface.text.reconciler.IReconciler;
|
||||||
|
import org.eclipse.jface.text.reconciler.MonoReconciler;
|
||||||
import org.eclipse.jface.text.rules.DefaultDamagerRepairer;
|
import org.eclipse.jface.text.rules.DefaultDamagerRepairer;
|
||||||
import org.eclipse.jface.text.rules.RuleBasedScanner;
|
import org.eclipse.jface.text.rules.RuleBasedScanner;
|
||||||
import org.eclipse.jface.text.source.ISourceViewer;
|
import org.eclipse.jface.text.source.ISourceViewer;
|
||||||
import org.eclipse.ui.editors.text.TextSourceViewerConfiguration;
|
import org.eclipse.ui.editors.text.TextSourceViewerConfiguration;
|
||||||
|
import org.eclipse.ui.texteditor.ITextEditor;
|
||||||
|
|
||||||
|
import org.eclipse.cdt.ui.CUIPlugin;
|
||||||
import org.eclipse.cdt.ui.text.ICPartitions;
|
import org.eclipse.cdt.ui.text.ICPartitions;
|
||||||
|
|
||||||
import org.eclipse.cdt.internal.ui.text.PartitionDamager;
|
import org.eclipse.cdt.internal.ui.text.PartitionDamager;
|
||||||
|
@ -29,15 +34,26 @@ import org.eclipse.cdt.internal.ui.text.PartitionDamager;
|
||||||
public class AsmSourceViewerConfiguration extends TextSourceViewerConfiguration {
|
public class AsmSourceViewerConfiguration extends TextSourceViewerConfiguration {
|
||||||
|
|
||||||
private AsmTextTools fAsmTextTools;
|
private AsmTextTools fAsmTextTools;
|
||||||
|
private ITextEditor fTextEditor;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Constructor for AsmSourceViewerConfiguration
|
* Constructor for AsmSourceViewerConfiguration
|
||||||
*/
|
*/
|
||||||
public AsmSourceViewerConfiguration(AsmTextTools tools, IPreferenceStore store) {
|
public AsmSourceViewerConfiguration(AsmTextTools tools, IPreferenceStore store) {
|
||||||
super(store);
|
super(store);
|
||||||
|
fTextEditor= null;
|
||||||
fAsmTextTools = tools;
|
fAsmTextTools = tools;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Constructor for AsmSourceViewerConfiguration
|
||||||
|
*/
|
||||||
|
public AsmSourceViewerConfiguration(ITextEditor editor, IPreferenceStore store) {
|
||||||
|
super(store);
|
||||||
|
fTextEditor= editor;
|
||||||
|
fAsmTextTools= CUIPlugin.getDefault().getAsmTextTools();
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Returns the ASM multiline comment scanner for this configuration.
|
* Returns the ASM multiline comment scanner for this configuration.
|
||||||
*
|
*
|
||||||
|
@ -130,7 +146,19 @@ public class AsmSourceViewerConfiguration extends TextSourceViewerConfiguration
|
||||||
ICPartitions.C_PREPROCESSOR};
|
ICPartitions.C_PREPROCESSOR};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* @see org.eclipse.ui.editors.text.TextSourceViewerConfiguration#getReconciler(org.eclipse.jface.text.source.ISourceViewer)
|
||||||
|
*/
|
||||||
|
public IReconciler getReconciler(ISourceViewer sourceViewer) {
|
||||||
|
if (fTextEditor != null) {
|
||||||
|
MonoReconciler reconciler= new MonoReconciler(new AsmReconcilingStrategy(fTextEditor), false);
|
||||||
|
reconciler.setIsIncrementalReconciler(false);
|
||||||
|
reconciler.setProgressMonitor(new NullProgressMonitor());
|
||||||
|
reconciler.setDelay(500);
|
||||||
|
return reconciler;
|
||||||
|
}
|
||||||
|
return super.getReconciler(sourceViewer);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -12,25 +12,75 @@
|
||||||
package org.eclipse.cdt.internal.ui.editor.asm;
|
package org.eclipse.cdt.internal.ui.editor.asm;
|
||||||
|
|
||||||
|
|
||||||
|
import java.util.Iterator;
|
||||||
|
|
||||||
import org.eclipse.jface.action.GroupMarker;
|
import org.eclipse.jface.action.GroupMarker;
|
||||||
import org.eclipse.jface.action.IMenuManager;
|
import org.eclipse.jface.action.IMenuManager;
|
||||||
|
import org.eclipse.jface.action.IStatusLineManager;
|
||||||
import org.eclipse.jface.action.Separator;
|
import org.eclipse.jface.action.Separator;
|
||||||
import org.eclipse.jface.preference.IPreferenceStore;
|
import org.eclipse.jface.preference.IPreferenceStore;
|
||||||
|
import org.eclipse.jface.text.BadLocationException;
|
||||||
|
import org.eclipse.jface.text.IRegion;
|
||||||
|
import org.eclipse.jface.text.ITextSelection;
|
||||||
|
import org.eclipse.jface.text.ITextViewerExtension5;
|
||||||
|
import org.eclipse.jface.text.Position;
|
||||||
|
import org.eclipse.jface.text.source.Annotation;
|
||||||
|
import org.eclipse.jface.text.source.IAnnotationModel;
|
||||||
|
import org.eclipse.jface.text.source.ISourceViewer;
|
||||||
import org.eclipse.jface.util.PropertyChangeEvent;
|
import org.eclipse.jface.util.PropertyChangeEvent;
|
||||||
|
import org.eclipse.jface.viewers.ISelection;
|
||||||
|
import org.eclipse.jface.viewers.ISelectionChangedListener;
|
||||||
|
import org.eclipse.jface.viewers.IStructuredSelection;
|
||||||
|
import org.eclipse.jface.viewers.SelectionChangedEvent;
|
||||||
|
import org.eclipse.swt.custom.StyledText;
|
||||||
|
import org.eclipse.swt.widgets.Composite;
|
||||||
|
import org.eclipse.ui.IEditorActionBarContributor;
|
||||||
|
import org.eclipse.ui.IEditorInput;
|
||||||
|
import org.eclipse.ui.IPartService;
|
||||||
|
import org.eclipse.ui.IWorkbenchWindow;
|
||||||
import org.eclipse.ui.editors.text.TextEditor;
|
import org.eclipse.ui.editors.text.TextEditor;
|
||||||
import org.eclipse.ui.navigator.ICommonMenuConstants;
|
import org.eclipse.ui.navigator.ICommonMenuConstants;
|
||||||
|
import org.eclipse.ui.part.EditorActionBarContributor;
|
||||||
|
import org.eclipse.ui.texteditor.ITextEditorActionConstants;
|
||||||
|
import org.eclipse.ui.views.contentoutline.IContentOutlinePage;
|
||||||
|
|
||||||
|
import org.eclipse.cdt.core.model.CModelException;
|
||||||
|
import org.eclipse.cdt.core.model.ICElement;
|
||||||
|
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.IWorkingCopy;
|
||||||
import org.eclipse.cdt.ui.CUIPlugin;
|
import org.eclipse.cdt.ui.CUIPlugin;
|
||||||
|
import org.eclipse.cdt.ui.IWorkingCopyManager;
|
||||||
|
|
||||||
import org.eclipse.cdt.internal.ui.IContextMenuConstants;
|
import org.eclipse.cdt.internal.ui.IContextMenuConstants;
|
||||||
|
import org.eclipse.cdt.internal.ui.editor.AbstractCModelOutlinePage;
|
||||||
|
import org.eclipse.cdt.internal.ui.editor.CAnnotationIterator;
|
||||||
|
import org.eclipse.cdt.internal.ui.editor.ICAnnotation;
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Assembly text editor
|
* Assembly text editor.
|
||||||
*/
|
*/
|
||||||
public class AsmTextEditor extends TextEditor {
|
public class AsmTextEditor extends TextEditor implements ISelectionChangedListener {
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Creates a new text editor.
|
* Updates the outline page selection and this editor's range indicator.
|
||||||
|
*/
|
||||||
|
private class EditorSelectionChangedListener extends AbstractSelectionChangedListener {
|
||||||
|
/*
|
||||||
|
* @see org.eclipse.jface.viewers.ISelectionChangedListener#selectionChanged(org.eclipse.jface.viewers.SelectionChangedEvent)
|
||||||
|
*/
|
||||||
|
public void selectionChanged(SelectionChangedEvent event) {
|
||||||
|
AsmTextEditor.this.selectionChanged();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private AbstractCModelOutlinePage fOutlinePage;
|
||||||
|
private EditorSelectionChangedListener fEditorSelectionChangedListener;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Creates a new assembly text editor.
|
||||||
*/
|
*/
|
||||||
public AsmTextEditor() {
|
public AsmTextEditor() {
|
||||||
super();
|
super();
|
||||||
|
@ -39,9 +89,8 @@ public class AsmTextEditor extends TextEditor {
|
||||||
* Initializes this editor.
|
* Initializes this editor.
|
||||||
*/
|
*/
|
||||||
protected void initializeEditor() {
|
protected void initializeEditor() {
|
||||||
AsmTextTools textTools= CUIPlugin.getDefault().getAsmTextTools();
|
|
||||||
IPreferenceStore store= CUIPlugin.getDefault().getCombinedPreferenceStore();
|
IPreferenceStore store= CUIPlugin.getDefault().getCombinedPreferenceStore();
|
||||||
setSourceViewerConfiguration(new AsmSourceViewerConfiguration(textTools, store));
|
setSourceViewerConfiguration(new AsmSourceViewerConfiguration(this, store));
|
||||||
setDocumentProvider(CUIPlugin.getDefault().getDocumentProvider());
|
setDocumentProvider(CUIPlugin.getDefault().getDocumentProvider());
|
||||||
// FIXME: Should this editor have a different preference store ?
|
// FIXME: Should this editor have a different preference store ?
|
||||||
// For now we are sharing with the CEditor and any changes in the
|
// For now we are sharing with the CEditor and any changes in the
|
||||||
|
@ -52,6 +101,43 @@ public class AsmTextEditor extends TextEditor {
|
||||||
//setOutlinerContextMenuId("#ASMEditorOutlinerContext"); //$NON-NLS-1$
|
//setOutlinerContextMenuId("#ASMEditorOutlinerContext"); //$NON-NLS-1$
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* @see org.eclipse.ui.editors.text.TextEditor#getAdapter(java.lang.Class)
|
||||||
|
*/
|
||||||
|
public Object getAdapter(Class adapter) {
|
||||||
|
if (IContentOutlinePage.class.equals(adapter)) {
|
||||||
|
return getOutlinePage();
|
||||||
|
}
|
||||||
|
return super.getAdapter(adapter);
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* @see org.eclipse.ui.texteditor.AbstractDecoratedTextEditor#createPartControl(org.eclipse.swt.widgets.Composite)
|
||||||
|
*/
|
||||||
|
public void createPartControl(Composite parent) {
|
||||||
|
super.createPartControl(parent);
|
||||||
|
|
||||||
|
// PlatformUI.getWorkbench().getHelpSystem().setHelp(parent, ICHelpContextIds.ASMEDITOR_VIEW);
|
||||||
|
|
||||||
|
fEditorSelectionChangedListener = new EditorSelectionChangedListener();
|
||||||
|
fEditorSelectionChangedListener.install(getSelectionProvider());
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* @see org.eclipse.ui.editors.text.TextEditor#dispose()
|
||||||
|
*/
|
||||||
|
public void dispose() {
|
||||||
|
if (fOutlinePage != null) {
|
||||||
|
fOutlinePage.dispose();
|
||||||
|
fOutlinePage = null;
|
||||||
|
}
|
||||||
|
if (fEditorSelectionChangedListener != null) {
|
||||||
|
fEditorSelectionChangedListener.uninstall(getSelectionProvider());
|
||||||
|
fEditorSelectionChangedListener = null;
|
||||||
|
}
|
||||||
|
super.dispose();
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* @see AbstractTextEditor#affectsTextPresentation(PropertyChangeEvent)
|
* @see AbstractTextEditor#affectsTextPresentation(PropertyChangeEvent)
|
||||||
* Pulled in from 2.0
|
* Pulled in from 2.0
|
||||||
|
@ -59,9 +145,9 @@ public class AsmTextEditor extends TextEditor {
|
||||||
protected boolean affectsTextPresentation(PropertyChangeEvent event) {
|
protected boolean affectsTextPresentation(PropertyChangeEvent event) {
|
||||||
boolean affects= false;
|
boolean affects= false;
|
||||||
AsmTextTools textTools= CUIPlugin.getDefault().getAsmTextTools();
|
AsmTextTools textTools= CUIPlugin.getDefault().getAsmTextTools();
|
||||||
affects |= textTools.affectsBehavior(event);
|
affects= textTools.affectsBehavior(event);
|
||||||
|
|
||||||
return affects ? affects : super.affectsTextPresentation(event);
|
return affects || super.affectsTextPresentation(event);
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -76,4 +162,313 @@ public class AsmTextEditor extends TextEditor {
|
||||||
|
|
||||||
super.editorContextMenuAboutToShow(menu);
|
super.editorContextMenuAboutToShow(menu);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Gets the outline page for this editor.
|
||||||
|
* @return Outline page.
|
||||||
|
*/
|
||||||
|
public AbstractCModelOutlinePage getOutlinePage() {
|
||||||
|
if (fOutlinePage == null) {
|
||||||
|
fOutlinePage = new AsmContentOutlinePage(this);
|
||||||
|
fOutlinePage.addSelectionChangedListener(this);
|
||||||
|
}
|
||||||
|
setOutlinePageInput(fOutlinePage, getEditorInput());
|
||||||
|
return fOutlinePage;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Sets an input for the outline page.
|
||||||
|
* @param page Page to set the input.
|
||||||
|
* @param input Input to set.
|
||||||
|
*/
|
||||||
|
public static void setOutlinePageInput(AbstractCModelOutlinePage page, IEditorInput input) {
|
||||||
|
if (page != null) {
|
||||||
|
IWorkingCopyManager manager = CUIPlugin.getDefault().getWorkingCopyManager();
|
||||||
|
page.setInput(manager.getWorkingCopy(input));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* React to changed selection in the editor.
|
||||||
|
*/
|
||||||
|
protected void selectionChanged() {
|
||||||
|
if (getSelectionProvider() == null)
|
||||||
|
return;
|
||||||
|
ISourceReference element= computeHighlightRangeSourceReference();
|
||||||
|
updateStatusLine();
|
||||||
|
synchronizeOutlinePage();
|
||||||
|
setSelection(element, false);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Synchronizes the outline view selection with the given element
|
||||||
|
* position in the editor.
|
||||||
|
*/
|
||||||
|
protected void synchronizeOutlinePage() {
|
||||||
|
if(fOutlinePage != null && fOutlinePage.isLinkingEnabled()) {
|
||||||
|
fOutlinePage.removeSelectionChangedListener(this);
|
||||||
|
fOutlinePage.synchronizeSelectionWithEditor();
|
||||||
|
fOutlinePage.addSelectionChangedListener(this);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
protected void updateStatusLine() {
|
||||||
|
ITextSelection selection = (ITextSelection) getSelectionProvider().getSelection();
|
||||||
|
Annotation annotation = getAnnotation(selection.getOffset(), selection.getLength());
|
||||||
|
setStatusLineErrorMessage(null);
|
||||||
|
setStatusLineMessage(null);
|
||||||
|
if (annotation != null) {
|
||||||
|
updateMarkerViews(annotation);
|
||||||
|
if (annotation instanceof ICAnnotation && ((ICAnnotation) annotation).isProblem())
|
||||||
|
setStatusLineMessage(annotation.getText());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns the annotation overlapping with the given range or <code>null</code>.
|
||||||
|
*
|
||||||
|
* @param offset the region offset
|
||||||
|
* @param length the region length
|
||||||
|
* @return the found annotation or <code>null</code>
|
||||||
|
*/
|
||||||
|
private Annotation getAnnotation(int offset, int length) {
|
||||||
|
IAnnotationModel model = getDocumentProvider().getAnnotationModel(getEditorInput());
|
||||||
|
Iterator e = new CAnnotationIterator(model, true, true);
|
||||||
|
while (e.hasNext()) {
|
||||||
|
Annotation a = (Annotation) e.next();
|
||||||
|
if (!isNavigationTarget(a))
|
||||||
|
continue;
|
||||||
|
|
||||||
|
Position p = model.getPosition(a);
|
||||||
|
if (p != null && p.overlapsWith(offset, length))
|
||||||
|
return a;
|
||||||
|
}
|
||||||
|
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get the StatusLineManager.
|
||||||
|
*/
|
||||||
|
protected IStatusLineManager getStatusLineManager() {
|
||||||
|
IEditorActionBarContributor contributor = getEditorSite().getActionBarContributor();
|
||||||
|
if (contributor instanceof EditorActionBarContributor) {
|
||||||
|
return ((EditorActionBarContributor) contributor).getActionBars().getStatusLineManager();
|
||||||
|
}
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Computes and returns the source reference that includes the caret and
|
||||||
|
* serves as provider for the outline page selection and the editor range
|
||||||
|
* indication.
|
||||||
|
*
|
||||||
|
* @return the computed source reference
|
||||||
|
*/
|
||||||
|
protected ISourceReference computeHighlightRangeSourceReference() {
|
||||||
|
ISourceViewer sourceViewer= getSourceViewer();
|
||||||
|
if (sourceViewer == null)
|
||||||
|
return null;
|
||||||
|
|
||||||
|
StyledText styledText= sourceViewer.getTextWidget();
|
||||||
|
if (styledText == null)
|
||||||
|
return null;
|
||||||
|
|
||||||
|
int caret= 0;
|
||||||
|
if (sourceViewer instanceof ITextViewerExtension5) {
|
||||||
|
ITextViewerExtension5 extension= (ITextViewerExtension5)sourceViewer;
|
||||||
|
caret= extension.widgetOffset2ModelOffset(styledText.getSelection().x);
|
||||||
|
} else {
|
||||||
|
int offset= sourceViewer.getVisibleRegion().getOffset();
|
||||||
|
caret= offset + styledText.getSelection().x;
|
||||||
|
}
|
||||||
|
|
||||||
|
ICElement element= getElementAt(caret, false);
|
||||||
|
|
||||||
|
if ( !(element instanceof ISourceReference))
|
||||||
|
return null;
|
||||||
|
|
||||||
|
return (ISourceReference) element;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns the most narrow element including the given offset. If <code>reconcile</code>
|
||||||
|
* is <code>true</code> the editor's input element is reconciled in advance. If it is
|
||||||
|
* <code>false</code> this method only returns a result if the editor's input element
|
||||||
|
* does not need to be reconciled.
|
||||||
|
*
|
||||||
|
* @param offset the offset included by the retrieved element
|
||||||
|
* @param reconcile <code>true</code> if working copy should be reconciled
|
||||||
|
* @return the most narrow element which includes the given offset
|
||||||
|
*/
|
||||||
|
protected ICElement getElementAt(int offset, boolean reconcile) {
|
||||||
|
ITranslationUnit unit= (ITranslationUnit)getInputCElement();
|
||||||
|
|
||||||
|
if (unit != null) {
|
||||||
|
try {
|
||||||
|
if (reconcile && unit instanceof IWorkingCopy) {
|
||||||
|
synchronized (unit) {
|
||||||
|
((IWorkingCopy) unit).reconcile();
|
||||||
|
}
|
||||||
|
return unit.getElementAtOffset(offset);
|
||||||
|
} else if (unit.isConsistent()) {
|
||||||
|
return unit.getElementAtOffset(offset);
|
||||||
|
}
|
||||||
|
} catch (CModelException x) {
|
||||||
|
CUIPlugin.getDefault().log(x.getStatus());
|
||||||
|
// nothing found, be tolerant and go on
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns the C element wrapped by this editors input.
|
||||||
|
*
|
||||||
|
* @return the C element wrapped by this editors input.
|
||||||
|
*/
|
||||||
|
public ICElement getInputCElement () {
|
||||||
|
return CUIPlugin.getDefault().getWorkingCopyManager().getWorkingCopy(getEditorInput());
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 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) {
|
||||||
|
ISelection sel = event.getSelection();
|
||||||
|
if (sel instanceof IStructuredSelection) {
|
||||||
|
IStructuredSelection selection = (IStructuredSelection) sel;
|
||||||
|
Object obj = selection.getFirstElement();
|
||||||
|
if (obj instanceof ISourceReference) {
|
||||||
|
try {
|
||||||
|
ISourceRange range = ((ISourceReference) obj).getSourceRange();
|
||||||
|
if (range != null) {
|
||||||
|
setSelection(range, !isActivePart());
|
||||||
|
}
|
||||||
|
} catch (CModelException e) {
|
||||||
|
// Selection change not applied.
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Checks is the editor active part.
|
||||||
|
* @return <code>true</code> if editor is the active part of the workbench.
|
||||||
|
*/
|
||||||
|
private boolean isActivePart() {
|
||||||
|
IWorkbenchWindow window = getSite().getWorkbenchWindow();
|
||||||
|
IPartService service = window.getPartService();
|
||||||
|
return (this == service.getActivePart());
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Sets selection for C element.
|
||||||
|
* @param element Element to select.
|
||||||
|
*/
|
||||||
|
public void setSelection(ICElement element) {
|
||||||
|
if (element instanceof ISourceReference && !(element instanceof ITranslationUnit)) {
|
||||||
|
ISourceReference reference = (ISourceReference) element;
|
||||||
|
// set hightlight range
|
||||||
|
setSelection(reference, true);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Sets selection for source reference.
|
||||||
|
* @param element Source reference to set.
|
||||||
|
* @param moveCursor Should cursor be moved.
|
||||||
|
*/
|
||||||
|
public void setSelection(ISourceReference element, boolean moveCursor) {
|
||||||
|
if (element != null) {
|
||||||
|
StyledText textWidget = null;
|
||||||
|
|
||||||
|
ISourceViewer sourceViewer = getSourceViewer();
|
||||||
|
if (sourceViewer != null)
|
||||||
|
textWidget = sourceViewer.getTextWidget();
|
||||||
|
|
||||||
|
if (textWidget == null)
|
||||||
|
return;
|
||||||
|
|
||||||
|
try {
|
||||||
|
setSelection(element.getSourceRange(), moveCursor);
|
||||||
|
} catch (CModelException e) {
|
||||||
|
// Selection not applied.
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Sets the current editor selection to the source range. Optionally
|
||||||
|
* sets the current editor position.
|
||||||
|
*
|
||||||
|
* @param element the source range to be shown in the editor, can be null.
|
||||||
|
* @param moveCursor if true the editor is scrolled to show the range.
|
||||||
|
*/
|
||||||
|
public void setSelection(ISourceRange element, boolean moveCursor) {
|
||||||
|
|
||||||
|
if (element == null) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
try {
|
||||||
|
IRegion alternateRegion = null;
|
||||||
|
int start = element.getStartPos();
|
||||||
|
int length = element.getLength();
|
||||||
|
|
||||||
|
// Sanity check sometimes the parser may throw wrong numbers.
|
||||||
|
if (start < 0 || length < 0) {
|
||||||
|
start = 0;
|
||||||
|
length = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
// 0 length and start and non-zero start line says we know
|
||||||
|
// the line for some reason, but not the offset.
|
||||||
|
if (length == 0 && start == 0 && element.getStartLine() > 0) {
|
||||||
|
// We have the information in term of lines, we can work it out.
|
||||||
|
// Binary elements return the first executable statement so we have to substract -1
|
||||||
|
start = getDocumentProvider().getDocument(getEditorInput()).getLineOffset(element.getStartLine() - 1);
|
||||||
|
if (element.getEndLine() > 0) {
|
||||||
|
length = getDocumentProvider().getDocument(getEditorInput()).getLineOffset(element.getEndLine()) - start;
|
||||||
|
} else {
|
||||||
|
length = start;
|
||||||
|
}
|
||||||
|
// create an alternate region for the keyword highlight.
|
||||||
|
alternateRegion = getDocumentProvider().getDocument(getEditorInput()).getLineInformation(element.getStartLine() - 1);
|
||||||
|
if (start == length || length < 0) {
|
||||||
|
if (alternateRegion != null) {
|
||||||
|
start = alternateRegion.getOffset();
|
||||||
|
length = alternateRegion.getLength();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
setHighlightRange(start, length, moveCursor);
|
||||||
|
|
||||||
|
if (moveCursor) {
|
||||||
|
start = element.getIdStartPos();
|
||||||
|
length = element.getIdLength();
|
||||||
|
if (start == 0 && length == 0 && alternateRegion != null) {
|
||||||
|
start = alternateRegion.getOffset();
|
||||||
|
length = alternateRegion.getLength();
|
||||||
|
}
|
||||||
|
if (start > -1 && getSourceViewer() != null) {
|
||||||
|
getSourceViewer().revealRange(start, length);
|
||||||
|
getSourceViewer().setSelectedRange(start, length);
|
||||||
|
}
|
||||||
|
updateStatusField(ITextEditorActionConstants.STATUS_CATEGORY_INPUT_POSITION);
|
||||||
|
}
|
||||||
|
return;
|
||||||
|
} catch (IllegalArgumentException x) {
|
||||||
|
// No information to the user
|
||||||
|
} catch (BadLocationException e) {
|
||||||
|
// No information to the user
|
||||||
|
}
|
||||||
|
|
||||||
|
if (moveCursor)
|
||||||
|
resetHighlightRange();
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
/*******************************************************************************
|
/*******************************************************************************
|
||||||
* Copyright (c) 2005, 2006 IBM Corporation and others.
|
* Copyright (c) 2005, 2007 IBM Corporation and others.
|
||||||
* All rights reserved. This program and the accompanying materials
|
* All rights reserved. This program and the accompanying materials
|
||||||
* are made available under the terms of the Eclipse Public License v1.0
|
* are made available under the terms of the Eclipse Public License v1.0
|
||||||
* which accompanies this distribution, and is available at
|
* which accompanies this distribution, and is available at
|
||||||
|
@ -8,16 +8,14 @@
|
||||||
* Contributors:
|
* Contributors:
|
||||||
* IBM Corporation - initial API and implementation
|
* IBM Corporation - initial API and implementation
|
||||||
* QNX Software System
|
* QNX Software System
|
||||||
|
* Anton Leherbauer (Wind River Systems)
|
||||||
*******************************************************************************/
|
*******************************************************************************/
|
||||||
package org.eclipse.cdt.internal.ui.util;
|
package org.eclipse.cdt.internal.ui.util;
|
||||||
|
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
|
|
||||||
import org.eclipse.cdt.internal.ui.editor.CContentOutlinePage;
|
|
||||||
import org.eclipse.cdt.internal.ui.editor.CEditor;
|
|
||||||
import org.eclipse.core.resources.IResource;
|
import org.eclipse.core.resources.IResource;
|
||||||
import org.eclipse.jface.viewers.IBaseLabelProvider;
|
import org.eclipse.jface.viewers.IBaseLabelProvider;
|
||||||
import org.eclipse.jface.viewers.ISelectionChangedListener;
|
|
||||||
import org.eclipse.jface.viewers.ITreeContentProvider;
|
import org.eclipse.jface.viewers.ITreeContentProvider;
|
||||||
import org.eclipse.jface.viewers.LabelProviderChangedEvent;
|
import org.eclipse.jface.viewers.LabelProviderChangedEvent;
|
||||||
import org.eclipse.jface.viewers.TreeViewer;
|
import org.eclipse.jface.viewers.TreeViewer;
|
||||||
|
@ -35,7 +33,6 @@ import org.eclipse.swt.widgets.Widget;
|
||||||
public class ProblemTreeViewer extends TreeViewer {
|
public class ProblemTreeViewer extends TreeViewer {
|
||||||
|
|
||||||
protected ResourceToItemsMapper fResourceToItemsMapper;
|
protected ResourceToItemsMapper fResourceToItemsMapper;
|
||||||
private CEditor editor = null;
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* @see TreeViewer#TreeViewer(Composite)
|
* @see TreeViewer#TreeViewer(Composite)
|
||||||
|
@ -152,21 +149,5 @@ public class ProblemTreeViewer extends TreeViewer {
|
||||||
return cp.hasChildren(element);
|
return cp.hasChildren(element);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* (non-Javadoc)
|
|
||||||
* Method declared on ISelectionProvider.
|
|
||||||
*/
|
|
||||||
public void addSelectionChangedListener(ISelectionChangedListener listener) {
|
|
||||||
super.addSelectionChangedListener(listener);
|
|
||||||
if (listener instanceof CContentOutlinePage) {
|
|
||||||
editor =((CContentOutlinePage)listener).getEditor();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* This returns the editor corresponding to the opened CEditor that is listening to the selection changes on the Outline View.
|
|
||||||
*/
|
|
||||||
public CEditor getEditor() {
|
|
||||||
return editor;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -225,7 +225,10 @@ public class CElementImageProvider {
|
||||||
|
|
||||||
case ICElement.C_USING:
|
case ICElement.C_USING:
|
||||||
return CPluginImages.DESC_OBJS_USING;
|
return CPluginImages.DESC_OBJS_USING;
|
||||||
}
|
|
||||||
|
case ICElement.ASM_LABEL:
|
||||||
|
return CPluginImages.DESC_OBJS_LABEL;
|
||||||
|
}
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Add table
Reference in a new issue