data_view_mediator.cpp

Go to the documentation of this file.
00001 //--------------------------------------------------
00012 //--------------------------------------------------
00013 
00014 #include "data_view_mediator.h"
00015 
00016 #include "controller.h"
00017 #include "../viewer/spatial_pixel_view.h"
00018 #include "../viewer/xy_slice_view.h"
00019 #include "../viewer/yz_slice_view.h"
00020 #include "../viewer/xz_slice_view.h"
00021 #include "../viewer/image_pixel_view.h"
00022 #include "../viewer/meta_volume_pixel_view.h"
00023 
00024 namespace imedgine 
00025 {
00026 
00027   DataViewMediator::DataViewMediator()
00028   {
00029     view_factory_.registerViewType<XYSliceView>(XY_SLICE_VIEW);
00030     view_factory_.registerViewType<YZSliceView>(YZ_SLICE_VIEW);
00031     view_factory_.registerViewType<XZSliceView>(XZ_SLICE_VIEW);
00032     view_factory_.registerViewType<SpatialPixelView>(VOXEL_VIEW);
00033     view_factory_.registerViewType<ImagePixelView>(IMAGE_PIXEL_VIEW);
00034     view_factory_.registerViewType<MetaVolumePixelView>(META_VOLUME_PIXEL_VIEW);
00035   }
00036   
00037   //--------------------------------------------------
00038   
00039   DataViewMediator::~DataViewMediator()
00040   {
00041 #ifdef DEBUG
00042     std::cout << "Deleting DataViewMediator" << std::endl;
00043 #endif
00044   }
00045 
00046   //--------------------------------------------------
00047 
00048   void DataViewMediator::registerViewOfDataset(
00049       dataset_pointer_type dataset, view_pointer_type view) 
00050       throw(NullPointerException)
00051   {
00052     if ((dataset.get() == 0) || (view.get() == 0))
00053     {
00054       throw (NullPointerException("DataViewMediator::registerViewOfDataset"));
00055     }
00056   
00057     view->registerDataViewMediator(this);
00058     view->setDataset(dataset);
00059     dataset_to_view_mmap_.insert(std::make_pair(dataset->getDatasetKey(), view));
00060   }
00061   
00062   //---------------------------------------------------
00063   
00064   view_pointer_type DataViewMediator::getViewOfDataset(
00065       dataset_pointer_type dataset, view_type type)
00066       throw(NullPointerException)   
00067   {
00068     if (dataset.get() == 0)
00069     {
00070       throw (NullPointerException("DataViewMediator::getViewOfDataset"));
00071     }
00072     
00073     // get the dependent views of the given dataset
00074     std::pair<dataset_to_view_mmap_iterator_type,
00075     dataset_to_view_mmap_iterator_type> dependent_views_range =
00076         dataset_to_view_mmap_.equal_range(dataset->getDatasetKey());
00077 
00078     for ( ; dependent_views_range.first != 
00079             dependent_views_range.second; 
00080             ++dependent_views_range.first)
00081     {
00082       if (dependent_views_range.first->second.get() == 0)    
00083       {
00084         throw (NullPointerException("DataViewMediator::getViewOfDataset"));    
00085       }
00086        
00087       if (dependent_views_range.first->second->getType() == type)
00088       {
00089         view_pointer_type view(dependent_views_range.first->second->clone());
00090         if (view.get() == 0)
00091         {
00092           throw (NullPointerException("DataViewMediator::getViewOfDataset"));
00093         }            
00094         registerViewOfDataset(dataset, view);
00095         return(view);
00096       }      
00097     }
00098      
00099     view_pointer_type view(view_factory_.getView(type));
00100     
00101     if (view.get() == 0)
00102     {
00103       throw (NullPointerException("DataViewMediator::getViewOfDataset"));
00104     }        
00105     
00106     registerViewOfDataset(dataset, view);
00107     
00108     return(view);     
00109   }
00110   
00111   //---------------------------------------------------
00112    
00113   void DataViewMediator::getDependentViewIDsOfDataset(
00114       dataset_key_type dataset_key, view_id_container_type& target_container) const
00115       throw(NullPointerException)
00116   {
00117         // get the dependent views of the given dataset
00118     std::pair<dataset_to_view_mmap_const_iterator_type,
00119     dataset_to_view_mmap_const_iterator_type> dependent_views_range =
00120         dataset_to_view_mmap_.equal_range(dataset_key);
00121     
00122     for ( ; dependent_views_range.first != dependent_views_range.second; 
00123             ++dependent_views_range.first)
00124     {
00125       if (dependent_views_range.first->second.get() == 0)
00126       {
00127         throw (NullPointerException("DataViewMediator::getDependentViewIDsOfDataset"));
00128       } 
00129       target_container.push_back(dependent_views_range.first->second->getViewID());
00130     }
00131   }
00132   
00133  //--------------------------------------------------
00134    
00135   bool DataViewMediator::deleteView(unsigned int view_id)
00136       throw(NullPointerException)   
00137   {    
00138     for (dataset_to_view_mmap_iterator_type view_iter = 
00139          dataset_to_view_mmap_.begin(); 
00140          view_iter != dataset_to_view_mmap_.end(); ++view_iter)
00141     {
00142       if (view_iter->second.get() == 0)
00143       {
00144         throw (NullPointerException("DataViewMediator::deleteView"));
00145       }        
00146       if (view_iter->second->getViewID() == view_id)
00147       {    
00148         view_iter->second->deregisterDataViewMediator(); 
00149         dataset_to_view_mmap_.erase(view_iter);
00150         return(true);
00151       } 
00152     }
00153     return(false);
00154       
00155   }     
00156   
00157   //--------------------------------------------------
00158     
00159   bool DataViewMediator::removeDataset(
00160       dataset_key_type dataset_key)  
00161   {
00162     dataset_to_dataset_mmap_iterator_type locked_datasets_iter;
00163      
00164     while ((locked_datasets_iter = dataset_to_dataset_mmap_.find(dataset_key)) != 
00165             dataset_to_dataset_mmap_.end())
00166     {
00167       dataset_key_type locked_dataset_key = locked_datasets_iter->second;
00168       
00169       dataset_to_dataset_mmap_.erase(locked_datasets_iter);
00170       
00171       std::pair<dataset_to_dataset_mmap_iterator_type, 
00172       dataset_to_dataset_mmap_iterator_type> locked_datasets_range =
00173           dataset_to_dataset_mmap_.equal_range(locked_dataset_key);
00174       
00175       for ( ; locked_datasets_range.first != locked_datasets_range.second; 
00176               ++locked_datasets_range.first)
00177       { 
00178         if (locked_datasets_range.first->second == dataset_key)
00179         {
00180           dataset_to_dataset_mmap_.erase(locked_datasets_iter);
00181           break;
00182         }
00183       }
00184     }
00185     
00186     for (dataset_to_view_mmap_iterator_type view_iter = 
00187          dataset_to_view_mmap_.begin(); 
00188          view_iter != dataset_to_view_mmap_.end(); ++view_iter)
00189     {
00190       view_iter->second->onDatasetDeletion(dataset_key);
00191     }
00192     
00193     return(dataset_to_view_mmap_.erase(dataset_key) > 0);
00194   } 
00195   
00196   //--------------------------------------------------
00197   
00198   void DataViewMediator::lockDatasets(dataset_key_type dataset_left, 
00199                     dataset_key_type dataset_right) 
00200   {
00201     std::pair<dataset_to_dataset_mmap_iterator_type,
00202     dataset_to_dataset_mmap_iterator_type> locked_datasets_range = 
00203         dataset_to_dataset_mmap_.equal_range(dataset_left);
00204         
00205     for ( ; locked_datasets_range.first != locked_datasets_range.second; 
00206             ++locked_datasets_range.first)
00207     {
00208       if (locked_datasets_range.first->second == dataset_right)
00209       {
00210         // datasets already locked -> nothing to do
00211         return;
00212       }
00213     }
00214     
00215     // map the locked dataset keys to each other with an initial lock reference count of 1
00216     dataset_to_dataset_mmap_.insert(
00217         std::make_pair(dataset_left, dataset_right));
00218     dataset_to_dataset_mmap_.insert(
00219         std::make_pair(dataset_right, dataset_left));
00220   }
00221   
00222   //--------------------------------------------------
00223   
00224   void DataViewMediator::unlockDatasets(dataset_key_type dataset_left, 
00225                                       dataset_key_type dataset_right) 
00226   {
00227     std::pair<dataset_to_dataset_mmap_iterator_type,
00228     dataset_to_dataset_mmap_iterator_type> locked_datasets_range = 
00229         dataset_to_dataset_mmap_.equal_range(dataset_left);
00230         
00231     for ( ; locked_datasets_range.first != locked_datasets_range.second; 
00232             ++locked_datasets_range.first)
00233     {
00234       if (locked_datasets_range.first->second == dataset_right)
00235       {
00236         dataset_to_dataset_mmap_.erase(locked_datasets_range.first);
00237         break;
00238       }
00239     }
00240     
00241     locked_datasets_range = dataset_to_dataset_mmap_.equal_range(dataset_right);
00242         
00243     for ( ; locked_datasets_range.first != locked_datasets_range.second; 
00244             ++locked_datasets_range.first)
00245     {
00246       if (locked_datasets_range.first->second == dataset_left)
00247       {
00248         dataset_to_dataset_mmap_.erase(locked_datasets_range.first);
00249         break;
00250       }
00251     }
00252   }
00253   
00254   //--------------------------------------------------
00255   
00256   bool DataViewMediator::areDatasetsLocked(dataset_key_type dataset_left, 
00257                          dataset_key_type dataset_right)
00258   {
00259     std::pair<dataset_to_dataset_mmap_iterator_type,
00260     dataset_to_dataset_mmap_iterator_type> locked_datasets_range = 
00261         dataset_to_dataset_mmap_.equal_range(dataset_left);
00262         
00263     for ( ; locked_datasets_range.first != locked_datasets_range.second; 
00264             ++locked_datasets_range.first)
00265     {
00266       if (locked_datasets_range.first->second == dataset_right)
00267       {
00268         return(true);
00269       }
00270     }
00271      
00272     return(false);
00273   }
00274   
00275   //--------------------------------------------------
00276   
00277   void DataViewMediator::updateDependentViews(dataset_key_type dataset)
00278       throw(NullPointerException)   
00279   {    
00280     // get the dependent views of the given dataset
00281     std::pair<dataset_to_view_mmap_iterator_type,
00282     dataset_to_view_mmap_iterator_type> dependent_views_range =
00283         dataset_to_view_mmap_.equal_range(dataset);
00284 
00285     for ( ; dependent_views_range.first != 
00286             dependent_views_range.second; 
00287             ++dependent_views_range.first)
00288     {
00289       if (dependent_views_range.first->second.get() == 0)
00290       {
00291         throw (NullPointerException("DataViewMediator::updateDependentViews"));
00292       } 
00293       dependent_views_range.first->second->updateView(); 
00294     }
00295   }
00296   
00297   //--------------------------------------------------
00298   
00299   void DataViewMediator::updateDataChanged(dataset_key_type dataset, 
00300                                            dataset_attribute_type changed_attribute)
00301       throw(NullPointerException, InvalidCastException)   
00302   {    
00303     // get the dependent views of the given dataset
00304     std::pair<dataset_to_view_mmap_iterator_type,
00305     dataset_to_view_mmap_iterator_type> dependent_views_range =
00306         dataset_to_view_mmap_.equal_range(dataset);
00307 
00308     for ( ; dependent_views_range.first != 
00309             dependent_views_range.second; 
00310             ++dependent_views_range.first)
00311     {
00312       if (dependent_views_range.first->second.get() == 0)
00313       {
00314         throw (NullPointerException("DataViewMediator::updateDataChanged"));
00315       }
00316       dependent_views_range.first->second->onDataChangedEvent(changed_attribute);
00317     }
00318     
00319         // get the datasets locked with the given dataset
00320     std::pair<dataset_to_dataset_mmap_iterator_type, 
00321     dataset_to_dataset_mmap_iterator_type> locked_datasets_range =
00322         dataset_to_dataset_mmap_.equal_range(dataset);
00323     
00324     for ( ; locked_datasets_range.first != locked_datasets_range.second; 
00325             ++locked_datasets_range.first)
00326     { 
00327       switch (changed_attribute)
00328       {
00329         case DATASET_ATTRIBUTE_INTENSITY :
00330         {
00331           // set the intensity of the locked datasets to the 
00332           // intensity of the given dataset
00333           try
00334           {
00335             pixel_dataset_pointer_type changed_dataset( 
00336               Controller::getInstance().getDataset(dataset), 
00337                 boost::detail::dynamic_cast_tag());
00338             pixel_dataset_pointer_type locked_dataset( 
00339               Controller::getInstance().getDataset(locked_datasets_range.first->second), 
00340                 boost::detail::dynamic_cast_tag());
00341             
00342             if ((changed_dataset.get() == 0) || (locked_dataset.get() == 0))
00343             {
00344               throw(InvalidCastException("DataViewMediator::updateDataChanged", 
00345                     "dataset_pointer_type", "pixel_dataset_pointer_type"));
00346             }
00347             
00348             locked_dataset->setIntensity(
00349                 changed_dataset->getIntensityWindow(), changed_dataset->getIntensityLevel());
00350             break;
00351           }
00352           catch (DatasetNotFoundException const&)
00353           {
00354             dataset_to_dataset_mmap_.erase(locked_datasets_range.first);
00355             continue;
00356           }
00357         }
00358         case DATASET_ATTRIBUTE_FOCUS_POINT :
00359         {
00360           try
00361           {
00362             pixel_dataset_pointer_type changed_dataset( 
00363               Controller::getInstance().getDataset(dataset), 
00364                 boost::detail::dynamic_cast_tag());
00365             pixel_dataset_pointer_type locked_dataset( 
00366               Controller::getInstance().getDataset(locked_datasets_range.first->second), 
00367                 boost::detail::dynamic_cast_tag());
00368             
00369             if ((changed_dataset.get() == 0) || (locked_dataset.get() == 0))
00370             {
00371               throw(InvalidCastException("DataViewMediator::updateDataChanged", 
00372                     "dataset_pointer_type", "pixel_dataset_pointer_type"));
00373             }
00374           
00375             locked_dataset->setFocusPoint(changed_dataset->getFocusPoint());
00376           }
00377           catch (DatasetNotFoundException const&)
00378           {
00379             dataset_to_dataset_mmap_.erase(locked_datasets_range.first);
00380             continue; 
00381           }  
00382         }
00383         default :
00384         {
00385           break;
00386         }
00387       }
00388 
00389       // get the dependent view of the locked dataset
00390       dependent_views_range = 
00391           dataset_to_view_mmap_.equal_range(
00392           locked_datasets_range.first->second);
00393       
00394       // notify all of them
00395       for ( ; dependent_views_range.first != 
00396               dependent_views_range.second; 
00397               ++dependent_views_range.first)
00398       {
00399         if (dependent_views_range.first->second.get() == 0)
00400         {
00401           throw (NullPointerException("DataViewMediator::updateFocusPointChanged"));
00402         } 
00403         dependent_views_range.first->second->onDataChangedEvent(changed_attribute);
00404       }
00405     }
00406     
00407     //TODO: notify the gui (via the controller) of the event
00408   }
00409   
00410   //--------------------------------------------------
00411   
00412 //   void DataViewMediator::updateFocusPointChanged(dataset_key_type dataset)
00413 //       throw(NullPointerException)   
00414 //   {  
00415 //     // get the dependent views of the given dataset
00416 //     std::pair<dataset_to_view_mmap_iterator_type,
00417 //     dataset_to_view_mmap_iterator_type> dependent_views_range =
00418 //         dataset_to_view_mmap_.equal_range(dataset);
00419 // 
00420 //     // notify all of them
00421 //     for (dataset_to_view_mmap_iterator_type dataset_iter = 
00422 //          dataset_to_view_mmap_.lower_bound(dataset);
00423 //          dataset_iter != dataset_to_view_mmap_.upper_bound(dataset); 
00424 //             ++dataset_iter)
00425 //     {
00426 //       if (dataset_iter->second.get() == 0)
00427 //       {
00428 //         throw (NullPointerException("DataViewMediator::updateFocusPointChanged"));    
00429 //       }
00430 //       
00431 //       dataset_iter->second->onFocusPointChangedEvent();    
00432 //     }
00433 //   
00434 //     // get the datasets locked with the given dataset
00435 //     std::pair<dataset_to_dataset_mmap_iterator_type, 
00436 //     dataset_to_dataset_mmap_iterator_type> locked_datasets_range =
00437 //         dataset_to_dataset_mmap_.equal_range(dataset);
00438 //     
00439 //     for ( ; locked_datasets_range.first != locked_datasets_range.second; 
00440 //             ++locked_datasets_range.first)
00441 //     { 
00442 //       try
00443 //       {     
00444 //         // set the focus point of the locked datasets to the 
00445 //         // focus point of the given dataset
00446 //         Controller::getInstance().getDataset(locked_datasets_range.first->second)->setFocusPoint(
00447 //             Controller::getInstance().getDataset(dataset)->getFocusPoint());
00448 //       }
00449 //       catch (DatasetNotFoundException const&)
00450 //       {
00451 //         dataset_to_dataset_mmap_.erase(locked_datasets_range.first);
00452 //         continue; 
00453 //       }
00454 //       
00455 //       // get the dependent view of the locked dataset
00456 //       dependent_views_range = 
00457 //           dataset_to_view_mmap_.equal_range(
00458 //           locked_datasets_range.first->second);
00459 //       
00460 //       // notify all of them
00461 //       for ( ; dependent_views_range.first != 
00462 //               dependent_views_range.second; 
00463 //               ++dependent_views_range.first)
00464 //       {
00465 //         if (dependent_views_range.first->second.get() == 0)
00466 //         {
00467 //           throw (NullPointerException("DataViewMediator::updateFocusPointChanged"));
00468 //         } 
00469 //         dependent_views_range.first->second->onFocusPointChangedEvent();
00470 //       }
00471 //     }
00472 //   }
00473 } // namespace imedgine

Generated on Sun Aug 13 18:19:38 2006 for iMEDgine by  doxygen 1.4.6