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;
 }
예제 #2
0
  /**
   * 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;
    }
  }