diff usr/src/cmd/cmd-inet/usr.sadm/dhcpmgr/com/sun/dhcpmgr/ui/ProportionalLayout.java @ 0:c9caec207d52 b86

Initial porting based on b86
author Koji Uno <koji.uno@sun.com>
date Tue, 02 Jun 2009 18:56:50 +0900
parents
children 1a15d5aaf794
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/usr/src/cmd/cmd-inet/usr.sadm/dhcpmgr/com/sun/dhcpmgr/ui/ProportionalLayout.java	Tue Jun 02 18:56:50 2009 +0900
@@ -0,0 +1,146 @@
+/*
+ * CDDL HEADER START
+ *
+ * The contents of this file are subject to the terms of the
+ * Common Development and Distribution License, Version 1.0 only
+ * (the "License").  You may not use this file except in compliance
+ * with the License.
+ *
+ * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+ * or http://www.opensolaris.org/os/licensing.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ *
+ * When distributing Covered Code, include this CDDL HEADER in each
+ * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+ * If applicable, add the following below this CDDL HEADER, with the
+ * fields enclosed by brackets "[]" replaced with your own identifying
+ * information: Portions Copyright [yyyy] [name of copyright owner]
+ *
+ * CDDL HEADER END
+ */
+/*
+ * ident	"@(#)ProportionalLayout.java	1.3	05/06/08 SMI"
+ *
+ * Copyright (c) 1998-1999 by Sun Microsystems, Inc.
+ * All rights reserved.
+ */
+package com.sun.dhcpmgr.ui;
+
+import java.awt.*;
+import java.util.Hashtable;
+
+/**
+ * This layout manager provides a layout which allocates space either
+ * horizontally or vertically to components in proportion to a weight assigned
+ * to each component.  All components receive the same dimension along the
+ * other axis.
+ */
+public class ProportionalLayout implements LayoutManager {
+    /**
+     * Constant for a horizontal proportional layout.
+     */
+    public static final int HORIZONTAL = 0;
+    /**
+     * Constant for a vertical proportional layout.
+     */
+    public static final int VERTICAL = 1;
+    private int direction;
+    private Hashtable components;
+    private int totalWeight = 0;
+    
+    /**
+     * Construct a horizontal version of this layout.
+     */
+    public ProportionalLayout() {
+	this(HORIZONTAL);
+    }
+    
+    /**
+     * Construct a proportional layout in the direction specified.
+     * @param direction Must be either HORIZONTAL or VERTICAL
+     */
+    public ProportionalLayout(int direction) {
+	this.direction = direction;
+	components = new Hashtable();
+    }
+    
+    public void addLayoutComponent(String name, Component component) {
+	Integer weight;
+	try {
+	    weight = Integer.decode(name);
+	} catch (NumberFormatException e) {
+	    weight = new Integer(1);
+	}
+	totalWeight += weight.intValue();
+	components.put(component, weight);
+    }
+    
+    public void removeLayoutComponent(Component component) {
+	Integer weight = (Integer)components.get(component);
+	totalWeight -= weight.intValue();
+	components.remove(component);
+    }
+    
+    private Dimension computeLayoutSize(Container target, boolean minimum) {
+	Dimension dim = new Dimension(0, 0);
+	for (int i = 0; i < target.getComponentCount(); ++i) {
+	    Component c = target.getComponent(i);
+	    if (c.isVisible()) {
+		Dimension d;
+		if (minimum) {
+		    d = c.getMinimumSize();
+		} else {
+		    d = c.getPreferredSize();
+		}
+		if (direction == HORIZONTAL) {
+		    dim.height = Math.max(dim.height, d.height);
+		    dim.width += d.width;
+		} else {
+		    dim.height += d.height;
+		    dim.width = Math.max(dim.width, d.width);
+		}
+	    }
+	}
+	Insets insets = target.getInsets();
+	dim.width += insets.left + insets.right;
+	dim.height += insets.top + insets.bottom;
+	return dim;
+    }
+    
+    public Dimension preferredLayoutSize(Container target) {
+	return computeLayoutSize(target, false);
+    }
+    
+    public Dimension minimumLayoutSize(Container target) {
+	return computeLayoutSize(target, true);
+    }
+    
+    public void layoutContainer(Container target) {
+	Insets insets = target.getInsets();
+	Dimension dim = target.getSize();
+	int x = insets.left;
+	int y = insets.top;
+	int totalHeight = dim.height - insets.bottom;
+	int totalWidth = dim.width - insets.right;
+	
+	for (int i = 0; i < target.getComponentCount(); ++i) {
+	    Component c = target.getComponent(i);
+	    if (c.isVisible()) {
+		 if (direction == HORIZONTAL) {
+		    float fw = (float)totalWidth
+			* (float)((Integer)components.get(c)).intValue()
+			/ (float)totalWeight;
+		    c.setBounds(x, y, (int)fw, totalHeight);
+		    x += (int)fw;
+		} else {
+		    float fh = (float)totalHeight
+			* (float)((Integer)components.get(c)).intValue()
+			/ (float)totalWeight;
+		    c.setBounds(x, y, totalWidth, (int)fh);
+		    y += (int)fh;
+		}
+	    }
+	}
+    }
+}