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

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

import org.eclipse.swt.SWT;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Table;
import org.eclipse.swt.widgets.TableItem;
import org.eclipse.ui.forms.widgets.FormToolkit;

import ca.infodata.ofys.data.middle.dataobjects.XPatientHtmlPreference;
import ca.infodata.ofys.data.middle.dataobjects.interfaces.EditableDataObject;
import ca.infodata.ofys.data.middle.dataobjects.interfaces.OrderedDataObject;
import ca.infodata.ofys.data.middle.dataobjects.interfaces.StatusList;
import ca.infodata.ofys.ui.preferences.PreferencesMultiEditor;

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

	public PatientHtmlPreferenceControl(Composite parent, FormToolkit toolkit, PreferencesMultiEditor preferencesMultiEditor){
		super(parent, toolkit, preferencesMultiEditor);
	}

	public void fillTables(){
		tblNotSelected.removeAll();
		tblSelected.removeAll();
		List currentHtmlPart = getPreferenesContainer().getPatientHtmlPreferences().getNotDeleted();
		for(int i=0; i<XPatientHtmlPreference.SECTION_HTML_NAME.length; i++){
			boolean found = false;
			for(int j=0; j<currentHtmlPart.size(); j++){
				if(((XPatientHtmlPreference)currentHtmlPart.get(j)).getSection().intValue() == i){
					found = true; 
					break;
				}
			}
			if(!found){
				XPatientHtmlPreference preference = new XPatientHtmlPreference();
				preference.initialize();
				preference.setSection(new Integer(i));
				
				createTableItem(preference.toString(), preference, tblNotSelected);
			}
		}
		
		XPatientHtmlPreference preference = (XPatientHtmlPreference)getPreferenesContainer().getPatientHtmlPreferences().getFirstSortedItem();
		while(preference != null){
			createTableItem(preference.toString(), preference, tblSelected);
			preference = preference.getNextPatientHtmlPreference();
		}
	}
	
	private void createTableItem(String name, XPatientHtmlPreference preference, Table table){
		TableItem item = new TableItem(table, SWT.NONE);
		item.setText(name);
		item.setData(preference);
	}
	
	protected void addItem(){
		int selection = tblNotSelected.getSelectionIndex();
		if(selection > -1){
			OrderedDataObject field = (OrderedDataObject)tblNotSelected.getSelection()[0].getData();
			field.modifiedStatus = StatusList.STATUS_NEW;
			field.setNext(null);
			field.setId(null);
			if(tblSelected.getItemCount() > 0){
				field.setIsFirst(new Integer(0));
				
				OrderedDataObject previousItem = (OrderedDataObject)tblSelected.getItem(tblSelected.getItemCount() - 1).getData();
				previousItem.setNext(field);
				previousItem.setUpdatedOrder();
			}else{
				field.setIsFirst(new Integer(1));
			}
			
			getPreferenesContainer().getPatientHtmlPreferences().add(field);
			createTableItem(tblNotSelected.getSelection()[0].getText(), (XPatientHtmlPreference)field, tblSelected);
			tblNotSelected.remove(tblNotSelected.getSelectionIndex());
		}
	}
	
	protected void removeItem(){
		int selection = tblSelected.getSelectionIndex();
		if(selection > -1){
			if(selection > 0){
				OrderedDataObject field = (OrderedDataObject) tblSelected.getItem(selection - 1).getData();
				OrderedDataObject next = null;
				if(((OrderedDataObject) tblSelected.getItem(selection).getData()).getNext() != null){
					next = (OrderedDataObject) tblSelected.getItem(selection + 1).getData();
				}
				field.setNext(next);
				field.setUpdatedOrder();
			}else if(tblSelected.getItemCount() > 1){
				OrderedDataObject field = (OrderedDataObject) tblSelected.getItem(selection + 1).getData();
				field.setIsFirst(new Integer(1));
				field.setUpdatedOrder();
			}
			EditableDataObject toDelete = ((EditableDataObject)tblSelected.getItem(selection).getData());
			toDelete.setDeleted();
			
			createTableItem(tblSelected.getItem(selection).getText(), (XPatientHtmlPreference)((XPatientHtmlPreference)tblSelected.getItem(selection).getData()).clone(), tblNotSelected);
			
			tblSelected.remove(selection);
			
			
			int nbItem = tblSelected.getItemCount();
			if(nbItem > 0){
				if(nbItem > selection){
					tblSelected.select(selection);
				}else{
					tblSelected.select(selection - 1);
				}
			}
		}
	}
	
	protected void upField() {
		int selection = tblSelected.getSelectionIndex();
		if(selection > 0){
			ArrayList lstFields = new ArrayList();
	
			for(int i = 0; i < tblSelected.getItemCount(); i++){
				if(i == selection){
					OrderedDataObject field = (OrderedDataObject) tblSelected.getItem(i).getData();
					field.setNext((OrderedDataObject)(tblSelected.getItem(i - 1).getData()));
					lstFields.add(tblSelected.getItem(i - 1).getData());
					((EditableDataObject)tblSelected.getItem(i).getData()).setUpdatedOrder();
					if(i - 1 == 0){
						field.setIsFirst(new Integer(1));
					}
				}else if(i == selection - 1){
					OrderedDataObject field = (OrderedDataObject) tblSelected.getItem(i).getData();
					OrderedDataObject next = null;
					if(((OrderedDataObject) tblSelected.getItem(i + 1).getData()).getNext() != null){
						next = (OrderedDataObject) tblSelected.getItem(i + 2).getData();
					}
					field.setNext(next);
					lstFields.add(tblSelected.getItem(i + 1).getData());
					((EditableDataObject)tblSelected.getItem(i).getData()).setUpdatedOrder();
					if(i == 0){
						field.setIsFirst(new Integer(0));
					}
				}else{
					if(i == selection - 2){
						OrderedDataObject field = (OrderedDataObject) tblSelected.getItem(i).getData();
						field.setNext((OrderedDataObject)(tblSelected.getItem(i + 2).getData()));
						((EditableDataObject)tblSelected.getItem(i).getData()).setUpdatedOrder();
					}
					lstFields.add(tblSelected.getItem(i).getData());
				}
			}
	
			tblSelected.removeAll();
	
			for(int i = 0; i < lstFields.size(); i++){
				OrderedDataObject field = (OrderedDataObject) lstFields.get(i);
				TableItem item = new TableItem(tblSelected, SWT.NONE);
				item.setText(field.toString());
				item.setData(field);
			}
			tblSelected.select(selection - 1);
		}
	}

	/**
     * 
     * Apr 25, 2005
     * 
     * Descend un item ds la liste
     */
	protected void downField() {
		int selection = tblSelected.getSelectionIndex();
		if(selection > -1 && selection + 1 != tblSelected.getItemCount()){
			ArrayList lstFields = new ArrayList();
	
			for(int i = 0; i < tblSelected.getItemCount(); i++){
				if(i == selection){
					OrderedDataObject field = (OrderedDataObject) tblSelected.getItem(i).getData();
					OrderedDataObject next = null;
					if(((OrderedDataObject) tblSelected.getItem(i + 1).getData()).getNext() != null){
						next = (OrderedDataObject) tblSelected.getItem(i + 2).getData();
					}
					field.setNext(next);
					lstFields.add(tblSelected.getItem(i + 1).getData());
					((EditableDataObject)tblSelected.getItem(i).getData()).setUpdatedOrder();
					if(i == 0){
						field.setIsFirst(new Integer(0));
					}
				}else if(i == selection + 1){
					OrderedDataObject field = (OrderedDataObject) tblSelected.getItem(i).getData();
					field.setNext((OrderedDataObject)(tblSelected.getItem(i - 1).getData()));
					lstFields.add(tblSelected.getItem(i - 1).getData());
					((EditableDataObject)tblSelected.getItem(i).getData()).setUpdatedOrder();
					if(i - 1 == 0){
						field.setIsFirst(new Integer(1));
					}
				}else{
					if(i == selection - 1){
						OrderedDataObject field = (OrderedDataObject) tblSelected.getItem(i).getData();
						field.setNext((OrderedDataObject)(tblSelected.getItem(i + 2).getData()));
						((EditableDataObject)tblSelected.getItem(i).getData()).setUpdatedOrder();
					}
					lstFields.add(tblSelected.getItem(i).getData());
				}
			}
	
			tblSelected.removeAll();
	
			for(int i = 0; i < lstFields.size(); i++){
				OrderedDataObject field = (OrderedDataObject) lstFields.get(i);
				TableItem item = new TableItem(tblSelected, SWT.NONE);
				item.setText(field.toString());
				item.setData(field);
			}
			tblSelected.select(selection + 1);
		}
	}
}
