浏览代码

Merge branch '255-replace-dcmdataset-with-dcmitem'

Closes #255

Conflicts:
	Libs/DICOM/Widgets/Testing/Cpp/CMakeLists.txt
Marco Nolden 12 年之前
父节点
当前提交
6c3103e2c1

+ 2 - 2
Applications/ctkDICOMObjectViewer/ctkDICOMObjectViewerMain.cpp

@@ -23,7 +23,7 @@
 #include "iostream"
 
 // CTK Widgets
-#include "ctkDICOMDatasetView.h"
+#include "ctkDICOMItemView.h"
 
 // DCMTK includes
 #include <dcmimage.h>
@@ -61,7 +61,7 @@ int main(int argv, char** argc)
 
   DicomImage dcmImage( s.toStdString().c_str() );
 
-  ctkDICOMDatasetView imageView;
+  ctkDICOMItemView imageView;
   imageView.addImage( dcmImage );
   imageView.show();
   imageView.raise();

+ 3 - 2
Libs/DICOM/Core/CMakeLists.txt

@@ -30,13 +30,14 @@ set(KIT_SRCS
   ctkDICOMAbstractThumbnailGenerator.h
   ctkDICOMDatabase.cpp
   ctkDICOMDatabase.h
-  ctkDICOMDataset.cpp
-  ctkDICOMDataset.h
+  ctkDICOMItem.h
   ctkDICOMFilterProxyModel.cpp
   ctkDICOMFilterProxyModel.h
   ctkDICOMIndexer.cpp
   ctkDICOMIndexer.h
   ctkDICOMIndexer_p.h
+  ctkDICOMItem.cpp
+  ctkDICOMItem.h
   ctkDICOMModel.cpp
   ctkDICOMModel.h
   ctkDICOMPersonName.cpp

+ 2 - 2
Libs/DICOM/Core/Testing/Cpp/CMakeLists.txt

@@ -6,7 +6,7 @@ create_test_sourcelist(Tests ${KIT}CppTests.cpp
   ctkDICOMDatabaseTest2.cpp
   ctkDICOMDatabaseTest3.cpp
   ctkDICOMDatabaseTest4.cpp
-  ctkDICOMDatasetTest1.cpp
+  ctkDICOMItemTest1.cpp
   ctkDICOMIndexerTest1.cpp
   ctkDICOMModelTest1.cpp
   ctkDICOMPersonNameTest1.cpp
@@ -37,7 +37,7 @@ SIMPLE_TEST(ctkDICOMDatabaseTest3
   ${CMAKE_CURRENT_SOURCE_DIR}/../../Resources/dicom-unversioned-schema.sql
   )
 SIMPLE_TEST(ctkDICOMDatabaseTest4 ${CTKData_DIR}/Data/DICOM/MRHEAD/000055.IMA)
-SIMPLE_TEST(ctkDICOMDatasetTest1)
+SIMPLE_TEST(ctkDICOMItemTest1)
 SIMPLE_TEST(ctkDICOMIndexerTest1 )
 
 # ctkDICOMModel

+ 18 - 18
Libs/DICOM/Core/Testing/Cpp/ctkDICOMDatasetTest1.cpp

@@ -19,17 +19,17 @@
 =========================================================================*/
 
 // ctkDICOMCore includes
-#include "ctkDICOMDataset.h"
+#include "ctkDICOMItem.h"
 
 // STD includes
 #include <iostream>
 
-int ctkDICOMDatasetTest1( int argc, char * argv [] )
+int ctkDICOMItemTest1( int argc, char * argv [] )
 {
   Q_UNUSED(argc);
   Q_UNUSED(argv);
-  ctkDICOMDataset dataset;
-  dataset.InitializeFromDataset(0);
+  ctkDICOMItem dataset;
+  dataset.InitializeFromItem(0);
   dataset.InitializeFromFile(QString());
   try
     {
@@ -37,7 +37,7 @@ int ctkDICOMDatasetTest1( int argc, char * argv [] )
     }
   catch(...)
     {
-    std::cout << "ctkDICOMDataset::Serialize() throws exceptions" << std::endl;
+    std::cout << "ctkDICOMItem::Serialize() throws exceptions" << std::endl;
     //return EXIT_FAILURE;
     }
   try
@@ -46,7 +46,7 @@ int ctkDICOMDatasetTest1( int argc, char * argv [] )
     }
   catch(...)
     {
-    std::cout << "ctkDICOMDataset::Deserialize() throws exceptions"
+    std::cout << "ctkDICOMItem::Deserialize() throws exceptions"
               << std::endl;
     //return EXIT_FAILURE;
     }
@@ -57,7 +57,7 @@ int ctkDICOMDatasetTest1( int argc, char * argv [] )
     }
   catch(...)
     {
-    std::cout << "ctkDICOMDataset::EnsureDcmDataSetIsInitialized() throws"
+    std::cout << "ctkDICOMItem::EnsureDcmDataSetIsInitialized() throws"
               << " exceptions" << std::endl;
     //return EXIT_FAILURE;
     }
@@ -70,23 +70,23 @@ int ctkDICOMDatasetTest1( int argc, char * argv [] )
   QString decode = dataset.Decode(DcmTag(),OFString());
   if (!decode.isEmpty())
     {
-    std::cerr << "ctkDICOMDataset::Decode() failed: "
+    std::cerr << "ctkDICOMItem::Decode() failed: "
               << qPrintable(decode) << std::endl;
     return EXIT_FAILURE;
     }
   OFString encode = dataset.Encode(DcmTag(), decode);
   DcmElement* element = 0;
   OFCondition condition = dataset.findAndGetElement(DcmTag(), element);
-  if (ctkDICOMDataset::CheckCondition(condition))
+  if (ctkDICOMItem::CheckCondition(condition))
     {
-    std::cerr << "ctkDICOMDataset::findAndGetElement() failed" << std::endl;
+    std::cerr << "ctkDICOMItem::findAndGetElement() failed" << std::endl;
     return EXIT_FAILURE;
     }
   OFString string;
   condition = dataset.findAndGetOFString(DcmTag(), string);
-  if (ctkDICOMDataset::CheckCondition(condition))
+  if (ctkDICOMItem::CheckCondition(condition))
     {
-    std::cerr << "ctkDICOMDataset::findAndGetOFString() failed" << std::endl;
+    std::cerr << "ctkDICOMItem::findAndGetOFString() failed" << std::endl;
     return EXIT_FAILURE;
     }
    try
@@ -129,15 +129,15 @@ int ctkDICOMDatasetTest1( int argc, char * argv [] )
     }
   catch(...)
     {
-    std::cout << "ctkDICOMDataset::GetElementValueAsXXX() throws exceptions"
+    std::cout << "ctkDICOMItem::GetElementValueAsXXX() throws exceptions"
               << std::endl;
     //return EXIT_FAILURE;
     }
-  ctkDICOMDataset::TranslateDefinedTermPatientPosition(QString());
-  ctkDICOMDataset::TranslateDefinedTermModality(QString());
-  ctkDICOMDataset::TagKey(DcmTag());
-  ctkDICOMDataset::TagDescription(DcmTag());
-  ctkDICOMDataset::TagVR(DcmTag());
+  ctkDICOMItem::TranslateDefinedTermPatientPosition(QString());
+  ctkDICOMItem::TranslateDefinedTermModality(QString());
+  ctkDICOMItem::TagKey(DcmTag());
+  ctkDICOMItem::TagDescription(DcmTag());
+  ctkDICOMItem::TagVR(DcmTag());
   
   return EXIT_SUCCESS;
 }

+ 18 - 18
Libs/DICOM/Core/ctkDICOMDatabase.cpp

@@ -36,7 +36,7 @@
 // ctkDICOM includes
 #include "ctkDICOMDatabase.h"
 #include "ctkDICOMAbstractThumbnailGenerator.h"
-#include "ctkDICOMDataset.h"
+#include "ctkDICOMItem.h"
 
 #include "ctkLogger.h"
 
@@ -95,7 +95,7 @@ public:
 
   // dataset must be set always
   // filePath has to be set if this is an import of an actual file
-  void insert ( const ctkDICOMDataset& ctkDataset, const QString& filePath, bool storeFile = true, bool generateThumbnail = true);
+  void insert ( const ctkDICOMItem& ctkDataset, const QString& filePath, bool storeFile = true, bool generateThumbnail = true);
 
   ///
   /// copy the complete list of files to an extra table
@@ -142,9 +142,9 @@ public:
   QStringList TagsToPrecache;
   void precacheTags( const QString sopInstanceUID );
 
-  int insertPatient(const ctkDICOMDataset& ctkDataset);
-  void insertStudy(const ctkDICOMDataset& ctkDataset, int dbPatientID);
-  void insertSeries( const ctkDICOMDataset& ctkDataset, QString studyInstanceUID);
+  int insertPatient(const ctkDICOMItem& ctkDataset);
+  void insertStudy(const ctkDICOMItem& ctkDataset, int dbPatientID);
+  void insertSeries( const ctkDICOMItem& ctkDataset, QString studyInstanceUID);
 };
 
 //------------------------------------------------------------------------------
@@ -791,7 +791,7 @@ QString ctkDICOMDatabase::fileValue(const QString fileName, const unsigned short
   // here is where the real lookup happens
   // - first we check the tagCache to see if the value exists for this instance tag
   // If not,
-  // - for now we create a ctkDICOMDataset and extract the value from there
+  // - for now we create a ctkDICOMItem and extract the value from there
   // - then we convert to the appropriate type of string
   //
   //As an optimization we could consider
@@ -813,7 +813,7 @@ QString ctkDICOMDatabase::fileValue(const QString fileName, const unsigned short
     return value;
     }
 
-  ctkDICOMDataset dataset;
+  ctkDICOMItem dataset;
   dataset.InitializeFromFile(fileName);
 
   DcmTagKey tagKey(group, element);
@@ -849,17 +849,17 @@ QString ctkDICOMDatabase::groupElementToTag(const unsigned short& group, const u
 //
 
 //------------------------------------------------------------------------------
-void ctkDICOMDatabase::insert( DcmDataset *dataset, bool storeFile, bool generateThumbnail)
+void ctkDICOMDatabase::insert( DcmItem *item, bool storeFile, bool generateThumbnail)
 {
-  if (!dataset)
+  if (!item)
     {
       return;
     }
-  ctkDICOMDataset ctkDataset;
-  ctkDataset.InitializeFromDataset(dataset, false /* do not take ownership */);
+  ctkDICOMItem ctkDataset;
+  ctkDataset.InitializeFromItem(item, false /* do not take ownership */);
   this->insert(ctkDataset,storeFile,generateThumbnail);
 }
-void ctkDICOMDatabase::insert( const ctkDICOMDataset& ctkDataset, bool storeFile, bool generateThumbnail)
+void ctkDICOMDatabase::insert( const ctkDICOMItem& ctkDataset, bool storeFile, bool generateThumbnail)
 {
   Q_D(ctkDICOMDatabase);
   d->insert(ctkDataset, QString(), storeFile, generateThumbnail);
@@ -885,7 +885,7 @@ void ctkDICOMDatabase::insert ( const QString& filePath, bool storeFile, bool ge
   std::string filename = filePath.toStdString();
 
   DcmFileFormat fileformat;
-  ctkDICOMDataset ctkDataset;
+  ctkDICOMItem ctkDataset;
 
   ctkDataset.InitializeFromFile(filePath);
   if ( ctkDataset.IsInitialized() )
@@ -899,7 +899,7 @@ void ctkDICOMDatabase::insert ( const QString& filePath, bool storeFile, bool ge
 }
 
 //------------------------------------------------------------------------------
-int ctkDICOMDatabasePrivate::insertPatient(const ctkDICOMDataset& ctkDataset)
+int ctkDICOMDatabasePrivate::insertPatient(const ctkDICOMItem& ctkDataset)
 {
   int dbPatientID;
 
@@ -950,7 +950,7 @@ int ctkDICOMDatabasePrivate::insertPatient(const ctkDICOMDataset& ctkDataset)
 }
 
 //------------------------------------------------------------------------------
-void ctkDICOMDatabasePrivate::insertStudy(const ctkDICOMDataset& ctkDataset, int dbPatientID)
+void ctkDICOMDatabasePrivate::insertStudy(const ctkDICOMItem& ctkDataset, int dbPatientID)
 {
   QString studyInstanceUID(ctkDataset.GetElementAsString(DCM_StudyInstanceUID) );
   QSqlQuery checkStudyExistsQuery (Database);
@@ -1000,7 +1000,7 @@ void ctkDICOMDatabasePrivate::insertStudy(const ctkDICOMDataset& ctkDataset, int
 }
 
 //------------------------------------------------------------------------------
-void ctkDICOMDatabasePrivate::insertSeries(const ctkDICOMDataset& ctkDataset, QString studyInstanceUID)
+void ctkDICOMDatabasePrivate::insertSeries(const ctkDICOMItem& ctkDataset, QString studyInstanceUID)
 {
   QString seriesInstanceUID(ctkDataset.GetElementAsString(DCM_SeriesInstanceUID) );
   QSqlQuery checkSeriesExistsQuery (Database);
@@ -1078,7 +1078,7 @@ void ctkDICOMDatabasePrivate::precacheTags( const QString sopInstanceUID )
 {
   Q_Q(ctkDICOMDatabase);
 
-  ctkDICOMDataset dataset;
+  ctkDICOMItem dataset;
   QString fileName = q->fileForInstance(sopInstanceUID);
   dataset.InitializeFromFile(fileName);
 
@@ -1097,7 +1097,7 @@ void ctkDICOMDatabasePrivate::precacheTags( const QString sopInstanceUID )
 }
 
 //------------------------------------------------------------------------------
-void ctkDICOMDatabasePrivate::insert( const ctkDICOMDataset& ctkDataset, const QString& filePath, bool storeFile, bool generateThumbnail)
+void ctkDICOMDatabasePrivate::insert( const ctkDICOMItem& ctkDataset, const QString& filePath, bool storeFile, bool generateThumbnail)
 {
   Q_Q(ctkDICOMDatabase);
 

+ 3 - 3
Libs/DICOM/Core/ctkDICOMDatabase.h

@@ -26,7 +26,7 @@
 #include <QStringList>
 #include <QSqlDatabase>
 
-#include "ctkDICOMDataset.h"
+#include "ctkDICOMItem.h"
 #include "ctkDICOMCoreExport.h"
 
 class QDateTime;
@@ -177,9 +177,9 @@ public:
   ///                  does only make sense if a full object is received.
   /// @param @generateThumbnail If true, a thumbnail is generated.
   ///
-  Q_INVOKABLE void insert( const ctkDICOMDataset& ctkDataset,
+  Q_INVOKABLE void insert( const ctkDICOMItem& ctkDataset,
                               bool storeFile, bool generateThumbnail);
-  void insert ( DcmDataset *dataset,
+  void insert ( DcmItem *item,
                               bool storeFile = true, bool generateThumbnail = true);
   Q_INVOKABLE void insert ( const QString& filePath,
                             bool storeFile = true, bool generateThumbnail = true,

+ 8 - 258
Libs/DICOM/Core/ctkDICOMDataset.h

@@ -1,260 +1,10 @@
-/*=========================================================================
-
-  Library:   CTK
-
-  Copyright (c) Mint Medical GmbH
-
-  Licensed under the Apache License, Version 2.0 (the "License");
-  you may not use this file except in compliance with the License.
-  You may obtain a copy of the License at
-
-      http://www.apache.org/licenses/LICENSE-2.0.txt
-
-  Unless required by applicable law or agreed to in writing, software
-  distributed under the License is distributed on an "AS IS" BASIS,
-  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-  See the License for the specific language governing permissions and
-  limitations under the License.
-
-=========================================================================*/
-
-#ifndef __ctkDICOMDataset_h
-#define __ctkDICOMDataset_h
-
-#include "ctkDICOMCoreExport.h"
-
-#include "ctkDICOMPersonName.h"
-
-#include <dcdatset.h> // DCMTK DcmDataset
-
-#include <QtCore>
-
-class DcmDataDictionary;
-
-
-class ctkDICOMDatasetPrivate;
-
-/// \ingroup DICOM_Core
-///
-///  \brief Base class for DICOM objects and interface with DICOM toolkit DCMTK.
-///
-///  This class serves as the base class for all DICOM objects (patient, study, series, image).
-///
-///  The class is derived from DcmDataset, the data type that is used by the DICOM toolkit when
-///  reading an image file or formulating a message request or receiving a message response (e.g. C-FIND).
-///
-///  Basically it offers a lot of convenience methods for subclasses to read and write DICOM attributes
-///  using Qt types. It is the subclasses responsibility to use the correct data types as defined in DICOM.
-///
-///  \note ONLY the Get.. methods should be used to access the internal dataset.
-///
-///  When reading string type attributes (LO, LT, PN, SH, ST, UT), we consider the "specific character set"
-///  tag and decode the stored string using the correct encoding (using Qt methods). This allows to
-///  display e.g. person names written in arabic, hebrew, greek, russian, etc. letters.
-///
-///  \warning Right now, asian phonetic strings cause problems. We have to learn the concept.
-///  \warning Helpers for writing DICOM attributes are not yet implemented. Implementation is straightforward though and can be done when necessary.
-///  \warning DateTime objects ignore the timezone at the moment. This is however of secondary importance.
-///
-///  A subclass could possibly want to store the internal DcmDataset.
-///  For this purpose, the internal DcmDataset is serialized into a memory buffer using DcmDataset::write(..). This buffer
-///  is stored in a base64 encoded string. For deserialization we decode the string and use DcmDataset::read(..).
-class CTK_DICOM_CORE_EXPORT ctkDICOMDataset
-{
-public:
-    typedef QObject Superclass;
-    ///
-    /// \brief Create an empty object. This has to be initialized by one of
-    /// the InitializeFrom... methods before it can be used.
-    ///
-    /// @param strictErrorHandling If set to false (the default) only critical errors throw exceptions.
-    ctkDICOMDataset(bool strictErrorHandling = false);
-    virtual ~ctkDICOMDataset();
-
-    /// \brief For initialization from a DcmDataset in a constructor / assignment.
-    ///
-    /// This method should be overwritten by all derived classes. It should
-    /// be called from the constructor or assignment operators when the class
-    /// should copy information from a DcmDataset object.
-
-    /// \warning Derived classes must call PDICOMDataset::InitializeFromDataset(...) to correctly copy encoding information.
-    virtual void InitializeFromDataset(DcmDataset* dataset, bool takeOwnership = false);
-
-    ///
-    /// \brief For initialization from file in a constructor / assignment.
-    ///
-    virtual void InitializeFromFile(const QString& filename,
-                    const E_TransferSyntax readXfer = EXS_Unknown,
-                    const E_GrpLenEncoding groupLength = EGL_noChange,
-                    const Uint32 maxReadLength = DCM_MaxReadLength,
-                    const E_FileReadMode readMode = ERM_autoDetect);
-
-
-
-    /// \brief Save dataset to file
-    ///
-    /// \returns true on success.
-    bool SaveToFile(const QString& filePath) const;
-
-
-    /// \brief Store a string representation of the object to a database field.
-    ///
-    /// The internal DcmDataset is serialized into a memory buffer using DcmDataset::write(..).
-    /// To store the memory buffer in a simple string database field, we convert it to a base64 encoded string.
-    /// Doing so prevents errors from encoding conversions that could be made by QString or the database etc.
-    void Serialize();
-
-    /// \brief Restore the object from a string representation in a database field.
-    ///
-    /// The database stored string is base64 decoded into a memory buffer. Then
-    /// the internal DcmDataset is created using DcmDataset::read(..).
-    void Deserialize();
-
-
-    /// \brief To be called from InitializeData, flags status as dirty.
-    ///
-    /// This is to allow data to be read as late as possible. All the
-    /// Get/SetElement... methods ensure initialization, which checks this flag.
-    void MarkForInitialization();
-
-
-    /// \brief Is this dataset initialized ?
-    bool IsInitialized() const;
-
-    ///
-    /// \brief Called by all Get/Set methods to initialize DcmDataSet if needed.
-    ///
-    void EnsureDcmDataSetIsInitialized() const;
-
-
-    /// \brief Find element in dataset and copy it into internal DcmDataset
-    ///
-    /// Attribute types 1, 1C, 2, 2C, 3 as defined in DICOM can be encoded as
-    /// hex values 0x1, 0x1C, 0x2, 0x2C, 0x3.
-    ///
-    /// Conditional attributes are considered MUST attributes. The calling
-    /// function shall test the conditions before calling CopyElement
-    /// (since conditions might be complex).
-    bool CopyElement( DcmDataset* dataset, const DcmTagKey& tag, int type );
-
-    /// \brief creates a QString from the OFString, respecting the "specific character set" of the Dataset.
-    ///
-    /// This method checks if the dataset has an attribute "specific character set".
-    /// If so, all attributes of types Long String (LO), Long Text (LT), Person Name (PN), Short String (SH),
-    /// Short Text (ST), Unlimited Text (UT) should be interpreted as encoded with a special set.
-    ///
-    /// See implementation for details.
-    QString Decode(const DcmTag& tag, const OFString& raw) const;
-
-    /// \brief creates an OFString from the QtString
-    ///
-    /// \warning The method currently assumes that the encoding of the passed string if latin1 and converts
-    /// it accordingly. The passed DICOM tag is not yet evaluated to determine the actual encoding type.
-    OFString Encode(const DcmTag& tag, const QString& qstring) const;
-
-    ///
-    /// \brief A const-correct version of DcmDataset::findAndGetElement.
-    ///
-    OFCondition findAndGetElement(const DcmTag& tag, DcmElement*& element, const OFBool searchIntoSub=OFFalse) const; // DCMTK is not const-correct
-
-    ///
-    ///  \brief A const-correct version of DcmDataset::findAndGetOFString.
-    ///
-    OFCondition findAndGetOFString(const DcmTag& tag, OFString& value, const unsigned long pos = 0, const OFBool searchIntoSub=OFFalse) const; // DCMTK is not const-correct
-
-    static bool CheckCondition(const OFCondition&);
-
-    ///
-    /// \brief Get-methods for for all subtypes of DcmByteString
-    ///
-    QString          GetAllElementValuesAsString( const DcmTag& tag ) const;
-    QString                   GetElementAsString( const DcmTag& tag, unsigned long pos = 0 ) const;
-    QStringList           GetElementAsStringList( const DcmTag& tag ) const;
-    ctkDICOMPersonName           GetElementAsPersonName( const DcmTag& tag, unsigned long pos = 0 ) const;
-    ctkDICOMPersonNameList   GetElementAsPersonNameList( const DcmTag& tag ) const;
-    QDate                       GetElementAsDate( const DcmTag& tag, unsigned long pos = 0 ) const;
-    QTime                       GetElementAsTime( const DcmTag& tag, unsigned long pos = 0 ) const;
-    double                    GetElementAsDouble( const DcmTag& tag, unsigned long pos = 0 ) const; // type DS
-    long                     GetElementAsInteger( const DcmTag& tag, unsigned long pos = 0 ) const; // type IS
-    int                  GetElementAsSignedShort( const DcmTag& tag, unsigned long pos = 0 ) const; // type SS
-    int                GetElementAsUnsignedShort( const DcmTag& tag, unsigned long pos = 0 ) const; // type US
-
-    ///
-    /// \warning IGNORES TIME ZONE at the moment!
-    ///
-    QDateTime       GetElementAsDateTime( const DcmTag& tag, unsigned long pos = 0 ) const;
-
-
-    ///
-    /// \brief Set-methods for for all subtypes of DcmByteString
-    ///
-    bool SetElementAsString( const DcmTag& tag, QString string );
-    bool SetElementAsStringList( const DcmTag& tag, QStringList stringList ); //> Currently not implemented
-    bool SetElementAsPersonName( const DcmTag& tag, ctkDICOMPersonName personName );
-    bool SetElementAsPersonNameList( const DcmTag& tag, ctkDICOMPersonNameList personNameList ); //> Currently not implemented
-    bool SetElementAsDate( const DcmTag& tag, QDate date );
-    bool SetElementAsTime( const DcmTag& tag, QTime time );
-    bool SetElementAsDateTime( const DcmTag& tag, QDateTime dateTime );
-    bool SetElementAsInteger( const DcmTag& tag, long value, unsigned long pos = 0 ); // type IS
-    bool SetElementAsSignedShort( const DcmTag& tag, int value, unsigned long pos = 0 ); // type SS
-    bool SetElementAsUnsignedShort( const DcmTag& tag, int value, unsigned long pos = 0 ); // type US
-
-
-    /// Some convenience getter
-    QString GetStudyInstanceUID() const;
-    QString GetSeriesInstanceUID() const;
-    QString GetSOPInstanceUID() const;
-
-    ///
-    /// \brief Get a human-readable version of patient position enumerations used e.g. in DICOM series.
-    ///
-    static QString TranslateDefinedTermPatientPosition( const QString& dt );
-
-    ///
-    /// \brief Get a human-readable version of modality enumerations used e.g. in DICOM series.
-    ///
-    static QString TranslateDefinedTermModality( const QString& dt );
-
-    ///
-    /// \brief Nicely formatted (group,element) version of a tag
-    ///
-    static QString TagKey( const DcmTag& tag );
-
-    ///
-    /// \brief Description (name) of the tag
-    ///
-    static QString TagDescription( const DcmTag& tag );
-
-    ///
-    /// \brief Value Representation
-    ///
-    static QString TagVR( const DcmTag& tag );
-
-protected:
-
-    ///
-    /// \brief Callback for retrieving a serialized version of this class
-    ///
-    /// You can override this method in a subclass to retrieve a serialized
-    /// version of the object from some storage mechanism, eg a database
-    ///
-    virtual QString GetStoredSerialization();
-
-    ///
-    /// \brief Callback for storing a serialized version of this class
-    ///
-    /// You can override this method in a subclass to store a serialized
-    /// version of the object to some storage mechanism, eg a database
-    ///
-    virtual void SetStoredSerialization(QString serializedDataset);
-
-  QScopedPointer<ctkDICOMDatasetPrivate> d_ptr;
-
-  DcmDataset& GetDcmDataset() const;
-
-private:
-  Q_DECLARE_PRIVATE(ctkDICOMDataset);
-};
-
+#ifndef CTK_DICOM_DATASET_H
+#define CTK_DICOM_DATASET_H
+#if defined _MSC_VER
+  #pragma message ( "Deprecated header ctkDICOMItem.h included. Please use ctkDICOMItem.h!" )
+#elif defined __GNUC__
+  #warning "Deprecated header ctkDICOMItem.h included. Please use ctkDICOMItem.h!"
+#endif
+#include "ctkDICOMItem.h"
 #endif
 

+ 113 - 108
Libs/DICOM/Core/ctkDICOMDataset.cpp

@@ -19,7 +19,7 @@
 
 =============================================================================*/
 
-#include "ctkDICOMDataset.h"
+#include "ctkDICOMItem.h"
 
 #include <dctk.h>
 #include <dcostrmb.h>
@@ -28,58 +28,58 @@
 #include <stdexcept>
 
 
-class ctkDICOMDatasetPrivate
+class ctkDICOMItemPrivate
 {
   public:
 
-    ctkDICOMDatasetPrivate() : m_DcmDataset(0), m_TakeOwnership(true) {}
+    ctkDICOMItemPrivate() : m_DcmItem(0), m_TakeOwnership(true) {}
 
     QString m_SpecificCharacterSet;
 
     bool m_DICOMDataSetInitialized;
     bool m_StrictErrorHandling;
 
-    DcmDataset* m_DcmDataset;
+    DcmItem* m_DcmItem;
     bool m_TakeOwnership;
 };
 
 
-ctkDICOMDataset::ctkDICOMDataset(bool strictErrorHandling)
-:d_ptr(new ctkDICOMDatasetPrivate)
+ctkDICOMItem::ctkDICOMItem(bool strictErrorHandling)
+:d_ptr(new ctkDICOMItemPrivate)
 {
-  Q_D(ctkDICOMDataset);
-  d->m_DcmDataset = new DcmDataset();
+  Q_D(ctkDICOMItem);
+  d->m_DcmItem = new DcmDataset();
   d->m_TakeOwnership = true;
   d->m_DICOMDataSetInitialized = false;
   d->m_StrictErrorHandling = strictErrorHandling;
 }
 
-ctkDICOMDataset::~ctkDICOMDataset()
+ctkDICOMItem::~ctkDICOMItem()
 {
-  Q_D(ctkDICOMDataset);
+  Q_D(ctkDICOMItem);
   if ( d->m_TakeOwnership)
   {
-    delete d->m_DcmDataset;
+    delete d->m_DcmItem;
   }
 }
 
 
-void ctkDICOMDataset::InitializeFromDataset(DcmDataset* dataset, bool takeOwnership)
+void ctkDICOMItem::InitializeFromItem(DcmItem *dataset, bool takeOwnership)
 {
-  Q_D(ctkDICOMDataset);
+  Q_D(ctkDICOMItem);
 
-  if(d->m_DcmDataset != dataset)
+  if(d->m_DcmItem != dataset)
   {
     if (d->m_TakeOwnership)
     {
-      delete d->m_DcmDataset;
+      delete d->m_DcmItem;
     }
-    d->m_DcmDataset = NULL;
+    d->m_DcmItem = NULL;
   }
 
   if (dataset)
   {
-    d->m_DcmDataset=dataset;
+    d->m_DcmItem=dataset;
     d->m_TakeOwnership = takeOwnership;
     if (!d->m_DICOMDataSetInitialized)
     {
@@ -106,7 +106,7 @@ void ctkDICOMDataset::InitializeFromDataset(DcmDataset* dataset, bool takeOwners
   }
 
 
-void ctkDICOMDataset::InitializeFromFile(const QString& filename,
+void ctkDICOMItem::InitializeFromFile(const QString& filename,
                                          const E_TransferSyntax readXfer,
                                          const E_GrpLenEncoding groupLength,
                                          const Uint32 maxReadLength,
@@ -125,23 +125,23 @@ void ctkDICOMDataset::InitializeFromFile(const QString& filename,
     return;
   }
 
-  InitializeFromDataset(dataset, true);
+  InitializeFromItem(dataset, true);
 }
 
-void ctkDICOMDataset::Serialize()
+void ctkDICOMItem::Serialize()
 {
-  Q_D(ctkDICOMDataset);
+  Q_D(ctkDICOMItem);
   EnsureDcmDataSetIsInitialized();
 
-  // store content of current DcmDataset (our parent) as QByteArray into m_ctkDICOMDataset
+  // store content of current DcmDataset (our parent) as QByteArray into m_ctkDICOMItem
   Uint32 buffersize = 1024*1024; // reserve 1MB
   char* writebuffer = new char[buffersize];
 
   // write into buffer
   DcmOutputBufferStream dcmbuffer(writebuffer, buffersize);
-  d->m_DcmDataset->transferInit();
-  OFCondition condition = d->m_DcmDataset->write(dcmbuffer, EXS_LittleEndianImplicit, EET_UndefinedLength, NULL );
-  d->m_DcmDataset->transferEnd();
+  d->m_DcmItem->transferInit();
+  OFCondition condition = d->m_DcmItem->write(dcmbuffer, EXS_LittleEndianImplicit, EET_UndefinedLength, NULL );
+  d->m_DcmItem->transferEnd();
   if ( condition.bad() )
   {
     std::cerr << "Could not DcmDataset::write(..): " << condition.text() << std::endl;
@@ -152,7 +152,7 @@ void ctkDICOMDataset::Serialize()
   void* readbuffer = NULL;
   dcmbuffer.flushBuffer(readbuffer, datasetsize);
 
-  //std::cerr << "** " << (void*)this << " ctkDICOMDataset: Serializing Dataset into " << datasetsize << " bytes" << std::endl;
+  //std::cerr << "** " << (void*)this << " ctkDICOMItem: Serializing Dataset into " << datasetsize << " bytes" << std::endl;
 
   // construct Qt type from that contents
   QByteArray qtArray = QByteArray::fromRawData( static_cast<const char*>(readbuffer), datasetsize );
@@ -166,29 +166,29 @@ void ctkDICOMDataset::Serialize()
   delete[] writebuffer;
 }
 
-void ctkDICOMDataset::MarkForInitialization()
+void ctkDICOMItem::MarkForInitialization()
 {
-  Q_D(ctkDICOMDataset);
+  Q_D(ctkDICOMItem);
   d->m_DICOMDataSetInitialized = false;
 }
-bool ctkDICOMDataset::IsInitialized() const
+bool ctkDICOMItem::IsInitialized() const
 {
-  Q_D(const ctkDICOMDataset);
+  Q_D(const ctkDICOMItem);
   return d->m_DICOMDataSetInitialized;
 }
-void ctkDICOMDataset::EnsureDcmDataSetIsInitialized() const
+void ctkDICOMItem::EnsureDcmDataSetIsInitialized() const
 {
   if ( ! this->IsInitialized() )
   {
-      throw std::logic_error("Calling methods on uninitialized ctkDICOMDataset");
+      throw std::logic_error("Calling methods on uninitialized ctkDICOMItem");
   }
-  // const_cast<ctkDICOMDataset*>(this)->Deserialize();
+  // const_cast<ctkDICOMItem*>(this)->Deserialize();
 }
 
-void ctkDICOMDataset::Deserialize()
+void ctkDICOMItem::Deserialize()
 {
-  Q_D(ctkDICOMDataset);
-  // read attribute m_ctkDICOMDataset
+  Q_D(ctkDICOMItem);
+  // read attribute m_ctkDICOMItem
   // construct a DcmDataset from it
   // calls InitializeData(DcmDataset*)
 
@@ -205,10 +205,10 @@ void ctkDICOMDataset::Deserialize()
   }
 
 
-  //std::cerr << "** " << (void*)this << " ctkDICOMDataset: Deserialize Dataset from string of size " << stringbuffer.size() << "\n" << stringbuffer.toStdString() << std::endl;
+  //std::cerr << "** " << (void*)this << " ctkDICOMItem: Deserialize Dataset from string of size " << stringbuffer.size() << "\n" << stringbuffer.toStdString() << std::endl;
 
   QByteArray qtArray = QByteArray::fromBase64( stringbuffer.toAscii() );
-  //std::cerr << "** " << (void*)this << " ctkDICOMDataset: Deserialize Dataset from byte array of size " << qtArray.size() << std::endl;
+  //std::cerr << "** " << (void*)this << " ctkDICOMItem: Deserialize Dataset from byte array of size " << qtArray.size() << std::endl;
 
   DcmInputBufferStream dcmbuffer;
   dcmbuffer.setBuffer( qtArray.data(), qtArray.size() );
@@ -221,7 +221,7 @@ void ctkDICOMDataset::Deserialize()
   dataset.transferEnd();
 
   // do this in all cases, even when reading reported an error
-  this->InitializeFromDataset(&dataset);
+  this->InitializeFromItem(&dataset);
 
   if ( condition.bad() )
   {
@@ -240,27 +240,27 @@ void ctkDICOMDataset::Deserialize()
   }
 }
 
-DcmDataset& ctkDICOMDataset::GetDcmDataset() const
+DcmItem& ctkDICOMItem::GetDcmItem() const
 {
-  const Q_D(ctkDICOMDataset);
-  return *d->m_DcmDataset;
+  const Q_D(ctkDICOMItem);
+  return *d->m_DcmItem;
 }
 
-OFCondition ctkDICOMDataset::findAndGetElement(const DcmTag& tag, DcmElement*& element, const OFBool searchIntoSub) const
+OFCondition ctkDICOMItem::findAndGetElement(const DcmTag& tag, DcmElement*& element, const OFBool searchIntoSub) const
 {
   EnsureDcmDataSetIsInitialized();
   // this one const_cast allows us to declare quite a lot of methods nicely with const
-  return GetDcmDataset().findAndGetElement(tag, element, searchIntoSub);
+  return GetDcmItem().findAndGetElement(tag, element, searchIntoSub);
 }
 
-OFCondition ctkDICOMDataset::findAndGetOFString(const DcmTag& tag, OFString& value, const unsigned long pos, const OFBool searchIntoSub) const
+OFCondition ctkDICOMItem::findAndGetOFString(const DcmTag& tag, OFString& value, const unsigned long pos, const OFBool searchIntoSub) const
 {
   EnsureDcmDataSetIsInitialized();
   // this second const_cast allows us to declare quite a lot of methods nicely with const
-  return GetDcmDataset().findAndGetOFString(tag, value, pos, searchIntoSub);
+  return GetDcmItem().findAndGetOFString(tag, value, pos, searchIntoSub);
 }
 
-bool ctkDICOMDataset::CheckCondition(const OFCondition& condition)
+bool ctkDICOMItem::CheckCondition(const OFCondition& condition)
 {
   if ( condition.bad() )
   {
@@ -270,9 +270,9 @@ bool ctkDICOMDataset::CheckCondition(const OFCondition& condition)
   return condition.good();
 }
 
-bool ctkDICOMDataset::CopyElement( DcmDataset* dataset, const DcmTagKey& tag, int type )
+bool ctkDICOMItem::CopyElement( DcmDataset* dataset, const DcmTagKey& tag, int type )
 {
-  Q_D(ctkDICOMDataset);
+  Q_D(ctkDICOMItem);
   switch (type)
   {
     case 0x1:
@@ -292,7 +292,7 @@ bool ctkDICOMDataset::CopyElement( DcmDataset* dataset, const DcmTagKey& tag, in
   bool copied(true);
 
   if (!dataset) return false;
-  if (dataset == d->m_DcmDataset)
+  if (dataset == d->m_DcmItem)
   {
     throw std::logic_error("Trying to copy tag to yourself. Please check application logic!"); 
   }
@@ -316,7 +316,7 @@ bool ctkDICOMDataset::CopyElement( DcmDataset* dataset, const DcmTagKey& tag, in
     dataset->findAndGetElement( tag, element, OFFalse, OFTrue ); // OFTrue is important (copies element), DcmDataset takes ownership and deletes elements on its own destruction
     if (element)
     {
-      copied = CheckCondition( d->m_DcmDataset->insert(element) );
+      copied = CheckCondition( d->m_DcmItem->insert(element) );
     }
   }
 
@@ -333,9 +333,9 @@ bool ctkDICOMDataset::CopyElement( DcmDataset* dataset, const DcmTagKey& tag, in
   return !missing && copied;
 }
 
-QString ctkDICOMDataset::Decode( const DcmTag& tag, const OFString& raw ) const
+QString ctkDICOMItem::Decode( const DcmTag& tag, const OFString& raw ) const
 {
-  Q_D(const ctkDICOMDataset);
+  Q_D(const ctkDICOMItem);
   // decode for types LO, LT, PN, SH, ST, UT
   QString vr = TagVR(tag);
   if ( !d->m_SpecificCharacterSet.isEmpty()
@@ -424,14 +424,14 @@ QString ctkDICOMDataset::Decode( const DcmTag& tag, const OFString& raw ) const
 
 }
 
-OFString ctkDICOMDataset::Encode( const DcmTag& tag, const QString& qstring ) const
+OFString ctkDICOMItem::Encode( const DcmTag& tag, const QString& qstring ) const
 {
   // TODO: respect given character-set when encoding; see Decode()
   Q_UNUSED(tag);
   return OFString( qstring.toLatin1().data() ); // Latin1 is ISO 8859, which is the default character set of DICOM (PS 3.5-2008, Page 18)
 }
 
-QString ctkDICOMDataset::GetAllElementValuesAsString( const DcmTag& tag ) const
+QString ctkDICOMItem::GetAllElementValuesAsString( const DcmTag& tag ) const
 {
   this->EnsureDcmDataSetIsInitialized();
 
@@ -445,7 +445,7 @@ QString ctkDICOMDataset::GetAllElementValuesAsString( const DcmTag& tag ) const
   for (unsigned long i = 0; i < count; ++i)
   {
     OFString s;
-    if ( CheckCondition( const_cast<ctkDICOMDataset*>(this)->findAndGetOFString(tag, s, i) ) )
+    if ( CheckCondition( const_cast<ctkDICOMItem*>(this)->findAndGetOFString(tag, s, i) ) )
     {
       qsl << Decode( tag, s );
     }
@@ -455,7 +455,7 @@ QString ctkDICOMDataset::GetAllElementValuesAsString( const DcmTag& tag ) const
 }
 
 
-QString ctkDICOMDataset::GetElementAsString( const DcmTag& tag, unsigned long pos ) const
+QString ctkDICOMItem::GetElementAsString( const DcmTag& tag, unsigned long pos ) const
 {
   this->EnsureDcmDataSetIsInitialized();
 
@@ -470,7 +470,7 @@ QString ctkDICOMDataset::GetElementAsString( const DcmTag& tag, unsigned long po
   }
 }
 
-QStringList ctkDICOMDataset::GetElementAsStringList( const DcmTag& tag ) const
+QStringList ctkDICOMItem::GetElementAsStringList( const DcmTag& tag ) const
 {
   this->EnsureDcmDataSetIsInitialized();
   QStringList qsl;
@@ -488,7 +488,7 @@ QStringList ctkDICOMDataset::GetElementAsStringList( const DcmTag& tag ) const
   return qsl;
 }
 
-ctkDICOMPersonName ctkDICOMDataset::GetElementAsPersonName( const DcmTag& tag, unsigned long pos ) const
+ctkDICOMPersonName ctkDICOMItem::GetElementAsPersonName( const DcmTag& tag, unsigned long pos ) const
 {
   this->EnsureDcmDataSetIsInitialized();
   DcmElement* element(NULL);
@@ -518,7 +518,7 @@ ctkDICOMPersonName ctkDICOMDataset::GetElementAsPersonName( const DcmTag& tag, u
   }
 }
 
-ctkDICOMPersonNameList ctkDICOMDataset::GetElementAsPersonNameList( const DcmTag& tag ) const
+ctkDICOMPersonNameList ctkDICOMItem::GetElementAsPersonNameList( const DcmTag& tag ) const
 {
   this->EnsureDcmDataSetIsInitialized();
   ctkDICOMPersonNameList qpnl;
@@ -536,7 +536,7 @@ ctkDICOMPersonNameList ctkDICOMDataset::GetElementAsPersonNameList( const DcmTag
   return qpnl;
 }
 
-QDate ctkDICOMDataset::GetElementAsDate( const DcmTag& tag, unsigned long pos ) const
+QDate ctkDICOMItem::GetElementAsDate( const DcmTag& tag, unsigned long pos ) const
 {
   this->EnsureDcmDataSetIsInitialized();
   DcmElement* element(NULL);
@@ -558,7 +558,7 @@ QDate ctkDICOMDataset::GetElementAsDate( const DcmTag& tag, unsigned long pos )
   }
 }
 
-QTime ctkDICOMDataset::GetElementAsTime( const DcmTag& tag, unsigned long pos ) const
+QTime ctkDICOMItem::GetElementAsTime( const DcmTag& tag, unsigned long pos ) const
 {
   this->EnsureDcmDataSetIsInitialized();
   DcmElement* element(NULL);
@@ -580,7 +580,7 @@ QTime ctkDICOMDataset::GetElementAsTime( const DcmTag& tag, unsigned long pos )
   }
 }
 
-QDateTime ctkDICOMDataset::GetElementAsDateTime( const DcmTag& tag, unsigned long pos ) const
+QDateTime ctkDICOMItem::GetElementAsDateTime( const DcmTag& tag, unsigned long pos ) const
 {
   this->EnsureDcmDataSetIsInitialized();
   DcmElement* element(NULL);
@@ -602,9 +602,9 @@ QDateTime ctkDICOMDataset::GetElementAsDateTime( const DcmTag& tag, unsigned lon
   }
 }
 
-double ctkDICOMDataset::GetElementAsDouble( const DcmTag& tag, unsigned long pos ) const
+double ctkDICOMItem::GetElementAsDouble( const DcmTag& tag, unsigned long pos ) const
 {
-  Q_D(const ctkDICOMDataset);
+  Q_D(const ctkDICOMItem);
   this->EnsureDcmDataSetIsInitialized();
   DcmElement* element(NULL);
   findAndGetElement(tag, element);
@@ -628,9 +628,9 @@ double ctkDICOMDataset::GetElementAsDouble( const DcmTag& tag, unsigned long pos
   return dvalue;
 }
 
-long ctkDICOMDataset::GetElementAsInteger( const DcmTag& tag, unsigned long pos ) const
+long ctkDICOMItem::GetElementAsInteger( const DcmTag& tag, unsigned long pos ) const
 {
-  Q_D(const ctkDICOMDataset);
+  Q_D(const ctkDICOMItem);
   this->EnsureDcmDataSetIsInitialized();
   DcmElement* element(NULL);
   findAndGetElement(tag, element);
@@ -655,7 +655,7 @@ long ctkDICOMDataset::GetElementAsInteger( const DcmTag& tag, unsigned long pos
   return i;
 }
 
-int ctkDICOMDataset::GetElementAsSignedShort( const DcmTag& tag, unsigned long pos ) const // type SS
+int ctkDICOMItem::GetElementAsSignedShort( const DcmTag& tag, unsigned long pos ) const // type SS
 {
   this->EnsureDcmDataSetIsInitialized();
   DcmElement* element(NULL);
@@ -671,7 +671,7 @@ int ctkDICOMDataset::GetElementAsSignedShort( const DcmTag& tag, unsigned long p
   return i;
 }
 
-int ctkDICOMDataset::GetElementAsUnsignedShort( const DcmTag& tag, unsigned long pos ) const // type US
+int ctkDICOMItem::GetElementAsUnsignedShort( const DcmTag& tag, unsigned long pos ) const // type US
 {
   this->EnsureDcmDataSetIsInitialized();
   DcmElement* element(NULL);
@@ -687,15 +687,15 @@ int ctkDICOMDataset::GetElementAsUnsignedShort( const DcmTag& tag, unsigned long
   return i;
 }
 
-bool ctkDICOMDataset::SetElementAsString( const DcmTag& tag, QString string )
+bool ctkDICOMItem::SetElementAsString( const DcmTag& tag, QString string )
 {
-  Q_D(ctkDICOMDataset);
+  Q_D(ctkDICOMItem);
   this->EnsureDcmDataSetIsInitialized();
   // TODO: Evaluate DICOM tag for proper encoding (see GetElementAsString())
-  return CheckCondition( d->m_DcmDataset->putAndInsertString( tag, string.toLatin1().data() ) );
+  return CheckCondition( d->m_DcmItem->putAndInsertString( tag, string.toLatin1().data() ) );
 }
 
-bool ctkDICOMDataset::SetElementAsStringList( const DcmTag& /*tag*/, QStringList /*stringList*/ )
+bool ctkDICOMItem::SetElementAsStringList( const DcmTag& /*tag*/, QStringList /*stringList*/ )
 {
   this->EnsureDcmDataSetIsInitialized();
   // TODO: Find out how this can be implemented with DcmDataset methods; there is no method for
@@ -703,9 +703,9 @@ bool ctkDICOMDataset::SetElementAsStringList( const DcmTag& /*tag*/, QStringList
   return false;
 }
 
-bool ctkDICOMDataset::SetElementAsPersonName( const DcmTag& tag, ctkDICOMPersonName personName )
+bool ctkDICOMItem::SetElementAsPersonName( const DcmTag& tag, ctkDICOMPersonName personName )
 {
-  Q_D(ctkDICOMDataset);
+  Q_D(ctkDICOMItem);
   this->EnsureDcmDataSetIsInitialized();
   DcmPersonName* dcmPersonName = new DcmPersonName( tag ); // TODO leak?
 
@@ -716,13 +716,13 @@ bool ctkDICOMDataset::SetElementAsPersonName( const DcmTag& tag, ctkDICOMPersonN
     Encode( tag, personName.namePrefix() ),
     Encode( tag, personName.nameSuffix() ) ) ) )
   {
-    return CheckCondition( d->m_DcmDataset->insert( dcmPersonName ) );
+    return CheckCondition( d->m_DcmItem->insert( dcmPersonName ) );
   }
 
   return false;
 }
 
-bool ctkDICOMDataset::SetElementAsPersonNameList( const DcmTag& tag, ctkDICOMPersonNameList personNameList )
+bool ctkDICOMItem::SetElementAsPersonNameList( const DcmTag& tag, ctkDICOMPersonNameList personNameList )
 {
   Q_UNUSED(tag);
   Q_UNUSED(personNameList);
@@ -732,39 +732,39 @@ bool ctkDICOMDataset::SetElementAsPersonNameList( const DcmTag& tag, ctkDICOMPer
   return false;
 }
 
-bool ctkDICOMDataset::SetElementAsDate( const DcmTag& tag, QDate date )
+bool ctkDICOMItem::SetElementAsDate( const DcmTag& tag, QDate date )
 {
-  Q_D(ctkDICOMDataset);
+  Q_D(ctkDICOMItem);
   this->EnsureDcmDataSetIsInitialized();
   OFDate ofDate( date.year(), date.month(), date.day() );
   DcmDate* dcmDate = new DcmDate( tag ); // TODO leak?
 
   if ( CheckCondition( dcmDate->setOFDate( ofDate ) ) )
   {
-    return CheckCondition( d->m_DcmDataset->insert( dcmDate ) );
+    return CheckCondition( d->m_DcmItem->insert( dcmDate ) );
   }
 
   return false;
 }
 
-bool ctkDICOMDataset::SetElementAsTime( const DcmTag& tag, QTime time )
+bool ctkDICOMItem::SetElementAsTime( const DcmTag& tag, QTime time )
 {
-  Q_D(ctkDICOMDataset);
+  Q_D(ctkDICOMItem);
   this->EnsureDcmDataSetIsInitialized();
   OFTime ofTime( time.hour(), time.minute(), time.second() );
   DcmTime* dcmTime = new DcmTime( tag ); // TODO leak?
 
   if ( CheckCondition( dcmTime->setOFTime( ofTime ) ) )
   {
-    return CheckCondition( d->m_DcmDataset->insert( dcmTime ) );
+    return CheckCondition( d->m_DcmItem->insert( dcmTime ) );
   }
 
   return false;
 }
 
-bool ctkDICOMDataset::SetElementAsDateTime( const DcmTag& tag, QDateTime dateTime )
+bool ctkDICOMItem::SetElementAsDateTime( const DcmTag& tag, QDateTime dateTime )
 {
-  Q_D(ctkDICOMDataset);
+  Q_D(ctkDICOMItem);
   this->EnsureDcmDataSetIsInitialized();
   QDate date = dateTime.date();
   QTime time = dateTime.time();
@@ -775,52 +775,52 @@ bool ctkDICOMDataset::SetElementAsDateTime( const DcmTag& tag, QDateTime dateTim
 
   if ( CheckCondition( dcmDateTime->setOFDateTime( ofDateTime ) ) )
   {
-    return CheckCondition( d->m_DcmDataset->insert( dcmDateTime ) );
+    return CheckCondition( d->m_DcmItem->insert( dcmDateTime ) );
   }
 
   return false;
 }
 
-bool ctkDICOMDataset::SetElementAsInteger( const DcmTag& tag, long value, unsigned long pos )
+bool ctkDICOMItem::SetElementAsInteger( const DcmTag& tag, long value, unsigned long pos )
 {
-  Q_D(ctkDICOMDataset);
+  Q_D(ctkDICOMItem);
   this->EnsureDcmDataSetIsInitialized();
   //std::cerr << "TagVR: " << TagVR( tag ).toStdString() << std::endl;
-  return CheckCondition( d->m_DcmDataset->putAndInsertSint32( tag, value, pos ) );
+  return CheckCondition( d->m_DcmItem->putAndInsertSint32( tag, value, pos ) );
 }
 
-bool ctkDICOMDataset::SetElementAsSignedShort( const DcmTag& tag, int value, unsigned long pos )
+bool ctkDICOMItem::SetElementAsSignedShort( const DcmTag& tag, int value, unsigned long pos )
 {
-  Q_D(ctkDICOMDataset);
+  Q_D(ctkDICOMItem);
   this->EnsureDcmDataSetIsInitialized();
   //std::cerr << "TagVR: " << TagVR( tag ).toStdString() << std::endl;
-  return CheckCondition( d->m_DcmDataset->putAndInsertSint16( tag, value, pos ) );
+  return CheckCondition( d->m_DcmItem->putAndInsertSint16( tag, value, pos ) );
 }
 
-bool ctkDICOMDataset::SetElementAsUnsignedShort( const DcmTag& tag, int value, unsigned long pos )
+bool ctkDICOMItem::SetElementAsUnsignedShort( const DcmTag& tag, int value, unsigned long pos )
 {
-  Q_D(ctkDICOMDataset);
+  Q_D(ctkDICOMItem);
   this->EnsureDcmDataSetIsInitialized();
   //std::cerr << "TagVR: " << TagVR( tag ).toStdString() << std::endl;
-  return CheckCondition( d->m_DcmDataset->putAndInsertUint16( tag, value, pos ) );
+  return CheckCondition( d->m_DcmItem->putAndInsertUint16( tag, value, pos ) );
 }
 
-QString ctkDICOMDataset::GetStudyInstanceUID() const
+QString ctkDICOMItem::GetStudyInstanceUID() const
 {
   return this->GetElementAsString(DCM_StudyInstanceUID);
 }
 
-QString ctkDICOMDataset::GetSeriesInstanceUID() const
+QString ctkDICOMItem::GetSeriesInstanceUID() const
 {
   return this->GetElementAsString(DCM_SeriesInstanceUID);
 }
 
-QString ctkDICOMDataset::GetSOPInstanceUID() const
+QString ctkDICOMItem::GetSOPInstanceUID() const
 {
   return this->GetElementAsString(DCM_SOPInstanceUID);
 }
 
-QString ctkDICOMDataset::TranslateDefinedTermPatientPosition( const QString& dt )
+QString ctkDICOMItem::TranslateDefinedTermPatientPosition( const QString& dt )
 {
   static bool initialized = false;
   static QMap<QString, QString> descriptionOfTerms;
@@ -848,7 +848,7 @@ QString ctkDICOMDataset::TranslateDefinedTermPatientPosition( const QString& dt
   }
 }
 
-QString ctkDICOMDataset::TranslateDefinedTermModality( const QString& dt )
+QString ctkDICOMItem::TranslateDefinedTermModality( const QString& dt )
 {
   static bool initialized = false;
   static QMap<QString, QString> descriptionOfTerms;
@@ -934,12 +934,12 @@ QString ctkDICOMDataset::TranslateDefinedTermModality( const QString& dt )
   }
 }
 
-QString ctkDICOMDataset::TagKey( const DcmTag& tag )
+QString ctkDICOMItem::TagKey( const DcmTag& tag )
 {
   return QString("(%1,%2)").arg( tag.getGroup(), 4, 16, QLatin1Char('0')).arg( tag.getElement(), 4, 16, QLatin1Char('0') );
 }
 
-QString ctkDICOMDataset::TagDescription( const DcmTag& tag )
+QString ctkDICOMItem::TagDescription( const DcmTag& tag )
 {
   if (!dcmDataDict.isDictionaryLoaded())
     return QString("<no DICOM dictionary loaded. application broken>");
@@ -954,7 +954,7 @@ QString ctkDICOMDataset::TagDescription( const DcmTag& tag )
   return returnName;
 }
 
-QString ctkDICOMDataset::TagVR( const DcmTag& tag )
+QString ctkDICOMItem::TagVR( const DcmTag& tag )
 {
   if (!dcmDataDict.isDictionaryLoaded()) return QString("<no DICOM dictionary loaded. application broken>");
   const DcmDataDictionary& globalDataDict = dcmDataDict.rdlock();
@@ -968,23 +968,28 @@ QString ctkDICOMDataset::TagVR( const DcmTag& tag )
   return returnVR;
 }
 
-QString ctkDICOMDataset::GetStoredSerialization()
+QString ctkDICOMItem::GetStoredSerialization()
 {
   throw std::runtime_error("No serialization implemented for this object!");
 }
 
 
 
-void ctkDICOMDataset::SetStoredSerialization(QString serializedDataset)
+void ctkDICOMItem::SetStoredSerialization(QString serializedDataset)
 {
   Q_UNUSED(serializedDataset);
   throw std::runtime_error("No serialization implemented for this object!");
 }
 
-bool ctkDICOMDataset::SaveToFile(const QString& filePath) const
+bool ctkDICOMItem::SaveToFile(const QString& filePath) const
 {
-  Q_D(const ctkDICOMDataset);
-  DcmFileFormat* fileformat = new DcmFileFormat ( d->m_DcmDataset );
+  Q_D(const ctkDICOMItem);
+
+  if (! dynamic_cast<DcmDataset*>(d->m_DcmItem) )
+  {
+    return false;
+  }
+  DcmFileFormat* fileformat = new DcmFileFormat ( dynamic_cast<DcmDataset*>(d->m_DcmItem) );
   OFCondition status = fileformat->saveFile ( qPrintable(QDir::toNativeSeparators( filePath)) );
   delete fileformat;
   return status.good();

+ 264 - 0
Libs/DICOM/Core/ctkDICOMItem.h

@@ -0,0 +1,264 @@
+/*=========================================================================
+
+  Library:   CTK
+
+  Copyright (c) Mint Medical GmbH
+
+  Licensed under the Apache License, Version 2.0 (the "License");
+  you may not use this file except in compliance with the License.
+  You may obtain a copy of the License at
+
+      http://www.apache.org/licenses/LICENSE-2.0.txt
+
+  Unless required by applicable law or agreed to in writing, software
+  distributed under the License is distributed on an "AS IS" BASIS,
+  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  See the License for the specific language governing permissions and
+  limitations under the License.
+
+=========================================================================*/
+
+#ifndef __ctkDICOMItem_h
+#define __ctkDICOMItem_h
+
+#include "ctkDICOMCoreExport.h"
+
+#include "ctkDICOMPersonName.h"
+
+#include <dcdatset.h> // DCMTK DcmDataset
+
+#include <QtCore>
+
+class DcmDataDictionary;
+
+
+class ctkDICOMItemPrivate;
+
+/// \ingroup DICOM_Core
+///
+///  \brief Base class for DICOM objects and interface with DICOM toolkit DCMTK.
+///
+///  This class serves as the base class for all DICOM objects (patient, study, series, image).
+///
+///  The class is derived from DcmDataset, the data type that is used by the DICOM toolkit when
+///  reading an image file or formulating a message request or receiving a message response (e.g. C-FIND).
+///
+///  Basically it offers a lot of convenience methods for subclasses to read and write DICOM attributes
+///  using Qt types. It is the subclasses responsibility to use the correct data types as defined in DICOM.
+///
+///  \note ONLY the Get.. methods should be used to access the internal dataset.
+///
+///  When reading string type attributes (LO, LT, PN, SH, ST, UT), we consider the "specific character set"
+///  tag and decode the stored string using the correct encoding (using Qt methods). This allows to
+///  display e.g. person names written in arabic, hebrew, greek, russian, etc. letters.
+///
+///  \warning Right now, asian phonetic strings cause problems. We have to learn the concept.
+///  \warning Helpers for writing DICOM attributes are not yet implemented. Implementation is straightforward though and can be done when necessary.
+///  \warning DateTime objects ignore the timezone at the moment. This is however of secondary importance.
+///
+///  A subclass could possibly want to store the internal DcmDataset.
+///  For this purpose, the internal DcmDataset is serialized into a memory buffer using DcmDataset::write(..). This buffer
+///  is stored in a base64 encoded string. For deserialization we decode the string and use DcmDataset::read(..).
+class ctkDICOMItem;
+
+typedef ctkDICOMItem ctkDICOMItem;
+
+class CTK_DICOM_CORE_EXPORT ctkDICOMItem
+{
+public:
+    typedef QObject Superclass;
+    ///
+    /// \brief Create an empty object. This has to be initialized by one of
+    /// the InitializeFrom... methods before it can be used.
+    ///
+    /// @param strictErrorHandling If set to false (the default) only critical errors throw exceptions.
+    ctkDICOMItem(bool strictErrorHandling = false);
+    virtual ~ctkDICOMItem();
+
+    /// \brief For initialization from a DcmDataset in a constructor / assignment.
+    ///
+    /// This method should be overwritten by all derived classes. It should
+    /// be called from the constructor or assignment operators when the class
+    /// should copy information from a DcmDataset object.
+
+    /// \warning Derived classes must call PDICOMDataset::InitializeFromDataset(...) to correctly copy encoding information.
+    virtual void InitializeFromItem(DcmItem* dataset, bool takeOwnership = false);
+
+    ///
+    /// \brief For initialization from file in a constructor / assignment.
+    ///
+    virtual void InitializeFromFile(const QString& filename,
+                    const E_TransferSyntax readXfer = EXS_Unknown,
+                    const E_GrpLenEncoding groupLength = EGL_noChange,
+                    const Uint32 maxReadLength = DCM_MaxReadLength,
+                    const E_FileReadMode readMode = ERM_autoDetect);
+
+
+
+    /// \brief Save dataset to file
+    ///
+    /// \returns true on success.
+    bool SaveToFile(const QString& filePath) const;
+
+
+    /// \brief Store a string representation of the object to a database field.
+    ///
+    /// The internal DcmDataset is serialized into a memory buffer using DcmDataset::write(..).
+    /// To store the memory buffer in a simple string database field, we convert it to a base64 encoded string.
+    /// Doing so prevents errors from encoding conversions that could be made by QString or the database etc.
+    void Serialize();
+
+    /// \brief Restore the object from a string representation in a database field.
+    ///
+    /// The database stored string is base64 decoded into a memory buffer. Then
+    /// the internal DcmDataset is created using DcmDataset::read(..).
+    void Deserialize();
+
+
+    /// \brief To be called from InitializeData, flags status as dirty.
+    ///
+    /// This is to allow data to be read as late as possible. All the
+    /// Get/SetElement... methods ensure initialization, which checks this flag.
+    void MarkForInitialization();
+
+
+    /// \brief Is this dataset initialized ?
+    bool IsInitialized() const;
+
+    ///
+    /// \brief Called by all Get/Set methods to initialize DcmDataSet if needed.
+    ///
+    void EnsureDcmDataSetIsInitialized() const;
+
+
+    /// \brief Find element in dataset and copy it into internal DcmDataset
+    ///
+    /// Attribute types 1, 1C, 2, 2C, 3 as defined in DICOM can be encoded as
+    /// hex values 0x1, 0x1C, 0x2, 0x2C, 0x3.
+    ///
+    /// Conditional attributes are considered MUST attributes. The calling
+    /// function shall test the conditions before calling CopyElement
+    /// (since conditions might be complex).
+    bool CopyElement( DcmDataset* dataset, const DcmTagKey& tag, int type );
+
+    /// \brief creates a QString from the OFString, respecting the "specific character set" of the Dataset.
+    ///
+    /// This method checks if the dataset has an attribute "specific character set".
+    /// If so, all attributes of types Long String (LO), Long Text (LT), Person Name (PN), Short String (SH),
+    /// Short Text (ST), Unlimited Text (UT) should be interpreted as encoded with a special set.
+    ///
+    /// See implementation for details.
+    QString Decode(const DcmTag& tag, const OFString& raw) const;
+
+    /// \brief creates an OFString from the QtString
+    ///
+    /// \warning The method currently assumes that the encoding of the passed string if latin1 and converts
+    /// it accordingly. The passed DICOM tag is not yet evaluated to determine the actual encoding type.
+    OFString Encode(const DcmTag& tag, const QString& qstring) const;
+
+    ///
+    /// \brief A const-correct version of DcmDataset::findAndGetElement.
+    ///
+    OFCondition findAndGetElement(const DcmTag& tag, DcmElement*& element, const OFBool searchIntoSub=OFFalse) const; // DCMTK is not const-correct
+
+    ///
+    ///  \brief A const-correct version of DcmDataset::findAndGetOFString.
+    ///
+    OFCondition findAndGetOFString(const DcmTag& tag, OFString& value, const unsigned long pos = 0, const OFBool searchIntoSub=OFFalse) const; // DCMTK is not const-correct
+
+    static bool CheckCondition(const OFCondition&);
+
+    ///
+    /// \brief Get-methods for for all subtypes of DcmByteString
+    ///
+    QString          GetAllElementValuesAsString( const DcmTag& tag ) const;
+    QString                   GetElementAsString( const DcmTag& tag, unsigned long pos = 0 ) const;
+    QStringList           GetElementAsStringList( const DcmTag& tag ) const;
+    ctkDICOMPersonName           GetElementAsPersonName( const DcmTag& tag, unsigned long pos = 0 ) const;
+    ctkDICOMPersonNameList   GetElementAsPersonNameList( const DcmTag& tag ) const;
+    QDate                       GetElementAsDate( const DcmTag& tag, unsigned long pos = 0 ) const;
+    QTime                       GetElementAsTime( const DcmTag& tag, unsigned long pos = 0 ) const;
+    double                    GetElementAsDouble( const DcmTag& tag, unsigned long pos = 0 ) const; // type DS
+    long                     GetElementAsInteger( const DcmTag& tag, unsigned long pos = 0 ) const; // type IS
+    int                  GetElementAsSignedShort( const DcmTag& tag, unsigned long pos = 0 ) const; // type SS
+    int                GetElementAsUnsignedShort( const DcmTag& tag, unsigned long pos = 0 ) const; // type US
+
+    ///
+    /// \warning IGNORES TIME ZONE at the moment!
+    ///
+    QDateTime       GetElementAsDateTime( const DcmTag& tag, unsigned long pos = 0 ) const;
+
+
+    ///
+    /// \brief Set-methods for for all subtypes of DcmByteString
+    ///
+    bool SetElementAsString( const DcmTag& tag, QString string );
+    bool SetElementAsStringList( const DcmTag& tag, QStringList stringList ); //> Currently not implemented
+    bool SetElementAsPersonName( const DcmTag& tag, ctkDICOMPersonName personName );
+    bool SetElementAsPersonNameList( const DcmTag& tag, ctkDICOMPersonNameList personNameList ); //> Currently not implemented
+    bool SetElementAsDate( const DcmTag& tag, QDate date );
+    bool SetElementAsTime( const DcmTag& tag, QTime time );
+    bool SetElementAsDateTime( const DcmTag& tag, QDateTime dateTime );
+    bool SetElementAsInteger( const DcmTag& tag, long value, unsigned long pos = 0 ); // type IS
+    bool SetElementAsSignedShort( const DcmTag& tag, int value, unsigned long pos = 0 ); // type SS
+    bool SetElementAsUnsignedShort( const DcmTag& tag, int value, unsigned long pos = 0 ); // type US
+
+
+    /// Some convenience getter
+    QString GetStudyInstanceUID() const;
+    QString GetSeriesInstanceUID() const;
+    QString GetSOPInstanceUID() const;
+
+    ///
+    /// \brief Get a human-readable version of patient position enumerations used e.g. in DICOM series.
+    ///
+    static QString TranslateDefinedTermPatientPosition( const QString& dt );
+
+    ///
+    /// \brief Get a human-readable version of modality enumerations used e.g. in DICOM series.
+    ///
+    static QString TranslateDefinedTermModality( const QString& dt );
+
+    ///
+    /// \brief Nicely formatted (group,element) version of a tag
+    ///
+    static QString TagKey( const DcmTag& tag );
+
+    ///
+    /// \brief Description (name) of the tag
+    ///
+    static QString TagDescription( const DcmTag& tag );
+
+    ///
+    /// \brief Value Representation
+    ///
+    static QString TagVR( const DcmTag& tag );
+
+protected:
+
+    ///
+    /// \brief Callback for retrieving a serialized version of this class
+    ///
+    /// You can override this method in a subclass to retrieve a serialized
+    /// version of the object from some storage mechanism, eg a database
+    ///
+    virtual QString GetStoredSerialization();
+
+    ///
+    /// \brief Callback for storing a serialized version of this class
+    ///
+    /// You can override this method in a subclass to store a serialized
+    /// version of the object to some storage mechanism, eg a database
+    ///
+    virtual void SetStoredSerialization(QString serializedDataset);
+
+  QScopedPointer<ctkDICOMItemPrivate> d_ptr;
+
+  DcmItem& GetDcmItem() const;
+
+private:
+  Q_DECLARE_PRIVATE(ctkDICOMItem);
+};
+
+#endif
+

+ 3 - 3
Libs/DICOM/Widgets/CMakeLists.txt

@@ -11,14 +11,14 @@ set(KIT_export_directive "CTK_DICOM_WIDGETS_EXPORT")
 set(KIT_SRCS
   ctkDICOMAppWidget.cpp
   ctkDICOMAppWidget.h
-  ctkDICOMDatasetView.cpp
-  ctkDICOMDatasetView.h
   ctkDICOMDirectoryListWidget.cpp
   ctkDICOMDirectoryListWidget.h
   ctkDICOMImage.cpp
   ctkDICOMImage.h
   ctkDICOMImportWidget.cpp
   ctkDICOMImportWidget.h
+  ctkDICOMItemView.cpp
+  ctkDICOMItemView.h
   ctkDICOMListenerWidget.cpp
   ctkDICOMListenerWidget.h
   ctkDICOMQueryResultsTabWidget.cpp
@@ -38,7 +38,7 @@ set(KIT_SRCS
 # Headers that should run through moc
 set(KIT_MOC_SRCS
   ctkDICOMAppWidget.h
-  ctkDICOMDatasetView.h
+  ctkDICOMItemView.h
   ctkDICOMDirectoryListWidget.h
   ctkDICOMImage.h
   ctkDICOMImportWidget.h

+ 3 - 3
Libs/DICOM/Widgets/Resources/UI/ctkDICOMAppWidget.ui

@@ -419,7 +419,7 @@
          </layout>
         </item>
         <item>
-         <widget class="ctkDICOMDatasetView" name="ImagePreview" native="true">
+         <widget class="ctkDICOMItemView" name="ImagePreview" native="true">
           <property name="sizePolicy">
            <sizepolicy hsizetype="Minimum" vsizetype="Expanding">
             <horstretch>0</horstretch>
@@ -543,9 +543,9 @@
    <container>1</container>
   </customwidget>
   <customwidget>
-   <class>ctkDICOMDatasetView</class>
+   <class>ctkDICOMItemView</class>
    <extends>QWidget</extends>
-   <header location="global">ctkDICOMDatasetView.h</header>
+   <header location="global">ctkDICOMItemView.h</header>
    <container>1</container>
   </customwidget>
  </customwidgets>

+ 2 - 2
Libs/DICOM/Widgets/Testing/Cpp/CMakeLists.txt

@@ -2,7 +2,7 @@ set(KIT ${PROJECT_NAME})
 
 create_test_sourcelist(Tests ${KIT}CppTests.cpp
   ctkDICOMAppWidgetTest1.cpp
-  ctkDICOMDatasetViewTest1.cpp
+  ctkDICOMItemViewTest1.cpp
   ctkDICOMDirectoryListWidgetTest1.cpp
   ctkDICOMImageTest1.cpp
   ctkDICOMImportWidgetTest1.cpp
@@ -26,7 +26,7 @@ target_link_libraries(${KIT}CppTests ${LIBRARY_NAME})
 # Add Tests
 #
 
-SIMPLE_TEST(ctkDICOMAppWidgetTest1 ${CTKData_DIR}/Data/DICOM/MRHEAD)
+SIMPLE_TEST(ctkDICOMAppWidgetTest1)
 SIMPLE_TEST(ctkDICOMDatasetViewTest1 ${CTKData_DIR}/Data/DICOM/MRHEAD/000055.IMA)
 SIMPLE_TEST(ctkDICOMDirectoryListWidgetTest1)
 SIMPLE_TEST(ctkDICOMImageTest1 ${CTKData_DIR}/Data/DICOM/MRHEAD/000055.IMA)

+ 5 - 5
Libs/DICOM/Widgets/Testing/Cpp/ctkDICOMDatasetViewTest1.cpp

@@ -25,7 +25,7 @@
 #include <QTimer>
 
 // ctkDICOMCore includes
-#include "ctkDICOMDatasetView.h"
+#include "ctkDICOMItemView.h"
 
 // DCMTK includes
 #include <dcmimage.h>
@@ -34,15 +34,15 @@
 #include <iostream>
 
 /* Test from build directory:
- ./CTK-build/bin/CTKDICOMWidgetsCxxTests ctkDICOMDatasetViewTest1 test.db ../CTK/Libs/DICOM/Core/Resources/dicom-sample.sql
+ ./CTK-build/bin/CTKDICOMWidgetsCxxTests ctkDICOMItemViewTest1 test.db ../CTK/Libs/DICOM/Core/Resources/dicom-sample.sql
 */
 
-int ctkDICOMDatasetViewTest1( int argc, char * argv [] )
+int ctkDICOMItemViewTest1( int argc, char * argv [] )
 {
   QApplication app(argc, argv);
   if (argc < 2)
     {
-    std::cerr << "Usage: ctkDICOMDatasetViewTest1 dcmimage [-I]" << std::endl;
+    std::cerr << "Usage: ctkDICOMItemViewTest1 dcmimage [-I]" << std::endl;
     return EXIT_FAILURE;
     }
   
@@ -50,7 +50,7 @@ int ctkDICOMDatasetViewTest1( int argc, char * argv [] )
   QImage image;
   QImage image2(200, 200, QImage::Format_RGB32);
   
-  ctkDICOMDatasetView datasetView;
+  ctkDICOMItemView datasetView;
   datasetView.addImage(img);
   datasetView.addImage(image);
   datasetView.addImage(image2);

+ 45 - 45
Libs/DICOM/Widgets/ctkDICOMDatasetView.cpp

@@ -33,7 +33,7 @@
 #include "ctkDICOMModel.h"
 
 // ctkDICOMWidgets includex
-#include "ctkDICOMDatasetView.h"
+#include "ctkDICOMItemView.h"
 
 // Qt includes
 #include <QDebug>
@@ -46,17 +46,17 @@
 #include <QPainter>
 #include <QResizeEvent>
 
-static ctkLogger logger("org.commontk.DICOM.Widgets.ctkDICOMDatasetView");
+static ctkLogger logger("org.commontk.DICOM.Widgets.ctkDICOMItemView");
 
 //--------------------------------------------------------------------------
-class ctkDICOMDatasetViewPrivate 
+class ctkDICOMItemViewPrivate 
 {
 
-  Q_DECLARE_PUBLIC( ctkDICOMDatasetView );
+  Q_DECLARE_PUBLIC( ctkDICOMItemView );
 
 public:
 
-  ctkDICOMDatasetViewPrivate( ctkDICOMDatasetView& object );
+  ctkDICOMItemViewPrivate( ctkDICOMItemView& object );
 
   QString DatabaseDirectory;
   QModelIndex CurrentImageIndex;
@@ -75,23 +75,23 @@ public:
   void onImageModelSelected(const QModelIndex& index);
 
 protected:
-  ctkDICOMDatasetView* const q_ptr;
+  ctkDICOMItemView* const q_ptr;
 
 private:
-  Q_DISABLE_COPY( ctkDICOMDatasetViewPrivate );
+  Q_DISABLE_COPY( ctkDICOMItemViewPrivate );
 };
 
 //--------------------------------------------------------------------------
-ctkDICOMDatasetViewPrivate::ctkDICOMDatasetViewPrivate(
-  ctkDICOMDatasetView& object )
+ctkDICOMItemViewPrivate::ctkDICOMItemViewPrivate(
+  ctkDICOMItemView& object )
   : q_ptr( & object )
 {
 }
 
 //--------------------------------------------------------------------------
-void ctkDICOMDatasetViewPrivate::init()
+void ctkDICOMItemViewPrivate::init()
 {
-  Q_Q( ctkDICOMDatasetView );
+  Q_Q( ctkDICOMItemView );
 
   q->setMouseTracking(true);
 
@@ -111,8 +111,8 @@ void ctkDICOMDatasetViewPrivate::init()
 }
 
 // -------------------------------------------------------------------------
-void ctkDICOMDatasetViewPrivate::setImage(const QModelIndex &imageIndex, bool defaultIntensity){
-    Q_Q(ctkDICOMDatasetView);
+void ctkDICOMItemViewPrivate::setImage(const QModelIndex &imageIndex, bool defaultIntensity){
+    Q_Q(ctkDICOMItemView);
 
     ctkDICOMModel* model = const_cast<ctkDICOMModel*>(qobject_cast<const ctkDICOMModel*>(imageIndex.model()));
 
@@ -140,8 +140,8 @@ void ctkDICOMDatasetViewPrivate::setImage(const QModelIndex &imageIndex, bool de
 }
 
 // -------------------------------------------------------------------------
-void ctkDICOMDatasetViewPrivate::onPatientModelSelected(const QModelIndex &index){
-    Q_Q(ctkDICOMDatasetView);
+void ctkDICOMItemViewPrivate::onPatientModelSelected(const QModelIndex &index){
+    Q_Q(ctkDICOMItemView);
 
     ctkDICOMModel* model = const_cast<ctkDICOMModel*>(qobject_cast<const ctkDICOMModel*>(index.model()));
 
@@ -162,8 +162,8 @@ void ctkDICOMDatasetViewPrivate::onPatientModelSelected(const QModelIndex &index
 }
 
 // -------------------------------------------------------------------------
-void ctkDICOMDatasetViewPrivate::onStudyModelSelected(const QModelIndex &index){
-    Q_Q(ctkDICOMDatasetView);
+void ctkDICOMItemViewPrivate::onStudyModelSelected(const QModelIndex &index){
+    Q_Q(ctkDICOMItemView);
 
     ctkDICOMModel* model = const_cast<ctkDICOMModel*>(qobject_cast<const ctkDICOMModel*>(index.model()));
 
@@ -182,8 +182,8 @@ void ctkDICOMDatasetViewPrivate::onStudyModelSelected(const QModelIndex &index){
 }
 
 // -------------------------------------------------------------------------
-void ctkDICOMDatasetViewPrivate::onSeriesModelSelected(const QModelIndex &index){
-    Q_Q(ctkDICOMDatasetView);
+void ctkDICOMItemViewPrivate::onSeriesModelSelected(const QModelIndex &index){
+    Q_Q(ctkDICOMItemView);
 
     ctkDICOMModel* model = const_cast<ctkDICOMModel*>(qobject_cast<const ctkDICOMModel*>(index.model()));
 
@@ -200,8 +200,8 @@ void ctkDICOMDatasetViewPrivate::onSeriesModelSelected(const QModelIndex &index)
 }
 
 // -------------------------------------------------------------------------
-void ctkDICOMDatasetViewPrivate::onImageModelSelected(const QModelIndex &index){
-    Q_Q(ctkDICOMDatasetView);
+void ctkDICOMItemViewPrivate::onImageModelSelected(const QModelIndex &index){
+    Q_Q(ctkDICOMItemView);
 
     ctkDICOMModel* model = const_cast<ctkDICOMModel*>(qobject_cast<const ctkDICOMModel*>(index.model()));
 
@@ -219,53 +219,53 @@ void ctkDICOMDatasetViewPrivate::onImageModelSelected(const QModelIndex &index){
 }
 
 // -------------------------------------------------------------------------
-ctkDICOMDatasetView::ctkDICOMDatasetView( QWidget* _parent )
+ctkDICOMItemView::ctkDICOMItemView( QWidget* _parent )
   : Superclass( _parent ),
-    d_ptr( new ctkDICOMDatasetViewPrivate( *this ) )
+    d_ptr( new ctkDICOMItemViewPrivate( *this ) )
 {
-  Q_D( ctkDICOMDatasetView );
+  Q_D( ctkDICOMItemView );
   d->init();
 }
 
 // -------------------------------------------------------------------------
-ctkDICOMDatasetView::ctkDICOMDatasetView(
-  ctkDICOMDatasetViewPrivate& pvt,
+ctkDICOMItemView::ctkDICOMItemView(
+  ctkDICOMItemViewPrivate& pvt,
   QWidget* _parent)
   : Superclass(_parent), d_ptr(&pvt)
 {
-  Q_D(ctkDICOMDatasetView);
+  Q_D(ctkDICOMItemView);
   d->init();
 }
 
 // -------------------------------------------------------------------------
-ctkDICOMDatasetView::~ctkDICOMDatasetView()
+ctkDICOMItemView::~ctkDICOMItemView()
 {
 }
 
 // -------------------------------------------------------------------------
-void ctkDICOMDatasetView::setDatabaseDirectory(const QString &directory){
-    Q_D(ctkDICOMDatasetView);
+void ctkDICOMItemView::setDatabaseDirectory(const QString &directory){
+    Q_D(ctkDICOMItemView);
 
     d->DatabaseDirectory = directory;
 }
 
 // -------------------------------------------------------------------------
-QModelIndex ctkDICOMDatasetView::currentImageIndex(){
-    Q_D(ctkDICOMDatasetView);
+QModelIndex ctkDICOMItemView::currentImageIndex(){
+    Q_D(ctkDICOMItemView);
 
     return d->CurrentImageIndex;
 }
 
 // -------------------------------------------------------------------------
-void ctkDICOMDatasetView::addImage( const QImage & image )
+void ctkDICOMItemView::addImage( const QImage & image )
 {
   Superclass::addImage( image );
 }
 
 // -------------------------------------------------------------------------
-void ctkDICOMDatasetView::addImage( DicomImage & dcmImage, bool defaultIntensity )
+void ctkDICOMItemView::addImage( DicomImage & dcmImage, bool defaultIntensity )
 {
-    Q_D(ctkDICOMDatasetView);
+    Q_D(ctkDICOMItemView);
     QImage image;
     // Check whether we have a valid image
     EI_Status result = dcmImage.getStatus();
@@ -334,23 +334,23 @@ void ctkDICOMDatasetView::addImage( DicomImage & dcmImage, bool defaultIntensity
 }
 
 // -------------------------------------------------------------------------
-void ctkDICOMDatasetView::update( bool zoomChanged,
+void ctkDICOMItemView::update( bool zoomChanged,
   bool sizeChanged )
 {
   Superclass::update( zoomChanged, sizeChanged );
 }
 
 // -------------------------------------------------------------------------
-void ctkDICOMDatasetView::mousePressEvent(QMouseEvent* event){
-    Q_D(ctkDICOMDatasetView);
+void ctkDICOMItemView::mousePressEvent(QMouseEvent* event){
+    Q_D(ctkDICOMItemView);
 
     event->accept();
     d->OldMousePos = event->pos();
 }
 
 // -------------------------------------------------------------------------
-void ctkDICOMDatasetView::mouseMoveEvent(QMouseEvent* event){
-    Q_D(ctkDICOMDatasetView);
+void ctkDICOMItemView::mouseMoveEvent(QMouseEvent* event){
+    Q_D(ctkDICOMItemView);
 
     if(event->buttons() == Qt::RightButton){
         event->accept();
@@ -386,8 +386,8 @@ void ctkDICOMDatasetView::mouseMoveEvent(QMouseEvent* event){
 }
 
 // -------------------------------------------------------------------------
-void ctkDICOMDatasetView::onModelSelected(const QModelIndex &index){
-    Q_D(ctkDICOMDatasetView);
+void ctkDICOMItemView::onModelSelected(const QModelIndex &index){
+    Q_D(ctkDICOMItemView);
 
     ctkDICOMModel* model = const_cast<ctkDICOMModel*>(qobject_cast<const ctkDICOMModel*>(index.model()));
 
@@ -407,8 +407,8 @@ void ctkDICOMDatasetView::onModelSelected(const QModelIndex &index){
 }
 
 // -------------------------------------------------------------------------
-void ctkDICOMDatasetView::displayImage(int imageIndex){
-  Q_D(ctkDICOMDatasetView);
+void ctkDICOMItemView::displayImage(int imageIndex){
+  Q_D(ctkDICOMItemView);
 
   if(d->CurrentImageIndex.isValid())
     {
@@ -430,7 +430,7 @@ void ctkDICOMDatasetView::displayImage(int imageIndex){
 }
 
 // -------------------------------------------------------------------------
-void ctkDICOMDatasetView::emitImageDisplayedSignal(int imageID, int count){
+void ctkDICOMItemView::emitImageDisplayedSignal(int imageID, int count){
   emit imageDisplayed(imageID, count);
 }
 

+ 11 - 11
Libs/DICOM/Widgets/ctkDICOMDatasetView.h

@@ -18,8 +18,8 @@
 
 =========================================================================*/
 
-#ifndef __ctkDICOMDatasetView_h
-#define __ctkDICOMDatasetView_h
+#ifndef __ctkDICOMItemView_h
+#define __ctkDICOMItemView_h
 
 /// Qt includes
 #include <QWidget>
@@ -31,13 +31,13 @@
 #include "ctkPimpl.h"
 #include "ctkDICOMWidgetsExport.h"
 
-class ctkDICOMDatasetViewPrivate;
+class ctkDICOMItemViewPrivate;
 class DicomImage;
 
 /// \ingroup DICOM_Widgets
 ///
-/// ctkDICOMDatasetView is the base class of image viewer widgets.
-class CTK_DICOM_WIDGETS_EXPORT ctkDICOMDatasetView
+/// ctkDICOMItemView is the base class of image viewer widgets.
+class CTK_DICOM_WIDGETS_EXPORT ctkDICOMItemView
 : public ctkQImageView
 {
 
@@ -49,10 +49,10 @@ public:
   typedef ctkQImageView Superclass;
 
   /// Constructor
-  ctkDICOMDatasetView( QWidget * parent = 0 );
+  ctkDICOMItemView( QWidget * parent = 0 );
   
   /// Destructor
-  virtual ~ctkDICOMDatasetView( void );
+  virtual ~ctkDICOMItemView( void );
 
   void setDatabaseDirectory(const QString& directory);
 
@@ -80,7 +80,7 @@ public Q_SLOTS:
 protected:
 
   /// protected constructor to derive private implementations
-  ctkDICOMDatasetView( ctkDICOMDatasetViewPrivate & pvt,
+  ctkDICOMItemView( ctkDICOMItemViewPrivate & pvt,
     QWidget* parent=0 );
 
   /// re-implemented QWidget event functions
@@ -89,11 +89,11 @@ protected:
 
 private:
 
-  QScopedPointer< ctkDICOMDatasetViewPrivate > d_ptr;
+  QScopedPointer< ctkDICOMItemViewPrivate > d_ptr;
 
-  Q_DECLARE_PRIVATE( ctkDICOMDatasetView );
+  Q_DECLARE_PRIVATE( ctkDICOMItemView );
 
-  Q_DISABLE_COPY( ctkDICOMDatasetView );
+  Q_DISABLE_COPY( ctkDICOMItemView );
 
   void emitImageDisplayedSignal(int imageID, int count);
 

+ 3 - 3
Plugins/org.commontk.dah.core/ctkDicomAvailableDataHelper.cpp

@@ -23,7 +23,7 @@
 #include "ctkDicomAvailableDataHelper.h"
 #include "ctkDicomAvailableDataHelper.h"
 #include "ctkDicomObjectLocatorCache.h"
-#include <ctkDICOMDataset.h>
+#include <ctkDICOMItem.h>
 
 // DCMTK includes
 #include <dcmtk/dcmdata/dcdeftag.h>
@@ -206,7 +206,7 @@ bool addNonDICOMToAvailableData(ctkDicomAppHosting::AvailableData& data,
 
 bool addToAvailableData(ctkDicomAppHosting::AvailableData& data, 
                         ctkDicomObjectLocatorCache* objectLocatorCache, 
-                        const ctkDICOMDataset& dataset, 
+                        const ctkDICOMItem& dataset, 
                         long length, 
                         long offset, 
                         const QString& uri)
@@ -305,7 +305,7 @@ bool addToAvailableData(ctkDicomAppHosting::AvailableData& data,
       return addNonDICOMToAvailableData(data, objectLocatorCache, fileinfo.size(), 0, uri);
   }
   //this could be a DICOM file then
-  ctkDICOMDataset ctkdataset;
+  ctkDICOMItem ctkdataset;
   ctkdataset.InitializeFromFile(filename, EXS_Unknown, EGL_noChange, 400);
 
   return addToAvailableData(data, objectLocatorCache, ctkdataset, fileinfo.size(), 0, uri);

+ 3 - 3
Plugins/org.commontk.dah.core/ctkDicomAvailableDataHelper.h

@@ -33,7 +33,7 @@
 #include <ctkDicomAppHostingTypes.h>
 
 class ctkDicomObjectLocatorCache;
-class ctkDICOMDataset;
+class ctkDICOMItem;
 
 namespace ctkDicomAvailableDataHelper {
 
@@ -81,7 +81,7 @@ private:
 //----------------------------------------------------------------------------
 bool org_commontk_dah_core_EXPORT addToAvailableData(ctkDicomAppHosting::AvailableData& data, 
                         ctkDicomObjectLocatorCache* objectLocatorCache, 
-                        const ctkDICOMDataset& dataset, 
+                        const ctkDICOMItem& dataset, 
                         long length, 
                         long offset, 
                         const QString& uri);
@@ -94,7 +94,7 @@ bool org_commontk_dah_core_EXPORT addToAvailableData(ctkDicomAppHosting::Availab
 //----------------------------------------------------------------------------
 bool org_commontk_dah_core_EXPORT addNonDICOMToAvailableData(ctkDicomAppHosting::AvailableData& data, 
                         ctkDicomObjectLocatorCache* objectLocatorCache, 
-                        const ctkDICOMDataset& dataset, 
+                        const ctkDICOMItem& dataset, 
                         long length, 
                         long offset, 
                         const QString& uri);