Main Page | Namespace List | Class Hierarchy | Alphabetical List | Class List | Directories | File List | Namespace Members | Class Members | File Members | Related Pages

CanvasView.cxx

Go to the documentation of this file.
00001 
00014 // for MEMFUN1 and others
00015 #ifdef HAVE_CONFIG_H
00016 #include "config.h"
00017 #endif
00018 
00019 #if QT_VERSION < 0x040000
00020 #else
00021 //Added by the Qt porting tool:
00022 #include <QMouseEvent>
00023 #endif
00024 
00025 #ifdef _MSC_VER
00026 #include "msdevstudio/MSconfig.h"
00027 #endif
00028 
00029 #include "CanvasView.h"
00030 
00031 #include "CanvasSelectionEvent.h"
00032 #include "CanvasSettings.h"
00033 #include "CanvasWindow.h"
00034 #include "Inspector.h"
00035 #include "PlotterEvent.h"
00036 #include "QtView.h"
00037 #include "QtViewFactory.h"
00038 #include "PickTable.h"
00039 #include "WindowController.h"
00040 
00041 #include "controllers/DisplayController.h"
00042 #include "controllers/FunctionController.h"
00043 #include "datareps/ScatterPlot.h"
00044 #include "datasrcs/DataSourceController.h"
00045 #include "datasrcs/NTupleController.h"
00046 #include "graphics/EpsView.h"
00047 #include "plotters/PlotterBase.h"
00048 #include "qtxml/QtXMLController.h"
00049 
00050 #ifdef HAVE_CFITSIO
00051 #include "fits/FitsController.h"
00052 #endif
00053 
00054 #ifdef HAVE_ROOT
00055 #include "root/RootController.h"
00056 #endif
00057 
00058 #include <qapplication.h>
00059 
00060 
00061 #if QT_VERSION < 0x040000
00062 #include <qfiledialog.h>
00063 #include <qimage.h>
00064 #else
00065 #include <q3filedialog.h>
00066 #include <QImageIO>
00067 #endif
00068 
00069 #include <qmessagebox.h>
00070 #include <qpainter.h>
00071 #include <qsettings.h>
00072 #include <qstatusbar.h>
00073 #include <qwaitcondition.h>
00074 #include <qfont.h>
00075 
00076 #include <algorithm>
00077 
00078 
00079 #include <cctype>
00080 #include <cassert>
00081 
00082 using std::bind2nd;
00083 using std::for_each;
00084 using std::map;
00085 using std::mem_fun;
00086 using std::list;
00087 using std::string;
00088 using std::vector;
00089 
00090 /* Use `=' syntax so that Doxygen picks it up. */
00091 const string CanvasView::s_app_name = "HippoDraw";
00092 string CanvasView::s_image_filters;
00093 
00094 namespace {
00095    QWaitCondition mouseEvent;
00096 }
00097 
00098 #if QT_VERSION < 0x040000
00099 CanvasView::CanvasView ( QCanvas * c, QWidget * parent,
00100                          const char * name, Qt::WFlags f )
00101 #else
00102 CanvasView::CanvasView ( Q3Canvas * c, QWidget * parent,
00103                          const char * name, Qt::WFlags f )
00104 #endif
00105   :  FigureEditor ( c, parent, name, f ),
00106      m_inspector ( 0 ),
00107      m_image_dialog ( 0 ),
00108      m_num_width ( 2 ),
00109      m_num_height ( 3 )
00110      
00111 {
00112   m_xml_controller = QtXMLController::instance ();
00113   m_table_map.clear();
00114   drag_rect = 0;
00115 
00116   initSettings ();
00117 }
00118 
00119 void
00120 CanvasView::
00121 initSettings ()
00122 {
00123   QSettings settings;
00124   settings.insertSearchPath ( QSettings::Windows, s_registry );
00125 
00126   m_num_width 
00127     = settings.readNumEntry ( s_app_key + "Canvas/Number/Width", 2 );
00128   m_num_height 
00129     = settings.readNumEntry ( s_app_key + "Canvas/Number/Height", 3 );
00130 
00131   m_add_selected
00132     = settings.readBoolEntry ( s_app_key + "Canvas/AddSelected" );
00133 
00134 }
00135 
00136 void
00137 CanvasView::
00138 saveSettings () const
00139 {
00140   QSettings settings;
00141   settings.insertSearchPath ( QSettings::Windows, s_registry );
00142   
00143   int orientation; 
00144   if( s_printer -> orientation() == QPrinter::Portrait )
00145     orientation = 0;
00146   else
00147     orientation = 1;
00148   
00149   settings.writeEntry ( s_app_key + "Printer/Orientation", orientation );
00150   settings.writeEntry ( s_app_key + "Canvas/Number/Width",  m_num_width );
00151   settings.writeEntry ( s_app_key + "Canvas/Number/Height", m_num_height );
00152   settings.writeEntry ( s_app_key + "Canvas/AddSelected", m_add_selected );
00153   
00154   if( m_printer_bounds == false )
00155     settings.writeEntry ( s_app_key + "Canvas/Margin", 0 );
00156   else
00157     settings.writeEntry ( s_app_key + "Canvas/Margin", 1 );
00158 }
00159 
00160 void
00161 CanvasView::
00162 setAddedSelected ( bool yes )
00163 {
00164   m_add_selected = yes;
00165 }
00166 
00167 void CanvasView::initFrom ( const std::list < ViewBase * > & views )
00168 {
00169   std::list < ViewBase * > ::const_iterator first = views.begin();
00170   for ( ; first != views.end(); ++first ) {
00171     QtView * view = dynamic_cast < QtView * > ( *first );
00172     add ( view ); // ignore the rest
00173   }
00174 
00175 #if QT_VERSION < 0x040000
00176   QCanvasView::ensureVisible ( 0, 0 );
00177 #else
00178   Q3CanvasView::ensureVisible ( 0, 0 );
00179 #endif
00180 }
00181 
00182 void 
00183 CanvasView::
00184 initFromFile ( const std::string & filename ) 
00185 {
00186   XmlController::Status status = m_xml_controller->openFile ( filename );
00187 
00188   if ( status != XmlController::Success ) {
00189     const string & app_name = applicationName ();
00190 
00191     QString fn = filename.c_str ();
00192     QString message;
00193     message = QString("Unable to open document file:\n%1\n").arg ( fn );
00194     if ( status == XmlController::OpenError ) {
00195       message += "\nFile could not be read\n";
00196     } else 
00197       if ( status == XmlController::ParseError ) {
00198         message += "\nThere was a XML parsing error\n";
00199       } else {
00200         message += "\nThere were one or more referenced\n";
00201         message += "NTuple files that could not be found.";
00202       }
00203     QMessageBox::critical ( this, // parent
00204                             app_name.c_str(), // caption
00205                             message,
00206                             QMessageBox::Ok,
00207                             Qt::NoButton,
00208                             Qt::NoButton );
00209     show ();
00210     return;
00211   }
00212 
00213   ViewFactory * factory = QtViewFactory::instance ();
00214   const list < ViewBase * > & view_list
00215     = m_xml_controller->getViews ( factory );
00216 
00217   initFrom ( view_list );
00218 
00219   notifyObservers ();
00220 }
00221 
00222 void
00223 CanvasView::
00224 invalidImageFormatError ( const std::string & filename )
00225 {
00226   if ( s_image_filters.empty () ) createImageFilters ();
00227 
00228   string types;
00229   string::size_type size = s_image_filters.size ();
00230   for ( string::size_type i = 0; i < size; i++ ) {
00231     string::value_type c = s_image_filters[i];
00232     if ( c != '(' &&
00233          c != ')' &&
00234          c != ';' ) types += c;
00235   }
00236 
00237   string message ( "Attempt to save image to file:\n" );
00238   message += filename;
00239   message += "\nwhose suffix indicates unsupported image format.\n\n";
00240   message += "Supported image formats are:\n";
00241   message += types;
00242 
00243   QMessageBox::critical ( this, // parent
00244                           "Image format error", // caption
00245                           message.c_str() );
00246 
00247 }
00248 
00249 bool
00250 CanvasView::
00251 existingFileWarning ( const std::string & filename )
00252 {
00253   string message ( "The file:\n" );
00254   message += filename;
00255   message += "\nalready exists.\n\n";
00256   message += "Over-write existing file?";
00257 
00258   int yes = QMessageBox::warning ( this, //parent
00259                                    "Existing file warning", // caption
00260                                    message.c_str(),
00261                                    QMessageBox::Yes,
00262                                    QMessageBox::No,
00263                                    Qt::NoButton );
00264 
00265   return yes == QMessageBox::Yes;
00266 }
00267 
00271 void
00272 CanvasView::
00273 copySelectedToPasteboard ()
00274 {
00275   const vector < const ViewBase * > & selViews = selectedViews();
00276   if ( selViews.empty () ) return;
00277 
00278   vector < const ViewBase * > view_list;
00279   fillSelectedWithObservers ( view_list );
00280   m_xml_controller->saveToPasteboard ( view_list );
00281 }
00282 
00283 void
00284 CanvasView::
00285 copyFromPasteboard ()
00286 {
00287   const vector < const ViewBase * > & targets = views ();
00288   ViewFactory * factory = QtViewFactory::instance ();
00289 
00290   const list < ViewBase * > & pb_views 
00291     = m_xml_controller->getFromPasteboard ( factory, targets );
00292   pasteViews ( pb_views );
00293 }
00294 
00295 void
00296 CanvasView::
00297 addFromPasteboard ()
00298 {
00299   const vector < const ViewBase * > & targets = views ();
00300   ViewFactory * factory = QtViewFactory::instance ();
00301 
00302   const list < ViewBase * > & pb_views 
00303     = m_xml_controller->getFromPasteboard ( factory, targets );
00304   list < ViewBase * >::const_iterator first = pb_views.begin ();
00305   while ( first != pb_views.end () ) {
00306     ViewBase * view = *first++;
00307     QtView * qtview = dynamic_cast < QtView * > ( view );
00308     placeGraph ( qtview );
00309     addView ( qtview, true );
00310   }
00311 }
00312 
00313 void
00314 CanvasView::
00315 deleteSelected ( bool pasteboard )
00316 {
00317   const vector < const ViewBase * > & selViews = selectedViews();
00318   if ( selViews.empty () ) return;
00319 
00320   vector < const ViewBase * > view_list;
00321   fillSelectedWithObservers ( view_list );
00322   if ( pasteboard ) {
00323     m_xml_controller->saveToPasteboard ( view_list );
00324   }
00325 
00326   DisplayController * controller = DisplayController::instance ();
00327   controller->removeTextObservers ( view_list );
00328   
00329   // Remove views from the canvas.
00330 
00331 #ifdef ITERATOR_MEMBER_DEFECT
00332   std:: 
00333 #endif
00334   vector < const ViewBase * > ::const_iterator iter = view_list.begin();
00335   
00336   while ( iter != view_list.end() ) {
00337     const ViewBase * curview = ( * iter++ );
00338     const QtView * view = dynamic_cast < const QtView * > ( curview );
00339     QtView * v = const_cast < QtView * > ( view );
00340     remove ( v );
00341   }
00342 
00343   notifyObservers ();
00344 }
00345 
00346 void
00347 CanvasView::
00348 clear ()
00349 {
00350   FigureEditor::clear ();
00351 
00352   notifyObservers ();
00353 }
00354 
00358 void CanvasView::removeSelected ( )
00359 {
00360   const vector < const ViewBase * > & views = selectedViews ();
00361 #ifdef ITERATOR_MEMBER_DEFECT
00362   std:: 
00363 #endif
00364   vector < const ViewBase * > ::const_iterator first = views.begin();
00365   while ( first != views.end() ) {
00366     const QtView * view = dynamic_cast < const QtView * > ( *first++ );
00367     QtView * v = const_cast < QtView * > ( view );
00368     remove ( v );
00369   }
00370 }
00371 
00375 void CanvasView::pasteViews ( const std::list < ViewBase * > & views )
00376 {
00377   clearSelectedList ();
00378   std::list < ViewBase * > ::const_iterator first = views.begin();
00379   for ( ; first != views.end(); ++first ) {
00380     QtView * view = dynamic_cast < QtView * > ( *first );
00381     paste ( view );
00382     addSelectedItem ( view );
00383   }
00384 
00385   setChanged ( true );
00386 }
00387 
00388 void CanvasView::setInspector ( Inspector * inspector )
00389 {
00390   m_inspector = inspector;
00391   m_inspector->enableNewPlotBox ( );
00392 }
00393 
00394 Inspector * CanvasView::getInspector ()
00395 {
00396   return m_inspector;
00397 }
00398 
00399 void CanvasView::setChanged ( bool flag ) 
00400 {
00401   QWidget * parent = parentWidget ();
00402   if ( parent != 0 ) {
00403     CanvasWindow * window = dynamic_cast < CanvasWindow * > ( parent );
00404     window->setChanged ( flag );
00405   }
00406 }
00407 
00408 void CanvasView::notifyObservers ()
00409 {
00410   setChanged ( );
00411   if ( m_inspector != 0 ) {
00412     vector < PlotterBase * > plotters = getSelectedPlotters ();
00413 
00414     CanvasSelectionEvent * event = new CanvasSelectionEvent ( plotters );
00415     QApplication::postEvent ( m_inspector, event );
00416   }
00417 }
00418 
00419 vector < PlotterBase * >
00420 CanvasView::
00421 getSelectedPlotters () const
00422 {
00423   vector < PlotterBase * > plotters;
00424 
00425   const vector < const ViewBase * > & viewList = selectedViews ();
00426   unsigned int size = viewList.size ();
00427   for ( unsigned int i = 0; i < size; i++ ) {
00428     const ViewBase * view = viewList [ i ];
00429     PlotterBase * plotter = view -> getPlotter ();
00430     plotters.push_back ( plotter );
00431   }
00432 
00433   return plotters;
00434 }
00435 
00436 PlotterBase * CanvasView::selectedPlotter () const
00437 {
00438   const vector < const ViewBase * > & viewList = selectedViews ();
00439 
00440   if ( viewList.size() != 1 )
00441     {
00442       return 0;
00443     }
00444 
00445   PlotterBase * plotter = viewList[0]->getPlotter ();
00446   assert ( plotter );
00447 
00448   return plotter;
00449 }
00450 
00451 void 
00452 CanvasView::
00453 addView ( QtView * view, bool select )
00454 {
00455   add ( view ); // in FigureEditor
00456 
00457   if ( select ) {
00458     ensureVisible ( view );
00459     setSelectedItem ( view );
00460     vector < const ViewBase * > view_list;
00461     fillSelectedWithObservers ( view_list );
00462     m_xml_controller -> saveToSelectionCopy ( view_list );    
00463   }
00464   notifyObservers ();
00465 }
00466 
00467 void
00468 CanvasView::
00469 setPlotMatrix ( unsigned int columns, unsigned int rows )
00470 {
00471   m_num_width = columns;
00472   m_num_height = rows;
00473 }
00474 
00475 void
00476 CanvasView::
00477 setup ()
00478 {
00479   CanvasSettings * cs = new CanvasSettings ( this );
00480   cs -> setOrientation ( s_printer -> orientation() );
00481   cs -> setWidthNumber ( m_num_width );
00482   cs -> setHeightNumber ( m_num_height );
00483   cs -> setPrinterBounds ( m_printer_bounds );
00484   
00485   int retval = cs -> exec ();
00486 
00487   if (  retval == CanvasSettings::AcceptedAndRetile ||
00488         retval == CanvasSettings::Retile )
00489     {
00490       m_add_selected = cs -> getAddSelected ();
00491 
00492         
00493       if( cs -> orientation() != s_printer -> orientation() ) 
00494         {
00495 #if QT_VERSION < 0x040000
00496           QCanvas * can = canvas();
00497 #else
00498           Q3Canvas * can = canvas();
00499 #endif
00500           int numpages = static_cast<int>( can -> height()
00501                                            / (double) m_apage_h );
00502           
00503           s_printer -> setOrientation( cs -> orientation() );
00504 
00505           std::swap( m_upage_w, m_upage_h );
00506           std::swap( m_apage_w, m_apage_h );
00507 
00508           can -> resize( static_cast<int>( 1.2 * m_upage_w ),
00509                          numpages * m_apage_h );
00510 
00511           showPrinterMargins ( false ); // Delete old ones ( if any    )
00512           showPrinterMargins ( true );  // Redraw new ones ( if needed )
00513         }
00514      
00515       if( cs -> printerBounds() == false )
00516         showPrinterMargins ( false ); // Delete old ones ( if any    )
00517       else
00518         {
00519           showPrinterMargins ( false ); // Delete old ones ( if any    )
00520           showPrinterMargins ( true );  // Redraw new ones ( if needed )
00521         }
00522 
00523     }
00524 
00525   if ( retval == CanvasSettings::AcceptedAndRetile ||
00526        retval == CanvasSettings::Retile ) {
00527     unsigned int columns = cs -> getWidthNumber ();
00528     unsigned int rows    = cs -> getHeightNumber ();
00529     setPlotMatrix ( columns, rows );
00530     reTile ();
00531   }
00532   
00533 if ( retval == CanvasSettings::AcceptedAndRetile ) saveSettings ();
00534   
00535   delete cs;
00536 }
00537 
00538 
00539 void
00540 CanvasView::
00541 setFonts( const QFont & font )
00542 {
00543   const vector < const ViewBase * > & allviews = views();
00544   
00545   for( unsigned int i = 0; i < allviews.size(); i++ )
00546     {
00547       const ViewBase * curview = allviews[ i ];
00548       const QtView * view = dynamic_cast < const QtView * > ( curview );
00549       QtView * v = const_cast < QtView * > ( view );
00550       v -> setDefaultFont( font );
00551     }
00552 }
00553 
00554 void
00555 CanvasView::
00556 calcDefaultSize ( QtView * view, double transform_aspect_ratio )
00557 {
00558   double width = ( 0.95 * m_upage_w ) / m_num_width;
00559   double height = ( 0.95 * m_upage_h ) / m_num_height;
00560 
00561   if ( transform_aspect_ratio > 0.0 )
00562     {
00563       width = height * transform_aspect_ratio;
00564     }
00565 
00566   view -> setDrawRect( 0.0, 0.0, width, height );
00567 }
00568 
00569 void
00570 CanvasView::
00571 addPlotDisplay ( PlotterBase * plotter )
00572 {
00573   addPlotDisplay ( plotter, m_add_selected );
00574 }
00575 
00576 void CanvasView::addPlotDisplay ( PlotterBase * plotter, bool select )
00577 {
00578   ViewFactory * factory = QtViewFactory::instance ();
00579   ViewBase * view = factory->createView ( plotter );
00580 
00581   QtView * qtview = dynamic_cast< QtView * > ( view );
00582   qtview -> setPageWidth( m_upage_w );
00583   qtview -> setInspector( m_inspector );
00584   
00585   double transform_aspect_ratio = plotter -> getAspectRatio();
00586   calcDefaultSize ( qtview, transform_aspect_ratio );
00587     
00588   placeGraph ( qtview );
00589   
00590   addView ( qtview, select );
00591 }
00592 
00593 bool
00594 #if QT_VERSION < 0x040000
00595 sortViews ( QCanvasItem * first, QCanvasItem * second )
00596 #else
00597 sortViews ( Q3CanvasItem * first, Q3CanvasItem * second )
00598 #endif
00599 {
00600   bool yes = false;
00601 
00602   QRect frect = first -> boundingRect ();
00603   QRect srect = second -> boundingRect ();
00604 
00605   if ( frect.left () < srect.left () ) {
00606     if ( frect.top() < srect.bottom () ) {
00607       yes = true;
00608     }
00609   }
00610   if ( frect.right () > srect.right () ) {
00611     if ( frect.bottom () <  srect.top () ) {
00612       yes = true;
00613     }
00614   }
00615   else {
00616     yes = frect.top () < srect.top ();
00617   }
00618 
00619   return yes;
00620 }
00621 
00622 void
00623 CanvasView::
00624 reTile ()
00625 {
00626 #if QT_VERSION < 0x040000
00627   QCanvas temp_canvas;
00628 #else
00629   Q3Canvas temp_canvas;
00630 #endif
00631 #ifdef MEMFUN1_DEFECT
00632   for_each ( m_items.begin(), m_items.end(),
00633 #if QT_VERSION < 0x040000
00634              bind2nd ( mem_fun1 ( & QCanvasItem::setCanvas ), &temp_canvas ) );
00635 #else
00636              bind2nd ( mem_fun1 ( & Q3CanvasItem::setCanvas ), 
00637                        &temp_canvas ) );
00638 #endif
00639 #else
00640   for_each ( m_items.begin(), m_items.end(),
00641 #if QT_VERSION < 0x040000
00642              bind2nd ( mem_fun ( & QCanvasItem::setCanvas ), &temp_canvas ) );
00643 #else
00644              bind2nd ( mem_fun ( & Q3CanvasItem::setCanvas ), &temp_canvas ) );
00645 #endif
00646 #endif
00647 
00648 #if QT_VERSION < 0x040000
00649   vector < QCanvasItem * > items ( m_items );
00650 #else
00651   vector < Q3CanvasItem * > items ( m_items );
00652 #endif
00653   m_items.clear();
00654 
00655   sort ( items.begin(), items.end(), sortViews );
00656 
00657   placeItems ( items );
00658 }
00659 
00660 void
00661 CanvasView::
00662 #if QT_VERSION < 0x040000
00663 placeItems ( const std::vector < QCanvasItem * > & items )
00664 {
00665   vector < QCanvasItem * >:: const_iterator first = items.begin();
00666 #else
00667 placeItems ( const std::vector < Q3CanvasItem * > & items )
00668 {
00669   vector < Q3CanvasItem * >:: const_iterator first = items.begin();
00670 #endif
00671 
00672   while ( first != items.end() )
00673     {
00674       QtView * view = dynamic_cast < QtView * > ( *first++ );
00675       calcDefaultSize ( view, view -> getAspectRatio() );
00676       placeGraph ( view );
00677       add ( view );
00678     }
00679 }
00680 
00681 void
00682 CanvasView::
00683 reTilePage ()
00684 {
00685   int y = contentsY ();
00686   int page = y / m_apage_h;
00687   QRect rect ( 0, page * m_apage_h, m_apage_w, m_apage_h );
00688 #if QT_VERSION < 0x040000
00689   QCanvasItemList c_items = m_canvas -> collisions ( rect );
00690 
00691   // copy to STL vector and remove from item list.
00692   vector < QCanvasItem * > v_items;
00693   QCanvasItemList:: const_iterator first = c_items.begin();
00694   while ( first != c_items.end() ) {
00695     QCanvasItem * item = *first++;
00696 #else
00697   Q3CanvasItemList c_items = m_canvas -> collisions ( rect );
00698 
00699   // copy to STL vector and remove from item list.
00700   vector < Q3CanvasItem * > v_items;
00701   Q3CanvasItemList:: const_iterator first = c_items.begin();
00702   while ( first != c_items.end() ) {
00703     Q3CanvasItem * item = *first++;
00704 #endif
00705     QtView * view = dynamic_cast < QtView * > ( item );
00706 
00707     if ( view != 0 ) { // avoid page margin rect
00708       v_items.push_back ( item );
00709       removeFromItemList ( item );
00710     }
00711   }
00712 
00713   placeItems ( v_items );
00714 }
00715 
00716 void CanvasView::moveToPlotter ( const PlotterBase * plotter, QtView * view )
00717 {
00718   QtView * target = getViewFor ( plotter );
00719   QRect rect = target -> boundingRect ();  
00720   double x = target -> x ();
00721   double y = target -> y ();
00722   x += 0.25 * rect.width();
00723   y += 0.25 * rect.height();
00724 
00725   view->moveBy ( x, y );
00726 }
00727 
00728 std::pair<double, double>
00729 CanvasView::
00730 moveToPlotterAt ( const PlotterBase * plotter,
00731                   QtView * view, 
00732                   double xrel, double yrel )
00733 { 
00734    QtView * sel_item = getViewFor ( plotter );
00735    QRect rect = sel_item->boundingRect ();  
00736    double x = sel_item->x();
00737    double y = sel_item->y();
00738    x += xrel * rect.width();
00739    y += yrel * rect.height();
00740    
00741    view->moveBy ( x, y );
00742 
00743 // Find the lower left corner of the view.
00744    QRect viewRect = view->boundingRect();
00745    double xLowerLeft = view->x();
00746    double yLowerLeft = view->y() + viewRect.height();
00747 
00748 // Normalize to selectedItem coordinate system.
00749    xLowerLeft = ( xLowerLeft - sel_item->x() ) / rect.width();
00750    yLowerLeft = ( yLowerLeft - sel_item->y() ) / rect.height();
00751 
00752    return std::make_pair<double, double>(xLowerLeft, yLowerLeft);
00753 }
00754 
00755 void 
00756 CanvasView::
00757 addTextDisplay ( PlotterBase * plotter, 
00758                  const std::string & s,
00759                  const std::string & text )
00760 {
00761   DisplayController * display_controller = DisplayController::instance ();
00762   ViewFactory * factory = QtViewFactory::instance ();
00763 
00764   ViewBase * view 
00765     = display_controller->createTextView ( factory, plotter, s, text );
00766   assert ( view != 0 );
00767 
00768   QtView * qtview = dynamic_cast < QtView * > ( view );
00769   assert ( qtview != 0 );
00770 
00771   moveToPlotter ( plotter, qtview );
00772 
00773   addView ( qtview, false );
00774 }
00775 
00776 std::pair<double, double>
00777 CanvasView::
00778 addTextDisplayAt ( PlotterBase * plotter, 
00779                    const std::string & type,
00780                    const std::string & text, 
00781                    double x, double y )
00782 {
00783   DisplayController * display_controller = DisplayController::instance ();
00784   ViewFactory * factory = QtViewFactory::instance ();
00785 
00786   ViewBase * view 
00787     = display_controller->createTextView ( factory, plotter, type, text );
00788 
00789   QtView * qtview = dynamic_cast < QtView * > ( view );
00790 
00791   std::pair<double, double> lowerLeftCorner 
00792      = moveToPlotterAt ( plotter, qtview, x, y );
00793 
00794   addView ( qtview, false );
00795 
00796   return lowerLeftCorner;
00797 }
00798 
00799 void
00800 CanvasView::
00801 addFuncDisplay ( PlotterBase * plotter, const std::string & s)
00802 {
00803   FunctionController * controller = FunctionController::instance ();
00804   const ViewFactory * factory = QtViewFactory::instance ();
00805 
00806   ViewBase * view
00807     = controller->createFuncView ( factory, plotter, s );
00808 
00809   QtView * qtview = dynamic_cast < QtView * > ( view );
00810   moveToPlotter ( plotter, qtview );  
00811 
00812   addView (qtview, false );
00813 }
00814 
00817 void
00818 CanvasView::
00819 removeDisplay ( PlotterBase * plotter )
00820 {
00821  QtView * view = getViewFor ( plotter );
00822 
00823  if ( view != 0 ) remove ( view );
00824 }
00825 
00826 void
00827 CanvasView::
00828 setVisibleNonViews ( bool yes )
00829 {
00830 #if QT_VERSION < 0x040000
00831   QCanvasItemList items = m_canvas->allItems ();
00832   QCanvasItemList::Iterator first = items.begin();
00833   while ( first != items.end() ) {
00834     QCanvasItem * item = *first++;
00835 #else
00836   Q3CanvasItemList items = m_canvas->allItems ();
00837   Q3CanvasItemList::Iterator first = items.begin();
00838   while ( first != items.end() ) {
00839     Q3CanvasItem * item = *first++;
00840 #endif
00841     QtView * view = dynamic_cast < QtView * > ( item );
00842       if ( view == 0 ) {
00843         item -> setVisible ( yes );
00844       }
00845   }
00846 }
00847 
00848 void
00849 CanvasView::
00850 print ()
00851 {
00852   setVisibleNonViews ( false );
00853   FigureEditor::print ();
00854   setVisibleNonViews ( true );
00855 }
00856 
00857 void
00858 CanvasView::
00859 print ( const std::string & filename )
00860 {
00861   setVisibleNonViews ( false );
00862   FigureEditor::print ( filename );
00863   setVisibleNonViews ( true );
00864 }
00865 
00866 
00867 const vector < const ViewBase * > & 
00868 CanvasView::
00869 selectedViews () const
00870 {
00871   m_sel_views.clear ();
00872   
00873 #if QT_VERSION < 0x040000
00874   vector < QCanvasItem * > :: const_iterator first = m_selected_list.begin();
00875   while ( first != m_selected_list.end() ) {
00876     QCanvasItem * item = *first++;
00877 #else
00878   vector < Q3CanvasItem * > :: const_iterator first = m_selected_list.begin();
00879   while ( first != m_selected_list.end() ) {
00880     Q3CanvasItem * item = *first++;
00881 #endif
00882     QtView * view = dynamic_cast < QtView * > ( item );
00883     if ( view != 0 ) { // may be printer page border
00884       m_sel_views.push_back ( view );
00885     }
00886   }
00887 
00888   return m_sel_views;
00889 }
00890 
00891 const vector < const ViewBase * > & CanvasView::views () const
00892 {
00893   m_views.clear();
00894 
00895 #if QT_VERSION < 0x040000
00896   QCanvasItemList item_list = m_canvas->allItems();
00897   QCanvasItemList::Iterator it = item_list.begin();
00898 #else
00899   Q3CanvasItemList item_list = m_canvas->allItems();
00900   Q3CanvasItemList::Iterator it = item_list.begin();
00901 #endif
00902   for ( ; it != item_list.end(); ++ it ) {
00903     const QtView * view = dynamic_cast < const QtView * > ( *it );
00904     if ( view != 0 ) {
00905       m_views.push_back ( view );
00906     }
00907   }
00908 
00909   return m_views;
00910 }
00911 
00912 void
00913 CanvasView::
00914 fillPlotterList ( std::vector < PlotterBase * > & plotterlist )
00915 {
00916   plotterlist.clear();
00917 
00918   const vector < const ViewBase * > & view_list = views ();
00919 #ifdef ITERATOR_MEMBER_DEFECT
00920   std::
00921 #endif
00922   vector < const ViewBase * >::const_iterator first = view_list.begin ();
00923   for ( ; first != view_list.end(); ++first ) {
00924     const QtView * qtview = dynamic_cast < const QtView * > ( *first );
00925     plotterlist.push_back ( qtview->getPlotter () );
00926   }
00927 }
00928 
00929 
00930 QtView * 
00931 CanvasView::
00932 getViewFor ( const PlotterBase * target ) const
00933 {
00934   QtView * view = 0;
00935   const vector < const ViewBase * > & all_views = views ();
00936   vector < const ViewBase * > :: const_iterator  first = all_views.begin();
00937 
00938   while ( first != all_views.end() ) {
00939     const ViewBase * vb = *first++;
00940     const PlotterBase * plotter = vb->getPlotter();
00941     if ( plotter == target ) {
00942       const QtView * v = dynamic_cast < const QtView * > ( vb );
00943       view = const_cast < QtView * > ( v );
00944       break;
00945     }
00946   }
00947 
00948   return view;
00949 }
00950 
00951 void
00952 CanvasView::
00953 createImageFilters ()
00954 {
00955   const string eps ( "eps" );
00956   bool eps_inserted = false;
00957 
00958   s_image_filters = "files (";
00959 
00960 #if QT_VERSION < 0x040000
00961   QStringList slist = QImage::outputFormatList ();
00962   QStringList::Iterator it = slist.begin();
00963 #else
00964   QList < QByteArray >  slist = QImageIO::outputFormats ();
00965   QList < QByteArray > ::const_iterator it = slist.begin();
00966 #endif
00967 
00968   while ( it != slist.end() ) {
00969     QString upper = *it++;
00970     QString lower = upper.lower();
00971 #if QT_VERSION < 0x030100
00972     string low ( lower );
00973 #else
00974     string low = lower.latin1();
00975 #endif
00976     if ( low == "jpeg" ) low = "jpg";
00977     if ( eps >= low ) {
00978       s_image_filters += " *." + low;
00979     }
00980     else {
00981       if ( eps_inserted == false ) {
00982         s_image_filters += " *." + eps + ");; (";
00983         eps_inserted = true;
00984       }
00985       s_image_filters += " *." + low;
00986     }
00987     s_image_filters += ");; (";
00988   }
00989 
00990   string::size_type pos = s_image_filters.find_last_of ( ";;" );
00991   s_image_filters.erase ( pos - 1 );
00992 }
00993 
00994 #if QT_VERSION < 0x040000
00995 QFileDialog *
00996 #else
00997 Q3FileDialog *
00998 #endif
00999 CanvasView::
01000 createImageDialog ()
01001 {
01002   if ( s_image_filters.empty () ) createImageFilters ();
01003 
01004   QString filters = s_image_filters.c_str();
01005 
01006 #if QT_VERSION < 0x040000
01007   QFileDialog * dialog = new QFileDialog ( this );
01008   dialog->setFilters ( filters );
01009   dialog->setMode ( QFileDialog::AnyFile );
01010 #else
01011   Q3FileDialog * dialog = new Q3FileDialog ( this );
01012   dialog->setFilters ( filters );
01013   dialog->setMode ( Q3FileDialog::AnyFile );
01014 #endif
01015 
01016   return dialog;
01017 }
01018 
01019 /* The menu item calling this method is disabled when no plot is
01020    selected so there's no need to see if any plots are selected
01021    here.
01022 */
01023 void 
01024 CanvasView::
01025 saveSelectedImages ()
01026 {
01027   setVisibleNonViews ( false );
01028 
01029 #if QT_VERSION < 0x040000
01030   const vector < QCanvasItem * > views = getSelectedItems (); // make copy
01031 #else
01032   const vector < Q3CanvasItem * > views = getSelectedItems (); // make copy
01033 #endif
01034   assert ( views.empty () == false );
01035 
01036   for ( unsigned int i = 0; i < views.size (); i++ ) {
01037     setCollidingSelected ( views[i] );
01038   }
01039 
01040   if ( m_image_dialog == 0 ) m_image_dialog = createImageDialog ();
01041 
01042   m_image_dialog->show ();
01043 
01044  if ( m_image_dialog->exec() != QDialog::Accepted ) return;
01045 
01046   QString filename = m_image_dialog->selectedFile ();
01047 
01048   if ( filename.isEmpty () ) return;
01049 
01050 
01051 #if QT_VERSION < 0x030100
01052   string fn ( filename );
01053 #else
01054   string fn = filename.latin1();
01055 #endif
01056 
01057   saveSelectedImages ( fn, true );
01058 
01059   // Restore original selection flags.
01060   m_selected_list.clear();
01061   for ( unsigned int i = 0; i < views.size(); i++ ) {
01062     m_selected_list.push_back ( views[i] );
01063   }
01064   setSelectedFlags ();
01065   setVisibleNonViews ( true );
01066 }
01067 
01068 void 
01069 CanvasView::
01070 saveSelectedImages (const std::string & filename)
01071 {
01072   setVisibleNonViews ( false );
01073 
01074 #if QT_VERSION < 0x040000
01075   const vector < QCanvasItem * > views = getSelectedItems (); // make copy
01076 #else
01077   const vector < Q3CanvasItem * > views = getSelectedItems (); // make copy
01078 #endif
01079   if (views.empty()) {
01080      return;
01081   }
01082 
01083   for ( unsigned int i = 0; i < views.size (); i++ ) {
01084     setCollidingSelected ( views[i] );
01085   }
01086 
01087   saveSelectedImages ( filename, false );
01088 
01089   // Restore original selection flags.
01090   m_selected_list.clear();
01091   for ( unsigned int i = 0; i < views.size(); i++ ) {
01092     m_selected_list.push_back ( views[i] );
01093   }
01094   setSelectedFlags ();
01095   setVisibleNonViews ( true );
01096 }
01097 
01101 void CanvasView::setIntervalEnabled ( bool yes )
01102 {
01103   DisplayController * controller = DisplayController::instance ();
01104   const vector < const ViewBase * > & view_list = views ();
01105   vector < const ViewBase * > ::const_iterator first = view_list.begin ();
01106 
01107   while ( first != view_list.end() ) {
01108     const ViewBase * view = *first++;
01109     PlotterBase * plotter = view->getPlotter();
01110     controller -> setAllIntervalEnabled ( plotter, yes );
01111   }
01112 }
01113 
01114 void
01115 CanvasView::
01116 restoreFromSelectCopy ()
01117 {
01118 
01119   ViewFactory * factory = QtViewFactory::instance ();
01120   const vector < const ViewBase * > & targets = views ();
01121 
01122   const list < ViewBase * > & views 
01123     = m_xml_controller->getFromSelectionCopy ( factory, targets );
01124 
01125   if ( views.empty() == false ) {
01126     removeSelected ();
01127     pasteViews ( views );
01128 
01129     notifyObservers ();
01130   }
01131 }
01132 
01133 void CanvasView::controlMousePressEvent ( )
01134 {
01135 #if QT_VERSION < 0x040000
01136   QCanvasItem * selItem = m_selected_list.front ();
01137 #else
01138   Q3CanvasItem * selItem = m_selected_list.front ();
01139 #endif
01140   QtView * qtview = dynamic_cast < QtView * > ( selItem );
01141   assert ( qtview );
01142       
01143   PlotterBase * plotter = qtview->getPlotter ();
01144   assert ( plotter );
01145       
01146   plotter -> toggleActivePlot ();
01147 }
01148 
01149 void
01150 CanvasView::
01151 fillSelectedWithObservers ( std::vector < const ViewBase * > & view_list )
01152 {
01153   const vector < const ViewBase * > & sel_views = selectedViews ();
01154 
01155   view_list.resize ( sel_views.size() );
01156   copy ( sel_views.begin(), sel_views.end(), view_list.begin() );
01157 
01158   DisplayController * controller = DisplayController::instance ();
01159   const vector < const ViewBase * > & all_views = views ();
01160 
01161   controller->addTextViewToList ( view_list, all_views );
01162 }
01163 
01164 void CanvasView::contentsMousePressEvent ( QMouseEvent* e )
01165 {
01166   FigureEditor::contentsMousePressEvent ( e );
01167 
01168   const vector < const ViewBase * > & sel_views = selectedViews ();
01169 
01170   if ( ! sel_views.empty () ) {
01171     vector < const ViewBase * > view_list;
01172     fillSelectedWithObservers ( view_list );
01173     m_xml_controller->saveToSelectionCopy ( view_list );
01174   }
01175 
01176   notifyObservers();
01177 }
01178 
01179 void CanvasView::contentsMouseMoveEvent ( QMouseEvent * e )
01180 {
01181 
01182   if ( isSingleItemSelected () == false ) return;
01183 
01184 #if QT_VERSION < 0x040000
01185   QCanvasItem * item = selectedItem ();
01186 #else
01187   Q3CanvasItem * item = selectedItem ();
01188 #endif
01189 
01190   if ( item->isActive () ) return;
01191  
01192   QtView * qtview = dynamic_cast < QtView * > ( selectedItem() );      
01193 
01194   if (qtview) {
01195      double aspect = qtview->getAspectRatio();
01196      FigureEditor::contentsMouseMoveEvent ( e, aspect );
01197   }
01198 
01199 #if QT_VERSION < 0x040000
01200   QCanvasRectangle * rect 
01201      = dynamic_cast <QCanvasRectangle *> ( item );
01202 #else
01203   Q3CanvasRectangle * rect 
01204     = dynamic_cast <Q3CanvasRectangle *> ( item );
01205 #endif
01206 
01207   if ( getZoomMode() ){
01208     if ( (e->button() == Qt::LeftButton) ||( e->state() == Qt::LeftButton) ) {
01209 
01210       QPoint p = inverseWorldMatrix().map ( e -> pos() );
01211       if ( ( p.x() >= rect->x() ) &&
01212            ( p.x() <= rect->x() + rect->width() ) &&
01213            ( p.y() >= rect->y() ) &&
01214            ( p.y() <= rect->y() + rect->height() ) ) {
01215         
01216   
01217         if (drag_rect != 0 )
01218           delete drag_rect;
01219  
01220         QPoint top_left ( std::min ( p.x(), zoom_start.x() ),
01221                           std::max ( p.y(), zoom_start.y() ) );
01222         QPoint bo_right ( std::max ( p.x(), zoom_start.x() ),
01223                           std::min ( p.y(), zoom_start.y() ) );
01224         drag_rect = new QCanvasRectangle ( QRect( top_left,bo_right ), 
01225                                            canvas ());
01226         
01227         drag_rect -> setVisible ( true );
01228         canvas () -> update ();
01229       }
01230     }
01231   }
01232 }
01233 
01234 
01235 void
01236 CanvasView::
01237 savePlotAsImage ( const PlotterBase * plotter,
01238                   const std::string & filename )
01239 {
01240   if ( plotter == 0 ) return;
01241 
01242   QtView * view = getViewFor ( plotter );
01243   assert ( view != 0 );
01244 
01245   QRect rect = view -> rect ();
01246   saveAreaAsPixmap ( rect, filename );
01247 }
01248 
01249 void
01250 CanvasView::
01251 toLower ( string & upper )
01252 {
01253   string::size_type size = upper.size();
01254   for ( string::size_type i = 0; i < size; i++ ) {
01255     upper[i] = std::tolower ( upper[i] );
01256   }
01257 }
01258 
01259 bool
01260 CanvasView::
01261 isValidImageFormat ( const std::string & suffix )
01262 {
01263   if ( s_image_filters.empty () ) createImageFilters ();
01264 
01265   string star ( "*." + suffix );
01266   toLower ( star );
01267 
01268   // following could be 64 bit unsigned int
01269   string::size_type i = s_image_filters.find ( star );
01270 
01271   return i != string::npos;
01272 }
01273 
01274 void
01275 CanvasView::
01276 saveSelectedImages ( const std::string & fn, bool check_existing )
01277 {
01278   string filename = fn;
01279   string::size_type i = filename.find_last_of ( '.' );
01280 
01281   if ( i == string::npos ) { // no suffix given
01282     if ( m_image_dialog != 0 ) {
01283       QString s = m_image_dialog->selectedFilter ();
01284       string filt = s.latin1();
01285       string::size_type ipos = filt.find ( "*." ) + 1;
01286       string::size_type epos = filt.find ( ")" );
01287       string suffix ( filt.substr ( ipos, epos - ipos ) );
01288       filename += suffix;
01289     }
01290     else {
01291       filename += ".jpg";
01292     }
01293     i = filename.find_last_of ( '.' );
01294   }
01295 
01296   string suffix ( filename.substr ( i + 1 ) );
01297   if ( isValidImageFormat ( suffix ) ) {
01298     string base ( filename.substr ( 0, i - 1 ) ); //basename
01299     if ( base.empty () ) filename = "image." + suffix;
01300 
01301     if ( check_existing ) {
01302       QString fn ( filename.c_str() );
01303       bool yes = QFile::exists ( fn );
01304 
01305       if ( yes ) {
01306         yes = existingFileWarning ( filename );
01307         if ( yes == false ) return;
01308       }
01309     }
01310 
01311     setVisibleNonViews ( false );
01312     if ( suffix == "eps" ||
01313          suffix == "EPS" ) {
01314       saveSelectedAsEps ( filename );
01315     } else {
01316       setUnselectedVisible ( false );
01317       saveSelectedAsPixmap ( filename );
01318       setUnselectedVisible ( true );
01319     }
01320     setVisibleNonViews ( true );
01321   }
01322   else {
01323     invalidImageFormatError ( filename );
01324   }
01325 }
01326 
01327 void
01328 CanvasView::
01329 saveSelectedAsEps ( const std::string & filename )
01330 {
01331   QRect rect = getSelectedBounds ();
01332 
01333   EpsView * eps_view 
01334     = new EpsView ( filename, 
01335                     rect.x(), rect.y(), rect.width(), rect.height() );
01336 
01337   const vector < const ViewBase * > & viewList = selectedViews ();
01338 #ifdef ITERATOR_MEMBER_DEFECT
01339   std:: 
01340 #endif
01341   vector < const ViewBase * > :: const_iterator first = viewList.begin();
01342   while ( first != viewList.end() ) {
01343     const ViewBase * vb = *first++;
01344     const QtView * view = dynamic_cast < const QtView * > ( vb );
01345     PlotterBase * plotter = view->getPlotter ();
01346     QRect rect = view->rect();
01347 
01348     eps_view -> setPlotter ( plotter );
01349     eps_view -> setDrawRect ( rect.x(), rect.y(), 
01350                               rect.width(), rect.height() );
01351     eps_view -> drawSelf ();
01352   }
01353 
01354   eps_view -> endPlot ();
01355 
01356   delete eps_view;
01357 }
01358 
01361 void
01362 CanvasView::
01363 saveAs ( const std::string & filename ) const
01364 {
01365   const vector < const ViewBase * > & view_list = views ();
01366 
01367   XmlController::Status status 
01368     =  m_xml_controller->saveToFile ( view_list, filename );
01369   if ( status != XmlController::Success ) {
01370     return;
01371   }
01372 }
01373 
01377 void
01378 CanvasView::
01379 exportTextTuple ( const std::string & data_suffix )
01380 {
01381  DataSourceController * controller = DataSourceController::instance ();
01382 
01383   const vector < string > & tuples = controller->getNTupleNames();
01384 
01385   if ( tuples.empty () ) {
01386     QString message ( "There are no NTuples to be exported" );
01387     QMessageBox::information ( this,
01388                                s_app_name.c_str(),
01389                                message );
01390     return;
01391   }
01392 
01393   QString filename = 
01394 #if QT_VERSION < 0x040000
01395     QFileDialog::getSaveFileName ( QString::null, // starting directory
01396                                    QString::null, // filter
01397                                    this,
01398                                    "save file dialog",
01399                                    "Save data source as ..." ); // caption
01400 #else
01401     Q3FileDialog::getSaveFileName ( QString::null, // starting directory
01402                                     QString::null, // filter
01403                                     this,
01404                                     "save file dialog",
01405                                     "Save data source as ..." ); // caption
01406 #endif
01407 
01408   if ( filename == QString::null ) return;
01409 
01410   QString suffix ( data_suffix.c_str() );
01411 #if QT_VERSION < 0x030300
01412   QString suffix2 ( suffix );
01413   suffix2.upper ();
01414   if ( filename.endsWith ( suffix )  == false &&
01415        filename.endsWith ( suffix2 ) == false ) {
01416     filename += data_suffix;
01417   }
01418 #else
01419   if ( filename.endsWith ( suffix, false ) == false ) {
01420     filename += data_suffix.c_str();
01421   }
01422 #endif
01423 
01424   const string tuple_name = m_inspector -> getSelectedDataSourceName ();
01425 
01426 #if defined(QT_NO_STL) || QT_VERSION < 0x030100
01427   string tuple_file( filename );
01428 #else
01429   string tuple_file ( filename.latin1() );
01430 #endif
01431 
01432   NTupleController::instance () 
01433     ->writeNTupleToFile ( tuple_name, tuple_file );
01434   controller -> changeName ( tuple_name, tuple_file );
01435 
01436   notifyObservers ();
01437 }
01438 
01439 void CanvasView::contentsMouseReleaseEvent ( QMouseEvent* e )
01440 {
01441   if ( m_whereClicked == invalid ) {
01442      m_mouseData.clear();
01443      ::mouseEvent.wakeAll();
01444      return;
01445   }
01446   if ( !isSingleItemSelected() ) {
01447      m_mouseData.clear();
01448      ::mouseEvent.wakeAll();
01449      return;
01450   }
01451 
01452 #if QT_VERSION < 0x040000
01453   QCanvasItem * selItem = selectedItem();
01454 #else
01455   Q3CanvasItem * selItem = selectedItem();
01456 #endif
01457   QtView * qtview = dynamic_cast < QtView * > ( selItem );
01458   if ( !qtview ) {
01459      m_mouseData.clear();
01460      ::mouseEvent.wakeAll();
01461      return;
01462   }
01463   PickTable * table = 0;
01464   map < const QtView *, PickTable * > ::iterator first 
01465     = m_table_map.find ( qtview );
01466   if ( first != m_table_map.end () ) {
01467     table = m_table_map [ qtview ];
01468   }
01469 
01470   // Compute the (x, y, z) data for this event.
01471   QPoint p = inverseWorldMatrix().map(e->pos());
01472     
01473 #if QT_VERSION < 0x040000
01474   QCanvasRectangle * rect 
01475      = dynamic_cast <QCanvasRectangle *> ( selItem );
01476 #else
01477   Q3CanvasRectangle * rect 
01478     = dynamic_cast <Q3CanvasRectangle *> ( selItem );
01479 #endif
01480 
01481 
01482   if (drag_rect != 0){
01483     delete drag_rect;
01484     drag_rect = 0;
01485     canvas() -> update ();
01486   }
01487 
01488   if ( e->button() == Qt::LeftButton ) {
01489     if ( ( p.x() >= rect->x() ) &&
01490          ( p.x() <= rect->x() + rect->width() ) &&
01491          ( p.y() >= rect->y() ) &&
01492          ( p.y() <= rect->y() + rect->height() ) ) {
01493       
01494      vector < double > picked , start_picked;
01495      
01496      qtview -> fillPickedPoint ( p.x(), p.y(), picked );
01497      qtview -> fillPickedPoint(zoom_start.x(),zoom_start.y(),start_picked);
01498      
01499      if ( picked.empty() == false ) {
01500        
01501        // Fill the current 3-vector of mouse event data.
01502        m_mouseData.clear();
01503        m_mouseData.reserve(3);
01504 
01505        m_mouseData.push_back ( picked[1] );
01506        m_mouseData.push_back ( picked[2] );
01507        if ( picked.size() == 4 ) {
01508          m_mouseData.push_back ( picked[3] );
01509        }        
01510        else {
01511          m_mouseData.push_back ( 0. );
01512        }
01513        
01514        // Add the point to the list.
01515        if ( table && table->isVisible() ) {
01516          table -> addItem ( picked );
01517        }
01518        // Change range on the selected plotter.
01519      
01520        if ( getZoomMode () ) {
01521          if ( ! ( selectedPlotter() ->getCurrentRangeSaved () ) )
01522            setCurrentRange();
01523          
01524          selectedPlotter() -> 
01525            setRange ( "x", 
01526                       std::min ( picked[1],start_picked[1] ),
01527                       std::max ( picked[1],start_picked[1] ) );
01528          
01529          if ( ( selectedPlotter() -> hasAxis(Axes::Z) ) && 
01530               ( (selectedPlotter() -> hasZoomY ( ) ) ) )
01531            {
01532              selectedPlotter() -> 
01533                setRange ( "y",
01534                           std::min ( picked[2],start_picked[2] ),
01535                           std::max ( picked[2],start_picked[2] ) );
01536            }
01537          selectedPlotter()->setCurrentRangeSaved ( false );
01538 
01539        }
01540      }
01541     }
01542   }
01543 
01544 
01545 
01546   //  QApplication::restoreOverrideCursor ();
01547 
01548   CanvasWindow * cw = dynamic_cast < CanvasWindow * > ( parentWidget() );
01549   QStatusBar * sb = cw->statusBar();
01550   sb->clear();
01551 
01552   qtview->setShowCrossHairs ( false );
01553   qtview->update(0);
01554 
01555   ::mouseEvent.wakeAll();
01556 }
01557 
01558 void 
01559 CanvasView::
01560 setCurrentRange()
01561 {
01562   if ( ! m_current_range.empty () ){
01563     m_current_range.clear ();
01564   }
01565     m_current_range.push_back(selectedPlotter()->getRange(Axes::X,true).low());
01566     m_current_range.push_back(selectedPlotter()->getRange(Axes::X,true).high());
01567     m_current_range.push_back(selectedPlotter()->getRange(Axes::Y,true).low());
01568     m_current_range.push_back(selectedPlotter()->getRange(Axes::Y,true).high());
01569     
01570     int i = selectedPlotter () -> currentView();
01571     selectedPlotter () -> saveViewAtIndex( m_current_range , i + 1 );
01572     selectedPlotter () -> setCurrentRangeSaved( true );
01573 }
01574 
01575 
01576 std::vector<double>&
01577 CanvasView::
01578 getCurrentRange() 
01579 {
01580   return m_current_range;
01581 }
01582 
01583 void
01584 CanvasView::
01585 showInspector ()
01586 {
01587   m_inspector -> show ();
01588 }
01589 
01590 void
01591 CanvasView::
01592 viewShowPickTable()
01593 {
01594   if ( !isSingleItemSelected() ) return;
01595   
01596 #if QT_VERSION < 0x040000
01597   QCanvasItem * selItem = selectedItem();
01598 #else
01599   Q3CanvasItem * selItem = selectedItem();
01600 #endif
01601   QtView * qtview = dynamic_cast < QtView * > ( selItem );
01602   if ( qtview == 0 ) return;
01603 
01604   map < const QtView *, PickTable * > ::iterator first 
01605     = m_table_map.find ( qtview );
01606 
01607   if ( first == m_table_map.end() ) {  
01608     PlotterBase * plotter = qtview->getPlotter ();
01609 
01610     PickTable * table = new PickTable ( plotter );
01611     m_table_map [ qtview ] = table;
01612     table->show();
01613   }
01614   else {
01615     // Show existing pick table.
01616     m_table_map[qtview]->show();
01617   }
01618 }
01619 
01620 const std::vector<double> &
01621 CanvasView::
01622 mouseEventData()
01623 {
01624 #if QT_VERSION < 0x040000
01625   ::mouseEvent.wait();
01626 #else
01627   // need to learn about equivalent
01628   //  ::mouseEvent.wait( mutex, time );
01629 #endif
01630    return m_mouseData;
01631 }
01632 
01633 
01634 void
01635 CanvasView::helpAbout()
01636 {
01637   const std::string & version = WindowController::version ();
01638   std::string about = "<h2>HippoDraw version: ";
01639   about += version;
01640   about += "<h3> Built on ";
01641   about += "<h4> Qt ";
01642   about += QT_VERSION_STR;
01643 #ifdef HAVE_CFITSIO
01644   about += "<h4> cfitsio ";
01645   const string & fits_version = FitsController::instance () -> version ();
01646   about += fits_version.c_str();
01647 #endif
01648 #ifdef HAVE_MINUIT
01649   about += "<h4> C++ Minuit";
01650 #endif
01651 #ifdef HAVE_ROOT
01652   about += "<h4> ROOT ";
01653   const string & root_version = RootController::instance() -> version ();
01654   about += root_version.c_str();
01655 #endif
01656 
01657   about += "<h3>Contributers...";
01658   about += "<ul>";
01659   about += "<li> Kaustuv";
01660   about += "<li> Paul F. Kunz";
01661   about += "<li> Sanket B. Malde";
01662   about += "<li> Joy Rajiv";
01663   about += "</ul>";
01664 
01665   about += "<h3>Based on HippoDraw C++ library";
01666   about += "<h3>Contributors...";
01667   about += "<ul>";
01668   about += "<li> Stephane Bonneaud";
01669   about += "<li> James Chiang";
01670   about += "<li> Kaustuv";
01671   about += "<li> Paul F. Kunz";
01672   about += "<li> Sanket B. Malde";
01673   about += "<li> Matthew D. Langston";
01674   about += "<li> Joy Rajiv";
01675   about += "<li> Matan Shacham";
01676   about += "<li> Johann Cohen-Tanugi";
01677   about += "<li> Oded Wurman";
01678   about += "</ul>";
01679 
01680   static QMessageBox* mbox
01681     = new QMessageBox ( "HippoDraw",
01682                         about.c_str(),
01683                         QMessageBox::Information, 1, 0, 0, this, 0, false );
01684   mbox->setButtonText ( 1, "OK" );
01685 
01686   mbox->show();
01687 }
01688 
01689 const std::string &
01690 CanvasView::
01691 applicationName () const
01692 {
01693   return s_app_name;
01694 }

Generated for HippoDraw-1.14.8.5 by doxygen 1.4.3