private void checkCache(Container paramContainer) { if (paramContainer == null) return; if (this.dirty) this.grid = null; int i = PlatformDefaults.getModCount(); if (this.lastModCount != i) { this.grid = null; this.lastModCount = i; } if (!paramContainer.isValid()) { if (!this.lastWasInvalid) { this.lastWasInvalid = true; int j = 0; int k = 0; Object localObject1 = this.ccMap.keySet().iterator(); while (((Iterator) localObject1).hasNext()) { ComponentWrapper localComponentWrapper = (ComponentWrapper) ((Iterator) localObject1).next(); Object localObject2 = localComponentWrapper.getComponent(); if (((localObject2 instanceof JTextArea)) || ((localObject2 instanceof JEditorPane))) k = 1; j += localComponentWrapper.getLayoutHashCode(); } if (k != 0) resetLastInvalidOnParent(paramContainer); if (j != this.lastHash) { this.grid = null; this.lastHash = j; } localObject1 = paramContainer.getSize(); if ((this.lastInvalidSize == null) || (!this.lastInvalidSize.equals(localObject1))) { if (this.grid != null) this.grid.invalidateContainerSize(); this.lastInvalidSize = ((Dimension) localObject1); } } } else this.lastWasInvalid = false; ContainerWrapper localContainerWrapper = checkParent(paramContainer); setDebug(localContainerWrapper, getDebugMillis() > 0); if (this.grid == null) this.grid = new Grid( localContainerWrapper, this.lc, this.rowSpecs, this.colSpecs, this.ccMap, this.callbackList); this.dirty = false; }
/** * Returns the minimum or preferred dimension needed to layout the target container. * * @param target target to get layout size for * @param preferred should preferred size be calculated * @return the dimension to layout the target container */ private Dimension layoutSize(Container target, boolean preferred) { synchronized (target.getTreeLock()) { // Each row must fit with the width allocated to the containter. // When the container width = 0, the preferred width of the container // has not yet been calculated so lets ask for the maximum. int targetWidth = target.getSize().width; if (targetWidth == 0) { targetWidth = Integer.MAX_VALUE; } int hgap = getHgap(); int vgap = getVgap(); Insets insets = target.getInsets(); int horizontalInsetsAndGap = insets.left + insets.right + (hgap * 2); int maxWidth = targetWidth - horizontalInsetsAndGap; // Fit components into the allowed width Dimension dim = new Dimension(0, 0); int rowWidth = 0; int rowHeight = 0; int nmembers = target.getComponentCount(); for (int i = 0; i < nmembers; i++) { Component m = target.getComponent(i); if (m.isVisible()) { Dimension d = preferred ? m.getPreferredSize() : m.getMinimumSize(); // Can't add the component to current row. Start a new row. if (rowWidth + d.width > maxWidth) { addRow(dim, rowWidth, rowHeight); rowWidth = 0; rowHeight = 0; } // Add a horizontal gap for all components after the first if (rowWidth != 0) { rowWidth += hgap; } rowWidth += d.width; rowHeight = Math.max(rowHeight, d.height); } } addRow(dim, rowWidth, rowHeight); dim.width += horizontalInsetsAndGap; dim.height += insets.top + insets.bottom + vgap * 2; // When using a scroll pane or the DecoratedLookAndFeel we need to // make sure the preferred size is less than the size of the // target containter so shrinking the container size works // correctly. Removing the horizontal gap is an easy way to do this. Container scrollPane = SwingUtilities.getAncestorOfClass(JScrollPane.class, target); if (scrollPane != null && target.isValid()) { dim.width -= (hgap + 1); } return dim; } }