Exemplo n.º 1
0
  // documentation inherited
  public void validate() {
    if (!_valid) {
      // lay ourselves out
      layout();

      // now validate our children
      applyOperation(
          new ChildOp() {
            public void apply(BComponent child) {
              child.validate();
            }
          });

      // finally mark ourselves as valid
      _valid = true;
    }
  }
Exemplo n.º 2
0
    @Override // from BComponent
    public void layout() {
      Insets insets = getInsets();
      int twidth = getWidth() - insets.getHorizontal();
      int theight = getHeight() - insets.getVertical();
      int gap = ((GroupLayout) getLayoutManager()).getGap();

      // first make sure all of our entries have been measured and
      // compute our total height and extent
      int totheight = 0;
      for (Entry<V, C> entry : _values) {
        if (entry.height < 0) {
          if (entry.component == null) {
            entry.component = createComponent(entry.value);
          }
          boolean remove = false;
          if (!entry.component.isAdded()) {
            add(entry.component);
            remove = true;
          }
          entry.height = entry.component.getPreferredSize(twidth, 0).height;
          if (remove) {
            remove(entry.component);
          }
        }
        totheight += entry.height;
      }
      if (_values.size() > 1) {
        totheight += (gap * _values.size() - 1);
      }
      int extent = Math.min(theight, totheight);

      // if our most recent value was added with _snap then we scroll to
      // the bottom on this layout and clear our snappy flag
      int value = _snap ? (totheight - extent) : _model.getValue();
      _snap = false;

      // if our extent or total height have changed, update the model
      // (because we're currently invalid, the resulting call to
      // invalidate() will have no effect)
      if (extent != _model.getExtent() || totheight != _model.getMaximum()) {
        _model.setRange(0, value, extent, totheight);
      }

      // now back up from the last component until we reach the first one
      // that's in view
      _offset = _model.getValue();
      int compIx = 0;
      for (int ii = 0; ii < _values.size(); ii++) {
        Entry<V, C> entry = _values.get(ii);
        if (_offset < entry.height) {
          compIx = ii;
          break;
        }
        _offset -= (entry.height + gap);

        // remove and clear out the components before our top component
        if (entry.component != null) {
          if (entry.component.isAdded()) {
            remove(entry.component);
          }
          entry.component = null;
        }
      }

      // compensate for the partially visible topmost component
      extent += _offset;

      // now add components until we use up our extent
      int topIx = compIx;
      while (compIx < _values.size() && extent > 0) {
        Entry<V, C> entry = _values.get(compIx);
        if (entry.component == null) {
          entry.component = createComponent(entry.value);
        }
        if (!entry.component.isAdded()) {
          add(compIx - topIx, entry.component);
        }
        extent -= (entry.height + gap);
        compIx++;
      }

      // lastly remove any components below the last visible component
      while (compIx < _values.size()) {
        Entry<V, C> entry = _values.get(compIx);
        if (entry.component != null) {
          if (entry.component.isAdded()) {
            remove(entry.component);
          }
          entry.component = null;
        }
        compIx++;
      }

      // now have the layout manager layout our added components
      super.layout();
    }