/*
 * Created on Jul 6, 2005
 * Created by david
 */
package ca.infodata.ofys.ui.preferences.user;

import org.eclipse.swt.SWT;
import org.eclipse.swt.layout.FillLayout;
import org.eclipse.swt.layout.FormAttachment;
import org.eclipse.swt.layout.FormData;
import org.eclipse.swt.layout.FormLayout;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Table;
import org.eclipse.ui.forms.widgets.FormToolkit;
import org.eclipse.ui.forms.widgets.Section;

import ca.infodata.ofys.data.middle.dataobjects.Messages;
import ca.infodata.ofys.data.middle.dataobjects.XPreferencesContainer;
import ca.infodata.ofys.ui.controls.EditorModifyListener;
import ca.infodata.ofys.ui.controls.form.FormButton;
import ca.infodata.ofys.ui.controls.form.FormLabel;
import ca.infodata.ofys.ui.preferences.PreferencesMultiEditor;

/**
 * @author david
 * Window - Preferences - Java - Code Generation - Code and Comments
 */
public abstract class BasePatientHtmlPreferenceControl extends Composite {

	protected Table tblNotSelected;
	protected Table tblSelected;
	protected FormButton btnAdd, btnRemove;
	protected FormButton btnUp, btnDown;
	
	private PreferencesMultiEditor preferencesMultiEditor;
	private FormToolkit toolkit;

	public BasePatientHtmlPreferenceControl(Composite parent, FormToolkit toolkit, PreferencesMultiEditor preferencesMultiEditor){
		super(parent, SWT.NONE);
		this.preferencesMultiEditor = preferencesMultiEditor;
		this.toolkit = toolkit;
		createEditionControl(this);
	}

	public void createEditionControl(Composite parent){
		parent.setLayout(new FillLayout());

		///////////////////////////////////////////////////
		/////       Dclaration des controles         /////
		///////////////////////////////////////////////////
		
		Section section = toolkit.createSection(parent, SWT.NONE);
		section.setText(Messages.getString("AFFICHAGE_DU_SOMMAIRE_CLIENT")); //$NON-NLS-1$
		toolkit.createCompositeSeparator(section);
		Composite sectionComposite = toolkit.createComposite(section);
		section.setClient(sectionComposite);
		
		FormLayout layout = new FormLayout();
		layout.marginBottom = 5;
		layout.marginHeight = 5;
		layout.spacing = 5;
		sectionComposite.setLayout(layout);

		FormLabel lblNotSelected = new FormLabel(sectionComposite, Messages.getString("NON_AFFICHE"), SWT.NONE, toolkit); //$NON-NLS-1$
		tblNotSelected = toolkit.createTable(sectionComposite, SWT.BORDER | SWT.V_SCROLL);
		
		btnAdd = new FormButton(sectionComposite, Messages.getString("AJOUTER_>"), SWT.PUSH, toolkit); //$NON-NLS-1$
		btnRemove = new FormButton(sectionComposite, Messages.getString("<_RETIRER"), SWT.PUSH, toolkit); //$NON-NLS-1$
		
		FormLabel lblSelected = new FormLabel(sectionComposite, Messages.getString("AFFICHE"), SWT.NONE, toolkit); //$NON-NLS-1$
		tblSelected = toolkit.createTable(sectionComposite, SWT.BORDER | SWT.V_SCROLL);
		
		btnUp = new FormButton(sectionComposite, Messages.getString("HAUT"), SWT.PUSH, toolkit); //$NON-NLS-1$
		btnDown = new FormButton(sectionComposite, Messages.getString("BAS"), SWT.PUSH, toolkit); //$NON-NLS-1$
		
		///////////////////////////////////////////////////
		/////       Dclaration des Listeners         /////
		///////////////////////////////////////////////////
		
		tblNotSelected.addMouseListener(new EditorModifyListener(getParentEditor()){
			public void edited() {
				addItem();
			}
		});
		
		tblSelected.addMouseListener(new EditorModifyListener(getParentEditor()){
			public void edited() {
				removeItem();
			}
		});
		
		btnAdd.addSelectionListener(new EditorModifyListener(getParentEditor()){
			public void edited() {
				addItem();
			}
		});
		
		btnRemove.addSelectionListener(new EditorModifyListener(getParentEditor()){
			public void edited() {
				removeItem();
			}
		});
		
		btnUp.addSelectionListener(new EditorModifyListener(getParentEditor()){
			public void edited() {
				upField();
			}
		});
		
		btnDown.addSelectionListener(new EditorModifyListener(getParentEditor()){
			public void edited() {
				downField();
			}
		});
		
		///////////////////////////////////////////////////
		/////       		Positionnement         	  /////
		///////////////////////////////////////////////////
		
		FormData data;
		
		data = new FormData();
		data.top = new FormAttachment(0);
		data.left = new FormAttachment(0);
		lblNotSelected.setLayoutData(data);
		
		data = new FormData();
		data.top = new FormAttachment(lblNotSelected);
		data.left = new FormAttachment(0);
		data.right = new FormAttachment(40);
		data.height = 115;
		tblNotSelected.setLayoutData(data);
		
		data = new FormData();
		data.top = new FormAttachment(lblNotSelected);
		data.left = new FormAttachment(tblNotSelected);
		data.right = new FormAttachment(50);
		btnAdd.setLayoutData(data);
		
		data = new FormData();
		data.top = new FormAttachment(btnAdd);
		data.left = new FormAttachment(tblNotSelected);
		data.right = new FormAttachment(50);
		btnRemove.setLayoutData(data);
		
		data = new FormData();
		data.top = new FormAttachment(0);
		data.left = new FormAttachment(btnAdd);
		lblSelected.setLayoutData(data);
		
		data = new FormData();
		data.top = new FormAttachment(lblSelected);
		data.left = new FormAttachment(btnAdd);
		data.right = new FormAttachment(90);
		data.height = 115;
		tblSelected.setLayoutData(data);
		
		data = new FormData();
		data.top = new FormAttachment(lblSelected);
		data.left = new FormAttachment(tblSelected);
		data.right = new FormAttachment(100);
		btnUp.setLayoutData(data);
		
		data = new FormData();
		data.top = new FormAttachment(btnAdd);
		data.left = new FormAttachment(tblSelected);
		data.right = new FormAttachment(100);
		btnDown.setLayoutData(data);

		toolkit.adapt(this);
	}
	
	protected XPreferencesContainer getPreferenesContainer(){
		return preferencesMultiEditor.getPreferencesContainer();
	}

	protected PreferencesMultiEditor getParentEditor(){
		return preferencesMultiEditor;
	}
	
	protected abstract void upField();
	protected abstract void downField();
	protected abstract void addItem();
	protected abstract void removeItem();
}
