package net.sf.eclipsefp.haskell.ui.internal.preferences.scion;
import net.sf.eclipsefp.haskell.buildwrapper.BuildWrapperPlugin;
import net.sf.eclipsefp.haskell.ui.HaskellUIPlugin;
import net.sf.eclipsefp.haskell.ui.internal.preferences.IPreferenceConstants;
import net.sf.eclipsefp.haskell.ui.internal.util.UITexts;
import net.sf.eclipsefp.haskell.ui.util.SWTUtil;
import org.eclipse.jface.dialogs.IDialogSettings;
import org.eclipse.jface.preference.BooleanFieldEditor;
import org.eclipse.jface.preference.IPreferenceStore;
import org.eclipse.jface.preference.IntegerFieldEditor;
import org.eclipse.jface.preference.PreferencePage;
import org.eclipse.jface.util.IPropertyChangeListener;
import org.eclipse.jface.util.PropertyChangeEvent;
import org.eclipse.jface.viewers.ISelectionChangedListener;
import org.eclipse.jface.viewers.SelectionChangedEvent;
import org.eclipse.swt.SWT;
import org.eclipse.swt.custom.ScrolledComposite;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;
import org.eclipse.swt.widgets.Group;
import org.eclipse.ui.IWorkbench;
import org.eclipse.ui.IWorkbenchPreferencePage;
import org.eclipse.ui.forms.events.ExpansionAdapter;
import org.eclipse.ui.forms.events.ExpansionEvent;
import org.eclipse.ui.forms.widgets.ExpandableComposite;
/**
* The Scion preferences page in the Preferences dialog.
*
* @author Thomas ten Cate
* @author Alejandro Serrano (Browser integration)
*/
public class ScionPP
extends PreferencePage
implements IWorkbenchPreferencePage, IPreferenceConstants {
public static final String PAGE_ID = ScionPP.class.getName();
private AutodetectExecutableField buildWrapperExecutableField;
private AutodetectExecutableField browserExecutableField;
private BooleanFieldEditor browserUseHackage;
private AutodetectExecutableField hoogleExecutableField;
//private AutodetectExecutableField hlintExecutableField;
private BooleanFieldEditor verboseInteractionField;
private IntegerFieldEditor maxConfigureFailuresField;
private Composite maxConfigureFailuresFieldC;
private IntegerFieldEditor evalMaxField;
private Composite evalMaxFieldFieldC;
private BooleanFieldEditor verboseBrowserInteractionField;
private BooleanFieldEditor browserStartPerspectiveField;
private CabalImplsBlock cabalBlock;
private BooleanFieldEditor ignoreMissing;
private BooleanFieldEditor ignoreTooOld;
private IntegerFieldEditor consoleMaxField;
private BooleanFieldEditor consoleActivateField;
public ScionPP() {
super();
setPreferenceStore(HaskellUIPlugin.getDefault().getPreferenceStore());
}
/**
* Creates the field editors. Field editors are abstractions of
* the common GUI blocks needed to manipulate various types
* of preferences. Each field editor knows how to save and
* restore itself.
*/
@Override
protected Composite createContents( final Composite parentComposite ) {
final int nColumns = 3;
// FIXME: Need to add fields for console high and low water marks, hook preference changes to ScionManager
// Create the page:
noDefaultAndApplyButton();
IPreferenceStore prefStore = HaskellUIPlugin.getDefault().getPreferenceStore();
setPreferenceStore(prefStore);
parentComposite.setLayout( new GridLayout(nColumns,false) );
IPropertyChangeListener propertyListener=new IPropertyChangeListener() {
@Override
public void propertyChange( final PropertyChangeEvent arg0 ) {
updateButtonState();
setValid( isValid() );
}
};
SWTUtil.createMessageLabel( parentComposite, UITexts.scion_preferences_title, nColumns, SWT.DEFAULT );
SWTUtil.createLineSpacer( parentComposite, 1 );
cabalBlock = new CabalImplsBlock();
Control control = cabalBlock.createControl( parentComposite, this );
cabalBlock.addSelectionChangedListener( new ISelectionChangedListener() {
@Override
public void selectionChanged( final SelectionChangedEvent event ) {
setValid( isValid() );
}
} );
GridData gdata = new GridData( GridData.GRAB_HORIZONTAL | GridData.HORIZONTAL_ALIGN_FILL | GridData.VERTICAL_ALIGN_FILL);
gdata.horizontalSpan = nColumns;
control.setLayoutData( gdata );
// Restore dialog settings for the page, if set. Currently, only the Cabal implementations
// block actually stores its settings.
IDialogSettings dlgSettings = HaskellUIPlugin.getDefault().getDialogSettings();
cabalBlock.restoreColumnSettings( dlgSettings, PAGE_ID );
Group bwComposite = new Group(parentComposite, SWT.NONE);
bwComposite.setLayout( new GridLayout( 2, false ) );
GridData gridData = new GridData( GridData.GRAB_HORIZONTAL | GridData.HORIZONTAL_ALIGN_FILL);
gridData.horizontalSpan = nColumns;
bwComposite.setLayoutData( gridData );
bwComposite.setText( UITexts.buildwrapper_preferences_label );
buildWrapperExecutableField=new AutodetectExecutableField( this, bwComposite, "BuildWrapper", "buildwrapper", IPreferenceConstants.BUILDWRAPPER_EXECUTABLE,propertyListener );
maxConfigureFailuresFieldC = new Composite(bwComposite, SWT.NONE);
GridData gd = new GridData(GridData.HORIZONTAL_ALIGN_FILL | GridData.GRAB_HORIZONTAL | GridData.VERTICAL_ALIGN_CENTER);
gd.horizontalSpan=2;
maxConfigureFailuresFieldC.setLayoutData( gd);
maxConfigureFailuresField = new IntegerFieldEditor( IPreferenceConstants.MAX_CONFIGURE_FAILURES,
UITexts.maxConfigureFailures_title,
maxConfigureFailuresFieldC );
maxConfigureFailuresField.setValidRange( -1, Integer.MAX_VALUE );
maxConfigureFailuresField.setPage(this);
maxConfigureFailuresField.setPreferenceStore( prefStore );
maxConfigureFailuresField.load();
evalMaxFieldFieldC = new Composite(bwComposite, SWT.NONE);
gd = new GridData(GridData.HORIZONTAL_ALIGN_FILL | GridData.GRAB_HORIZONTAL | GridData.VERTICAL_ALIGN_CENTER);
gd.horizontalSpan=2;
evalMaxFieldFieldC.setLayoutData( gd);
evalMaxField= new IntegerFieldEditor( IPreferenceConstants.MAX_EVAL_TIME,
UITexts.maxEvalTime_title,
evalMaxFieldFieldC );
evalMaxField.setValidRange( 0, Integer.MAX_VALUE );
evalMaxField.setPage(this);
evalMaxField.setPreferenceStore( prefStore );
evalMaxField.load();
// scion-browser
Group sbComposite = new Group(parentComposite, SWT.NONE);
sbComposite.setLayout( new GridLayout( 2, false ) );
gridData = new GridData( GridData.GRAB_HORIZONTAL | GridData.HORIZONTAL_ALIGN_FILL);
gridData.horizontalSpan = nColumns;
sbComposite.setLayoutData( gridData );
sbComposite.setText( UITexts.scionBrowser_preferences_label );
browserExecutableField=new AutodetectExecutableField( this, sbComposite, "Browser", "scion-browser", IPreferenceConstants.SCION_BROWSER_SERVER_EXECUTABLE,propertyListener );
browserUseHackage = new BooleanFieldEditor( IPreferenceConstants.SCION_BROWSER_USE_HACKAGE, UITexts.scionBrowserUseHackage_label, sbComposite );
browserUseHackage.setPage( this );
browserUseHackage.setPreferenceStore( prefStore );
browserUseHackage.load();
hoogleExecutableField=new AutodetectExecutableField( this, sbComposite, "Hoogle", "hoogle", IPreferenceConstants.SCION_BROWSER_EXTRA_HOOGLE_PATH,propertyListener );
// Group hlintComposite = new Group(parentComposite, SWT.NONE);
// hlintComposite.setLayout( new GridLayout( 2, false ) );
// gridData = new GridData( GridData.GRAB_HORIZONTAL | GridData.HORIZONTAL_ALIGN_FILL);
// gridData.horizontalSpan = nColumns;
// hlintComposite.setLayoutData( gridData );
// hlintComposite.setText( UITexts.hlint_preferences_label );
// hlintExecutableField=new AutodetectExecutableField( this, hlintComposite, "HLint", "hlint", IPreferenceConstants.HLINT_EXECUTABLE,propertyListener );
ExpandableComposite advancedExpC=new ExpandableComposite( parentComposite, ExpandableComposite.TWISTIE | ExpandableComposite.CLIENT_INDENT );
advancedExpC.setText( UITexts.executables_preferences_advanced );
advancedExpC.setLayoutData( new GridData(GridData.HORIZONTAL_ALIGN_FILL | GridData.GRAB_HORIZONTAL | GridData.VERTICAL_ALIGN_CENTER) );
Composite advancedC=new Composite(advancedExpC,SWT.NONE);
advancedC.setLayout( new GridLayout(1,false) );
advancedExpC.setClient( advancedC );
advancedExpC.addExpansionListener(new ExpansionAdapter() {
@Override
public void expansionStateChanged(final ExpansionEvent e) {
parentComposite.layout( true );
((ScrolledComposite)parentComposite.getParent().getParent()).setMinHeight( parentComposite.getParent().computeSize( SWT.DEFAULT, SWT.DEFAULT ).y );
}
});
verboseInteractionField = new BooleanFieldEditor( IPreferenceConstants.VERBOSE_INTERACTION,
UITexts.scionVerboseInteraction_title,
advancedC );
verboseInteractionField.setPage(this);
verboseInteractionField.setPreferenceStore( prefStore );
verboseInteractionField.load();
verboseBrowserInteractionField = new BooleanFieldEditor( IPreferenceConstants.BROWSER_VERBOSE_INTERACTION,
UITexts.browserVerboseInteraction_title,
advancedC );
verboseBrowserInteractionField.setPage(this);
verboseBrowserInteractionField.setPreferenceStore( prefStore );
verboseBrowserInteractionField.load();
browserStartPerspectiveField= new BooleanFieldEditor( IPreferenceConstants.BROWSER_START_ONLY_PERSPECTIVE,
UITexts.executables_preferences_browser_perspective,
advancedC );
browserStartPerspectiveField.setPage(this);
browserStartPerspectiveField.setPreferenceStore( prefStore );
browserStartPerspectiveField.load();
ignoreMissing=new BooleanFieldEditor( IPreferenceConstants.IGNORE_MISSING_EXECUTABLE, UITexts.ignore_missing_button, advancedC );
ignoreMissing.setPage( this );
ignoreMissing.setPreferenceStore( prefStore );
ignoreMissing.load();
ignoreTooOld=new BooleanFieldEditor( IPreferenceConstants.IGNORE_TOOOLD_EXECUTABLE, UITexts.ignore_tooold_button, advancedC );
ignoreTooOld.setPage( this );
ignoreTooOld.setPreferenceStore( prefStore );
ignoreTooOld.load();
Composite consoleMaxFieldC=new Composite(advancedC,SWT.NONE);
consoleMaxFieldC.setLayoutData( new GridData(GridData.HORIZONTAL_ALIGN_FILL | GridData.GRAB_HORIZONTAL | GridData.VERTICAL_ALIGN_CENTER) );
consoleMaxField=new IntegerFieldEditor( IPreferenceConstants.HASKELL_CONSOLE_HIGH_WATER_MARK, UITexts.executables_preferences_console_high, consoleMaxFieldC );
consoleMaxField.setPage( this );
consoleMaxField.setPreferenceStore( prefStore );
consoleMaxField.load();
consoleActivateField=new BooleanFieldEditor( IPreferenceConstants.HASKELL_CONSOLE_ACTIVATE_ON_WRITE, UITexts.executables_preferences_console_activateonwrite, advancedC );
consoleActivateField.setPage( this );
consoleActivateField.setPreferenceStore( prefStore );
consoleActivateField.load();
// Update the dialog's state and validity:
updateButtonState();
setValid(isValid());
return parentComposite;
}
private void updateButtonState() {
buildWrapperExecutableField.setEnabled( true );
browserExecutableField.setEnabled( true );
hoogleExecutableField.setEnabled( true );
// hlintExecutableField.setEnabled( true );
}
public static void initializeDefaults(final IPreferenceStore store) {
store.setDefault( BUILDWRAPPER_EXECUTABLE, new String() );
store.setDefault( SCION_BROWSER_SERVER_EXECUTABLE, new String() );
store.setDefault( SCION_BROWSER_USE_HACKAGE, false );
store.setDefault( VERBOSE_INTERACTION, false );
store.setDefault( BROWSER_VERBOSE_INTERACTION, false );
store.setDefault( SCION_BROWSER_EXTRA_HOOGLE_PATH, "" );
store.setDefault( BROWSER_START_ONLY_PERSPECTIVE, true );
store.setDefault( MAX_CONFIGURE_FAILURES, 10 );
store.setDefault( MAX_EVAL_TIME, 30 );
store.setDefault( IPreferenceConstants.HASKELL_CONSOLE_HIGH_WATER_MARK, 32 * 1024);// 32K
store.setDefault( IPreferenceConstants.HASKELL_CONSOLE_ACTIVATE_ON_WRITE,false);
store.setDefault( UNIQUE_SANDBOX, false );
store.setDefault( UNIQUE_SANDBOX_PATH, BuildWrapperPlugin.getDefaultUniqueCabalSandboxLocation().toOSString() );
store.setDefault( MANAGE_DEPENDENCIES, true );
}
@Override
public boolean performOk() {
cabalBlock.updateCabalImplementations();
buildWrapperExecutableField.store();
browserExecutableField.store();
hoogleExecutableField.store();
browserUseHackage.store();
ignoreMissing.store();
ignoreTooOld.store();
verboseInteractionField.store();
maxConfigureFailuresField.store();
verboseBrowserInteractionField.store();
browserStartPerspectiveField.store();
consoleActivateField.store();
consoleMaxField.store();
// hlintExecutableField.store();
IDialogSettings settings = HaskellUIPlugin.getDefault().getDialogSettings();
cabalBlock.saveColumnSettings( settings, PAGE_ID );
return super.performOk();
}
@Override
public boolean isValid() {
boolean retval = cabalBlock.validate( this );
if (retval) {
//if (!serverBuiltInField.getBooleanValue()) {
if (!buildWrapperExecutableField.isValid()) {
retval = false;
setErrorMessage( UITexts.cabalImplsBlock_needBuildWrapperExecutablePath );
}
//}
}
/** do not force scion-browser to be present **/
// if (retval) {
// //if (!browserBuiltInField.getBooleanValue()) {
// if (!browserExecutableField.isValid()) {
// retval = false;
// setErrorMessage( UITexts.cabalImplsBlock_needBrowserExecutablePath );
// }
// //}
// }
if (retval) {
// Clear the message
setMessage( null );
setErrorMessage( null );
}
return retval;
}
@Override
public void dispose() {
// unused
}
@Override
public void init( final IWorkbench workbench ) {
// unused
}
}