/**
* <a href="http://www.openolat.org">
* OpenOLAT - Online Learning and Training</a><br>
* <p>
* Licensed under the Apache License, Version 2.0 (the "License"); <br>
* you may not use this file except in compliance with the License.<br>
* You may obtain a copy of the License at the
* <a href="http://www.apache.org/licenses/LICENSE-2.0">Apache homepage</a>
* <p>
* Unless required by applicable law or agreed to in writing,<br>
* software distributed under the License is distributed on an "AS IS" BASIS, <br>
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. <br>
* See the License for the specific language governing permissions and <br>
* limitations under the License.
* <p>
* Initial code contributed and copyrighted by<br>
* frentix GmbH, http://www.frentix.com
* <p>
*/
package org.olat.core.gui.components.tree;
import static org.olat.core.gui.components.tree.MenuTreeEvent.DESELECT;
import static org.olat.core.gui.components.tree.MenuTreeEvent.SELECT;
import java.util.*;
import org.olat.core.gui.UserRequest;
import org.olat.core.gui.components.ComponentEventListener;
import org.olat.core.gui.components.form.flexible.impl.FormItemImpl;
import org.olat.core.util.tree.INodeFilter;
import org.olat.core.util.tree.TreeHelper;
/**
*
* Initial date: 13.03.2013<br>
* @author srosse, stephane.rosse@frentix.com, http://www.frentix.com
*
*/
public class MenuTreeItem extends FormItemImpl {
private final MenuTree treeCmp;
private boolean noDirtyCheckOnClick = false;
private Set<String> visibleNodeIds = new HashSet<>();
public MenuTreeItem(String name, ComponentEventListener listener) {
super(name);
treeCmp = new MenuTree(null, name + "_CMP", listener, this);
}
public boolean isNoDirtyCheckOnClick() {
return noDirtyCheckOnClick;
}
public void setNoDirtyCheckOnClick(boolean noDirtyCheckOnClick) {
this.noDirtyCheckOnClick = noDirtyCheckOnClick;
}
@Override
protected MenuTree getFormItemComponent() {
return treeCmp;
}
@Override
public void evalFormRequest(UserRequest ureq) {
String[] selectedIndexArr = getRootForm().getRequestParameterValues("tcb_ms");
if(selectedIndexArr == null) {
//be suspicious
if(getFormDispatchId().equals(getRootForm().getRequestParameter("dispatchuri"))) {
selectedIndexArr = new String[0];
}
}
if(selectedIndexArr != null) {
List<MenuTreeEvent> events = new ArrayList<>();
Set<String> referenceIds = new HashSet<>(visibleNodeIds);
for(String index:selectedIndexArr) {
referenceIds.remove(index);
treeCmp.select(index, true);
events.add(new MenuTreeEvent(SELECT, this, index));
}
for(String deselectedId:referenceIds) {
if(treeCmp.getSelectedNodeIds().contains(deselectedId)) {
treeCmp.select(deselectedId, false);
events.add(new MenuTreeEvent(DESELECT, this, deselectedId));
}
}
for(MenuTreeEvent e:events) {
getRootForm().fireFormEvent(ureq, e);
}
}
}
protected void clearVisibleNodes() {
visibleNodeIds.clear();
}
protected void trackVisibleNode(TreeNode node) {
visibleNodeIds.add(node.getIdent());
}
public boolean isIndeterminate(TreeNode node) {
if(treeCmp.isSelected(node) /* OO-1883 || treeCmp.isOpen(node) */) {
return false;
}
for(int i=node.getChildCount(); i-->0; ) {
TreeNode child = (TreeNode)node.getChildAt(i);
/* OO-1883 if(treeCmp.isOpen(child)) {
return false;
}*/
if(isSelectRec(child)) {
return true;
}
}
return false;
}
private boolean isSelectRec(TreeNode node) {
if(treeCmp.isSelected(node)) {
return true;
}
for(int i=node.getChildCount(); i-->0; ) {
TreeNode child = (TreeNode)node.getChildAt(i);
if(isSelectRec(child)) {
return true;
}
}
return false;
}
public void selectAll() {
TreeModel model = getTreeModel();
List<String> nodeIdentifiers = new ArrayList<>();
TreeHelper.collectNodeIdentifiersRecursive(model.getRootNode(), nodeIdentifiers);
treeCmp.setSelectedNodeIds(nodeIdentifiers);
treeCmp.setDirty(true);
}
public void deselectAll() {
treeCmp.setSelectedNodeIds(Collections.<String>emptyList());
treeCmp.setDirty(true);
}
public void setFilter(INodeFilter filter) {
treeCmp.setFilter(filter);
}
@Override
public void setElementCssClass(String elementCssClass) {
super.setElementCssClass(elementCssClass);
treeCmp.setElementCssClass(elementCssClass);
}
@Override
public void setEnabled(boolean enabled) {
super.setEnabled(enabled);
treeCmp.setEnabled(enabled);
}
public Set<String> getSelectedKeys() {
return treeCmp.getSelectedNodeIds();
}
public void setSelectedKeys(Collection<String> keys) {
treeCmp.setSelectedNodeIds(keys);
}
public void select(String key, boolean select) {
treeCmp.select(key, select);
}
public TreeNode getSelectedNode() {
return treeCmp.getSelectedNode();
}
public String getSelectedNodeId() {
return treeCmp.getSelectedNodeId();
}
public void setSelectedNodeId(String nodeId) {
treeCmp.setSelectedNodeId(nodeId);
}
public void open(TreeNode node) {
treeCmp.open(node);
}
public Collection<String> getOpenNodeIds() {
return treeCmp.getOpenNodeIds();
}
public void setOpenNodeIds(Collection<String> nodeIds) {
treeCmp.setOpenNodeIds(nodeIds);
}
public InsertionPoint getInsertionPoint() {
return treeCmp.getInsertionPoint();
}
public TreePosition getInsertionPosition() {
return treeCmp.getInsertionPosition();
}
public TreeModel getTreeModel() {
return treeCmp.getTreeModel();
}
public void setTreeModel(TreeModel treeModel) {
treeCmp.setTreeModel(treeModel);
}
public void setExpandServerOnly(boolean expandServerOnly) {
treeCmp.setExpandServerOnly(expandServerOnly);
}
public boolean isMultiSelect() {
return treeCmp.isMultiSelect();
}
public void setMultiSelect(boolean multiSelect) {
treeCmp.setMultiSelect(multiSelect);
}
public void setDragEnabled(boolean enabled) {
treeCmp.setDragEnabled(enabled);
}
public void setDropEnabled(boolean enabled) {
treeCmp.setDropEnabled(enabled);
}
public void setDropSiblingEnabled(boolean enabled) {
treeCmp.setDropSiblingEnabled(enabled);
}
public void setExpandSelectedNode(boolean expandSelectedNode) {
treeCmp.setExpandSelectedNode(expandSelectedNode);
}
public void setUnselectNodes(boolean unselectNodes) {
treeCmp.setUnselectNodes(unselectNodes);
}
public void setRootVisible(boolean rootVisible) {
treeCmp.setRootVisible(rootVisible);
}
public void setSelectedNode(TreeNode node) {
treeCmp.setSelectedNode(node);
}
@Override
protected void rootFormAvailable() {
//
}
@Override
public void reset() {
//
}
}