package org.eclipse.update.internal.ui.views;

import java.util.*;

import org.eclipse.core.runtime.CoreException;
import org.eclipse.jface.action.*;
import org.eclipse.jface.resource.ImageDescriptor;
import org.eclipse.jface.viewers.*;
import org.eclipse.jface.wizard.WizardDialog;
import org.eclipse.swt.custom.BusyIndicator;
import org.eclipse.swt.graphics.Image;
import org.eclipse.swt.widgets.Widget;
import org.eclipse.update.core.*;
import org.eclipse.update.internal.ui.*;
import org.eclipse.update.internal.ui.model.*;
import org.eclipse.update.internal.ui.parts.SharedLabelProvider;
import org.eclipse.update.internal.ui.wizards.*;

/**
 *
 */
public class ItemsView extends BaseTableView {
	private UpdateModelChangedListener modelListener;
	private Action deleteAction;
	private Action processAction;
	private Action processAllAction;

	class ViewContentProvider implements IStructuredContentProvider {
		public void inputChanged(Viewer v, Object oldInput, Object newInput) {
		}
		public void dispose() {
		}
		public Object[] getElements(Object parent) {
			return UpdateUI
				.getDefault()
				.getUpdateModel()
				.getPendingChanges();
		}
	}

	class ViewLabelProvider
		extends LabelProvider
		implements ITableLabelProvider {
		public String getColumnText(Object obj, int col) {
			return getText(obj);
		}
		public String getText(Object obj) {
			if (obj instanceof IFeatureAdapter) {
				try {
					IFeature feature = ((IFeatureAdapter) obj).getFeature(null);
					VersionedIdentifier versionedIdentifier =
						(feature != null)
							? feature.getVersionedIdentifier()
							: null;
					String version = "";
					if (versionedIdentifier != null)
						version = versionedIdentifier.getVersion().toString();
					String label = (feature != null) ? feature.getLabel() : "";
					return label + " " + version;
				} catch (CoreException e) {
				}
			}
			return super.getText(obj);
		}
		public Image getColumnImage(Object obj, int index) {
			PendingChange job = (PendingChange) obj;
			int flags = 0;
			switch (job.getJobType()) {
				case PendingChange.INSTALL :
					flags = SharedLabelProvider.F_ADD;
					break;
				case PendingChange.UNINSTALL :
					flags = SharedLabelProvider.F_DEL;
					break;
				case PendingChange.CONFIGURE :
					break;
				case PendingChange.UNCONFIGURE :
					flags = SharedLabelProvider.F_UNCONFIGURED;
					break;
			}
			boolean patch = job.getFeature().isPatch();
			ImageDescriptor desc = patch?UpdateUIImages.DESC_EFIX_OBJ:
			UpdateUIImages.DESC_FEATURE_OBJ;
			return UpdateUI.getDefault().getLabelProvider().get(
				desc,
				flags);
		}
	}

	class UpdateModelChangedListener implements IUpdateModelChangedListener {
		/**
		 * @see org.eclipse.update.internal.ui.model.IUpdateModelChangedListener#objectChanged(java.lang.Object, java.lang.String)
		 */
		public void objectChanged(final Object object, String property) {
			if (object instanceof PendingChange) {
				getTableViewer()
					.getControl()
					.getDisplay()
					.asyncExec(new Runnable() {
					public void run() {
						getTableViewer().update(object, null);
						updateTitle();
					}
				});
			}
		}

		/**
		 * @see org.eclipse.update.internal.ui.model.IUpdateModelChangedListener#objectsAdded(java.lang.Object, java.lang.Object)
		 */
		public void objectsAdded(Object parent, final Object[] children) {
			if (children[0] instanceof PendingChange) {
				getTableViewer()
					.getControl()
					.getDisplay()
					.asyncExec(new Runnable() {
					public void run() {
						getTableViewer().add(children);
						updateTitle();
					}
				});
			}
		}

		/**
		 * @see org.eclipse.update.internal.ui.model.IUpdateModelChangedListener#objectsRemoved(java.lang.Object, java.lang.Object)
		 */
		public void objectsRemoved(Object parent, final Object[] children) {
			if (children[0] instanceof PendingChange) {
				getTableViewer()
					.getControl()
					.getDisplay()
					.asyncExec(new Runnable() {
					public void run() {
						getTableViewer().remove(children);
						updateTitle();
					}
				});
			}
		}
	}

	public ItemsView() {
		modelListener = new UpdateModelChangedListener();
		UpdateUI.getDefault().getLabelProvider().connect(this);
	}

	/**
	 * @see org.eclipse.update.internal.ui.views.BaseView#initProviders()
	 */
	public void initProviders() {
		TableViewer viewer = getTableViewer();
		viewer.setContentProvider(new ViewContentProvider());
		viewer.setLabelProvider(new ViewLabelProvider());
		viewer.setInput(UpdateUI.getDefault().getUpdateModel());
	}

	protected void fillContextMenu(IMenuManager manager) {
		processAction.setEnabled(canProcess());
		manager.add(processAction);
		manager.add(processAllAction);
		manager.add(new Separator());
		deleteAction.setEnabled(canDelete());
		manager.add(deleteAction);
		manager.add(new Separator());
		super.fillContextMenu(manager);
	}

	protected void makeActions() {
		deleteAction = new Action() {
			public void run() {
				doDelete();
			}
		};
		deleteAction.setText(
			UpdateUI.getString("ItemsView.popup.delete"));
			
		processAction = new Action() {
			public void run() {
				doProcess();
			}
		};
		processAction.setText(
			UpdateUI.getString("ItemsView.popup.process"));

		processAllAction = new Action() {
			public void run() {
				doProcessAll();
			}
		};
		processAllAction.setText(
			UpdateUI.getString("ItemsView.popup.processAll"));

		super.makeActions();
	}

	public void dispose() {
		hookListeners(false);
		UpdateUI.getDefault().getLabelProvider().disconnect(this);
		super.dispose();
	}

	protected void partControlCreated() {
		UpdateModel model = UpdateUI.getDefault().getUpdateModel();
		hookListeners(true);
	}

	protected void hookListeners(boolean add) {
		UpdateModel model = UpdateUI.getDefault().getUpdateModel();
		if (add)
			model.addUpdateModelChangedListener(modelListener);
		else
			model.removeUpdateModelChangedListener(modelListener);
	}

	protected void deleteKeyPressed(Widget widget) {
		if (canDelete())
			doDelete();
	}

	private boolean canProcess() {
		return canDelete();
	}

	private void doProcess() {
		IStructuredSelection ssel =
			(IStructuredSelection) getViewer().getSelection();
		ArrayList jobs = new ArrayList();
		for (Iterator iter = ssel.iterator(); iter.hasNext();) {
			PendingChange job = (PendingChange) iter.next();
			if (job.isProcessed() == false)
				jobs.add(job);
		}
		PendingChange[] result =
			(PendingChange[]) jobs.toArray(new PendingChange[jobs.size()]);
		doProcess(result);
	}

	private void doProcessAll() {
		UpdateModel model = UpdateUI.getDefault().getUpdateModel();
		PendingChange[] jobs = model.getPendingChanges();
		doProcess(jobs);
	}

	private void doProcess(final PendingChange[] jobs) {
		BusyIndicator.showWhile(getControl().getDisplay(), new Runnable() {
			public void run() {
				MultiInstallWizard wizard = new MultiInstallWizard(jobs);
				WizardDialog dialog =
					new InstallWizardDialog(
						getControl().getShell(),
						wizard);
				dialog.create();
				dialog.getShell().setSize(600, 500);
				dialog.open();
				if (wizard.isSuccessfulInstall())
					UpdateUI.informRestartNeeded();
			}
		});
	}

	private void doDelete() {
		if (!confirmDeletion())
			return;
		IStructuredSelection ssel =
			(IStructuredSelection) getViewer().getSelection();
		UpdateModel model = UpdateUI.getDefault().getUpdateModel();

		for (Iterator iter = ssel.iterator(); iter.hasNext();) {
			model.removePendingChange((PendingChange) iter.next());
		}
	}

	private boolean canDelete() {
		return getViewer().getSelection().isEmpty() == false;
	}

	private void updateTitle() {
		UpdateModel model = UpdateUI.getDefault().getUpdateModel();
		PendingChange[] changes = model.getPendingChanges();

		int total = changes.length;
		int completed = 0;

		for (int i = 0; i < changes.length; i++) {
			PendingChange job = changes[i];
			if (job.isProcessed())
				completed++;
		}
		String baseName = getSite().getRegisteredName();
		String title =
			UpdateUI.getFormattedMessage(
				"ItemsView.title",
				new String[] {
					getSite().getRegisteredName(),
					"" + total,
					"" + completed });
		setTitle(title);
	}
}
