Search in sources :

Example 1 with FixedSpringLayout

use of com.servoy.j2db.util.gui.FixedSpringLayout in project servoy-client by Servoy.

the class DataRendererFactory method setBasicSettings.

private void setBasicSettings(IDataRenderer panel, Color bg, Dimension size, Point location, boolean printing) {
    DataRenderer dr = (DataRenderer) panel;
    if (dr != null) {
        if (bg != null) {
            dr.setBackground(bg);
        }
        if (printing) {
            dr.setLayout(new FixedSpringLayout());
        } else {
            dr.setLayout(new AnchorLayout(size));
            dr.setPreferredSize(size);
        }
        dr.setSize(size);
        dr.setLocation(location);
    }
}
Also used : AnchorLayout(com.servoy.j2db.util.gui.AnchorLayout) FixedSpringLayout(com.servoy.j2db.util.gui.FixedSpringLayout) IDataRenderer(com.servoy.j2db.ui.IDataRenderer)

Example 2 with FixedSpringLayout

use of com.servoy.j2db.util.gui.FixedSpringLayout in project servoy-client by Servoy.

the class DataRendererFactory method addSpringsBetweenComponents.

public static void addSpringsBetweenComponents(IApplication application, DataRenderer panel) {
    Map componentsListToBeHandeldOnX = new HashMap();
    Map componentsListToBeHandeldOnY = new HashMap();
    Map componentsListToBeHandeldOnWidth = new HashMap();
    Map componentsListToBeHandeldOnHeigth = new HashMap();
    FixedSpringLayout sl = (FixedSpringLayout) panel.getLayout();
    FixedSpringLayout.Constraints pcons = sl.getConstraints(panel);
    Component[] allc = panel.getComponents();
    for (Component comp : allc) {
        if (comp instanceof EnableScrollPanel) {
            ((EnableScrollPanel) comp).setHorizontalScrollBarPolicy(ScrollPaneConstants.HORIZONTAL_SCROLLBAR_NEVER);
            ((EnableScrollPanel) comp).setVerticalScrollBarPolicy(ScrollPaneConstants.VERTICAL_SCROLLBAR_NEVER);
        }
        int slide = ISupportPrintSliding.NO_SLIDING;
        Map componentsListToBeHandeld = panel.getComponentsUsingSliding();
        if (componentsListToBeHandeld != null && componentsListToBeHandeld.containsKey(comp)) {
            slide = ((Integer) componentsListToBeHandeld.get(comp)).intValue();
            for (Component ccomp : allc) {
                if (slide != ISupportPrintSliding.NO_SLIDING && ccomp != comp && ccomp.getBounds().intersects(comp.getBounds())) {
                    application.reportJSError(application.getI18NMessage("servoy.sliding.error.overlap"), // $NON-NLS-1$ //$NON-NLS-2$
                    application.getI18NMessage("servoy.sliding.error.overlap.components", new Object[] { comp, ccomp }));
                }
            }
        }
        Spring sx = Spring.constant(comp.getX());
        Spring sy = Spring.constant(comp.getY());
        Spring sw = Spring.constant(comp.getWidth());
        Spring sh = Spring.constant(comp.getHeight());
        if (((slide & ISupportPrintSliding.ALLOW_MOVE_MIN_X) == ISupportPrintSliding.ALLOW_MOVE_MIN_X) || ((slide & ISupportPrintSliding.ALLOW_MOVE_PLUS_X) == ISupportPrintSliding.ALLOW_MOVE_PLUS_X)) {
            componentsListToBeHandeldOnX.put(comp, new Integer(slide));
        }
        if (((slide & ISupportPrintSliding.ALLOW_MOVE_MIN_Y) == ISupportPrintSliding.ALLOW_MOVE_MIN_Y) || ((slide & ISupportPrintSliding.ALLOW_MOVE_PLUS_Y) == ISupportPrintSliding.ALLOW_MOVE_PLUS_Y)) {
            componentsListToBeHandeldOnY.put(comp, new Integer(slide));
        }
        if (((slide & ISupportPrintSliding.GROW_WIDTH) == ISupportPrintSliding.GROW_WIDTH) || ((slide & ISupportPrintSliding.SHRINK_WIDTH) == ISupportPrintSliding.SHRINK_WIDTH)) {
            // if (comp instanceof EnableScrollPanel)
            // {
            // ((EnableScrollPanel)comp).setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_NEVER);
            // ((EnableScrollPanel)comp).setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_NEVER);
            // }
            componentsListToBeHandeldOnWidth.put(comp, new Integer(slide));
            int max = Short.MAX_VALUE;
            int min = 0;
            if (((slide & ISupportPrintSliding.GROW_WIDTH) != ISupportPrintSliding.GROW_WIDTH) && ((slide & ISupportPrintSliding.SHRINK_WIDTH) == ISupportPrintSliding.SHRINK_WIDTH)) {
                min = 0;
                max = comp.getWidth();
            }
            if (((slide & ISupportPrintSliding.GROW_WIDTH) == ISupportPrintSliding.GROW_WIDTH) && ((slide & ISupportPrintSliding.SHRINK_WIDTH) != ISupportPrintSliding.SHRINK_WIDTH)) {
                min = comp.getWidth();
                max = Short.MAX_VALUE;
            }
            sw = new AbsWidthSpring(comp, min, max);
        }
        if (((slide & ISupportPrintSliding.GROW_HEIGHT) == ISupportPrintSliding.GROW_HEIGHT) || ((slide & ISupportPrintSliding.SHRINK_HEIGHT) == ISupportPrintSliding.SHRINK_HEIGHT)) {
            componentsListToBeHandeldOnHeigth.put(comp, new Integer(slide));
            int max = Short.MAX_VALUE;
            int min = 0;
            if (((slide & ISupportPrintSliding.GROW_HEIGHT) != ISupportPrintSliding.GROW_HEIGHT) && ((slide & ISupportPrintSliding.SHRINK_HEIGHT) == ISupportPrintSliding.SHRINK_HEIGHT)) {
                min = 0;
                max = comp.getHeight();
            }
            if (((slide & ISupportPrintSliding.GROW_HEIGHT) == ISupportPrintSliding.GROW_HEIGHT) && ((slide & ISupportPrintSliding.SHRINK_HEIGHT) != ISupportPrintSliding.SHRINK_HEIGHT)) {
                min = comp.getHeight();
                max = Short.MAX_VALUE;
            }
            sh = new AbsHeightSpring(comp, min, max);
        }
        // new FixedSpringLayout.Constraints(sx,sy,sw,sh);
        FixedSpringLayout.Constraints constr = sl.getConstraints(comp);
        constr.setX(sx);
        constr.setY(sy);
        constr.setWidth(sw);
        constr.setHeight(sh);
    }
    Component[] allSortedXy = new Component[allc.length];
    System.arraycopy(allc, 0, allSortedXy, 0, allc.length);
    Arrays.sort(allSortedXy, PositionComparator.XY_COMPONENT_COMPARATOR);
    Component[] allSortedYx = new Component[allc.length];
    System.arraycopy(allc, 0, allSortedYx, 0, allc.length);
    Arrays.sort(allSortedYx, PositionComparator.YX_COMPONENT_COMPARATOR);
    // add west component spring for sliding components that can move horizontally, to set component location
    Iterator it1 = componentsListToBeHandeldOnX.keySet().iterator();
    while (it1.hasNext()) {
        Component element1 = (Component) it1.next();
        BarSpring bs = null;
        // X space left to the element1's WEST border from
        int minXSpaceOnLeft = Integer.MAX_VALUE;
        // components on X exactly on the left of element1
        // sliding X components that are exactly on the left of element1
        ArrayList slidingComponentsOnLeft = new ArrayList();
        // the right most non sliding component that is on the left of element1
        Component rightMostNonSlidingLastComponentOnLeft = null;
        int xSpaceForRightmostNonSlidingLastComponentOnLeft = Integer.MAX_VALUE;
        for (Component element2 : allSortedYx) {
            boolean isExactlyOnLeftOfElement1 = true;
            if (element2 == element1)
                continue;
            Rectangle join = createSmallestHorizontalJoin(element2.getBounds(), element1.getBounds());
            if (join == null || join.isEmpty()) {
                isExactlyOnLeftOfElement1 = false;
            } else {
                for (Component element3 : allSortedYx) {
                    if (element3 != element1 && element3 != element2 && join.intersects(element3.getBounds())) {
                        isExactlyOnLeftOfElement1 = false;
                        // too large, contains other eleemnts in between
                        break;
                    }
                }
            }
            if (isExactlyOnLeftOfElement1) {
                int xSpace = element1.getX() - (element2.getX() + element2.getWidth());
                minXSpaceOnLeft = Math.min(minXSpaceOnLeft, xSpace);
                if (componentsListToBeHandeldOnWidth.containsKey(element2) || componentsListToBeHandeldOnX.containsKey(element2)) {
                    slidingComponentsOnLeft.add(element2);
                } else {
                    if (xSpaceForRightmostNonSlidingLastComponentOnLeft > xSpace) {
                        xSpaceForRightmostNonSlidingLastComponentOnLeft = xSpace;
                        rightMostNonSlidingLastComponentOnLeft = element2;
                    }
                }
            }
        }
        if (rightMostNonSlidingLastComponentOnLeft != null) {
            bs = new BarSpring();
            sl.getConstraints(element1).setConstraint(FixedSpringLayout.WEST, bs);
            bs.add(Spring.sum(Spring.constant(minXSpaceOnLeft, minXSpaceOnLeft, Short.MAX_VALUE), sl.getConstraint(FixedSpringLayout.EAST, rightMostNonSlidingLastComponentOnLeft)));
        } else if (slidingComponentsOnLeft.size() > 0) {
            bs = new BarSpring();
            sl.getConstraints(element1).setConstraint(FixedSpringLayout.WEST, bs);
        }
        for (int i = slidingComponentsOnLeft.size() - 1; i >= 0; i--) {
            bs.add(Spring.sum(Spring.constant(minXSpaceOnLeft, minXSpaceOnLeft, Short.MAX_VALUE), sl.getConstraint(FixedSpringLayout.EAST, (Component) slidingComponentsOnLeft.get(i))));
        }
    }
    // add north component spring for sliding components that allow vertical move, to set component location
    Iterator it2 = componentsListToBeHandeldOnY.keySet().iterator();
    while (it2.hasNext()) {
        Component element1 = (Component) it2.next();
        BarSpring bs = null;
        // Y space left to the element1's NORTH border from
        int minYSpaceOnTop = Integer.MAX_VALUE;
        // components on Y right on top of element1
        // sliding Y components that are right on top of element1
        ArrayList slidingComponentsOnTop = new ArrayList();
        // the lowest non sliding component that is on top of element1
        Component lowestNonSlidingLastComponentOnTop = null;
        int ySpaceForLowestNonSlidingLastComponentOnTop = Integer.MAX_VALUE;
        for (Component element2 : allSortedXy) {
            boolean isRightOnTopOfElement1 = true;
            if (element2 == element1)
                continue;
            Rectangle join = createSmallestVerticalJoin(element2.getBounds(), element1.getBounds());
            if (join == null || join.isEmpty()) {
                isRightOnTopOfElement1 = false;
            } else {
                for (Component element3 : allSortedXy) {
                    if (element3 != element1 && element3 != element2 && join.intersects(element3.getBounds())) {
                        isRightOnTopOfElement1 = false;
                        // too large, contains other elements in between
                        break;
                    }
                }
            }
            if (isRightOnTopOfElement1) {
                int ySpace = element1.getY() - (element2.getY() + element2.getHeight());
                minYSpaceOnTop = Math.min(minYSpaceOnTop, ySpace);
                if (componentsListToBeHandeldOnHeigth.containsKey(element2) || componentsListToBeHandeldOnY.containsKey(element2)) {
                    slidingComponentsOnTop.add(element2);
                } else {
                    if (ySpaceForLowestNonSlidingLastComponentOnTop > ySpace) {
                        ySpaceForLowestNonSlidingLastComponentOnTop = ySpace;
                        lowestNonSlidingLastComponentOnTop = element2;
                    }
                }
            }
        }
        if (lowestNonSlidingLastComponentOnTop != null) {
            bs = new BarSpring();
            sl.getConstraints(element1).setConstraint(FixedSpringLayout.NORTH, bs);
            bs.add(Spring.sum(Spring.constant(minYSpaceOnTop, minYSpaceOnTop, Short.MAX_VALUE), sl.getConstraint(FixedSpringLayout.SOUTH, lowestNonSlidingLastComponentOnTop)));
        } else if (slidingComponentsOnTop.size() > 0) {
            bs = new BarSpring();
            sl.getConstraints(element1).setConstraint(FixedSpringLayout.NORTH, bs);
        }
        for (int i = slidingComponentsOnTop.size() - 1; i >= 0; i--) {
            bs.add(Spring.sum(Spring.constant(minYSpaceOnTop, minYSpaceOnTop, Short.MAX_VALUE), sl.getConstraint(FixedSpringLayout.SOUTH, (Component) slidingComponentsOnTop.get(i))));
        }
    }
    // add east panel spring, to set Panel width
    Rectangle pb = panel.getBounds();
    BarSpring bs = null;
    int spaceToRightMargin = 0;
    if (componentsListToBeHandeldOnWidth.size() > 0) {
        // width left to the part's EAST border from the right-most component on Y
        int minWidthLeft = Integer.MAX_VALUE;
        // sliding X components that are last on X axis
        ArrayList lastSlidingComponentsOnX = new ArrayList();
        // the right most non sliding component that is last on X axis
        Component lowestNonSlidingLastComponentOnX = null;
        int widthLeftForLowestNonSlidingLastComponentOnX = Integer.MAX_VALUE;
        for (int i = allSortedXy.length - 1; i >= 0; i--) {
            // are there no other components between it and the part east border?
            boolean isALastComponentOnX = true;
            Component element = allSortedXy[i];
            Rectangle rect1 = new Rectangle(element.getBounds());
            int widthLeft = pb.width - (rect1.x + rect1.width);
            rect1.width += widthLeft;
            for (Component element2 : allSortedXy) {
                if (element2 != element && element.getBounds().intersects(element2.getBounds())) {
                    // overlapping elements
                    continue;
                }
                if (element2 != element && rect1.intersects(element2.getBounds())) {
                    isALastComponentOnX = false;
                    // too large, contains other elements in between
                    break;
                }
            }
            if (isALastComponentOnX) {
                minWidthLeft = Math.min(minWidthLeft, widthLeft);
                if (componentsListToBeHandeldOnWidth.containsKey(element) || componentsListToBeHandeldOnX.containsKey(element)) {
                    lastSlidingComponentsOnX.add(element);
                } else {
                    if (widthLeftForLowestNonSlidingLastComponentOnX > widthLeft) {
                        widthLeftForLowestNonSlidingLastComponentOnX = widthLeft;
                        lowestNonSlidingLastComponentOnX = element;
                    }
                }
            }
        }
        // add springs needed to determine the width of the part
        if (lowestNonSlidingLastComponentOnX != null) {
            bs = new BarSpring();
            pcons.setConstraint(FixedSpringLayout.EAST, bs);
            bs.add(Spring.sum(Spring.constant(minWidthLeft, minWidthLeft, Short.MAX_VALUE), sl.getConstraint(FixedSpringLayout.EAST, lowestNonSlidingLastComponentOnX)));
            spaceToRightMargin = minWidthLeft;
        } else if (lastSlidingComponentsOnX.size() > 0) {
            bs = new BarSpring();
            pcons.setConstraint(FixedSpringLayout.EAST, bs);
            spaceToRightMargin = minWidthLeft;
        }
        for (int i = lastSlidingComponentsOnX.size() - 1; i >= 0; i--) {
            bs.add(Spring.sum(Spring.constant(minWidthLeft, minWidthLeft, Short.MAX_VALUE), sl.getConstraint(FixedSpringLayout.EAST, (Component) lastSlidingComponentsOnX.get(i))));
        }
        panel.setSpaceToRightMargin(spaceToRightMargin);
    }
    if (// add fixed spring for panel size
    bs == null) {
        pcons.setConstraint(FixedSpringLayout.EAST, Spring.constant(panel.getWidth()));
    }
    // add south panel spring, to set Panel height
    bs = null;
    if (componentsListToBeHandeldOnHeigth.size() > 0) {
        // height left to the part's SOUTH border from the lowest component on Y
        int minHeightLeft = Integer.MAX_VALUE;
        // sliding Y components that are last on Y axis
        ArrayList lastSlidingComponentsOnY = new ArrayList();
        // the lowest non sliding component that is last on Y axis
        Component lowestNonSlidingLastComponentOnY = null;
        int heightLeftForLowestNonSlidingLastComponentOnY = Integer.MAX_VALUE;
        for (int i = allSortedYx.length - 1; i >= 0; i--) {
            // are there no other components between it and the part south border?
            boolean isALastComponentOnY = true;
            Component element = allSortedYx[i];
            Rectangle rect1 = new Rectangle(element.getBounds());
            int heightLeft = pb.height - (rect1.y + rect1.height);
            rect1.height += heightLeft;
            for (Component element2 : allSortedYx) {
                if (element2 != element && element.getBounds().intersects(element2.getBounds())) {
                    // overlapping elements
                    continue;
                }
                if (element2 != element && rect1.intersects(element2.getBounds())) {
                    isALastComponentOnY = false;
                    // too large, contains other elements in between
                    break;
                }
            }
            if (isALastComponentOnY) {
                minHeightLeft = Math.min(minHeightLeft, heightLeft);
                if (componentsListToBeHandeldOnHeigth.containsKey(element) || componentsListToBeHandeldOnY.containsKey(element)) {
                    lastSlidingComponentsOnY.add(element);
                } else {
                    if (heightLeftForLowestNonSlidingLastComponentOnY > heightLeft) {
                        heightLeftForLowestNonSlidingLastComponentOnY = heightLeft;
                        lowestNonSlidingLastComponentOnY = element;
                    }
                }
            }
        }
        // add springs needed to determine the height of the part
        if (lowestNonSlidingLastComponentOnY != null) {
            bs = new BarSpring();
            pcons.setConstraint(FixedSpringLayout.SOUTH, bs);
            bs.add(Spring.sum(Spring.constant(minHeightLeft, minHeightLeft, Short.MAX_VALUE), sl.getConstraint(FixedSpringLayout.SOUTH, lowestNonSlidingLastComponentOnY)));
        } else if (lastSlidingComponentsOnY.size() > 0) {
            bs = new BarSpring();
            pcons.setConstraint(FixedSpringLayout.SOUTH, bs);
        }
        for (int i = lastSlidingComponentsOnY.size() - 1; i >= 0; i--) {
            bs.add(Spring.sum(Spring.constant(minHeightLeft, minHeightLeft, Short.MAX_VALUE), sl.getConstraint(FixedSpringLayout.SOUTH, (Component) lastSlidingComponentsOnY.get(i))));
        }
    }
    if (// add fixed spring for panel size
    bs == null) {
        pcons.setConstraint(FixedSpringLayout.SOUTH, Spring.constant(panel.getHeight()));
    }
}
Also used : HashMap(java.util.HashMap) LinkedHashMap(java.util.LinkedHashMap) ArrayList(java.util.ArrayList) Rectangle(java.awt.Rectangle) Spring(com.servoy.j2db.util.gui.Spring) Point(java.awt.Point) EnableScrollPanel(com.servoy.j2db.util.EnableScrollPanel) FixedSpringLayout(com.servoy.j2db.util.gui.FixedSpringLayout) Iterator(java.util.Iterator) GraphicalComponent(com.servoy.j2db.persistence.GraphicalComponent) IFieldComponent(com.servoy.j2db.ui.IFieldComponent) Component(java.awt.Component) JComponent(javax.swing.JComponent) Map(java.util.Map) HashMap(java.util.HashMap) LinkedHashMap(java.util.LinkedHashMap)

Aggregations

FixedSpringLayout (com.servoy.j2db.util.gui.FixedSpringLayout)2 GraphicalComponent (com.servoy.j2db.persistence.GraphicalComponent)1 IDataRenderer (com.servoy.j2db.ui.IDataRenderer)1 IFieldComponent (com.servoy.j2db.ui.IFieldComponent)1 EnableScrollPanel (com.servoy.j2db.util.EnableScrollPanel)1 AnchorLayout (com.servoy.j2db.util.gui.AnchorLayout)1 Spring (com.servoy.j2db.util.gui.Spring)1 Component (java.awt.Component)1 Point (java.awt.Point)1 Rectangle (java.awt.Rectangle)1 ArrayList (java.util.ArrayList)1 HashMap (java.util.HashMap)1 Iterator (java.util.Iterator)1 LinkedHashMap (java.util.LinkedHashMap)1 Map (java.util.Map)1 JComponent (javax.swing.JComponent)1