/*******************************************************************************
 * Copyright (c) 2000, 2003 IBM Corporation and others.
 * All rights reserved. This program and the accompanying materials 
 * are made available under the terms of the Common Public License v1.0
 * which accompanies this distribution, and is available at
 * http://www.eclipse.org/legal/cpl-v10.html
 * 
 * Contributors:
 *     IBM Corporation - initial API and implementation
 *******************************************************************************/
package org.eclipse.jface.tests.viewers.interactive;

import org.eclipse.swt.SWT;
import org.eclipse.swt.custom.CLabel;
import org.eclipse.swt.custom.SashForm;
import org.eclipse.swt.custom.ViewForm;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;
import org.eclipse.swt.widgets.Shell;

import org.eclipse.jface.action.Action;
import org.eclipse.jface.action.MenuManager;
import org.eclipse.jface.action.Separator;
import org.eclipse.jface.tests.viewers.TestElement;
import org.eclipse.jface.tests.viewers.TestModelChange;
import org.eclipse.jface.viewers.Viewer;
import org.eclipse.jface.window.ApplicationWindow;

public abstract class TestBrowser extends ApplicationWindow {
	TestElement fInput;
	Viewer fViewer;
	
	Action fChangeLabelAction;
	Action fChangeInputLabelAction;
	Action fChangeChildLabelAction;
	Action fReloadAction;
	Action fReloadActionLarge;
	Action fReloadActionFlat;
	
	Action fDeleteAction;
	Action fDeleteChildrenAction;
	Action fDeleteSomeChildrenAction;
	Action fDeleteSiblingsAction;
	Action fFlushInputAction;
	
	Action fAddElementAction;

	Action fAddSiblingAction;
	Action fAddSiblingRevealAction;
	Action fAddSiblingSelectAction;
	
	Action fAddChildAction;
	Action fAddChildRevealAction;
	Action fAddChildSelectAction;

	Action fWorldChangedAction;
	
	Action fSetLabelProvider;
	
	Action fAddFilterAction;
	Action fResetFilters;
	
	Action fSetSorter;
	Action fResetSorter;
	
	Action fClearSelection;
	
	int fPanes= 1;
	
	public TestBrowser() {
		super(null);
		addMenuBar();
	}
/* (non-Javadoc)
 * Method declared on Window.
 */
protected void configureShell(Shell shell) {
	super.configureShell(shell);
	shell.setText("Test Browser");
}
protected void createActions() {
	fChangeLabelAction = new ChangeLabelAction("Change Label", this);
	fChangeChildLabelAction =
		new ChangeChildLabelAction("Change Child Label", this);
//	fChangeInputLabelAction =
//		new ChangeInputLabelAction("Change Input Label", this);

	fReloadAction = new CreateModelAction("Reload Test Data (small)", this, 3, 10);
	fReloadActionLarge =
		new CreateModelAction("Reload Test Data (large)", this, 3, 33);
	fReloadActionFlat =
		new CreateModelAction("Reload Test Data (flat)", this, 1, 2000);

	fDeleteAction = new DeleteAction("Delete", this);
	fDeleteChildrenAction = new DeleteChildrenAction("Delete Children", this, true);
	fDeleteSomeChildrenAction =
		new DeleteChildrenAction("Delete Odd Children", this, false);
	fDeleteSiblingsAction = new DeleteSiblingsAction("Delete Siblings", this, true);

	fFlushInputAction = new FlushInputAction("Flush Input", this);

	fAddElementAction = new AddElementAction("Add Element to Input", this);
	fAddSiblingAction = new AddSiblingAction("Add Sibling", this);
	fAddSiblingRevealAction =
		new AddSiblingAction(
			"Add Sibling and Reveal",
			this,
			TestModelChange.INSERT | TestModelChange.REVEAL);
	fAddSiblingSelectAction =
		new AddSiblingAction(
			"Add Sibling and Select",
			this,
			TestModelChange.INSERT | TestModelChange.REVEAL | TestModelChange.SELECT);
	fAddChildAction = new AddChildAction("Add Child", this);
	fAddChildRevealAction =
		new AddChildAction(
			"Add Child and Reveal",
			this,
			TestModelChange.INSERT | TestModelChange.REVEAL);
	fAddChildSelectAction =
		new AddChildAction(
			"Add Child and Select",
			this,
			TestModelChange.INSERT | TestModelChange.REVEAL | TestModelChange.SELECT);

	fWorldChangedAction = new WorldChangedAction("World Changed", this);

	fSetLabelProvider =
		new SetLabelProviderAction("Set Custom Label Provider", this);

	fAddFilterAction = new AddFilterAction("Add Filter", this);
	fResetFilters = new ResetFilterAction("Reset All Filters", this);

	fSetSorter = new SetSorterAction("Set Sorter", this);
	fResetSorter = new ResetSorterAction("Reset Sorter", this);

	fClearSelection = new ClearSelectionAction("Clear Selection", this);
}

protected Control createContents(Composite parent) {
	ViewForm form = new ViewForm(parent, SWT.NONE);
	CLabel label = new CLabel(form, SWT.NONE);
	form.setTopLeft(label);
	Object input = getInput();
	label.setText(input.toString());
	if (fPanes == 1) {
		Viewer viewer = createViewer(form);
		form.setContent(viewer.getControl());
		fViewer = viewer;
		viewer.setInput(input);
	} else if (fPanes == 2) {
		SashForm sashForm = new SashForm(form, SWT.VERTICAL);
		form.setContent(sashForm);
		Viewer viewer = createViewer(sashForm);
		fViewer = viewer;
		viewer.setInput(input);
		viewer = createViewer(sashForm);
		viewer.setInput(input);
	}
	createActions();
	fillMenuBar(getMenuBarManager());
	viewerFillMenuBar(getMenuBarManager());
	getMenuBarManager().updateAll(false);
	return form;
}
	public abstract Viewer createViewer(Composite parent);
protected void fillMenuBar(MenuManager mgr) {

	MenuManager setupMenu = new MenuManager("Setup","Setup");
	mgr.add(setupMenu);
	setupMenu.add(fReloadAction);
	setupMenu.add(fReloadActionLarge);
	setupMenu.add(fReloadActionFlat);
	setupMenu.add(new Separator());
	setupMenu.add(fFlushInputAction);
	setupMenu.add(new Separator());
	setupMenu.add(fSetLabelProvider);
	setupMenu.add(new Separator());
	setupMenu.add(fAddFilterAction);
	setupMenu.add(fResetFilters);
	setupMenu.add(new Separator());
	setupMenu.add(fSetSorter);
	setupMenu.add(fResetSorter);

	MenuManager testMenu = new MenuManager("Tests","Tests");
	mgr.add(testMenu);
	testMenu.add(fChangeLabelAction);
	testMenu.add(fChangeChildLabelAction);
//	testMenu.add(fChangeInputLabelAction);
	testMenu.add(new Separator());

	testMenu.add(fDeleteAction);
	testMenu.add(fDeleteChildrenAction);
	testMenu.add(fDeleteSomeChildrenAction);
	testMenu.add(fDeleteSiblingsAction);
	testMenu.add(new Separator());

	testMenu.add(fAddElementAction);
	testMenu.add(new Separator());

	testMenu.add(fAddSiblingAction);
	testMenu.add(fAddSiblingRevealAction);
	testMenu.add(fAddSiblingSelectAction);
	testMenu.add(new Separator());

	testMenu.add(fAddChildAction);
	testMenu.add(fAddChildRevealAction);
	testMenu.add(fAddChildSelectAction);
	testMenu.add(new Separator());

	testMenu.add(fClearSelection);
	testMenu.add(new Separator());

	testMenu.add(fWorldChangedAction);
//	((TestTree)this).testTreeFillMenuBar(testMenu);
}
public TestElement getInput() {
	return fInput;
}
	public Viewer getViewer() {
		return fViewer;
	}
	public Composite getViewerContainer() {
		return null;
	}
public void open(TestElement input) {
	setInput(input);
	super.open();
}
public void setInput(TestElement input) {
	fInput = input;
	if (getViewer() != null)
		getViewer().setInput(input);
}
	public void show2Panes() {
		fPanes= 2;
	}
protected abstract void viewerFillMenuBar(MenuManager mgr);
}
