/*******************************************************************************
 * Copyright (c) 2004, 2009 Tasktop Technologies 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:
 *     Xiaoyang Guan - initial API and implementation
 *******************************************************************************/

package org.eclipse.mylyn.internal.trac.wiki;

import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.Status;
import org.eclipse.core.runtime.jobs.Job;
import org.eclipse.jface.viewers.ColumnLabelProvider;
import org.eclipse.jface.viewers.IStructuredContentProvider;
import org.eclipse.jface.viewers.TableViewer;
import org.eclipse.jface.viewers.TableViewerColumn;
import org.eclipse.jface.viewers.Viewer;
import org.eclipse.jface.viewers.ViewerComparator;
import org.eclipse.mylyn.internal.trac.core.TracCorePlugin;
import org.eclipse.mylyn.internal.trac.core.client.AbstractWikiHandler;
import org.eclipse.mylyn.internal.trac.core.model.TracWikiPage;
import org.eclipse.mylyn.internal.trac.core.model.TracWikiPageInfo;
import org.eclipse.mylyn.internal.trac.wiki.editor.TracWikiPageEditorInput;
import org.eclipse.mylyn.tasks.core.TaskRepository;
import org.eclipse.swt.SWT;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;
import org.eclipse.team.ui.history.HistoryPage;
import org.eclipse.ui.PlatformUI;

/**
 * @author Xiaoyang Guan
 */
public class TracWikiPageHistoryPage extends HistoryPage {

	private TableViewer viewer;

	class DownloadPageHistoryJob extends Job {

		private final TaskRepository repository;

		private final TracWikiPage page;

		public DownloadPageHistoryJob(TaskRepository repository, TracWikiPage page) {
			super("Download Page History");
			this.repository = repository;
			this.page = page;
		}

		@Override
		protected IStatus run(IProgressMonitor monitor) {
			AbstractWikiHandler wikiHandler = TracCorePlugin.getDefault().getConnector().getWikiHandler();
			try {
				monitor.beginTask("Retrieving wiki page history", IProgressMonitor.UNKNOWN);
				final TracWikiPageInfo[] pageVersions = wikiHandler.getPageHistory(repository, page.getPageInfo()
						.getPageName(), monitor);
				PlatformUI.getWorkbench().getDisplay().asyncExec(new Runnable() {

					public void run() {
						viewer.setInput(pageVersions);
					}

				});
			} catch (CoreException e) {
				PlatformUI.getWorkbench().getDisplay().asyncExec(new Runnable() {

					public void run() {
						viewer.setInput(null);
					}

				});
			} finally {
				monitor.done();
			}
			return Status.OK_STATUS;
		}

	}

	@Override
	public boolean inputSet() {
		if (getInput() instanceof TracWikiPageEditorInput) {
			refresh();
			return true;
		}
		return false;
	}

	class PageHistoryContentProvider implements IStructuredContentProvider {

		public Object[] getElements(Object inputElement) {
			return (TracWikiPageInfo[]) inputElement;
		}

		public void dispose() {
		}

		public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
		}

	}

	@Override
	public void createControl(Composite parent) {
		viewer = new TableViewer(parent, SWT.MULTI | SWT.H_SCROLL | SWT.V_SCROLL | SWT.FULL_SELECTION);
		viewer.setContentProvider(new PageHistoryContentProvider());

		TableViewerColumn column = new TableViewerColumn(viewer, SWT.NONE);
		column.getColumn().setWidth(80);
		column.getColumn().setText("Version");
		column.getColumn().setMoveable(true);
		column.setLabelProvider(new ColumnLabelProvider() {

			@Override
			public String getText(Object element) {
				return ((TracWikiPageInfo) element).getVersion() + "";
			}
		});

		column = new TableViewerColumn(viewer, SWT.NONE);
		column.getColumn().setWidth(250);
		column.getColumn().setText("Date");
		column.getColumn().setMoveable(true);
		column.setLabelProvider(new ColumnLabelProvider() {

			@Override
			public String getText(Object element) {
				return ((TracWikiPageInfo) element).getLastModified().toString();
			}

		});

		column = new TableViewerColumn(viewer, SWT.NONE);
		column.getColumn().setWidth(200);
		column.getColumn().setText("Author");
		column.getColumn().setMoveable(true);
		column.setLabelProvider(new ColumnLabelProvider() {

			@Override
			public String getText(Object element) {
				return ((TracWikiPageInfo) element).getAuthor();
			}

		});

		column = new TableViewerColumn(viewer, SWT.NONE);
		column.getColumn().setWidth(200);
		column.getColumn().setText("Comment");
		column.getColumn().setMoveable(true);
		column.setLabelProvider(new ColumnLabelProvider() {

			@Override
			public String getText(Object element) {
				return ((TracWikiPageInfo) element).getComment();
			}

		});

		viewer.getTable().setLinesVisible(true);
		viewer.getTable().setHeaderVisible(true);
		viewer.setComparator(new ViewerComparator() {

			@Override
			public int compare(Viewer viewer, Object e1, Object e2) {
				if (e1 instanceof TracWikiPageInfo && e2 instanceof TracWikiPageInfo) {
					// sort from the latest version to the earliest version
					return ((TracWikiPageInfo) e2).getVersion() - ((TracWikiPageInfo) e1).getVersion();
				}
				return super.compare(viewer, e1, e2);
			}

		});
	}

	@Override
	public Control getControl() {
		return viewer.getControl();
	}

	@Override
	public void setFocus() {
		getControl().setFocus();
	}

	public String getDescription() {
		return "Change History for " + getName();
	}

	public String getName() {
		TracWikiPageEditorInput input = (TracWikiPageEditorInput) getInput();
		return input.getPage().getPageInfo().getPageName() + " [" + input.getRepository().getRepositoryLabel() + "]";
	}

	public boolean isValidInput(Object object) {
		if (object instanceof TracWikiPageEditorInput) {
			TracWikiPageEditorInput input = (TracWikiPageEditorInput) object;
			return input.getRepository() != null && input.getPage() != null;
		}
		return false;
	}

	public void refresh() {
		TracWikiPageEditorInput input = (TracWikiPageEditorInput) getInput();
		(new DownloadPageHistoryJob(input.getRepository(), input.getPage())).schedule();
	}

	@SuppressWarnings("rawtypes")
	public Object getAdapter(Class adapter) {
		return null;
	}

}
