Skip to content
Snippets Groups Projects
Commit f85bd1ce authored by srosse's avatar srosse
Browse files

OO-531: implements drag and drop for CP editor

parent 5a751156
No related branches found
No related tags found
No related merge requests found
...@@ -110,12 +110,9 @@ public class MenuTree extends Component { ...@@ -110,12 +110,9 @@ public class MenuTree extends Component {
private boolean dropSiblingEnabled = false; private boolean dropSiblingEnabled = false;
private boolean expandSelectedNode = true; private boolean expandSelectedNode = true;
private boolean rootVisible = true; private boolean rootVisible = true;
//fxdiff VCRP-9: drag and drop in menu tree
private String dragAndDropGroup;
private String dndFeedbackUri; private String dndFeedbackUri;
private boolean dirtyForUser = false; private boolean dirtyForUser = false;
/** /**
* @param name * @param name
...@@ -419,21 +416,6 @@ public class MenuTree extends Component { ...@@ -419,21 +416,6 @@ public class MenuTree extends Component {
dropSiblingEnabled = enabled; dropSiblingEnabled = enabled;
} }
/**
* @return The group of drag and drop (cannot be null).
*/
public String getDragAndDropGroup() {
return dragAndDropGroup == null ? "dndGroup" : dragAndDropGroup;
}
/**
* @param dragAndDropGroup The group of drag and drop
*/
public void setDragAndDropGroup(String dragAndDropGroup) {
this.dragAndDropGroup = dragAndDropGroup;
}
/** /**
* Expand the selected node to view its children * Expand the selected node to view its children
* @return * @return
......
...@@ -34,6 +34,7 @@ import java.util.Map; ...@@ -34,6 +34,7 @@ import java.util.Map;
import org.dom4j.tree.DefaultElement; import org.dom4j.tree.DefaultElement;
import org.json.JSONException; import org.json.JSONException;
import org.olat.core.gui.components.tree.DnDTreeModel;
import org.olat.core.gui.components.tree.GenericTreeModel; import org.olat.core.gui.components.tree.GenericTreeModel;
import org.olat.core.gui.components.tree.GenericTreeNode; import org.olat.core.gui.components.tree.GenericTreeNode;
import org.olat.core.gui.components.tree.TreeNode; import org.olat.core.gui.components.tree.TreeNode;
...@@ -53,7 +54,7 @@ import org.olat.ims.cp.objects.CPOrganization; ...@@ -53,7 +54,7 @@ import org.olat.ims.cp.objects.CPOrganization;
* *
* @author Sergio Trentini * @author Sergio Trentini
*/ */
public class CPTreeDataModel extends GenericTreeModel { public class CPTreeDataModel extends GenericTreeModel implements DnDTreeModel {
private static final long serialVersionUID = -6843143820668185636L; private static final long serialVersionUID = -6843143820668185636L;
private static final OLog log = Tracing.createLoggerFor(CPTreeDataModel.class); private static final OLog log = Tracing.createLoggerFor(CPTreeDataModel.class);
...@@ -203,6 +204,11 @@ public class CPTreeDataModel extends GenericTreeModel { ...@@ -203,6 +204,11 @@ public class CPTreeDataModel extends GenericTreeModel {
nodeList.add(child); nodeList.add(child);
} }
@Override
public boolean canDrop(TreeNode droppedNode, TreeNode targetNode, boolean sibling) {
return true;
}
/* /*
@Override @Override
public List<AjaxTreeNode> getChildrenFor(String nodeId) { public List<AjaxTreeNode> getChildrenFor(String nodeId) {
...@@ -252,6 +258,8 @@ public class CPTreeDataModel extends GenericTreeModel { ...@@ -252,6 +258,8 @@ public class CPTreeDataModel extends GenericTreeModel {
nodeList.add(child); nodeList.add(child);
}*/ }*/
/** /**
* Returns the path of the given item in the tree. * Returns the path of the given item in the tree.
* <p> * <p>
......
...@@ -30,6 +30,7 @@ import org.olat.core.commons.fullWebApp.LayoutMain3ColsController; ...@@ -30,6 +30,7 @@ import org.olat.core.commons.fullWebApp.LayoutMain3ColsController;
import org.olat.core.gui.UserRequest; import org.olat.core.gui.UserRequest;
import org.olat.core.gui.components.Component; import org.olat.core.gui.components.Component;
import org.olat.core.gui.components.panel.Panel; import org.olat.core.gui.components.panel.Panel;
import org.olat.core.gui.components.tree.TreeEvent;
import org.olat.core.gui.control.Controller; import org.olat.core.gui.control.Controller;
import org.olat.core.gui.control.Event; import org.olat.core.gui.control.Event;
import org.olat.core.gui.control.WindowControl; import org.olat.core.gui.control.WindowControl;
...@@ -154,25 +155,16 @@ public class CPEditMainController extends MainLayoutBasicController { ...@@ -154,25 +155,16 @@ public class CPEditMainController extends MainLayoutBasicController {
// nothing // nothing
} }
@Override
protected void event(UserRequest ureq, Controller source, Event event) { protected void event(UserRequest ureq, Controller source, Event event) {
if (source == treeCtr) { if (source == treeCtr) {
// event from TreeController if (event instanceof TreeEvent) {
//TODO jquery TreeEvent te = (TreeEvent)event;
/*if (event instanceof TreeNodeClickedEvent) { String nodeId = te.getNodeId();
TreeNodeClickedEvent clickedEvent = (TreeNodeClickedEvent) event;
String nodeId = clickedEvent.getNodeId();
contentCtr.displayPage(ureq, nodeId); contentCtr.displayPage(ureq, nodeId);
} else if (event.getCommand().equals("New Page")) {
} else if (event instanceof TreeNodeModifiedEvent) {
TreeNodeModifiedEvent nodeEvent = (TreeNodeModifiedEvent) event;
String nodeId = nodeEvent.getNodeId();
String newItemTitle = nodeEvent.getModifiedValue();
treeCtr.updateNode(nodeId, newItemTitle);
} else */ if (event.getCommand().equals("New Page")) {
String newIdentifier = treeCtr.addNewHTMLPage(); String newIdentifier = treeCtr.addNewHTMLPage();
contentCtr.displayPage(ureq, newIdentifier); contentCtr.displayPage(ureq, newIdentifier);
} else if (event instanceof NewCPPageEvent) { } else if (event instanceof NewCPPageEvent) {
contentCtr.displayPage(ureq, ((NewCPPageEvent) event).getCPPage().getIdentifier()); contentCtr.displayPage(ureq, ((NewCPPageEvent) event).getCPPage().getIdentifier());
} }
......
...@@ -37,7 +37,9 @@ import org.olat.core.gui.components.form.flexible.impl.FormBasicController; ...@@ -37,7 +37,9 @@ import org.olat.core.gui.components.form.flexible.impl.FormBasicController;
import org.olat.core.gui.components.link.Link; import org.olat.core.gui.components.link.Link;
import org.olat.core.gui.components.link.LinkFactory; import org.olat.core.gui.components.link.LinkFactory;
import org.olat.core.gui.components.tree.MenuTree; import org.olat.core.gui.components.tree.MenuTree;
import org.olat.core.gui.components.tree.TreeDropEvent;
import org.olat.core.gui.components.tree.TreeEvent; import org.olat.core.gui.components.tree.TreeEvent;
import org.olat.core.gui.components.tree.TreeNode;
import org.olat.core.gui.components.velocity.VelocityContainer; import org.olat.core.gui.components.velocity.VelocityContainer;
import org.olat.core.gui.control.Controller; import org.olat.core.gui.control.Controller;
import org.olat.core.gui.control.Event; import org.olat.core.gui.control.Event;
...@@ -46,6 +48,7 @@ import org.olat.core.gui.control.controller.BasicController; ...@@ -46,6 +48,7 @@ import org.olat.core.gui.control.controller.BasicController;
import org.olat.core.gui.control.generic.closablewrapper.CloseableModalController; import org.olat.core.gui.control.generic.closablewrapper.CloseableModalController;
import org.olat.core.gui.control.generic.modal.DialogBoxController; import org.olat.core.gui.control.generic.modal.DialogBoxController;
import org.olat.core.gui.control.generic.modal.DialogBoxUIFactory; import org.olat.core.gui.control.generic.modal.DialogBoxUIFactory;
import org.olat.core.util.tree.TreeHelper;
import org.olat.core.util.vfs.VFSContainer; import org.olat.core.util.vfs.VFSContainer;
import org.olat.core.util.vfs.VFSLeaf; import org.olat.core.util.vfs.VFSLeaf;
import org.olat.ims.cp.CPManager; import org.olat.ims.cp.CPManager;
...@@ -91,21 +94,14 @@ public class CPTreeController extends BasicController { ...@@ -91,21 +94,14 @@ public class CPTreeController extends BasicController {
treeModel = cpMgm.getTreeDataModel(cp); treeModel = cpMgm.getTreeDataModel(cp);
treeCtr = new MenuTree("cp"); treeCtr = new MenuTree("cp");
treeCtr.setTreeModel(treeModel); treeCtr.setTreeModel(treeModel);
treeCtr.setDragEnabled(true);
treeCtr.setDropEnabled(true);
treeCtr.setDropSiblingEnabled(true);
treeCtr.addListener(this); treeCtr.addListener(this);
//treeCtr.setTreeInlineEditing(true, null, null);
// hook into beforeclick event see treeView.html
//treeCtr.setBeforeNodeClickCallback("function(event){ return CPEditorBeforeTreeNodeClick(event);}");
// do not sort jsTree (structure is given by manifest)
//treeCtr.setTreeSorting(false, false, false);
//listenTo(treeCtr);
setLinks(); setLinks();
contentVC.put("cptreecontroller.tree", treeCtr); contentVC.put("cptreecontroller.tree", treeCtr);
//fxdiff FXOLAT-132: alert unsaved changes in HTML editor
contentVC.contextPut("treeId", treeCtr.getDispatchID()); contentVC.contextPut("treeId", treeCtr.getDispatchID());
putInitialPanel(contentVC); putInitialPanel(contentVC);
} }
...@@ -258,24 +254,6 @@ public class CPTreeController extends BasicController { ...@@ -258,24 +254,6 @@ public class CPTreeController extends BasicController {
updatePage(page); updatePage(page);
} }
/**
* Performs the node-move-actions (invokes methods of the manager...)
*
* @param event
* @return returns true, if move was successfull
*/
private boolean movePage(TreeEvent event) {
//TODO jquery
/*
CPManager cpMgm = CPManager.getInstance();
String movedNodeId = event.getNodeId();
cpMgm.moveElement(cp, movedNodeId, event.getNewParentNodeId(), event.getPosition());
cpMgm.writeToFile(cp);
selectTreeNodeById(movedNodeId);
*/
return true;
}
/** /**
* selects a Tree node in the tree with given id (if found). Returns false, if * selects a Tree node in the tree with given id (if found). Returns false, if
* node is not found, true otherwise info: todo: implement selection of node * node is not found, true otherwise info: todo: implement selection of node
...@@ -300,6 +278,11 @@ public class CPTreeController extends BasicController { ...@@ -300,6 +278,11 @@ public class CPTreeController extends BasicController {
*/ */
protected boolean selectTreeNodeByCPPage(CPPage page) { protected boolean selectTreeNodeByCPPage(CPPage page) {
currentPage = page; currentPage = page;
if(currentPage != null) {
String identifier = currentPage.getIdentifier();
String nodeId = treeModel.getNodeIDForIdentifier(identifier);
treeCtr.setSelectedNodeId(nodeId);
}
return true; return true;
} }
...@@ -368,12 +351,12 @@ public class CPTreeController extends BasicController { ...@@ -368,12 +351,12 @@ public class CPTreeController extends BasicController {
if(event instanceof TreeEvent) { if(event instanceof TreeEvent) {
TreeEvent te = (TreeEvent)event; TreeEvent te = (TreeEvent)event;
String selectedNodeID = treeModel.getIdentifierForNodeID(te.getNodeId()); String selectedNodeID = treeModel.getIdentifierForNodeID(te.getNodeId());
currentPage = new CPPage(selectedNodeID, cp); currentPage = new CPPage(selectedNodeID, cp);
//TODO jquery TreeNodeClickedEvent clickedEvent = new TreeNodeClickedEvent(currentPage.getIdentifier()); fireEvent(ureq, new TreeEvent(TreeEvent.COMMAND_TREENODE_CLICKED, selectedNodeID));
//fireEvent(ureq, clickedEvent); } else if(event instanceof TreeDropEvent) {
TreeDropEvent te = (TreeDropEvent)event;
doDrop(ureq, te.getDroppedNodeId(), te.getTargetNodeId(), te.isAsChild(), te.isAtTheEnd());
} }
} }
} }
...@@ -401,40 +384,6 @@ public class CPTreeController extends BasicController { ...@@ -401,40 +384,6 @@ public class CPTreeController extends BasicController {
cmc = null; cmc = null;
removeAsListenerAndDispose(uploadCtr); removeAsListenerAndDispose(uploadCtr);
uploadCtr = null; uploadCtr = null;
} else if (source == treeCtr) {
// event from extJSTree (TreeController)
if (event instanceof TreeEvent) {
/** move * */
/*
if(event.getCommand().equals(MenuTree.COMMAND_TREENODE_DROP)) {
TreeEvent moveEvent = (TreeEvent) event;
String selectedNodeID = treeModel.getIdentifierForNodeID(moveEvent.getNodeId());
currentPage = new CPPage(selectedNodeID, cp);
MoveTreeNodeEvent newmoveEvent = new MoveTreeNodeEvent(treeModel.getIdentifierForNodeID(moveEvent.getNodeId()), treeModel
.getIdentifierForNodeID(moveEvent.getOldParentNodeId()), treeModel.getIdentifierForNodeID(moveEvent.getNewParentNodeId()),
moveEvent.getPosition());
boolean success = movePage(newmoveEvent);
// setResult is important. If sucess is not true, the ajax tree will
// popup a dialog with error-msg
moveEvent.setResult(success, "Error", "Error while moving node");
} else if(event.getCommand().equals(MenuTree.COMMAND_TREENODE_CLICKED)) {
TreeEvent clickedEvent = (TreeEvent) event;
String selectedNodeID = treeModel.getIdentifierForNodeID(clickedEvent.getNodeId());
currentPage = new CPPage(selectedNodeID, cp);
clickedEvent = new TreeNodeClickedEvent(currentPage.getIdentifier());
fireEvent(ureq, clickedEvent);
}
} else if (event instanceof TreeNodeModifiedEvent) {
//a node (name) has been modified
fireEvent(ureq, event);
}*/
}
} else if (source == dialogCtr) { } else if (source == dialogCtr) {
// event from dialog (really-delete-dialog) // event from dialog (really-delete-dialog)
if (event != Event.CANCELLED_EVENT) { if (event != Event.CANCELLED_EVENT) {
...@@ -463,6 +412,43 @@ public class CPTreeController extends BasicController { ...@@ -463,6 +412,43 @@ public class CPTreeController extends BasicController {
} }
} }
} }
private void doDrop(UserRequest ureq, String droppedNodeId, String targetNodeId, boolean asChild, boolean atTheEnd) {
TreeNode droppedNode = treeModel.getNodeById(droppedNodeId);
TreeNode targetNode = treeModel.getNodeById(targetNodeId);
String droppedNodeIdent = treeModel.getIdentifierForNodeID(droppedNodeId);
String targetNodeIdent = treeModel.getIdentifierForNodeID(targetNodeId);
CPManager cpMgm = CPManager.getInstance();
if(asChild) {
cpMgm.moveElement(cp, droppedNodeIdent, targetNodeIdent, 0);
cpMgm.writeToFile(cp);
} else {
TreeNode parentTargetNode = (TreeNode)targetNode.getParent();
int index = TreeHelper.indexOf(targetNode, parentTargetNode);
boolean sibling = droppedNode.getParent().equals(parentTargetNode);
if(sibling) {
int droppedCurentIndex = TreeHelper.indexOf(targetNode, parentTargetNode);
if(droppedCurentIndex < index) {
index = index -2;
}
}
if(index < 0) {
index = 0;
}
String parentTargetNodeIdent = treeModel.getIdentifierForNodeID(parentTargetNode.getIdent());
cpMgm.moveElement(cp, droppedNodeIdent, parentTargetNodeIdent, index + 1);
cpMgm.writeToFile(cp);
}
selectTreeNodeById(droppedNodeIdent);
updateTree();
fireEvent(ureq, new TreeEvent(TreeEvent.COMMAND_TREENODE_CLICKED, droppedNodeIdent));
}
/** /**
* Retrieves the parent identifier of the current page * Retrieves the parent identifier of the current page
......
...@@ -105,7 +105,7 @@ public class VFSCPContainer extends AbstractVirtualContainer implements VFSConta ...@@ -105,7 +105,7 @@ public class VFSCPContainer extends AbstractVirtualContainer implements VFSConta
List<VFSItem> items = new ArrayList<VFSItem>(); List<VFSItem> items = new ArrayList<VFSItem>();
for(TreeNode node:nodes) { for(TreeNode node:nodes) {
try { try {
String nid = (String)node.getIdent();//TODO jquery .get(AjaxTreeNode.CONF_ID); String nid = (String)node.getIdent();
String id = model.getIdentifierForNodeID(nid); String id = model.getIdentifierForNodeID(nid);
String filePath = cpMgm.getPageByItemId(cp, id); String filePath = cpMgm.getPageByItemId(cp, id);
String title = cpMgm.getItemTitle(cp, id); String title = cpMgm.getItemTitle(cp, id);
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment