Changeset 2170


Ignore:
Timestamp:
01/26/07 16:48:57 (13 years ago)
Author:
sorber
Message:

Enabled dragging multiple objects.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/loci/visbio/overlays/PointerTool.java

    r2125 r2170  
    3333  // -- Fields -- 
    3434 
    35   /** Index of object currently being grabbed. */ 
    36   protected int grabIndex = -1; 
    37  
    3835  /** Location where an object was first "grabbed" with a mouse press. */ 
    3936  protected float grabX, grabY; 
    4037 
    4138  /** Vector of "grabbed" objects */ 
    42   protected Vector grabees;  // (the user being the grabber) 
    43  
    44   /** Location where mouseDown occurs */ 
    45   protected float downX, downY; 
     39  protected Vector grabbed;  // the grabees  
    4640 
    4741  /** The selection box which may be created by this tool */ 
     
    8175    bounds = new float[objs.length][4]; 
    8276    selected = new boolean[objs.length]; 
     77    grabbed = new Vector(objs.length); 
    8378 
    8479    double dist = Double.POSITIVE_INFINITY; 
     
    9186      } 
    9287    } 
     88 
     89    double threshold = 0.02 * overlay.getScalingValue(); 
     90 
     91    if (dist < threshold) { 
     92      if (shift) objs[ndx].setSelected(true); 
     93      else if (ctrl) objs[ndx].setSelected(ctrl ? !objs[ndx].isSelected() : true); 
     94      else { 
     95        if (objs[ndx].isSelected()) { 
     96          // grab all selected objects 
     97          for (int i=0; i<objs.length; i++) { 
     98            if (objs[i].isSelected()) grabbed.add(objs[i]); 
     99          } 
     100          // record location of mouseDown 
     101          grabX = dx; 
     102          grabY = dy; 
     103        } 
     104        else { 
     105          // select this object and deselect all others 
     106          for (int i=0; i<objs.length; i++) objs[i].setSelected(false); 
     107          objs[ndx].setSelected(true); 
     108        } 
     109      } 
     110    } 
     111    else { 
     112      if (!ctrl && !shift) { 
     113        // deselect all previously selected objects 
     114        for (int i=0; i<objs.length; i++) objs[i].setSelected(false); 
     115      } 
    93116     
    94     // assemble array of objects' bounding boxes  
    95     for (int i=0; i<objs.length; i++) { 
    96       float[] bound = new float[4]; 
    97       bound[0] = objs[i].getX(); 
    98       bound[1] = objs[i].getY(); 
    99       if (objs[i].hasEndpoint2()) { 
    100         bound[2] = objs[i].getX2(); 
    101         bound[3] = objs[i].getY2(); 
    102       } else { 
    103         bound[2] = bound[0]; 
    104         bound[3] = bound[1]; 
    105       } 
    106       bounds[i] = bound; 
    107     } 
    108  
    109     double threshold = 0.02 * overlay.getScalingValue(); 
    110     boolean sel = dist < threshold && objs[ndx].isSelected(); 
    111  
    112     if (!shift && !ctrl) { 
    113       // deselect all previously selected objects 
    114       for (int i=0; i<objs.length; i++) objs[i].setSelected(false); 
    115     } 
    116  
    117     // compile array tracking initial selection state of all objs at this position 
    118     for (int i=0; i<objs.length; i++) { selected[i] = objs[i].isSelected(); } 
    119  
    120     if (dist < threshold) { 
    121       if (sel && !ctrl && !shift) { 
    122         // grab object if it is already selected 
    123         grabIndex = ndx; 
    124         grabX = dx; 
    125         grabY = dy; 
    126       } 
    127       // select (or deselect) picked object 
    128       objs[ndx].setSelected(ctrl ? !sel : true); 
    129     } else { 
    130       // record location of click 
    131       downX = dx; 
    132       downY = dy; 
     117      // assemble array of objects' bounding boxes  
     118      for (int i=0; i<objs.length; i++) { 
     119        float[] bound = new float[4]; 
     120        bound[0] = objs[i].getX(); 
     121        bound[1] = objs[i].getY(); 
     122        if (objs[i].hasEndpoint2()) { 
     123          bound[2] = objs[i].getX2(); 
     124          bound[3] = objs[i].getY2(); 
     125        } else { 
     126          bound[2] = bound[0]; 
     127          bound[3] = bound[1]; 
     128        } 
     129        bounds[i] = bound; 
     130      } 
     131     
     132      // compile array tracking initial selection state of all objs here  
     133      for (int i=0; i<objs.length; i++) { selected[i] = objs[i].isSelected(); } 
    133134 
    134135      // instantiate selection box 
    135       select = new TransientSelectBox(overlay, downX, downY); 
     136      select = new TransientSelectBox(overlay, dx, dy); 
    136137      overlay.addTSB (select); 
    137138    } 
    138139 
    139140    ((OverlayWidget) overlay.getControls()).refreshListSelection(); 
    140     if (grabIndex >= 0 || select != null) overlay.setTextDrawn(false); 
     141    if (!grabbed.isEmpty() || select != null) overlay.setTextDrawn(false); 
    141142    overlay.notifyListeners(new TransformEvent(overlay)); 
    142143  } 
     
    150151 
    151152    // release any grabbed objects 
    152     if (grabIndex >= 0) { 
    153       grabIndex = -1; 
     153    if (!grabbed.isEmpty()) { 
     154      grabbed.clear(); 
    154155      overlay.setTextDrawn(true); 
    155156      overlay.notifyListeners(new TransformEvent(overlay)); 
     
    171172 
    172173    // move grabbed object, if any 
    173     if (grabIndex >= 0) { 
    174       OverlayObject obj = overlay.getObjects(pos)[grabIndex]; 
     174    if (!grabbed.isEmpty()) { 
    175175      float moveX = dx - grabX; 
    176176      float moveY = dy - grabY; 
    177       obj.setCoords(obj.getX() + moveX, obj.getY() + moveY); 
    178       obj.setCoords2(obj.getX2() + moveX, obj.getY2() + moveY); 
     177      for (int i=0; i<grabbed.size(); i++) { 
     178        OverlayObject obj = (OverlayObject) grabbed.elementAt(i); 
     179        obj.setCoords(obj.getX() + moveX, obj.getY() + moveY); 
     180        obj.setCoords2(obj.getX2() + moveX, obj.getY2() + moveY); 
     181      } 
    179182      grabX = dx; 
    180183      grabY = dy; 
    181184      overlay.notifyListeners(new TransformEvent(overlay)); 
    182     } 
    183     else if (select != null) { 
     185    } else if (select != null) { 
    184186      // extend selection box 
    185187      select.setCorner(dx, dy); 
Note: See TracChangeset for help on using the changeset viewer.