public void onRenderComponents(final Row row) {
   final Component lastChild = row.getLastChild(); // image button remove
   final RowModel model = getModelFromComponent(row);
   for (int i = 0; i < DLFilterOperator.MAX_ARITY; ++i) { // remove all
     lastChild.getPreviousSibling().setParent(null);
   }
   for (int i = 0; i < DLFilterOperator.MAX_ARITY; ++i) { // insert all
     row.insertBefore(model.getPosition(i + 1), lastChild);
   }
   LOGGER.debug("Components have been rendered.");
 }
Пример #2
0
  public void doListDataChange(ListDataEvent event) {
    // when this is called _model is never null
    final ListModel _model = _listbox.getModel();
    final int newsz = _model.getSize(), oldsz = _listbox.getItemCount();
    int min = event.getIndex0(), max = event.getIndex1(), cnt;

    switch (event.getType()) {
      case ListDataEvent.INTERVAL_ADDED:
        cnt = newsz - oldsz;
        if (cnt <= 0) throw new UiException("Adding causes a smaller list?");
        if ((oldsz <= 0 || cnt > INVALIDATE_THRESHOLD) && !inPagingMold()) _listbox.invalidate();
        // Bug 3147518: avoid memory leak
        // Also better performance (outer better than remove a lot)
        if (min < 0)
          if (max < 0) min = 0;
          else min = max - cnt + 1;
        if (min > oldsz) min = oldsz;

        ListitemRenderer renderer = null;
        final Component next = min < oldsz ? _listbox.getItemAtIndex(min) : null;
        while (--cnt >= 0) {
          if (renderer == null) renderer = (ListitemRenderer) getRealRenderer();
          _listbox.insertBefore(newUnloadedItem(renderer, min++), next);
        }
        break;

      case ListDataEvent.INTERVAL_REMOVED:
        cnt = oldsz - newsz;
        if (cnt <= 0) throw new UiException("Removal causes a larger list?");
        if (min >= 0) max = min + cnt - 1;
        else if (max < 0) max = cnt - 1; // 0 ~ cnt - 1		
        if (max > oldsz - 1) max = oldsz - 1;

        if ((newsz <= 0 || cnt > INVALIDATE_THRESHOLD) && !inPagingMold()) _listbox.invalidate();
        // Bug 3147518: avoid memory leak
        // Also better performance (outer better than remove a lot)

        // detach from end (due to groopfoot issue)
        Component comp = _listbox.getItemAtIndex(max);
        while (--cnt >= 0) {
          Component p = comp.getPreviousSibling();
          comp.detach();
          comp = p;
        }
        break;

      default: // CONTENTS_CHANGED
        syncModel(min, max);
    }
  }
Пример #3
0
  private void syncModel0(int offset, int limit) {
    int min = offset;
    int max = offset + limit - 1;

    final ListModel _model = _listbox.getModel();
    final int newsz = _model.getSize();
    final int oldsz = _listbox.getItemCount();
    final Paginal _pgi = _listbox.getPaginal();
    final boolean inPaging = inPagingMold();
    final boolean shallInvalidated = // Bug 3147518: avoid memory leak
        (min < 0 || min == 0) && (max < 0 || max >= newsz || max >= oldsz);

    int newcnt = newsz - oldsz;
    int atg = _pgi != null ? _listbox.getActivePage() : 0;
    ListitemRenderer renderer = null;
    Component next = null;
    if (oldsz > 0) {
      if (min < 0) min = 0;
      else if (min > oldsz - 1) min = oldsz - 1;
      if (max < 0) max = oldsz - 1;
      else if (max > oldsz - 1) max = oldsz - 1;
      if (min > max) {
        int t = min;
        min = max;
        max = t;
      }

      int cnt = max - min + 1; // # of affected
      if (_model instanceof GroupsListModel) {
        // detach all from end to front since groupfoot
        // must be detached before group
        newcnt += cnt; // add affected later
        if ((shallInvalidated || newcnt > INVALIDATE_THRESHOLD) && !inPaging) _listbox.invalidate();
        // Bug 3147518: avoid memory leak
        // Also better performance (outer better than remove a lot)

        Component comp = _listbox.getItemAtIndex(max);
        next = comp.getNextSibling();
        while (--cnt >= 0) {
          Component p = comp.getPreviousSibling();
          comp.detach();
          comp = p;
        }
      } else { // ListModel
        int addcnt = 0;
        Component item = _listbox.getItemAtIndex(min);
        while (--cnt >= 0) {
          next = item.getNextSibling();

          if (cnt < -newcnt) { // if shrink, -newcnt > 0
            item.detach(); // remove extra
          } else if (((Listitem) item).isLoaded()) {
            if (renderer == null) renderer = (ListitemRenderer) getRealRenderer();
            item.detach(); // always detach
            _listbox.insertBefore(newUnloadedItem(renderer, min), next);
            ++addcnt;
          }
          ++min;
          item = next; // B2100338.,next item could be Paging, don't use Listitem directly
        }

        if ((shallInvalidated
                || addcnt > INVALIDATE_THRESHOLD
                || addcnt + newcnt > INVALIDATE_THRESHOLD)
            && !inPagingMold()) _listbox.invalidate();
        // Bug 3147518: avoid memory leak
        // Also better performance (outer better than remove a lot)
      }
    } else {
      min = 0;
    }

    for (; --newcnt >= 0; ++min) {
      if (renderer == null) renderer = (ListitemRenderer) getRealRenderer();
      _listbox.insertBefore(newUnloadedItem(renderer, min), next);
    }
    if (_pgi != null) {
      if (atg >= _pgi.getPageCount()) atg = _pgi.getPageCount() - 1;
      _pgi.setActivePage(atg);
    }
  }