package com.quantum.preferences;


import com.quantum.Messages;
import com.quantum.QuantumPlugin;
import com.quantum.editors.ColorManager;
import com.quantum.editors.SQLColorConstants;
import com.quantum.util.versioning.VersioningHelper;

import org.eclipse.jface.preference.ColorFieldEditor;
import org.eclipse.jface.preference.IPreferenceStore;
import org.eclipse.jface.preference.PreferenceConverter;
import org.eclipse.jface.preference.PreferencePage;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.events.SelectionListener;
import org.eclipse.swt.graphics.FontData;
import org.eclipse.swt.graphics.RGB;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;
import org.eclipse.swt.widgets.FontDialog;
import org.eclipse.swt.widgets.Label;
import org.eclipse.ui.IWorkbench;
import org.eclipse.ui.IWorkbenchPreferencePage;

public class SQLEditorPreferences extends PreferencePage
	implements IWorkbenchPreferencePage {
	FontDialog fontDialog;
	ColorFieldEditor backgroundColorEditor;
	
	ColorFieldEditor textColorEditor;
	boolean textFlag;
	ColorFieldEditor keywordColorEditor;
	boolean keywordFlag;
	ColorFieldEditor stringColorEditor;
	boolean stringFlag;
	ColorFieldEditor numericColorEditor;
	boolean numericFlag;
	ColorFieldEditor commentColorEditor;
	boolean commentFlag;
	
	Button boldText;
	Button boldKeyword;
	Button boldString;
	Button boldNumeric;
	Button boldComment;
	
	IWorkbench workbench;
	FontData fontData;
	Label fontDisplay;
	public void init(IWorkbench workbench) {
		//Initialize the preference store
		this.workbench = workbench;
		setPreferenceStore(QuantumPlugin.getDefault().getPreferenceStore());
		initializeColorDefaults(getPreferenceStore());
	}

	private void initializeColorDefaults(IPreferenceStore store) {
		RGB BACKGROUND = new RGB(255, 255, 255);
		RGB COMMENT = new RGB(88, 148, 64);
		RGB KEYWORD = new RGB(126, 0, 75);
		RGB STRING = new RGB(0, 0, 255);
		RGB NUMERIC = new RGB(255, 0, 0);
		RGB DEFAULT = new RGB(0, 0, 0);
		PreferenceConverter.setDefault(store,
			"quantum.background.color", BACKGROUND); //$NON-NLS-1$
		PreferenceConverter.setDefault(store,
			"quantum.text.color", DEFAULT); //$NON-NLS-1$
		PreferenceConverter.setDefault(store,
			"quantum.keyword.color", KEYWORD); //$NON-NLS-1$
		PreferenceConverter.setDefault(store,
			"quantum.comment.color", COMMENT); //$NON-NLS-1$
		PreferenceConverter.setDefault(store,
			"quantum.string.color", STRING); //$NON-NLS-1$
		PreferenceConverter.setDefault(store,
			"quantum.numeric.color", NUMERIC); //$NON-NLS-1$
	}

	protected void performDefaults() {
		fontData = null;
		updateFontDisplay();
		textFlag = false;
		keywordFlag = true;
		stringFlag = false;
		numericFlag = false;
		commentFlag = false;
		updateFlags();
		backgroundColorEditor.loadDefault();
		textColorEditor.loadDefault();
		keywordColorEditor.loadDefault();
		stringColorEditor.loadDefault();
		commentColorEditor.loadDefault();
		numericColorEditor.loadDefault();
	}
	/** 
	 * Save the preferences to the preference store.
	 */
	public boolean performOk() {
		PreferenceConverter.setValue(getPreferenceStore(), "quantum.font", fontData); //$NON-NLS-1$
		getPreferenceStore().setValue("quantum.text.bold", textFlag); //$NON-NLS-1$
		getPreferenceStore().setValue("quantum.keyword.bold", keywordFlag); //$NON-NLS-1$
		getPreferenceStore().setValue("quantum.string.bold", stringFlag); //$NON-NLS-1$
		getPreferenceStore().setValue("quantum.comment.bold", commentFlag); //$NON-NLS-1$
		getPreferenceStore().setValue("quantum.numeric.bold", numericFlag); //$NON-NLS-1$
		backgroundColorEditor.store();
		textColorEditor.store();
		keywordColorEditor.store();
		stringColorEditor.store();
		commentColorEditor.store();
		numericColorEditor.store();
		return super.performOk();
	}
	protected Control createContents(Composite parent) {
		Composite main = new Composite(parent, SWT.NULL);
		
		GridLayout innerLayout = new GridLayout();
		innerLayout.numColumns = 4;
		main.setLayout(innerLayout);

		fontData = PreferenceConverter.getFontData(getPreferenceStore(), "quantum.font"); //$NON-NLS-1$
		textFlag = getPreferenceStore().getBoolean("quantum.text.bold"); //$NON-NLS-1$
		keywordFlag = getPreferenceStore().getBoolean("quantum.keyword.bold"); //$NON-NLS-1$
		stringFlag = getPreferenceStore().getBoolean("quantum.string.bold"); //$NON-NLS-1$
		commentFlag = getPreferenceStore().getBoolean("quantum.comment.bold"); //$NON-NLS-1$
		numericFlag = getPreferenceStore().getBoolean("quantum.numeric.bold"); //$NON-NLS-1$
		
		fontDialog = new FontDialog(workbench.getActiveWorkbenchWindow().getShell());
		Button fontButton = new Button(main, SWT.PUSH);
		fontButton.setText(Messages.getString("PreferencesPage.PickFont")); //$NON-NLS-1$
		fontButton.addSelectionListener(new SelectionListener() {
			public void widgetDefaultSelected(SelectionEvent e) {
			}
			public void widgetSelected(SelectionEvent e) {
				if (fontData != null) {
                    VersioningHelper.setFont(fontDialog, new FontData[] { fontData} );
				}
				FontData data = fontDialog.open();
				if (data != null) {
					fontData = data;
					updateFontDisplay();
				}
			}
		});
		Button defaultButton = new Button(main, SWT.PUSH);
		defaultButton.setText(Messages.getString("PreferencesPage.DefaultFont")); //$NON-NLS-1$
		defaultButton.addSelectionListener(new SelectionListener() {
			public void widgetDefaultSelected(SelectionEvent e) {
			}
			public void widgetSelected(SelectionEvent e) {
				fontData = null;
				updateFontDisplay();
			}
		});

		fontDisplay = new Label(main, SWT.NULL);
		GridData data = new GridData(GridData.FILL_HORIZONTAL);
		data.grabExcessHorizontalSpace = true;
		fontDisplay.setLayoutData(data);
		updateFontDisplay();

		ColorManager manager = new ColorManager();

		Composite comp = new Composite(main, SWT.NULL);
		GridData layoutData = new GridData();
		layoutData.horizontalSpan = 2;
		comp.setLayoutData(layoutData);
		
		manager.getColor(SQLColorConstants.DEFAULT);
		backgroundColorEditor =
			new ColorFieldEditor(
				"quantum.background.color", //$NON-NLS-1$
				Messages.getString("PreferencesPage.BackgroundColor"), //$NON-NLS-1$
				comp);				

		Composite temp = new Composite(main, SWT.NULL);
		temp.setSize(0, 0);
		
		comp = new Composite(main, SWT.NULL);
		layoutData = new GridData();
		layoutData.horizontalSpan = 2;
		comp.setLayoutData(layoutData);
		
		textColorEditor =
			new ColorFieldEditor(
				"quantum.text.color", //$NON-NLS-1$
				Messages.getString("PreferencesPage.DefaultTextColor"), //$NON-NLS-1$
				comp);				

		boldText = new Button(main, SWT.CHECK);
		boldText.setSelection(textFlag);
		boldText.setText(Messages.getString("PreferencesPage.Bold")); //$NON-NLS-1$
		boldText.addSelectionListener(new SelectionListener() {
			public void widgetDefaultSelected(SelectionEvent e) {
			}
			public void widgetSelected(SelectionEvent e) {
				textFlag = boldText.getSelection();
			}
		});

		comp = new Composite(main, SWT.NULL);
		layoutData = new GridData();
		layoutData.horizontalSpan = 2;
		comp.setLayoutData(layoutData);

		keywordColorEditor =
			new ColorFieldEditor(
				Messages.getString("PreferencesPage.quantum.keyword.color_26"), //$NON-NLS-1$
				Messages.getString("PreferencesPage.KeywordTextColor"), //$NON-NLS-1$
				comp);

		boldKeyword = new Button(main, SWT.CHECK);
		boldKeyword.setSelection(keywordFlag);
		boldKeyword.setText(Messages.getString("PreferencesPage.Bold")); //$NON-NLS-1$
		boldKeyword.addSelectionListener(new SelectionListener() {
			public void widgetDefaultSelected(SelectionEvent e) {
			}
			public void widgetSelected(SelectionEvent e) {
				keywordFlag = boldKeyword.getSelection();
			}
		});

		comp = new Composite(main, SWT.NULL);
		layoutData = new GridData();
		layoutData.horizontalSpan = 2;
		comp.setLayoutData(layoutData);

		commentColorEditor =
			new ColorFieldEditor(
				"quantum.comment.color", //$NON-NLS-1$
				Messages.getString("PreferencesPage.CommentTextColor"), //$NON-NLS-1$
				comp);

		boldComment = new Button(main, SWT.CHECK);
		boldComment.setSelection(commentFlag);
		boldComment.setText(Messages.getString("PreferencesPage.Bold")); //$NON-NLS-1$
		boldComment.addSelectionListener(new SelectionListener() {
			public void widgetDefaultSelected(SelectionEvent e) {
			}
			public void widgetSelected(SelectionEvent e) {
				commentFlag = boldComment.getSelection();
			}
		});

		comp = new Composite(main, SWT.NULL);
		layoutData = new GridData();
		layoutData.horizontalSpan = 2;
		comp.setLayoutData(layoutData);

		stringColorEditor =
			new ColorFieldEditor(
				"quantum.string.color", //$NON-NLS-1$
				Messages.getString("PreferencesPage.StringTextColor"), //$NON-NLS-1$
				comp);

		boldString = new Button(main, SWT.CHECK);
		boldString.setSelection(stringFlag);
		boldString.setText(Messages.getString("PreferencesPage.Bold")); //$NON-NLS-1$
		boldString.addSelectionListener(new SelectionListener() {
			public void widgetDefaultSelected(SelectionEvent e) {
			}
			public void widgetSelected(SelectionEvent e) {
				stringFlag = boldString.getSelection();
			}
		});

		comp = new Composite(main, SWT.NULL);
		layoutData = new GridData();
		layoutData.horizontalSpan = 2;
		comp.setLayoutData(layoutData);

		numericColorEditor =
			new ColorFieldEditor(
				"quantum.numeric.color", //$NON-NLS-1$
				Messages.getString("PreferencesPage.NumericTextColor"), //$NON-NLS-1$
				comp);

		boldNumeric = new Button(main, SWT.CHECK);
		boldNumeric.setSelection(numericFlag);
		boldNumeric.setText(Messages.getString("PreferencesPage.Bold")); //$NON-NLS-1$
		boldNumeric.addSelectionListener(new SelectionListener() {
			public void widgetDefaultSelected(SelectionEvent e) {
			}
			public void widgetSelected(SelectionEvent e) {
				numericFlag = boldNumeric.getSelection();
			}
		});

		backgroundColorEditor.setPreferencePage(this);
		backgroundColorEditor.setPreferenceStore(getPreferenceStore());
		backgroundColorEditor.load();
		
		textColorEditor.setPreferencePage(this);
		textColorEditor.setPreferenceStore(getPreferenceStore());
		textColorEditor.load();
		
		keywordColorEditor.setPreferencePage(this);
		keywordColorEditor.setPreferenceStore(getPreferenceStore());
		keywordColorEditor.load();
		
		commentColorEditor.setPreferencePage(this);
		commentColorEditor.setPreferenceStore(getPreferenceStore());
		commentColorEditor.load();
		
		stringColorEditor.setPreferencePage(this);
		stringColorEditor.setPreferenceStore(getPreferenceStore());
		stringColorEditor.load();

		numericColorEditor.setPreferencePage(this);
		numericColorEditor.setPreferenceStore(getPreferenceStore());
		numericColorEditor.load();

		return main;
	}
	public void updateFontDisplay() {
		if (fontData == null) {
			fontDisplay.setText(Messages.getString("PreferencesPage.Font_Default")); //$NON-NLS-1$
		} else {
			String style = Messages.getString("PreferencesPage.regular"); //$NON-NLS-1$
			if (fontData.getStyle() == SWT.BOLD) {
				style = Messages.getString("PreferencesPage.bold"); //$NON-NLS-1$
			} else if (fontData.getStyle() == SWT.ITALIC) {
				style = Messages.getString("PreferencesPage.italic"); //$NON-NLS-1$
			} else if (fontData.getStyle() == (SWT.BOLD | SWT.ITALIC)) {
				style = Messages.getString("PreferencesPage.boldItalic"); //$NON-NLS-1$
			}
			fontDisplay.setText(Messages.getString("PreferencesPage.FontPrompt") + fontData.getName() + '-' + style + '-' + fontData.getHeight()); //$NON-NLS-1$
		}
	}
	public void updateFlags() {
		boldText.setSelection(textFlag);
		boldKeyword.setSelection(keywordFlag);
		boldString.setSelection(stringFlag);
		boldNumeric.setSelection(numericFlag);
		boldComment.setSelection(commentFlag);
	}
}