00001
00014
00015 #ifdef HAVE_CONFIG_H
00016 #include "config.h"
00017 #endif
00018
00019 #if QT_VERSION < 0x040000
00020 #else
00021
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
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 );
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,
00204 app_name.c_str(),
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,
00244 "Image format error",
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,
00259 "Existing file warning",
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
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 );
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 );
00512 showPrinterMargins ( true );
00513 }
00514
00515 if( cs -> printerBounds() == false )
00516 showPrinterMargins ( false );
00517 else
00518 {
00519 showPrinterMargins ( false );
00520 showPrinterMargins ( true );
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
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
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 ) {
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
00744 QRect viewRect = view->boundingRect();
00745 double xLowerLeft = view->x();
00746 double yLowerLeft = view->y() + viewRect.height();
00747
00748
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 ) {
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
01020
01021
01022
01023 void
01024 CanvasView::
01025 saveSelectedImages ()
01026 {
01027 setVisibleNonViews ( false );
01028
01029 #if QT_VERSION < 0x040000
01030 const vector < QCanvasItem * > views = getSelectedItems ();
01031 #else
01032 const vector < Q3CanvasItem * > views = getSelectedItems ();
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
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 ();
01076 #else
01077 const vector < Q3CanvasItem * > views = getSelectedItems ();
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
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
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 ) {
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 ) );
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,
01396 QString::null,
01397 this,
01398 "save file dialog",
01399 "Save data source as ..." );
01400 #else
01401 Q3FileDialog::getSaveFileName ( QString::null,
01402 QString::null,
01403 this,
01404 "save file dialog",
01405 "Save data source as ..." );
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
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
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
01515 if ( table && table->isVisible() ) {
01516 table -> addItem ( picked );
01517 }
01518
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
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
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
01628
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 }