/** * @(#)PaletteRootPaneUI.java * * Copyright (c) 2008 The authors and contributors of JHotDraw. * You may not use, copy or modify this file, except in compliance with the * accompanying license terms. */ package org.jhotdraw.gui.plaf.palette; import java.awt.*; import java.io.Serializable; import javax.swing.*; import javax.swing.plaf.*; import javax.swing.plaf.basic.BasicRootPaneUI; /** * PaletteRootPaneUI. * * @author Werner Randelshofer * @version $Id$ */ public class PaletteRootPaneUI extends BasicRootPaneUI { private static RootPaneUI rootPaneUI = new PaletteRootPaneUI(); public static ComponentUI createUI(JComponent c) { return rootPaneUI; } @Override public void installUI(JComponent c) { super.installUI(c); c.setLayout(new PaletteRootLayout((JRootPane) c)); } /** * A custom layout manager that is responsible for the layout of * layeredPane, glassPane, and menuBar. * <p> * <strong>Warning:</strong> * Serialized objects of this class will not be compatible with * future Swing releases. The current serialization support is * appropriate for short term storage or RMI between applications running * the same version of Swing. As of 1.4, support for long term storage * of all JavaBeans<sup><font size="-2">TM</font></sup> * has been added to the <code>java.beans</code> package. * Please see {@link java.beans.XMLEncoder}. */ protected static class PaletteRootLayout implements LayoutManager2, Serializable { private static final long serialVersionUID = 1L; private JRootPane rootPane; public PaletteRootLayout(JRootPane rootPane) { this.rootPane = rootPane; } /** * Returns the amount of space the layout would like to have. * * @param parent the Container for which this layout manager * is being used * @return a Dimension object containing the layout's preferred size */ @Override public Dimension preferredLayoutSize(Container parent) { Dimension rd, mbd; Insets i = rootPane.getInsets(); Container contentPane = rootPane.getContentPane(); JMenuBar menuBar = rootPane.getJMenuBar(); if (contentPane.isVisible()) { rd = contentPane.getPreferredSize(); } else { rd = new Dimension(0, contentPane.getPreferredSize().height); } if (menuBar != null && menuBar.isVisible()) { mbd = menuBar.getPreferredSize(); } else { mbd = new Dimension(0, 0); } return new Dimension(Math.max(rd.width, mbd.width) + i.left + i.right, rd.height + mbd.height + i.top + i.bottom); } /** * Returns the minimum amount of space the layout needs. * * @param parent the Container for which this layout manager * is being used * @return a Dimension object containing the layout's minimum size */ public Dimension minimumLayoutSize(Container parent) { Dimension rd, mbd; Insets i = rootPane.getInsets(); Container contentPane = rootPane.getContentPane(); JMenuBar menuBar = rootPane.getJMenuBar(); if (contentPane != null && contentPane.isVisible()) { rd = contentPane.getMinimumSize(); } else if (contentPane != null) { rd = new Dimension(0, contentPane.getPreferredSize().height); } else { rd = new Dimension(0,0); } if (menuBar != null && menuBar.isVisible()) { mbd = menuBar.getMinimumSize(); } else { mbd = new Dimension(0, 0); } return new Dimension(Math.max(rd.width, mbd.width) + i.left + i.right, rd.height + mbd.height + i.top + i.bottom); } /** * Returns the maximum amount of space the layout can use. * * @param target the Container for which this layout manager * is being used * @return a Dimension object containing the layout's maximum size */ public Dimension maximumLayoutSize(Container target) { Dimension rd, mbd; Insets i = rootPane.getInsets(); Container contentPane = rootPane.getContentPane(); JMenuBar menuBar = rootPane.getJMenuBar(); if (menuBar != null && menuBar.isVisible()) { mbd = menuBar.getMaximumSize(); } else { mbd = new Dimension(0, 0); } if (contentPane != null && contentPane.isVisible()) { rd = contentPane.getMaximumSize(); } else { // This is silly, but should stop an overflow error rd = new Dimension(Integer.MAX_VALUE, Integer.MAX_VALUE - i.top - i.bottom - mbd.height - 1); } return new Dimension(Math.min(rd.width, mbd.width) + i.left + i.right, rd.height + mbd.height + i.top + i.bottom); } /** * Instructs the layout manager to perform the layout for the specified * container. * * @param parent the Container for which this layout manager * is being used */ public void layoutContainer(Container parent) { Rectangle b = parent.getBounds(); Insets i = rootPane.getInsets(); JLayeredPane layeredPane = rootPane.getLayeredPane(); Component glassPane = rootPane.getGlassPane(); Container contentPane = rootPane.getContentPane(); JMenuBar menuBar = rootPane.getJMenuBar(); int contentY = 0; int w = b.width - i.right - i.left; int h = b.height - i.top - i.bottom; if (layeredPane != null) { layeredPane.setBounds(i.left, i.top, w, h); } if (glassPane != null) { glassPane.setBounds(i.left, i.top, w, h); } // Note: This is laying out the children in the layeredPane, // technically, these are not our children. if (menuBar != null && menuBar.isVisible()) { Dimension mbd = menuBar.getPreferredSize(); menuBar.setBounds(0, 0, w, mbd.height); contentY += mbd.height; } if (contentPane != null) { contentPane.setBounds(0, contentY, w, h - contentY); } } public void addLayoutComponent(String name, Component comp) { } public void removeLayoutComponent(Component comp) { } public void addLayoutComponent(Component comp, Object constraints) { } public float getLayoutAlignmentX(Container target) { return 0.0f; } public float getLayoutAlignmentY(Container target) { return 0.0f; } public void invalidateLayout(Container target) { } } }