bool PZoomInteraction::Draw (Painter &inPainter) {
  if (mDragging) {
    inPainter.SetLineColor (255, 0, 0);

    float theX1 = mX1;
    float theX2 = mX2;
    float theY1 = mY1;
    float theY2 = mY2;

    switch (mZoomMode) {
    case kZoom_Region:
      break;
    case kZoom_X:
      theY1 = mPPlot.mMargins.mTop;
      theY2 = inPainter.GetHeight ()-mPPlot.mMargins.mBottom;
      break;
    case kZoom_Y:
      theX1 = mPPlot.mMargins.mLeft;
      theX2 = inPainter.GetWidth ()-mPPlot.mMargins.mRight;
      break;
    }

    // draw rectangle
    inPainter.DrawLine (theX1, theY1, theX2, theY1);
    inPainter.DrawLine (theX2, theY1, theX2, theY2);
    inPainter.DrawLine (theX2, theY2, theX1, theY2);
    inPainter.DrawLine (theX1, theY2, theX1, theY1);
  }
  return true;
  
}
bool PCrosshairInteraction::Draw (Painter &inPainter) {
  if (mActive) {
    float theX1 = mX;
    float theY1 = mPPlot.mMargins.mTop;
    float theX2 = mX;
    float theY2 = inPainter.GetHeight () - mPPlot.mMargins.mBottom;

    inPainter.SetLineColor (0, 0, 0);
    inPainter.DrawLine (theX1, theY1, theX2, theY2);

    PlotDataContainer &theContainer = mPPlot.mPlotDataContainer;
    long thePlotCount = theContainer.GetPlotCount ();

    for (long theI=0;theI<thePlotCount;theI++) {
      PlotDataBase *theXData = theContainer.GetXData (theI);
      PlotDataBase *theYData = theContainer.GetYData (theI);
      LegendData *theLegendData = theContainer.GetLegendData (theI);

      float theY;
      if (GetCrossPoint (theXData, theYData, theY)) {
        if (mListener) {
          float theXTarget = mPPlot.mXTrafo->TransformBack (mX);
          float theYTarget = mPPlot.mYTrafo->TransformBack (theY);
          mListener->HandleCrosshair (theI, thePlotCount, theXTarget, theYTarget);
        }
        theX1 = mPPlot.mMargins.mLeft;
        theX2 = inPainter.GetWidth ()-mPPlot.mMargins.mLeft;
        theY1 = theY2 = theY;
        PColor theC = theLegendData->mColor;
        inPainter.SetLineColor (theC.mR, theC.mG, theC.mB);
        inPainter.DrawLine (theX1, theY1, theX2, theY2);
      }
    }
  }
  return true;
}
bool PZoomInteraction::Draw (Painter &inPainter) {
  if (mDragging) {
    inPainter.SetLineColor (255, 0, 0);

    float theX1 = mX1;
    float theX2 = mX2;
    float theY1 = mY1;
    float theY2 = mY2;

    bool theDrawInverse = true;

    switch (mZoomMode) {
    case kZoom_Region:
      //      theDrawInverse = false;
      break;
    case kZoom_X:
      theY1 = mPPlot.mMargins.mTop;
      theY2 = inPainter.GetHeight ()-mPPlot.mMargins.mBottom;
      break;
    case kZoom_Y:
      theX1 = mPPlot.mMargins.mLeft;
      theX2 = inPainter.GetWidth ()-mPPlot.mMargins.mRight;
      break;
    }

    // draw rectangle
    inPainter.DrawLine (theX1, theY1, theX2, theY1);
    inPainter.DrawLine (theX2, theY1, theX2, theY2);
    inPainter.DrawLine (theX2, theY2, theX1, theY2);
    inPainter.DrawLine (theX1, theY2, theX1, theY1);

    if (theDrawInverse) {
      float theX = pmin (theX1, theX2); 
      float theY = pmin (theY1, theY2); 
      float theW = fabs (theX1-theX2);
      float theH = fabs (theY1-theY2);
      inPainter.InvertRect (theX, theY, theW, theH);
    }
  }
  return true;
  
}