package org.openrosa.client.dnd; import java.util.List; import org.openrosa.client.model.FormDef; import org.openrosa.client.model.GroupDef; import org.openrosa.client.model.IFormElement; import org.openrosa.client.model.OptionDef; import org.openrosa.client.model.QuestionDef; import org.openrosa.client.model.TreeModelItem; import org.openrosa.client.view.FormsTreeView; import com.extjs.gxt.ui.client.data.ModelData; import com.extjs.gxt.ui.client.dnd.TreePanelDropTarget; import com.extjs.gxt.ui.client.event.DNDEvent; import com.extjs.gxt.ui.client.store.TreeStoreModel; import com.extjs.gxt.ui.client.widget.treepanel.TreePanel; import com.extjs.gxt.ui.client.widget.treepanel.TreePanel.TreeNode; import com.google.gwt.core.client.GWT; /** * This class acts as our drop target during movement of questions in the tree widget on the form outline. * * @author daniel * */ public class JrTreePanelDropTarget extends TreePanelDropTarget{ FormsTreeView formsTreeView; public JrTreePanelDropTarget(TreePanel tree, FormsTreeView formsTreeView) { super(tree); this.formsTreeView = formsTreeView; } protected void handleInsertDrop(DNDEvent event, TreeNode item, int index) { IFormElement targetNeighborDef = ((IFormElement)((TreeModelItem)item.getModel()).getUserObject()); List<ModelData> models = event.getData(); if (models.size() == 0 || !(models.get(0) instanceof TreeStoreModel)){ return; //No item to be dropped. } TreeModelItem modelItem = (TreeModelItem)((ModelData)models.get(0)).get("model"); IFormElement droppedDef = ((IFormElement) modelItem.getUserObject()); //do some protection for illegal moves... if(targetNeighborDef instanceof FormDef && index == FormsTreeView.INSERT_BEFORE){ formsTreeView.recalculate(); return; //don't want anything outside of the main formDef. } formsTreeView.moveItem(droppedDef, targetNeighborDef, index); super.handleInsertDrop(event, item, index); } /** * This will cause elements to be appended as children, if possible. */ protected void handleAppendDrop(DNDEvent event, TreeNode item) { IFormElement parentDef = ((IFormElement)((TreeModelItem)item.getModel()).getUserObject()); List<ModelData> models = event.getData(); if (models.size() == 0 || !(models.get(0) instanceof TreeStoreModel)){ return; //No item to be dropped. } TreeModelItem modelItem = (TreeModelItem)((ModelData)models.get(0)).get("model"); IFormElement droppedDef = ((IFormElement) modelItem.getUserObject()); boolean isParentSelectQuestion = parentDef instanceof QuestionDef && (parentDef.getDataType() == QuestionDef.QTN_TYPE_LIST_EXCLUSIVE || parentDef.getDataType() == QuestionDef.QTN_TYPE_LIST_EXCLUSIVE_DYNAMIC || parentDef.getDataType() == QuestionDef.QTN_TYPE_LIST_MULTIPLE); boolean parentHasPotentialChildren = parentDef instanceof FormDef || parentDef instanceof GroupDef || (parentDef instanceof QuestionDef && (parentDef.getDataType() == QuestionDef.QTN_TYPE_REPEAT))|| isParentSelectQuestion; if(!parentHasPotentialChildren){ return; } //you shouldn't be trying to add children to an IFormElement that doesn't support it. if(isParentSelectQuestion && !(droppedDef instanceof OptionDef)){return;} //can't add anything but option to (1)Select type questions. List<IFormElement> children = parentDef.getChildren(); if(children == null){ parentDef.addChild(droppedDef); } IFormElement targetDef = children.get(children.size()-1); formsTreeView.moveItem(droppedDef, targetDef, FormsTreeView.INSERT_AFTER); super.handleAppendDrop(event, item); } // protected void handleInsertDrops(DNDEvent event, TreeNode item, int index) { // if(index == BEFORE){ // GWT.log("DROPPED BEFORE ITEM"); // // }else if(index == AFTER){ // GWT.log("DROPPED AFTER ITEM"); // }else{ // GWT.log("DROPPED SOMEWHERE?? INDEX="+index); // } // List<ModelData> models = event.getData(); // if (models.size() == 0 || !(models.get(0) instanceof TreeStoreModel)) // return; //No item to be dropped. // // //Get the model of the item being dropped and its position in the parent list. // TreeModelItem modelItem = (TreeModelItem)((ModelData)models.get(0)).get("model"); // int orgpos = modelItem.getParent().indexOf(modelItem); // // //Check if item the same item but not moved anywhere // if(modelItem.getUserObject() == ((TreeModelItem)item.getModel()).getUserObject()) // return; // // int newpos = item.getParent().indexOf(item); // boolean moveup = newpos < orgpos; // // if(moveup){ // int count = Math.abs(orgpos - newpos); // while(count-- > 0) // formsTreeView.dragMove(modelItem, FormsTreeView.DRAG_MOVE_UP); // } // else{ // int count = Math.abs(newpos - orgpos) + 1; // while(count-- > 0) // formsTreeView.dragMove(modelItem, FormsTreeView.DRAG_MOVE_DOWN); // } // // TreeModelItem parent = (TreeModelItem)item.getParent().getModel(); // parent.remove(modelItem); // tree.getStore().remove(modelItem); // parent.insert(modelItem, moveup ? newpos : newpos+1); // // super.handleInsertDrop(event, item, index); // } }