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."); }
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); } }
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); } }