/*******************************************************************************
 * Copyright (c) 2006, 2016 Intel 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:
 *     Intel Corporation - initial API and implementation
 *     IBM Corporation - 163558 Dynamic content support for all UA
 *     IBM Corporation - Support for see elements
 *     Andreas Meissner - Fix Bug 351272
 *******************************************************************************/
package org.eclipse.help.ui.internal.views;

import org.eclipse.help.HelpSystem;
import org.eclipse.help.IHelpResource;
import org.eclipse.help.IIndexEntry;
import org.eclipse.help.IIndexEntry2;
import org.eclipse.help.IIndexSee;
import org.eclipse.help.UAContentFilter;
import org.eclipse.help.internal.base.HelpBasePlugin;
import org.eclipse.help.internal.base.HelpEvaluationContext;
import org.eclipse.help.internal.base.util.IndexUtils;
import org.eclipse.help.internal.index.IndexSee;
import org.eclipse.help.ui.internal.IHelpUIConstants;
import org.eclipse.help.ui.internal.Messages;
import org.eclipse.jface.action.IToolBarManager;
import org.eclipse.jface.viewers.ITreeContentProvider;
import org.eclipse.jface.viewers.LabelProvider;
import org.eclipse.jface.viewers.StructuredSelection;
import org.eclipse.jface.viewers.Viewer;
import org.eclipse.jface.viewers.ViewerFilter;
import org.eclipse.osgi.util.NLS;
import org.eclipse.swt.graphics.Image;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Tree;
import org.eclipse.ui.IMemento;
import org.eclipse.ui.forms.widgets.FormToolkit;

public class IndexPart extends HyperlinkTreePart implements IHelpUIConstants {
	private RoleFilter roleFilter;

	class IndexProvider implements ITreeContentProvider {

		@Override
		public Object[] getChildren(Object parentElement) {
			if (parentElement == IndexPart.this) {
				return HelpSystem.getIndex().getEntries();
			}
			if (parentElement instanceof IIndexEntry) {
				return IndexPart.this.getChildren((IIndexEntry) parentElement);
			}
			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 IndexLabelProvider extends LabelProvider {

		@Override
		public String getText(Object obj) {
			if (obj instanceof IIndexEntry)
				return ((IIndexEntry) obj).getKeyword();
			if (obj instanceof IHelpResource)
				return ((IHelpResource) obj).getLabel();
			if (obj instanceof IndexSee) {
				IndexSee see = (IndexSee) obj;
				return getSeeString(see);
			}
			return super.getText(obj);
		}

		@Override
		public Image getImage(Object obj) {
			return super.getImage(obj);
		}
	}

	public String getSeeString(IIndexSee see) {
		String seeText = see.isSeeAlso() ? Messages.SeeAlso : Messages.See;
		String message = NLS.bind(seeText, see.getKeyword());
		String[] path = IndexUtils.getPath(see);;
		for (int i = 1; i < path.length; i++) {
			message = NLS.bind(Messages.SeeList, message,path[i]);
		}
		return message;
	}

	class RoleFilter extends ViewerFilter {

		@Override
		public boolean select(Viewer viewer, Object parentElement,
				Object element) {
			if (element instanceof IIndexEntry) {
				return isEnabled((IIndexEntry) element);
			} else if (element instanceof IHelpResource) {
				return isEnabled((IHelpResource) element);
			} else if (element instanceof IIndexSee) {
				return isEnabled(element);
			}
			return false;
		}

		private boolean isEnabled(IIndexEntry entry) {
			if (!UAContentFilter.isFiltered(entry, HelpEvaluationContext.getContext())) {
				IHelpResource[] topics = entry.getTopics();
				for (int i = 0; i < topics.length; i++) {
					if (isEnabled(topics[i]))
						return true;
				}
				IIndexEntry[] subentries = entry.getSubentries();
				for (int i = 0; i < subentries.length; i++) {
					if (isEnabled(subentries[i]))
						return true;
				}
				if (entry instanceof IIndexEntry2) {
					IIndexSee[] sees = ((IIndexEntry2)entry).getSees();
					for (int i = 0; i < sees.length; i++) {
						if (isEnabled(sees[i]))
							return true;
					}
				}
			}
			return false;
		}

		private boolean isEnabled(Object obj) {
			return !UAContentFilter.isFiltered(obj, HelpEvaluationContext.getContext());
		}

		private boolean isEnabled(IHelpResource topic) {
			return isEnabled((Object)topic) && HelpBasePlugin.getActivitySupport().isEnabled(topic.getHref());
		}
	}

	public IndexPart(Composite parent, FormToolkit toolkit, IToolBarManager tbm) {
		super(parent, toolkit, tbm);
		roleFilter = new RoleFilter();
	}

	@Override
	protected void configureTreeViewer() {
		treeViewer.setContentProvider(new IndexProvider());
		treeViewer.setLabelProvider(new IndexLabelProvider());
	}

	@Override
	public void init(ReusableHelpPart parent, String id, IMemento memento) {
		super.init(parent, id, memento);
		if (parent.isFilteredByRoles())
			treeViewer.addFilter(roleFilter);
	}

	@Override
	protected void doOpen(Object obj) {
		if (obj instanceof IHelpResource) {
			parent.showURL(((IHelpResource) obj).getHref());
		} else if (obj instanceof IIndexEntry) {
			IIndexEntry entry = (IIndexEntry) obj;
			if (getChildren(entry).length > 0) {
				treeViewer.setExpandedState(obj, !treeViewer.getExpandedState(obj));
			}
			IHelpResource[] topics = entry.getTopics();
			if (topics.length == 1) {
				parent.showURL(topics[0].getHref());
			}
		} else if (obj instanceof IIndexSee) {
			IIndexSee see = (IIndexSee)obj;
			IIndexEntry[] entrys = IndexUtils.findSeeTargets(HelpSystem.getIndex(), see, 0);
			for (int i = 0; i < entrys.length; i++) {
				treeViewer.setExpandedState(entrys[i], true);
				treeViewer.setSelection(new StructuredSelection(entrys[i]), true);
			}
		}
	}

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

	@Override
	public void saveState(IMemento memento) {
	}

	@Override
	public void toggleRoleFilter() {
		if (parent.isFilteredByRoles())
			treeViewer.addFilter(roleFilter);
		else
			treeViewer.removeFilter(roleFilter);
	}

	private Object[] getChildren(IIndexEntry entry) {
		/*
		 * Index entry has two types of children: topics and subentries.
		 *
		 * The method returns topics among children only if number of the topics
		 * more than 1.
		 *
		 * In case when the entry owns only one topic, this topic is not returned
		 * as child because the entry will represent this topic by its keyword.
		 */
		IHelpResource[] topics = entry.getTopics();
		IIndexEntry[] subentries = entry.getSubentries();
		IIndexSee[] sees = entry instanceof IIndexEntry2 ? ((IIndexEntry2)entry).getSees() :
			               new IIndexSee[0];

		if (topics.length <= 1 && subentries.length == 0 && sees.length == 0) {
			// Entries with only one topic do not show children
			return new Object[0];
		}

		Object[] children = null;
		if (topics.length == 1) {
			children = new Object[subentries.length + sees.length];
			System.arraycopy(subentries, 0, children, 0, subentries.length);
			System.arraycopy(sees, 0, children, subentries.length, sees.length);
		} else {
			children = new Object[topics.length + subentries.length + sees.length];
			System.arraycopy(topics, 0, children, 0, topics.length);
			System.arraycopy(subentries, 0, children, topics.length, subentries.length);
			System.arraycopy(sees, 0, children, topics.length + subentries.length, sees.length);
		}

		return children;
	}


	protected Tree getTreeWidget() {
		return treeViewer.getTree();
	}
}
