/* * Copyright 2013 JBoss Inc * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package org.artificer.ui.client.local.widgets.ontologies; import java.util.HashSet; import java.util.List; import java.util.Set; import javax.enterprise.context.Dependent; import javax.enterprise.inject.Instance; import javax.inject.Inject; import org.artificer.ui.client.shared.beans.OntologyBean; import org.artificer.ui.client.shared.beans.OntologyClassBean; import org.jboss.errai.ui.shared.api.annotations.DataField; import org.jboss.errai.ui.shared.api.annotations.Templated; import com.google.gwt.user.client.ui.Composite; /** * * @author eric.wittmann@redhat.com */ @Templated("/org/artificer/ui/client/local/site/dialogs/classifier-dialog.html#ontology-selector-with-toolbar") @Dependent public class OntologySelectorWithToolbar extends Composite { @Inject @DataField("ontology-selector") private OntologySelectorNodePanel nodePanel; @Inject private Instance<OntologySelectorNode> nodeFactory; private Set<String> value; /** * Constructor. */ public OntologySelectorWithToolbar() { } /** * @return the selector */ public OntologySelectorNodePanel getNodePanel() { return nodePanel; } /** * @param ontology */ public void refresh(OntologyBean ontology) { nodePanel.clear(); List<OntologyClassBean> rootClasses = ontology.getRootClasses(); for (OntologyClassBean ontologyClass : rootClasses) { createAndAddNode(ontologyClass, getNodePanel()); } } /** * Method to create and add tree nodes. * @param ontologyClass * @param nodePanel */ private void createAndAddNode(OntologyClassBean ontologyClass, OntologySelectorNodePanel nodePanel) { OntologySelectorNode node = nodeFactory.get(); String label = ontologyClass.getId(); if (ontologyClass.getLabel() != null && ontologyClass.getLabel().trim().length() > 0) { label = ontologyClass.getLabel(); } node.setLabel(label); node.setClassId(ontologyClass.getId()); List<OntologyClassBean> children = ontologyClass.getChildren(); for (OntologyClassBean childClass : children) { createAndAddNode(childClass, node); } nodePanel.add(node); } /** * Method to create and add tree nodes. * @param ontologyClass * @param parentNode */ private void createAndAddNode(OntologyClassBean ontologyClass, OntologySelectorNode parentNode) { OntologySelectorNode node = nodeFactory.get(); String label = ontologyClass.getId(); if (ontologyClass.getLabel() != null && ontologyClass.getLabel().trim().length() > 0) { label = ontologyClass.getLabel(); } node.setLabel(label); node.setClassId(ontologyClass.getId()); List<OntologyClassBean> children = ontologyClass.getChildren(); for (OntologyClassBean childClass : children) { createAndAddNode(childClass, node); } parentNode.addChild(node); } /** * Native JS to gather up the values of all the nodes in the dialog. * @param element */ private native final void getCheckedNodes() /*-{ var element = this.@org.artificer.ui.client.local.widgets.ontologies.OntologySelectorWithToolbar::getElement()(); var dis = this; $wnd.jQuery(element).find(':checkbox').each(function() { if ($wnd.jQuery(this).attr('checked')) { var name = $wnd.jQuery(this).attr('name'); if (name) { dis.@org.artificer.ui.client.local.widgets.ontologies.OntologySelectorWithToolbar::addValue(Ljava/lang/String;)(name); } } }); }-*/; /** * Ensures that the given ontology class is checked in the tree. * @param className */ public native final void ensureChecked(String className) /*-{ var element = this.@org.artificer.ui.client.local.widgets.ontologies.OntologySelectorWithToolbar::getElement()(); $wnd.jQuery(element).find(':checkbox').each(function() { if ($wnd.jQuery(this).attr('name') == className) { $wnd.jQuery(this).attr('checked', 'checked'); } }); }-*/; /** * Expands all nodes in the tree * @param className */ public native final void expandAll() /*-{ var element = this.@org.artificer.ui.client.local.widgets.ontologies.OntologySelectorWithToolbar::getElement()(); $wnd.expandAllTreeNodes($wnd.jQuery(element)); }-*/; /** * Collapses all nodes in the tree * @param className */ public native final void collapseAll() /*-{ var element = this.@org.artificer.ui.client.local.widgets.ontologies.OntologySelectorWithToolbar::getElement()(); $wnd.collapseAllTreeNodes($wnd.jQuery(element)); }-*/; /** * @param v */ protected void addValue(String v) { this.value.add(v); } /** * @return the currently selected values */ public Set<String> getSelection() { value = new HashSet<String>(); getCheckedNodes(); return value; } /** * Sets the currently selected items in the tree. * @param value */ public void setSelection(Set<String> value) { // Should we be de-selecting all first? if (value == null) { this.value = null; } else { this.value = new HashSet<String>(value); if (value != null && !value.isEmpty()) { for (String oclass : value) { ensureChecked(oclass); } } } } }