Listing 1. Redrawing Screen

// For either the AUTO_SCALE or TRACKING modes, we
// may need to schedule a new rendering with a new
// mapping.  In AUTO_SCALE mode, a new rendering
// is needed if _allPointsBBBox != _map.viewPort.
// Or in TRACKING mode, it is needed if
// _trackingPort != _map.viewPort.
BBox *testBox;
testBox = (AUTO_SCALE == _viewMode) ?
   &_allPointsBBox : &_trackingPort;

if (  (AUTO_SCALE == _viewMode)
    && memcmp(&_allPointsBBox,  &(_map.viewPort),
    sizeof(BBox))  )
  _render.quePrivateRender(_allPointsBBox,
     this->size());

// For TRACKING mode, we must also make sure that
// the range following has not eaten up all our
// resolution.
else if (  (TRACKING == _viewMode)
   && memcmp(&_trackingPort,  &(_map.viewPort),
      sizeof(BBox))  )
{
  BBox tmpPort;
  tmpPort = _trackingPort; // Need copy for
                          // rtpResCheck to modify
  if (!rtpResCheck(&tmpPort))
    _render.quePrivateRender(_trackingPort,
       this->size());
  else // Notify user of problem, switch to
       // USER_FIXED mode.
       // Mode change must come before message box
       //  to avoid recursion.
  {
    _viewMode = USER_FIXED;
    QMessageBox::warning(this, caption(),
"Resolution is insufficient to track new points.\n"
      "Fixing view port in current position.\n",
      QMessageBox::Ok | QMessageBox::Default, 0, 0);
  }
}