mirror of
https://github.com/eclipse-cdt/cdt
synced 2025-07-01 06:05:24 +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"
|
||||
id="org.eclipse.cdt.internal.ui.CView.NonCElementFilter">
|
||||
</filter>
|
||||
<!-- Outline Page -->
|
||||
<!-- C/C++ Outline Page -->
|
||||
<filter
|
||||
targetId="org.eclipse.cdt.ui.COutlinePage"
|
||||
name="%HideUsingDirective.label"
|
||||
|
@ -148,6 +148,15 @@
|
|||
class="org.eclipse.cdt.internal.ui.filters.MacroDirectiveFilter"
|
||||
id="org.eclipse.cdt.ui.COutlinePage.MacroDirectiveFilter">
|
||||
</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
|
||||
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_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_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_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$
|
||||
|
@ -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_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_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_HEADER= createManaged(T_OBJ, IMG_OBJS_TUNIT_HEADER);
|
||||
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,531 +13,53 @@
|
|||
*******************************************************************************/
|
||||
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.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.ui.CUIPlugin;
|
||||
import org.eclipse.cdt.ui.PreferenceConstants;
|
||||
import org.eclipse.cdt.ui.actions.CustomFiltersActionGroup;
|
||||
import org.eclipse.cdt.ui.actions.MemberFilterActionGroup;
|
||||
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;
|
||||
|
||||
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;
|
||||
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 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);
|
||||
}
|
||||
|
||||
/**
|
||||
* Outline page for C/C++ translation units.
|
||||
*/
|
||||
public class CContentOutlinePage extends AbstractCModelOutlinePage {
|
||||
|
||||
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;
|
||||
}
|
||||
|
||||
/**
|
||||
* Provide access to the CEditor corresponding to this CContentOutlinePage.
|
||||
* @returns the CEditor corresponding to this CContentOutlinePage.
|
||||
*/
|
||||
* Provide access to the CEditor corresponding to this CContentOutlinePage.
|
||||
* @returns the CEditor corresponding to this CContentOutlinePage.
|
||||
*/
|
||||
public CEditor getEditor() {
|
||||
return fEditor;
|
||||
}
|
||||
|
||||
/**
|
||||
* 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 (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);
|
||||
return (CEditor)fEditor;
|
||||
}
|
||||
|
||||
protected CContentOutlinerProvider createContentProvider(TreeViewer viewer) {
|
||||
IWorkbenchPart part= getSite().getPage().getActivePart();
|
||||
if (part == null) {
|
||||
return new CContentOutlinerProvider(viewer);
|
||||
}
|
||||
return new CContentOutlinerProvider(viewer, part.getSite());
|
||||
protected SelectionSearchGroup createSearchActionGroup() {
|
||||
return new SelectionSearchGroup(this);
|
||||
}
|
||||
|
||||
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;
|
||||
protected OpenViewActionGroup createOpenViewActionGroup() {
|
||||
OpenViewActionGroup ovag= new OpenViewActionGroup(this);
|
||||
ovag.setEnableIncludeBrowser(true);
|
||||
return ovag;
|
||||
}
|
||||
|
||||
/* (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();
|
||||
protected ActionGroup createRefactoringActionGroup() {
|
||||
return new CRefactoringActionGroup(this);
|
||||
}
|
||||
|
||||
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);
|
||||
protected ActionGroup createCustomFiltersActionGroup() {
|
||||
return new CustomFiltersActionGroup("org.eclipse.cdt.ui.COutlinePage", getTreeViewer()); //$NON-NLS-1$
|
||||
}
|
||||
|
||||
/* (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));
|
||||
protected ActionGroup createMemberFilterActionGroup() {
|
||||
return new MemberFilterActionGroup(getTreeViewer(), "COutlineViewer"); //$NON-NLS-1$
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
@ -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;
|
||||
|
||||
import org.eclipse.ui.IActionBars;
|
||||
import org.eclipse.ui.IEditorPart;
|
||||
import org.eclipse.ui.editors.text.TextEditorActionContributor;
|
||||
import org.eclipse.ui.texteditor.ITextEditor;
|
||||
import org.eclipse.ui.texteditor.ITextEditorActionDefinitionIds;
|
||||
|
||||
public class ASMEditorActionContributor extends
|
||||
TextEditorActionContributor {
|
||||
import org.eclipse.cdt.internal.ui.editor.TogglePresentationAction;
|
||||
|
||||
// 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;
|
||||
|
||||
|
||||
import org.eclipse.core.runtime.NullProgressMonitor;
|
||||
import org.eclipse.jface.preference.IPreferenceStore;
|
||||
import org.eclipse.jface.text.IDocument;
|
||||
import org.eclipse.jface.text.presentation.IPresentationReconciler;
|
||||
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.RuleBasedScanner;
|
||||
import org.eclipse.jface.text.source.ISourceViewer;
|
||||
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.internal.ui.text.PartitionDamager;
|
||||
|
@ -29,15 +34,26 @@ import org.eclipse.cdt.internal.ui.text.PartitionDamager;
|
|||
public class AsmSourceViewerConfiguration extends TextSourceViewerConfiguration {
|
||||
|
||||
private AsmTextTools fAsmTextTools;
|
||||
private ITextEditor fTextEditor;
|
||||
|
||||
/**
|
||||
* Constructor for AsmSourceViewerConfiguration
|
||||
*/
|
||||
public AsmSourceViewerConfiguration(AsmTextTools tools, IPreferenceStore store) {
|
||||
super(store);
|
||||
fTextEditor= null;
|
||||
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.
|
||||
*
|
||||
|
@ -130,7 +146,19 @@ public class AsmSourceViewerConfiguration extends TextSourceViewerConfiguration
|
|||
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;
|
||||
|
||||
|
||||
import java.util.Iterator;
|
||||
|
||||
import org.eclipse.jface.action.GroupMarker;
|
||||
import org.eclipse.jface.action.IMenuManager;
|
||||
import org.eclipse.jface.action.IStatusLineManager;
|
||||
import org.eclipse.jface.action.Separator;
|
||||
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.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.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.IWorkingCopyManager;
|
||||
|
||||
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() {
|
||||
super();
|
||||
|
@ -39,9 +89,8 @@ public class AsmTextEditor extends TextEditor {
|
|||
* Initializes this editor.
|
||||
*/
|
||||
protected void initializeEditor() {
|
||||
AsmTextTools textTools= CUIPlugin.getDefault().getAsmTextTools();
|
||||
IPreferenceStore store= CUIPlugin.getDefault().getCombinedPreferenceStore();
|
||||
setSourceViewerConfiguration(new AsmSourceViewerConfiguration(textTools, store));
|
||||
setSourceViewerConfiguration(new AsmSourceViewerConfiguration(this, store));
|
||||
setDocumentProvider(CUIPlugin.getDefault().getDocumentProvider());
|
||||
// FIXME: Should this editor have a different preference store ?
|
||||
// For now we are sharing with the CEditor and any changes in the
|
||||
|
@ -51,7 +100,44 @@ public class AsmTextEditor extends TextEditor {
|
|||
setRulerContextMenuId("#ASMEditorRulerContext"); //$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)
|
||||
* Pulled in from 2.0
|
||||
|
@ -59,9 +145,9 @@ public class AsmTextEditor extends TextEditor {
|
|||
protected boolean affectsTextPresentation(PropertyChangeEvent event) {
|
||||
boolean affects= false;
|
||||
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);
|
||||
}
|
||||
|
||||
/**
|
||||
* 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
|
||||
* are made available under the terms of the Eclipse Public License v1.0
|
||||
* which accompanies this distribution, and is available at
|
||||
|
@ -8,16 +8,14 @@
|
|||
* Contributors:
|
||||
* IBM Corporation - initial API and implementation
|
||||
* QNX Software System
|
||||
* Anton Leherbauer (Wind River Systems)
|
||||
*******************************************************************************/
|
||||
package org.eclipse.cdt.internal.ui.util;
|
||||
|
||||
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.jface.viewers.IBaseLabelProvider;
|
||||
import org.eclipse.jface.viewers.ISelectionChangedListener;
|
||||
import org.eclipse.jface.viewers.ITreeContentProvider;
|
||||
import org.eclipse.jface.viewers.LabelProviderChangedEvent;
|
||||
import org.eclipse.jface.viewers.TreeViewer;
|
||||
|
@ -35,7 +33,6 @@ import org.eclipse.swt.widgets.Widget;
|
|||
public class ProblemTreeViewer extends TreeViewer {
|
||||
|
||||
protected ResourceToItemsMapper fResourceToItemsMapper;
|
||||
private CEditor editor = null;
|
||||
|
||||
/*
|
||||
* @see TreeViewer#TreeViewer(Composite)
|
||||
|
@ -152,21 +149,5 @@ public class ProblemTreeViewer extends TreeViewer {
|
|||
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:
|
||||
return CPluginImages.DESC_OBJS_USING;
|
||||
}
|
||||
|
||||
case ICElement.ASM_LABEL:
|
||||
return CPluginImages.DESC_OBJS_LABEL;
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
|
|
Loading…
Add table
Reference in a new issue