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

import java.awt.Dimension;
import java.util.ArrayList;
import java.util.Iterator;

import javax.swing.BoxLayout;
import javax.swing.JPanel;
import javax.swing.border.Border;

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


/**
 * @author Christopher Butler
 */
public class Dockbar extends JPanel {
    protected int orientation;
    protected DockbarManager manager;
    protected ArrayList mDocks = new ArrayList();

    static {
        // make sure DockbarLabel is initialized
        Class c = DockbarLabel.class;
    }

    public static int getValidOrientation(int orient) {
        switch (orient) {
        case MinimizationManager.LEFT:
            return MinimizationManager.LEFT;
        case MinimizationManager.RIGHT:
            return MinimizationManager.RIGHT;
        case MinimizationManager.BOTTOM:
            return MinimizationManager.BOTTOM;
        default:
            return MinimizationManager.LEFT;
        }
    }

    public Dockbar(DockbarManager manager, int orientation) {
        this.manager = manager;
        setBorder(new SlideoutBorder());
        setOrientation(orientation);
    }

    void undock(Dockable dockable) {
        DockbarLabel label = getLabel(dockable);

        remove(label);
        mDocks.remove(label);
        getParent().validate();
        repaint();
    }

    public DockbarLabel getLabel(Dockable dockable) {
        if(dockable==null)
            return null;

        for (Iterator docks = mDocks.iterator(); docks.hasNext();) {
            DockbarLabel label = (DockbarLabel) docks.next();

            if (label.getDockable() == dockable)
                return label;
        } // for

        return null;
    }

    public boolean contains(Dockable dockable) {
        return getLabel(dockable)!=null;
    }

    public void dock(Dockable dockable) {
        if(dockable==null)
            return;

        DockbarLabel currentLabel = getLabel(dockable);
        if (currentLabel!=null) {
            currentLabel.setActive(false);
            return;
        }

        DockbarLabel newLabel = new DockbarLabel(dockable.getPersistentId(), getOrientation());
        add(newLabel);
        mDocks.add(newLabel);

        getParent().validate();
        repaint();
    }

    public int getOrientation() {
        return orientation;
    }

    private void setOrientation(int orientation) {
        orientation = getValidOrientation(orientation);
        this.orientation = orientation;

        Border border = getBorder();
        if(border instanceof SlideoutBorder)
            ((SlideoutBorder)border).setOrientation(orientation);

        int boxConstraint = orientation==MinimizationManager.TOP ||
                            orientation==MinimizationManager.BOTTOM? BoxLayout.LINE_AXIS: BoxLayout.PAGE_AXIS;
        setLayout(new BoxLayout(this, boxConstraint));
    }

    public Dimension getPreferredSize() {
        if(mDocks.size()==0)
            return new Dimension(0,0);

        DockbarLabel label = (DockbarLabel)getComponent(0);
        return label.getPreferredSize();
    }

    void activate(String dockableId, boolean lock) {
        if(manager!=null) {
            manager.setActiveDockable(dockableId);
            if(lock)
                manager.getActivationListener().lockViewpane();
        }
    }
}