/******************************************************************************* * Copyright (c) 2005, 2010 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 org.eclipse.jface.action.Action; import org.eclipse.jface.action.IMenuManager; import org.eclipse.swt.SWT; import org.eclipse.swt.custom.StackLayout; import org.eclipse.swt.events.SelectionAdapter; import org.eclipse.swt.events.SelectionEvent; import org.eclipse.swt.layout.FillLayout; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Control; import org.eclipse.swt.widgets.Link; import org.eclipse.ui.IActionBars; import org.eclipse.ui.actions.ActionGroup; import org.eclipse.ui.dialogs.PreferencesUtil; import org.eclipse.cdt.core.model.ITranslationUnit; import org.eclipse.cdt.ui.CDTSharedImages; import org.eclipse.cdt.ui.PreferenceConstants; import org.eclipse.cdt.ui.actions.CustomFiltersActionGroup; import org.eclipse.cdt.ui.actions.GenerateActionGroup; import org.eclipse.cdt.ui.actions.MemberFilterActionGroup; import org.eclipse.cdt.ui.actions.OpenViewActionGroup; import org.eclipse.cdt.ui.refactoring.actions.CRefactoringActionGroup; import org.eclipse.cdt.internal.ui.CPluginImages; import org.eclipse.cdt.internal.ui.actions.ActionMessages; import org.eclipse.cdt.internal.ui.search.actions.SelectionSearchGroup; /** * Outline page for C/C++ translation units. */ public class CContentOutlinePage extends AbstractCModelOutlinePage { private Composite fParent; private StackLayout fStackLayout; private Composite fOutlinePage; private Control fStatusPage; private boolean fScalabilityMode; public CContentOutlinePage(CEditor editor) { super("#TranslationUnitOutlinerContext", editor); //$NON-NLS-1$ } /** * Provides access to the CEditor corresponding to this CContentOutlinePage. * @returns the CEditor corresponding to this CContentOutlinePage. */ public CEditor getEditor() { return (CEditor)fEditor; } @Override public void createControl(Composite parent) { fParent = new Composite(parent, SWT.NONE); fStackLayout = new StackLayout(); fParent.setLayout(fStackLayout); fOutlinePage = new Composite(fParent, SWT.NONE); fOutlinePage.setLayout(new FillLayout()); super.createControl(fOutlinePage); fStatusPage = createStatusPage(fParent); updateVisiblePage(); } @Override public Control getControl() { return fParent; } private Control createStatusPage(Composite parent) { final Link link= new Link(parent, SWT.NONE); link.setText(CEditorMessages.Scalability_outlineDisabled); link.setToolTipText(CEditorMessages.Scalability_linkToolTip); link.addSelectionListener(new SelectionAdapter() { @Override public void widgetSelected(SelectionEvent e) { PreferencesUtil.createPreferenceDialogOn(link.getShell(), "org.eclipse.cdt.ui.preferences.CScalabilityPreferences", null, null).open(); //$NON-NLS-1$ } }); return link; } @Override public void setInput(ITranslationUnit unit) { final CEditor editor= getEditor(); if (editor.isEnableScalablilityMode() && PreferenceConstants.getPreferenceStore().getBoolean(PreferenceConstants.SCALABILITY_RECONCILER)) { fScalabilityMode = true; super.setInput(null); } else { fScalabilityMode = false; super.setInput(unit); } updateVisiblePage(); } private void updateVisiblePage() { if (fStackLayout == null) { return; } if (fScalabilityMode) { if (fStackLayout.topControl != fStatusPage) { fStackLayout.topControl = fStatusPage; fParent.layout(); } } else { if (fStackLayout.topControl != fOutlinePage) { fStackLayout.topControl = fOutlinePage; fParent.layout(); } } } @Override protected ActionGroup createSearchActionGroup() { return new SelectionSearchGroup(this); } @Override protected ActionGroup createOpenViewActionGroup() { OpenViewActionGroup ovag= new OpenViewActionGroup(this, getEditor()); ovag.setEnableIncludeBrowser(true); return ovag; } @Override protected ActionGroup createRefactoringActionGroup() { return new CRefactoringActionGroup(this); } @Override protected ActionGroup createSourceActionGroup() { return new GenerateActionGroup(this); } @Override protected ActionGroup createCustomFiltersActionGroup() { return new CustomFiltersActionGroup("org.eclipse.cdt.ui.COutlinePage", getTreeViewer()); //$NON-NLS-1$ } @Override protected ActionGroup createMemberFilterActionGroup() { return new MemberFilterActionGroup(getTreeViewer(), "COutlineViewer"); //$NON-NLS-1$ } /** * This action toggles namespace grouping * * @since 5.2 */ protected static class NamespaceGroupingAction extends Action { public NamespaceGroupingAction(AbstractCModelOutlinePage outlinePage) { super(ActionMessages.NamespacesGroupingAction_label); setDescription(ActionMessages.NamespacesGroupingAction_description); setToolTipText(ActionMessages.NamespacesGroupingAction_tooltip); this.setImageDescriptor(CDTSharedImages.getImageDescriptor(CDTSharedImages.IMG_OBJS_NAMESPACE)); this.setDisabledImageDescriptor(CDTSharedImages.getImageDescriptor(CDTSharedImages.IMG_OBJS_NAMESPACE)); boolean enabled= isNamspacesGroupingEnabled(); setChecked(enabled); } /** * Runs the action. */ @Override public void run() { PreferenceConstants.getPreferenceStore().setValue(PreferenceConstants.OUTLINE_GROUP_NAMESPACES, isChecked()); } public boolean isNamspacesGroupingEnabled () { return PreferenceConstants.getPreferenceStore().getBoolean(PreferenceConstants.OUTLINE_GROUP_NAMESPACES); } } /** * This action toggles member definition grouping * * @since 5.2 */ protected static class MemberGroupingAction extends Action { public MemberGroupingAction(AbstractCModelOutlinePage outlinePage) { super(ActionMessages.MemberGroupingAction_label); setDescription(ActionMessages.MemberGroupingAction_description); setToolTipText(ActionMessages.MemberGroupingAction_tooltip); CPluginImages.setImageDescriptors(this, CPluginImages.T_LCL, CPluginImages.IMG_ACTION_SHOW_PUBLIC); boolean enabled= isMemberGroupingEnabled(); setChecked(enabled); } /** * Runs the action. */ @Override public void run() { PreferenceConstants.getPreferenceStore().setValue(PreferenceConstants.OUTLINE_GROUP_MEMBERS, isChecked()); } public boolean isMemberGroupingEnabled () { return PreferenceConstants.getPreferenceStore().getBoolean(PreferenceConstants.OUTLINE_GROUP_MEMBERS); } } @Override protected void registerActionBars(IActionBars actionBars) { super.registerActionBars(actionBars); IMenuManager menu= actionBars.getMenuManager(); // appendToGroup does not work reliably (bug 326748) // menu.appendToGroup("group.layout", new MemberGroupingAction(this)); //$NON-NLS-1$ // menu.appendToGroup("group.layout", new NamespaceGroupingAction(this)); //$NON-NLS-1$ // add actions directly instead menu.add(new MemberGroupingAction(this)); menu.add(new NamespaceGroupingAction(this)); } }