i have split panel empty panel on left side , right side grid layout. users can drag elements left side , put them on right side. right side grid layout wth 4,3 matrix.
- we should able place components on right side using drag , drop
- we should able swap components placed in grid layout ( right side of split panel).
i able first point done. however, have trouble second one.
also, tried vaadin addon drag drop not work me. using vaadin 7.6.4 features of drag , drop.
can help?
package com.example.dragdropvaadindemo; import javax.servlet.annotation.webservlet; import java.util.logging.logger; import com.vaadin.annotations.vaadinservletconfiguration; import com.vaadin.event.databoundtransferable; import com.vaadin.event.transferable; import com.vaadin.event.dd.draganddropevent; import com.vaadin.event.dd.drophandler; import com.vaadin.event.dd.acceptcriteria.acceptall; import com.vaadin.event.dd.acceptcriteria.acceptcriterion; import com.vaadin.server.sizeable; import com.vaadin.server.vaadinrequest; import com.vaadin.server.vaadinservlet; import com.vaadin.ui.button; import com.vaadin.ui.button.clickevent; import com.vaadin.ui.button.clicklistener; import com.vaadin.ui.component; import com.vaadin.ui.draganddropwrapper; import com.vaadin.ui.draganddropwrapper.dragstartmode; import com.vaadin.ui.draganddropwrapper.wrappertargetdetails; import com.vaadin.ui.draganddropwrapper.wrappertransferable; import com.vaadin.ui.gridlayout; import com.vaadin.ui.hascomponents; import com.vaadin.ui.horizontalsplitpanel; import com.vaadin.ui.ui; import com.vaadin.ui.verticallayout; import com.vaadin.annotations.theme; @theme("dragdropvaadindemo") public class dragdropvaadindemoui extends ui { /** * */ private static final long serialversionuid = -586508616992840936l; final string left_width = "20%"; horizontalsplitpanel splitpanel; draganddropwrapper wrappera; draganddropwrapper wrapperb; draganddropwrapper splitpanewrapper; button buttona; button buttonb; private boolean isdragmode = false; private static final logger logger = logger.getlogger(dragdropvaadindemoui.class.getname()); public int rowposition; public int colposition; public int getrowposition() { return rowposition; } public void setrowposition(int rowposition) { this.rowposition = rowposition; } public int getcolposition() { return colposition; } public void setcolposition(int colposition) { this.colposition = colposition; } @webservlet(value = "/*", asyncsupported = true) @vaadinservletconfiguration(productionmode = false, ui = dragdropvaadindemoui.class) public static class servlet extends vaadinservlet { /** * */ private static final long serialversionuid = -4605445550539288930l; } @override protected void init(vaadinrequest request) { // left side emptypanel emptypanel = new emptypanel("left panel"); emptypanel.setid("leftpanel_0_0"); emptypanel.setsizefull(); final draganddropwrapper wrappera = new draganddropwrapper(emptypanel); wrappera.setsizefull(); wrappera.setid("wrapper_leftpanel_0_0"); final verticallayout leftpanellayout = new verticallayout(); leftpanellayout.addcomponent(wrappera); leftpanellayout.setwidth("50%"); // draganddropwrapper leftpanellayoutwrapper = new draganddropwrapper(leftpanellayout); // leftpanellayoutwrapper.setdrophandler(new drophandler() { // // private static final long serialversionuid = -4676732504780260831l; // // @override // public void drop(draganddropevent event) { // leftpanellayout.addcomponent(event.gettransferable().getsourcecomponent()); // // } // // @override // public acceptcriterion getacceptcriterion() { // return acceptall.get(); // } // // }); // leftpanellayoutwrapper.setsizefull(); // right side final gridlayout rightpanellayout = new gridlayout(4, 3); rightpanellayout.setstylename("csstag"); // add panels layout (int = 0; < 3; i++) { (int j = 0; j < 4; j++) { setrowposition(i); setcolposition(j); emptypanel emptygridpanel = new emptypanel("rightpanel " + + "," + j); emptygridpanel.setsizefull(); emptygridpanel.addstylename("border-gridcell"); final draganddropwrapper rightpanelcellwrapper = new draganddropwrapper(emptygridpanel); rightpanelcellwrapper.setsizefull(); final int col = getcolposition(); final int row = getrowposition(); rightpanelcellwrapper.setid("wrapper_emptypanel_" + row + "_" + col); rightpanelcellwrapper.setdrophandler(new drophandler() { /** * */ private static final long serialversionuid = -5729628537182171336l; @override public void drop(draganddropevent event) { // source details. transferable t = event.gettransferable(); component = t.getsourcecomponent(); logger.info("wrapper component =" + from); draganddropwrapper draganddropwrapper = (draganddropwrapper) from; logger.info("dragged component count =" + draganddropwrapper.getcomponentcount() + " id=" + draganddropwrapper.getid()); string sourcewrapperid = draganddropwrapper.getid(); // target details. wrappertargetdetails details = (wrappertargetdetails) event.gettargetdetails(); logger.info("target component =" + details.gettarget()); draganddropwrapper draganddroptargetwrapper = (draganddropwrapper) details.gettarget(); logger.info("target component count =" + draganddroptargetwrapper.getcomponentcount() + " id=" + draganddroptargetwrapper.getid()); string targetwrapperid = draganddroptargetwrapper.getid(); // if source wrapper id outside if ((sourcewrapperid.contains("leftpanel_")) && (targetwrapperid.contains("wrapper_emptypanel_") ) ) { // emptypanel draggedpanelwrapper = (emptypanel) event.gettransferable().getsourcecomponent(); // logger.info("empty panel dragged = " + draggedpanelwrapper.getpanelname() + " id="+ // draggedpanelwrapper.getid()); // logger.info("empty panel dragged = " + draggedpanel.getpanelname() + " id=" + // draggedpanel.getid()); logger.info("removing existing component location=" + row + "," + col); rightpanellayout.removecomponent(col, row); logger.info("adding new component location=" + row + "," + col); draganddropwrapper.setdragstartmode(dragstartmode.wrapper); rightpanellayout.addcomponent(draganddropwrapper, col, row); // once empty panel added, create new 1 in left side panel. emptypanel emptypanel = new emptypanel("left panel"); emptypanel.setid("gridpanel_" + row + "_" + col); emptypanel.setsizefull(); draganddropwrapper emptypanelwrapper = new draganddropwrapper(emptypanel); emptypanelwrapper.setid("wrapper_leftpanel_" + row + "_" + col); leftpanellayout.addcomponent(emptypanelwrapper); emptypanelwrapper.setdragstartmode(dragstartmode.wrapper); emptypanelwrapper.setsizefull(); // gridpanel_ } else if (sourcewrapperid.contains("gridpanel_") && (targetwrapperid.contains("gridpanel_") ) ) { string sourcerowcolstr = sourcewrapperid.replace("gridpanel_", ""); string sourceindexarr[] = sourcerowcolstr.split("_"); logger.info("sourcewrapperid="+sourcewrapperid + "#sourcerowcolstr="+sourcerowcolstr + "# row pos="+sourceindexarr[0] + "# col pos = "+sourceindexarr[1]); } else { // error criteria.cannot add component. } } @override public acceptcriterion getacceptcriterion() { return acceptall.get(); } }); rightpanellayout.addcomponent(rightpanelcellwrapper, j, i); logger.info("added panel @ location=" + + "," + j); } } rightpanellayout.setsizefull(); // overall panel final horizontalsplitpanel splitpanel = new horizontalsplitpanel(); // splitpanel.setfirstcomponent(leftpanellayoutwrapper); splitpanel.setfirstcomponent(leftpanellayout); splitpanel.setsecondcomponent(rightpanellayout); splitpanel.setsizefull(); splitpanel.setsplitposition(10, sizeable.unit.percentage); splitpanel.setlocked(true); final button dragmode = new button("drag mode on"); dragmode.addclicklistener(new clicklistener() { private static final long serialversionuid = -926098671937004974l; @override public void buttonclick(clickevent event) { isdragmode = !isdragmode; if (isdragmode) { dragmode.setcaption("drag mode off"); wrappera.setdragstartmode(dragstartmode.wrapper); // wrapperb.setdragstartmode(dragstartmode.wrapper); } else { dragmode.setcaption("drag mode on"); wrappera.setdragstartmode(dragstartmode.none); // wrapperb.setdragstartmode(dragstartmode.none); } } }); // outer layout. verticallayout layout = new verticallayout(); layout.addcomponent(dragmode); layout.addcomponent(splitpanel); layout.setsizefull(); this.setcontent(layout); this.setsizefull(); } component findcomponentwithid(hascomponents root, string id) { (component child : root) { if (id.equals(child.getid())) { // found it! return child; } else if (child instanceof hascomponents) { // recursively go through children have children return findcomponentwithid((hascomponents) child, id); } } // none found return null; } // find components type. component findcomponentwithnamepattern(hascomponents root, string namepattern) { (component child : root) { if ((child.getid()).contains(namepattern)) { // found it! return child; } else if (child instanceof hascomponents) { // recursively go through children have children return findcomponentwithid((hascomponents) child, namepattern); } } // none found return null; } }
here empoty panel supports it.
package com.example.dragdropvaadindemo; import com.vaadin.ui.label; import com.vaadin.ui.panel; import com.vaadin.ui.verticallayout; public class emptypanel extends panel{ private string panelname; public string getpanelname() { return panelname; } public void setpanelname(string panelname) { this.panelname = panelname; } public emptypanel(string panelname){ this.panelname = panelname; verticallayout vlayout = new verticallayout(); setcontent(vlayout); vlayout.setmargin(true); vlayout.setsizefull(); label lbla = new label(panelname); lbla.setwidth("30%"); //lbla.setdescription(panelname); this.setdescription(panelname); vlayout.addcomponent(lbla); } }
i able done using gridlayout.replacecomponent method.
it nice have swapping method in vaadin grid layout.
Comments
Post a Comment