/******************************************************************************* * Copyright (c) 2000, 2006 QNX Software Systems 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: * QNX Software Systems - Initial API and implementation *******************************************************************************/ package org.eclipse.cdt.make.internal.ui.editor; import java.util.ArrayList; import java.util.List; import org.eclipse.cdt.make.core.makefile.IBadDirective; import org.eclipse.cdt.make.core.makefile.ICommand; import org.eclipse.cdt.make.core.makefile.IComment; import org.eclipse.cdt.make.core.makefile.IDirective; import org.eclipse.cdt.make.core.makefile.IEmptyLine; import org.eclipse.cdt.make.core.makefile.IInferenceRule; import org.eclipse.cdt.make.core.makefile.IMacroDefinition; import org.eclipse.cdt.make.core.makefile.IMakefile; import org.eclipse.cdt.make.core.makefile.IParent; import org.eclipse.cdt.make.core.makefile.IRule; import org.eclipse.cdt.make.core.makefile.ITargetRule; import org.eclipse.cdt.make.core.makefile.gnu.IInclude; import org.eclipse.cdt.make.core.makefile.gnu.ITerminal; import org.eclipse.cdt.make.internal.core.makefile.NullMakefile; import org.eclipse.cdt.make.internal.ui.MakeUIImages; import org.eclipse.cdt.make.internal.ui.MakeUIPlugin; import org.eclipse.cdt.make.ui.IWorkingCopyManager; 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.viewers.DoubleClickEvent; import org.eclipse.jface.viewers.IDoubleClickListener; import org.eclipse.jface.viewers.ITreeContentProvider; import org.eclipse.jface.viewers.LabelProvider; import org.eclipse.jface.viewers.TreeViewer; import org.eclipse.jface.viewers.Viewer; import org.eclipse.swt.graphics.Image; 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.IEditorInput; import org.eclipse.ui.IWorkbenchActionConstants; import org.eclipse.ui.part.IPageSite; import org.eclipse.ui.views.contentoutline.ContentOutlinePage; /** * MakefileContentOutlinePage */ public class MakefileContentOutlinePage extends ContentOutlinePage { private class MakefileContentProvider implements ITreeContentProvider { protected boolean showMacroDefinition = true; protected boolean showTargetRule = true; protected boolean showInferenceRule = true; protected boolean showIncludeChildren = false; protected IMakefile makefile; protected IMakefile nullMakefile = new NullMakefile(); /* (non-Javadoc) * @see org.eclipse.jface.viewers.ITreeContentProvider#getChildren(java.lang.Object) */ public Object[] getChildren(Object element) { if (element == fInput) { return getElements(makefile); } else if (element instanceof IDirective) { return getElements(element); } return new Object[0]; } /* (non-Javadoc) * @see org.eclipse.jface.viewers.ITreeContentProvider#getParent(java.lang.Object) */ public Object getParent(Object element) { if (element instanceof IMakefile) { return fInput; } else if (element instanceof IDirective) { return ((IDirective)element).getParent(); } return fInput; } /* (non-Javadoc) * @see org.eclipse.jface.viewers.ITreeContentProvider#hasChildren(java.lang.Object) */ public boolean hasChildren(Object element) { if (element == fInput) { return true; } else if (element instanceof IParent) { // Do not drill down in includes. if (element instanceof IInclude && !showIncludeChildren) { return false; } return true; } return false; } /* (non-Javadoc) * @see org.eclipse.jface.viewers.IStructuredContentProvider#getElements(java.lang.Object) */ public Object[] getElements(Object inputElement) { IDirective[] directives; if (inputElement == fInput) { directives = makefile.getDirectives(); } else if (inputElement instanceof IRule) { directives = ((IRule)inputElement).getCommands(); } else if (inputElement instanceof IParent) { if (inputElement instanceof IInclude && !showIncludeChildren) { directives = new IDirective[0]; } else { directives = ((IParent)inputElement).getDirectives(); } } else { directives = new IDirective[0]; } List<IDirective> list = new ArrayList<IDirective>(directives.length); for (int i = 0; i < directives.length; i++) { if (showMacroDefinition && directives[i] instanceof IMacroDefinition) { list.add(directives[i]); } else if (showInferenceRule && directives[i] instanceof IInferenceRule) { list.add(directives[i]); } else if (showTargetRule && directives[i] instanceof ITargetRule) { list.add(directives[i]); } else { boolean irrelevant = (directives[i] instanceof IComment || directives[i] instanceof IEmptyLine || directives[i] instanceof ITerminal); if (!irrelevant) { list.add(directives[i]); } } } return list.toArray(); } /* (non-Javadoc) * @see org.eclipse.jface.viewers.IContentProvider#dispose() */ public void dispose() { } /* (non-Javadoc) * @see org.eclipse.jface.viewers.IContentProvider#inputChanged(org.eclipse.jface.viewers.Viewer, java.lang.Object, java.lang.Object) */ public void inputChanged(Viewer viewer, Object oldInput, Object newInput) { if (oldInput != null) { makefile = nullMakefile; } if (newInput != null) { IWorkingCopyManager manager= MakeUIPlugin.getDefault().getWorkingCopyManager(); makefile = manager.getWorkingCopy((IEditorInput)newInput); if (makefile == null) { makefile = nullMakefile; } } } } private class MakefileLabelProvider extends LabelProvider { /* (non-Javadoc) * @see org.eclipse.jface.viewers.ILabelProvider#getImage(java.lang.Object) */ @Override public Image getImage(Object element) { if (element instanceof ITargetRule) { return MakeUIImages.getImage(MakeUIImages.IMG_OBJS_MAKEFILE_TARGET_RULE); } else if (element instanceof IInferenceRule) { return MakeUIImages.getImage(MakeUIImages.IMG_OBJS_MAKEFILE_INFERENCE_RULE); } else if (element instanceof IMacroDefinition) { return MakeUIImages.getImage(MakeUIImages.IMG_OBJS_MAKEFILE_MACRO); } else if (element instanceof ICommand) { return MakeUIImages.getImage(MakeUIImages.IMG_OBJS_MAKEFILE_COMMAND); } else if (element instanceof IInclude) { return MakeUIImages.getImage(MakeUIImages.IMG_OBJS_MAKEFILE_INCLUDE); } else if (element instanceof IBadDirective) { return MakeUIImages.getImage(MakeUIImages.IMG_OBJS_ERROR); } else if (element instanceof IParent) { return MakeUIImages.getImage(MakeUIImages.IMG_OBJS_MAKEFILE_RELATION); } return super.getImage(element); } /* (non-Javadoc) * @see org.eclipse.jface.viewers.ILabelProvider#getText(java.lang.Object) */ @Override public String getText(Object element) { String name; if (element instanceof IRule) { name = ((IRule) element).getTarget().toString().trim(); } else if (element instanceof IMacroDefinition) { name = ((IMacroDefinition) element).getName().trim(); } else { name = super.getText(element); } if (name != null) { name = name.trim(); if (name.length() > 25) { name = name.substring(0, 25) + " ..."; //$NON-NLS-1$ } } return name; } } protected MakefileEditor fEditor; protected Object fInput; protected AddBuildTargetAction fAddBuildTargetAction; protected OpenIncludeAction fOpenIncludeAction; public MakefileContentOutlinePage(MakefileEditor editor) { super(); fEditor = editor; fAddBuildTargetAction = new AddBuildTargetAction(this); fOpenIncludeAction = new OpenIncludeAction(this); } /* (non-Javadoc) * @see org.eclipse.ui.part.IPage#createControl(org.eclipse.swt.widgets.Composite) */ @Override public void createControl(Composite parent) { super.createControl(parent); TreeViewer viewer = getTreeViewer(); viewer.setContentProvider(new MakefileContentProvider()); viewer.setLabelProvider(new MakefileLabelProvider()); if (fInput != null) { viewer.setInput(fInput); } MenuManager manager= new MenuManager("#MakefileOutlinerContext"); //$NON-NLS-1$ manager.setRemoveAllWhenShown(true); manager.addMenuListener(new IMenuListener() { public void menuAboutToShow(IMenuManager m) { contextMenuAboutToShow(m); } }); Control tree = viewer.getControl(); Menu menu = manager.createContextMenu(tree); tree.setMenu(menu); viewer.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(); } } }); IPageSite site= getSite(); site.registerContextMenu(MakeUIPlugin.getPluginId() + ".outline", manager, viewer); //$NON-NLS-1$ site.setSelectionProvider(viewer); } /** * called to create the context menu of the outline */ protected void contextMenuAboutToShow(IMenuManager menu) { if (fOpenIncludeAction.canActionBeAdded(getSelection())) { menu.add(fOpenIncludeAction); } if (fAddBuildTargetAction.canActionBeAdded(getSelection())) { menu.add(fAddBuildTargetAction); } menu.add(new Separator(IWorkbenchActionConstants.MB_ADDITIONS)); menu.add(new Separator(IWorkbenchActionConstants.MB_ADDITIONS+"-end"));//$NON-NLS-1$ } /** * Sets the input of the outline page */ public void setInput(Object input) { fInput = input; update(); } public Object getInput() { return fInput; } /** * Updates the outline page. */ public void update() { final TreeViewer viewer = getTreeViewer(); if (viewer != null) { final Control control = viewer.getControl(); if (control != null && !control.isDisposed()) { control.getDisplay().asyncExec(new Runnable() { public void run() { if (!control.isDisposed()) { control.setRedraw(false); viewer.setInput(fInput); viewer.expandAll(); control.setRedraw(true); } } }); } } } /* (non-Javadoc) * @see org.eclipse.ui.part.IPage#setActionBars(org.eclipse.ui.IActionBars) */ @Override public void setActionBars(IActionBars actionBars) { super.setActionBars(actionBars); IToolBarManager toolBarManager= actionBars.getToolBarManager(); LexicalSortingAction action= new LexicalSortingAction(getTreeViewer()); toolBarManager.add(action); } }