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
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
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
00211 return;
00212 }
00213 }
00214
00215
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
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
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
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
00332
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
00390 dependent_views_range =
00391 dataset_to_view_mmap_.equal_range(
00392 locked_datasets_range.first->second);
00393
00394
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
00408 }
00409
00410
00411
00412
00413
00414
00415
00416
00417
00418
00419
00420
00421
00422
00423
00424
00425
00426
00427
00428
00429
00430
00431
00432
00433
00434
00435
00436
00437
00438
00439
00440
00441
00442
00443
00444
00445
00446
00447
00448
00449
00450
00451
00452
00453
00454
00455
00456
00457
00458
00459
00460
00461
00462
00463
00464
00465
00466
00467
00468
00469
00470
00471
00472
00473 }