11/*******************************************************************************
2- * Copyright (c) 2000, 2011 IBM Corporation and others.
2+ * Copyright (c) 2000, 2025 IBM Corporation and others.
33 *
44 * This program and the accompanying materials
55 * are made available under the terms of the Eclipse Public License 2.0
3535import org .eclipse .core .runtime .CoreException ;
3636import org .eclipse .core .runtime .IStatus ;
3737import org .eclipse .core .runtime .Status ;
38+ import org .eclipse .core .runtime .preferences .IEclipsePreferences ;
39+ import org .eclipse .core .runtime .preferences .IScopeContext ;
3840
3941import org .eclipse .jface .dialogs .Dialog ;
4042import org .eclipse .jface .layout .PixelConverter ;
43+ import org .eclipse .jface .preference .IPreferenceStore ;
4144import org .eclipse .jface .viewers .ArrayContentProvider ;
4245import org .eclipse .jface .viewers .ComboViewer ;
4346import org .eclipse .jface .viewers .IStructuredSelection ;
4649
4750import org .eclipse .jdt .internal .corext .util .Messages ;
4851
52+ import org .eclipse .jdt .ui .JavaUI ;
4953import org .eclipse .jdt .ui .PreferenceConstants ;
5054import org .eclipse .jdt .ui .text .folding .IJavaFoldingPreferenceBlock ;
55+ import org .eclipse .jdt .ui .text .folding .IScopedJavaFoldingPreferenceBlock ;
5156
5257import org .eclipse .jdt .internal .ui .JavaPlugin ;
5358import org .eclipse .jdt .internal .ui .preferences .OverlayPreferenceStore .OverlayKey ;
6166 *
6267 * @since 3.0
6368 */
64- class FoldingConfigurationBlock implements IPreferenceConfigurationBlock {
69+ class FoldingConfigurationBlock implements IPreferenceAndPropertyConfigurationBlock {
6570
6671 private static class ErrorPreferences implements IJavaFoldingPreferenceBlock {
6772 private String fMessage ;
@@ -117,14 +122,20 @@ public void dispose() {
117122 private final Map <String , IJavaFoldingPreferenceBlock > fProviderPreferences ;
118123 private final Map <String , Control > fProviderControls ;
119124
125+ private IScopeContext fContext ;
120126
121- public FoldingConfigurationBlock (OverlayPreferenceStore store ) {
127+ private boolean fIsProjectPreferencePage ;
128+
129+
130+ public FoldingConfigurationBlock (OverlayPreferenceStore store , IScopeContext context , boolean isProjectPreferencePage ) {
122131 Assert .isNotNull (store );
123132 fStore = store ;
124133 fStore .addKeys (createOverlayStoreKeys ());
125134 fProviderDescriptors = createListModel ();
126135 fProviderPreferences = new HashMap <>();
127136 fProviderControls = new HashMap <>();
137+ this .fContext = context ;
138+ this .fIsProjectPreferencePage = isProjectPreferencePage ;
128139 }
129140
130141 private Map <String , JavaFoldingStructureProviderDescriptor > createListModel () {
@@ -194,7 +205,7 @@ public void widgetDefaultSelected(SelectionEvent e) {
194205 gd = new GridData (GridData .FILL_HORIZONTAL | GridData .VERTICAL_ALIGN_BEGINNING );
195206 label .setLayoutData (gd );
196207
197- if (fProviderDescriptors .size () > 1 ) {
208+ if (fProviderDescriptors .size () > 1 && ! fIsProjectPreferencePage ) {
198209 /* list */
199210 Composite comboComp = new Composite (composite , SWT .NONE );
200211 gd = new GridData (GridData .FILL_HORIZONTAL | GridData .VERTICAL_ALIGN_BEGINNING );
@@ -275,12 +286,12 @@ private void updateCheckboxDependencies() {
275286 }
276287
277288 void updateListDependencies () {
278- String id = fStore .getString (PreferenceConstants .EDITOR_FOLDING_PROVIDER );
289+ String id = getGlobalPreferenceStore () .getString (PreferenceConstants .EDITOR_FOLDING_PROVIDER );
279290 JavaFoldingStructureProviderDescriptor desc = fProviderDescriptors .get (id );
280291 IJavaFoldingPreferenceBlock prefs ;
281292
282293 if (desc == null ) {
283- // safety in case there is no such descriptor
294+ // fallback in case there is no such descriptor
284295 String message = Messages .format (PreferencesMessages .FoldingConfigurationBlock_error_not_exist , id );
285296 JavaPlugin .log (new Status (IStatus .WARNING , JavaPlugin .getPluginId (), IStatus .OK , message , null ));
286297 prefs = new ErrorPreferences (message );
@@ -289,6 +300,14 @@ void updateListDependencies() {
289300 if (prefs == null ) {
290301 try {
291302 prefs = desc .createPreferences ();
303+ if (fIsProjectPreferencePage ) {
304+ if (prefs instanceof IScopedJavaFoldingPreferenceBlock scopedPrefs ) {
305+ scopedPrefs .setScopeContext (fContext );
306+ } else {
307+ String message = Messages .format (PreferencesMessages .FoldingConfigurationBlock_error_project_prefs_not_supported , desc .getName ());
308+ prefs = new ErrorPreferences (message );
309+ }
310+ }
292311 fProviderPreferences .put (id , prefs );
293312 } catch (CoreException e ) {
294313 JavaPlugin .log (e );
@@ -348,25 +367,51 @@ private void restoreFromPreferences() {
348367 fFoldingCheckbox .setSelection (enabled );
349368 updateCheckboxDependencies ();
350369
351- String id = fStore .getString (PreferenceConstants .EDITOR_FOLDING_PROVIDER );
370+ IPreferenceStore globalStore = getGlobalPreferenceStore ();
371+
372+ String id = globalStore .getString (PreferenceConstants .EDITOR_FOLDING_PROVIDER );
352373 Object provider = fProviderDescriptors .get (id );
353374
354375 // Fallback to default
355376 if (provider == null ) {
356377 String message = Messages .format (PreferencesMessages .FoldingConfigurationBlock_warning_providerNotFound_resetToDefault , id );
357378 JavaPlugin .log (new Status (IStatus .WARNING , JavaPlugin .getPluginId (), IStatus .OK , message , null ));
358379
359- id = JavaPlugin . getDefault (). getPreferenceStore () .getDefaultString (PreferenceConstants .EDITOR_FOLDING_PROVIDER );
380+ id = globalStore .getDefaultString (PreferenceConstants .EDITOR_FOLDING_PROVIDER );
360381
361382 provider = fProviderDescriptors .get (id );
362383 Assert .isNotNull (provider );
363384
364- fStore .setToDefault (PreferenceConstants .EDITOR_FOLDING_PROVIDER );
385+ globalStore .setToDefault (PreferenceConstants .EDITOR_FOLDING_PROVIDER );
365386 }
366387
367388 if (fProviderViewer == null )
368389 updateListDependencies ();
369390 else
370391 fProviderViewer .setSelection (new StructuredSelection (provider ), true );
371392 }
393+
394+ private IPreferenceStore getGlobalPreferenceStore () {
395+ return fIsProjectPreferencePage ? JavaPlugin .getDefault ().getPreferenceStore () : fStore ;
396+ }
397+
398+ @ Override
399+ public void disableProjectSettings () {
400+ if (fContext != null ) {
401+ IEclipsePreferences node = fContext .getNode (JavaUI .ID_PLUGIN );
402+ node .remove (PreferenceConstants .EDITOR_FOLDING_PROJECT_SPECIFIC_SETTINGS_ENABLED );
403+ // This preference used by the JavaEditor.
404+ // To make sure it reacts to this change, it must be removed from the project.
405+ node .remove (PreferenceConstants .EDITOR_FOLDING_ENABLED );
406+ // update the preference screen
407+ restoreFromPreferences ();
408+ }
409+ }
410+
411+ @ Override
412+ public void enableProjectSettings () {
413+ if (fContext != null ) {
414+ fContext .getNode (JavaUI .ID_PLUGIN ).putBoolean (PreferenceConstants .EDITOR_FOLDING_PROJECT_SPECIFIC_SETTINGS_ENABLED , true );
415+ }
416+ }
372417}
0 commit comments