📄 listbox.java
字号:
log.warning("Conflict event: number of removed items not matched: "+event); break; //handle it as CONTENTS_CHANGED } //detach and remove for (Iterator it = getItems().listIterator(min); --cnt >= 0 && it.hasNext();) { it.next(); it.remove(); } done = true; break; } if (!done) //CONTENTS_CHANGED syncModel(min, max); postOnInitRender(); //Bug 1823236: though fixed in JS, it improves performance //to save one roundtrip } private static final ListitemRenderer getDefaultItemRenderer() { return _defRend; } private static final ListitemRenderer _defRend = new ListitemRenderer() { public void render(Listitem item, Object data) { item.setLabel(Objects.toString(data)); item.setValue(data); } }; /** Returns the renderer used to render items. */ private ListitemRenderer getRealRenderer() { return _renderer != null ? _renderer: getDefaultItemRenderer(); } /** Used to render listitem if _model is specified. */ private class Renderer implements java.io.Serializable { private final ListitemRenderer _renderer; private boolean _rendered, _ctrled; private Renderer() { _renderer = getRealRenderer(); } private void render(Listitem item) throws Throwable { if (item.isLoaded()) return; //nothing to do if (!_rendered && (_renderer instanceof RendererCtrl)) { ((RendererCtrl)_renderer).doTry(); _ctrled = true; } final Listcell cell = (Listcell)item.getFirstChild(); if (!(_renderer instanceof ListitemRendererExt) || (((ListitemRendererExt)_renderer).getControls() & ListitemRendererExt.DETACH_ON_RENDER) != 0) { //detach (default) cell.detach(); } try { _renderer.render(item, _model.getElementAt(item.getIndex())); } catch (Throwable ex) { try { item.setLabel(Exceptions.getMessage(ex)); } catch (Throwable t) { log.error(t); } item.setLoaded(true); throw ex; } finally { if (item.getChildren().isEmpty()) cell.setParent(item); } item.setLoaded(true); _rendered = true; } private void doCatch(Throwable ex) { if (_ctrled) { try { ((RendererCtrl)_renderer).doCatch(ex); } catch (Throwable t) { throw UiException.Aide.wrap(t); } } else { throw UiException.Aide.wrap(ex); } } private void doFinally() { if (_ctrled) ((RendererCtrl)_renderer).doFinally(); } } /** Renders the specified {@link Listitem} if not loaded yet, * with {@link #getItemRenderer}. * * <p>It does nothing if {@link #getModel} returns null. * In other words, it is meaningful only if live data model is used. * * @see #renderItems * @see #renderAll * @return the list item being passed to this method */ public Listitem renderItem(Listitem li) { if (_model != null && !li.isLoaded()) { final Renderer renderer = new Renderer(); try { renderer.render(li); } catch (Throwable ex) { renderer.doCatch(ex); } finally { renderer.doFinally(); } } return li; } /** Renders all {@link Listitem} if not loaded yet, * with {@link #getItemRenderer}. * * @see #renderItem * @see #renderItems */ public void renderAll() { if (_model == null) return; final Renderer renderer = new Renderer(); try { for (Iterator it = getItems().iterator(); it.hasNext();) renderer.render((Listitem)it.next()); } catch (Throwable ex) { renderer.doCatch(ex); } finally { renderer.doFinally(); } } public void renderItems(Set items) { if (_model == null) return; if (items.isEmpty()) return; //nothing to do final Renderer renderer = new Renderer(); try { for (Iterator it = items.iterator(); it.hasNext();) renderer.render((Listitem)it.next()); } catch (Throwable ex) { renderer.doCatch(ex); } finally { renderer.doFinally(); } } //-- super --// public void setMold(String mold) { final String old = getMold(); if (!Objects.equals(old, mold)) { super.setMold(mold); if ("paging".equals(old)) { //change from paging if (_paging != null) { removePagingListener(_paging); _paging.detach(); } else if (_pgi != null) { removePagingListener(_pgi); } } else if (inPagingMold()) { //change to paging if (_pgi != null) addPagingListener(_pgi); else newInternalPaging(); } } } public String getOuterAttrs() { final StringBuffer sb = new StringBuffer(80).append(super.getOuterAttrs()); if (inSelectMold()) { HTMLs.appendAttribute(sb, "name", _name); HTMLs.appendAttribute(sb, "size", getRows()); if (isMultiple()) HTMLs.appendAttribute(sb, "multiple", "multiple"); if (_disabled) HTMLs.appendAttribute(sb, "disabled", "disabled"); if (_tabindex >= 0) HTMLs.appendAttribute(sb, "tabindex", _tabindex); } else { HTMLs.appendAttribute(sb, "z.name", _name); HTMLs.appendAttribute(sb, "z.size", _rows); if (_disabled) HTMLs.appendAttribute(sb, "z.disabled", true); if (_multiple) HTMLs.appendAttribute(sb, "z.multiple", true); HTMLs.appendAttribute(sb, "z.selId", getSelectedId()); //if (_checkmark) // HTMLs.appendAttribute(sb, "z.checkmark", true); if (_vflex) HTMLs.appendAttribute(sb, "z.vflex", true); if (_model != null) HTMLs.appendAttribute(sb, "z.model", true); if (_scOddRow != null) HTMLs.appendAttribute(sb, "z.scOddRow", _scOddRow); } appendAsapAttr(sb, Events.ON_SELECT); return sb.toString(); } private class ItemIter implements ListIterator, java.io.Serializable { private ListIterator _it; private int _j; private boolean _bNxt; private ItemIter(int index) { _j = index; } public void add(Object o) { prepare(); _it.add(o); ++_j; } public boolean hasNext() { return _j < _items.size(); } public boolean hasPrevious() { return _j > 0; } public Object next() { if (!hasNext()) throw new NoSuchElementException(); prepare(); final Object o = _it.next(); ++_j; _bNxt = true; return o; } public Object previous() { if (!hasPrevious()) throw new NoSuchElementException(); prepare(); final Object o = _it.previous(); --_j; _bNxt = false; return o; } public int nextIndex() { return _j; } public int previousIndex() { return _j - 1; } public void remove() { if (_it == null) throw new IllegalStateException(); _it.remove(); if (_bNxt) --_j; } public void set(Object o) { if (_it == null) throw new IllegalStateException(); _it.set(o); } private void prepare() { if (_it == null) _it = getChildren().listIterator(_j + _hdcnt); } } //Cloneable// public Object clone() { final Listbox clone = (Listbox)super.clone(); clone.init(); clone.afterUnmarshal(); if (clone._model != null) { //we use the same data model but we have to create a new listener clone._dataListener = null; clone.initDataListener(); } return clone; } private void afterUnmarshal() { int index = 0; for (Iterator it = getChildren().iterator(); it.hasNext();) { final Object child = it.next(); if (child instanceof Listitem) { final Listitem li = (Listitem)child; li.setIndexDirectly(index ++); //since Listitem.clone() resets index if (li.isSelected()) { _selItems.add(li); } } else if (child instanceof Listhead) { _listhead = (Listhead)child; } else if (child instanceof Listfoot) { _listfoot = (Listfoot)child; } else if (child instanceof Paging) { _pgi = _paging = (Paging)child; } } } //-- Serializable --// private synchronized void readObject(java.io.ObjectInputStream s) throws java.io.IOException, ClassNotFoundException { s.defaultReadObject(); init(); afterUnmarshal(); //TODO: how to marshal _pgi if _pgi != _paging //TODO: re-register event listener for onPaging if (_model != null) initDataListener(); } //-- ComponentCtrl --// protected Object newExtraCtrl() { return new ExtraCtrl(); } /** A utility class to implement {@link #getExtraCtrl}. * It is used only by component developers. */ protected class ExtraCtrl extends XulElement.ExtraCtrl implements InnerWidth, Selectable, Cropper, RenderOnDemand { //InnerWidth// public void setInnerWidthByClient(String width) { _innerWidth = width == null ? "100%": width; } //RenderOnDemand// public void renderItems(Set items) { int cnt = items.size(); if (cnt == 0) return; //nothing to do cnt = 20 - cnt; if (cnt > 0 && _preloadsz > 0) { //Feature 1740072: pre-load if (cnt > _preloadsz) cnt = _preloadsz; //at most 8 more to load //1. locate the first item found in items final List toload = new LinkedList(); Iterator it = _items.iterator(); while (it.hasNext()) { final Listitem li = (Listitem)it.next(); if (items.contains(li)) //found break; if (!li.isLoaded()) toload.add(0, li); //reverse order } //2. add unload items before the found one if (!toload.isEmpty()) { int bfcnt = cnt/3; for (Iterator e = toload.iterator(); bfcnt > 0 && e.hasNext(); --bfcnt, --cnt) { items.add(e.next()); } } //3. add unloaded after the found one while (cnt > 0 && it.hasNext()) { final Listitem li = (Listitem)it.next(); if (!li.isLoaded() && items.add(li)) --cnt; } } Listbox.this.renderItems(items); } //--Cropper--// public boolean isCropper() { return inPagingMold(); } public Set getAvailableAtClient() { if (!inPagingMold()) return null; final Set avail = new HashSet(37); avail.addAll(_heads); if (_listfoot != null) avail.add(_listfoot); if (_paging != null) avail.add(_paging); final Paginal pgi = getPaginal(); int pgsz = pgi.getPageSize(); final int ofs = pgi.getActivePage() * pgsz; for (final Iterator it = getItems().listIterator(ofs); --pgsz >= 0 && it.hasNext();) avail.add(it.next()); return avail; } //-- Selectable --// public void selectItemsByClient(Set selItems) { _noSmartUpdate = true; try { final boolean paging = inPagingMold(); if (!_multiple || (!paging && (selItems == null || selItems.size() <= 1))) { final Listitem item = selItems != null && selItems.size() > 0 ? (Listitem)selItems.iterator().next(): null; selectItem(item); } else { int from, to; if (paging) { final Paginal pgi = getPaginal(); int pgsz = pgi.getPageSize(); from = pgi.getActivePage() * pgsz; to = from + pgsz; //excluded } else { from = to = 0; } int j = 0; for (Iterator it = _items.iterator(); it.hasNext(); ++j) { final Listitem item = (Listitem)it.next(); if (selItems.contains(item)) { addItemToSelection(item); } else if (!paging) { removeItemFromSelection(item); } else { final int index = item.getIndex(); if (index >= from && index < to) removeItemFromSelection(item); } } } } finally { _noSmartUpdate = false; } } } /** An iterator used by _heads. */ private class Iter implements Iterator { private final Iterator _it = getChildren().iterator(); private int _j; public boolean hasNext() { return _j < _hdcnt; } public Object next() { final Object o = _it.next(); ++_j; return o; } public void remove() { throw new UnsupportedOperationException(); } }}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -