/*
  * Zoom in/out. Translate the viewing window such that the place under the mouse pointer is a fixed point. If p is null, zoom around the center of
  * the viewport.
  */
 void zoom(double f, Point p) {
   double ex = modelBounds.getWidth() * f;
   double ey = modelBounds.getHeight() * f;
   modelBounds.expandBy(ex / 2, ey / 2);
   if (p != null) {
     // Note: Graphics Y coordinates increase down the screen, hence the opposite signs.
     double tx = ex * -((p.getX() / this.width) - 0.5);
     double ty = ey * +((p.getY() / this.height) - 0.5);
     modelBounds.translate(tx, ty);
   }
   // update the display
   drawLevel = DRAW_PARTIAL;
 }
 public void mouseDragged(MouseEvent e) {
   Point c = e.getPoint();
   if (startDrag == null) {
     startDrag = c;
     dragX = c.x;
     dragY = c.y;
   }
   double dx = dragX - c.x;
   double dy = c.y - dragY;
   if (ctrlPressed || mouseButton == RIGHT) {
     zoom(dy * 0.01, startDrag);
   } else {
     double tx = modelBounds.getWidth() * dx / getWidth();
     double ty = modelBounds.getHeight() * dy / getHeight();
     modelBounds.translate(tx, ty);
   }
   dragX = c.x;
   dragY = c.y;
   drawLevel = DRAW_PARTIAL;
 }