/*******************************************************************************
 * Copyright (c) 2004, 2005 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.ui.tests.dnd;

import org.eclipse.ui.IViewPart;
import org.eclipse.ui.IViewReference;
import org.eclipse.ui.internal.dnd.TestDropLocation;
import org.eclipse.ui.tests.autotests.AbstractTestLogger;


/**
 * This class is used as test entries for 'Detached Window' tests (i.e. where the drop target is
 * in a detached window. It's 'doSetup' augments the base behaviour by 'detaching' a stack containing
 * two 'mock' views and separately detaching an individual view, making them appropriate drop targets
 * for these tests.
 * <p>
 * In some cases the sources and targets may overlap with non-detached tests so in order to avoid
 * name clashes in the tests we add a suffix, "(Detached)", to the test's 'name' when the target is
 * 'Detached'.  
 * <p>
 * @since 3.1
 *
 */
public class DetachedWindowDragTest	extends DragTest {
	
	public DetachedWindowDragTest(TestDragSource dragSource,
			TestDropLocation dropTarget, AbstractTestLogger log) {
		super(dragSource, dropTarget, log, " - detached");
	}
    
    public void doSetUp() throws Exception {
    	super.doSetUp();
    	
    	// First, show all the necessary views (note that we show view '2' first, this should
    	// make view '1' the active view in the folder
    	page.showView(DragDropPerspectiveFactory.dropViewId2);
    	page.showView(DragDropPerspectiveFactory.dropViewId1);
    	page.showView(DragDropPerspectiveFactory.dropViewId3);
    	
    	// Since we cannot yet 'detach' a view programmatically we'll have
    	// to do it the hard way...
    	
    	// 'detach' the whole stack containing the Mock view 1
    	IViewPart viewPart = page.showView(DragDropPerspectiveFactory.dropViewId1); 
        DragOperations.drag(viewPart, new DetachedDropTarget(), true);
    	
    	// Now we'll 'detach' Mock view 3
    	viewPart = page.showView(DragDropPerspectiveFactory.dropViewId3); 
        DragOperations.drag(viewPart, new DetachedDropTarget(), false);
    }

	protected void doTearDown() throws Exception {
		// hide detached views so they don't scare any following tests
		
		IViewReference view = page.findViewReference(DragDropPerspectiveFactory.dropViewId1);
		page.attachView(view);
//		page.hideView(view.getView(false));
		view = page.findViewReference(DragDropPerspectiveFactory.dropViewId2);
		page.attachView(view);
//		page.hideView(view.getView(false));
		view = page.findViewReference(DragDropPerspectiveFactory.dropViewId3);
		page.attachView(view);
//		page.hideView(view.getView(false));
		
		super.doTearDown();
	}
}
