/*=============================================================================#
 # Copyright (c) 2007, 2020 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.internal.r.ui.preferences;

import java.util.HashMap;
import java.util.Map;

import org.eclipse.core.databinding.UpdateValueStrategy;
import org.eclipse.jface.databinding.swt.typed.WidgetProperties;
import org.eclipse.jface.databinding.viewers.typed.ViewerProperties;
import org.eclipse.jface.viewers.ArrayContentProvider;
import org.eclipse.jface.viewers.ComboViewer;
import org.eclipse.swt.SWT;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Group;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.Link;
import org.eclipse.swt.widgets.Text;

import org.eclipse.statet.jcommons.lang.NonNullByDefault;
import org.eclipse.statet.jcommons.lang.Nullable;

import org.eclipse.statet.ecommons.databinding.core.validation.IntegerValidator;
import org.eclipse.statet.ecommons.databinding.jface.DataBindingSupport;
import org.eclipse.statet.ecommons.preferences.core.Preference;
import org.eclipse.statet.ecommons.preferences.ui.ConfigurationBlock;
import org.eclipse.statet.ecommons.preferences.ui.ConfigurationBlockPreferencePage;
import org.eclipse.statet.ecommons.preferences.ui.ManagedConfigurationBlock;
import org.eclipse.statet.ecommons.runtime.core.StatusChangeListener;
import org.eclipse.statet.ecommons.ui.util.LayoutUtils;

import org.eclipse.statet.internal.r.ui.RUIPreferenceInitializer;
import org.eclipse.statet.internal.r.ui.editors.DefaultRFoldingPreferences;
import org.eclipse.statet.ltk.ui.sourceediting.ISmartInsertSettings.TabAction;
import org.eclipse.statet.ltk.ui.sourceediting.SmartInsertSettingsUI;
import org.eclipse.statet.r.ui.editors.REditorBuild;
import org.eclipse.statet.r.ui.editors.REditorOptions;


/**
 * Preference page for 'R Editor Options'
 */
@NonNullByDefault
public class REditorPreferencePage extends ConfigurationBlockPreferencePage {
	
	
	public REditorPreferencePage() {
	}
	
	
	@Override
	protected ConfigurationBlock createConfigurationBlock() {
		return new REditorConfigurationBlock(createStatusChangedListener());
	}
	
}


@NonNullByDefault
class REditorConfigurationBlock extends ManagedConfigurationBlock {
	
	
	private Button smartInsertControl;
	private ComboViewer smartInsertTabActionControl;
	private Button[] smartInsertOnPasteControl;
	private Button[] smartInsertCloseCurlyBracketsControl;
	private Button[] smartInsertCloseRoundBracketsControl;
	private Button[] smartInsertCloseSquareBracketsControl;
	private Button[] smartInsertCloseSpecialControl;
	private Button[] smartInsertCloseStringsControl;
	
	private Button foldingEnableControl;
	private Button foldingRestoreStateControl;
	private Button foldingDefaultAllBlocksControl;
	private Text foldingDefaultMinLines;
	private Button foldingDefaultRoxygenControl;
	private Button foldingDefaultRoxygenInitiallyControl;
	private Text foldingDefaultRoxygenMinLines;
	
	private Button markOccurrencesControl;
	private Button problemsEnableControl;
	private Button spellEnableControl;
	
	
	public REditorConfigurationBlock(final @Nullable StatusChangeListener statusListener) {
		super(null, statusListener);
	}
	
	
	@Override
	protected void createBlockArea(final Composite pageComposite) {
		final Map<Preference<?>, @Nullable String> prefs= new HashMap<>();
		
		prefs.put(REditorOptions.SMARTINSERT_BYDEFAULT_ENABLED_PREF, REditorOptions.SMARTINSERT_GROUP_ID);
		prefs.put(REditorOptions.SMARTINSERT_TAB_ACTION_PREF, REditorOptions.SMARTINSERT_GROUP_ID);
		prefs.put(REditorOptions.SMARTINSERT_ONPASTE_ENABLED_PREF, REditorOptions.SMARTINSERT_GROUP_ID);
		prefs.put(REditorOptions.SMARTINSERT_CLOSECURLY_ENABLED_PREF, REditorOptions.SMARTINSERT_GROUP_ID);
		prefs.put(REditorOptions.SMARTINSERT_CLOSEROUND_ENABLED_PREF, REditorOptions.SMARTINSERT_GROUP_ID);
		prefs.put(REditorOptions.SMARTINSERT_CLOSESQUARE_ENABLED_PREF, REditorOptions.SMARTINSERT_GROUP_ID);
		prefs.put(REditorOptions.SMARTINSERT_CLOSESPECIAL_ENABLED_PREF, REditorOptions.SMARTINSERT_GROUP_ID);
		prefs.put(REditorOptions.SMARTINSERT_CLOSESTRINGS_ENABLED_PREF, REditorOptions.SMARTINSERT_GROUP_ID);
		
		prefs.put(RUIPreferenceInitializer.CONSOLE_SMARTINSERT_CLOSECURLY_ENABLED, REditorOptions.SMARTINSERT_GROUP_ID);
		prefs.put(RUIPreferenceInitializer.CONSOLE_SMARTINSERT_CLOSEROUND_ENABLED, REditorOptions.SMARTINSERT_GROUP_ID);
		prefs.put(RUIPreferenceInitializer.CONSOLE_SMARTINSERT_CLOSESQUARE_ENABLED, REditorOptions.SMARTINSERT_GROUP_ID);
		prefs.put(RUIPreferenceInitializer.CONSOLE_SMARTINSERT_CLOSESPECIAL_ENABLED, REditorOptions.SMARTINSERT_GROUP_ID);
		prefs.put(RUIPreferenceInitializer.CONSOLE_SMARTINSERT_CLOSESTRINGS_ENABLED, REditorOptions.SMARTINSERT_GROUP_ID);
		
		prefs.put(REditorOptions.FOLDING_ENABLED_PREF, null);
		prefs.put(REditorOptions.FOLDING_RESTORE_STATE_ENABLED_PREF, REditorOptions.FOLDING_SHARED_GROUP_ID);
		prefs.put(DefaultRFoldingPreferences.PREF_OTHERBLOCKS_ENABLED, DefaultRFoldingPreferences.GROUP_ID);
		prefs.put(DefaultRFoldingPreferences.PREF_MINLINES_NUM, DefaultRFoldingPreferences.GROUP_ID);
		prefs.put(DefaultRFoldingPreferences.PREF_ROXYGEN_ENABLED, DefaultRFoldingPreferences.GROUP_ID);
		prefs.put(DefaultRFoldingPreferences.PREF_ROXYGEN_COLLAPSE_INITIALLY_ENABLED, DefaultRFoldingPreferences.GROUP_ID);
		prefs.put(DefaultRFoldingPreferences.PREF_ROXYGEN_MINLINES_NUM, DefaultRFoldingPreferences.GROUP_ID);
		
		prefs.put(REditorOptions.PREF_MARKOCCURRENCES_ENABLED, null);
		
		prefs.put(REditorBuild.PROBLEMCHECKING_ENABLED_PREF, REditorBuild.GROUP_ID);
		
		prefs.put(REditorOptions.PREF_SPELLCHECKING_ENABLED, REditorOptions.GROUP_ID);
		
		setupPreferenceManager(prefs);
		
		// Controls
		{	final Composite composite= createSmartInsertOptions(pageComposite);
			composite.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, false));
		}
		
		// Code Folding
		LayoutUtils.addSmallFiller(pageComposite, false);
		
		{	this.foldingEnableControl= new Button(pageComposite, SWT.CHECK);
			this.foldingEnableControl.setText(Messages.REditorOptions_Folding_Enable_label);
			this.foldingEnableControl.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false));
		}
		{	this.foldingRestoreStateControl= new Button(pageComposite, SWT.CHECK);
			this.foldingRestoreStateControl.setText(Messages.REditorOptions_Folding_RestoreState_Enable_label);
			final GridData gd= new GridData(SWT.FILL, SWT.CENTER, true, false);
			gd.horizontalIndent= LayoutUtils.defaultIndent();
			this.foldingRestoreStateControl.setLayoutData(gd);
		}
		final Composite foldingOptions= new Composite(pageComposite, SWT.NONE);
		{	final GridData gd= new GridData(SWT.FILL, SWT.FILL, true, false);
			gd.horizontalIndent= LayoutUtils.defaultIndent();
			foldingOptions.setLayoutData(gd);
			foldingOptions.setLayout(LayoutUtils.newCompositeGrid(2));
		}
		
		{	this.foldingDefaultAllBlocksControl= new Button(foldingOptions, SWT.CHECK);
			this.foldingDefaultAllBlocksControl.setText(Messages.REditorOptions_Folding_EnableForAllBlocks_label);
			this.foldingDefaultAllBlocksControl.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false, 2, 1));
		}
		{	final Label label= new Label(foldingOptions, SWT.LEFT);
			final GridData gd= new GridData(SWT.FILL, SWT.CENTER, false, false);
			gd.horizontalIndent= LayoutUtils.defaultIndent();
			label.setLayoutData(gd);
			label.setText(Messages.REditorOptions_Folding_MinNumOfLines_label);
		}
		{	this.foldingDefaultMinLines= new Text(foldingOptions, SWT.SINGLE | SWT.BORDER);
			final GridData gd= new GridData(SWT.LEFT, SWT.CENTER, false, false);
			gd.widthHint= LayoutUtils.hintWidth(this.foldingDefaultMinLines, 2);
			this.foldingDefaultMinLines.setLayoutData(gd);
		}
		{	this.foldingDefaultRoxygenControl= new Button(foldingOptions, SWT.CHECK);
			this.foldingDefaultRoxygenControl.setText(Messages.REditorOptions_Folding_EnableForRoxygen_label);
			this.foldingDefaultRoxygenControl.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false, 2, 1));
		}
		{	final Label label= new Label(foldingOptions, SWT.LEFT);
			final GridData gd= new GridData(SWT.FILL, SWT.CENTER, false, false);
			gd.horizontalIndent= LayoutUtils.defaultIndent();
			label.setLayoutData(gd);
			label.setText(Messages.REditorOptions_Folding_MinNumOfLines_label);
		}
		{	this.foldingDefaultRoxygenMinLines= new Text(foldingOptions, SWT.SINGLE | SWT.BORDER);
			final GridData gd= new GridData(SWT.LEFT, SWT.CENTER, false, false);
			gd.widthHint= LayoutUtils.hintWidth(this.foldingDefaultRoxygenMinLines, 2);
			this.foldingDefaultRoxygenMinLines.setLayoutData(gd);
		}
		{	this.foldingDefaultRoxygenInitiallyControl= new Button(foldingOptions, SWT.CHECK);
			this.foldingDefaultRoxygenInitiallyControl.setText(Messages.REditorOptions_Folding_EnableForRoxygen_Initially_label);
			final GridData gd= new GridData(SWT.FILL, SWT.CENTER, true, false, 2, 1);
			gd.horizontalIndent= LayoutUtils.defaultIndent();
			this.foldingDefaultRoxygenInitiallyControl.setLayoutData(gd);
		}
		
		// Annotation
		LayoutUtils.addSmallFiller(pageComposite, false);
		
		{	this.markOccurrencesControl= new Button(pageComposite, SWT.CHECK);
			this.markOccurrencesControl.setText(Messages.REditorOptions_MarkOccurrences_Enable_label);
			this.markOccurrencesControl.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false));
			
			final Link link= addLinkControl(pageComposite, Messages.REditorOptions_MarkOccurrences_Appearance_info);
			final GridData gd= new GridData(SWT.FILL, SWT.FILL, true, false);
			gd.widthHint= 300;
			gd.horizontalIndent= LayoutUtils.defaultIndent();
			link.setLayoutData(gd);
		}
		
		LayoutUtils.addSmallFiller(pageComposite, false);
		
		{	this.problemsEnableControl= new Button(pageComposite, SWT.CHECK);
			this.problemsEnableControl.setText(Messages.REditorOptions_ProblemChecking_Enable_label);
			this.problemsEnableControl.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false));
		}
		
		LayoutUtils.addSmallFiller(pageComposite, false);
		
		{	this.spellEnableControl= new Button(pageComposite, SWT.CHECK);
			this.spellEnableControl.setText(Messages.REditorOptions_SpellChecking_Enable_label);
			this.spellEnableControl.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false));
			
			final Link link= addLinkControl(pageComposite, Messages.REditorOptions_SpellChecking_note);
			final GridData gd= new GridData(SWT.FILL, SWT.FILL, true, false);
			gd.widthHint= 300;
			gd.horizontalIndent= LayoutUtils.defaultIndent();
			link.setLayoutData(gd);
		}
		
		// Binding
		initBindings();
		updateControls();
	}
	
	private Composite createSmartInsertOptions(final Composite pageComposite) {
		final Group composite= new Group(pageComposite, SWT.NONE);
		composite.setText(Messages.REditorOptions_SmartInsert_label+':');
		final int n= 5;
		composite.setLayout(LayoutUtils.newGroupGrid(n));
		this.smartInsertControl= new Button(composite, SWT.CHECK);
		this.smartInsertControl.setText(Messages.REditorOptions_SmartInsert_AsDefault_label);
		this.smartInsertControl.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, false, n, 1));
		{	final Link link= addLinkControl(composite, Messages.REditorOptions_SmartInsert_description);
			final GridData gd= new GridData(SWT.FILL, SWT.FILL, true, false, n, 1);
			gd.widthHint= 300;
			link.setLayoutData(gd);
		}
		{	final Label label= new Label(composite, SWT.NONE);
			label.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, false, false));
			label.setText(Messages.REditorOptions_SmartInsert_TabAction_label);
			this.smartInsertTabActionControl= new ComboViewer(composite, SWT.DROP_DOWN | SWT.READ_ONLY);
			this.smartInsertTabActionControl.getControl().setLayoutData(new GridData(SWT.LEFT, SWT.CENTER, false, false, n-2, 1));
			this.smartInsertTabActionControl.setContentProvider(new ArrayContentProvider());
			this.smartInsertTabActionControl.setLabelProvider(new SmartInsertSettingsUI.SettingsLabelProvider());
			this.smartInsertTabActionControl.setInput(new TabAction[] {
					TabAction.INSERT_TAB_CHAR, TabAction.INSERT_INDENT_LEVEL,
			});
			LayoutUtils.addGDDummy(composite, true);
		}
		
		LayoutUtils.addGDDummy(composite);
		LayoutUtils.addGDDummy(composite);
		{	Label label= new Label(composite, SWT.CENTER);
			label.setText(Messages.REditorOptions_SmartInsert_ForEditor_header);
			label.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, false, false));
			label= new Label(composite, SWT.CENTER);
			label.setText(Messages.REditorOptions_SmartInsert_ForConsole_header);
			label.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, false, false));
		}
		LayoutUtils.addGDDummy(composite, true);
		this.smartInsertOnPasteControl= createSmartInsertOption(composite,
				Messages.REditorOptions_SmartInsert_OnPaste_label,
				null, false );
		this.smartInsertCloseCurlyBracketsControl= createSmartInsertOption(composite,
				Messages.REditorOptions_SmartInsert_CloseAuto_label,
				Messages.REditorOptions_SmartInsert_CloseCurly_label, true );
		this.smartInsertCloseRoundBracketsControl= createSmartInsertOption(composite, null,
				Messages.REditorOptions_SmartInsert_CloseRound_label, true );
		this.smartInsertCloseSquareBracketsControl= createSmartInsertOption(composite, null,
				Messages.REditorOptions_SmartInsert_CloseSquare_label, true );
		this.smartInsertCloseSpecialControl= createSmartInsertOption(composite, null,
				Messages.REditorOptions_SmartInsert_ClosePercent_label, true );
		this.smartInsertCloseStringsControl= createSmartInsertOption(composite, null,
				Messages.REditorOptions_SmartInsert_CloseString_label, true );
		
		return composite;
	}
	
	private Button[] createSmartInsertOption(final Composite composite,
			final @Nullable String text1, final @Nullable String text2, final boolean console) {
		GridData gd;
		if (text1 != null) {
			final Label label= new Label(composite, SWT.NONE);
			if (text2 == null) {
				label.setText(text1+':');
				gd= new GridData(SWT.FILL, SWT.CENTER, false, false, 2, 1);
			}
			else {
				label.setText(text1);
				gd= new GridData(SWT.FILL, SWT.CENTER, false, false, 1, 1);
			}
			label.setLayoutData(gd);
		}
		else {
			LayoutUtils.addGDDummy(composite);
		}
		if (text2 != null) {
			final Label label= new Label(composite, SWT.NONE);
			label.setText(text2 + "\u200A:"); //$NON-NLS-1$
			gd= new GridData(SWT.FILL, SWT.CENTER, false, false, 1, 1);
			label.setLayoutData(gd);
		}
		
		final Button button0= new Button(composite, SWT.CHECK);
		gd= new GridData(SWT.CENTER, SWT.CENTER, false, false);
		button0.setLayoutData(gd);
		
		final Button button1= new Button(composite, SWT.CHECK);
		gd= new GridData(SWT.CENTER, SWT.CENTER, false, false);
		button1.setLayoutData(gd);
		if (!console) {
			button1.setEnabled(false);
		}
		
		LayoutUtils.addGDDummy(composite, true);
		
		return new Button[] { button0, button1 };
	}
	
	@Override
	protected void addBindings(final DataBindingSupport db) {
		db.getContext().bindValue(
				WidgetProperties.buttonSelection()
						.observe(this.smartInsertControl),
				createObservable(REditorOptions.SMARTINSERT_BYDEFAULT_ENABLED_PREF) );
		db.getContext().bindValue(
				ViewerProperties.singleSelection(TabAction.class)
						.observe(this.smartInsertTabActionControl),
				createObservable(REditorOptions.SMARTINSERT_TAB_ACTION_PREF) );
		db.getContext().bindValue(
				WidgetProperties.buttonSelection()
						.observe(this.smartInsertOnPasteControl[0]),
				createObservable(REditorOptions.SMARTINSERT_ONPASTE_ENABLED_PREF) );
		db.getContext().bindValue(
				WidgetProperties.buttonSelection()
						.observe(this.smartInsertOnPasteControl[0]),
				createObservable(REditorOptions.SMARTINSERT_ONPASTE_ENABLED_PREF) );
		db.getContext().bindValue(
				WidgetProperties.buttonSelection()
						.observe(this.smartInsertCloseCurlyBracketsControl[0]),
				createObservable(REditorOptions.SMARTINSERT_CLOSECURLY_ENABLED_PREF) );
		db.getContext().bindValue(
				WidgetProperties.buttonSelection()
						.observe(this.smartInsertCloseRoundBracketsControl[0]),
				createObservable(REditorOptions.SMARTINSERT_CLOSEROUND_ENABLED_PREF) );
		db.getContext().bindValue(
				WidgetProperties.buttonSelection()
						.observe(this.smartInsertCloseSquareBracketsControl[0]),
				createObservable(REditorOptions.SMARTINSERT_CLOSESQUARE_ENABLED_PREF) );
		db.getContext().bindValue(
				WidgetProperties.buttonSelection()
						.observe(this.smartInsertCloseSpecialControl[0]),
				createObservable(REditorOptions.SMARTINSERT_CLOSESPECIAL_ENABLED_PREF) );
		db.getContext().bindValue(
				WidgetProperties.buttonSelection()
						.observe(this.smartInsertCloseStringsControl[0]),
				createObservable(REditorOptions.SMARTINSERT_CLOSESTRINGS_ENABLED_PREF) );
		
		db.getContext().bindValue(
				WidgetProperties.buttonSelection()
						.observe(this.smartInsertCloseCurlyBracketsControl[1]),
				createObservable(RUIPreferenceInitializer.CONSOLE_SMARTINSERT_CLOSECURLY_ENABLED) );
		db.getContext().bindValue(
				WidgetProperties.buttonSelection()
						.observe(this.smartInsertCloseRoundBracketsControl[1]),
				createObservable(RUIPreferenceInitializer.CONSOLE_SMARTINSERT_CLOSEROUND_ENABLED) );
		db.getContext().bindValue(
				WidgetProperties.buttonSelection()
						.observe(this.smartInsertCloseSquareBracketsControl[1]),
				createObservable(RUIPreferenceInitializer.CONSOLE_SMARTINSERT_CLOSESQUARE_ENABLED) );
		db.getContext().bindValue(
				WidgetProperties.buttonSelection()
						.observe(this.smartInsertCloseSpecialControl[1]),
				createObservable(RUIPreferenceInitializer.CONSOLE_SMARTINSERT_CLOSESPECIAL_ENABLED) );
		db.getContext().bindValue(
				WidgetProperties.buttonSelection()
						.observe(this.smartInsertCloseStringsControl[1]),
				createObservable(RUIPreferenceInitializer.CONSOLE_SMARTINSERT_CLOSESTRINGS_ENABLED) );
		
		db.getContext().bindValue(
				WidgetProperties.buttonSelection()
						.observe(this.foldingEnableControl),
				createObservable(REditorOptions.FOLDING_ENABLED_PREF) );
		db.getContext().bindValue(
				WidgetProperties.buttonSelection()
						.observe(this.foldingRestoreStateControl),
				createObservable(REditorOptions.FOLDING_RESTORE_STATE_ENABLED_PREF) );
		db.getContext().bindValue(
				WidgetProperties.buttonSelection()
						.observe(this.foldingDefaultAllBlocksControl),
				createObservable(DefaultRFoldingPreferences.PREF_OTHERBLOCKS_ENABLED) );
		db.getContext().bindValue(
				WidgetProperties.text(SWT.Modify)
						.observe(this.foldingDefaultMinLines),
				createObservable(DefaultRFoldingPreferences.PREF_MINLINES_NUM),
				new UpdateValueStrategy<String, Integer>()
						.setAfterGetValidator(new IntegerValidator(2, 1000,
								Messages.REditorOptions_Folding_MinNumOfLines_error_message )),
				null );
		db.getContext().bindValue(
				WidgetProperties.buttonSelection()
						.observe(this.foldingDefaultRoxygenControl),
				createObservable(DefaultRFoldingPreferences.PREF_ROXYGEN_ENABLED) );
		db.getContext().bindValue(
				WidgetProperties.buttonSelection()
						.observe(this.foldingDefaultRoxygenInitiallyControl),
				createObservable(DefaultRFoldingPreferences.PREF_ROXYGEN_COLLAPSE_INITIALLY_ENABLED) );
		db.getContext().bindValue(
				WidgetProperties.text(SWT.Modify)
						.observe(this.foldingDefaultRoxygenMinLines),
				createObservable(DefaultRFoldingPreferences.PREF_ROXYGEN_MINLINES_NUM),
				new UpdateValueStrategy<String, Integer>()
						.setAfterGetValidator(new IntegerValidator(2, 1000,
								Messages.REditorOptions_Folding_MinNumOfLines_error_message )),
				null );
		
		db.getContext().bindValue(
				WidgetProperties.buttonSelection()
						.observe(this.markOccurrencesControl),
				createObservable(REditorOptions.PREF_MARKOCCURRENCES_ENABLED) );
		
		db.getContext().bindValue(
				WidgetProperties.buttonSelection()
						.observe(this.problemsEnableControl),
				createObservable(REditorBuild.PROBLEMCHECKING_ENABLED_PREF) );
		
		db.getContext().bindValue(
				WidgetProperties.buttonSelection()
						.observe(this.spellEnableControl),
				createObservable(REditorOptions.PREF_SPELLCHECKING_ENABLED) );
	}
	
}
