blob: 349869fdeb9cff889118066b5fba3db7896e2e0c [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2008 Chase Technology Ltd - http://www.chasetechnology.co.uk
* 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:
* Doug Satchwell (Chase Technology Ltd) - initial API and implementation
*******************************************************************************/
package org.eclipse.wst.xsl.ui.internal.preferences;
import java.util.ArrayList;
import java.util.List;
import org.eclipse.core.runtime.Preferences;
import org.eclipse.jface.dialogs.IDialogSettings;
import org.eclipse.jface.resource.JFaceResources;
import org.eclipse.swt.SWT;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Combo;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;
import org.eclipse.swt.widgets.Label;
import org.eclipse.ui.forms.events.ExpansionAdapter;
import org.eclipse.ui.forms.events.ExpansionEvent;
import org.eclipse.ui.forms.widgets.ExpandableComposite;
import org.eclipse.wst.sse.ui.internal.preferences.ui.AbstractPreferencePage;
import org.eclipse.wst.sse.ui.internal.preferences.ui.ScrolledPageContent;
import org.eclipse.wst.xsl.core.internal.XSLCorePlugin;
import org.eclipse.wst.xsl.ui.internal.XSLUIPlugin;
/**
* Augments the SSE <code>AbstractPreferencePage</code> with support for expandable composites (twisties) and combos.
*
* @author Doug Satchwell
* @see org.eclipse.wst.sse.ui.internal.preferences.ui.AbstractPreferencePage
*/
public abstract class AbstractXSLPreferencePage extends AbstractPreferencePage
{
private final String SETTINGS_EXPANDED = getClass().getCanonicalName()+".SETTINGS_EXPANDED"; //$NON-NLS-1$
private final String SETTINGS_SECTION_NAME = getClass().getCanonicalName()+".SETTINGS_SECTION_NAME";//$NON-NLS-1$
private List<ExpandableComposite> fExpandables = new ArrayList<ExpandableComposite>();
@Override
protected final Control createContents(Composite parent)
{
createCommonContents(parent);
loadPreferences();
restoreSectionExpansionStates(getDialogSettings().getSection(SETTINGS_SECTION_NAME));
return parent;
}
/**
* Called by createContents and must be implemented.
*
* @param parent
* @return the composite
*/
protected abstract Composite createCommonContents(Composite parent);
protected Composite createTwistie(Composite parent, String label, int cols)
{
ExpandableComposite excomposite = new ExpandableComposite(parent, SWT.NONE, ExpandableComposite.TWISTIE | ExpandableComposite.CLIENT_INDENT);
excomposite.setText(label);
excomposite.setExpanded(false);
excomposite.setFont(JFaceResources.getFontRegistry().getBold(JFaceResources.DIALOG_FONT));
excomposite.setLayoutData(new GridData(GridData.FILL, GridData.FILL, true, false, cols, 1));
excomposite.addExpansionListener(new ExpansionAdapter()
{
public void expansionStateChanged(ExpansionEvent e)
{
expandedStateChanged((ExpandableComposite) e.getSource());
}
});
fExpandables.add(excomposite);
makeScrollableCompositeAware(excomposite);
Composite twistieCient = new Composite(excomposite, SWT.NONE);
excomposite.setClient(twistieCient);
GridLayout layout = new GridLayout(2, false);
layout.marginRight = 5;
twistieCient.setLayout(layout);
GridData gd = new GridData(SWT.FILL, SWT.NONE, true, false);
twistieCient.setLayoutData(gd);
return twistieCient;
}
private final void expandedStateChanged(ExpandableComposite expandable)
{
ScrolledPageContent parentScrolledComposite = getParentScrolledComposite(expandable);
if (parentScrolledComposite != null)
{
parentScrolledComposite.reflow(true);
}
}
private void makeScrollableCompositeAware(Control control)
{
ScrolledPageContent parentScrolledComposite = getParentScrolledComposite(control);
if (parentScrolledComposite != null)
{
parentScrolledComposite.adaptChild(control);
}
}
private ScrolledPageContent getParentScrolledComposite(Control control)
{
Control parent = control.getParent();
while (!(parent instanceof ScrolledPageContent) && parent != null)
{
parent = parent.getParent();
}
if (parent instanceof ScrolledPageContent)
{
return (ScrolledPageContent) parent;
}
return null;
}
protected Combo createCombo(Composite parent, String label, String prefKey)
{
GridData gd = new GridData(GridData.FILL, GridData.CENTER, true, false, 1, 1);
Label labelControl = new Label(parent, SWT.LEFT);
labelControl.setFont(JFaceResources.getDialogFont());
labelControl.setText(label);
labelControl.setLayoutData(gd);
Combo combo = createDropDownBox(parent);
combo.addSelectionListener(this);
combo.setLayoutData(new GridData(GridData.HORIZONTAL_ALIGN_FILL));
return combo;
}
private void storeSectionExpansionStates(IDialogSettings section)
{
for (int i = 0; i < fExpandables.size(); i++)
{
ExpandableComposite comp = (ExpandableComposite) fExpandables.get(i);
section.put(SETTINGS_EXPANDED + String.valueOf(i), comp.isExpanded());
}
}
private IDialogSettings getDialogSettings()
{
return XSLUIPlugin.getDefault().getDialogSettings();
}
/**
* Saves the expansion states before calling super.
*
* @see org.eclipse.jface.dialogs.DialogPage#dispose()
*/
@Override
public void dispose()
{
storeSectionExpansionStates(getDialogSettings().addNewSection(SETTINGS_SECTION_NAME));
super.dispose();
}
private void restoreSectionExpansionStates(IDialogSettings settings)
{
for (int i = 0; i < fExpandables.size(); i++)
{
ExpandableComposite excomposite = (ExpandableComposite) fExpandables.get(i);
if (settings == null)
{
excomposite.setExpanded(i == 0); // only expand the first node by default
}
else
{
excomposite.setExpanded(settings.getBoolean(SETTINGS_EXPANDED + String.valueOf(i)));
}
}
}
@Override
protected Preferences getModelPreferences()
{
return XSLCorePlugin.getDefault().getPluginPreferences();
}
/**
* Save the preferences.
*
* @see org.eclipse.wst.sse.ui.internal.preferences.ui.AbstractPreferencePage#performOk()
*/
@Override
public boolean performOk()
{
boolean ok = super.performOk();
if (ok)
XSLCorePlugin.getDefault().savePluginPreferences();
return ok;
}
}