| /*=============================================================================# |
| # Copyright (c) 2005, 2021 Stephan Wahlbrink and others. |
| # |
| # This program and the accompanying materials are made available under the |
| # terms of the Eclipse Public License 2.0 which is available at |
| # https://www.eclipse.org/legal/epl-2.0, or the Apache License, Version 2.0 |
| # which is available at https://www.apache.org/licenses/LICENSE-2.0. |
| # |
| # SPDX-License-Identifier: EPL-2.0 OR Apache-2.0 |
| # |
| # Contributors: |
| # Stephan Wahlbrink <sw@wahlbrink.eu> - initial API and implementation |
| #=============================================================================*/ |
| |
| package org.eclipse.statet.ecommons.preferences.ui; |
| |
| import java.util.Set; |
| |
| import org.osgi.service.prefs.BackingStoreException; |
| |
| import org.eclipse.core.runtime.IStatus; |
| import org.eclipse.core.runtime.Status; |
| import org.eclipse.core.runtime.jobs.Job; |
| import org.eclipse.jface.preference.IPreferenceStore; |
| import org.eclipse.swt.SWT; |
| import org.eclipse.swt.events.SelectionAdapter; |
| import org.eclipse.swt.events.SelectionEvent; |
| import org.eclipse.swt.layout.GridData; |
| import org.eclipse.swt.widgets.Composite; |
| import org.eclipse.swt.widgets.Link; |
| import org.eclipse.swt.widgets.Shell; |
| import org.eclipse.ui.preferences.IWorkbenchPreferenceContainer; |
| import org.eclipse.ui.statushandlers.StatusManager; |
| |
| import org.eclipse.statet.jcommons.lang.NonNullByDefault; |
| import org.eclipse.statet.jcommons.lang.Nullable; |
| |
| import org.eclipse.statet.ecommons.preferences.PreferencesUtil; |
| import org.eclipse.statet.ecommons.ui.util.LayoutUtils; |
| |
| |
| @NonNullByDefault |
| public abstract class ConfigurationBlock { |
| |
| |
| public static final int SAVE_STORE= 1 << 4; |
| |
| |
| public static GridData applyWrapWidth(final GridData gd) { |
| gd.widthHint= 300; |
| return gd; |
| } |
| |
| public static void scheduleChangeNotification(final IWorkbenchPreferenceContainer container, final String[] groupIds, final boolean directly) { |
| if (groupIds != null) { |
| final String source= (directly) ? null : container.toString(); |
| final Job job= PreferencesUtil.getSettingsChangeNotifier().getNotifyJob(source, groupIds); |
| if (job == null) { |
| return; |
| } |
| if (directly) { |
| job.schedule(); |
| } |
| else { |
| container.registerUpdateJob(job); |
| } |
| } |
| } |
| |
| protected class LinkSelectionListener extends SelectionAdapter { |
| |
| |
| public LinkSelectionListener() { |
| } |
| |
| |
| @Override |
| public void widgetSelected(final SelectionEvent e) { |
| org.eclipse.ui.dialogs.PreferencesUtil.createPreferenceDialogOn(getShell(), e.text, |
| null, getData(e)); |
| } |
| |
| protected @Nullable Object getData(final SelectionEvent e) { |
| return null; |
| } |
| |
| } |
| |
| |
| private Shell shell; |
| |
| private final @Nullable String title; |
| |
| private IWorkbenchPreferenceContainer container; |
| |
| private boolean useProjectSettings= true; |
| |
| |
| protected ConfigurationBlock() { |
| this(null); |
| } |
| |
| protected ConfigurationBlock(final @Nullable String title) { |
| this.title= title; |
| } |
| |
| |
| public IWorkbenchPreferenceContainer getContainer() { |
| return this.container; |
| } |
| |
| public void createContents(final Composite pageComposite, final IWorkbenchPreferenceContainer container, |
| final IPreferenceStore preferenceStore) { |
| this.shell= pageComposite.getShell(); |
| this.container= container; |
| createBlockArea(pageComposite); |
| } |
| |
| protected abstract void createBlockArea(Composite pageComposite); |
| |
| public void dispose() { |
| } |
| |
| protected @Nullable String getTitle() { |
| return this.title; |
| } |
| |
| /** |
| * Returns the help context for the configuration block. |
| * <p> |
| * It is used by configuration block containers to set the help context automatically.</p> |
| * |
| * @return the help context id or <code>null</code>, if not available |
| */ |
| protected @Nullable String getHelpContext() { |
| return null; |
| } |
| |
| |
| public abstract boolean performOk(int flags); |
| |
| public abstract void performDefaults(); |
| |
| public void performCancel() { |
| } |
| |
| public void setUseProjectSpecificSettings(final boolean enable) { |
| this.useProjectSettings= enable; |
| } |
| |
| public boolean isUseProjectSpecificSettings() { |
| return this.useProjectSettings; |
| } |
| |
| protected Shell getShell() { |
| return this.shell; |
| } |
| |
| protected void addLinkHeader(final Composite pageComposite, final String text) { |
| final Link link= addLinkControl(pageComposite, text); |
| link.setLayoutData(applyWrapWidth(new GridData(SWT.FILL, SWT.FILL, false, false))); |
| LayoutUtils.addSmallFiller(pageComposite, false); |
| } |
| |
| protected Link addLinkControl(final Composite composite, final String text) { |
| return addLinkControl(composite, text, new LinkSelectionListener()); |
| } |
| |
| protected Link addLinkControl(final Composite composite, final String text, |
| final LinkSelectionListener listener) { |
| final Link link= new Link(composite, SWT.NONE); |
| link.setText(text); |
| link.addSelectionListener(listener); |
| return link; |
| } |
| |
| protected void scheduleChangeNotification(final Set<String> groupIds, final boolean directly) { |
| scheduleChangeNotification(this.container, groupIds.toArray(new String[groupIds.size()]), directly); |
| } |
| |
| protected void logSaveError(final BackingStoreException e) { |
| StatusManager.getManager().handle(new Status(IStatus.ERROR, |
| "org.osgi.service.prefs", 0, //$NON-NLS-1$ |
| "An error occurred when saving preferences to backing store.", e)); //$NON-NLS-1$ |
| } |
| |
| } |