/*******************************************************************************
 * Copyright (c) 2009, 2015 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.ua.tests.doc.internal.dialogs;

import java.util.ArrayList;

import org.eclipse.core.runtime.Platform;
import org.eclipse.help.internal.HelpPlugin;
import org.eclipse.help.internal.toc.Toc;
import org.eclipse.jface.dialogs.Dialog;
import org.eclipse.swt.SWT;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.List;
import org.eclipse.swt.widgets.Shell;

public class SelectTocDialog extends Dialog {

	private int[] selectedTocs = {};
	private List tocList;
	private Toc[] tocs;
	private Button existButton, loadButton, followLinksButton;
	public static final int PAGES_EXIST = 1;
	public static final int LOAD_PAGES = 2;
	public static final int FOLLOW_LINKS = 3;
	public static final int NO_SELECTION = 3;
	private int buttonState;

	public SelectTocDialog(Shell parentShell) {
		super(parentShell);
		String locale = Platform.getNL();
		tocs = HelpPlugin.getTocManager().getTocs(locale);
		setShellStyle(getShellStyle() | SWT.RESIZE);
	}

	@Override
	protected void configureShell(Shell newShell) {
		super.configureShell(newShell);
		newShell.setText("Check Table of Contents");
	}

	@Override
	protected Control createDialogArea(Composite parent) {
		Composite inner = new Composite(parent, SWT.NULL);
		inner.setLayout(new GridLayout());
		inner.setLayoutData(new GridData(GridData.FILL_BOTH));
		Label selectLabel = new Label(inner, SWT.NULL);
		selectLabel.setText("Select a TOC to check");
		tocList = new List(inner, SWT.MULTI | SWT.V_SCROLL | SWT.H_SCROLL | SWT.BORDER);
		for (Toc toc : tocs) {
			tocList.add(toc.getLabel());
		}
		tocList.setSelection(0);
		GridData tocData = new GridData(GridData.FILL_BOTH);
		tocData.widthHint = 300;
		tocData.heightHint = 300;
		tocList.setLayoutData(tocData);
		existButton = new Button(inner, SWT.RADIO);
		existButton.setText("Check files in TOC exist");
		loadButton = new Button(inner, SWT.RADIO);
		loadButton.setText("Check files in TOC can load including css/images/javascript");
		followLinksButton = new Button(inner, SWT.RADIO);
		followLinksButton.setText("Check files in TOC can load and check hyperlinks");
		existButton.setSelection(true);
		return inner;
	}

	@Override
	protected void okPressed() {
		selectedTocs = tocList.getSelectionIndices();
		if (existButton.getSelection()) {
			buttonState = PAGES_EXIST;
		} else if (loadButton.getSelection()) {
			buttonState = LOAD_PAGES;
		} else if (followLinksButton.getSelection()) {
			buttonState = FOLLOW_LINKS;
		} else {
			buttonState = NO_SELECTION;
		}
		super.okPressed();
	}

	public Toc[] getTocsToCheck() {
		ArrayList<Toc> selected = new ArrayList<Toc>();
		for (int selectedToc : selectedTocs) {
		    selected.add(tocs[selectedToc]);
		}
		Toc[] tocsToCheck = selected.toArray(new Toc[0]) ;
		return tocsToCheck;
	}

	public int getTestKind() {
		return buttonState;
	}

}
