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();
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 (newcnt > INVALIDATE_THRESHOLD && !inPaging)
_listbox.invalidate(); //performance is better
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 ((addcnt > INVALIDATE_THRESHOLD || addcnt + newcnt > INVALIDATE_THRESHOLD) && !inPagingMold())
_listbox.invalidate(); //performance is better
}
} 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);
}
}