package org.eclipse.jst.j2ee.internal.ui.preferences;

import java.util.ArrayList;
import java.util.List;

import org.eclipse.core.runtime.Preferences;
import org.eclipse.jface.dialogs.IDialogConstants;
import org.eclipse.jface.preference.PreferencePage;
import org.eclipse.jst.j2ee.internal.plugin.J2EEPlugin;
import org.eclipse.jst.j2ee.internal.plugin.J2EEUIMessages;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
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.Group;
import org.eclipse.ui.IWorkbench;
import org.eclipse.ui.IWorkbenchPreferencePage;


public class JavaEEPreferencePage extends PreferencePage implements
		IWorkbenchPreferencePage {

	private Preferences preferences;
	private String name = J2EEPlugin.DYNAMIC_TRANSLATION_OF_JET_TEMPLATES_PREF_KEY;
	private Button showReferences;
	private boolean dynamicTranslation;
	private ArrayList<IJavaEEPreferencePageExtender> extenders = new ArrayList();

	public JavaEEPreferencePage() {
		setDescription(J2EEUIMessages.getResourceString(J2EEUIMessages.JAVA_EE_PREFERENCE_PAGE_NAME));
	}

	@Override
	protected void performDefaults() {
		preferences.setToDefault(name);
		J2EEPlugin.getDefault().savePluginPreferences();
		dynamicTranslation = preferences.getBoolean(name);
		showReferences.setSelection(dynamicTranslation);
		for(IJavaEEPreferencePageExtender extender : extenders ){
			 extender.performDefaults();
		}

		super.performDefaults();
	}

	@Override
	protected Control createContents(Composite parent) {
		Composite result= new Composite(parent, SWT.NONE);
		GridLayout layout= new GridLayout();
		layout.marginHeight= convertVerticalDLUsToPixels(IDialogConstants.VERTICAL_MARGIN);
		layout.marginWidth= 0;
		layout.verticalSpacing= convertVerticalDLUsToPixels(10);
		layout.horizontalSpacing= convertHorizontalDLUsToPixels(IDialogConstants.HORIZONTAL_SPACING);
		result.setLayout(layout);
		Group buttonComposite= new Group(result, SWT.NONE);
		buttonComposite.setLayout(new GridLayout());		
		buttonComposite.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
        buttonComposite.setText(J2EEUIMessages.getResourceString(J2EEUIMessages.JAVA_EE_PREFERENCE_PAGE_JET_TEMPLATE));

		showReferences = new Button(buttonComposite, SWT.CHECK);
		showReferences.setText(J2EEUIMessages.getResourceString(J2EEUIMessages.JAVA_EE_PREFERENCE_PAGE_DYN_TRANSLATION_BTN_NAME)); 
		showReferences.setSelection(dynamicTranslation);
		showReferences.addSelectionListener(new SelectionAdapter() {
			@Override
			public void widgetSelected(SelectionEvent e) {
				dynamicTranslation = showReferences.getSelection();
			}
		});
		invokeExtensions(result);

		return result;
	}

	public void init(IWorkbench workbench) {
		preferences = J2EEPlugin.getDefault().getPluginPreferences();
		dynamicTranslation = preferences.getBoolean(name);
	}

	@Override
	public boolean performOk() {
		preferences.setValue(name, showReferences.getSelection());
		J2EEPlugin.getDefault().savePluginPreferences();
		boolean result = false;
		for(IJavaEEPreferencePageExtender extender : extenders ){
			result = extender.performOk();
		}
		result = super.performOk();
		return result;
	}
	
	
	protected void invokeExtensions(Composite parent){
		List<JavaEEPreferencePageExtension> list = JavaEEPreferencePageExtensionReader.getInstance().getJavaEEPageExtenders();
		for(JavaEEPreferencePageExtension pageExtension : list ){
			IJavaEEPreferencePageExtender extender = pageExtension.getInstance();
			extenders.add(extender);
			extender.extendPage(parent);
		}
	}
	
	 @Override
	public void dispose(){
			for(IJavaEEPreferencePageExtender extender : extenders ){
				extender.dispose();
			}
	 }
}