1 /* 2 * CDDL HEADER START 3 * 4 * The contents of this file are subject to the terms of the 5 * Common Development and Distribution License, Version 1.0 only 6 * (the "License"). You may not use this file except in compliance 7 * with the License. 8 * 9 * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE 10 * or http://www.opensolaris.org/os/licensing. 11 * See the License for the specific language governing permissions 12 * and limitations under the License. 13 * 14 * When distributing Covered Code, include this CDDL HEADER in each 15 * file and include the License file at usr/src/OPENSOLARIS.LICENSE. 16 * If applicable, add the following below this CDDL HEADER, with the 17 * fields enclosed by brackets "[]" replaced with your own identifying 18 * information: Portions Copyright [yyyy] [name of copyright owner] 19 * 20 * CDDL HEADER END 21 */ 22 /* 23 * ident "%Z%%M% %I% %E% SMI" 24 * 25 * Copyright (c) 1998-1999 by Sun Microsystems, Inc. 26 * All rights reserved. 27 */ 28 package com.sun.dhcpmgr.ui; 29 30 import java.awt.*; 31 import java.util.Hashtable; 32 33 /** 34 * This layout manager provides a layout which allocates space either 35 * horizontally or vertically to components in proportion to a weight assigned 36 * to each component. All components receive the same dimension along the 37 * other axis. 38 */ 39 public class ProportionalLayout implements LayoutManager { 40 /** 41 * Constant for a horizontal proportional layout. 42 */ 43 public static final int HORIZONTAL = 0; 44 /** 45 * Constant for a vertical proportional layout. 46 */ 47 public static final int VERTICAL = 1; 48 private int direction; 49 private Hashtable components; 50 private int totalWeight = 0; 51 52 /** 53 * Construct a horizontal version of this layout. 54 */ 55 public ProportionalLayout() { 56 this(HORIZONTAL); 57 } 58 59 /** 60 * Construct a proportional layout in the direction specified. 61 * @param direction Must be either HORIZONTAL or VERTICAL 62 */ 63 public ProportionalLayout(int direction) { 64 this.direction = direction; 65 components = new Hashtable(); 66 } 67 68 public void addLayoutComponent(String name, Component component) { 69 Integer weight; 70 try { 71 weight = Integer.decode(name); 72 } catch (NumberFormatException e) { 73 weight = new Integer(1); 74 } 75 totalWeight += weight.intValue(); 76 components.put(component, weight); 77 } 78 79 public void removeLayoutComponent(Component component) { 80 Integer weight = (Integer)components.get(component); 81 totalWeight -= weight.intValue(); 82 components.remove(component); 83 } 84 85 private Dimension computeLayoutSize(Container target, boolean minimum) { 86 Dimension dim = new Dimension(0, 0); 87 for (int i = 0; i < target.getComponentCount(); ++i) { 88 Component c = target.getComponent(i); 89 if (c.isVisible()) { 90 Dimension d; 91 if (minimum) { 92 d = c.getMinimumSize(); 93 } else { 94 d = c.getPreferredSize(); 95 } 96 if (direction == HORIZONTAL) { 97 dim.height = Math.max(dim.height, d.height); 98 dim.width += d.width; 99 } else { 100 dim.height += d.height; 101 dim.width = Math.max(dim.width, d.width); 102 } 103 } 104 } 105 Insets insets = target.getInsets(); 106 dim.width += insets.left + insets.right; 107 dim.height += insets.top + insets.bottom; 108 return dim; 109 } 110 111 public Dimension preferredLayoutSize(Container target) { 112 return computeLayoutSize(target, false); 113 } 114 115 public Dimension minimumLayoutSize(Container target) { 116 return computeLayoutSize(target, true); 117 } 118 119 public void layoutContainer(Container target) { 120 Insets insets = target.getInsets(); 121 Dimension dim = target.getSize(); 122 int x = insets.left; 123 int y = insets.top; 124 int totalHeight = dim.height - insets.bottom; 125 int totalWidth = dim.width - insets.right; 126 127 for (int i = 0; i < target.getComponentCount(); ++i) { 128 Component c = target.getComponent(i); 129 if (c.isVisible()) { 130 if (direction == HORIZONTAL) { 131 float fw = (float)totalWidth 132 * (float)((Integer)components.get(c)).intValue() 133 / (float)totalWeight; 134 c.setBounds(x, y, (int)fw, totalHeight); 135 x += (int)fw; 136 } else { 137 float fh = (float)totalHeight 138 * (float)((Integer)components.get(c)).intValue() 139 / (float)totalWeight; 140 c.setBounds(x, y, totalWidth, (int)fh); 141 y += (int)fh; 142 } 143 } 144 } 145 } 146 }