blob: efdafaf8194bbff8045b83a76e53c0a715d70099 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2006, 2010 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:
* Markus Schorn - initial API and implementation
* Ed Swartz (Nokia)
* IBM Corporation
*******************************************************************************/
/* -- ST-Origin --
* Source folder: org.eclipse.cdt.ui/src
* Class: org.eclipse.cdt.internal.ui.includebrowser.IBViewPart
* Version: 1.30
*/
package org.eclipse.ptp.internal.rdt.ui.includebrowser;
import java.util.ArrayList;
import java.util.Arrays;
import org.eclipse.cdt.core.CCorePlugin;
import org.eclipse.cdt.core.index.IIndexFileLocation;
import org.eclipse.cdt.core.model.CModelException;
import org.eclipse.cdt.core.model.CoreModel;
import org.eclipse.cdt.core.model.CoreModelUtil;
import org.eclipse.cdt.core.model.ICElement;
import org.eclipse.cdt.core.model.ICProject;
import org.eclipse.cdt.core.model.ITranslationUnit;
import org.eclipse.cdt.core.model.IWorkingCopy;
import org.eclipse.cdt.internal.ui.CPluginImages;
import org.eclipse.cdt.internal.ui.includebrowser.IBConversions;
import org.eclipse.cdt.internal.ui.includebrowser.IBFile;
import org.eclipse.cdt.internal.ui.includebrowser.IBMessages;
import org.eclipse.cdt.internal.ui.includebrowser.IBNode;
import org.eclipse.cdt.internal.ui.includebrowser.IBWorkingSetFilter;
import org.eclipse.cdt.internal.ui.navigator.OpenCElementAction;
import org.eclipse.cdt.internal.ui.util.Messages;
import org.eclipse.cdt.internal.ui.viewsupport.EditorOpener;
import org.eclipse.cdt.internal.ui.viewsupport.ExtendedTreeViewer;
import org.eclipse.cdt.internal.ui.viewsupport.IndexUI;
import org.eclipse.cdt.internal.ui.viewsupport.TreeNavigator;
import org.eclipse.cdt.internal.ui.viewsupport.WorkingSetFilterUI;
import org.eclipse.cdt.ui.CUIPlugin;
import org.eclipse.core.resources.IFile;
import org.eclipse.core.resources.IProject;
import org.eclipse.core.resources.IResource;
import org.eclipse.core.resources.ResourcesPlugin;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IPath;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.Path;
import org.eclipse.core.runtime.Status;
import org.eclipse.core.runtime.jobs.Job;
import org.eclipse.jface.action.Action;
import org.eclipse.jface.action.IAction;
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.dialogs.IDialogSettings;
import org.eclipse.jface.text.IRegion;
import org.eclipse.jface.text.Region;
import org.eclipse.jface.util.LocalSelectionTransfer;
import org.eclipse.jface.viewers.IOpenListener;
import org.eclipse.jface.viewers.ISelection;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.jface.viewers.OpenEvent;
import org.eclipse.jface.viewers.StructuredSelection;
import org.eclipse.jface.viewers.TreeViewer;
import org.eclipse.jface.viewers.Viewer;
import org.eclipse.jface.viewers.ViewerComparator;
import org.eclipse.jface.viewers.ViewerFilter;
import org.eclipse.ptp.internal.rdt.ui.RDTHelpContextIds;
import org.eclipse.ptp.rdt.ui.UIPlugin;
import org.eclipse.search.ui.IContextMenuConstants;
import org.eclipse.swt.SWT;
import org.eclipse.swt.dnd.DND;
import org.eclipse.swt.dnd.DropTarget;
import org.eclipse.swt.dnd.FileTransfer;
import org.eclipse.swt.dnd.Transfer;
import org.eclipse.swt.layout.FillLayout;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.Menu;
import org.eclipse.swt.widgets.TreeItem;
import org.eclipse.ui.IActionBars;
import org.eclipse.ui.IMemento;
import org.eclipse.ui.IPageLayout;
import org.eclipse.ui.IViewSite;
import org.eclipse.ui.IWorkbenchPage;
import org.eclipse.ui.IWorkbenchPartSite;
import org.eclipse.ui.PartInitException;
import org.eclipse.ui.PlatformUI;
import org.eclipse.ui.actions.ActionFactory;
import org.eclipse.ui.actions.ContributionItemFactory;
import org.eclipse.ui.actions.OpenFileAction;
import org.eclipse.ui.contexts.IContextActivation;
import org.eclipse.ui.contexts.IContextService;
import org.eclipse.ui.navigator.resources.ProjectExplorer;
import org.eclipse.ui.part.IShowInSource;
import org.eclipse.ui.part.IShowInTarget;
import org.eclipse.ui.part.IShowInTargetList;
import org.eclipse.ui.part.PageBook;
import org.eclipse.ui.part.ResourceTransfer;
import org.eclipse.ui.part.ShowInContext;
import org.eclipse.ui.part.ViewPart;
/**
* The view part for the include browser.
*/
public class IBViewPart extends ViewPart
implements IShowInSource, IShowInTarget, IShowInTargetList {
private static final int MAX_HISTORY_SIZE = 10;
private static final String TRUE = "true"; //$NON-NLS-1$
private static final String FALSE = "false"; //$NON-NLS-1$
private static final String KEY_WORKING_SET_FILTER = "workingSetFilter"; //$NON-NLS-1$
private static final String KEY_FILTER_SYSTEM = "systemFilter"; //$NON-NLS-1$
private static final String KEY_FILTER_INACTIVE = "inactiveFilter"; //$NON-NLS-1$
private static final String KEY_INPUT_PATH= "inputPath"; //$NON-NLS-1$
private static final String KEY_INCLUDED_BY = "includedBy"; //$NON-NLS-1$
private static final String KEY_SHOW_FOLDERS = "showFolders"; //$NON-NLS-1$
private IMemento fMemento;
private boolean fShowsMessage;
private IBNode fLastNavigationNode;
private ArrayList<ITranslationUnit> fHistoryEntries= new ArrayList<ITranslationUnit>(MAX_HISTORY_SIZE);
// widgets
private PageBook fPagebook;
private Composite fViewerPage;
private Label fInfoText;
// treeviewer
private IBContentProvider fContentProvider;
private IBLabelProvider fLabelProvider;
private ExtendedTreeViewer fTreeViewer;
// filters, sorter
private IBWorkingSetFilter fWorkingSetFilter;
private ViewerFilter fInactiveFilter;
private ViewerFilter fSystemFilter;
private ViewerComparator fSorterAlphaNumeric;
private ViewerComparator fSorterReferencePosition;
// actions
private Action fIncludedByAction;
private Action fIncludesToAction;
private Action fFilterInactiveAction;
private Action fFilterSystemAction;
private Action fShowFolderInLabelsAction;
private Action fNextAction;
private Action fPreviousAction;
private Action fRefreshAction;
private Action fHistoryAction;
private IContextActivation fContextActivation;
private WorkingSetFilterUI fWorkingSetFilterUI;
private IBSetInputJob fSetInputJob;
@Override
public void setFocus() {
fPagebook.setFocus();
}
public void setMessage(String msg) {
fInfoText.setText(msg);
fPagebook.showPage(fInfoText);
fShowsMessage= true;
updateActionEnablement();
updateDescription();
}
public void setInput(ITranslationUnit input) {
if (fPagebook.isDisposed()) {
return;
}
if (input instanceof IWorkingCopy) {
input= ((IWorkingCopy) input).getOriginalElement();
}
fSetInputJob.cancel();
if (input == null) {
setMessage(IBMessages.IBViewPart_instructionMessage);
fTreeViewer.setInput(null);
return;
}
if (CCorePlugin.getIndexManager().isIndexerIdle()) {
setInputIndexerIdle(input);
}
else {
setMessage(IBMessages.IBViewPart_waitingOnIndexerMessage);
fSetInputJob.setInput(input);
fSetInputJob.schedule();
}
}
private void setInputIndexerIdle(final ITranslationUnit input) {
fShowsMessage= false;
boolean isHeader= input.isHeaderUnit();
fTreeViewer.setInput(null);
if (!isHeader) {
fContentProvider.setComputeIncludedBy(isHeader);
fIncludedByAction.setChecked(isHeader);
fIncludesToAction.setChecked(!isHeader);
fIncludedByAction.setEnabled(false);
updateSorter();
}
else {
fIncludedByAction.setEnabled(true);
}
fTreeViewer.setInput(input);
fPagebook.showPage(fViewerPage);
updateHistory(input);
updateActionEnablement();
updateDescription();
final Display display= Display.getCurrent();
Job job= new Job(IBMessages.IBViewPart_jobCheckInput) {
@Override
protected IStatus run(IProgressMonitor monitor) {
try
{
if (!IncludeBrowserUI.isIndexed(input, monitor))
{
// Bug 306879: Try to find an alternative translation unit for the file by the location.
// final ITranslationUnit alt= CoreModelUtil.findTranslationUnitForLocation(input.getLocation(), input.getCProject());
// if (alt != null && IncludeBrowserUI.isIndexed(alt, monitor)) {
// display.asyncExec(new Runnable() {
// public void run() {
// if (fTreeViewer.getInput() == input) {
// setInput(alt);
// }
// }
// });
// } else {
final String msg = IndexUI.getFileNotIndexedMessage(input);
display.asyncExec(new Runnable() {
public void run() {
if (fTreeViewer.getInput() == input) {
setMessage(msg);
fTreeViewer.setInput(null);
}
}
});
// }
}
return Status.OK_STATUS;
}
catch (CoreException e)
{
return Status.OK_STATUS;
}
}
};
job.setSystem(true);
job.schedule();
}
private void updateActionEnablement() {
fHistoryAction.setEnabled(!fHistoryEntries.isEmpty());
fNextAction.setEnabled(!fShowsMessage);
fPreviousAction.setEnabled(!fShowsMessage);
fRefreshAction.setEnabled(!fShowsMessage);
}
@Override
public void createPartControl(Composite parent) {
fSetInputJob= new IBSetInputJob(this, Display.getCurrent());
fPagebook = new PageBook(parent, SWT.NULL);
fPagebook.setLayoutData(new GridData(GridData.FILL_BOTH));
createInfoPage();
createViewerPage();
initDragAndDrop();
createActions();
createContextMenu();
getSite().setSelectionProvider(fTreeViewer);
setMessage(IBMessages.IBViewPart_instructionMessage);
initializeActionStates();
restoreInput();
fMemento= null;
IContextService ctxService = (IContextService) getSite().getService(IContextService.class);
if (ctxService != null) {
fContextActivation= ctxService.activateContext(CUIPlugin.CVIEWS_SCOPE);
}
PlatformUI.getWorkbench().getHelpSystem().setHelp(fPagebook, RDTHelpContextIds.REMOTE_INCLUDE_BROWSER);
}
@Override
public void dispose() {
putDialogSettings();
if (fContextActivation != null) {
IContextService ctxService = (IContextService)getSite().getService(IContextService.class);
if (ctxService != null) {
ctxService.deactivateContext(fContextActivation);
}
}
if (fWorkingSetFilterUI != null) {
fWorkingSetFilterUI.dispose();
}
}
private void initializeActionStates() {
IDialogSettings ds= getDialogSettings();
boolean includedBy= !FALSE.equals(ds.get(KEY_INCLUDED_BY));
fIncludedByAction.setChecked(includedBy);
fIncludesToAction.setChecked(!includedBy);
fContentProvider.setComputeIncludedBy(includedBy);
fFilterInactiveAction.setChecked(TRUE.equals(ds.get(KEY_FILTER_INACTIVE)));
fFilterInactiveAction.run();
fFilterSystemAction.setChecked(TRUE.equals(ds.get(KEY_FILTER_SYSTEM)));
fFilterSystemAction.run();
fShowFolderInLabelsAction.setChecked(TRUE.equals((ds.get(KEY_SHOW_FOLDERS))));
fShowFolderInLabelsAction.run();
updateSorter();
}
private void restoreInput() {
if (fMemento != null) {
String pathStr= fMemento.getString(KEY_INPUT_PATH);
if (pathStr != null) {
IPath path= Path.fromPortableString(pathStr);
if (path.segmentCount() > 1) {
String name= path.segment(0);
ICProject project= CoreModel.getDefault().getCModel().getCProject(name);
if (project != null) {
ICElement celement;
try {
celement = project.findElement(path);
if (celement instanceof ITranslationUnit) {
setInput((ITranslationUnit) celement);
}
} catch (CModelException e) {
// ignore
}
}
}
}
}
}
@Override
public void init(IViewSite site, IMemento memento) throws PartInitException {
fMemento= memento;
super.init(site, memento);
}
@Override
public void saveState(IMemento memento) {
putDialogSettings();
if (memento != null) {
if (fWorkingSetFilter != null) {
fWorkingSetFilter.getUI().saveState(memento, KEY_WORKING_SET_FILTER);
}
ITranslationUnit input= getInput();
if (input != null) {
IPath path= input.getPath();
if (path != null) {
memento.putString(KEY_INPUT_PATH, path.toPortableString());
}
}
}
super.saveState(memento);
}
private void putDialogSettings() {
IDialogSettings ds= getDialogSettings();
ds.put(KEY_FILTER_INACTIVE, String.valueOf(fFilterInactiveAction.isChecked()));
ds.put(KEY_FILTER_SYSTEM, String.valueOf(fFilterSystemAction.isChecked()));
ds.put(KEY_INCLUDED_BY, String.valueOf(fIncludedByAction.isChecked()));
ds.put(KEY_SHOW_FOLDERS, String.valueOf(fShowFolderInLabelsAction.isChecked()));
}
private IDialogSettings getDialogSettings() {
IDialogSettings ds= CUIPlugin.getDefault().getDialogSettings();
final String name = IBViewPart.class.getName();
IDialogSettings result= ds.getSection(name);
if (result == null) {
result= ds.addNewSection(name);
}
return result;
}
private void createContextMenu() {
MenuManager manager = new MenuManager();
manager.setRemoveAllWhenShown(true);
manager.addMenuListener(new IMenuListener() {
public void menuAboutToShow(IMenuManager m) {
onContextMenuAboutToShow(m);
}
});
Menu menu = manager.createContextMenu(fTreeViewer.getControl());
fTreeViewer.getControl().setMenu(menu);
IWorkbenchPartSite site = getSite();
site.registerContextMenu(UIPlugin.INCLUDE_BROWSER_VIEW_ID, manager, fTreeViewer);
}
private void createViewerPage() {
Display display= getSite().getShell().getDisplay();
fViewerPage = new Composite(fPagebook, SWT.NULL);
fViewerPage.setLayoutData(new GridData(GridData.FILL_BOTH));
fViewerPage.setSize(100, 100);
fViewerPage.setLayout(new FillLayout());
fContentProvider= new IBContentProvider(display);
fLabelProvider= new IBLabelProvider(display, fContentProvider);
fTreeViewer= new ExtendedTreeViewer(fViewerPage);
fTreeViewer.setUseHashlookup(true);
fTreeViewer.setContentProvider(fContentProvider);
fTreeViewer.setLabelProvider(fLabelProvider);
fTreeViewer.setAutoExpandLevel(2);
fTreeViewer.addOpenListener(new IOpenListener() {
public void open(OpenEvent event) {
onShowInclude(event.getSelection());
}
});
}
private void createInfoPage() {
fInfoText = new Label(fPagebook, SWT.TOP | SWT.LEFT | SWT.WRAP);
}
private void initDragAndDrop() {
IBDropTargetListener dropListener= new IBDropTargetListener(this);
Transfer[] dropTransfers= new Transfer[] {
LocalSelectionTransfer.getTransfer(),
ResourceTransfer.getInstance(),
FileTransfer.getInstance()};
DropTarget dropTarget = new DropTarget(fPagebook, DND.DROP_MOVE | DND.DROP_COPY | DND.DROP_LINK | DND.DROP_DEFAULT);
dropTarget.setTransfer(dropTransfers);
dropTarget.addDropListener(dropListener);
Transfer[] dragTransfers= new Transfer[] {
ResourceTransfer.getInstance(),
FileTransfer.getInstance()};
IBDragSourceListener dragListener= new IBDragSourceListener(fTreeViewer);
dragListener.setDependentDropTargetListener(dropListener);
fTreeViewer.addDragSupport(DND.DROP_COPY, dragTransfers, dragListener);
}
private void createActions() {
fWorkingSetFilterUI= new WorkingSetFilterUI(this, fMemento, KEY_WORKING_SET_FILTER) {
@Override
protected void onWorkingSetChange() {
updateWorkingSetFilter(this);
}
@Override
protected void onWorkingSetNameChange() {
updateDescription();
}
};
fIncludedByAction=
new Action(IBMessages.IBViewPart_showIncludedBy_label, IAction.AS_RADIO_BUTTON) {
@Override
public void run() {
if (isChecked()) {
onSetDirection(true);
}
}
};
fIncludedByAction.setToolTipText(IBMessages.IBViewPart_showIncludedBy_tooltip);
CPluginImages.setImageDescriptors(fIncludedByAction, CPluginImages.T_LCL, CPluginImages.IMG_ACTION_SHOW_REF_BY);
fIncludesToAction=
new Action(IBMessages.IBViewPart_showIncludesTo_label, IAction.AS_RADIO_BUTTON) {
@Override
public void run() {
if (isChecked()) {
onSetDirection(false);
}
}
};
fIncludesToAction.setToolTipText(IBMessages.IBViewPart_showIncludesTo_tooltip);
CPluginImages.setImageDescriptors(fIncludesToAction, CPluginImages.T_LCL, CPluginImages.IMG_ACTION_SHOW_RELATES_TO);
fInactiveFilter= new ViewerFilter() {
@Override
public boolean select(Viewer viewer, Object parentElement, Object element) {
if (element instanceof IBNode) {
IBNode node= (IBNode) element;
return node.isActiveCode();
}
return true;
}
};
fFilterInactiveAction= new Action(IBMessages.IBViewPart_hideInactive_label, IAction.AS_CHECK_BOX) {
@Override
public void run() {
if (isChecked()) {
fTreeViewer.addFilter(fInactiveFilter);
}
else {
fTreeViewer.removeFilter(fInactiveFilter);
}
}
};
fFilterInactiveAction.setToolTipText(IBMessages.IBViewPart_hideInactive_tooltip);
CPluginImages.setImageDescriptors(fFilterInactiveAction, CPluginImages.T_LCL, CPluginImages.IMG_ACTION_HIDE_INACTIVE);
fSystemFilter= new ViewerFilter() {
@Override
public boolean select(Viewer viewer, Object parentElement, Object element) {
if (element instanceof IBNode) {
IBNode node= (IBNode) element;
return !node.isSystemInclude();
}
return true;
}
};
fFilterSystemAction= new Action(IBMessages.IBViewPart_hideSystem_label, IAction.AS_CHECK_BOX) {
@Override
public void run() {
if (isChecked()) {
fTreeViewer.addFilter(fSystemFilter);
}
else {
fTreeViewer.removeFilter(fSystemFilter);
}
}
};
fFilterSystemAction.setToolTipText(IBMessages.IBViewPart_hideSystem_tooltip);
CPluginImages.setImageDescriptors(fFilterSystemAction, CPluginImages.T_LCL, CPluginImages.IMG_ACTION_HIDE_SYSTEM);
fSorterAlphaNumeric= new ViewerComparator();
fSorterReferencePosition= new ViewerComparator() {
@Override
public int category(Object element) {
if (element instanceof IBNode) {
return 0;
}
return 1;
}
@Override
public int compare(Viewer viewer, Object e1, Object e2) {
if (!(e1 instanceof IBNode)) {
if (!(e2 instanceof IBNode)) {
return 0;
}
return -1;
}
if (!(e2 instanceof IBNode)) {
return 1;
}
IBNode n1= (IBNode) e1;
IBNode n2= (IBNode) e2;
return n1.getDirectiveCharacterOffset() - n2.getDirectiveCharacterOffset();
}
};
fShowFolderInLabelsAction= new Action(IBMessages.IBViewPart_showFolders_label, IAction.AS_CHECK_BOX) {
@Override
public void run() {
onShowFolderInLabels(isChecked());
}
};
fShowFolderInLabelsAction.setToolTipText(IBMessages.IBViewPart_showFolders_tooltip);
fNextAction = new Action(IBMessages.IBViewPart_nextMatch_label) {
@Override
public void run() {
onNextOrPrevious(true);
}
};
fNextAction.setToolTipText(IBMessages.IBViewPart_nextMatch_tooltip);
CPluginImages.setImageDescriptors(fNextAction, CPluginImages.T_LCL, CPluginImages.IMG_SHOW_NEXT);
fPreviousAction = new Action(IBMessages.IBViewPart_previousMatch_label) {
@Override
public void run() {
onNextOrPrevious(false);
}
};
fPreviousAction.setToolTipText(IBMessages.IBViewPart_previousMatch_tooltip);
CPluginImages.setImageDescriptors(fPreviousAction, CPluginImages.T_LCL, CPluginImages.IMG_SHOW_PREV);
fRefreshAction = new Action(IBMessages.IBViewPart_refresh_label) {
@Override
public void run() {
onRefresh();
}
};
fRefreshAction.setToolTipText(IBMessages.IBViewPart_refresh_tooltip);
CPluginImages.setImageDescriptors(fRefreshAction, CPluginImages.T_LCL, CPluginImages.IMG_REFRESH);
fHistoryAction= new IBHistoryDropDownAction(this);
// setup action bar
// global action hooks
IActionBars actionBars = getViewSite().getActionBars();
actionBars.setGlobalActionHandler(ActionFactory.NEXT.getId(), fNextAction);
actionBars.setGlobalActionHandler(ActionFactory.PREVIOUS.getId(), fPreviousAction);
actionBars.setGlobalActionHandler(ActionFactory.REFRESH.getId(), fRefreshAction);
actionBars.updateActionBars();
// local toolbar
IToolBarManager tm = actionBars.getToolBarManager();
tm.add(fNextAction);
tm.add(fPreviousAction);
tm.add(new Separator());
tm.add(fFilterSystemAction);
tm.add(fFilterInactiveAction);
tm.add(new Separator());
tm.add(fIncludedByAction);
tm.add(fIncludesToAction);
tm.add(fHistoryAction);
tm.add(fRefreshAction);
// local menu
IMenuManager mm = actionBars.getMenuManager();
fWorkingSetFilterUI.fillActionBars(actionBars);
mm.add(fIncludedByAction);
mm.add(fIncludesToAction);
mm.add(new Separator());
mm.add(fShowFolderInLabelsAction);
mm.add(new Separator());
mm.add(fFilterSystemAction);
mm.add(fFilterInactiveAction);
}
private IBNode getNextNode(boolean forward) {
TreeNavigator navigator= new TreeNavigator(fTreeViewer.getTree(), IBNode.class);
TreeItem selectedItem= navigator.getSelectedItemOrFirstOnLevel(1, forward);
if (selectedItem == null) {
return null;
}
if (selectedItem.getData().equals(fLastNavigationNode)) {
selectedItem= navigator.getNextSibbling(selectedItem, forward);
}
return selectedItem == null ? null : (IBNode) selectedItem.getData();
}
protected void onNextOrPrevious(boolean forward) {
IBNode nextItem= getNextNode(forward);
if (nextItem != null) {
StructuredSelection sel= new StructuredSelection(nextItem);
fTreeViewer.setSelection(sel);
onShowInclude(sel);
}
}
protected void onRefresh() {
fContentProvider.recompute();
}
protected void onShowFolderInLabels(boolean show) {
fLabelProvider.setShowFolders(show);
fTreeViewer.refresh();
}
private void updateHistory(ITranslationUnit input) {
if (input != null) {
fHistoryEntries.remove(input);
fHistoryEntries.add(0, input);
if (fHistoryEntries.size() > MAX_HISTORY_SIZE) {
fHistoryEntries.remove(MAX_HISTORY_SIZE-1);
}
}
}
private void updateSorter() {
if (fIncludedByAction.isChecked()) {
fTreeViewer.setComparator(fSorterAlphaNumeric);
}
else {
fTreeViewer.setComparator(fSorterReferencePosition);
}
}
private void updateDescription() {
String message= ""; //$NON-NLS-1$
if (!fShowsMessage) {
ITranslationUnit tu= getInput();
if (tu != null) {
IPath path= tu.getPath();
if (path != null) {
String format, file, scope;
file= path.lastSegment() + "(" + path.removeLastSegments(1) + ")"; //$NON-NLS-1$//$NON-NLS-2$
if (fWorkingSetFilter == null) {
scope= IBMessages.IBViewPart_workspaceScope;
}
else {
scope= fWorkingSetFilter.getLabel();
}
if (fIncludedByAction.isChecked()) {
format= IBMessages.IBViewPart_IncludedByContentDescription;
}
else {
format= IBMessages.IBViewPart_IncludesToContentDescription;
}
message= Messages.format(format, file, scope);
}
}
}
setContentDescription(message);
}
private void updateWorkingSetFilter(WorkingSetFilterUI filterUI) {
if (filterUI.getWorkingSet() == null) {
if (fWorkingSetFilter != null) {
fTreeViewer.removeFilter(fWorkingSetFilter);
fWorkingSetFilter= null;
}
}
else {
if (fWorkingSetFilter != null) {
fTreeViewer.refresh();
}
else {
fWorkingSetFilter= new IBWorkingSetFilter(filterUI);
fTreeViewer.addFilter(fWorkingSetFilter);
}
}
}
public void onSetDirection(boolean includedBy) {
if (includedBy != fContentProvider.getComputeIncludedBy()) {
Object input= fTreeViewer.getInput();
fTreeViewer.setInput(null);
fContentProvider.setComputeIncludedBy(includedBy);
updateSorter();
fTreeViewer.setInput(input);
updateDescription();
}
}
protected void onContextMenuAboutToShow(IMenuManager m) {
final IStructuredSelection selection = (IStructuredSelection) fTreeViewer.getSelection();
final IBNode node= IBConversions.selectionToNode(selection);
if (node != null) {
final IWorkbenchPage page = getSite().getPage();
// open include
if (node.getParent() != null && node.getDirectiveFile() != null) {
m.add(new Action(IBMessages.IBViewPart_showInclude_label) {
@Override
public void run() {
onShowInclude(selection);
}
});
}
final ITranslationUnit tu= node.getRepresentedTranslationUnit();
if (tu != null) {
// open
OpenCElementAction ofa= new OpenCElementAction(page);
ofa.selectionChanged(selection);
m.add(ofa);
// show in
IMenuManager submenu= new MenuManager(IBMessages.IBViewPart_ShowInMenu_label);
submenu.add(ContributionItemFactory.VIEWS_SHOW_IN.create(getSite().getWorkbenchWindow()));
m.add(submenu);
if (node.getParent() != null) {
m.add(new Separator());
m.add(new Action(Messages.format(IBMessages.IBViewPart_FocusOn_label, tu.getPath().lastSegment())) {
@Override
public void run() {
setInput(tu);
}
});
}
}
}
m.add(new Separator(IContextMenuConstants.GROUP_ADDITIONS));
}
protected void onShowInclude(ISelection selection) {
IBNode node= IBConversions.selectionToNode(selection);
if (node != null) {
fLastNavigationNode= node;
IWorkbenchPage page= getSite().getPage();
IBFile ibf= node.getDirectiveFile();
if (ibf != null) {
IRegion region= new Region(node.getDirectiveCharacterOffset(), node.getDirectiveLength());
long timestamp= node.getTimestamp();
IFile f= ibf.getResource();
if (f != null) {
EditorOpener.open(page, f, region, timestamp);
}
else {
IIndexFileLocation ifl = ibf.getLocation();
if (ifl != null)
{
//find resource that is in the workspace (like user include)
IFile[] files = ResourcesPlugin.getWorkspace().getRoot().findFilesForLocationURI(ifl.getURI());
IPath location = null;
if(files.length > 0)
{
IProject project = files[0].getProject();
IPath projectPath = new Path(project.getName()).makeAbsolute();
location = projectPath.append(files[0].getProjectRelativePath());
}
if (location != null)
{
//open workspace resource
EditorOpener.openExternalFile(page, location, region, timestamp);
}
else
{
//open external resource that is not a part of the workspace (like system include)
ITranslationUnit context = getInput();
EditorOpener.openExternalFile(page, ifl.getURI(), region, timestamp, context);
/*
try
{
EditorUtility.openInEditor(ifl.getURI(), context);
}
catch (PartInitException e)
{
e.printStackTrace();
} */
}
}
}
}
else {
ITranslationUnit tu= IBConversions.selectionToTU(selection);
if (tu != null) {
IResource r= tu.getResource();
if (r != null) {
OpenFileAction ofa= new OpenFileAction(page);
ofa.selectionChanged((IStructuredSelection) selection);
ofa.run();
}
}
}
}
}
public ShowInContext getShowInContext() {
return new ShowInContext(null, IBConversions.nodeSelectionToRepresentedTUSelection(fTreeViewer.getSelection()));
}
public boolean show(ShowInContext context) {
ITranslationUnit tu= IBConversions.selectionToTU(context.getSelection());
if (tu == null) {
tu= IBConversions.objectToTU(context.getInput());
if (tu == null) {
setMessage(IBMessages.IBViewPart_falseInputMessage);
return false;
}
}
setInput(tu);
return true;
}
public String[] getShowInTargetIds() {
return new String[] {
ProjectExplorer.VIEW_ID,
IPageLayout.ID_PROJECT_EXPLORER
};
}
// access for tests
public TreeViewer getTreeViewer() {
return fTreeViewer;
}
public ITranslationUnit[] getHistoryEntries() {
return fHistoryEntries.toArray(new ITranslationUnit[fHistoryEntries.size()]);
}
public void setHistoryEntries(ITranslationUnit[] remaining) {
fHistoryEntries.clear();
fHistoryEntries.addAll(Arrays.asList(remaining));
}
public ITranslationUnit getInput() {
Object input= fTreeViewer.getInput();
if (input instanceof ITranslationUnit) {
return (ITranslationUnit) input;
}
return null;
}
}