/* * Jitsi, the OpenSource Java VoIP and Instant Messaging client. * * Copyright @ 2015 Atlassian Pty Ltd * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package net.java.sip.communicator.impl.gui.main.call; import java.awt.*; import java.util.*; import java.util.List; /** * Implements a <tt>LayoutManager</tt> for the full-screen <tt>Call</tt> * display. * * @author Lyubomir Marinov */ public class FullScreenLayout implements LayoutManager { public static final String CENTER = "CENTER"; public static final String SOUTH = "SOUTH"; private Component center; /** * The indicator which determines whether {@link #south} is to be laid out * on top of {@link #center} i.e. as an overlay. */ private final boolean overlay; private Component south; /** * The vertical gap between the center and the south components. */ private int yGap = 0; /** * Initializes a new <tt>FullScreenLayout</tt> instance. * * @param overlay <tt>true</tt> to lay out the <tt>Component</tt> at * {@link #SOUTH} on top of the <tt>Component</tt> at {@link #CENTER} i.e as * an overlay; otherwise, <tt>false</tt> * @oaram yGap the gap betwen the center and the south component */ public FullScreenLayout(boolean overlay, int yGap) { this.overlay = overlay; this.yGap = yGap; } /** * Adds the given component to this layout. * * @param name the name of the constraint (CENTER or SOUTH) * @param comp the component to add to this layout */ public void addLayoutComponent(String name, Component comp) { if (CENTER.equals(name)) center = comp; else if (SOUTH.equals(name)) south = comp; } /** * Gets a <tt>List</tt> of the <tt>Component</tt>s to be laid out by this * <tt>LayoutManager</tt> i.e. the non-<tt>null</tt> of {@link #center} * and {@link #south}. * * @return a <tt>List</tt> of the <tt>Component</tt>s to be laid out by this * <tt>LayoutManager</tt> */ private List<Component> getLayoutComponents() { List<Component> layoutComponents = new ArrayList<Component>(2); if (center != null) layoutComponents.add(center); if (south != null) layoutComponents.add(south); return layoutComponents; } /** * Lays out the components added in the given parent container * * @param parent the parent container to lay out */ public void layoutContainer(Container parent) { int southWidth; int southHeight; if (south == null) { southWidth = southHeight = 0; } else { Dimension southSize = south.getPreferredSize(); southWidth = southSize.width; southHeight = southSize.height; } Dimension parentSize = parent.getSize(); if (center != null) { /* * If the Component at the SOUTH is not to be shown as an overlay, * make room for it bellow the Component at the CENTER. */ int yOffset = overlay ? 0 : southHeight + yGap; center.setBounds( 0, 0, parentSize.width, parentSize.height - yOffset); } if (south != null) { south.setBounds( (parentSize.width - southWidth) / 2, parentSize.height - southHeight, southWidth, southHeight); } } public Dimension minimumLayoutSize(Container parent) { List<Component> components = getLayoutComponents(); Dimension size = new Dimension(0, 0); for (Component component : components) { Dimension componentSize = component.getMinimumSize(); size.width = Math.max(size.width, componentSize.width); if (overlay) size.height = Math.max(size.height, componentSize.height); else size.height += componentSize.height; } return size; } public Dimension preferredLayoutSize(Container parent) { List<Component> components = getLayoutComponents(); Dimension size = new Dimension(0, 0); for (Component component : components) { Dimension componentSize = component.getPreferredSize(); size.width = Math.max(size.width, componentSize.width); if (overlay) size.height = Math.max(size.height, componentSize.height); else size.height += componentSize.height; } return size; } public void removeLayoutComponent(Component comp) { if (comp.equals(center)) center = null; else if (comp.equals(south)) south = null; } }