📄 tree.java
字号:
_selItems.clear(); _sel = null; smartUpdate("select", ""); } } /** Selects all items. */ public void selectAll() { if (!_multiple) throw new UiException("Appliable only to the multiple seltype: "+this); //we don't invoke getItemCount first because it is slow! boolean changed = false, first = true; for (Iterator it = getItems().iterator(); it.hasNext();) { final Treeitem item = (Treeitem)it.next(); if (!item.isSelected()) { _selItems.add(item); item.setSelectedDirectly(true); changed = true; } if (first) { _sel = item; first = false; } } smartUpdate("selectAll", "true"); } /** Returns the selected item. */ public Treeitem getSelectedItem() { return _sel; } /** Deselects all of the currently selected items and selects * the given item. * <p>It is the same as {@link #selectItem}. */ public void setSelectedItem(Treeitem item) { selectItem(item); } /** Returns all selected items. */ public Set getSelectedItems() { return Collections.unmodifiableSet(_selItems); } /** Returns the number of items being selected. */ public int getSelectedCount() { return _selItems.size(); } /** Clears all child tree items ({@link Treeitem}. * <p>Note: after clear, {@link #getTreechildren} won't be null, but * it has no child */ public void clear() { if (_treechildren == null) return; final List l = _treechildren.getChildren(); if (l.isEmpty()) return; //nothing to do for (Iterator it = new ArrayList(l).iterator(); it.hasNext();) ((Component)it.next()).detach(); } /** Re-init the tree at the client. */ /*package*/ void initAtClient() { smartUpdate("z.init", true); } //-- Component --// public void setHeight(String height) { if (!Objects.equals(height, getHeight())) { super.setHeight(height); initAtClient(); } } public void smartUpdate(String attr, String value) { if (!_noSmartUpdate) super.smartUpdate(attr, value); } public boolean insertBefore(Component child, Component insertBefore) { if (child instanceof Treecols) { if (_treecols != null && _treecols != child) throw new UiException("Only one treecols is allowed: "+this); if (!getChildren().isEmpty()) insertBefore = (Component)getChildren().get(0); //always makes treecols as the first child _treecols = (Treecols)child; invalidate(); } else if (child instanceof Treechildren) { if (_treechildren != null && _treechildren != child) throw new UiException("Only one treechildren is allowed: "+this); if (insertBefore instanceof Treecols) throw new UiException("treecols must be the first child"); _treechildren = (Treechildren)child; invalidate(); fixSelectedSet(); } else { throw new UiException("Unsupported child for tree: "+child); } return super.insertBefore(child, insertBefore); } /** Called by {@link Treeitem} when is added to a tree. */ /*package*/ void onTreeitemAdded(Treeitem item) { fixNewChild(item); onTreechildrenAdded(item.getTreechildren()); } /** Called by {@link Treeitem} when is removed from a tree. */ /*package*/ void onTreeitemRemoved(Treeitem item) { boolean fixSel = false; if (item.isSelected()) { _selItems.remove(item); fixSel = _sel == item; if (fixSel && !_multiple) { _sel = null; smartUpdate("z.selId", getSelectedId()); assert _selItems.isEmpty(); } } onTreechildrenRemoved(item.getTreechildren()); if (fixSel) fixSelected(); } /** Called by {@link Treechildren} when is added to a tree. */ /*package*/ void onTreechildrenAdded(Treechildren tchs) { if (tchs == null || tchs.getParent() == this) return; //already being processed by insertBefore //main the selected status for (Iterator it = tchs.getItems().iterator(); it.hasNext();) fixNewChild((Treeitem)it.next()); } /** Fixes the status of new added child. */ private void fixNewChild(Treeitem item) { if (item.isSelected()) { if (_sel != null && !_multiple) { item.setSelectedDirectly(false); item.invalidate(); } else { if (_sel == null) _sel = item; _selItems.add(item); smartUpdate("z.selId", getSelectedId()); } } } /** Called by {@link Treechildren} when is removed from a tree. */ /*package*/ void onTreechildrenRemoved(Treechildren tchs) { if (tchs == null || tchs.getParent() == this) return; //already being processed by onChildRemoved //main the selected status boolean fixSel = false; for (Iterator it = tchs.getItems().iterator(); it.hasNext();) { final Treeitem item = (Treeitem)it.next(); if (item.isSelected()) { _selItems.remove(item); if (_sel == item) { if (!_multiple) { _sel = null; smartUpdate("z.selId", getSelectedId()); assert _selItems.isEmpty(); return; //done } fixSel = true; } } } if (fixSel) fixSelected(); } public void onChildAdded(Component child) { super.onChildAdded(child); invalidate(); } public void onChildRemoved(Component child) { if (child instanceof Treecols) { _treecols = null; } else if (child instanceof Treechildren) { _treechildren = null; _selItems.clear(); _sel = null; } super.onChildRemoved(child); invalidate(); } /** Fixes all info about the selected status. */ private void fixSelectedSet() { _sel = null; _selItems.clear(); for (Iterator it = getItems().iterator(); it.hasNext();) { final Treeitem item = (Treeitem)it.next(); if (item.isSelected()) { if (_sel == null) { _sel = item; } else if (!_multiple) { item.setSelectedDirectly(false); continue; } _selItems.add(item); } } } /** Make _sel to be the first selected item. */ private boolean fixSelected() { Treeitem sel = null; switch (_selItems.size()) { case 1: sel = (Treeitem)_selItems.iterator().next(); case 0: break; default: for (Iterator it = getItems().iterator(); it.hasNext();) { final Treeitem item = (Treeitem)it.next(); if (item.isSelected()) { sel = item; break; } } } if (sel != _sel) { _sel = sel; return true; } return false; } //-- super --// public String getOuterAttrs() { final StringBuffer sb = new StringBuffer(64) .append(super.getOuterAttrs()); HTMLs.appendAttribute(sb, "z.name", _name); HTMLs.appendAttribute(sb, "z.size", getRows()); HTMLs.appendAttribute(sb, "z.selId", getSelectedId()); if (_multiple) HTMLs.appendAttribute(sb, "z.multiple", true); //if (_checkmark) // HTMLs.appendAttribute(sb, "z.checkmark", _checkmark); if (_vflex) HTMLs.appendAttribute(sb, "z.vflex", true); appendAsapAttr(sb, Events.ON_SELECT); return sb.toString(); } //Cloneable// public Object clone() { int cntSel = _selItems.size(); final Tree clone = (Tree)super.clone(); clone.init(); int cnt = 0; if (_treecols != null) ++cnt; if (_treechildren != null) ++cnt; if (cnt > 0 || cntSel > 0) clone.afterUnmarshal(cnt, cntSel); return clone; } /** @param cnt # of children that need special handling (used for optimization). * -1 means process all of them * @param cntSel # of selected items */ private void afterUnmarshal(int cnt, int cntSel) { if (cnt != 0) { for (Iterator it = getChildren().iterator(); it.hasNext();) { final Object child = it.next(); if (child instanceof Treecols) { _treecols = (Treecols)child; if (--cnt == 0) break; } else if (child instanceof Treechildren) { _treechildren = (Treechildren)child; if (--cnt == 0) break; } } } _sel = null; _selItems.clear(); if (cntSel != 0) { for (Iterator it = getItems().iterator(); it.hasNext();) { final Treeitem ti = (Treeitem)it.next(); if (ti.isSelected()) { if (_sel == null) _sel = ti; _selItems.add(ti); if (--cntSel == 0) break; } } } } //-- Serializable --// private synchronized void readObject(java.io.ObjectInputStream s) throws java.io.IOException, ClassNotFoundException { s.defaultReadObject(); init(); afterUnmarshal(-1, -1); } //-- 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 Selectable, ChildChangedAware { //-- Selectable --// public void selectItemsByClient(Set selItems) { _noSmartUpdate = true; try { if (!_multiple || selItems == null || selItems.size() <= 1) { final Treeitem item = selItems != null && selItems.size() > 0 ? (Treeitem)selItems.iterator().next(): null; selectItem(item); } else { for (Iterator it = new ArrayList(_selItems).iterator(); it.hasNext();) { final Treeitem item = (Treeitem)it.next(); if (!selItems.remove(item)) removeItemFromSelection(item); } for (Iterator it = selItems.iterator(); it.hasNext();) addItemToSelection((Treeitem)it.next()); } } finally { _noSmartUpdate = false; } } //ChildChangedAware// public boolean isChildChangedAware() { return true; } }}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -