diff --git a/build/org.eclipse.cdt.make.ui/META-INF/MANIFEST.MF b/build/org.eclipse.cdt.make.ui/META-INF/MANIFEST.MF
index 26e37aa2d01..93a2f997d19 100644
--- a/build/org.eclipse.cdt.make.ui/META-INF/MANIFEST.MF
+++ b/build/org.eclipse.cdt.make.ui/META-INF/MANIFEST.MF
@@ -2,7 +2,7 @@ Manifest-Version: 1.0
Bundle-ManifestVersion: 2
Bundle-Name: %pluginName
Bundle-SymbolicName: org.eclipse.cdt.make.ui; singleton:=true
-Bundle-Version: 7.0.0.qualifier
+Bundle-Version: 7.1.0.qualifier
Bundle-Activator: org.eclipse.cdt.make.internal.ui.MakeUIPlugin
Bundle-Vendor: %providerName
Bundle-Localization: plugin
diff --git a/build/org.eclipse.cdt.make.ui/src/org/eclipse/cdt/make/internal/ui/actions/FoldingActionGroup.java b/build/org.eclipse.cdt.make.ui/src/org/eclipse/cdt/make/internal/ui/actions/FoldingActionGroup.java
new file mode 100644
index 00000000000..a5430daad19
--- /dev/null
+++ b/build/org.eclipse.cdt.make.ui/src/org/eclipse/cdt/make/internal/ui/actions/FoldingActionGroup.java
@@ -0,0 +1,200 @@
+/*******************************************************************************
+ * Copyright (c) 2000, 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
+ * Anton Leherbauer (Wind River Systems)
+ * Patrick Hofer - Bug 326265
+ *******************************************************************************/
+
+// this file is based on org.eclipse.cdt.internal.ui.actions.FoldingActionGroup
+
+package org.eclipse.cdt.make.internal.ui.actions;
+
+import java.util.ResourceBundle;
+
+import org.eclipse.jface.action.IAction;
+import org.eclipse.jface.action.IMenuManager;
+import org.eclipse.jface.text.ITextViewer;
+import org.eclipse.jface.text.source.projection.IProjectionListener;
+import org.eclipse.jface.text.source.projection.ProjectionViewer;
+import org.eclipse.ui.actions.ActionGroup;
+import org.eclipse.ui.editors.text.IFoldingCommandIds;
+import org.eclipse.ui.texteditor.ITextEditor;
+import org.eclipse.ui.texteditor.IUpdate;
+import org.eclipse.ui.texteditor.ResourceAction;
+import org.eclipse.ui.texteditor.TextOperationAction;
+
+import org.eclipse.cdt.make.internal.ui.editor.MakefileEditor;
+
+/**
+ * Groups the CDT folding actions.
+ */
+public class FoldingActionGroup extends ActionGroup {
+
+ private static abstract class PreferenceAction extends ResourceAction implements IUpdate {
+ PreferenceAction(ResourceBundle bundle, String prefix, int style) {
+ super(bundle, prefix, style);
+ update();
+ }
+ }
+
+ private class FoldingAction extends PreferenceAction {
+
+ FoldingAction(ResourceBundle bundle, String prefix) {
+ super(bundle, prefix, IAction.AS_PUSH_BUTTON);
+ }
+
+ public void update() {
+ setEnabled(FoldingActionGroup.this.isEnabled() && fViewer.isProjectionMode());
+ }
+
+ }
+
+ private ProjectionViewer fViewer;
+ private IProjectionListener fProjectionListener;
+
+ private TextOperationAction fToggle;
+ private TextOperationAction fExpand;
+ private TextOperationAction fCollapse;
+ private TextOperationAction fExpandAll;
+
+ private TextOperationAction fCollapseAll;
+ private PreferenceAction fRestoreDefaults;
+
+
+
+ /**
+ * Creates a new projection action group for editor
. If the
+ * supplied viewer is not an instance of ProjectionViewer
, the
+ * action group is disabled.
+ *
+ * @param editor the text editor to operate on
+ * @param viewer the viewer of the editor
+ */
+ public FoldingActionGroup(final ITextEditor editor, ITextViewer viewer) {
+ if (!(viewer instanceof ProjectionViewer)) {
+ fToggle= null;
+ fExpand= null;
+ fCollapse= null;
+ fExpandAll= null;
+ fCollapseAll= null;
+ fRestoreDefaults= null;
+ fProjectionListener= null;
+ return;
+ }
+
+ fViewer= (ProjectionViewer) viewer;
+
+ fProjectionListener= new IProjectionListener() {
+ public void projectionEnabled() {
+ update();
+ }
+ public void projectionDisabled() {
+ update();
+ }
+ };
+
+ fViewer.addProjectionListener(fProjectionListener);
+
+ fToggle= new TextOperationAction(FoldingMessages.getResourceBundle(), "Projection.Toggle.", editor, ProjectionViewer.TOGGLE, true); //$NON-NLS-1$
+ fToggle.setActionDefinitionId(IFoldingCommandIds.FOLDING_TOGGLE);
+ editor.setAction("FoldingToggle", fToggle); //$NON-NLS-1$
+
+ fExpandAll= new TextOperationAction(FoldingMessages.getResourceBundle(), "Projection.ExpandAll.", editor, ProjectionViewer.EXPAND_ALL, true); //$NON-NLS-1$
+ fExpandAll.setActionDefinitionId(IFoldingCommandIds.FOLDING_EXPAND_ALL);
+ editor.setAction("FoldingExpandAll", fExpandAll); //$NON-NLS-1$
+
+ fCollapseAll= new TextOperationAction(FoldingMessages.getResourceBundle(), "Projection.CollapseAll.", editor, ProjectionViewer.COLLAPSE_ALL, true); //$NON-NLS-1$
+ fCollapseAll.setActionDefinitionId(IFoldingCommandIds.FOLDING_COLLAPSE_ALL);
+ editor.setAction("FoldingCollapseAll", fCollapseAll); //$NON-NLS-1$
+
+ fExpand= new TextOperationAction(FoldingMessages.getResourceBundle(), "Projection.Expand.", editor, ProjectionViewer.EXPAND, true); //$NON-NLS-1$
+ fExpand.setActionDefinitionId(IFoldingCommandIds.FOLDING_EXPAND);
+ editor.setAction("FoldingExpand", fExpand); //$NON-NLS-1$
+
+ fCollapse= new TextOperationAction(FoldingMessages.getResourceBundle(), "Projection.Collapse.", editor, ProjectionViewer.COLLAPSE, true); //$NON-NLS-1$
+ fCollapse.setActionDefinitionId(IFoldingCommandIds.FOLDING_COLLAPSE);
+ editor.setAction("FoldingCollapse", fCollapse); //$NON-NLS-1$
+
+ fRestoreDefaults= new FoldingAction(FoldingMessages.getResourceBundle(), "Projection.Restore.") { //$NON-NLS-1$
+ @Override
+ public void run() {
+ if (editor instanceof MakefileEditor) {
+ MakefileEditor makefileEditor= (MakefileEditor) editor;
+ makefileEditor.resetProjection();
+ }
+ }
+ };
+ fRestoreDefaults.setActionDefinitionId(IFoldingCommandIds.FOLDING_RESTORE);
+ editor.setAction("FoldingRestore", fRestoreDefaults); //$NON-NLS-1$
+ }
+
+ /**
+ * Returns true
if the group is enabled.
+ *
+ * Invariant: isEnabled() <=> fViewer and all actions are != null. + *+ * + * @return
true
if the group is enabled
+ */
+ protected boolean isEnabled() {
+ return fViewer != null;
+ }
+
+ /*
+ * @see org.eclipse.ui.actions.ActionGroup#dispose()
+ */
+ @Override
+ public void dispose() {
+ if (isEnabled()) {
+ fViewer.removeProjectionListener(fProjectionListener);
+ fViewer= null;
+ }
+ super.dispose();
+ }
+
+ /**
+ * Updates the actions.
+ */
+ protected void update() {
+ if (isEnabled()) {
+ fToggle.update();
+ fToggle.setChecked(fViewer.isProjectionMode());
+ fExpand.update();
+ fExpandAll.update();
+ fCollapse.update();
+ fCollapseAll.update();
+ fRestoreDefaults.update();
+ }
+ }
+
+ /**
+ * Fills the menu with all folding actions.
+ *
+ * @param manager the menu manager for the folding submenu
+ */
+ public void fillMenu(IMenuManager manager) {
+ if (isEnabled()) {
+ update();
+ manager.add(fToggle);
+ manager.add(fExpandAll);
+ manager.add(fExpand);
+ manager.add(fCollapse);
+ manager.add(fCollapseAll);
+ manager.add(fRestoreDefaults);
+ }
+ }
+
+ /*
+ * @see org.eclipse.ui.actions.ActionGroup#updateActionBars()
+ */
+ @Override
+ public void updateActionBars() {
+ update();
+ }
+}
diff --git a/build/org.eclipse.cdt.make.ui/src/org/eclipse/cdt/make/internal/ui/actions/FoldingMessages.java b/build/org.eclipse.cdt.make.ui/src/org/eclipse/cdt/make/internal/ui/actions/FoldingMessages.java
new file mode 100644
index 00000000000..7bafb96f4b3
--- /dev/null
+++ b/build/org.eclipse.cdt.make.ui/src/org/eclipse/cdt/make/internal/ui/actions/FoldingMessages.java
@@ -0,0 +1,83 @@
+/*******************************************************************************
+ * Copyright (c) 2000, 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
+ * Patrick Hofer - Bug 326265
+ *******************************************************************************/
+
+// this file is based on org.eclipse.cdt.internal.ui.actions.FoldingMessages
+
+package org.eclipse.cdt.make.internal.ui.actions;
+
+import com.ibm.icu.text.MessageFormat;
+import java.util.MissingResourceException;
+import java.util.ResourceBundle;
+
+/**
+ * Class that gives access to the folding messages resource bundle.
+ */
+public class FoldingMessages {
+
+ private static final String BUNDLE_NAME= "org.eclipse.cdt.make.internal.ui.actions.FoldingMessages"; //$NON-NLS-1$
+
+ private static final ResourceBundle RESOURCE_BUNDLE= ResourceBundle.getBundle(BUNDLE_NAME);
+
+ private FoldingMessages() {
+ // no instance
+ }
+
+ /**
+ * Returns the resource string associated with the given key in the resource bundle. If there isn't
+ * any value under the given key, the key is returned.
+ *
+ * @param key the resource key
+ * @return the string
+ */
+ public static String getString(String key) {
+ try {
+ return RESOURCE_BUNDLE.getString(key);
+ } catch (MissingResourceException e) {
+ return '!' + key + '!';
+ }
+ }
+
+ /**
+ * Returns the resource bundle managed by the receiver.
+ *
+ * @return the resource bundle
+ */
+ public static ResourceBundle getResourceBundle() {
+ return RESOURCE_BUNDLE;
+ }
+
+ /**
+ * Returns the formatted resource string associated with the given key in the resource bundle.
+ * MessageFormat
is used to format the message. If there isn't any value
+ * under the given key, the key is returned.
+ *
+ * @param key the resource key
+ * @param arg the message argument
+ * @return the string
+ */
+ public static String getFormattedString(String key, Object arg) {
+ return getFormattedString(key, new Object[] { arg });
+ }
+
+ /**
+ * Returns the formatted resource string associated with the given key in the resource bundle.
+ * MessageFormat
is used to format the message. If there isn't any value
+ * under the given key, the key is returned.
+ *
+ * @param key the resource key
+ * @param args the message arguments
+ * @return the string
+ */
+ public static String getFormattedString(String key, Object[] args) {
+ return MessageFormat.format(getString(key), args);
+ }
+}
diff --git a/build/org.eclipse.cdt.make.ui/src/org/eclipse/cdt/make/internal/ui/actions/FoldingMessages.properties b/build/org.eclipse.cdt.make.ui/src/org/eclipse/cdt/make/internal/ui/actions/FoldingMessages.properties
new file mode 100644
index 00000000000..b8c52e00cf3
--- /dev/null
+++ b/build/org.eclipse.cdt.make.ui/src/org/eclipse/cdt/make/internal/ui/actions/FoldingMessages.properties
@@ -0,0 +1,40 @@
+###############################################################################
+# 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
+# Patrick Hofer - Bug 326265
+###############################################################################
+Projection.Toggle.label= &Enable Folding
+Projection.Toggle.tooltip= Toggles Folding
+Projection.Toggle.description= Toggles folding for the current editor
+Projection.Toggle.image=
+
+Projection.ExpandAll.label= Expand &All
+Projection.ExpandAll.tooltip= Expands All Collapsed Regions
+Projection.ExpandAll.description= Expands any collapsed regions in the current editor
+Projection.ExpandAll.image=
+
+Projection.Expand.label= E&xpand
+Projection.Expand.tooltip= Expands the Current Collapsed Region
+Projection.Expand.description= Expands the collapsed region at the current selection
+Projection.Expand.image=
+
+Projection.CollapseAll.label= Collapse A&ll
+Projection.CollapseAll.tooltip= Collapses All Expanded Regions
+Projection.CollapseAll.description= Collapse any expanded regions in the current editor
+Projection.CollapseAll.image=
+
+Projection.Collapse.label= Colla&pse
+Projection.Collapse.tooltip= Collapses the Current Region
+Projection.Collapse.description= Collapses the Current Region
+Projection.Collapse.image=
+
+Projection.Restore.label= &Reset Structure
+Projection.Restore.tooltip= Restore the Original Folding Structure
+Projection.Restore.description= Restores the original folding structure
+Projection.Restore.image=
diff --git a/build/org.eclipse.cdt.make.ui/src/org/eclipse/cdt/make/internal/ui/editor/MakefileEditor.java b/build/org.eclipse.cdt.make.ui/src/org/eclipse/cdt/make/internal/ui/editor/MakefileEditor.java
index 8e79b8cd54a..6f3f65a95bd 100644
--- a/build/org.eclipse.cdt.make.ui/src/org/eclipse/cdt/make/internal/ui/editor/MakefileEditor.java
+++ b/build/org.eclipse.cdt.make.ui/src/org/eclipse/cdt/make/internal/ui/editor/MakefileEditor.java
@@ -9,6 +9,7 @@
* QNX Software Systems - Initial API and implementation
* Anton Leherbauer (Wind River Systems)
* IBM Corporation
+ * Patrick Hofer - Bug 326265
*******************************************************************************/
package org.eclipse.cdt.make.internal.ui.editor;
@@ -18,10 +19,12 @@ import org.eclipse.cdt.make.core.makefile.IDirective;
import org.eclipse.cdt.make.internal.ui.MakeUIPlugin;
import org.eclipse.cdt.make.internal.ui.preferences.MakefileEditorPreferenceConstants;
import org.eclipse.cdt.make.internal.ui.text.makefile.MakefileWordDetector;
+import org.eclipse.cdt.make.internal.ui.actions.FoldingActionGroup;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.core.runtime.ListenerList;
import org.eclipse.jface.action.IAction;
import org.eclipse.jface.action.IMenuManager;
+import org.eclipse.jface.action.MenuManager;
import org.eclipse.jface.preference.IPreferenceStore;
import org.eclipse.jface.text.BadLocationException;
import org.eclipse.jface.text.FindReplaceDocumentAdapter;
@@ -62,6 +65,12 @@ public class MakefileEditor extends TextEditor implements ISelectionChangedListe
ProjectionMakefileUpdater fProjectionMakefileUpdater;
private FindReplaceDocumentAdapter fFindReplaceDocumentAdapter;
+ /**
+ * The action group for folding.
+ * @since 7.1
+ */
+ private FoldingActionGroup fFoldingGroup;
+
/**
* Reconciling listeners.
* @since 3.0
@@ -119,6 +128,26 @@ public class MakefileEditor extends TextEditor implements ISelectionChangedListe
boolean isFoldingEnabled() {
return MakeUIPlugin.getDefault().getPreferenceStore().getBoolean(MakefileEditorPreferenceConstants.EDITOR_FOLDING_ENABLED);
}
+
+ /*
+ * @see org.eclipse.ui.texteditor.AbstractTextEditor#rulerContextMenuAboutToShow(org.eclipse.jface.action.IMenuManager)
+ */
+ @Override
+ protected void rulerContextMenuAboutToShow(IMenuManager menu) {
+ super.rulerContextMenuAboutToShow(menu);
+ IMenuManager foldingMenu= new MenuManager(MakefileEditorMessages.MakefileEditor_menu_folding, "projection"); //$NON-NLS-1$
+ menu.appendToGroup(ITextEditorActionConstants.GROUP_RULERS, foldingMenu);
+
+ IAction action= getAction("FoldingToggle"); //$NON-NLS-1$
+ foldingMenu.add(action);
+ action= getAction("FoldingExpandAll"); //$NON-NLS-1$
+ foldingMenu.add(action);
+ action= getAction("FoldingCollapseAll"); //$NON-NLS-1$
+ foldingMenu.add(action);
+ action= getAction("FoldingRestore"); //$NON-NLS-1$
+ foldingMenu.add(action);
+ }
+
/* (non-Javadoc)
* @see org.eclipse.ui.IWorkbenchPart#createPartControl(org.eclipse.swt.widgets.Composite)
@@ -158,6 +187,7 @@ public class MakefileEditor extends TextEditor implements ISelectionChangedListe
/* (non-Javadoc)
* Method declared on IAdaptable
*/
+ @SuppressWarnings("rawtypes")
@Override
public Object getAdapter(Class key) {
if (ProjectionAnnotationModel.class.equals(key)) {
@@ -216,6 +246,7 @@ public class MakefileEditor extends TextEditor implements ISelectionChangedListe
setAction("OpenDeclarationAction", a); //$NON-NLS-1$
markAsStateDependentAction("OpenDeclarationAction", true); //$NON-NLS-1$
+ fFoldingGroup = new FoldingActionGroup(this, getSourceViewer());
}
/* (non-Javadoc)
@@ -347,6 +378,15 @@ public class MakefileEditor extends TextEditor implements ISelectionChangedListe
((IReconcilingParticipant)listeners[i]).reconciled();
}
}
+
+ /**
+ * Returns the folding action group, or null
if there is none.
+ *
+ * @return the folding action group, or null
if there is none
+ */
+ protected FoldingActionGroup getFoldingActionGroup() {
+ return fFoldingGroup;
+ }
/*
* @see org.eclipse.ui.texteditor.AbstractTextEditor#performRevert()
@@ -377,6 +417,17 @@ public class MakefileEditor extends TextEditor implements ISelectionChangedListe
}
}
+ /**
+ * Resets the foldings structure according to the folding
+ * preferences.
+ *
+ * @since 7.1
+ */
+ public void resetProjection() {
+ if (fProjectionMakefileUpdater != null) {
+ fProjectionMakefileUpdater.initialize();
+ }
+ }
/* (non-Javadoc)
* @see org.eclipse.ui.texteditor.AbstractTextEditor#handlePreferenceStoreChanged(org.eclipse.jface.util.PropertyChangeEvent)
diff --git a/build/org.eclipse.cdt.make.ui/src/org/eclipse/cdt/make/internal/ui/editor/MakefileEditorMessages.java b/build/org.eclipse.cdt.make.ui/src/org/eclipse/cdt/make/internal/ui/editor/MakefileEditorMessages.java
new file mode 100644
index 00000000000..ec1f0524ead
--- /dev/null
+++ b/build/org.eclipse.cdt.make.ui/src/org/eclipse/cdt/make/internal/ui/editor/MakefileEditorMessages.java
@@ -0,0 +1,30 @@
+/*******************************************************************************
+ * Copyright (c) 2000, 2010 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
+ * Patrick Hofer - Bug 326265
+ *******************************************************************************/
+
+// this file is based on org.eclipse.cdt.internal.ui.editor.CEditorMessages
+
+package org.eclipse.cdt.make.internal.ui.editor;
+
+import org.eclipse.osgi.util.NLS;
+
+public final class MakefileEditorMessages extends NLS {
+
+ public static String MakefileEditor_menu_folding;
+
+ static {
+ NLS.initializeMessages(MakefileEditorMessages.class.getName(), MakefileEditorMessages.class);
+ }
+
+ // Do not instantiate
+ private MakefileEditorMessages() {
+ }
+}
\ No newline at end of file
diff --git a/build/org.eclipse.cdt.make.ui/src/org/eclipse/cdt/make/internal/ui/editor/MakefileEditorMessages.properties b/build/org.eclipse.cdt.make.ui/src/org/eclipse/cdt/make/internal/ui/editor/MakefileEditorMessages.properties
new file mode 100644
index 00000000000..b9b71ecd383
--- /dev/null
+++ b/build/org.eclipse.cdt.make.ui/src/org/eclipse/cdt/make/internal/ui/editor/MakefileEditorMessages.properties
@@ -0,0 +1,12 @@
+#########################################
+# Copyright (c) 2010 Eclipse CDT Project 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:
+# Patrick Hofer - initial API and implementation
+#########################################
+
+MakefileEditor_menu_folding=F&olding