// Copyright (c) 2003-2005 by Leif Frenzel - see http://leiffrenzel.de package net.sf.eclipsefp.haskell.ghccompiler.ui.preferences; import net.sf.eclipsefp.common.ui.preferences.Tab; import net.sf.eclipsefp.common.ui.preferences.overlay.OverlayPreferenceStore; import net.sf.eclipsefp.haskell.ghccompiler.GhcCompilerPlugin; import net.sf.eclipsefp.haskell.ghccompiler.core.GhcParameter; import net.sf.eclipsefp.haskell.ghccompiler.core.GhcParameterType; import net.sf.eclipsefp.haskell.ghccompiler.core.preferences.IGhcPreferenceNames; import net.sf.eclipsefp.haskell.ghccompiler.ui.internal.util.UITexts; import org.eclipse.core.runtime.preferences.InstanceScope; import org.eclipse.jface.dialogs.Dialog; import org.eclipse.jface.preference.IPreferenceStore; import org.eclipse.jface.preference.PreferencePage; import org.eclipse.swt.SWT; 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.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; import org.eclipse.ui.forms.widgets.SharedScrolledComposite; import org.osgi.service.prefs.BackingStoreException; /** <p>The preference page for the GHC compiler preferences.</p> * * @author Leif Frenzel */ public class GhcPreferencePage extends PreferencePage implements IWorkbenchPreferencePage, IGhcPreferenceNames { private OverlayPreferenceStore overlayStore; // interface methods of PreferencePage ////////////////////////////////////// @Override protected Control createContents( final Composite parent ) { /*TabFolder folder = new TabFolder( parent, SWT.NONE ); Tab generalTab = new GeneralTab( overlayStore ); String sGeneral = ScionText.ghcPreferencePage_general; createTab( folder, sGeneral, generalTab.createControl( folder ) ); Tab languageTab = new LanguageTab( overlayStore ); Control languageControl = languageTab.createControl( folder ); String sLang = ScionText.ghcPreferencePage_language; createTab( folder, sLang, languageControl ); Tab optimizationTab = new OptimizationTab( overlayStore ); Control optimizationControl = optimizationTab.createControl( folder ); String sOpt = ScionText.ghcPreferencePage_optimization; createTab( folder, sOpt, optimizationControl ); Tab moreOptimizationTab = new MoreOptimizationTab( overlayStore ); Control moreOptControl = moreOptimizationTab.createControl( folder ); String sMoreOpt = ScionText.ghcPreferencePage_moreOptimization; createTab( folder, sMoreOpt, moreOptControl ); Dialog.applyDialogFont( folder ); return folder;*/ Composite mainComp= new Composite(parent, SWT.NONE); mainComp.setFont(parent.getFont()); GridLayout layout= new GridLayout(1,true); layout.marginHeight= 0; layout.marginWidth= 0; mainComp.setLayout(layout); final SharedScrolledComposite sc1 = new SharedScrolledComposite(mainComp,SWT.V_SCROLL | SWT.H_SCROLL){ // no impl required }; GridData gd=new GridData(SWT.FILL,SWT.FILL,true,true); sc1.setLayoutData(gd); final Composite me=new Composite(sc1,SWT.NONE); sc1.setExpandHorizontal(true); sc1.setExpandVertical(true); sc1.setContent( me ); GridLayout gl=new GridLayout(1,true); me.setLayout( gl ); String sGeneral = UITexts.ghcPreferencePage_general; createExpand( me, sGeneral, new GeneralTab( overlayStore ) ); String sLang = UITexts.ghcPreferencePage_language; createExpand( me, sLang, new LanguageTab( overlayStore )); String sOpt = UITexts.ghcPreferencePage_optimization; createExpand( me, sOpt, new OptimizationTab( overlayStore )); String sMoreOpt = UITexts.ghcPreferencePage_moreOptimization; createExpand( me, sMoreOpt, new MoreOptimizationTab( overlayStore )); Dialog.applyDialogFont( me ); return mainComp; } @Override public void dispose() { if( overlayStore != null ) { overlayStore.stopListening(); overlayStore = null; } super.dispose(); } @Override public boolean performOk() { overlayStore.propagate(); try { new InstanceScope().getNode(GhcCompilerPlugin.getPluginId()).flush(); } catch( BackingStoreException ex ) { GhcCompilerPlugin.log( ex ); } return true; } @Override protected void performDefaults() { overlayStore.loadDefaults(); super.performDefaults(); } // interface methods of IWorkbenchPreferencePage //////////////////////////////////////////////// @Override public void init( final IWorkbench workbench ) { setDescription( UITexts.ghcPreferencePage_desc ); setPreferenceStore( GhcCompilerPlugin.getDefault().getPreferenceStore() ); overlayStore = createOverlayStore(); overlayStore.load(); overlayStore.startListening(); } // helping methods ////////////////// private void createExpand( final Composite folder, final String label, final Tab tab ) { /* TabItem tab = new TabItem( folder, SWT.NONE ); tab.setText( label ); tab.setControl( control ); */ ExpandableComposite ec=new ExpandableComposite( folder, ExpandableComposite.TWISTIE | ExpandableComposite.CLIENT_INDENT); ec.setText( label ); Control languageControl = tab.createControl( ec ); ec.setClient( languageControl ); ec.addExpansionListener(new ExpansionAdapter() { @Override public void expansionStateChanged(final ExpansionEvent e) { ((SharedScrolledComposite)folder.getParent()).reflow( true ); } }); } private OverlayPreferenceStore createOverlayStore() { IPreferenceStore prefStore = getPreferenceStore(); OverlayPreferenceStore store = new OverlayPreferenceStore( prefStore ); addGeneralPreferences( store ); /*addLanguagePrefs( store ); addOptimizationPrefs( store ); addMoreOptimizationPrefs( store ); */ store.addIntKey( OPTIMIZATION_LEVEL ); for (GhcParameter p:GhcParameter.values()){ if (GhcParameterType.LANGUAGE.equals( p.getType() ) ||GhcParameterType.OPTIMIZATION_SPECIFIC.equals( p.getType() )){ store.addBooleanKey( p.getName() ); } } return store; } private void addGeneralPreferences( final OverlayPreferenceStore store ) { store.addStringKey( EXTRA_OPTIONS ); store.addBooleanKey( USE_EXTRA_OPTIONS ); // store.addBooleanKey( GHCI_USES_GHC_OPTIONS ); } /* private void addLanguagePrefs( final OverlayPreferenceStore store ) { // boolean preferences use the parameter as key store.addBooleanKey( LANG_GLASGOW_EXTS ); store.addBooleanKey( LANG_FI ); store.addBooleanKey( LANG_FFI ); store.addBooleanKey( LANG_WITH ); store.addBooleanKey( LANG_NO_MONOMORPHISM_RESTRICTION ); store.addBooleanKey( LANG_ALLOW_OVERLAPPING_INSTANCES ); store.addBooleanKey( LANG_ALLOW_UNDECIDABLE_INSTANCES ); store.addBooleanKey( LANG_ALLOW_INCOHERENT_INSTANCES ); store.addBooleanKey( LANG_GENERICS ); store.addBooleanKey( LANG_NO_IMPLICIT_PRELUDE ); } private void addOptimizationPrefs( final OverlayPreferenceStore store ) { store.addIntKey( OPTIMIZATION_LEVEL ); // boolean preferences use the parameter as key store.addBooleanKey( OPT_EXCESS_PRECISION ); store.addBooleanKey( OPT_IGNORE_ASSERTS ); store.addBooleanKey( OPT_NO_STRICTNESS ); store.addBooleanKey( OPT_NO_CPR ); store.addBooleanKey( OPT_UNBOX_STRICT_FIELDS ); } private void addMoreOptimizationPrefs( final OverlayPreferenceStore store ) { // boolean preferences use the parameter as key store.addBooleanKey( OPT_CASE_MERGE ); store.addBooleanKey( OPT_DICTS_STRICT ); store.addBooleanKey( OPT_DO_ETA_REDUCTION ); store.addBooleanKey( OPT_DO_LAMBDA_ETA_EXPANSION ); store.addBooleanKey( OPT_FOLDR_BUILD_ON ); store.addBooleanKey( OPT_IGNORE_INTERFACE_PRAGMAS ); store.addBooleanKey( OPT_LET_NO_ESCAPE ); store.addBooleanKey( OPT_OMIT_INTERFACE_PRAGMAS ); store.addBooleanKey( OPT_NO_CSE ); store.addBooleanKey( OPT_NO_PRE_INLINING ); store.addBooleanKey( OPT_NUMBERS_STRICT ); store.addBooleanKey( OPT_USAGESP ); }*/ }