drag and drop - vaadin - how to swap components in a grid layout -


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