/*
 * Copyright (c) 2010 Nokia Corporation and/or its subsidiary(-ies).
 * All rights reserved.
 * This component and the accompanying materials are made available
 * under the terms of the License "Eclipse Public License v1.0"
 * which accompanies this distribution, and is available
 * at the URL "http://www.eclipse.org/legal/epl-v10.html".
 *
 * Initial Contributors:
 * Nokia Corporation - initial contribution.
 *
 * Contributors:
 *
 * Description: 
 *
 */
package com.nokia.carbide.internal.discovery.ui.wizard;

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

import org.eclipse.jface.dialogs.Dialog;
import org.eclipse.jface.layout.GridDataFactory;
import org.eclipse.jface.layout.GridLayoutFactory;
import org.eclipse.jface.resource.ImageDescriptor;
import org.eclipse.jface.viewers.ArrayContentProvider;
import org.eclipse.jface.viewers.CheckStateChangedEvent;
import org.eclipse.jface.viewers.CheckboxTableViewer;
import org.eclipse.jface.viewers.ColumnLabelProvider;
import org.eclipse.jface.viewers.ICheckStateListener;
import org.eclipse.jface.viewers.TableViewerColumn;
import org.eclipse.jface.viewers.ViewerSorter;
import org.eclipse.jface.wizard.WizardPage;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.ModifyEvent;
import org.eclipse.swt.events.ModifyListener;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.graphics.Image;
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.Label;
import org.eclipse.swt.widgets.TableColumn;
import org.eclipse.swt.widgets.Text;

import com.nokia.carbide.discovery.ui.Activator;
import com.nokia.carbide.discovery.ui.Messages;
import com.nokia.carbide.internal.discovery.ui.p2.FeatureInfo;

/**
 * Abstract superclass of import and export page
 */
abstract class AbstractImportExportPage extends WizardPage {

	protected Text pathText;
	protected Button browseButton;
	protected CheckboxTableViewer viewer;
	protected Button checkAllButton;
	protected Button checkNoneButton;
	protected static final ImageDescriptor FEATURE_IMGDESC = Activator
			.getImageDescriptor("icons/iu_obj.gif"); //$NON-NLS-1$
	protected Image featureImg;

	public AbstractImportExportPage(String pageName) {
		super(pageName);
	}

	public void createControl(Composite parent) {
		initializeDialogUnits(parent);
		featureImg = FEATURE_IMGDESC.createImage();

		Composite composite = new Composite(parent, SWT.NONE);
		GridLayoutFactory.swtDefaults().numColumns(2).applyTo(composite);
		GridDataFactory.fillDefaults().applyTo(composite);
		composite.setSize(composite.computeSize(SWT.DEFAULT, SWT.DEFAULT));

		Dialog.applyDialogFont(composite);
		setControl(composite);
	}

	protected void createBrowseGroup(Composite parent, String labelText) {
		Composite composite = new Composite(parent, SWT.NONE);
		GridLayoutFactory.fillDefaults().numColumns(3).applyTo(composite);
		GridDataFactory.fillDefaults().align(SWT.FILL, SWT.BEGINNING)
				.grab(true, false).applyTo(composite);

		Label label = new Label(composite, SWT.NONE);
		label.setText(labelText);

		pathText = new Text(composite, SWT.BORDER);
		GridDataFactory.fillDefaults().align(SWT.FILL, SWT.CENTER)
				.grab(true, false).hint(250, SWT.DEFAULT).applyTo(pathText);
		pathText.addModifyListener(new ModifyListener() {
			public void modifyText(ModifyEvent e) {
				setPageComplete(validatePage());
			}
		});
		browseButton = new Button(composite, SWT.PUSH);
		browseButton.setText(Messages.AbstractImportExportPage_BrowseButtonLabel);
		browseButton
				.setLayoutData(new GridData(GridData.HORIZONTAL_ALIGN_FILL));
		setButtonLayoutData(browseButton);
		
		new Label(parent, SWT.NONE); // spacer
	}

	protected void createViewerGroup(Composite parent, String labelText) {
		Label label = new Label(parent, SWT.NONE);
		label.setText(labelText);
		GridDataFactory.defaultsFor(label).span(2, 1).applyTo(label);

		viewer = CheckboxTableViewer.newCheckList(parent, SWT.BORDER);
		TableViewerColumn featureColumn = new TableViewerColumn(viewer, SWT.LEFT);
		featureColumn.getColumn().setText(Messages.AbstractImportExportPage_FeatureColTitle);
		featureColumn.setLabelProvider(new ColumnLabelProvider() {
			@Override
			public Image getImage(Object element) {
				return featureImg;
			}

			@Override
			public String getText(Object element) {
				if (element instanceof FeatureInfo)
					return ((FeatureInfo) element).getId();
				return null;
			}
		});
		TableViewerColumn versionColumn = new TableViewerColumn(viewer,	SWT.LEFT);
		versionColumn.getColumn().setText(Messages.AbstractImportExportPage_VersionColTitle);
		versionColumn.setLabelProvider(new ColumnLabelProvider() {
			@Override
			public String getText(Object element) {
				if (element instanceof FeatureInfo) {
					return ((FeatureInfo) element).getVersion().toString();
				}
				return null;
			}
		});
		viewer.setSorter(new ViewerSorter());

		viewer.getControl().setLayoutData(
				new GridData(GridData.FILL_BOTH | GridData.GRAB_HORIZONTAL
						| GridData.GRAB_VERTICAL));
		viewer.setContentProvider(new ArrayContentProvider());
		viewer.getTable().setHeaderVisible(true);

		Composite buttonComposite = new Composite(parent, SWT.NONE);
		GridDataFactory.swtDefaults().align(SWT.END, SWT.BEGINNING)
				.applyTo(buttonComposite);
		buttonComposite.setLayout(new GridLayout());
		checkAllButton = new Button(buttonComposite, SWT.PUSH);
		checkAllButton.setText(Messages.AbstractImportExportPage_CheckAllLabel);
		setButtonLayoutData(checkAllButton);
		checkAllButton.addSelectionListener(new SelectionAdapter() {
			@Override
			public void widgetSelected(SelectionEvent e) {
				viewer.setAllChecked(true);
				enableButtons();
				setPageComplete(validatePage());
			}
		});
		checkNoneButton = new Button(buttonComposite, SWT.PUSH);
		checkNoneButton.setText(Messages.AbstractImportExportPage_CheckNoneLabel);
		setButtonLayoutData(checkNoneButton);
		checkNoneButton.addSelectionListener(new SelectionAdapter() {
			@Override
			public void widgetSelected(SelectionEvent e) {
				viewer.setAllChecked(false);
				enableButtons();
				setPageComplete(validatePage());
			}
		});
		viewer.addCheckStateListener(new ICheckStateListener() {
			public void checkStateChanged(CheckStateChangedEvent event) {
				enableButtons();
				setPageComplete(validatePage());
			}
		});
	}

	protected abstract boolean validatePage();

	public Collection<FeatureInfo> getSelectedFeatures() {
		Object[] checkedElements = viewer.getCheckedElements();
		List<FeatureInfo> infos = new ArrayList<FeatureInfo>();
		for (Object o : checkedElements) {
			infos.add((FeatureInfo) o);
		}
		return infos;
	}

	protected void packColumns() {
		TableColumn[] columns = viewer.getTable().getColumns();
		for (TableColumn column : columns) {
			column.pack();
		}
	}

	protected void updateViewer() {
		packColumns();
		viewer.setAllChecked(true);
		enableButtons();
		setPageComplete(validatePage());
	}

	private void enableButtons() {
		checkAllButton.setEnabled(viewer.getTable().getItemCount() > viewer.getCheckedElements().length);
		checkNoneButton.setEnabled(viewer.getCheckedElements().length > 0);
	}

	@Override
	public void dispose() {
		super.dispose();
		featureImg.dispose();
	}
}