/*******************************************************************************
 * Copyright (c) 2000, 2016 IBM Corporation 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:
 *     IBM Corporation - initial API and implementation
 *******************************************************************************/
package org.eclipse.help.ui.internal.views;

import java.util.Observable;
import java.util.Observer;

import org.eclipse.help.IHelpResource;
import org.eclipse.help.internal.base.BaseHelpSystem;
import org.eclipse.help.internal.base.BookmarkManager;
import org.eclipse.help.ui.internal.HelpUIResources;
import org.eclipse.help.ui.internal.IHelpUIConstants;
import org.eclipse.help.ui.internal.Messages;
import org.eclipse.jface.action.Action;
import org.eclipse.jface.action.IAction;
import org.eclipse.jface.action.IMenuManager;
import org.eclipse.jface.action.IToolBarManager;
import org.eclipse.jface.action.Separator;
import org.eclipse.jface.viewers.ISelection;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.jface.viewers.ITreeContentProvider;
import org.eclipse.jface.viewers.LabelProvider;
import org.eclipse.jface.viewers.TreeViewer;
import org.eclipse.jface.viewers.Viewer;
import org.eclipse.swt.custom.BusyIndicator;
import org.eclipse.swt.graphics.Image;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.ui.IMemento;
import org.eclipse.ui.actions.ActionFactory;
import org.eclipse.ui.forms.widgets.FormToolkit;

public class BookmarksPart extends HyperlinkTreePart implements Observer {
	private Action deleteAction;

	class BookmarksProvider implements ITreeContentProvider {

		@Override
		public Object[] getChildren(Object parentElement) {
			if (parentElement == BookmarksPart.this)
				return new Object[] { BaseHelpSystem.getBookmarkManager() };
			if (parentElement instanceof BookmarkManager)
				return ((BookmarkManager) parentElement).getBookmarks();
			return new Object[0];
		}

		@Override
		public Object getParent(Object element) {
			return null;
		}

		@Override
		public boolean hasChildren(Object element) {
			return getChildren(element).length > 0;
		}

		@Override
		public Object[] getElements(Object inputElement) {
			return getChildren(inputElement);
		}

		@Override
		public void dispose() {
		}

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

	class BookmarksLabelProvider extends LabelProvider {

		@Override
		public String getText(Object obj) {
			if (obj instanceof BookmarkManager)
				return Messages.BookmarksPart_savedTopics;
			if (obj instanceof IHelpResource)
				return ((IHelpResource) obj).getLabel();
			return super.getText(obj);
		}

		@Override
		public Image getImage(Object obj) {
			if (obj instanceof BookmarkManager)
				return HelpUIResources
						.getImage(IHelpUIConstants.IMAGE_BOOKMARKS);
			if (obj instanceof IHelpResource)
				return HelpUIResources
						.getImage(IHelpUIConstants.IMAGE_BOOKMARK);
			return super.getImage(obj);
		}
	}

	/**
	 * @param parent
	 * @param toolkit
	 * @param style
	 */
	public BookmarksPart(Composite parent, final FormToolkit toolkit,
			IToolBarManager tbm) {
		super(parent, toolkit, tbm);
		BaseHelpSystem.getBookmarkManager().addObserver(this);
	}

	@Override
	public void dispose() {
		BaseHelpSystem.getBookmarkManager().deleteObserver(this);
		super.dispose();
	}

	@Override
	protected void configureTreeViewer() {
		treeViewer.setContentProvider(new BookmarksProvider());
		treeViewer.setLabelProvider(new BookmarksLabelProvider());
		treeViewer.setAutoExpandLevel(TreeViewer.ALL_LEVELS);
		deleteAction = new Action("") { //$NON-NLS-1$

			@Override
			public void run() {
				Object obj = ((IStructuredSelection)treeViewer.getSelection()).getFirstElement();
				if (obj instanceof BookmarkManager.Bookmark) {
					BookmarkManager.Bookmark b = (BookmarkManager.Bookmark)obj;
					BaseHelpSystem.getBookmarkManager().removeBookmark(b);
				}
			}
		};
		deleteAction.setText(Messages.BookmarksPart_delete);
		deleteAction.setEnabled(false);
	}

	@Override
	protected void handleSelectionChanged(IStructuredSelection sel) {
		Object obj = sel.getFirstElement();
		deleteAction.setEnabled(obj!=null && obj instanceof BookmarkManager.Bookmark);
		super.handleSelectionChanged(sel);
	}

	@Override
	public boolean fillContextMenu(IMenuManager manager) {
		boolean value = super.fillContextMenu(manager);
		ISelection selection = treeViewer.getSelection();
		boolean canDeleteAll=false;
		int count = BaseHelpSystem.getBookmarkManager().getBookmarks().length;
		canDeleteAll = count>0;

		if (canDelete((IStructuredSelection) selection)) {
			if (value)
				manager.add(new Separator());
			manager.add(deleteAction);
			value=true;
		}
		if (canDeleteAll) {
			Action action = new Action("") { //$NON-NLS-1$

				@Override
				public void run() {
					BusyIndicator.showWhile(getControl().getDisplay(),
							() -> BaseHelpSystem.getBookmarkManager().removeAllBookmarks());
				}
			};
			action.setText(Messages.BookmarksPart_deleteAll);
			manager.add(action);
			value=true;
		}
		if (value==true)
			manager.add(new Separator());
		return value;
	}

	private boolean canDelete(IStructuredSelection ssel) {
		Object obj = ssel.getFirstElement();
		return obj instanceof BookmarkManager.Bookmark;
	}

	@Override
	protected void doOpen(Object obj) {
		if (obj instanceof BookmarkManager) {
			treeViewer.setExpandedState(obj, !treeViewer.getExpandedState(obj));
		} else if (obj instanceof IHelpResource) {
			IHelpResource res = (IHelpResource) obj;
			if (res.getHref() != null)
				parent.showURL(res.getHref());
		}
	}

	@Override
	public void update(final Observable o, final Object arg) {
		treeViewer.getControl().getDisplay().asyncExec(() -> asyncUpdate(o, arg));
	}

	private void asyncUpdate(Observable o, Object arg) {
		BookmarkManager.BookmarkEvent event = (BookmarkManager.BookmarkEvent) arg;
		switch (event.getType()) {
		case BookmarkManager.ADD:
			treeViewer.add(BaseHelpSystem.getBookmarkManager(), event
					.getBookmark());
			break;
		case BookmarkManager.REMOVE:
			treeViewer.remove(event.getBookmark());
			break;
		case BookmarkManager.REMOVE_ALL:
		case BookmarkManager.WORLD_CHANGED:
			treeViewer.refresh();
			break;
		}
	}

	@Override
	public IAction getGlobalAction(String id) {
		if (id.equals(ActionFactory.DELETE.getId()))
			return deleteAction;
		return super.getGlobalAction(id);
	}

	@Override
	protected boolean canAddBookmarks() {
		return false;
	}

	@Override
	public void toggleRoleFilter() {
	}

	@Override
	public void refilter() {
	}

	@Override
	public void saveState(IMemento memento) {
	}
}
