1
/*******************************************************************************
2
* Copyright (c) 2006, 2008 Wind River Systems, Inc. and others.
3
* All rights reserved. This program and the accompanying materials
4
* are made available under the terms of the Eclipse Public License v1.0
5
* which accompanies this distribution, and is available at
6
* http://www.eclipse.org/legal/epl-v10.html
9
* Markus Schorn - initial API and implementation
10
*******************************************************************************/
11
package org.eclipse.cdt.internal.ui.callhierarchy;
13
import java.util.ArrayList;
14
import java.util.Arrays;
15
import java.util.Iterator;
17
import org.eclipse.jface.action.Action;
18
import org.eclipse.jface.action.IAction;
19
import org.eclipse.jface.action.IMenuListener;
20
import org.eclipse.jface.action.IMenuManager;
21
import org.eclipse.jface.action.IToolBarManager;
22
import org.eclipse.jface.action.MenuManager;
23
import org.eclipse.jface.action.Separator;
24
import org.eclipse.jface.text.Region;
25
import org.eclipse.jface.util.LocalSelectionTransfer;
26
import org.eclipse.jface.viewers.IOpenListener;
27
import org.eclipse.jface.viewers.ISelection;
28
import org.eclipse.jface.viewers.IStructuredSelection;
29
import org.eclipse.jface.viewers.OpenEvent;
30
import org.eclipse.jface.viewers.StructuredSelection;
31
import org.eclipse.jface.viewers.TreeViewer;
32
import org.eclipse.jface.viewers.Viewer;
33
import org.eclipse.jface.viewers.ViewerComparator;
34
import org.eclipse.jface.viewers.ViewerFilter;
35
import org.eclipse.swt.SWT;
36
import org.eclipse.swt.dnd.DND;
37
import org.eclipse.swt.dnd.DropTarget;
38
import org.eclipse.swt.dnd.Transfer;
39
import org.eclipse.swt.layout.FillLayout;
40
import org.eclipse.swt.layout.GridData;
41
import org.eclipse.swt.widgets.Composite;
42
import org.eclipse.swt.widgets.Control;
43
import org.eclipse.swt.widgets.Display;
44
import org.eclipse.swt.widgets.Label;
45
import org.eclipse.swt.widgets.Menu;
46
import org.eclipse.swt.widgets.TreeItem;
47
import org.eclipse.ui.IActionBars;
48
import org.eclipse.ui.IMemento;
49
import org.eclipse.ui.IViewSite;
50
import org.eclipse.ui.IWorkbenchPage;
51
import org.eclipse.ui.IWorkbenchPartSite;
52
import org.eclipse.ui.IWorkingSet;
53
import org.eclipse.ui.PartInitException;
54
import org.eclipse.ui.PlatformUI;
55
import org.eclipse.ui.actions.ActionFactory;
56
import org.eclipse.ui.contexts.IContextActivation;
57
import org.eclipse.ui.contexts.IContextService;
58
import org.eclipse.ui.part.PageBook;
59
import org.eclipse.ui.part.ViewPart;
61
import org.eclipse.cdt.core.model.CModelException;
62
import org.eclipse.cdt.core.model.ICElement;
63
import org.eclipse.cdt.core.model.IFunction;
64
import org.eclipse.cdt.core.model.IMethod;
65
import org.eclipse.cdt.core.model.ITranslationUnit;
66
import org.eclipse.cdt.core.model.util.CElementBaseLabels;
67
import org.eclipse.cdt.ui.CUIPlugin;
68
import org.eclipse.cdt.ui.actions.CdtActionConstants;
69
import org.eclipse.cdt.ui.actions.OpenViewActionGroup;
70
import org.eclipse.cdt.ui.refactoring.actions.CRefactoringActionGroup;
72
import org.eclipse.cdt.internal.ui.CPluginImages;
73
import org.eclipse.cdt.internal.ui.ICHelpContextIds;
74
import org.eclipse.cdt.internal.ui.IContextMenuConstants;
75
import org.eclipse.cdt.internal.ui.editor.ICEditorActionDefinitionIds;
76
import org.eclipse.cdt.internal.ui.search.actions.SelectionSearchGroup;
77
import org.eclipse.cdt.internal.ui.util.CoreUtility;
78
import org.eclipse.cdt.internal.ui.util.Messages;
79
import org.eclipse.cdt.internal.ui.viewsupport.AdaptingSelectionProvider;
80
import org.eclipse.cdt.internal.ui.viewsupport.CElementLabels;
81
import org.eclipse.cdt.internal.ui.viewsupport.EditorOpener;
82
import org.eclipse.cdt.internal.ui.viewsupport.ExtendedTreeViewer;
83
import org.eclipse.cdt.internal.ui.viewsupport.IndexUI;
84
import org.eclipse.cdt.internal.ui.viewsupport.TreeNavigator;
85
import org.eclipse.cdt.internal.ui.viewsupport.WorkingSetFilterUI;
88
* The view part for the include browser.
90
public class CHViewPart extends ViewPart {
91
private static final int MAX_HISTORY_SIZE = 10;
92
private static final String TRUE = String.valueOf(true);
93
private static final String KEY_WORKING_SET_FILTER = "workingSetFilter"; //$NON-NLS-1$
94
private static final String KEY_FILTER_VARIABLES = "variableFilter"; //$NON-NLS-1$
95
// private static final String KEY_FILTER_MACROS = "macroFilter"; //$NON-NLS-1$
96
private static final String KEY_SHOW_FILES= "showFilesInLabels"; //$NON-NLS-1$
98
private IMemento fMemento;
99
private boolean fShowsMessage;
100
private CHNode fNavigationNode;
101
private int fNavigationDetail;
103
private ArrayList<ICElement> fHistoryEntries= new ArrayList<ICElement>(MAX_HISTORY_SIZE);
106
private PageBook fPagebook;
107
private Composite fViewerPage;
108
private Label fInfoText;
111
private CHContentProvider fContentProvider;
112
private CHLabelProvider fLabelProvider;
113
private ExtendedTreeViewer fTreeViewer;
116
private ViewerFilter fVariableFilter;
117
// private ViewerFilter fMacroFilter;
118
private ViewerComparator fSorterAlphaNumeric;
119
private ViewerComparator fSorterReferencePosition;
120
private WorkingSetFilterUI fWorkingSetFilterUI;
123
private Action fReferencedByAction;
124
private Action fMakesReferenceToAction;
125
private Action fFilterVariablesAction;
126
// private Action fFilterMacrosAction;
127
private Action fShowFilesInLabelsAction;
128
private Action fNextAction;
129
private Action fPreviousAction;
130
private Action fRefreshAction;
131
private Action fHistoryAction;
132
private Action fShowReference;
133
private Action fOpenElement;
136
private OpenViewActionGroup fOpenViewActionGroup;
137
private SelectionSearchGroup fSelectionSearchGroup;
138
private CRefactoringActionGroup fRefactoringActionGroup;
139
private IContextActivation fContextActivation;
143
public void setFocus() {
144
fPagebook.setFocus();
147
public void setMessage(String msg) {
148
fInfoText.setText(msg);
149
fPagebook.showPage(fInfoText);
152
updateActionEnablement();
155
public void setInput(ICElement input) {
157
setMessage(CHMessages.CHViewPart_emptyPageMessage);
158
fTreeViewer.setInput(null);
161
fShowsMessage= false;
162
boolean allowsRefTo= allowsRefTo(input);
163
fTreeViewer.setInput(null);
164
if (!allowsRefTo && !fContentProvider.getComputeReferencedBy()) {
165
fContentProvider.setComputeReferencedBy(true);
166
fReferencedByAction.setChecked(true);
167
fMakesReferenceToAction.setChecked(false);
170
fMakesReferenceToAction.setEnabled(allowsRefTo);
171
fTreeViewer.setInput(input);
172
fPagebook.showPage(fViewerPage);
174
updateHistory(input);
175
updateActionEnablement();
178
public void reportNotIndexed(ICElement input) {
179
if (input != null && getInput() == input) {
180
setMessage(IndexUI.getFileNotIndexedMessage(input));
184
public void reportInputReplacement(ICElement input, ICElement inputHandle) {
185
if (input == getInput()) {
186
fTreeViewer.setInput(inputHandle);
187
fTreeViewer.setExpandedState(inputHandle, true);
191
private boolean allowsRefTo(ICElement element) {
192
if (element instanceof IFunction || element instanceof IMethod) {
200
public void createPartControl(Composite parent) {
201
fPagebook = new PageBook(parent, SWT.NULL);
202
fPagebook.setLayoutData(new GridData(GridData.FILL_BOTH));
206
getSite().setSelectionProvider(new AdaptingSelectionProvider(ICElement.class, fTreeViewer));
212
setMessage(CHMessages.CHViewPart_emptyPageMessage);
214
initializeActionStates();
216
IContextService ctxService = (IContextService) getSite().getService(IContextService.class);
217
if (ctxService != null) {
218
fContextActivation= ctxService.activateContext(CUIPlugin.CVIEWS_SCOPE);
221
PlatformUI.getWorkbench().getHelpSystem().setHelp(fPagebook, ICHelpContextIds.CALL_HIERARCHY_VIEW);
225
public void dispose() {
226
if (fContextActivation != null) {
227
IContextService ctxService = (IContextService)getSite().getService(IContextService.class);
228
if (ctxService != null) {
229
ctxService.deactivateContext(fContextActivation);
233
if (fOpenViewActionGroup != null) {
234
fOpenViewActionGroup.dispose();
235
fOpenViewActionGroup= null;
237
if (fSelectionSearchGroup != null) {
238
fSelectionSearchGroup.dispose();
239
fSelectionSearchGroup= null;
241
if (fRefactoringActionGroup != null) {
242
fRefactoringActionGroup.dispose();
243
fRefactoringActionGroup= null;
245
if (fWorkingSetFilterUI != null) {
246
fWorkingSetFilterUI.dispose();
247
fWorkingSetFilterUI= null;
252
private void initializeActionStates() {
253
boolean referencedBy= true;
254
boolean filterVariables= false;
255
// boolean filterMacros= false;
256
boolean showFiles= false;
258
if (fMemento != null) {
259
filterVariables= TRUE.equals(fMemento.getString(KEY_FILTER_VARIABLES));
260
// filterMacros= TRUE.equals(fMemento.getString(KEY_FILTER_MACROS));
261
showFiles= TRUE.equals(fMemento.getString(KEY_SHOW_FILES));
264
fLabelProvider.setShowFiles(showFiles);
265
fShowFilesInLabelsAction.setChecked(showFiles);
267
fReferencedByAction.setChecked(referencedBy);
268
fMakesReferenceToAction.setChecked(!referencedBy);
269
fContentProvider.setComputeReferencedBy(referencedBy);
271
// fFilterMacrosAction.setChecked(filterMacros);
272
// fFilterMacrosAction.run();
273
fFilterVariablesAction.setChecked(filterVariables);
274
fFilterVariablesAction.run();
279
public void init(IViewSite site, IMemento memento) throws PartInitException {
281
super.init(site, memento);
286
public void saveState(IMemento memento) {
287
if (fWorkingSetFilterUI != null) {
288
fWorkingSetFilterUI.saveState(memento, KEY_WORKING_SET_FILTER);
290
// memento.putString(KEY_FILTER_MACROS, String.valueOf(fFilterMacrosAction.isChecked()));
291
memento.putString(KEY_FILTER_VARIABLES, String.valueOf(fFilterVariablesAction.isChecked()));
292
memento.putString(KEY_SHOW_FILES, String.valueOf(fShowFilesInLabelsAction.isChecked()));
293
super.saveState(memento);
296
private void createContextMenu() {
297
MenuManager manager = new MenuManager();
298
manager.setRemoveAllWhenShown(true);
299
manager.addMenuListener(new IMenuListener() {
300
public void menuAboutToShow(IMenuManager m) {
301
onContextMenuAboutToShow(m);
304
Menu menu = manager.createContextMenu(fTreeViewer.getControl());
305
fTreeViewer.getControl().setMenu(menu);
306
IWorkbenchPartSite site = getSite();
307
site.registerContextMenu(CUIPlugin.ID_CALL_HIERARCHY, manager, fTreeViewer);
310
private void createViewerPage() {
311
Display display= getSite().getShell().getDisplay();
312
fViewerPage = new Composite(fPagebook, SWT.NULL);
313
fViewerPage.setLayoutData(new GridData(GridData.FILL_BOTH));
314
fViewerPage.setSize(100, 100);
315
fViewerPage.setLayout(new FillLayout());
317
fContentProvider= new CHContentProvider(this, display);
318
fLabelProvider= new CHLabelProvider(display, fContentProvider);
319
fTreeViewer= new ExtendedTreeViewer(fViewerPage);
320
fTreeViewer.setContentProvider(fContentProvider);
321
fTreeViewer.setLabelProvider(fLabelProvider);
322
fTreeViewer.setAutoExpandLevel(2);
323
fTreeViewer.addOpenListener(new IOpenListener() {
324
public void open(OpenEvent event) {
325
onShowSelectedReference(event.getSelection());
330
private void createInfoPage() {
331
fInfoText = new Label(fPagebook, SWT.TOP | SWT.LEFT | SWT.WRAP);
334
private void initDragAndDrop() {
335
CHDropTargetListener dropListener= new CHDropTargetListener(this);
336
Transfer[] localSelectionTransfer= new Transfer[] {
337
LocalSelectionTransfer.getTransfer()
339
DropTarget dropTarget = new DropTarget(fPagebook, DND.DROP_MOVE | DND.DROP_COPY | DND.DROP_LINK | DND.DROP_DEFAULT);
340
dropTarget.setTransfer(localSelectionTransfer);
341
dropTarget.addDropListener(dropListener);
344
private void createActions() {
346
fOpenViewActionGroup= new OpenViewActionGroup(this);
347
fOpenViewActionGroup.setSuppressCallHierarchy(true);
348
fOpenViewActionGroup.setSuppressProperties(true);
349
fOpenViewActionGroup.setEnableIncludeBrowser(true);
350
fSelectionSearchGroup= new SelectionSearchGroup(getSite());
351
fRefactoringActionGroup= new CRefactoringActionGroup(this);
353
fWorkingSetFilterUI= new WorkingSetFilterUI(this, fMemento, KEY_WORKING_SET_FILTER) {
355
protected void onWorkingSetChange() {
356
updateWorkingSetFilter(this);
359
protected void onWorkingSetNameChange() {
365
new Action(CHMessages.CHViewPart_ShowCallers_label, IAction.AS_RADIO_BUTTON) {
369
onSetShowReferencedBy(true);
373
fReferencedByAction.setToolTipText(CHMessages.CHViewPart_ShowCallers_tooltip);
374
CPluginImages.setImageDescriptors(fReferencedByAction, CPluginImages.T_LCL, CPluginImages.IMG_ACTION_SHOW_REF_BY);
376
fMakesReferenceToAction=
377
new Action(CHMessages.CHViewPart_ShowCallees_label, IAction.AS_RADIO_BUTTON) {
381
onSetShowReferencedBy(false);
385
fMakesReferenceToAction.setToolTipText(CHMessages.CHViewPart_ShowCallees_tooltip);
386
CPluginImages.setImageDescriptors(fMakesReferenceToAction, CPluginImages.T_LCL, CPluginImages.IMG_ACTION_SHOW_RELATES_TO);
388
fVariableFilter= new ViewerFilter() {
390
public boolean select(Viewer viewer, Object parentElement, Object element) {
391
if (element instanceof CHNode) {
392
CHNode node= (CHNode) element;
393
return !node.isVariableOrEnumerator();
398
fFilterVariablesAction= new Action(CHMessages.CHViewPart_FilterVariables_label, IAction.AS_CHECK_BOX) {
402
fTreeViewer.addFilter(fVariableFilter);
405
fTreeViewer.removeFilter(fVariableFilter);
409
fFilterVariablesAction.setToolTipText(CHMessages.CHViewPart_FilterVariables_tooltip);
410
CPluginImages.setImageDescriptors(fFilterVariablesAction, CPluginImages.T_LCL, CPluginImages.IMG_ACTION_HIDE_FIELDS);
412
fSorterAlphaNumeric= new ViewerComparator();
413
fSorterReferencePosition= new ViewerComparator() {
415
public int category(Object element) {
416
if (element instanceof CHNode) {
422
public int compare(Viewer viewer, Object e1, Object e2) {
423
if (!(e1 instanceof CHNode)) {
424
if (!(e2 instanceof CHNode)) {
429
if (!(e2 instanceof CHNode)) {
432
CHNode n1= (CHNode) e1;
433
CHNode n2= (CHNode) e2;
434
int offset1= n1.getFirstReferenceOffset();
435
int offset2= n2.getFirstReferenceOffset();
436
return CoreUtility.compare(offset1, offset2);
440
fShowReference= new Action(CHMessages.CHViewPart_ShowReference_label) {
443
onShowSelectedReference(fTreeViewer.getSelection());
446
fShowReference.setToolTipText(CHMessages.CHViewPart_ShowReference_tooltip);
447
fOpenElement= new Action(CHMessages.CHViewPart_Open_label) {
450
onOpenElement(fTreeViewer.getSelection());
453
fOpenElement.setToolTipText(CHMessages.CHViewPart_Open_tooltip);
454
fOpenElement.setActionDefinitionId(ICEditorActionDefinitionIds.OPEN_DECL);
456
fShowFilesInLabelsAction= new Action(CHMessages.CHViewPart_ShowFiles_label, IAction.AS_CHECK_BOX) {
459
onShowFilesInLabels(isChecked());
462
fShowFilesInLabelsAction.setToolTipText(CHMessages.CHViewPart_ShowFiles_tooltip);
463
fNextAction = new Action(CHMessages.CHViewPart_NextReference_label) {
466
onNextOrPrevious(true);
469
fNextAction.setToolTipText(CHMessages.CHViewPart_NextReference_tooltip);
470
CPluginImages.setImageDescriptors(fNextAction, CPluginImages.T_LCL, CPluginImages.IMG_SHOW_NEXT);
472
fPreviousAction = new Action(CHMessages.CHViewPart_PreviousReference_label) {
475
onNextOrPrevious(false);
478
fPreviousAction.setToolTipText(CHMessages.CHViewPart_PreviousReference_tooltip);
479
CPluginImages.setImageDescriptors(fPreviousAction, CPluginImages.T_LCL, CPluginImages.IMG_SHOW_PREV);
481
fRefreshAction = new Action(CHMessages.CHViewPart_Refresh_label) {
487
fRefreshAction.setToolTipText(CHMessages.CHViewPart_Refresh_tooltip);
488
CPluginImages.setImageDescriptors(fRefreshAction, CPluginImages.T_LCL, CPluginImages.IMG_REFRESH);
490
fHistoryAction = new CHHistoryDropDownAction(this);
493
// global action hooks
494
IActionBars actionBars = getViewSite().getActionBars();
495
fRefactoringActionGroup.fillActionBars(actionBars);
496
fOpenViewActionGroup.fillActionBars(actionBars);
497
fSelectionSearchGroup.fillActionBars(actionBars);
499
actionBars.setGlobalActionHandler(CdtActionConstants.OPEN_DECLARATION, fOpenElement);
500
actionBars.setGlobalActionHandler(ActionFactory.NEXT.getId(), fNextAction);
501
actionBars.setGlobalActionHandler(ActionFactory.PREVIOUS.getId(), fPreviousAction);
502
actionBars.setGlobalActionHandler(ActionFactory.REFRESH.getId(), fRefreshAction);
503
actionBars.updateActionBars();
506
IToolBarManager tm = actionBars.getToolBarManager();
508
tm.add(fPreviousAction);
509
tm.add(new Separator());
510
// tm.add(fFilterMacrosAction);
511
tm.add(fFilterVariablesAction);
512
tm.add(new Separator());
513
tm.add(fReferencedByAction);
514
tm.add(fMakesReferenceToAction);
515
tm.add(fHistoryAction);
516
tm.add(fRefreshAction);
519
IMenuManager mm = actionBars.getMenuManager();
522
// tm.add(fPrevious);
523
// tm.add(new Separator());
524
fWorkingSetFilterUI.fillActionBars(actionBars);
525
mm.add(fReferencedByAction);
526
mm.add(fMakesReferenceToAction);
527
mm.add(new Separator());
528
mm.add(fShowFilesInLabelsAction);
529
mm.add(new Separator());
530
// mm.add(fFilterMacrosAction);
531
mm.add(fFilterVariablesAction);
534
private void setNextNode(boolean forward) {
535
TreeNavigator navigator= new TreeNavigator(fTreeViewer.getTree(), CHNode.class);
536
TreeItem selectedItem= navigator.getSelectedItemOrFirstOnLevel(1, forward);
537
if (selectedItem == null) {
538
fNavigationNode= null;
543
if (selectedItem.getData().equals(fNavigationNode)) {
544
if (forward && fNavigationDetail < getReferenceCount(fNavigationNode)-1) {
547
else if (!forward && fNavigationDetail > 0) {
551
selectedItem= navigator.getNextSibbling(selectedItem, forward);
552
fNavigationNode= selectedItem == null ? null : (CHNode) selectedItem.getData();
553
initNavigationDetail(forward);
557
fNavigationNode= (CHNode) selectedItem.getData();
558
initNavigationDetail(forward);
562
private void initNavigationDetail(boolean forward) {
563
if (!forward && fNavigationNode != null) {
564
fNavigationDetail= Math.max(0, getReferenceCount(fNavigationNode) -1);
567
fNavigationDetail= 0;
571
protected void onShowSelectedReference(ISelection selection) {
572
CHNode node= selectionToNode(selection);
573
if (node != null && node == fNavigationNode && node.getReferenceCount() > 0) {
574
fNavigationDetail= (fNavigationDetail + 1) % node.getReferenceCount();
577
fNavigationDetail= 0;
579
fNavigationNode= node;
583
protected void onOpenElement(ISelection selection) {
584
CHNode node= selectionToNode(selection);
588
private void openElement(CHNode node) {
589
if (node != null && !node.isMultiDef()) {
590
ICElement elem= node.getRepresentedDeclaration();
592
IWorkbenchPage page= getSite().getPage();
594
EditorOpener.open(page, elem);
595
} catch (CModelException e) {
602
protected void onNextOrPrevious(boolean forward) {
603
setNextNode(forward);
604
if (fNavigationNode != null) {
605
StructuredSelection sel= new StructuredSelection(fNavigationNode);
606
fTreeViewer.setSelection(sel);
611
protected void onRefresh() {
612
fContentProvider.recompute();
615
protected void onShowFilesInLabels(boolean show) {
616
fLabelProvider.setShowFiles(show);
617
fTreeViewer.refresh();
620
private void updateHistory(ICElement input) {
622
fHistoryEntries.remove(input);
623
fHistoryEntries.add(0, input);
624
if (fHistoryEntries.size() > MAX_HISTORY_SIZE) {
625
fHistoryEntries.remove(MAX_HISTORY_SIZE-1);
630
private void updateSorter() {
631
if (fReferencedByAction.isChecked()) {
632
fTreeViewer.setComparator(fSorterAlphaNumeric);
635
fTreeViewer.setComparator(fSorterReferencePosition);
639
private void updateDescription() {
640
String message= ""; //$NON-NLS-1$
641
if (!fShowsMessage) {
642
ICElement elem= getInput();
644
String format, scope, label;
647
label= CElementBaseLabels.getElementLabel(elem, CHHistoryAction.LABEL_OPTIONS);
650
IWorkingSet workingSet= fWorkingSetFilterUI.getWorkingSet();
651
if (workingSet == null) {
652
scope= CHMessages.CHViewPart_WorkspaceScope;
655
scope= workingSet.getLabel();
659
if (fReferencedByAction.isChecked()) {
660
format= CHMessages.CHViewPart_Title_callers;
663
format= CHMessages.CHViewPart_Title_callees;
667
message= Messages.format(format, label, scope);
670
setContentDescription(message);
673
private void updateActionEnablement() {
674
fHistoryAction.setEnabled(!fHistoryEntries.isEmpty());
675
fNextAction.setEnabled(!fShowsMessage);
676
fPreviousAction.setEnabled(!fShowsMessage);
677
fRefreshAction.setEnabled(!fShowsMessage);
680
private void updateWorkingSetFilter(WorkingSetFilterUI filterUI) {
681
fContentProvider.setWorkingSetFilter(filterUI);
684
public void onSetShowReferencedBy(boolean showReferencedBy) {
685
if (showReferencedBy != fContentProvider.getComputeReferencedBy()) {
686
Object input= fTreeViewer.getInput();
687
fTreeViewer.setInput(null);
688
fContentProvider.setComputeReferencedBy(showReferencedBy);
690
fTreeViewer.setInput(input);
695
protected void onContextMenuAboutToShow(IMenuManager menu) {
696
CUIPlugin.createStandardGroups(menu);
698
CHNode node= selectionToNode(fTreeViewer.getSelection());
700
if (getReferenceCount(node) > 0) {
701
menu.appendToGroup(IContextMenuConstants.GROUP_OPEN, fShowReference);
703
if (!node.isMultiDef()) {
704
menu.appendToGroup(IContextMenuConstants.GROUP_OPEN, fOpenElement);
706
if (node.getParent() != null) {
707
final ICElement element= node.getRepresentedDeclaration();
708
if (element != null) {
709
String label= Messages.format(CHMessages.CHViewPart_FocusOn_label,
710
CElementLabels.getTextLabel(element, CElementBaseLabels.ALL_FULLY_QUALIFIED | CElementBaseLabels.M_PARAMETER_TYPES));
711
menu.appendToGroup(IContextMenuConstants.GROUP_OPEN, new Action(label) {
722
ISelection selection = getSite().getSelectionProvider().getSelection();
723
if (OpenViewActionGroup.canActionBeAdded(selection)){
724
fOpenViewActionGroup.fillContextMenu(menu);
727
if (SelectionSearchGroup.canActionBeAdded(selection)){
728
fSelectionSearchGroup.fillContextMenu(menu);
730
fRefactoringActionGroup.fillContextMenu(menu);
733
private void showReference() {
734
if (fNavigationNode != null) {
735
ITranslationUnit file= fNavigationNode.getFileOfReferences();
737
IWorkbenchPage page= getSite().getPage();
738
if (fNavigationNode.getReferenceCount() > 0) {
739
long timestamp= fNavigationNode.getTimestamp();
740
if (fNavigationDetail < 0) {
741
fNavigationDetail= 0;
743
else if (fNavigationDetail >= fNavigationNode.getReferenceCount()-1) {
744
fNavigationDetail= fNavigationNode.getReferenceCount()-1;
747
CHReferenceInfo ref= fNavigationNode.getReference(fNavigationDetail);
748
Region region= new Region(ref.getOffset(), ref.getLength());
749
EditorOpener.open(page, file, region, timestamp);
753
EditorOpener.open(page, fNavigationNode.getRepresentedDeclaration());
754
} catch (CModelException e) {
762
private int getReferenceCount(CHNode node) {
764
CHNode parent = node.getParent();
765
if (parent instanceof CHMultiDefNode) {
766
return parent.getReferenceCount();
768
return node.getReferenceCount();
774
private CHNode selectionToNode(ISelection selection) {
775
if (selection instanceof IStructuredSelection) {
776
IStructuredSelection ss= (IStructuredSelection) selection;
777
for (Iterator<?> iter = ss.iterator(); iter.hasNext(); ) {
778
Object cand= iter.next();
779
if (cand instanceof CHNode) {
780
return (CHNode) cand;
787
public Control getPageBook() {
791
public ICElement[] getHistoryEntries() {
792
return fHistoryEntries.toArray(new ICElement[fHistoryEntries.size()]);
795
public void setHistoryEntries(ICElement[] remaining) {
796
fHistoryEntries.clear();
797
fHistoryEntries.addAll(Arrays.asList(remaining));
800
public ICElement getInput() {
801
Object input= fTreeViewer.getInput();
802
if (input instanceof ICElement) {
803
return (ICElement) input;
808
public TreeViewer getTreeViewer() {