summaryrefslogtreecommitdiff
path: root/prototypes/miglayout/net/miginfocom/swing
diff options
context:
space:
mode:
authorGraeme Geldenhuys <graeme@mastermaths.co.za>2012-11-22 11:48:47 +0000
committerGraeme Geldenhuys <graeme@mastermaths.co.za>2012-11-22 11:48:47 +0000
commitaf45f95f16cee22f8f012f706f4d0a42eaeb68fa (patch)
treec572c1cc6a7d3bb12874d8f9b9363312b275e328 /prototypes/miglayout/net/miginfocom/swing
parent9c62dfaf7217557f08a3d33b20bb302874960f87 (diff)
downloadfpGUI-af45f95f16cee22f8f012f706f4d0a42eaeb68fa.tar.xz
Fixes line ending issues
Diffstat (limited to 'prototypes/miglayout/net/miginfocom/swing')
-rw-r--r--prototypes/miglayout/net/miginfocom/swing/MigLayout.java1096
-rw-r--r--prototypes/miglayout/net/miginfocom/swing/SwingComponentWrapper.java852
-rw-r--r--prototypes/miglayout/net/miginfocom/swing/SwingContainerWrapper.java216
3 files changed, 1082 insertions, 1082 deletions
diff --git a/prototypes/miglayout/net/miginfocom/swing/MigLayout.java b/prototypes/miglayout/net/miginfocom/swing/MigLayout.java
index 7444e9d9..48a6119b 100644
--- a/prototypes/miglayout/net/miginfocom/swing/MigLayout.java
+++ b/prototypes/miglayout/net/miginfocom/swing/MigLayout.java
@@ -1,549 +1,549 @@
-package net.miginfocom.swing;
-/*
- * License (BSD):
- * ==============
- *
- * Copyright (c) 2004, Mikael Grev, MiG InfoCom AB. (miglayout (at) miginfocom (dot) com)
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without modification,
- * are permitted provided that the following conditions are met:
- * Redistributions of source code must retain the above copyright notice, this list
- * of conditions and the following disclaimer.
- * Redistributions in binary form must reproduce the above copyright notice, this
- * list of conditions and the following disclaimer in the documentation and/or other
- * materials provided with the distribution.
- * Neither the name of the MiG InfoCom AB nor the names of its contributors may be
- * used to endorse or promote products derived from this software without specific
- * prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
- * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
- * IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
- * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
- * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA,
- * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
- * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
- * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY
- * OF SUCH DAMAGE.
- *
- * @version 1.0
- * @author Mikael Grev, MiG InfoCom AB
- * Date: 2006-sep-08
- */
-
-import net.miginfocom.layout.*;
-
-import javax.swing.*;
-import java.awt.*;
-import java.awt.event.ActionEvent;
-import java.awt.event.ActionListener;
-import java.io.*;
-import java.util.*;
-
-/** A very flexbile layout manager.
- * <p>
- * Read the documentation that came with this layout manager for information on usage.
- */
-public final class MigLayout implements LayoutManager2, Externalizable
-{
- // ******** Instance part ********
-
- /** The component to string constraints mappings.
- */
- private final Map<Component, Object> scrConstrMap = new IdentityHashMap<Component, Object>(8);
-
- /** Hold the serializable text representation of the constraints.
- */
- private Object layoutConstraints = "", colConstraints = "", rowConstraints = ""; // Should never be null!
-
-
- // ******** Transient part ********
-
- private transient ContainerWrapper cacheParentW = null;
-
- private transient final Map<ComponentWrapper, CC> ccMap = new HashMap<ComponentWrapper, CC>(8);
- private transient javax.swing.Timer debugTimer = null;
-
- private transient LC lc = null;
- private transient AC colSpecs = null, rowSpecs = null;
- private transient Grid grid = null;
- private transient int lastModCount = PlatformDefaults.getModCount();
- private transient int lastHash = -1;
- private transient Dimension lastInvalidSize = null;
-
- private transient ArrayList<LayoutCallback> callbackList = null;
-
- /** Constructor with no constraints.
- */
- public MigLayout()
- {
- this("", "", "");
- }
-
- /** Constructor.
- * @param layoutConstraints The constraints that concern the whole layout. <code>null</code> will be treated as "".
- */
- public MigLayout(String layoutConstraints)
- {
- this(layoutConstraints, "", "");
- }
-
- /** Constructor.
- * @param layoutConstraints The constraints that concern the whole layout. <code>null</code> will be treated as "".
- * @param colConstraints The constraints for the columns in the grid. <code>null</code> will be treated as "".
- */
- public MigLayout(String layoutConstraints, String colConstraints)
- {
- this(layoutConstraints, colConstraints, "");
- }
-
- /** Constructor.
- * @param layoutConstraints The constraints that concern the whole layout. <code>null</code> will be treated as "".
- * @param colConstraints The constraints for the columns in the grid. <code>null</code> will be treated as "".
- * @param rowConstraints The constraints for the rows in the grid. <code>null</code> will be treated as "".
- */
- public MigLayout(String layoutConstraints, String colConstraints, String rowConstraints)
- {
- setLayoutConstraints(layoutConstraints);
- setColumnConstraints(colConstraints);
- setRowConstraints(rowConstraints);
- }
-
- /** Constructor.
- * @param layoutConstraints The constraints that concern the whole layout. <code>null</code> will be treated as an empty cosntraint.
- */
- public MigLayout(LC layoutConstraints)
- {
- this(layoutConstraints, null, null);
- }
-
- /** Constructor.
- * @param layoutConstraints The constraints that concern the whole layout. <code>null</code> will be treated as an empty cosntraint.
- * @param colConstraints The constraints for the columns in the grid. <code>null</code> will be treated as an empty constraint.
- */
- public MigLayout(LC layoutConstraints, AC colConstraints)
- {
- this(layoutConstraints, colConstraints, null);
- }
-
- /** Constructor.
- * @param layoutConstraints The constraints that concern the whole layout. <code>null</code> will be treated as an empty cosntraint.
- * @param colConstraints The constraints for the columns in the grid. <code>null</code> will be treated as an empty constraint.
- * @param rowConstraints The constraints for the rows in the grid. <code>null</code> will be treated as an empty constraint.
- */
- public MigLayout(LC layoutConstraints, AC colConstraints, AC rowConstraints)
- {
- setLayoutConstraints(layoutConstraints);
- setColumnConstraints(colConstraints);
- setRowConstraints(rowConstraints);
- }
-
- /** Returns layout constraints eighter as a <code>String</code> or {@link net.miginfocom.layout.LC} depending what was sent in
- * to the constructor or set with {@link #setLayoutConstraints(Object)}.
- * @return The layout constraints eighter as a <code>String</code> or {@link net.miginfocom.layout.LC} depending what was sent in
- * to the constructor or set with {@link #setLayoutConstraints(Object)}. Never <code>null</code>.
- */
- public Object getLayoutConstraints()
- {
- return layoutConstraints;
- }
-
- /** Sets the layout constraints for the layout manager instance as a String.
- * <p>
- * See the class JavaDocs for information on how this string is formatted.
- * @param constr The layout constraints as a String representation. <code>null</code> is converted to <code>""</code> for storage.
- * @throws RuntimeException if the constaint was not valid.
- */
- public void setLayoutConstraints(Object constr)
- {
- if (constr == null || constr instanceof String) {
- constr = ConstraintParser.prepare((String) constr);
- lc = ConstraintParser.parseLayoutConstraint((String) constr);
- } else if (constr instanceof LC) {
- lc = (LC) constr;
- } else {
- throw new IllegalArgumentException("Illegal constraint type: " + constr.getClass().toString());
- }
- layoutConstraints = constr;
- grid = null;
- }
-
- /** Returns the column layout constraints either as a <code>String</code> or {@link net.miginfocom.layout.AC}.
- * @return The column constraints eighter as a <code>String</code> or {@link net.miginfocom.layout.LC} depending what was sent in
- * to the constructor or set with {@link #setLayoutConstraints(Object)}. Never <code>null</code>.
- */
- public Object getColumnConstraints()
- {
- return colConstraints;
- }
-
- /** Sets the column layout constraints for the layout manager instance as a String.
- * <p>
- * See the class JavaDocs for information on how this string is formatted.
- * @param constr The column layout constraints as a String representation. <code>null</code> is converted to <code>""</code> for storage.
- * @throws RuntimeException if the constaint was not valid.
- */
- public void setColumnConstraints(Object constr)
- {
- if (constr == null || constr instanceof String) {
- constr = ConstraintParser.prepare((String) constr);
- colSpecs = ConstraintParser.parseColumnConstraints((String) constr);
- } else if (constr instanceof AC) {
- colSpecs = (AC) constr;
- } else {
- throw new IllegalArgumentException("Illegal constraint type: " + constr.getClass().toString());
- }
- colConstraints = constr;
- grid = null;
- }
-
- /** Returns the row layout constraints as a String representation. This string is the exact string as set with {@link #setRowConstraints(Object)}
- * or sent into the constructor.
- * <p>
- * See the class JavaDocs for information on how this string is formatted.
- * @return The row layout constraints as a String representation. Never <code>null</code>.
- */
- public Object getRowConstraints()
- {
- return rowConstraints;
- }
-
- /** Sets the row layout constraints for the layout manager instance as a String.
- * <p>
- * See the class JavaDocs for information on how this string is formatted.
- * @param constr The row layout constraints as a String representation. <code>null</code> is converted to <code>""</code> for storage.
- * @throws RuntimeException if the constaint was not valid.
- */
- public void setRowConstraints(Object constr)
- {
- if (constr == null || constr instanceof String) {
- constr = ConstraintParser.prepare((String) constr);
- rowSpecs = ConstraintParser.parseRowConstraints((String) constr);
- } else if (constr instanceof AC) {
- rowSpecs = (AC) constr;
- } else {
- throw new IllegalArgumentException("Illegal constraint type: " + constr.getClass().toString());
- }
- rowConstraints = constr;
- grid = null;
- }
-
- /** Returns the component constraints as a String representation. This string is the exact string as set with {@link #setComponentConstraints(java.awt.Component, Object)}
- * or set when adding the component to the parent component.
- * <p>
- * See the class JavaDocs for information on how this string is formatted.
- * @param comp The component to return the constraints for.
- * @return The component constraints as a String representation ir <code>null</code> if the component is not registered
- * with this layout manager. The returned values is either a String or a {@link net.miginfocom.layout.CC}
- * depending on what constraint was sent in when the component was added. May be <code>null</code>.
- */
- public Object getComponentConstraints(Component comp)
- {
- synchronized(comp.getParent().getTreeLock()) {
- return scrConstrMap.get(comp);
- }
- }
-
- /** Sets the component constraint for the component that already must be handleded by this layout manager.
- * <p>
- * See the class JavaDocs for information on how this string is formatted.
- * @param constr The component constraints as a String or {@link net.miginfocom.layout.CC}. <code>null</code> is ok.
- * @param comp The component to set the constraints for.
- * @throws RuntimeException if the constaint was not valid.
- * @throws IllegalArgumentException If the component is not handlering the component.
- */
- public void setComponentConstraints(Component comp, Object constr)
- {
- setComponentConstraintsImpl(comp, constr, false);
- }
-
- /** Sets the component constraint for the component that already must be handleded by this layout manager.
- * <p>
- * See the class JavaDocs for information on how this string is formatted.
- * @param constr The component constraints as a String or {@link net.miginfocom.layout.CC}. <code>null</code> is ok.
- * @param comp The component to set the constraints for.
- * @throws RuntimeException if the constaint was not valid.
- * @throws IllegalArgumentException If the component is not handling the component.
- */
- private void setComponentConstraintsImpl(Component comp, Object constr, boolean noCheck)
- {
- Container parent = comp.getParent();
- synchronized(parent.getTreeLock()) {
- if (noCheck == false && scrConstrMap.containsKey(comp) == false)
- throw new IllegalArgumentException("Component must already be added to parent!");
-
- ComponentWrapper cw = new SwingComponentWrapper(comp);
-
- if (constr == null || constr instanceof String) {
- String cStr = ConstraintParser.prepare((String) constr);
-
- scrConstrMap.put(comp, constr);
- ccMap.put(cw, ConstraintParser.parseComponentConstraint(cStr));
-
- } else if (constr instanceof CC) {
-
- scrConstrMap.put(comp, constr);
- ccMap.put(cw, (CC) constr);
-
- } else {
- throw new IllegalArgumentException("Constraint must be String or ComponentConstraint: " + constr.getClass().toString());
- }
-
- grid = null;
- }
- }
-
- /** Returns if this layout manager is currently managing this component.
- * @param c The component to check. If <code>null</code> then <code>false</code> will be returned.
- * @return If this layout manager is currently managing this component.
- */
- public boolean isManagingComponent(Component c)
- {
- return scrConstrMap.containsKey(c);
- }
-
- /** Adds the callback function that will be called at different stages of the layout cylce.
- * @param callback The callback. Not <code>null</code>.
- */
- public void addLayoutCallback(LayoutCallback callback)
- {
- if (callback == null)
- throw new NullPointerException();
-
- if (callbackList == null)
- callbackList = new ArrayList<LayoutCallback>(1);
-
- callbackList.add(callback);
- }
-
- /** Removes the callback if it exists.
- * @param callback The callback. May be <code>null</code>.
- */
- public void removeLayoutCallback(LayoutCallback callback)
- {
- if (callbackList != null)
- callbackList.remove(callback);
- }
-
- /** Sets the debugging state for this layout manager instance. If debug is turned on a timer will repaint the last laid out parent
- * with debug information on top.
- * <p>
- * Red fill and dashed darked red outline is used to indicate occupied cells in the grid. Blue dashed outline indicate indicate
- * component bounds set.
- * <p>
- * Note that debug can also be set on the layout constraints. There it will be persisted. The calue set here will not. See the class
- * JavaDocs for information.
- * @param b <code>true</code> means debug is turned on.
- */
- private synchronized void setDebug(final ComponentWrapper parentW, boolean b)
- {
- if (b && (debugTimer == null || debugTimer.getDelay() != lc.getDebugMillis())) {
- if (debugTimer != null)
- debugTimer.stop();
-
- ContainerWrapper pCW = parentW.getParent();
- final Component parent = pCW != null ? (Component) pCW.getComponent() : null;
-
- debugTimer = new javax.swing.Timer(lc.getDebugMillis(), new ActionListener() {
- public void actionPerformed(ActionEvent e) {
- if (grid != null)
- grid.paintDebug();
- }
- });
-
- if (parent != null) {
- SwingUtilities.invokeLater(new Runnable() {
- public void run() {
- Container p = parent.getParent();
- if (p != null) {
- if (p instanceof JComponent) {
- ((JComponent) p).revalidate();
- } else {
- parent.invalidate();
- p.validate();
- }
- }
- }
- });
- }
-
- debugTimer.setInitialDelay(100);
- debugTimer.start();
-
- } else if (!b && debugTimer != null) {
- debugTimer.stop();
- debugTimer = null;
- }
- }
-
- /** Returns the current debugging state.
- * @return The current debugging state.
- */
- private boolean getDebug()
- {
- return debugTimer != null;
- }
-
- /** Check if something has changed and if so recrete it to the cached objects.
- * @param parent The parent that is the target for this layout manager.
- */
- private final void checkCache(Container parent)
- {
- if (parent == null)
- return;
-
- // Check if the grid is valid
- int mc = PlatformDefaults.getModCount();
- if (lastModCount != mc) {
- grid = null;
- lastModCount = mc;
- }
-
- if (parent.isValid() == false) {
-
- int hash = 0;
- for (Iterator<ComponentWrapper> it = ccMap.keySet().iterator(); it.hasNext();)
- hash += it.next().getLayoutHashCode();
-
- if (hash != lastHash) {
- grid = null;
- lastHash = hash;
- }
-
- Dimension ps = parent.getSize();
- if (lastInvalidSize == null || !lastInvalidSize.equals(ps)) {
- if (grid != null)
- grid.invalidateContainerSize();
- lastInvalidSize = ps;
- }
- }
-
- ContainerWrapper par = checkParent(parent);
-
- setDebug(par, lc.getDebugMillis() > 0);
-
- if (grid == null)
- grid = new Grid(par, lc, rowSpecs, colSpecs, ccMap, callbackList);
- }
-
- private final ContainerWrapper checkParent(Container parent)
- {
- if (parent == null)
- return null;
-
- if (cacheParentW == null || cacheParentW.getComponent() != parent)
- cacheParentW = new SwingContainerWrapper(parent);
-
- return cacheParentW;
- }
-
- public void layoutContainer(Container parent)
- {
- synchronized(parent.getTreeLock()) {
- checkCache(parent);
-
- Insets i = parent.getInsets();
- int[] b = new int[] {
- i.left,
- i.top,
- parent.getWidth() - i.left - i.right,
- parent.getHeight() - i.top - i.bottom
- };
-
- grid.layout(b, lc.getAlignX(), lc.getAlignY(), getDebug(), false);
- lastInvalidSize = null;
- }
- }
-
- public Dimension minimumLayoutSize(Container parent)
- {
- synchronized(parent.getTreeLock()) {
- return getSizeImpl(parent, LayoutUtil.MIN);
- }
- }
-
- public Dimension preferredLayoutSize(Container parent)
- {
- synchronized(parent.getTreeLock()) {
- return getSizeImpl(parent, LayoutUtil.PREF);
- }
- }
-
- public Dimension maximumLayoutSize(Container parent)
- {
- return new Dimension(Short.MAX_VALUE, Short.MAX_VALUE);
- }
-
- // Implementation method that does the job.
- private Dimension getSizeImpl(Container parent, int sizeType)
- {
- checkCache(parent);
-
- Insets i = parent.getInsets();
-
- int w = LayoutUtil.getSizeSafe(grid != null ? grid.getWidth() : null, sizeType) + i.left + i.right;
- int h = LayoutUtil.getSizeSafe(grid != null ? grid.getHeight() : null, sizeType) + i.top + i.bottom;
-
- return new Dimension(w, h);
- }
-
- public float getLayoutAlignmentX(Container parent)
- {
- return lc != null && lc.getAlignX() != null ? lc.getAlignX().getPixels(1, checkParent(parent), null) : 0;
- }
-
- public float getLayoutAlignmentY(Container parent)
- {
- return lc != null && lc.getAlignY() != null ? lc.getAlignY().getPixels(1, checkParent(parent), null) : 0;
- }
-
- public void addLayoutComponent(String s, Component comp)
- {
- addLayoutComponent(comp, s);
- }
-
- public void addLayoutComponent(Component comp, Object constraints)
- {
- synchronized(comp.getParent().getTreeLock()) {
- setComponentConstraintsImpl(comp, constraints, true);
- }
- }
-
- public void removeLayoutComponent(Component comp)
- {
- synchronized(comp.getParent().getTreeLock()) {
- scrConstrMap.remove(comp);
- ccMap.remove(new SwingComponentWrapper(comp));
- }
- }
-
- public void invalidateLayout(Container target)
- {
- if (lc.isNoCache())
- grid = null;
-
- // the validity of components is maintained automatically.
- }
-
- // ************************************************
- // Persistence Delegate and Serializable combined.
- // ************************************************
-
- private Object readResolve() throws ObjectStreamException
- {
- return LayoutUtil.getSerializedObject(this);
- }
-
- public void readExternal(ObjectInput in) throws IOException, ClassNotFoundException
- {
- LayoutUtil.setSerializedObject(this, LayoutUtil.readAsXML(in));
- }
-
- public void writeExternal(ObjectOutput out) throws IOException
- {
- if (getClass() == MigLayout.class)
- LayoutUtil.writeAsXML(out, this);
- }
+package net.miginfocom.swing;
+/*
+ * License (BSD):
+ * ==============
+ *
+ * Copyright (c) 2004, Mikael Grev, MiG InfoCom AB. (miglayout (at) miginfocom (dot) com)
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification,
+ * are permitted provided that the following conditions are met:
+ * Redistributions of source code must retain the above copyright notice, this list
+ * of conditions and the following disclaimer.
+ * Redistributions in binary form must reproduce the above copyright notice, this
+ * list of conditions and the following disclaimer in the documentation and/or other
+ * materials provided with the distribution.
+ * Neither the name of the MiG InfoCom AB nor the names of its contributors may be
+ * used to endorse or promote products derived from this software without specific
+ * prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+ * IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
+ * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+ * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA,
+ * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
+ * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY
+ * OF SUCH DAMAGE.
+ *
+ * @version 1.0
+ * @author Mikael Grev, MiG InfoCom AB
+ * Date: 2006-sep-08
+ */
+
+import net.miginfocom.layout.*;
+
+import javax.swing.*;
+import java.awt.*;
+import java.awt.event.ActionEvent;
+import java.awt.event.ActionListener;
+import java.io.*;
+import java.util.*;
+
+/** A very flexbile layout manager.
+ * <p>
+ * Read the documentation that came with this layout manager for information on usage.
+ */
+public final class MigLayout implements LayoutManager2, Externalizable
+{
+ // ******** Instance part ********
+
+ /** The component to string constraints mappings.
+ */
+ private final Map<Component, Object> scrConstrMap = new IdentityHashMap<Component, Object>(8);
+
+ /** Hold the serializable text representation of the constraints.
+ */
+ private Object layoutConstraints = "", colConstraints = "", rowConstraints = ""; // Should never be null!
+
+
+ // ******** Transient part ********
+
+ private transient ContainerWrapper cacheParentW = null;
+
+ private transient final Map<ComponentWrapper, CC> ccMap = new HashMap<ComponentWrapper, CC>(8);
+ private transient javax.swing.Timer debugTimer = null;
+
+ private transient LC lc = null;
+ private transient AC colSpecs = null, rowSpecs = null;
+ private transient Grid grid = null;
+ private transient int lastModCount = PlatformDefaults.getModCount();
+ private transient int lastHash = -1;
+ private transient Dimension lastInvalidSize = null;
+
+ private transient ArrayList<LayoutCallback> callbackList = null;
+
+ /** Constructor with no constraints.
+ */
+ public MigLayout()
+ {
+ this("", "", "");
+ }
+
+ /** Constructor.
+ * @param layoutConstraints The constraints that concern the whole layout. <code>null</code> will be treated as "".
+ */
+ public MigLayout(String layoutConstraints)
+ {
+ this(layoutConstraints, "", "");
+ }
+
+ /** Constructor.
+ * @param layoutConstraints The constraints that concern the whole layout. <code>null</code> will be treated as "".
+ * @param colConstraints The constraints for the columns in the grid. <code>null</code> will be treated as "".
+ */
+ public MigLayout(String layoutConstraints, String colConstraints)
+ {
+ this(layoutConstraints, colConstraints, "");
+ }
+
+ /** Constructor.
+ * @param layoutConstraints The constraints that concern the whole layout. <code>null</code> will be treated as "".
+ * @param colConstraints The constraints for the columns in the grid. <code>null</code> will be treated as "".
+ * @param rowConstraints The constraints for the rows in the grid. <code>null</code> will be treated as "".
+ */
+ public MigLayout(String layoutConstraints, String colConstraints, String rowConstraints)
+ {
+ setLayoutConstraints(layoutConstraints);
+ setColumnConstraints(colConstraints);
+ setRowConstraints(rowConstraints);
+ }
+
+ /** Constructor.
+ * @param layoutConstraints The constraints that concern the whole layout. <code>null</code> will be treated as an empty cosntraint.
+ */
+ public MigLayout(LC layoutConstraints)
+ {
+ this(layoutConstraints, null, null);
+ }
+
+ /** Constructor.
+ * @param layoutConstraints The constraints that concern the whole layout. <code>null</code> will be treated as an empty cosntraint.
+ * @param colConstraints The constraints for the columns in the grid. <code>null</code> will be treated as an empty constraint.
+ */
+ public MigLayout(LC layoutConstraints, AC colConstraints)
+ {
+ this(layoutConstraints, colConstraints, null);
+ }
+
+ /** Constructor.
+ * @param layoutConstraints The constraints that concern the whole layout. <code>null</code> will be treated as an empty cosntraint.
+ * @param colConstraints The constraints for the columns in the grid. <code>null</code> will be treated as an empty constraint.
+ * @param rowConstraints The constraints for the rows in the grid. <code>null</code> will be treated as an empty constraint.
+ */
+ public MigLayout(LC layoutConstraints, AC colConstraints, AC rowConstraints)
+ {
+ setLayoutConstraints(layoutConstraints);
+ setColumnConstraints(colConstraints);
+ setRowConstraints(rowConstraints);
+ }
+
+ /** Returns layout constraints eighter as a <code>String</code> or {@link net.miginfocom.layout.LC} depending what was sent in
+ * to the constructor or set with {@link #setLayoutConstraints(Object)}.
+ * @return The layout constraints eighter as a <code>String</code> or {@link net.miginfocom.layout.LC} depending what was sent in
+ * to the constructor or set with {@link #setLayoutConstraints(Object)}. Never <code>null</code>.
+ */
+ public Object getLayoutConstraints()
+ {
+ return layoutConstraints;
+ }
+
+ /** Sets the layout constraints for the layout manager instance as a String.
+ * <p>
+ * See the class JavaDocs for information on how this string is formatted.
+ * @param constr The layout constraints as a String representation. <code>null</code> is converted to <code>""</code> for storage.
+ * @throws RuntimeException if the constaint was not valid.
+ */
+ public void setLayoutConstraints(Object constr)
+ {
+ if (constr == null || constr instanceof String) {
+ constr = ConstraintParser.prepare((String) constr);
+ lc = ConstraintParser.parseLayoutConstraint((String) constr);
+ } else if (constr instanceof LC) {
+ lc = (LC) constr;
+ } else {
+ throw new IllegalArgumentException("Illegal constraint type: " + constr.getClass().toString());
+ }
+ layoutConstraints = constr;
+ grid = null;
+ }
+
+ /** Returns the column layout constraints either as a <code>String</code> or {@link net.miginfocom.layout.AC}.
+ * @return The column constraints eighter as a <code>String</code> or {@link net.miginfocom.layout.LC} depending what was sent in
+ * to the constructor or set with {@link #setLayoutConstraints(Object)}. Never <code>null</code>.
+ */
+ public Object getColumnConstraints()
+ {
+ return colConstraints;
+ }
+
+ /** Sets the column layout constraints for the layout manager instance as a String.
+ * <p>
+ * See the class JavaDocs for information on how this string is formatted.
+ * @param constr The column layout constraints as a String representation. <code>null</code> is converted to <code>""</code> for storage.
+ * @throws RuntimeException if the constaint was not valid.
+ */
+ public void setColumnConstraints(Object constr)
+ {
+ if (constr == null || constr instanceof String) {
+ constr = ConstraintParser.prepare((String) constr);
+ colSpecs = ConstraintParser.parseColumnConstraints((String) constr);
+ } else if (constr instanceof AC) {
+ colSpecs = (AC) constr;
+ } else {
+ throw new IllegalArgumentException("Illegal constraint type: " + constr.getClass().toString());
+ }
+ colConstraints = constr;
+ grid = null;
+ }
+
+ /** Returns the row layout constraints as a String representation. This string is the exact string as set with {@link #setRowConstraints(Object)}
+ * or sent into the constructor.
+ * <p>
+ * See the class JavaDocs for information on how this string is formatted.
+ * @return The row layout constraints as a String representation. Never <code>null</code>.
+ */
+ public Object getRowConstraints()
+ {
+ return rowConstraints;
+ }
+
+ /** Sets the row layout constraints for the layout manager instance as a String.
+ * <p>
+ * See the class JavaDocs for information on how this string is formatted.
+ * @param constr The row layout constraints as a String representation. <code>null</code> is converted to <code>""</code> for storage.
+ * @throws RuntimeException if the constaint was not valid.
+ */
+ public void setRowConstraints(Object constr)
+ {
+ if (constr == null || constr instanceof String) {
+ constr = ConstraintParser.prepare((String) constr);
+ rowSpecs = ConstraintParser.parseRowConstraints((String) constr);
+ } else if (constr instanceof AC) {
+ rowSpecs = (AC) constr;
+ } else {
+ throw new IllegalArgumentException("Illegal constraint type: " + constr.getClass().toString());
+ }
+ rowConstraints = constr;
+ grid = null;
+ }
+
+ /** Returns the component constraints as a String representation. This string is the exact string as set with {@link #setComponentConstraints(java.awt.Component, Object)}
+ * or set when adding the component to the parent component.
+ * <p>
+ * See the class JavaDocs for information on how this string is formatted.
+ * @param comp The component to return the constraints for.
+ * @return The component constraints as a String representation ir <code>null</code> if the component is not registered
+ * with this layout manager. The returned values is either a String or a {@link net.miginfocom.layout.CC}
+ * depending on what constraint was sent in when the component was added. May be <code>null</code>.
+ */
+ public Object getComponentConstraints(Component comp)
+ {
+ synchronized(comp.getParent().getTreeLock()) {
+ return scrConstrMap.get(comp);
+ }
+ }
+
+ /** Sets the component constraint for the component that already must be handleded by this layout manager.
+ * <p>
+ * See the class JavaDocs for information on how this string is formatted.
+ * @param constr The component constraints as a String or {@link net.miginfocom.layout.CC}. <code>null</code> is ok.
+ * @param comp The component to set the constraints for.
+ * @throws RuntimeException if the constaint was not valid.
+ * @throws IllegalArgumentException If the component is not handlering the component.
+ */
+ public void setComponentConstraints(Component comp, Object constr)
+ {
+ setComponentConstraintsImpl(comp, constr, false);
+ }
+
+ /** Sets the component constraint for the component that already must be handleded by this layout manager.
+ * <p>
+ * See the class JavaDocs for information on how this string is formatted.
+ * @param constr The component constraints as a String or {@link net.miginfocom.layout.CC}. <code>null</code> is ok.
+ * @param comp The component to set the constraints for.
+ * @throws RuntimeException if the constaint was not valid.
+ * @throws IllegalArgumentException If the component is not handling the component.
+ */
+ private void setComponentConstraintsImpl(Component comp, Object constr, boolean noCheck)
+ {
+ Container parent = comp.getParent();
+ synchronized(parent.getTreeLock()) {
+ if (noCheck == false && scrConstrMap.containsKey(comp) == false)
+ throw new IllegalArgumentException("Component must already be added to parent!");
+
+ ComponentWrapper cw = new SwingComponentWrapper(comp);
+
+ if (constr == null || constr instanceof String) {
+ String cStr = ConstraintParser.prepare((String) constr);
+
+ scrConstrMap.put(comp, constr);
+ ccMap.put(cw, ConstraintParser.parseComponentConstraint(cStr));
+
+ } else if (constr instanceof CC) {
+
+ scrConstrMap.put(comp, constr);
+ ccMap.put(cw, (CC) constr);
+
+ } else {
+ throw new IllegalArgumentException("Constraint must be String or ComponentConstraint: " + constr.getClass().toString());
+ }
+
+ grid = null;
+ }
+ }
+
+ /** Returns if this layout manager is currently managing this component.
+ * @param c The component to check. If <code>null</code> then <code>false</code> will be returned.
+ * @return If this layout manager is currently managing this component.
+ */
+ public boolean isManagingComponent(Component c)
+ {
+ return scrConstrMap.containsKey(c);
+ }
+
+ /** Adds the callback function that will be called at different stages of the layout cylce.
+ * @param callback The callback. Not <code>null</code>.
+ */
+ public void addLayoutCallback(LayoutCallback callback)
+ {
+ if (callback == null)
+ throw new NullPointerException();
+
+ if (callbackList == null)
+ callbackList = new ArrayList<LayoutCallback>(1);
+
+ callbackList.add(callback);
+ }
+
+ /** Removes the callback if it exists.
+ * @param callback The callback. May be <code>null</code>.
+ */
+ public void removeLayoutCallback(LayoutCallback callback)
+ {
+ if (callbackList != null)
+ callbackList.remove(callback);
+ }
+
+ /** Sets the debugging state for this layout manager instance. If debug is turned on a timer will repaint the last laid out parent
+ * with debug information on top.
+ * <p>
+ * Red fill and dashed darked red outline is used to indicate occupied cells in the grid. Blue dashed outline indicate indicate
+ * component bounds set.
+ * <p>
+ * Note that debug can also be set on the layout constraints. There it will be persisted. The calue set here will not. See the class
+ * JavaDocs for information.
+ * @param b <code>true</code> means debug is turned on.
+ */
+ private synchronized void setDebug(final ComponentWrapper parentW, boolean b)
+ {
+ if (b && (debugTimer == null || debugTimer.getDelay() != lc.getDebugMillis())) {
+ if (debugTimer != null)
+ debugTimer.stop();
+
+ ContainerWrapper pCW = parentW.getParent();
+ final Component parent = pCW != null ? (Component) pCW.getComponent() : null;
+
+ debugTimer = new javax.swing.Timer(lc.getDebugMillis(), new ActionListener() {
+ public void actionPerformed(ActionEvent e) {
+ if (grid != null)
+ grid.paintDebug();
+ }
+ });
+
+ if (parent != null) {
+ SwingUtilities.invokeLater(new Runnable() {
+ public void run() {
+ Container p = parent.getParent();
+ if (p != null) {
+ if (p instanceof JComponent) {
+ ((JComponent) p).revalidate();
+ } else {
+ parent.invalidate();
+ p.validate();
+ }
+ }
+ }
+ });
+ }
+
+ debugTimer.setInitialDelay(100);
+ debugTimer.start();
+
+ } else if (!b && debugTimer != null) {
+ debugTimer.stop();
+ debugTimer = null;
+ }
+ }
+
+ /** Returns the current debugging state.
+ * @return The current debugging state.
+ */
+ private boolean getDebug()
+ {
+ return debugTimer != null;
+ }
+
+ /** Check if something has changed and if so recrete it to the cached objects.
+ * @param parent The parent that is the target for this layout manager.
+ */
+ private final void checkCache(Container parent)
+ {
+ if (parent == null)
+ return;
+
+ // Check if the grid is valid
+ int mc = PlatformDefaults.getModCount();
+ if (lastModCount != mc) {
+ grid = null;
+ lastModCount = mc;
+ }
+
+ if (parent.isValid() == false) {
+
+ int hash = 0;
+ for (Iterator<ComponentWrapper> it = ccMap.keySet().iterator(); it.hasNext();)
+ hash += it.next().getLayoutHashCode();
+
+ if (hash != lastHash) {
+ grid = null;
+ lastHash = hash;
+ }
+
+ Dimension ps = parent.getSize();
+ if (lastInvalidSize == null || !lastInvalidSize.equals(ps)) {
+ if (grid != null)
+ grid.invalidateContainerSize();
+ lastInvalidSize = ps;
+ }
+ }
+
+ ContainerWrapper par = checkParent(parent);
+
+ setDebug(par, lc.getDebugMillis() > 0);
+
+ if (grid == null)
+ grid = new Grid(par, lc, rowSpecs, colSpecs, ccMap, callbackList);
+ }
+
+ private final ContainerWrapper checkParent(Container parent)
+ {
+ if (parent == null)
+ return null;
+
+ if (cacheParentW == null || cacheParentW.getComponent() != parent)
+ cacheParentW = new SwingContainerWrapper(parent);
+
+ return cacheParentW;
+ }
+
+ public void layoutContainer(Container parent)
+ {
+ synchronized(parent.getTreeLock()) {
+ checkCache(parent);
+
+ Insets i = parent.getInsets();
+ int[] b = new int[] {
+ i.left,
+ i.top,
+ parent.getWidth() - i.left - i.right,
+ parent.getHeight() - i.top - i.bottom
+ };
+
+ grid.layout(b, lc.getAlignX(), lc.getAlignY(), getDebug(), false);
+ lastInvalidSize = null;
+ }
+ }
+
+ public Dimension minimumLayoutSize(Container parent)
+ {
+ synchronized(parent.getTreeLock()) {
+ return getSizeImpl(parent, LayoutUtil.MIN);
+ }
+ }
+
+ public Dimension preferredLayoutSize(Container parent)
+ {
+ synchronized(parent.getTreeLock()) {
+ return getSizeImpl(parent, LayoutUtil.PREF);
+ }
+ }
+
+ public Dimension maximumLayoutSize(Container parent)
+ {
+ return new Dimension(Short.MAX_VALUE, Short.MAX_VALUE);
+ }
+
+ // Implementation method that does the job.
+ private Dimension getSizeImpl(Container parent, int sizeType)
+ {
+ checkCache(parent);
+
+ Insets i = parent.getInsets();
+
+ int w = LayoutUtil.getSizeSafe(grid != null ? grid.getWidth() : null, sizeType) + i.left + i.right;
+ int h = LayoutUtil.getSizeSafe(grid != null ? grid.getHeight() : null, sizeType) + i.top + i.bottom;
+
+ return new Dimension(w, h);
+ }
+
+ public float getLayoutAlignmentX(Container parent)
+ {
+ return lc != null && lc.getAlignX() != null ? lc.getAlignX().getPixels(1, checkParent(parent), null) : 0;
+ }
+
+ public float getLayoutAlignmentY(Container parent)
+ {
+ return lc != null && lc.getAlignY() != null ? lc.getAlignY().getPixels(1, checkParent(parent), null) : 0;
+ }
+
+ public void addLayoutComponent(String s, Component comp)
+ {
+ addLayoutComponent(comp, s);
+ }
+
+ public void addLayoutComponent(Component comp, Object constraints)
+ {
+ synchronized(comp.getParent().getTreeLock()) {
+ setComponentConstraintsImpl(comp, constraints, true);
+ }
+ }
+
+ public void removeLayoutComponent(Component comp)
+ {
+ synchronized(comp.getParent().getTreeLock()) {
+ scrConstrMap.remove(comp);
+ ccMap.remove(new SwingComponentWrapper(comp));
+ }
+ }
+
+ public void invalidateLayout(Container target)
+ {
+ if (lc.isNoCache())
+ grid = null;
+
+ // the validity of components is maintained automatically.
+ }
+
+ // ************************************************
+ // Persistence Delegate and Serializable combined.
+ // ************************************************
+
+ private Object readResolve() throws ObjectStreamException
+ {
+ return LayoutUtil.getSerializedObject(this);
+ }
+
+ public void readExternal(ObjectInput in) throws IOException, ClassNotFoundException
+ {
+ LayoutUtil.setSerializedObject(this, LayoutUtil.readAsXML(in));
+ }
+
+ public void writeExternal(ObjectOutput out) throws IOException
+ {
+ if (getClass() == MigLayout.class)
+ LayoutUtil.writeAsXML(out, this);
+ }
} \ No newline at end of file
diff --git a/prototypes/miglayout/net/miginfocom/swing/SwingComponentWrapper.java b/prototypes/miglayout/net/miginfocom/swing/SwingComponentWrapper.java
index 35b069be..0c496c0b 100644
--- a/prototypes/miglayout/net/miginfocom/swing/SwingComponentWrapper.java
+++ b/prototypes/miglayout/net/miginfocom/swing/SwingComponentWrapper.java
@@ -1,426 +1,426 @@
-package net.miginfocom.swing;
-/*
- * License (BSD):
- * ==============
- *
- * Copyright (c) 2004, Mikael Grev, MiG InfoCom AB. (miglayout (at) miginfocom (dot) com)
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without modification,
- * are permitted provided that the following conditions are met:
- * Redistributions of source code must retain the above copyright notice, this list
- * of conditions and the following disclaimer.
- * Redistributions in binary form must reproduce the above copyright notice, this
- * list of conditions and the following disclaimer in the documentation and/or other
- * materials provided with the distribution.
- * Neither the name of the MiG InfoCom AB nor the names of its contributors may be
- * used to endorse or promote products derived from this software without specific
- * prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
- * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
- * IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
- * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
- * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA,
- * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
- * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
- * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY
- * OF SUCH DAMAGE.
- *
- * @version 1.0
- * @author Mikael Grev, MiG InfoCom AB
- * Date: 2006-sep-08
- */
-
-import net.miginfocom.layout.ComponentWrapper;
-import net.miginfocom.layout.ContainerWrapper;
-import net.miginfocom.layout.PlatformDefaults;
-
-import javax.swing.*;
-import javax.swing.text.JTextComponent;
-import java.awt.*;
-import java.awt.geom.Rectangle2D;
-import java.lang.reflect.Method;
-import java.util.IdentityHashMap;
-
-/**
- */
-public class SwingComponentWrapper implements ComponentWrapper
-{
- private static boolean maxSet = false;
-
- private static boolean vp = true;
-
- /** Debug color for component bounds outline.
- */
- private static final Color DB_COMP_OUTLINE = new Color(0, 0, 200);
-
- private final Component c;
- private int compType = TYPE_UNSET;
- private final boolean bl;
-
- public SwingComponentWrapper(Component c)
- {
- this.c = c;
- bl = getBaseline(c.getWidth(), c.getHeight()) != -1;
- }
-
- public final int getBaseline(int width, int height)
- {
- if (BL_METHOD == null)
- return -1;
-
- try {
- Object[] args = new Object[] {
- new Integer(width == -1 ? c.getWidth() : width),
- new Integer(height == -1 ? c.getHeight() : height)
- };
- return ((Integer) BL_METHOD.invoke(c, args)).intValue();
- } catch (Exception e) {
- return -1;
- }
- }
-
- public final Object getComponent()
- {
- return c;
- }
-
- /** Cache.
- */
- private final static IdentityHashMap<FontMetrics, Point.Float> FM_MAP = new IdentityHashMap<FontMetrics, Point.Float>(4);
- private final static Font SUBST_FONT = new Font("sansserif", Font.PLAIN, 11);
-
- public final float getPixelUnitFactor(boolean isHor)
- {
- switch (PlatformDefaults.getLogicalPixelBase()) {
- case PlatformDefaults.BASE_FONT_SIZE:
- Font font = c.getFont();
- FontMetrics fm = c.getFontMetrics(font != null ? font : SUBST_FONT);
- Point.Float p = FM_MAP.get(fm);
- if (p == null) {
- Rectangle2D r = fm.getStringBounds("X", c.getGraphics());
- p = new Point.Float(((float) r.getWidth()) / 6f, ((float) r.getHeight()) / 13.27734375f);
- FM_MAP.put(fm, p);
- }
- return isHor ? p.x : p.y;
-
- case PlatformDefaults.BASE_SCALE_FACTOR:
- Float s = isHor ? PlatformDefaults.getHorizontalScaleFactor() : PlatformDefaults.getVerticalScaleFactor();
- if (s != null)
- return s.floatValue();
- return (isHor ? getHorizontalScreenDPI() : getVerticalScreenDPI()) / (float) PlatformDefaults.getDefaultDPI();
-
- default:
- return 1f;
- }
- }
-
-// /** Cache.
-// */
-// private final static IdentityHashMap<FontMetrics, Point.Float> FM_MAP2 = new IdentityHashMap<FontMetrics, Point.Float>(4);
-// private final static Font SUBST_FONT2 = new Font("sansserif", Font.PLAIN, 11);
-//
-// public float getDialogUnit(boolean isHor)
-// {
-// Font font = c.getFont();
-// FontMetrics fm = c.getFontMetrics(font != null ? font : SUBST_FONT2);
-// Point.Float dluP = FM_MAP2.get(fm);
-// if (dluP == null) {
-// float w = fm.charWidth('X') / 4f;
-// int ascent = fm.getAscent();
-// float h = (ascent > 14 ? ascent : ascent + (15 - ascent) / 3) / 8f;
-//
-// dluP = new Point.Float(w, h);
-// FM_MAP2.put(fm, dluP);
-// }
-// return isHor ? dluP.x : dluP.y;
-// }
-
- public final int getX()
- {
- return c.getX();
- }
-
- public final int getY()
- {
- return c.getY();
- }
-
- public final int getHeight()
- {
- return c.getHeight();
- }
-
- public final int getWidth()
- {
- return c.getWidth();
- }
-
- public final int getScreenLocationX()
- {
- Point p = new Point();
- SwingUtilities.convertPointToScreen(p, c);
- return p.x;
- }
-
- public final int getScreenLocationY()
- {
- Point p = new Point();
- SwingUtilities.convertPointToScreen(p, c);
- return p.y;
- }
-
- public final int getMinimumHeight()
- {
- c.getPreferredSize(); // To defeat a bug where the minimum size is difference before and after the first call to getPreferredSize();
- return c.getMinimumSize().height;
- }
-
- public final int getMinimumWidth()
- {
- c.getPreferredSize(); // To defeat a bug where the minimum size is difference before and after the first call to getPreferredSize();
- return c.getMinimumSize().width;
- }
-
- public final int getPreferredHeight()
- {
- return c.getPreferredSize().height;
- }
-
- public final int getPreferredWidth()
- {
- return c.getPreferredSize().width;
- }
-
- public final int getMaximumHeight()
- {
- if (!isMaxSet(c))
- return Short.MAX_VALUE;
-
- return c.getMaximumSize().height;
- }
-
- public final int getMaximumWidth()
- {
- if (!isMaxSet(c))
- return Short.MAX_VALUE;
-
- return c.getMaximumSize().width;
- }
-
-
- private boolean isMaxSet(Component c)
- {
- if (IMS_METHOD != null) {
- try {
- return ((Boolean) IMS_METHOD.invoke(c, null)).booleanValue();
- } catch (Exception e) {
- IMS_METHOD = null; // So we do not try every time.
- }
- }
- return isMaxSizeSetOn1_4();
- }
-
- public final ContainerWrapper getParent()
- {
- Container p = c.getParent();
- return p != null ? new SwingContainerWrapper(p) : null;
- }
-
- public final int getHorizontalScreenDPI()
- {
- return c.getToolkit().getScreenResolution();
- }
-
- public final int getVerticalScreenDPI()
- {
- return c.getToolkit().getScreenResolution();
- }
-
- public final int getScreenWidth()
- {
- return c.getToolkit().getScreenSize().width;
- }
-
- public final int getScreenHeight()
- {
- return c.getToolkit().getScreenSize().height;
- }
-
- public final boolean hasBaseline()
- {
- return bl;
- }
-
- public final String getLinkId()
- {
- return c.getName();
- }
-
- public final void setBounds(int x, int y, int width, int height)
- {
- c.setBounds(x, y, width, height);
- }
-
- public boolean isVisible()
- {
- return c.isVisible();
- }
-
- public final int[] getVisualPadding()
- {
- if (vp && c instanceof JTabbedPane) {
- if (UIManager.getLookAndFeel().getClass().getName().endsWith("WindowsLookAndFeel"))
- return new int[] {-1, 0, 2, 2};
- }
- return null;
- }
-
- public static boolean isMaxSizeSetOn1_4()
- {
- return maxSet;
- }
-
- public static void setMaxSizeSetOn1_4(boolean b)
- {
- maxSet = b;
- }
-
- public final static boolean isVisualPaddingEnabled()
- {
- return vp;
- }
-
- public final static void setVisualPaddingEnabled(boolean b)
- {
- vp = b;
- }
-
- public final void paintDebugOutline()
- {
- if (c.isShowing() == false)
- return;
-
- Graphics2D g = (Graphics2D) c.getGraphics();
- if (g == null)
- return;
-
- g.setPaint(DB_COMP_OUTLINE);
- g.setStroke(new BasicStroke(1f, BasicStroke.CAP_SQUARE, BasicStroke.JOIN_MITER, 10f, new float[] {2f, 4f}, 0));
- g.drawRect(0, 0, getWidth() - 1, getHeight() - 1);
- }
-
- public int getComponetType(boolean disregardScrollPane)
- {
- if (compType == TYPE_UNSET)
- compType = checkType(disregardScrollPane);
-
- return compType;
- }
-
- public int getLayoutHashCode()
- {
- Dimension d = c.getMaximumSize();
- int h = d.width + (d.height << 5);
-
- d = c.getPreferredSize();
- h += (d.width << 10) + (d.height << 15);
-
- d = c.getMinimumSize();
- h += (d.width << 20) + (d.height << 25);
-
- if (c.isVisible())
- h += 1324511;
-
- String id = getLinkId();
- if (id != null)
- h += id.hashCode();
- return h;
-
- // Since 2.3 will check the isValid instead everything that affects that can be removed from the layout hashcode.
-
-// String id = getLinkId();
-// return id != null ? id.hashCode() : 1;
- }
-
- private final int checkType(boolean disregardScrollPane)
- {
- Component c = this.c;
-
- if (disregardScrollPane) {
- if (c instanceof JScrollPane) {
- c = ((JScrollPane) c).getViewport().getView();
- } else if (c instanceof ScrollPane) {
- c = ((ScrollPane) c).getComponent(0);
- }
- }
-
- if (c instanceof JTextField || c instanceof TextField) {
- return TYPE_TEXT_FIELD;
- } else if (c instanceof JLabel || c instanceof Label) {
- return TYPE_LABEL;
- } else if (c instanceof JToggleButton || c instanceof Checkbox) {
- return TYPE_CHECK_BOX;
- } else if (c instanceof AbstractButton || c instanceof Button) {
- return TYPE_BUTTON;
- } else if (c instanceof JComboBox || c instanceof Choice) {
- return TYPE_LABEL;
- } else if (c instanceof JTextComponent || c instanceof TextComponent) {
- return TYPE_TEXT_AREA;
- } else if (c instanceof JPanel || c instanceof Canvas) {
- return TYPE_PANEL;
- } else if (c instanceof JList || c instanceof List) {
- return TYPE_LIST;
- } else if (c instanceof JTable) {
- return TYPE_TABLE;
- } else if (c instanceof JSeparator) {
- return TYPE_SEPARATOR;
- } else if (c instanceof JSpinner) {
- return TYPE_SPINNER;
- } else if (c instanceof JProgressBar) {
- return TYPE_PROGRESS_BAR;
- } else if (c instanceof JSlider) {
- return TYPE_SLIDER;
- } else if (c instanceof JScrollPane) {
- return TYPE_SCROLL_PANE;
- } else if (c instanceof JScrollBar || c instanceof Scrollbar) {
- return TYPE_SCROLL_BAR;
- } else if (c instanceof Container) { // only AWT components is not containers.
- return TYPE_CONTAINER;
- }
- return TYPE_UNKNOWN;
- }
-
- public final int hashCode()
- {
- return getComponent().hashCode();
- }
-
- public final boolean equals(Object o)
- {
- if (o instanceof ComponentWrapper == false)
- return false;
-
- return getComponent().equals(((ComponentWrapper) o).getComponent());
- }
-
- /** Cached method used for getting base line with reflection.
- */
- private static Method BL_METHOD = null;
- static {
- try {
- BL_METHOD = Component.class.getDeclaredMethod("getBaseline", new Class[] {int.class, int.class});
- } catch (Throwable e) { // No such method or security exception
- }
- }
-
- private static Method IMS_METHOD = null;
- static {
- try {
- IMS_METHOD = Component.class.getDeclaredMethod("isMaximumSizeSet", null);
- } catch (Throwable e) { // No such method or security exception
- }
- }
-}
+package net.miginfocom.swing;
+/*
+ * License (BSD):
+ * ==============
+ *
+ * Copyright (c) 2004, Mikael Grev, MiG InfoCom AB. (miglayout (at) miginfocom (dot) com)
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification,
+ * are permitted provided that the following conditions are met:
+ * Redistributions of source code must retain the above copyright notice, this list
+ * of conditions and the following disclaimer.
+ * Redistributions in binary form must reproduce the above copyright notice, this
+ * list of conditions and the following disclaimer in the documentation and/or other
+ * materials provided with the distribution.
+ * Neither the name of the MiG InfoCom AB nor the names of its contributors may be
+ * used to endorse or promote products derived from this software without specific
+ * prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+ * IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
+ * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+ * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA,
+ * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
+ * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY
+ * OF SUCH DAMAGE.
+ *
+ * @version 1.0
+ * @author Mikael Grev, MiG InfoCom AB
+ * Date: 2006-sep-08
+ */
+
+import net.miginfocom.layout.ComponentWrapper;
+import net.miginfocom.layout.ContainerWrapper;
+import net.miginfocom.layout.PlatformDefaults;
+
+import javax.swing.*;
+import javax.swing.text.JTextComponent;
+import java.awt.*;
+import java.awt.geom.Rectangle2D;
+import java.lang.reflect.Method;
+import java.util.IdentityHashMap;
+
+/**
+ */
+public class SwingComponentWrapper implements ComponentWrapper
+{
+ private static boolean maxSet = false;
+
+ private static boolean vp = true;
+
+ /** Debug color for component bounds outline.
+ */
+ private static final Color DB_COMP_OUTLINE = new Color(0, 0, 200);
+
+ private final Component c;
+ private int compType = TYPE_UNSET;
+ private final boolean bl;
+
+ public SwingComponentWrapper(Component c)
+ {
+ this.c = c;
+ bl = getBaseline(c.getWidth(), c.getHeight()) != -1;
+ }
+
+ public final int getBaseline(int width, int height)
+ {
+ if (BL_METHOD == null)
+ return -1;
+
+ try {
+ Object[] args = new Object[] {
+ new Integer(width == -1 ? c.getWidth() : width),
+ new Integer(height == -1 ? c.getHeight() : height)
+ };
+ return ((Integer) BL_METHOD.invoke(c, args)).intValue();
+ } catch (Exception e) {
+ return -1;
+ }
+ }
+
+ public final Object getComponent()
+ {
+ return c;
+ }
+
+ /** Cache.
+ */
+ private final static IdentityHashMap<FontMetrics, Point.Float> FM_MAP = new IdentityHashMap<FontMetrics, Point.Float>(4);
+ private final static Font SUBST_FONT = new Font("sansserif", Font.PLAIN, 11);
+
+ public final float getPixelUnitFactor(boolean isHor)
+ {
+ switch (PlatformDefaults.getLogicalPixelBase()) {
+ case PlatformDefaults.BASE_FONT_SIZE:
+ Font font = c.getFont();
+ FontMetrics fm = c.getFontMetrics(font != null ? font : SUBST_FONT);
+ Point.Float p = FM_MAP.get(fm);
+ if (p == null) {
+ Rectangle2D r = fm.getStringBounds("X", c.getGraphics());
+ p = new Point.Float(((float) r.getWidth()) / 6f, ((float) r.getHeight()) / 13.27734375f);
+ FM_MAP.put(fm, p);
+ }
+ return isHor ? p.x : p.y;
+
+ case PlatformDefaults.BASE_SCALE_FACTOR:
+ Float s = isHor ? PlatformDefaults.getHorizontalScaleFactor() : PlatformDefaults.getVerticalScaleFactor();
+ if (s != null)
+ return s.floatValue();
+ return (isHor ? getHorizontalScreenDPI() : getVerticalScreenDPI()) / (float) PlatformDefaults.getDefaultDPI();
+
+ default:
+ return 1f;
+ }
+ }
+
+// /** Cache.
+// */
+// private final static IdentityHashMap<FontMetrics, Point.Float> FM_MAP2 = new IdentityHashMap<FontMetrics, Point.Float>(4);
+// private final static Font SUBST_FONT2 = new Font("sansserif", Font.PLAIN, 11);
+//
+// public float getDialogUnit(boolean isHor)
+// {
+// Font font = c.getFont();
+// FontMetrics fm = c.getFontMetrics(font != null ? font : SUBST_FONT2);
+// Point.Float dluP = FM_MAP2.get(fm);
+// if (dluP == null) {
+// float w = fm.charWidth('X') / 4f;
+// int ascent = fm.getAscent();
+// float h = (ascent > 14 ? ascent : ascent + (15 - ascent) / 3) / 8f;
+//
+// dluP = new Point.Float(w, h);
+// FM_MAP2.put(fm, dluP);
+// }
+// return isHor ? dluP.x : dluP.y;
+// }
+
+ public final int getX()
+ {
+ return c.getX();
+ }
+
+ public final int getY()
+ {
+ return c.getY();
+ }
+
+ public final int getHeight()
+ {
+ return c.getHeight();
+ }
+
+ public final int getWidth()
+ {
+ return c.getWidth();
+ }
+
+ public final int getScreenLocationX()
+ {
+ Point p = new Point();
+ SwingUtilities.convertPointToScreen(p, c);
+ return p.x;
+ }
+
+ public final int getScreenLocationY()
+ {
+ Point p = new Point();
+ SwingUtilities.convertPointToScreen(p, c);
+ return p.y;
+ }
+
+ public final int getMinimumHeight()
+ {
+ c.getPreferredSize(); // To defeat a bug where the minimum size is difference before and after the first call to getPreferredSize();
+ return c.getMinimumSize().height;
+ }
+
+ public final int getMinimumWidth()
+ {
+ c.getPreferredSize(); // To defeat a bug where the minimum size is difference before and after the first call to getPreferredSize();
+ return c.getMinimumSize().width;
+ }
+
+ public final int getPreferredHeight()
+ {
+ return c.getPreferredSize().height;
+ }
+
+ public final int getPreferredWidth()
+ {
+ return c.getPreferredSize().width;
+ }
+
+ public final int getMaximumHeight()
+ {
+ if (!isMaxSet(c))
+ return Short.MAX_VALUE;
+
+ return c.getMaximumSize().height;
+ }
+
+ public final int getMaximumWidth()
+ {
+ if (!isMaxSet(c))
+ return Short.MAX_VALUE;
+
+ return c.getMaximumSize().width;
+ }
+
+
+ private boolean isMaxSet(Component c)
+ {
+ if (IMS_METHOD != null) {
+ try {
+ return ((Boolean) IMS_METHOD.invoke(c, null)).booleanValue();
+ } catch (Exception e) {
+ IMS_METHOD = null; // So we do not try every time.
+ }
+ }
+ return isMaxSizeSetOn1_4();
+ }
+
+ public final ContainerWrapper getParent()
+ {
+ Container p = c.getParent();
+ return p != null ? new SwingContainerWrapper(p) : null;
+ }
+
+ public final int getHorizontalScreenDPI()
+ {
+ return c.getToolkit().getScreenResolution();
+ }
+
+ public final int getVerticalScreenDPI()
+ {
+ return c.getToolkit().getScreenResolution();
+ }
+
+ public final int getScreenWidth()
+ {
+ return c.getToolkit().getScreenSize().width;
+ }
+
+ public final int getScreenHeight()
+ {
+ return c.getToolkit().getScreenSize().height;
+ }
+
+ public final boolean hasBaseline()
+ {
+ return bl;
+ }
+
+ public final String getLinkId()
+ {
+ return c.getName();
+ }
+
+ public final void setBounds(int x, int y, int width, int height)
+ {
+ c.setBounds(x, y, width, height);
+ }
+
+ public boolean isVisible()
+ {
+ return c.isVisible();
+ }
+
+ public final int[] getVisualPadding()
+ {
+ if (vp && c instanceof JTabbedPane) {
+ if (UIManager.getLookAndFeel().getClass().getName().endsWith("WindowsLookAndFeel"))
+ return new int[] {-1, 0, 2, 2};
+ }
+ return null;
+ }
+
+ public static boolean isMaxSizeSetOn1_4()
+ {
+ return maxSet;
+ }
+
+ public static void setMaxSizeSetOn1_4(boolean b)
+ {
+ maxSet = b;
+ }
+
+ public final static boolean isVisualPaddingEnabled()
+ {
+ return vp;
+ }
+
+ public final static void setVisualPaddingEnabled(boolean b)
+ {
+ vp = b;
+ }
+
+ public final void paintDebugOutline()
+ {
+ if (c.isShowing() == false)
+ return;
+
+ Graphics2D g = (Graphics2D) c.getGraphics();
+ if (g == null)
+ return;
+
+ g.setPaint(DB_COMP_OUTLINE);
+ g.setStroke(new BasicStroke(1f, BasicStroke.CAP_SQUARE, BasicStroke.JOIN_MITER, 10f, new float[] {2f, 4f}, 0));
+ g.drawRect(0, 0, getWidth() - 1, getHeight() - 1);
+ }
+
+ public int getComponetType(boolean disregardScrollPane)
+ {
+ if (compType == TYPE_UNSET)
+ compType = checkType(disregardScrollPane);
+
+ return compType;
+ }
+
+ public int getLayoutHashCode()
+ {
+ Dimension d = c.getMaximumSize();
+ int h = d.width + (d.height << 5);
+
+ d = c.getPreferredSize();
+ h += (d.width << 10) + (d.height << 15);
+
+ d = c.getMinimumSize();
+ h += (d.width << 20) + (d.height << 25);
+
+ if (c.isVisible())
+ h += 1324511;
+
+ String id = getLinkId();
+ if (id != null)
+ h += id.hashCode();
+ return h;
+
+ // Since 2.3 will check the isValid instead everything that affects that can be removed from the layout hashcode.
+
+// String id = getLinkId();
+// return id != null ? id.hashCode() : 1;
+ }
+
+ private final int checkType(boolean disregardScrollPane)
+ {
+ Component c = this.c;
+
+ if (disregardScrollPane) {
+ if (c instanceof JScrollPane) {
+ c = ((JScrollPane) c).getViewport().getView();
+ } else if (c instanceof ScrollPane) {
+ c = ((ScrollPane) c).getComponent(0);
+ }
+ }
+
+ if (c instanceof JTextField || c instanceof TextField) {
+ return TYPE_TEXT_FIELD;
+ } else if (c instanceof JLabel || c instanceof Label) {
+ return TYPE_LABEL;
+ } else if (c instanceof JToggleButton || c instanceof Checkbox) {
+ return TYPE_CHECK_BOX;
+ } else if (c instanceof AbstractButton || c instanceof Button) {
+ return TYPE_BUTTON;
+ } else if (c instanceof JComboBox || c instanceof Choice) {
+ return TYPE_LABEL;
+ } else if (c instanceof JTextComponent || c instanceof TextComponent) {
+ return TYPE_TEXT_AREA;
+ } else if (c instanceof JPanel || c instanceof Canvas) {
+ return TYPE_PANEL;
+ } else if (c instanceof JList || c instanceof List) {
+ return TYPE_LIST;
+ } else if (c instanceof JTable) {
+ return TYPE_TABLE;
+ } else if (c instanceof JSeparator) {
+ return TYPE_SEPARATOR;
+ } else if (c instanceof JSpinner) {
+ return TYPE_SPINNER;
+ } else if (c instanceof JProgressBar) {
+ return TYPE_PROGRESS_BAR;
+ } else if (c instanceof JSlider) {
+ return TYPE_SLIDER;
+ } else if (c instanceof JScrollPane) {
+ return TYPE_SCROLL_PANE;
+ } else if (c instanceof JScrollBar || c instanceof Scrollbar) {
+ return TYPE_SCROLL_BAR;
+ } else if (c instanceof Container) { // only AWT components is not containers.
+ return TYPE_CONTAINER;
+ }
+ return TYPE_UNKNOWN;
+ }
+
+ public final int hashCode()
+ {
+ return getComponent().hashCode();
+ }
+
+ public final boolean equals(Object o)
+ {
+ if (o instanceof ComponentWrapper == false)
+ return false;
+
+ return getComponent().equals(((ComponentWrapper) o).getComponent());
+ }
+
+ /** Cached method used for getting base line with reflection.
+ */
+ private static Method BL_METHOD = null;
+ static {
+ try {
+ BL_METHOD = Component.class.getDeclaredMethod("getBaseline", new Class[] {int.class, int.class});
+ } catch (Throwable e) { // No such method or security exception
+ }
+ }
+
+ private static Method IMS_METHOD = null;
+ static {
+ try {
+ IMS_METHOD = Component.class.getDeclaredMethod("isMaximumSizeSet", null);
+ } catch (Throwable e) { // No such method or security exception
+ }
+ }
+}
diff --git a/prototypes/miglayout/net/miginfocom/swing/SwingContainerWrapper.java b/prototypes/miglayout/net/miginfocom/swing/SwingContainerWrapper.java
index ae48876e..acb9c95a 100644
--- a/prototypes/miglayout/net/miginfocom/swing/SwingContainerWrapper.java
+++ b/prototypes/miglayout/net/miginfocom/swing/SwingContainerWrapper.java
@@ -1,108 +1,108 @@
-package net.miginfocom.swing;
-/*
- * License (BSD):
- * ==============
- *
- * Copyright (c) 2004, Mikael Grev, MiG InfoCom AB. (miglayout (at) miginfocom (dot) com)
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without modification,
- * are permitted provided that the following conditions are met:
- * Redistributions of source code must retain the above copyright notice, this list
- * of conditions and the following disclaimer.
- * Redistributions in binary form must reproduce the above copyright notice, this
- * list of conditions and the following disclaimer in the documentation and/or other
- * materials provided with the distribution.
- * Neither the name of the MiG InfoCom AB nor the names of its contributors may be
- * used to endorse or promote products derived from this software without specific
- * prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
- * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
- * IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
- * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
- * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA,
- * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
- * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
- * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY
- * OF SUCH DAMAGE.
- *
- * @version 1.0
- * @author Mikael Grev, MiG InfoCom AB
- * Date: 2006-sep-08
- */
-
-import net.miginfocom.layout.ComponentWrapper;
-import net.miginfocom.layout.ContainerWrapper;
-
-import java.awt.*;
-
-/**
- */
-public final class SwingContainerWrapper extends SwingComponentWrapper implements ContainerWrapper
-{
- /** Debug color for cell outline.
- */
- private static final Color DB_CELL_OUTLINE = new Color(255, 0, 0);
-
- public SwingContainerWrapper(Container c)
- {
- super(c);
- }
-
- public ComponentWrapper[] getComponents()
- {
- Container c = (Container) getComponent();
- ComponentWrapper[] cws = new ComponentWrapper[c.getComponentCount()];
- for (int i = 0; i < cws.length; i++)
- cws[i] = new SwingComponentWrapper(c.getComponent(i));
- return cws;
- }
-
- public int getComponentCount()
- {
- return ((Container) getComponent()).getComponentCount();
- }
-
- public Object getLayout()
- {
- return ((Container) getComponent()).getLayout();
- }
-
- public final boolean isLeftToRight()
- {
- return ((Container) getComponent()).getComponentOrientation().isLeftToRight();
- }
-
- public final void paintDebugCell(int x, int y, int width, int height)
- {
- Component c = (Component) getComponent();
- if (c.isShowing() == false)
- return;
-
- Graphics2D g = (Graphics2D) c.getGraphics();
- if (g == null)
- return;
-
- g.setStroke(new BasicStroke(1f, BasicStroke.CAP_SQUARE, BasicStroke.JOIN_MITER, 10f, new float[] {2f, 3f}, 0));
- g.setPaint(DB_CELL_OUTLINE);
- g.drawRect(x, y, width - 1, height - 1);
- }
-
- public int getComponetType(boolean disregardScrollPane)
- {
- return TYPE_CONTAINER;
- }
-
- // Removed for 2.3 because the parent.isValid() in MigLayout will catch this instead.
-// public int getLayoutHashCode()
-// {
-// int h = super.getLayoutHashCode();
-//
-// if (isLeftToRight())
-// h += 416343;
-//
-// return h;
-// }
-}
+package net.miginfocom.swing;
+/*
+ * License (BSD):
+ * ==============
+ *
+ * Copyright (c) 2004, Mikael Grev, MiG InfoCom AB. (miglayout (at) miginfocom (dot) com)
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification,
+ * are permitted provided that the following conditions are met:
+ * Redistributions of source code must retain the above copyright notice, this list
+ * of conditions and the following disclaimer.
+ * Redistributions in binary form must reproduce the above copyright notice, this
+ * list of conditions and the following disclaimer in the documentation and/or other
+ * materials provided with the distribution.
+ * Neither the name of the MiG InfoCom AB nor the names of its contributors may be
+ * used to endorse or promote products derived from this software without specific
+ * prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+ * IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
+ * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+ * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA,
+ * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
+ * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY
+ * OF SUCH DAMAGE.
+ *
+ * @version 1.0
+ * @author Mikael Grev, MiG InfoCom AB
+ * Date: 2006-sep-08
+ */
+
+import net.miginfocom.layout.ComponentWrapper;
+import net.miginfocom.layout.ContainerWrapper;
+
+import java.awt.*;
+
+/**
+ */
+public final class SwingContainerWrapper extends SwingComponentWrapper implements ContainerWrapper
+{
+ /** Debug color for cell outline.
+ */
+ private static final Color DB_CELL_OUTLINE = new Color(255, 0, 0);
+
+ public SwingContainerWrapper(Container c)
+ {
+ super(c);
+ }
+
+ public ComponentWrapper[] getComponents()
+ {
+ Container c = (Container) getComponent();
+ ComponentWrapper[] cws = new ComponentWrapper[c.getComponentCount()];
+ for (int i = 0; i < cws.length; i++)
+ cws[i] = new SwingComponentWrapper(c.getComponent(i));
+ return cws;
+ }
+
+ public int getComponentCount()
+ {
+ return ((Container) getComponent()).getComponentCount();
+ }
+
+ public Object getLayout()
+ {
+ return ((Container) getComponent()).getLayout();
+ }
+
+ public final boolean isLeftToRight()
+ {
+ return ((Container) getComponent()).getComponentOrientation().isLeftToRight();
+ }
+
+ public final void paintDebugCell(int x, int y, int width, int height)
+ {
+ Component c = (Component) getComponent();
+ if (c.isShowing() == false)
+ return;
+
+ Graphics2D g = (Graphics2D) c.getGraphics();
+ if (g == null)
+ return;
+
+ g.setStroke(new BasicStroke(1f, BasicStroke.CAP_SQUARE, BasicStroke.JOIN_MITER, 10f, new float[] {2f, 3f}, 0));
+ g.setPaint(DB_CELL_OUTLINE);
+ g.drawRect(x, y, width - 1, height - 1);
+ }
+
+ public int getComponetType(boolean disregardScrollPane)
+ {
+ return TYPE_CONTAINER;
+ }
+
+ // Removed for 2.3 because the parent.isValid() in MigLayout will catch this instead.
+// public int getLayoutHashCode()
+// {
+// int h = super.getLayoutHashCode();
+//
+// if (isLeftToRight())
+// h += 416343;
+//
+// return h;
+// }
+}