/*
 * Created on Apr 18, 2005
 */
package org.flexdock.dockbar;

import java.awt.BorderLayout;
import java.awt.Component;
import java.awt.Cursor;
import java.awt.Dimension;

import javax.swing.JPanel;
import javax.swing.border.Border;
import javax.swing.event.MouseInputAdapter;

import org.flexdock.dockbar.event.ResizeListener;
import org.flexdock.docking.Dockable;
import org.flexdock.docking.state.MinimizationManager;
import org.flexdock.plaf.common.border.SlideoutBorder;

/**
 * @author Christopher Butler
 */
public class ViewPane extends JPanel {
	private static final Dimension RESIZE_DIMS = new Dimension(3, 3);
	private static final MouseInputAdapter EMPTY_MOUSE_LISTENER = new MouseInputAdapter() {};
	public static final int UNSPECIFIED_PREFERRED_SIZE = -1;
	private DockbarManager manager;
	private JPanel dragEdge;
	private int prefSize;
	private boolean locked;

	
	public ViewPane(DockbarManager mgr) {
		super(new BorderLayout(0, 0));
		setBorder(new SlideoutBorder());
		
		manager = mgr;
		prefSize = UNSPECIFIED_PREFERRED_SIZE;
		
		dragEdge = new JPanel();
		dragEdge.setPreferredSize(RESIZE_DIMS);
		
		ResizeListener listener = new ResizeListener(mgr);
		dragEdge.addMouseListener(listener);
		dragEdge.addMouseMotionListener(listener);
		
		updateOrientation();
		
		// intercept rouge mouse events so they don't fall 
		// through to the content pane
		addMouseListener(EMPTY_MOUSE_LISTENER);
		addMouseMotionListener(EMPTY_MOUSE_LISTENER);
	}


	
	public void updateContents() {
		// remove the currently docked component
		Component[] children = getComponents();
		for(int i=0; i<children.length; i++) {
			if(children[i]!=dragEdge)
				remove(children[i]);
		}

		// add the new component
		Dockable d = manager.getActiveDockable();
		Component c = d==null? null: d.getComponent();
		if(c!=null)
			add(c, BorderLayout.CENTER);
	}

	
	public void updateOrientation() {
		Border border = getBorder();
		if(border instanceof SlideoutBorder)
			((SlideoutBorder)border).setOrientation(manager.getActiveEdge());
		
		// update the drag edge
		remove(dragEdge);
		add(dragEdge, getEdgeRegion());
		dragEdge.setCursor(getResizeCursor());

		// revalidate
		revalidate();
	}
	
	private String getEdgeRegion() {
		int orientation = manager.getActiveEdge();
		switch(orientation) {
			case MinimizationManager.TOP:
				return BorderLayout.SOUTH;
			case MinimizationManager.BOTTOM:
				return BorderLayout.NORTH;
			case MinimizationManager.RIGHT:
				return BorderLayout.WEST;
			default:
				return BorderLayout.EAST;
		}
	}
	
	public Cursor getResizeCursor() {
		int orientation = manager.getActiveEdge();
		return orientation==MinimizationManager.LEFT || 
				orientation==MinimizationManager.RIGHT? 
				Cursor.getPredefinedCursor(Cursor.E_RESIZE_CURSOR): 
				Cursor.getPredefinedCursor(Cursor.N_RESIZE_CURSOR);
	}
	
	public int getPrefSize() {
		return prefSize;
	}
	public void setPrefSize(int prefSize) {
		this.prefSize = prefSize;
	}
	public boolean isLocked() {
		return locked;
	}
	public void setLocked(boolean locked) {
		this.locked = locked;
	}
}
