/*
* The MIT License (MIT)
*
* Copyright (c) 2007-2015 Broad Institute
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
* in the Software without restriction, including without limitation the rights
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in
* all copies or substantial portions of the Software.
*
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
* THE SOFTWARE.
*/
package org.broad.igv.ui.panel;
import org.apache.log4j.Logger;
import javax.swing.*;
import javax.swing.border.Border;
import java.awt.*;
/**
* @author jrobinso
* @date Sep 9, 2010
*/
public class DataPanelLayout implements LayoutManager {
private static Logger log = Logger.getLogger(DataPanelLayout.class);
static final int default_hgap = 6;
static Border panelBorder = BorderFactory.createLineBorder(Color.gray);
public void addLayoutComponent(String s, Component component) {
// Not used
}
public void removeLayoutComponent(Component component) {
// Not used
}
/**
* Returns the preferred dimensions for this layout given the
* <i>visible</i> components in the specified target container.
*
* @param target the container that needs to be laid out
* * @return the preferred dimensions to lay out the
* subcomponents of the specified container
* @see Container
* @see #minimumLayoutSize
* @see java.awt.Container#getPreferredSize
*/
public Dimension preferredLayoutSize(Container target) {
synchronized (target.getTreeLock()) {
Dimension dim = new Dimension(0, 0);
//return dim;
int nmembers = target.getComponentCount();
boolean firstVisibleComponent = true;
for (int i = 0; i < nmembers; i++) {
Component m = target.getComponent(i);
if (m.isVisible()) {
Dimension d = m.getPreferredSize();
dim.height = Math.max(dim.height, d.height);
dim.width += d.width;
}
}
Insets insets = target.getInsets();
dim.width += insets.left + insets.right;
dim.height += insets.top + insets.bottom;
return dim;
}
}
public Dimension minimumLayoutSize(Container target) {
synchronized (target.getTreeLock()) {
return new Dimension(0, 0);
}
}
public void layoutContainer(Container container) {
synchronized (container.getTreeLock()) {
Component[] children = container.getComponents();
java.util.List<ReferenceFrame> frames = FrameManager.getFrames();
int h = container.getHeight();
int hgap = default_hgap;
if(frames.size() > 10) {
hgap = 1 + 20 / frames.size();
}
try {
//Sometimes the number of children is not the same as the number of frames.
//Not entirely sure why - Jacob S
for (int i = 0; i < Math.min(children.length, frames.size()); i++) {
Component c = children[i];
ReferenceFrame frame = frames.get(i);
int leftGap = i == 0 ? hgap/2 : hgap;
c.setBounds(frame.pixelX + leftGap, 0, frame.getWidthInPixels() - hgap, h);
if (c instanceof JComponent) {
if (frame.getWidthInPixels() > 5) {
((JComponent) c).setBorder(panelBorder);
} else {
((JComponent) c).setBorder(null);
}
}
log.trace("Layout: " + frame.getName() + " x=" + frame.pixelX + " w=" + frame.getWidthInPixels());
}
} catch (Exception e) {
log.error("Error laying out data panel", e);
}
}
}
}