diff --git a/org.eclipse.jdt.ui/plugin.xml b/org.eclipse.jdt.ui/plugin.xml index 59dff4c5423..85a7ed79f36 100644 --- a/org.eclipse.jdt.ui/plugin.xml +++ b/org.eclipse.jdt.ui/plugin.xml @@ -1055,6 +1055,17 @@ + + + + + + + fProviderPreferences; private final Map fProviderControls; + private IScopeContext fContext; - public FoldingConfigurationBlock(OverlayPreferenceStore store) { + private boolean fIsProjectPreferencePage; + + + public FoldingConfigurationBlock(OverlayPreferenceStore store, IScopeContext context, boolean isProjectPreferencePage) { Assert.isNotNull(store); fStore= store; fStore.addKeys(createOverlayStoreKeys()); fProviderDescriptors= createListModel(); fProviderPreferences= new HashMap<>(); fProviderControls= new HashMap<>(); + this.fContext= context; + this.fIsProjectPreferencePage= isProjectPreferencePage; } private Map createListModel() { @@ -289,6 +298,14 @@ void updateListDependencies() { if (prefs == null) { try { prefs= desc.createPreferences(); + if (fIsProjectPreferencePage) { + if (prefs instanceof IScopedJavaFoldingPreferenceBlock scopedPrefs) { + scopedPrefs.setScopeContext(fContext); + } else { + String message= Messages.format(PreferencesMessages.FoldingConfigurationBlock_error_project_prefs_not_supported, desc.getName()); + prefs= new ErrorPreferences(message); + } + } fProviderPreferences.put(id, prefs); } catch (CoreException e) { JavaPlugin.log(e); @@ -369,4 +386,19 @@ private void restoreFromPreferences() { else fProviderViewer.setSelection(new StructuredSelection(provider), true); } + + @Override + public void disableProjectSettings() { + if(fContext != null) { + fContext.getNode(JavaUI.ID_PLUGIN).remove(PreferenceConstants.EDITOR_FOLDING_PROJECT_SPECIFIC_SETTINGS_ENABLED); + } + } + + @Override + public void enableProjectSettings() { + if(fContext != null) { + fContext.getNode(JavaUI.ID_PLUGIN).putBoolean(PreferenceConstants.EDITOR_FOLDING_PROJECT_SPECIFIC_SETTINGS_ENABLED, true); + } + + } } diff --git a/org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/preferences/FoldingPreferencePage.java b/org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/preferences/FoldingPreferencePage.java index ed17e5a27c9..f1d1bf3ba20 100644 --- a/org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/preferences/FoldingPreferencePage.java +++ b/org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/preferences/FoldingPreferencePage.java @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (c) 2000, 2011 IBM Corporation and others. + * Copyright (c) 2000, 2025 IBM Corporation and others. * * This program and the accompanying materials * are made available under the terms of the Eclipse Public License 2.0 @@ -15,53 +15,101 @@ package org.eclipse.jdt.internal.ui.preferences; -import org.eclipse.swt.widgets.Composite; -import org.eclipse.swt.widgets.Label; +import org.eclipse.core.runtime.preferences.IScopeContext; + +import org.eclipse.core.resources.IProject; +import org.eclipse.core.resources.ProjectScope; + +import org.eclipse.jface.preference.IPreferenceStore; + +import org.eclipse.ui.preferences.ScopedPreferenceStore; + +import org.eclipse.jdt.ui.JavaUI; +import org.eclipse.jdt.ui.PreferenceConstants; import org.eclipse.jdt.internal.ui.IJavaHelpContextIds; import org.eclipse.jdt.internal.ui.JavaPlugin; +import org.eclipse.jdt.internal.ui.javaeditor.EditorUtility; +import org.eclipse.jdt.internal.ui.javaeditor.JavaEditor; /** * The page for setting the editor options. */ -public final class FoldingPreferencePage extends AbstractConfigurationBlockPreferencePage { +public final class FoldingPreferencePage extends AbstractConfigurationBlockPreferenceAndPropertyPage { + + public static final String PROPERTY_PAGE_ID= "org.eclipse.jdt.ui.propertyPages.FoldingPreferencePage"; //$NON-NLS-1$ + public static final String PREFERENCE_PAGE_ID= "org.eclipse.jdt.ui.preferences.FoldingPreferencePage"; //$NON-NLS-1$ + private OverlayPreferenceStore fOverlayStore; + + + public FoldingPreferencePage() { + setDescription(PreferencesMessages.JavaEditorPreferencePage_folding_title); + } /* - * @see org.eclipse.ui.internal.editors.text.AbstractConfigureationBlockPreferencePage#getHelpId() + * @see org.eclipse.jdt.internal.ui.preferences.AbstractConfigurationBlockPreferenceAndPropertyPage#getHelpId() */ @Override protected String getHelpId() { return IJavaHelpContextIds.JAVA_EDITOR_PREFERENCE_PAGE; } - /* - * @see org.eclipse.ui.internal.editors.text.AbstractConfigurationBlockPreferencePage#setDescription() - */ @Override - protected void setDescription() { - String description= PreferencesMessages.JavaEditorPreferencePage_folding_title; - setDescription(description); + protected IPreferenceAndPropertyConfigurationBlock createConfigurationBlock(IScopeContext context) { + ScopedPreferenceStore scopedStore= new ScopedPreferenceStore(context, JavaUI.ID_PLUGIN); + fOverlayStore= new OverlayPreferenceStore( + scopedStore, + new OverlayPreferenceStore.OverlayKey[] {}); + FoldingConfigurationBlock foldingConfigurationBlock= new FoldingConfigurationBlock(fOverlayStore, context, isProjectPreferencePage()); + fOverlayStore.load(); + fOverlayStore.start(); + return foldingConfigurationBlock; } - /* - * @see org.org.eclipse.ui.internal.editors.text.AbstractConfigurationBlockPreferencePage#setPreferenceStore() - */ @Override - protected void setPreferenceStore() { - setPreferenceStore(JavaPlugin.getDefault().getPreferenceStore()); + protected boolean hasProjectSpecificOptions(IProject project) { + return JavaPlugin.getDefault().getFoldingStructureProviderRegistry().hasProjectSpecificOptions(new ProjectScope(project)); } + @Override + protected String getPreferencePageID() { + return PREFERENCE_PAGE_ID; + } @Override - protected Label createDescriptionLabel(Composite parent) { - return null; // no description for new look. + protected String getPropertyPageID() { + return PROPERTY_PAGE_ID; + } + + @Override + public boolean performOk() { + boolean result= super.performOk(); + fOverlayStore.propagate(); + return result; } - /* - * @see org.eclipse.ui.internal.editors.text.AbstractConfigureationBlockPreferencePage#createConfigurationBlock(org.eclipse.ui.internal.editors.text.OverlayPreferenceStore) - */ @Override - protected IPreferenceConfigurationBlock createConfigurationBlock(OverlayPreferenceStore overlayPreferenceStore) { - return new FoldingConfigurationBlock(overlayPreferenceStore); + public void performDefaults() { + fOverlayStore.loadDefaults(); + super.performDefaults(); + + } + + @Override + public void dispose() { + super.dispose(); + fOverlayStore.stop(); + } + + public static IPreferenceStore getFoldingPreferenceStore(JavaEditor editor) { + IProject project= EditorUtility.getJavaProject(editor).getProject(); + IPreferenceStore scopedPreferenceStore = JavaPlugin.getDefault().getPreferenceStore(); + if (project != null) { + ProjectScope projectScope= new ProjectScope(project); + if(projectScope.getNode(JavaUI.ID_PLUGIN).getBoolean(PreferenceConstants.EDITOR_FOLDING_PROJECT_SPECIFIC_SETTINGS_ENABLED, false)) { + scopedPreferenceStore= new ScopedPreferenceStore(projectScope, JavaUI.ID_PLUGIN); + } + } + return scopedPreferenceStore; } } diff --git a/org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/preferences/PreferencesMessages.java b/org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/preferences/PreferencesMessages.java index a1886d94f9c..1f26dc5e7d4 100644 --- a/org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/preferences/PreferencesMessages.java +++ b/org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/preferences/PreferencesMessages.java @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (c) 2000, 2024 IBM Corporation and others. + * Copyright (c) 2000, 2025 IBM Corporation and others. * * This program and the accompanying materials * are made available under the terms of the Eclipse Public License 2.0 @@ -773,6 +773,7 @@ private PreferencesMessages() { public static String FoldingConfigurationBlock_combo_caption; public static String FoldingConfigurationBlock_info_no_preferences; public static String FoldingConfigurationBlock_error_not_exist; + public static String FoldingConfigurationBlock_error_project_prefs_not_supported; public static String FoldingConfigurationBlock_warning_providerNotFound_resetToDefault; public static String PropertiesFileEditorPreferencePage_key; public static String PropertiesFileEditorPreferencePage_value; diff --git a/org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/preferences/PreferencesMessages.properties b/org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/preferences/PreferencesMessages.properties index 6c16e9b0575..09cff4be9d4 100644 --- a/org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/preferences/PreferencesMessages.properties +++ b/org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/preferences/PreferencesMessages.properties @@ -1,5 +1,5 @@ ############################################################################### -# Copyright (c) 2000, 2024 IBM Corporation and others. +# Copyright (c) 2000, 2025 IBM Corporation and others. # # This program and the accompanying materials # are made available under the terms of the Eclipse Public License 2.0 @@ -892,6 +892,7 @@ FoldingConfigurationBlock_enable= Enable f&olding FoldingConfigurationBlock_combo_caption= Select folding to &use: FoldingConfigurationBlock_info_no_preferences= The selected folding provider did not provide a preference control FoldingConfigurationBlock_error_not_exist= The ''{0}'' folding provider does not exist. +FoldingConfigurationBlock_error_project_prefs_not_supported=The ''{0}'' folding provider does not support project specific preferences. FoldingConfigurationBlock_warning_providerNotFound_resetToDefault= The ''{0}'' folding provider could not be found. Resetting to the default folding provider. # Properties File Editor diff --git a/org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/text/folding/DefaultJavaFoldingPreferenceBlock.java b/org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/text/folding/DefaultJavaFoldingPreferenceBlock.java index b8f64cb15ab..248e833737d 100644 --- a/org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/text/folding/DefaultJavaFoldingPreferenceBlock.java +++ b/org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/text/folding/DefaultJavaFoldingPreferenceBlock.java @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (c) 2000, 2011 IBM Corporation and others. + * Copyright (c) 2000, 2025 IBM Corporation and others. * * This program and the accompanying materials * are made available under the terms of the Eclipse Public License 2.0 @@ -28,10 +28,15 @@ import org.eclipse.swt.widgets.Control; import org.eclipse.swt.widgets.Label; +import org.eclipse.core.runtime.preferences.IScopeContext; + import org.eclipse.jface.preference.IPreferenceStore; +import org.eclipse.ui.preferences.ScopedPreferenceStore; + +import org.eclipse.jdt.ui.JavaUI; import org.eclipse.jdt.ui.PreferenceConstants; -import org.eclipse.jdt.ui.text.folding.IJavaFoldingPreferenceBlock; +import org.eclipse.jdt.ui.text.folding.IScopedJavaFoldingPreferenceBlock; import org.eclipse.jdt.internal.ui.JavaPlugin; import org.eclipse.jdt.internal.ui.preferences.OverlayPreferenceStore; @@ -43,7 +48,7 @@ * * @since 3.0 */ -public class DefaultJavaFoldingPreferenceBlock implements IJavaFoldingPreferenceBlock { +public class DefaultJavaFoldingPreferenceBlock implements IScopedJavaFoldingPreferenceBlock { private IPreferenceStore fStore; private OverlayPreferenceStore fOverlayStore; @@ -67,6 +72,16 @@ public DefaultJavaFoldingPreferenceBlock() { fOverlayStore= new OverlayPreferenceStore(fStore, fKeys); } + @Override + public void setScopeContext(IScopeContext context) { + if(context == null) { + fStore = JavaPlugin.getDefault().getPreferenceStore(); + } else { + fStore= new ScopedPreferenceStore(context, JavaUI.ID_PLUGIN); + } + fOverlayStore= new OverlayPreferenceStore(fStore, fKeys); + } + private OverlayKey[] createKeys() { ArrayList overlayKeys= new ArrayList<>(); diff --git a/org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/text/folding/JavaFoldingStructureProviderDescriptor.java b/org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/text/folding/JavaFoldingStructureProviderDescriptor.java index 1031717f02e..a99993bdbf8 100644 --- a/org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/text/folding/JavaFoldingStructureProviderDescriptor.java +++ b/org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/text/folding/JavaFoldingStructureProviderDescriptor.java @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (c) 2000, 2008 IBM Corporation and others. + * Copyright (c) 2000, 2025 IBM Corporation and others. * * This program and the accompanying materials * are made available under the terms of the Eclipse Public License 2.0 @@ -16,7 +16,10 @@ import org.eclipse.core.runtime.Assert; import org.eclipse.core.runtime.CoreException; import org.eclipse.core.runtime.IConfigurationElement; +import org.eclipse.core.runtime.preferences.IScopeContext; +import org.eclipse.jdt.ui.JavaUI; +import org.eclipse.jdt.ui.PreferenceConstants; import org.eclipse.jdt.ui.text.folding.IJavaFoldingPreferenceBlock; import org.eclipse.jdt.ui.text.folding.IJavaFoldingStructureProvider; @@ -116,4 +119,8 @@ public String getId() { public String getName() { return fName; } + + public boolean hasProjectSpecificOptions(IScopeContext context) { + return context.getNode(JavaUI.ID_PLUGIN).getBoolean(PreferenceConstants.EDITOR_FOLDING_PROJECT_SPECIFIC_SETTINGS_ENABLED, false); + } } diff --git a/org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/text/folding/JavaFoldingStructureProviderRegistry.java b/org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/text/folding/JavaFoldingStructureProviderRegistry.java index dad8824488c..2e14797a28c 100644 --- a/org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/text/folding/JavaFoldingStructureProviderRegistry.java +++ b/org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/text/folding/JavaFoldingStructureProviderRegistry.java @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (c) 2000, 2011 IBM Corporation and others. + * Copyright (c) 2000, 2025 IBM Corporation and others. * * This program and the accompanying materials * are made available under the terms of the Eclipse Public License 2.0 @@ -24,6 +24,7 @@ import org.eclipse.core.runtime.IStatus; import org.eclipse.core.runtime.Platform; import org.eclipse.core.runtime.Status; +import org.eclipse.core.runtime.preferences.IScopeContext; import org.eclipse.jface.preference.IPreferenceStore; @@ -87,6 +88,17 @@ public JavaFoldingStructureProviderDescriptor getFoldingProviderDescriptor(Strin * @return the current provider according to the preferences */ public IJavaFoldingStructureProvider getCurrentFoldingProvider() { + JavaFoldingStructureProviderDescriptor desc= getCurrentFoldingStructureProviderDescriptor(); + + try { + return desc.createProvider(); + } catch (CoreException e) { + JavaPlugin.log(e); + return null; + } + } + + private JavaFoldingStructureProviderDescriptor getCurrentFoldingStructureProviderDescriptor() { IPreferenceStore preferenceStore= JavaPlugin.getDefault().getPreferenceStore(); String currentProviderId= preferenceStore.getString(PreferenceConstants.EDITOR_FOLDING_PROVIDER); JavaFoldingStructureProviderDescriptor desc= getFoldingProviderDescriptor(currentProviderId); @@ -103,13 +115,7 @@ public IJavaFoldingStructureProvider getCurrentFoldingProvider() { preferenceStore.setToDefault(PreferenceConstants.EDITOR_FOLDING_PROVIDER); } - - try { - return desc.createProvider(); - } catch (CoreException e) { - JavaPlugin.log(e); - return null; - } + return desc; } /** @@ -142,4 +148,11 @@ public void reloadExtensions() { } } + public synchronized boolean hasProjectSpecificOptions(IScopeContext context) { + synchronized(this) { + ensureRegistered(); + } + + return getCurrentFoldingStructureProviderDescriptor().hasProjectSpecificOptions(context); + } } diff --git a/org.eclipse.jdt.ui/ui/org/eclipse/jdt/ui/PreferenceConstants.java b/org.eclipse.jdt.ui/ui/org/eclipse/jdt/ui/PreferenceConstants.java index 0cc78f9cd48..cce10760f6b 100644 --- a/org.eclipse.jdt.ui/ui/org/eclipse/jdt/ui/PreferenceConstants.java +++ b/org.eclipse.jdt.ui/ui/org/eclipse/jdt/ui/PreferenceConstants.java @@ -3402,6 +3402,16 @@ private PreferenceConstants() { */ public static final String CODEASSIST_CATEGORY_ORDER= "content_assist_category_order"; //$NON-NLS-1$ + /** + * A named preference that controls whether project specific settings are enabled for folding. + *

+ * Value is of type Boolean. + *

+ * + * @since 3.34 + */ + public static final String EDITOR_FOLDING_PROJECT_SPECIFIC_SETTINGS_ENABLED= "editor_folding_project_settings_enabled"; //$NON-NLS-1$ + /** * A named preference that controls whether folding is enabled in the Java editor. *

diff --git a/org.eclipse.jdt.ui/ui/org/eclipse/jdt/ui/text/folding/DefaultJavaFoldingStructureProvider.java b/org.eclipse.jdt.ui/ui/org/eclipse/jdt/ui/text/folding/DefaultJavaFoldingStructureProvider.java index e212f37c39a..b1c23ad8d26 100755 --- a/org.eclipse.jdt.ui/ui/org/eclipse/jdt/ui/text/folding/DefaultJavaFoldingStructureProvider.java +++ b/org.eclipse.jdt.ui/ui/org/eclipse/jdt/ui/text/folding/DefaultJavaFoldingStructureProvider.java @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (c) 2006, 2024 IBM Corporation and others. + * Copyright (c) 2006, 2025 IBM Corporation and others. * * This program and the accompanying materials * are made available under the terms of the Eclipse Public License 2.0 @@ -72,10 +72,10 @@ import org.eclipse.jdt.ui.PreferenceConstants; -import org.eclipse.jdt.internal.ui.JavaPlugin; import org.eclipse.jdt.internal.ui.actions.SelectionConverter; import org.eclipse.jdt.internal.ui.javaeditor.EditorUtility; import org.eclipse.jdt.internal.ui.javaeditor.JavaEditor; +import org.eclipse.jdt.internal.ui.preferences.FoldingPreferencePage; import org.eclipse.jdt.internal.ui.text.DocumentCharacterIterator; /** @@ -900,7 +900,7 @@ private IJavaElement getInputElement() { } private void initializePreferences() { - IPreferenceStore store= JavaPlugin.getDefault().getPreferenceStore(); + IPreferenceStore store = FoldingPreferencePage.getFoldingPreferenceStore(fEditor); fCollapseInnerTypes= store.getBoolean(PreferenceConstants.EDITOR_FOLDING_INNERTYPES); fCollapseImportContainer= store.getBoolean(PreferenceConstants.EDITOR_FOLDING_IMPORTS); fCollapseJavadoc= store.getBoolean(PreferenceConstants.EDITOR_FOLDING_JAVADOC); diff --git a/org.eclipse.jdt.ui/ui/org/eclipse/jdt/ui/text/folding/IScopedJavaFoldingPreferenceBlock.java b/org.eclipse.jdt.ui/ui/org/eclipse/jdt/ui/text/folding/IScopedJavaFoldingPreferenceBlock.java new file mode 100644 index 00000000000..8527205dd6d --- /dev/null +++ b/org.eclipse.jdt.ui/ui/org/eclipse/jdt/ui/text/folding/IScopedJavaFoldingPreferenceBlock.java @@ -0,0 +1,30 @@ +/******************************************************************************* + * Copyright (c) 2025 Daniel Schmid 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: + * Daniel Schmid - initial API and implementation + *******************************************************************************/ +package org.eclipse.jdt.ui.text.folding; + +import org.eclipse.core.runtime.preferences.IScopeContext; + +/** + * Extends {@link IJavaFoldingPreferenceBlock} for supporting preferences in a given scope (e.g. projects). + * @since 3.34 + */ +public interface IScopedJavaFoldingPreferenceBlock extends IJavaFoldingPreferenceBlock { + /** + * Marks this preference block to be configured in an {@link IScopeContext}. + * @param context The scope context the preferences apply to. + */ + default void setScopeContext(IScopeContext context) { + + } +}