/*******************************************************************************
 * Copyright (c) 2004, 2006 Sybase, Inc. and others.
 *
 * All rights reserved. This program and the accompanying materials
 * are made available under the terms of the Eclipse Public License v1.0
 * which accompanies this distribution, and is available at
 * http://www.eclipse.org/legal/epl-v10.html
 *
 * Contributors:
 *     Sybase, Inc. - initial API and implementation
 *******************************************************************************/

package org.eclipse.jst.jsf.facesconfig.ui.section;

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

import org.eclipse.emf.common.notify.Notification;
import org.eclipse.emf.common.notify.impl.AdapterImpl;
import org.eclipse.emf.ecore.EObject;
import org.eclipse.emf.ecore.util.EcoreUtil;
import org.eclipse.jface.viewers.ColumnWeightData;
import org.eclipse.jface.viewers.ILabelProviderListener;
import org.eclipse.jface.viewers.IStructuredContentProvider;
import org.eclipse.jface.viewers.ITableLabelProvider;
import org.eclipse.jface.viewers.TableLayout;
import org.eclipse.jface.viewers.TableViewer;
import org.eclipse.jface.viewers.Viewer;
import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigType;
import org.eclipse.jst.jsf.facesconfig.emf.NavigationCaseType;
import org.eclipse.jst.jsf.facesconfig.emf.NavigationRuleType;
import org.eclipse.jst.jsf.facesconfig.ui.EditorMessages;
import org.eclipse.jst.jsf.facesconfig.ui.page.IFacesConfigPage;
import org.eclipse.jst.jsf.facesconfig.ui.pageflow.PageflowEditor;
import org.eclipse.swt.SWT;
import org.eclipse.swt.graphics.Image;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Table;
import org.eclipse.swt.widgets.TableColumn;
import org.eclipse.ui.forms.IManagedForm;
import org.eclipse.ui.forms.widgets.FormToolkit;

/**
 * @author sfshi
 * 
 */
public class OverviewNavigationSection extends AbstractOverviewSection {

	private static final int COLUMN_WITH = 70;

	private OverviewNavigationSectionAdapter overviewNavigationSectionAdapter;

	/**
	 * 
	 * @param parent
	 * @param managedForm
	 * @param page
	 * @param toolkit
	 */
	public OverviewNavigationSection(Composite parent,
			IManagedForm managedForm, IFacesConfigPage page, FormToolkit toolkit) {
		super(parent, managedForm, page, toolkit, PageflowEditor.PAGE_ID,
				EditorMessages.OverviewPage_NavigationSection_name,
				EditorMessages.OverviewPage_NavigationSection_description,
				null, null);
	}

	/*
	 * (non-Javadoc)
	 * 
	 * @see org.eclipse.jst.jsf.facesconfig.ui.section.AbstractOverviewSection#configTableViewer(org.eclipse.jface.viewers.TableViewer)
	 */
	protected void configTableViewer(TableViewer tableViewer1) {
		tableViewer1.setContentProvider(new IStructuredContentProvider() {

			public Object[] getElements(Object inputElement) {
				List navigationCaseList = (List) inputElement;
				return navigationCaseList.toArray();
			}

			public void dispose() {
			    // nothing to dispose
			}

			public void inputChanged(Viewer viewer, Object oldInput,
					Object newInput) {
			    // do nothing
			}
		});

		tableViewer1.setLabelProvider(new ITableLabelProvider() {

			public Image getColumnImage(Object element, int columnIndex) {
				return null;
			}

			public String getColumnText(Object element, int columnIndex) {
				NavigationCaseType navigationCase = (NavigationCaseType) element;
				switch (columnIndex) {

				case 0:
					return ((NavigationRuleType) navigationCase.eContainer())
							.getFromViewId() == null ? ""
							: ((NavigationRuleType) navigationCase.eContainer())
									.getFromViewId().getTextContent();

				case 1:
					return navigationCase.getFromOutcome() == null ? ""
							: navigationCase.getFromOutcome().getTextContent();

				case 2:
					return navigationCase.getToViewId() == null ? ""
							: navigationCase.getToViewId().getTextContent();
				}
				return null;
			}

			public void addListener(ILabelProviderListener listener) {
			    // no listeners?
			}

			public void dispose() {
			    // do nothing
			}

			public boolean isLabelProperty(Object element, String property) {
				return false;
			}

			public void removeListener(ILabelProviderListener listener) {
			    // no listeners?
			}
		});
	}

	/*
	 * (non-Javadoc)
	 * 
	 * @see org.eclipse.jst.jsf.facesconfig.ui.section.AbstractOverviewSection#createTable(org.eclipse.swt.widgets.Composite)
	 */
	protected Table createTable(Composite container) {
		Table table = new Table(container, SWT.H_SCROLL | SWT.V_SCROLL
				| SWT.FULL_SELECTION | SWT.BORDER | SWT.BORDER);

		GridData gd = new GridData(GridData.FILL_BOTH);
		gd.horizontalSpan = 1;
		gd.heightHint = 100;
		table.setLayoutData(gd);

		table.setLinesVisible(true);
		table.setHeaderVisible(true);
		TableLayout tablelayout = new TableLayout();
		table.setLayout(tablelayout);

		TableColumn column1 = new TableColumn(table, SWT.LEFT);
		column1
				.setText(EditorMessages.OverviewPage_NavigationSection_table_col1);
		// column1.setWidth(COLUMN_WITH);
		tablelayout.addColumnData(new ColumnWeightData(1, COLUMN_WITH, true));
		// tablelayout.addColumnData(new ColumnWeightData(1, true));
		column1.setResizable(true);

		TableColumn column2 = new TableColumn(table, SWT.LEFT);
		column2
				.setText(EditorMessages.OverviewPage_NavigationSection_table_col2);
		tablelayout.addColumnData(new ColumnWeightData(1, COLUMN_WITH, true));
		// tablelayout.addColumnData(new ColumnWeightData(1, true));
		column2.setResizable(true);
		// column2.setWidth(COLUMN_WITH);

		TableColumn column3 = new TableColumn(table, SWT.LEFT);
		column3
				.setText(EditorMessages.OverviewPage_NavigationSection_table_col3);
		tablelayout.addColumnData(new ColumnWeightData(1, COLUMN_WITH, true));
		// tablelayout.addColumnData(new ColumnWeightData(1, true));
		column3.setResizable(true);
		// column3.setWidth(COLUMN_WITH);

		return table;
	}

	/*
	 * (non-Javadoc)
	 * 
	 * @see org.eclipse.jst.jsf.facesconfig.ui.section.IFacesConfigSection#refreshAll()
	 */
	public void refreshAll() {
		List navigationCaseList = new ArrayList();
		if (getInput() instanceof FacesConfigType) {
			List navigationRules = ((FacesConfigType) getInput())
					.getNavigationRule();
			for (int i = 0, n = navigationRules.size(); i < n; i++) {
				NavigationRuleType navigationRule = (NavigationRuleType) navigationRules
						.get(i);
				navigationCaseList.addAll(navigationRule.getNavigationCase());
			}
		}

		tableViewer.setInput(navigationCaseList);
	}

	/*
	 * (non-Javadoc)
	 * 
	 * @see org.eclipse.jst.jsf.facesconfig.ui.section.AbstractFacesConfigSection#addAdaptersOntoInput(java.lang.Object)
	 */
	protected void addAdaptersOntoInput(Object newInput) {
		FacesConfigType facesConfig = (FacesConfigType) newInput;
		addOverviewNavigationSectionAdapter(facesConfig);

		for (Iterator it = facesConfig.getNavigationRule().iterator(); it
				.hasNext();) {
			NavigationRuleType navigationRule = (NavigationRuleType) it.next();

			addOverviewNavigationSectionAdapter(navigationRule);

			if (navigationRule.getFromViewId() != null) {
				addOverviewNavigationSectionAdapter(navigationRule
						.getFromViewId());
			}

			for (Iterator it2 = navigationRule.getNavigationCase().iterator(); it2
					.hasNext();) {
				NavigationCaseType navigationCase = (NavigationCaseType) it2
						.next();
				addOverviewNavigationSectionAdapter(navigationCase);

				if (navigationCase.getFromOutcome() != null) {
					addOverviewNavigationSectionAdapter(navigationCase
							.getFromOutcome());
				}

				if (navigationCase.getToViewId() != null) {
					addOverviewNavigationSectionAdapter(navigationCase
							.getToViewId());
				}
			}
		}

	}

	/*
	 * (non-Javadoc)
	 * 
	 * @see org.eclipse.jst.jsf.facesconfig.ui.section.AbstractFacesConfigSection#removeAdaptersFromInput(java.lang.Object)
	 */
	protected void removeAdaptersFromInput(Object oldInput) {
		super.removeAdaptersFromInput(oldInput);

		FacesConfigType facesConfig = (FacesConfigType) oldInput;
		removeOverviewNavigationSectionAdapter(facesConfig);

		for (Iterator it = facesConfig.getNavigationRule().iterator(); it
				.hasNext();) {
			NavigationRuleType navigationRule = (NavigationRuleType) it.next();

			removeOverviewNavigationSectionAdapter(navigationRule);

			if (navigationRule.getFromViewId() != null) {
				removeOverviewNavigationSectionAdapter(navigationRule
						.getFromViewId());
			}

			for (Iterator it2 = navigationRule.getNavigationCase().iterator(); it2
					.hasNext();) {
				NavigationCaseType navigationCase = (NavigationCaseType) it2
						.next();
				removeOverviewNavigationSectionAdapter(navigationCase);

				if (navigationCase.getFromOutcome() != null) {
					removeOverviewNavigationSectionAdapter(navigationCase
							.getFromOutcome());
				}

				if (navigationCase.getToViewId() != null) {
					removeOverviewNavigationSectionAdapter(navigationCase
							.getToViewId());
				}
			}
		}

	}

	protected void addOverviewNavigationSectionAdapter(EObject object) {
		if (EcoreUtil.getExistingAdapter(object,
				OverviewNavigationSection.class) == null) {
			object.eAdapters().add(getOverviewNavigationSectionAdapter());
		}

	}

	protected void removeOverviewNavigationSectionAdapter(EObject object) {
		if (EcoreUtil.getExistingAdapter(object,
				OverviewNavigationSection.class) != null) {
			object.eAdapters().remove(getOverviewNavigationSectionAdapter());
		}
	}

	protected OverviewNavigationSectionAdapter getOverviewNavigationSectionAdapter() {
		if (overviewNavigationSectionAdapter == null)
			overviewNavigationSectionAdapter = new OverviewNavigationSectionAdapter();
		return overviewNavigationSectionAdapter;
	}

	class OverviewNavigationSectionAdapter extends AdapterImpl {

		public boolean isAdapterForType(Object type) {
			if (type == OverviewNavigationSection.class)
				return true;
			return false;
		}

		public void notifyChanged(Notification msg) {

			if ((msg.getFeature() == FacesConfigPackage.eINSTANCE
					.getFacesConfigType_NavigationRule()
					|| msg.getFeature() == FacesConfigPackage.eINSTANCE
							.getNavigationRuleType_NavigationCase()
					|| msg.getFeature() == FacesConfigPackage.eINSTANCE
							.getNavigationRuleType_FromViewId() || msg
					.getFeature() == FacesConfigPackage.eINSTANCE
					.getFromViewIdType_TextContent())) {
				if (msg.getEventType() == Notification.ADD
						|| msg.getEventType() == Notification.SET) {
					if (msg.getNewValue() instanceof EObject) {
						EObject newObject = (EObject) msg.getNewValue();
						addOverviewNavigationSectionAdapter(newObject);
					}
				}
				if (msg.getEventType() == Notification.ADD
						|| msg.getEventType() == Notification.REMOVE
						|| msg.getEventType() == Notification.SET)
					refreshAll();
				return;
			}

			if (msg.getFeature() == FacesConfigPackage.eINSTANCE
					.getNavigationCaseType_FromOutcome()
					|| msg.getFeature() == FacesConfigPackage.eINSTANCE
							.getNavigationCaseType_ToViewId()) {

				if (msg.getEventType() == Notification.ADD
						|| msg.getEventType() == Notification.SET) {
					if (msg.getNewValue() instanceof EObject) {
						EObject newObject = (EObject) msg.getNewValue();
						addOverviewNavigationSectionAdapter(newObject);
					}
				}
				if (msg.getEventType() == Notification.ADD

				|| msg.getEventType() == Notification.REMOVE
						|| msg.getEventType() == Notification.SET) {

					NavigationCaseType navigationCase = (NavigationCaseType) msg
							.getNotifier();
					tableViewer.refresh(navigationCase);
				}
				return;
			}

			if (msg.getFeature() == FacesConfigPackage.eINSTANCE
					.getFromOutcomeType_TextContent()
					|| msg.getFeature() == FacesConfigPackage.eINSTANCE
							.getToViewIdType_TextContent()) {

				if (msg.getEventType() == Notification.ADD
						|| msg.getEventType() == Notification.REMOVE
						|| msg.getEventType() == Notification.SET) {
					NavigationCaseType navigationCase = (NavigationCaseType) ((EObject) msg
							.getNotifier()).eContainer();
					tableViewer.refresh(navigationCase);
				}
				return;
			}

		}
	}
}
