/*
Copyright (C) 2010 maik.jablonski@gmail.com
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package jfix.zk;
import java.util.HashSet;
import java.util.Set;
import org.zkoss.zk.ui.event.Event;
import org.zkoss.zk.ui.event.EventListener;
import org.zkoss.zk.ui.event.Events;
import org.zkoss.zul.TreeModel;
import org.zkoss.zul.Treechildren;
import org.zkoss.zul.Treeitem;
public class Tree extends org.zkoss.zul.Tree implements Refreshable {
public Tree() {
setMold("paging");
setPageSize(30);
}
public void addSelectListener(final ActionListener actionListener) {
addEventListener(Events.ON_SELECT, new EventListener() {
public void onEvent(Event e) throws Exception {
actionListener.actionPerformed(e);
}
});
}
public void addChangeListener(final ActionListener actionListener) {
addEventListener(Events.ON_CHANGE, new EventListener() {
public void onEvent(Event e) throws Exception {
actionListener.actionPerformed(e);
}
});
}
public void fireChangeEvent() {
Events.sendEvent(new Event(Events.ON_CHANGE, this));
}
public void refresh() {
int activePage = getActivePage();
Set openedValues = new HashSet();
Object selectedValue = getSelectedValue();
for (Treeitem treeitem : getTreeitems(getTreechildren(), false)) {
if (treeitem.isOpen()) {
openedValues.add(treeitem.getValue());
}
}
TreeModel model = getModel();
setModel(null);
setModel(model);
Treeitem selectedItem = null;
for (Treeitem treeitem : getTreeitems(getTreechildren(), true)) {
if (treeitem.getValue() == selectedValue) {
treeitem.setSelected(true);
selectedItem = treeitem;
} else {
treeitem.setOpen(openedValues.contains(treeitem.getValue()));
}
}
while (selectedItem != null) {
selectedItem.setOpen(true);
selectedItem = selectedItem.getParentItem();
}
setActivePage(activePage);
}
private Set<Treeitem> getTreeitems(Treechildren treeChildren,
boolean openItems) {
Set<Treeitem> result = new HashSet<Treeitem>();
if (treeChildren != null) {
for (Object child : treeChildren.getItems().toArray(
new Treeitem[] {})) {
if (child instanceof Treeitem) {
Treeitem treeitem = (Treeitem) child;
if (openItems) {
treeitem.setOpen(true);
}
result.add(treeitem);
result.addAll(getTreeitems(treeitem.getTreechildren(),
openItems));
}
}
}
return result;
}
public Object getSelectedValue() {
return getSelectedItem() != null ? getSelectedItem().getValue() : null;
}
public void resetSelectedValue() {
setSelectedItem(null);
}
}