/*******************************************************************************
 * Copyright (c) 2007, 2018 Red Hat, Inc.
 *
 * This program and the accompanying materials are made
 * available under the terms of the Eclipse Public License 2.0
 * which is available at https://www.eclipse.org/legal/epl-2.0/
 *
 * SPDX-License-Identifier: EPL-2.0
 *
 * Contributors:
 *    Red Hat - initial API and implementation
 *******************************************************************************/

package org.eclipse.linuxtools.internal.rpm.ui.editor.outline;

import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.jface.viewers.SelectionChangedEvent;
import org.eclipse.jface.viewers.TreeViewer;
import org.eclipse.linuxtools.rpm.ui.editor.parser.SpecfileElement;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;
import org.eclipse.ui.IEditorInput;
import org.eclipse.ui.texteditor.ITextEditor;
import org.eclipse.ui.views.contentoutline.ContentOutlinePage;

public class SpecfileContentOutlinePage extends ContentOutlinePage {

	private ITextEditor editor;
	private IEditorInput input;

	public SpecfileContentOutlinePage(ITextEditor editor) {
		super();
		this.editor = editor;
	}

	public void setInput(IEditorInput editorInput) {
		this.input = editorInput;
		update();
	}

	public void update() {
		// set the input so that the outlines parse can be called
		// update the tree viewer state
		final TreeViewer viewer = getTreeViewer();

		if (viewer != null) {
			final Control control = viewer.getControl();
			if (control != null && !control.isDisposed()) {
				control.getDisplay().asyncExec(() -> {
					if (!control.isDisposed()) {
						control.setRedraw(false);
						if (input != null) {
							viewer.setInput(input);
						}
						viewer.expandAll();
						control.setRedraw(true);
					}
				});
			}
		}
	}

	@Override
	public void createControl(Composite parent) {

		super.createControl(parent);

		TreeViewer viewer = getTreeViewer();
		viewer.setContentProvider(new SpecfileContentProvider(editor));
		SpecfileLabelProvider labelProvider = new SpecfileLabelProvider();
		viewer.setLabelProvider(labelProvider);
		viewer.addSelectionChangedListener(this);

		if (input != null) {
			viewer.setInput(input);
		}
	}

	/*
	 * Change in selection
	 */
	@Override
	public void selectionChanged(SelectionChangedEvent event) {
		super.selectionChanged(event);

		// find out which item in tree viewer we have selected, and set
		// highlight range accordingly
		IStructuredSelection selection = event.getStructuredSelection();
		if (selection.isEmpty()) {
			editor.resetHighlightRange();
		} else {
			SpecfileElement element = (SpecfileElement) selection.getFirstElement();

			int start = element.getLineStartPosition();
			try {
				editor.setHighlightRange(start, 1, true);
			} catch (IllegalArgumentException e) {
				editor.resetHighlightRange();
			}
		}
	}

}
