All Downloads are FREE. Search and download functionalities are using the official Maven repository.

com.alee.extended.dock.DockingPaneInfo Maven / Gradle / Ivy

Go to download

WebLaf is a Java Swing Look and Feel and extended components library for cross-platform applications

There is a newer version: 2.2.1
Show newest version
/*
 * This file is part of WebLookAndFeel library.
 *
 * WebLookAndFeel library is free software: you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation, either version 3 of the License, or
 * (at your option) any later version.
 *
 * WebLookAndFeel library is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with WebLookAndFeel library.  If not, see .
 */

package com.alee.extended.dock;

import com.alee.utils.swing.ZOrderComparator;

import java.awt.*;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Map;

/**
 * DockingPaneLayout information.
 *
 * @author Mikle Garin
 */

public class DockingPaneInfo implements DockingPaneConstants
{
    private static final ZOrderComparator comparator = new ZOrderComparator ();
    private static final int initialCalcArraysSize = 2;

    public Map constraints;
    public Insets buttonsMargin;
    public int buttonSpacing;
    public int buttonSidesSpacing;
    public Insets framesMargin;
    public Insets contentMargin;

    public Insets margin;
    public Rectangle rect;

    public boolean hasTopButtons;
    public List topLeftButtons;
    public Dimension topLeftButtonsSize;
    public List topRightButtons;
    public Dimension topRightButtonsSize;
    public Dimension topButtonsSize;
    public Rectangle topButtonsPaneBounds;

    public boolean hasLeftButtons;
    public List leftTopButtons;
    public Dimension leftTopButtonsSize;
    public List leftBottomButtons;
    public Dimension leftBottomButtonsSize;
    public Dimension leftButtonsSize;
    public Rectangle leftButtonsPaneBounds;

    public boolean hasRightButtons;
    public List rightTopButtons;
    public Dimension rightTopButtonsSize;
    public List rightBottomButtons;
    public Dimension rightBottomButtonsSize;
    public Dimension rightButtonsSize;
    public Rectangle rightButtonsPaneBounds;

    public boolean hasBottomButtons;
    public List bottomLeftButtons;
    public Dimension bottomLeftButtonsSize;
    public List bottomRightButtons;
    public Dimension bottomRightButtonsSize;
    public Dimension bottomButtonsSize;
    public Rectangle bottomButtonsPaneBounds;

    public Component topFrame;
    public Rectangle topFrameBounds;
    public Component leftFrame;
    public Rectangle leftFrameBounds;
    public Component rightFrame;
    public Rectangle rightFrameBounds;
    public Component bottomFrame;
    public Rectangle bottomFrameBounds;

    public Component content;
    public Rectangle contentBounds;

    public DockingPaneInfo ( final DockingPaneLayout layout, final Container parent )
    {
        super ();

        // Used layout variables
        constraints = layout.getConstraints ();
        buttonsMargin = layout.getButtonsMargin ();
        buttonSpacing = layout.getButtonSpacing ();
        buttonSidesSpacing = layout.getButtonSidesSpacing ();
        framesMargin = layout.getFramesMargin ();
        contentMargin = layout.getContentMargin ();

        // Container border
        margin = parent.getInsets ();
        rect = new Rectangle ( margin.left, margin.top, parent.getWidth () - margin.left - margin.right,
                parent.getHeight () - margin.top - margin.bottom );

        // Collecting various side components
        topLeftButtons = new ArrayList ( initialCalcArraysSize );
        topRightButtons = new ArrayList ( initialCalcArraysSize );
        leftTopButtons = new ArrayList ( initialCalcArraysSize );
        leftBottomButtons = new ArrayList ( initialCalcArraysSize );
        rightTopButtons = new ArrayList ( initialCalcArraysSize );
        rightBottomButtons = new ArrayList ( initialCalcArraysSize );
        bottomLeftButtons = new ArrayList ( initialCalcArraysSize );
        bottomRightButtons = new ArrayList ( initialCalcArraysSize );
        topFrame = null;
        leftFrame = null;
        rightFrame = null;
        bottomFrame = null;
        content = null;
        for ( final Component component : constraints.keySet () )
        {
            if ( constraints.get ( component ).equals ( TOP_LEFT ) )
            {
                topLeftButtons.add ( component );
            }
            else if ( constraints.get ( component ).equals ( TOP_RIGHT ) )
            {
                topRightButtons.add ( component );
            }
            else if ( constraints.get ( component ).equals ( LEFT_TOP ) )
            {
                leftTopButtons.add ( component );
            }
            else if ( constraints.get ( component ).equals ( LEFT_BOTTOM ) )
            {
                leftBottomButtons.add ( component );
            }
            else if ( constraints.get ( component ).equals ( RIGHT_TOP ) )
            {
                rightTopButtons.add ( component );
            }
            else if ( constraints.get ( component ).equals ( RIGHT_BOTTOM ) )
            {
                rightBottomButtons.add ( component );
            }
            else if ( constraints.get ( component ).equals ( BOTTOM_LEFT ) )
            {
                bottomLeftButtons.add ( component );
            }
            else if ( constraints.get ( component ).equals ( BOTTOM_RIGHT ) )
            {
                bottomRightButtons.add ( component );
            }
            else if ( constraints.get ( component ).equals ( TOP_FRAME ) )
            {
                topFrame = component;
            }
            else if ( constraints.get ( component ).equals ( LEFT_FRAME ) )
            {
                leftFrame = component;
            }
            else if ( constraints.get ( component ).equals ( RIGHT_FRAME ) )
            {
                rightFrame = component;
            }
            else if ( constraints.get ( component ).equals ( BOTTOM_FRAME ) )
            {
                bottomFrame = component;
            }
            else if ( constraints.get ( component ).equals ( CONTENT ) )
            {
                content = component;
            }
        }
        Collections.sort ( topLeftButtons, comparator );
        Collections.sort ( topRightButtons, comparator );
        Collections.sort ( leftTopButtons, comparator );
        Collections.sort ( leftBottomButtons, comparator );
        Collections.sort ( rightTopButtons, comparator );
        Collections.sort ( rightBottomButtons, comparator );
        Collections.sort ( bottomLeftButtons, comparator );
        Collections.sort ( bottomRightButtons, comparator );

        // Button panes sizes

        boolean twoSided;

        twoSided = topLeftButtons.size () > 0 && topRightButtons.size () > 0;
        hasTopButtons = topLeftButtons.size () > 0 || topRightButtons.size () > 0;
        topLeftButtonsSize = hasTopButtons ? getSideSize ( TOP_LEFT, topLeftButtons ) : new Dimension ( 0, 0 );
        topRightButtonsSize = hasTopButtons ? getSideSize ( TOP_RIGHT, topRightButtons ) : new Dimension ( 0, 0 );
        topButtonsSize = hasTopButtons ? new Dimension ( topLeftButtonsSize.width + ( twoSided ? buttonSidesSpacing : 0 ) +
                topRightButtonsSize.width, Math.max ( topLeftButtonsSize.height, topRightButtonsSize.height ) ) : new Dimension ( 0, 0 );

        twoSided = leftTopButtons.size () > 0 && leftBottomButtons.size () > 0;
        hasLeftButtons = leftTopButtons.size () > 0 || leftBottomButtons.size () > 0;
        leftTopButtonsSize = hasLeftButtons ? getSideSize ( LEFT_TOP, leftTopButtons ) : new Dimension ( 0, 0 );
        leftBottomButtonsSize = hasLeftButtons ? getSideSize ( LEFT_BOTTOM, leftBottomButtons ) : new Dimension ( 0, 0 );
        leftButtonsSize = hasLeftButtons ? new Dimension ( Math.max ( leftTopButtonsSize.width, leftBottomButtonsSize.width ),
                leftTopButtonsSize.height + ( twoSided ? buttonSidesSpacing : 0 ) +
                        leftBottomButtonsSize.height
        ) : new Dimension ( 0, 0 );

        twoSided = rightTopButtons.size () > 0 && rightBottomButtons.size () > 0;
        hasRightButtons = rightTopButtons.size () > 0 || rightBottomButtons.size () > 0;
        rightTopButtonsSize = hasRightButtons ? getSideSize ( LEFT_TOP, rightTopButtons ) : new Dimension ( 0, 0 );
        rightBottomButtonsSize = hasRightButtons ? getSideSize ( LEFT_BOTTOM, rightBottomButtons ) : new Dimension ( 0, 0 );
        rightButtonsSize = hasRightButtons ? new Dimension ( Math.max ( rightTopButtonsSize.width, rightBottomButtonsSize.width ),
                rightTopButtonsSize.height + ( twoSided ? buttonSidesSpacing : 0 ) +
                        rightBottomButtonsSize.height
        ) : new Dimension ( 0, 0 );

        twoSided = bottomLeftButtons.size () > 0 && bottomRightButtons.size () > 0;
        hasBottomButtons = bottomLeftButtons.size () > 0 || bottomRightButtons.size () > 0;
        bottomLeftButtonsSize = hasBottomButtons ? getSideSize ( BOTTOM_LEFT, bottomLeftButtons ) : new Dimension ( 0, 0 );
        bottomRightButtonsSize = hasBottomButtons ? getSideSize ( BOTTOM_RIGHT, bottomRightButtons ) : new Dimension ( 0, 0 );
        bottomButtonsSize = hasBottomButtons ? new Dimension ( bottomLeftButtonsSize.width + ( twoSided ? buttonSidesSpacing : 0 ) +
                bottomRightButtonsSize.width, Math.max ( bottomLeftButtonsSize.height, bottomRightButtonsSize.height ) ) :
                new Dimension ( 0, 0 );

        // Content parts bounds update
        updateBounds ();
    }

    public void updateBounds ()
    {
        // Button panes bounds
        topButtonsPaneBounds = hasTopButtons ?
                new Rectangle ( rect.x, rect.y, rect.width, buttonsMargin.top + topButtonsSize.height + buttonsMargin.bottom ) :
                new Rectangle ( 0, 0 );
        bottomButtonsPaneBounds =
                hasBottomButtons ? new Rectangle ( rect.x, rect.y + rect.height - buttonsMargin.top - bottomButtonsSize.height -
                        buttonsMargin.bottom, rect.width, buttonsMargin.top + bottomButtonsSize.height + buttonsMargin.bottom ) :
                        new Rectangle ( 0, 0 );
        leftButtonsPaneBounds = hasLeftButtons ? new Rectangle ( rect.x, rect.y + topButtonsPaneBounds.height,
                buttonsMargin.left + leftButtonsSize.width + buttonsMargin.right, rect.height - topButtonsPaneBounds.height -
                bottomButtonsPaneBounds.height
        ) : new Rectangle ( 0, 0 );
        rightButtonsPaneBounds = hasRightButtons ? new Rectangle ( rect.x + rect.width - buttonsMargin.left - rightButtonsSize.width -
                buttonsMargin.right, rect.y + topButtonsPaneBounds.height,
                buttonsMargin.left + rightButtonsSize.width + buttonsMargin.right, rect.height - topButtonsPaneBounds.height -
                bottomButtonsPaneBounds.height
        ) : new Rectangle ( 0, 0 );

        // Frames bounds
        // Additional 1px added @ each side that has buttons
        final int topBonus = ( hasTopButtons ? 1 : 0 ) + framesMargin.top;
        final int leftBonus = ( hasLeftButtons ? 1 : 0 ) + framesMargin.left;
        final int rightBonus = ( hasRightButtons ? 1 : 0 ) + framesMargin.right;
        final int bottomBonus = ( hasBottomButtons ? 1 : 0 ) + framesMargin.bottom;
        final Dimension tfps = topFrame != null ? topFrame.getPreferredSize () : null;
        topFrameBounds = topFrame != null ?
                new Rectangle ( rect.x + leftButtonsPaneBounds.width + leftBonus, rect.y + topButtonsPaneBounds.height + topBonus,
                        rect.width - leftButtonsPaneBounds.width - rightButtonsPaneBounds.width -
                                leftBonus - rightBonus, tfps.height
                ) : new Rectangle ( 0, 0 );
        final Dimension bfps = bottomFrame != null ? bottomFrame.getPreferredSize () : null;
        bottomFrameBounds = bottomFrame != null ?
                new Rectangle ( rect.x + leftButtonsPaneBounds.width + leftBonus, rect.y + rect.height - bottomButtonsPaneBounds.height -
                        bottomBonus - bfps.height, rect.width - leftButtonsPaneBounds.width - rightButtonsPaneBounds.width -
                        leftBonus - rightBonus, bfps.height ) : new Rectangle ( 0, 0 );
        final Dimension lfps = leftFrame != null ? leftFrame.getPreferredSize () : null;
        leftFrameBounds =
                leftFrame != null ? new Rectangle ( rect.x + leftButtonsPaneBounds.width + leftBonus, rect.y + topButtonsPaneBounds.height +
                        topBonus + topFrameBounds.height, lfps.width, rect.height - topButtonsPaneBounds.height - topBonus -
                        topFrameBounds.height -
                        bottomButtonsPaneBounds.height - bottomBonus -
                        bottomFrameBounds.height ) : new Rectangle ( 0, 0 );
        final Dimension rfps = rightFrame != null ? rightFrame.getPreferredSize () : null;
        rightFrameBounds = rightFrame != null ? new Rectangle ( rect.x + rect.width - rightButtonsPaneBounds.width - rightBonus -
                rfps.width, rect.y + topButtonsPaneBounds.height +
                topBonus + topFrameBounds.height, rfps.width, rect.height - topButtonsPaneBounds.height - topBonus -
                topFrameBounds.height -
                bottomButtonsPaneBounds.height - bottomBonus -
                bottomFrameBounds.height ) : new Rectangle ( 0, 0 );

        // Content bounds
        contentBounds = content != null ? new Rectangle ( rect.x + leftButtonsPaneBounds.width + leftBonus +
                leftFrameBounds.width + contentMargin.left, rect.y + topButtonsPaneBounds.height + topBonus +
                topFrameBounds.height + contentMargin.top, rect.width - leftButtonsPaneBounds.width - rightButtonsPaneBounds.width -
                leftBonus - rightBonus -
                leftFrameBounds.width - rightFrameBounds.width -
                contentMargin.left - contentMargin.right, rect.height - topButtonsPaneBounds.height - bottomButtonsPaneBounds.height -
                topBonus - bottomBonus -
                topFrameBounds.height - bottomFrameBounds.height -
                contentMargin.top - contentMargin.bottom ) : null;
    }

    private Dimension getSideSize ( final String side, final List components )
    {
        final Dimension size = new Dimension ( 0, 0 );
        if ( side.startsWith ( "TOP" ) || side.startsWith ( "BOTTOM" ) )
        {
            // Horizontal buttons bar
            for ( final Component button : components )
            {
                final Dimension ps = button.getPreferredSize ();
                size.width += ps.width + buttonSpacing;
                size.height = Math.max ( size.height, ps.height );
            }
            if ( components.size () > 0 )
            {
                size.width -= buttonSpacing;
            }
        }
        else
        {
            // Vertical buttons bar
            for ( final Component button : components )
            {
                final Dimension ps = button.getPreferredSize ();
                size.height += ps.height + buttonSpacing;
                size.width = Math.max ( size.width, ps.width );
            }
            if ( components.size () > 0 )
            {
                size.height -= buttonSpacing;
            }
        }
        return size;
    }
}




© 2015 - 2024 Weber Informatics LLC | Privacy Policy