blob: b409055f272b2bb46ed95c795ddd65ba062ebada [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2000, 2016 QNX Software Systems and others.
*
* This program and the accompanying materials
* are made available under the terms of the Eclipse Public License 2.0
* which accompanies this distribution, and is available at
* https://www.eclipse.org/legal/epl-2.0/
*
* SPDX-License-Identifier: EPL-2.0
*
* Contributors:
* QNX Software Systems - Initial API and implementation
* Markus Schorn (Wind River Systems)
* Anton Leherbauer (Wind River Systems) - Fix bug 150045
* Ken Ryall (Nokia) - Fix bug 175144
*******************************************************************************/
package org.eclipse.cdt.internal.ui.cview;
import java.util.ArrayList;
import org.eclipse.cdt.core.model.CoreModel;
import org.eclipse.cdt.core.model.IArchive;
import org.eclipse.cdt.core.model.IArchiveContainer;
import org.eclipse.cdt.core.model.IBinary;
import org.eclipse.cdt.core.model.IBinaryContainer;
import org.eclipse.cdt.core.model.IBinaryModule;
import org.eclipse.cdt.core.model.ICElement;
import org.eclipse.cdt.core.model.ICModel;
import org.eclipse.cdt.core.model.ICProject;
import org.eclipse.cdt.core.model.IParent;
import org.eclipse.cdt.core.model.ISourceReference;
import org.eclipse.cdt.core.model.ITranslationUnit;
import org.eclipse.cdt.internal.ui.actions.SelectionConverter;
import org.eclipse.cdt.internal.ui.dnd.CDTViewerDragAdapter;
import org.eclipse.cdt.internal.ui.dnd.DelegatingDropAdapter;
import org.eclipse.cdt.internal.ui.dnd.FileTransferDragAdapter;
import org.eclipse.cdt.internal.ui.dnd.FileTransferDropAdapter;
import org.eclipse.cdt.internal.ui.dnd.PluginTransferDropAdapter;
import org.eclipse.cdt.internal.ui.dnd.ResourceTransferDragAdapter;
import org.eclipse.cdt.internal.ui.dnd.ResourceTransferDropAdapter;
import org.eclipse.cdt.internal.ui.dnd.TransferDragSourceListener;
import org.eclipse.cdt.internal.ui.dnd.TransferDropTargetListener;
import org.eclipse.cdt.internal.ui.editor.ITranslationUnitEditorInput;
import org.eclipse.cdt.internal.ui.preferences.CPluginPreferencePage;
import org.eclipse.cdt.internal.ui.util.EditorUtility;
import org.eclipse.cdt.internal.ui.util.ProblemTreeViewer;
import org.eclipse.cdt.internal.ui.util.RemoteTreeViewer;
import org.eclipse.cdt.internal.ui.viewsupport.AppearanceAwareLabelProvider;
import org.eclipse.cdt.internal.ui.viewsupport.CElementImageProvider;
import org.eclipse.cdt.internal.ui.viewsupport.CUILabelProvider;
import org.eclipse.cdt.internal.ui.viewsupport.DecoratingCLabelProvider;
import org.eclipse.cdt.ui.CElementContentProvider;
import org.eclipse.cdt.ui.CElementSorter;
import org.eclipse.cdt.ui.CUIPlugin;
import org.eclipse.cdt.ui.PreferenceConstants;
import org.eclipse.core.resources.IFile;
import org.eclipse.core.resources.IResource;
import org.eclipse.core.runtime.IPath;
import org.eclipse.core.runtime.Path;
import org.eclipse.jface.action.IMenuManager;
import org.eclipse.jface.action.MenuManager;
import org.eclipse.jface.preference.IPreferenceStore;
import org.eclipse.jface.util.IPropertyChangeListener;
import org.eclipse.jface.util.LocalSelectionTransfer;
import org.eclipse.jface.util.PropertyChangeEvent;
import org.eclipse.jface.viewers.DoubleClickEvent;
import org.eclipse.jface.viewers.IContentProvider;
import org.eclipse.jface.viewers.ILabelProvider;
import org.eclipse.jface.viewers.ISelection;
import org.eclipse.jface.viewers.ISelectionProvider;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.jface.viewers.OpenEvent;
import org.eclipse.jface.viewers.SelectionChangedEvent;
import org.eclipse.jface.viewers.StructuredSelection;
import org.eclipse.jface.viewers.TreeViewer;
import org.eclipse.osgi.util.NLS;
import org.eclipse.swt.SWT;
import org.eclipse.swt.dnd.DND;
import org.eclipse.swt.dnd.FileTransfer;
import org.eclipse.swt.dnd.Transfer;
import org.eclipse.swt.events.KeyAdapter;
import org.eclipse.swt.events.KeyEvent;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;
import org.eclipse.swt.widgets.Listener;
import org.eclipse.swt.widgets.Menu;
import org.eclipse.swt.widgets.ScrollBar;
import org.eclipse.swt.widgets.Tree;
import org.eclipse.ui.IEditorInput;
import org.eclipse.ui.IEditorPart;
import org.eclipse.ui.IFileEditorInput;
import org.eclipse.ui.IMemento;
import org.eclipse.ui.IPageLayout;
import org.eclipse.ui.IPartListener;
import org.eclipse.ui.IViewSite;
import org.eclipse.ui.IWorkbenchPage;
import org.eclipse.ui.IWorkbenchPart;
import org.eclipse.ui.IWorkingSet;
import org.eclipse.ui.IWorkingSetManager;
import org.eclipse.ui.PartInitException;
import org.eclipse.ui.ResourceWorkingSetFilter;
import org.eclipse.ui.actions.ActionContext;
import org.eclipse.ui.contexts.IContextActivation;
import org.eclipse.ui.contexts.IContextService;
import org.eclipse.ui.model.IWorkbenchAdapter;
import org.eclipse.ui.part.ISetSelectionTarget;
import org.eclipse.ui.part.IShowInSource;
import org.eclipse.ui.part.IShowInTarget;
import org.eclipse.ui.part.IShowInTargetList;
import org.eclipse.ui.part.PluginTransfer;
import org.eclipse.ui.part.ResourceTransfer;
import org.eclipse.ui.part.ShowInContext;
import org.eclipse.ui.part.ViewPart;
import org.eclipse.ui.views.framelist.FrameList;
/**
*
* CView
*
*/
public class CView extends ViewPart
implements ISetSelectionTarget, IPropertyChangeListener, IShowInTarget, IShowInTargetList {
ProblemTreeViewer viewer;
IMemento memento;
CViewActionGroup actionGroup;
FrameList frameList;
CViewFrameSource frameSource;
ResourceWorkingSetFilter workingSetFilter = new ResourceWorkingSetFilter();
protected boolean dragDetected;
private Listener dragDetectListener;
// Persistance tags.
static final String TAG_SELECTION = "selection"; //$NON-NLS-1$
static final String TAG_EXPANDED = "expanded"; //$NON-NLS-1$
static final String TAG_ELEMENT = "element"; //$NON-NLS-1$
static final String TAG_PATH = "path"; //$NON-NLS-1$
static final String TAG_VERTICAL_POSITION = "verticalPosition"; //$NON-NLS-1$
static final String TAG_HORIZONTAL_POSITION = "horizontalPosition"; //$NON-NLS-1$
static final String TAG_WORKINGSET = "workingSet"; //$NON-NLS-1$
//Menu tags
final String WORKING_GROUP_MARKER = "workingSetGroup"; //$NON-NLS-1$
final String WORKING_GROUP_MARKER_END = "end-workingSetGroup"; //$NON-NLS-1$
private IPartListener partListener = new IPartListener() {
@Override
public void partActivated(IWorkbenchPart part) {
if (part instanceof IEditorPart) {
editorActivated((IEditorPart) part);
}
}
@Override
public void partBroughtToTop(IWorkbenchPart part) {
}
@Override
public void partClosed(IWorkbenchPart part) {
}
@Override
public void partDeactivated(IWorkbenchPart part) {
}
@Override
public void partOpened(IWorkbenchPart part) {
}
};
private IPropertyChangeListener workingSetListener = ev -> {
String property = ev.getProperty();
Object newValue = ev.getNewValue();
Object oldValue = ev.getOldValue();
IWorkingSet filterWorkingSet = workingSetFilter.getWorkingSet();
if (property == null) {
return;
}
if (IWorkingSetManager.CHANGE_WORKING_SET_REMOVE.equals(property) && oldValue == filterWorkingSet) {
setWorkingSet(null);
} else if (IWorkingSetManager.CHANGE_WORKING_SET_NAME_CHANGE.equals(property) && newValue == filterWorkingSet) {
updateTitle();
} else if (IWorkingSetManager.CHANGE_WORKING_SET_CONTENT_CHANGE.equals(property)
&& newValue == filterWorkingSet) {
getViewer().refresh();
}
};
public CView() {
super();
}
/**
* @see IWorkbenchPart#setFocus()
*/
@Override
public void setFocus() {
viewer.getTree().setFocus();
//composite.setFocus ();
}
/**
* Reveal and select the passed element selection in self's visual
* component
*
* @see ISetSelectionTarget#selectReveal(ISelection)
*/
@Override
public void selectReveal(ISelection selection) {
IStructuredSelection ssel = SelectionConverter.convertSelectionToCElements(selection, true);
if (!ssel.isEmpty()) {
getViewer().setSelection(ssel, true);
}
}
private IContextActivation fContextActivation;
/**
* Handles an open event from the viewer.
* Opens an editor on the selected file.
*
* @param event the open event
*/
protected void handleOpen(OpenEvent event) {
IStructuredSelection selection = (IStructuredSelection) event.getSelection();
getActionGroup().runDefaultAction(selection);
}
/**
* Handles double clicks in viewer. Opens editor if file double-clicked.
*/
protected void handleDoubleClick(DoubleClickEvent event) {
IStructuredSelection s = (IStructuredSelection) event.getSelection();
Object o = s.getFirstElement();
if (viewer.isExpandable(o)) {
// Do not drill in to translation units of binaries.
if (o instanceof ITranslationUnit || o instanceof IBinary || o instanceof IArchive) {
return;
}
viewer.setExpandedState(o, !viewer.getExpandedState(o));
}
}
/**
* Handles key events in viewer.
*/
void handleKeyPressed(KeyEvent event) {
if (getActionGroup() != null) {
getActionGroup().handleKeyPressed(event);
}
}
/**
* Handles a key release in the viewer. Does nothing by default.
*
*/
protected void handleKeyReleased(KeyEvent event) {
if (getActionGroup() != null) {
getActionGroup().handleKeyReleased(event);
}
}
/**
* Handles selection changed in viewer. Updates global actions. Links to
* editor (if option enabled)
*/
void handleSelectionChanged(SelectionChangedEvent event) {
final IStructuredSelection selection = (IStructuredSelection) event.getSelection();
updateStatusLine(selection);
updateActionBars(selection);
dragDetected = false;
if (isLinkingEnabled()) {
getSite().getShell().getDisplay().asyncExec(() -> {
if (dragDetected == false) {
// only synchronize with editor when the selection is
// not the result
// of a drag. Fixes bug 22274.
linkToEditor(selection);
}
});
}
}
/**
* Returns the action group.
*
* @return the action group
*/
protected CViewActionGroup getActionGroup() {
return actionGroup;
}
/**
* Sets the action group.
*
* @param actionGroup
* the action group
*/
protected void setActionGroup(CViewActionGroup actionGroup) {
this.actionGroup = actionGroup;
}
/**
* Answer the property defined by key.
*/
@Override
@SuppressWarnings("unchecked")
public <T> T getAdapter(Class<T> key) {
if (key.equals(ISelectionProvider.class)) {
return (T) viewer;
} else if (key == IShowInSource.class) {
return (T) getShowInSource();
} else if (key == IShowInTarget.class) {
return (T) this;
}
return super.getAdapter(key);
}
@Override
public void init(IViewSite site, IMemento memento) throws PartInitException {
super.init(site, memento);
this.memento = memento;
}
/**
* init the frame source and the framelist.
*/
void initFrameList() {
frameSource = new CViewFrameSource(this);
frameList = new FrameList(frameSource);
frameSource.connectTo(frameList);
}
/**
* Initializes the sorter.
*/
void initCElementSorter() {
viewer.setSorter(new CElementSorter());
}
/**
* Adds the filters to the viewer.
*
* @param viewer
* the viewer
*/
void initFilters(TreeViewer viewer) {
viewer.addFilter(workingSetFilter);
}
/**
* Adds drag and drop support to the navigator.
*/
void initDragAndDrop() {
initDrag();
initDrop();
dragDetectListener = event -> dragDetected = true;
viewer.getControl().addListener(SWT.DragDetect, dragDetectListener);
}
private void initDrag() {
int ops = DND.DROP_COPY | DND.DROP_MOVE | DND.DROP_LINK;
Transfer[] transfers = new Transfer[] { LocalSelectionTransfer.getTransfer(), ResourceTransfer.getInstance(),
FileTransfer.getInstance(), };
TransferDragSourceListener[] dragListeners = new TransferDragSourceListener[] {
new SelectionTransferDragAdapter(viewer), new ResourceTransferDragAdapter(viewer),
new FileTransferDragAdapter(viewer) };
viewer.addDragSupport(ops, transfers, new CDTViewerDragAdapter(viewer, dragListeners));
}
private void initDrop() {
int ops = DND.DROP_COPY | DND.DROP_MOVE | DND.DROP_LINK | DND.DROP_DEFAULT;
Transfer[] transfers = new Transfer[] { LocalSelectionTransfer.getTransfer(), ResourceTransfer.getInstance(),
FileTransfer.getInstance(), PluginTransfer.getInstance() };
TransferDropTargetListener[] dropListeners = new TransferDropTargetListener[] {
new SelectionTransferDropAdapter(viewer), new ResourceTransferDropAdapter(viewer),
new FileTransferDropAdapter(viewer), new PluginTransferDropAdapter(viewer), };
viewer.addDropSupport(ops, transfers, new DelegatingDropAdapter(dropListeners));
}
/**
* Initializes the default preferences
*/
public static void initDefaults(IPreferenceStore store) {
}
/**
* get the default preferences.
*/
void initFilterFromPreferences() {
}
/**
* Sets the content provider for the viewer.
*/
void initContentProvider(TreeViewer viewer) {
IContentProvider provider = createContentProvider();
viewer.setContentProvider(provider);
}
/**
* Sets the label provider for the viewer.
*/
void initLabelProvider(TreeViewer viewer) {
CUILabelProvider cProvider = createLabelProvider();
viewer.setLabelProvider(new DecoratingCLabelProvider(cProvider, true));
}
/**
* Initializes and registers the context menu.
*/
protected void initContextMenu() {
MenuManager menuMgr = new MenuManager("#PopupMenu"); //$NON-NLS-1$
menuMgr.setRemoveAllWhenShown(true);
menuMgr.addMenuListener(manager -> CView.this.fillContextMenu(manager));
TreeViewer viewer = getViewer();
Menu menu = menuMgr.createContextMenu(viewer.getTree());
viewer.getTree().setMenu(menu);
getSite().registerContextMenu(menuMgr, viewer);
}
/**
* Restores the working set filter from the persistence store.
*/
void initWorkingSetFilter() {
// FIXME: the memento does not work if we close the view
// and reopen we should save this somewhere else.
// but it goes to pretty much all the settings 8-(
if (memento == null) {
return;
}
String wsname = memento.getString(TAG_WORKINGSET);
if (wsname != null && !wsname.isEmpty()) {
IWorkingSetManager wsmanager = getViewSite().getWorkbenchWindow().getWorkbench().getWorkingSetManager();
IWorkingSet workingSet = wsmanager.getWorkingSet(wsname);
if (workingSet != null) {
// Only initialize filter. Don't set working set into viewer.
// Working set is set via WorkingSetFilterActionGroup
// during action creation.
workingSetFilter.setWorkingSet(workingSet);
}
}
}
/**
* Add listeners to the viewer.
*/
protected void initListeners(TreeViewer viewer) {
viewer.addDoubleClickListener(event -> handleDoubleClick(event));
viewer.addSelectionChangedListener(event -> handleSelectionChanged(event));
viewer.addOpenListener(event -> handleOpen(event));
viewer.getControl().addKeyListener(new KeyAdapter() {
@Override
public void keyPressed(KeyEvent e) {
handleKeyPressed(e);
}
@Override
public void keyReleased(KeyEvent e) {
handleKeyReleased(e);
}
});
}
@Override
public void createPartControl(Composite parent) {
viewer = createViewer(parent);
viewer.setUseHashlookup(true);
viewer.setComparer(new CViewElementComparer());
initContentProvider(viewer);
initLabelProvider(viewer);
CUIPlugin.getDefault().getPreferenceStore().addPropertyChangeListener(this);
initFilters(viewer);
initWorkingSetFilter();
initListeners(viewer);
initCElementSorter();
initFrameList();
initDragAndDrop();
updateTitle();
viewer.setInput(CoreModel.getDefault().getCModel());
initContextMenu();
//Add the property changes after all of the UI work has been done.
IWorkingSetManager wsmanager = getViewSite().getWorkbenchWindow().getWorkbench().getWorkingSetManager();
wsmanager.addPropertyChangeListener(workingSetListener);
// Needs to be done before the actions
getSite().setSelectionProvider(viewer);
getSite().getPage().addPartListener(partListener);
// Make the Actions for the Context Menu
makeActions();
getActionGroup().fillActionBars(getViewSite().getActionBars());
updateActionBars((IStructuredSelection) viewer.getSelection());
if (memento != null) {
getActionGroup().restoreFilterAndSorterState(memento);
} else {
initFilterFromPreferences();
}
if (memento != null) {
restoreState(memento);
}
memento = null;
IContextService ctxService = getSite().getService(IContextService.class);
if (ctxService != null) {
fContextActivation = ctxService.activateContext(CUIPlugin.CVIEWS_SCOPE);
}
}
protected ProblemTreeViewer createViewer(Composite parent) {
return new RemoteTreeViewer(parent, SWT.MULTI | SWT.H_SCROLL | SWT.V_SCROLL);
}
protected IContentProvider createContentProvider() {
boolean showCUChildren = PreferenceConstants.getPreferenceStore()
.getBoolean(PreferenceConstants.PREF_SHOW_CU_CHILDREN);
boolean groupIncludes = PreferenceConstants.getPreferenceStore()
.getBoolean(PreferenceConstants.CVIEW_GROUP_INCLUDES);
boolean groupMacros = PreferenceConstants.getPreferenceStore()
.getBoolean(PreferenceConstants.CVIEW_GROUP_MACROS);
CViewContentProvider provider = new CViewContentProvider(viewer, getSite(), showCUChildren, true);
provider.setIncludesGrouping(groupIncludes);
provider.setMacroGrouping(groupMacros);
return provider;
}
protected CUILabelProvider createLabelProvider() {
return new CViewLabelProvider(AppearanceAwareLabelProvider.DEFAULT_TEXTFLAGS,
AppearanceAwareLabelProvider.DEFAULT_IMAGEFLAGS | CElementImageProvider.SMALL_ICONS);
}
@Override
public void dispose() {
if (fContextActivation != null) {
IContextService ctxService = getSite().getService(IContextService.class);
if (ctxService != null) {
ctxService.deactivateContext(fContextActivation);
}
}
getSite().getPage().removePartListener(partListener);
CUIPlugin.getDefault().getPreferenceStore().removePropertyChangeListener(this);
if (getActionGroup() != null) {
getActionGroup().dispose();
}
IWorkingSetManager wsmanager = getViewSite().getWorkbenchWindow().getWorkbench().getWorkingSetManager();
wsmanager.removePropertyChangeListener(workingSetListener);
Control control = viewer.getControl();
if (dragDetectListener != null && control != null && control.isDisposed() == false) {
control.removeListener(SWT.DragDetect, dragDetectListener);
}
super.dispose();
}
/**
* An editor has been activated. Set the selection in this navigator to be
* the editor's input, if linking is enabled.
*/
void editorActivated(IEditorPart editor) {
if (!CPluginPreferencePage.isLinkToEditor()) {
return;
}
IEditorInput input = editor.getEditorInput();
Object linkElement = null;
if (input instanceof IFileEditorInput) {
CoreModel factory = CoreModel.getDefault();
IFileEditorInput fileInput = (IFileEditorInput) input;
IFile file = fileInput.getFile();
ICElement celement = factory.create(file);
if (celement != null) {
linkElement = celement;
} else {
linkElement = file;
}
} else if (input instanceof ITranslationUnitEditorInput) {
ITranslationUnitEditorInput tuInput = (ITranslationUnitEditorInput) input;
linkElement = tuInput.getTranslationUnit();
}
if (linkElement != null) {
ISelection newSelection = new StructuredSelection(linkElement);
if (!viewer.getSelection().equals(newSelection)) {
viewer.setSelection(newSelection);
}
}
}
/**
* Returns the working set filter for this view.
*
* @return the working set
*/
public IWorkingSet getWorkingSet() {
return workingSetFilter.getWorkingSet();
}
/**
* Returns the sorter.
*/
public CElementSorter getSorter() {
return (CElementSorter) getViewer().getSorter();
}
/**
* Returns the tree viewer which shows the resource hierarchy.
*/
public TreeViewer getViewer() {
return viewer;
}
/*
*/
public FrameList getFrameList() {
return frameList;
}
/**
* Create self's action objects
*/
void makeActions() {
setActionGroup(new MainActionGroup(this));
}
/**
* Called when the context menu is about to open. Delegates to the action
* group using the viewer's selection as the action context.
*
* @since 2.0
*/
protected void fillContextMenu(IMenuManager menu) {
IStructuredSelection selection = (IStructuredSelection) getViewer().getSelection();
CViewActionGroup actionGroup = getActionGroup();
if (actionGroup != null) {
actionGroup.setContext(new ActionContext(selection));
actionGroup.fillContextMenu(menu);
actionGroup.setContext(null);
}
}
/**
* Returns the tool tip text for the given element.
*/
String getToolTipText(Object element) {
if (element instanceof IResource) {
IPath path = ((IResource) element).getFullPath();
if (path.isRoot()) {
return "CVIEW"; //$NON-NLS-1$
}
return path.makeRelative().toString();
}
return ((ILabelProvider) viewer.getLabelProvider()).getText(element);
}
/**
* Returns the message to show in the status line.
*
* @param selection
* the current selection
* @return the status line message
*/
String getStatusLineMessage(IStructuredSelection selection) {
if (selection.size() == 1) {
Object o = selection.getFirstElement();
if (o instanceof IResource) {
return ((IResource) o).getFullPath().makeRelative().toString();
} else if (o instanceof ICElement) {
ICElement celement = (ICElement) o;
IResource res = celement.getAdapter(IResource.class);
if (res != null) {
return res.getFullPath().toString();
} else if (celement.getElementType() == ICElement.C_VCONTAINER) {
if (celement instanceof IBinaryContainer) {
ICProject cproj = celement.getCProject();
if (cproj != null) {
return cproj.getPath() + CViewMessages.CView_binaries;
}
} else if (celement instanceof IArchiveContainer) {
ICProject cproj = celement.getCProject();
if (cproj != null) {
return cproj.getPath() + CViewMessages.CView_archives;
}
} else if (celement instanceof IBinaryModule) {
IBinary bin = ((IBinaryModule) celement).getBinary();
return bin.getPath() + ":" + celement.getElementName(); //$NON-NLS-1$
}
} else if (celement.getElementType() > ICElement.C_UNIT) {
return celement.getPath().toString() + " - [" + celement.getElementName() + "]"; //$NON-NLS-1$ //$NON-NLS-2$
}
return celement.getElementName();
} else if (o instanceof IWorkbenchAdapter) {
IWorkbenchAdapter wAdapter = (IWorkbenchAdapter) o;
return wAdapter.getLabel(o);
} else {
return "ItemSelected"; //$NON-NLS-1$
}
}
if (selection.size() > 1) {
return NLS.bind(CViewMessages.CView_statusLine, new String[] { Integer.toString(selection.size()) });
}
return "";//$NON-NLS-1$
}
/**
* Updates the action bar actions.
*
* @param selection
* the current selection
*/
protected void updateActionBars(IStructuredSelection selection) {
CViewActionGroup group = getActionGroup();
if (group != null) {
group.setContext(new ActionContext(selection));
group.updateActionBars();
}
}
void updateTitle() {
Object input = getViewer().getInput();
String viewName = getConfigurationElement().getAttribute("name"); //$NON-NLS-1$
if (input == null || (input instanceof ICModel)) {
setPartName(viewName);
setTitleToolTip(""); //$NON-NLS-1$
} else {
ILabelProvider labelProvider = (ILabelProvider) getViewer().getLabelProvider();
String inputText = labelProvider.getText(input);
setPartName(inputText);
setTitleToolTip(getToolTipText(input));
}
}
/**
* Updates the message shown in the status line.
*
* @param selection
* the current selection
*/
void updateStatusLine(IStructuredSelection selection) {
String msg = getStatusLineMessage(selection);
getViewSite().getActionBars().getStatusLineManager().setMessage(msg);
}
/*
*/
public void setWorkingSet(IWorkingSet workingSet) {
TreeViewer treeViewer = getViewer();
Object[] expanded = treeViewer.getExpandedElements();
ISelection selection = treeViewer.getSelection();
workingSetFilter.setWorkingSet(workingSet);
/*
* if (workingSet != null) { settings.put(STORE_WORKING_SET,
* workingSet.getName()); } else { settings.put(STORE_WORKING_SET, "");
* //$NON-NLS-1$ }
*/
updateTitle();
treeViewer.refresh();
treeViewer.setExpandedElements(expanded);
if (selection.isEmpty() == false && selection instanceof IStructuredSelection) {
IStructuredSelection structuredSelection = (IStructuredSelection) selection;
treeViewer.reveal(structuredSelection.getFirstElement());
}
}
@Override
public void propertyChange(PropertyChangeEvent event) {
if (viewer == null)
return;
boolean refreshViewer = false;
String property = event.getProperty();
if (property.equals(PreferenceConstants.PREF_SHOW_CU_CHILDREN)) {
boolean showCUChildren = PreferenceConstants.getPreferenceStore()
.getBoolean(PreferenceConstants.PREF_SHOW_CU_CHILDREN);
IContentProvider provider = viewer.getContentProvider();
if (provider instanceof CElementContentProvider) {
((CElementContentProvider) provider).setProvideMembers(showCUChildren);
}
refreshViewer = true;
} else if (property.equals(PreferenceConstants.PREF_LINK_TO_EDITOR)) {
CViewActionGroup group = getActionGroup();
if (group instanceof MainActionGroup) {
boolean enable = isLinkingEnabled();
((MainActionGroup) group).toggleLinkingAction.setChecked(enable);
}
} else if (property.equals(PreferenceConstants.CVIEW_GROUP_INCLUDES)) {
boolean groupIncludes = PreferenceConstants.getPreferenceStore()
.getBoolean(PreferenceConstants.CVIEW_GROUP_INCLUDES);
IContentProvider provider = viewer.getContentProvider();
if (provider instanceof CElementContentProvider) {
((CElementContentProvider) provider).setIncludesGrouping(groupIncludes);
}
refreshViewer = true;
} else if (property.equals(PreferenceConstants.CVIEW_GROUP_MACROS)) {
boolean groupMacros = PreferenceConstants.getPreferenceStore()
.getBoolean(PreferenceConstants.CVIEW_GROUP_MACROS);
IContentProvider provider = viewer.getContentProvider();
if (provider instanceof CElementContentProvider) {
((CElementContentProvider) provider).setMacroGrouping(groupMacros);
}
refreshViewer = true;
}
if (refreshViewer) {
viewer.refresh();
}
}
/**
* Returns whether the navigator selection automatically tracks the active
* editor.
*
* @return <code>true</code> if linking is enabled, <code>false</code>
* if not
*/
public boolean isLinkingEnabled() {
return CPluginPreferencePage.isLinkToEditor();
}
public void setLinkingEnabled(boolean enable) {
CPluginPreferencePage.setLinkingEnabled(enable);
if (enable) {
IEditorPart editor = this.getSite().getPage().getActiveEditor();
if (editor != null) {
editorActivated(editor);
}
}
}
/**
* Links to editor (if option enabled)
*/
void linkToEditor(IStructuredSelection selection) {
// ignore selection changes if the package explorer is not the active
// part.
// In this case the selection change isn't triggered by a user.
if (!isActivePart()) {
return;
}
if (selection.size() == 1) {
Object obj = selection.getFirstElement();
IEditorPart part = EditorUtility.isOpenInEditor(obj);
if (part != null) {
IWorkbenchPage page = getSite().getPage();
page.bringToTop(part);
if (obj instanceof ISourceReference) {
if (obj instanceof ICElement && !(obj instanceof ITranslationUnit)) {
EditorUtility.revealInEditor(part, (ICElement) obj);
}
}
}
}
}
private boolean isActivePart() {
return this == getSite().getPage().getActivePart();
}
public Object getViewPartInput() {
if (viewer != null) {
return viewer.getInput();
}
return null;
}
void restoreState(IMemento memento) {
CoreModel factory = CoreModel.getDefault();
getActionGroup().restoreFilterAndSorterState(memento);
IMemento childMem = memento.getChild(TAG_EXPANDED);
if (childMem != null) {
ArrayList<ICElement> elements = new ArrayList<>();
IMemento[] elementMem = childMem.getChildren(TAG_ELEMENT);
for (IMemento element2 : elementMem) {
String p = element2.getString(TAG_PATH);
if (p != null) {
IPath path = new Path(p);
ICElement element = factory.create(path);
if (element != null) {
elements.add(element);
}
}
}
viewer.setExpandedElements(elements.toArray());
}
childMem = memento.getChild(TAG_SELECTION);
if (childMem != null) {
ArrayList<ICElement> list = new ArrayList<>();
IMemento[] elementMem = childMem.getChildren(TAG_ELEMENT);
for (IMemento element2 : elementMem) {
String p = element2.getString(TAG_PATH);
if (p != null) {
IPath path = new Path(p);
ICElement element = factory.create(path);
if (element != null) {
list.add(element);
}
}
}
viewer.setSelection(new StructuredSelection(list));
}
Tree tree = viewer.getTree();
//save vertical position
ScrollBar bar = tree.getVerticalBar();
if (bar != null) {
try {
String posStr = memento.getString(TAG_VERTICAL_POSITION);
int position;
position = Integer.parseInt(posStr);
bar.setSelection(position);
} catch (NumberFormatException e) {
}
}
bar = tree.getHorizontalBar();
if (bar != null) {
try {
String posStr = memento.getString(TAG_HORIZONTAL_POSITION);
int position;
position = Integer.parseInt(posStr);
bar.setSelection(position);
} catch (NumberFormatException e) {
}
}
}
@Override
public void saveState(IMemento memento) {
if (viewer == null) {
if (this.memento != null) { //Keep the old state;
memento.putMemento(this.memento);
}
return;
}
//save expanded elements
Tree tree = viewer.getTree();
Object expandedElements[] = viewer.getExpandedElements();
if (expandedElements.length > 0) {
IMemento expandedMem = memento.createChild(TAG_EXPANDED);
for (Object expandedElement : expandedElements) {
Object o = expandedElement;
// Do not save expanded binary files are libraries.
if (o instanceof IParent && !(o instanceof IArchiveContainer || o instanceof IBinaryContainer
|| o instanceof IBinary || o instanceof IArchive)) {
IMemento elementMem = expandedMem.createChild(TAG_ELEMENT);
ICElement e = (ICElement) o;
IResource res = e.getResource();
if (res != null && res.getLocation() != null) {
elementMem.putString(TAG_PATH, res.getLocation().toOSString());
}
}
}
}
//save selection
Object elements[] = ((IStructuredSelection) viewer.getSelection()).toArray();
if (elements.length > 0) {
IMemento selectionMem = memento.createChild(TAG_SELECTION);
for (Object element : elements) {
if (element instanceof ICElement) {
ICElement e = (ICElement) element;
IResource r = e.getResource();
if (r != null && r.getLocation() != null) {
IMemento elementMem = selectionMem.createChild(TAG_ELEMENT);
elementMem.putString(TAG_PATH, r.getLocation().toString());
}
}
}
}
//save vertical position
ScrollBar bar = tree.getVerticalBar();
int position = bar != null ? bar.getSelection() : 0;
memento.putString(TAG_VERTICAL_POSITION, String.valueOf(position));
//save horizontal position
bar = tree.getHorizontalBar();
position = bar != null ? bar.getSelection() : 0;
memento.putString(TAG_HORIZONTAL_POSITION, String.valueOf(position));
getActionGroup().saveFilterAndSorterState(memento);
//Save the working set away
if (workingSetFilter.getWorkingSet() != null) {
String wsname = workingSetFilter.getWorkingSet().getName();
if (wsname != null) {
memento.putString(TAG_WORKINGSET, wsname);
}
}
}
@Override
public boolean show(ShowInContext context) {
ISelection selection = context.getSelection();
if (selection != null && !selection.isEmpty() && selection instanceof IStructuredSelection) {
selectReveal(selection);
return true;
}
IEditorInput input = (IEditorInput) context.getInput();
if (input != null) {
IResource res = input.getAdapter(IResource.class);
if (res != null) {
selectReveal(new StructuredSelection(res));
return true;
}
}
return false;
}
/**
* Returns the <code>IShowInSource</code> for this view.
*/
protected IShowInSource getShowInSource() {
return () -> new ShowInContext(getViewer().getInput(), getViewer().getSelection());
}
@Override
public String[] getShowInTargetIds() {
return new String[] { IPageLayout.ID_RES_NAV };
}
}