1
0
Fork 0
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:
Anton Leherbauer 2007-10-24 10:02:44 +00:00
parent 18fa1c4fc2
commit 50fd24cadc
13 changed files with 1238 additions and 672 deletions

Binary file not shown.

After

Width:  |  Height:  |  Size: 868 B

View file

@ -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">

View file

@ -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);

View file

@ -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));
}
}

View file

@ -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$
}
}

View file

@ -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;
}
}

View file

@ -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();
}
}

View file

@ -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$
}
}

View file

@ -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);
}
}
}

View file

@ -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);
}
}

View file

@ -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();
}
}

View file

@ -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;
}
}

View file

@ -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;
}