00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014 #include "viewmode.h"
00015 #include "trapperconf.h"
00016 #include <qdom.h>
00017 #include <qstring.h>
00018 #include <qmessagebox.h>
00019 #include "trapperdoc.h"
00020 #include "generalmaker.h"
00021
00022 #include <iostream>
00023 using namespace std;
00024
00025
00026 Layer::Layer( const QDomElement & elem, SecItDict & secItDict )
00027 {
00028
00029 featureList.setAutoDelete( true );
00030
00031 QString heightStr = elem.attribute( "height","");
00032 height = heightStr.toInt();
00033
00034 QDomNode node = elem.firstChild();
00035 while ( !node.isNull() )
00036 {
00037 if ( node.isElement() && node.nodeName() == "feature" )
00038 {
00039 QDomElement featureElem = node.toElement();
00040
00041
00042 QString featureName = featureElem.attribute("name","");
00043
00044
00045
00046 Database::SecondaryIterator<FeatureData> * it = secItDict[featureName];
00047 if ( it )
00048 {
00049 featureList.prepend( it );
00050 }
00051 else
00052 {
00053 QMessageBox::warning(
00054 NULL, "Unknown feature specified",
00055 QString( "The feature \n\'%1\' specified in configuration file\n is not of unknown type." ).
00056 arg( featureName ),
00057 "&Ok" );
00058 }
00059 }
00060 node = node.nextSibling();
00061 }
00062 }
00063
00064 TR_PIX Layer::heightInPix( TR_PIX totalHeight )
00065 {
00066
00067
00068 TR_PIX res = ( int ) (( height * totalHeight )/ 100 );
00069
00070 return res;
00071 }
00072
00073 ViewMode::ViewMode( QDomElement & elem, SecItDict & secItDict)
00074 {
00075 layerList.setAutoDelete( true );
00076
00077
00078 m_name = elem.attribute("name","");
00079 Q_ASSERT((elem.hasAttribute("name") && elem.hasAttribute("zoom")));
00080 QString zoomStr = elem.attribute( "zoom","");
00081 zoom = zoomStr.toInt();
00082
00083
00084 QString shortcut = elem.attribute("shortcut", "");
00085
00086
00087
00088
00089 QDomNode node2 = elem.firstChild();
00090 while ( !node2.isNull() )
00091 {
00092 if ( node2.isElement() && node2.nodeName() == "layer" )
00093 {
00094 QDomElement layerElem = node2.toElement();
00095 Q_ASSERT((layerElem.hasAttribute("height") && layerElem.hasAttribute("allowOverlapStr")));
00096 layerList.append( new Layer( layerElem, secItDict ) );
00097 }
00098 node2 = node2.nextSibling();
00099 }
00100 }
00101
00102 QString ViewMode::name()
00103 {
00104 return m_name;
00105
00106 }
00107
00108
00109 ViewModes::ViewModes( const QString & viewMode, TrapperDoc * doc )
00110 {
00111 secItDict.setAutoDelete( true );
00112
00113
00114 m_currentViewMode = NULL;
00115 initFeatureIterators(doc);
00116 TrapperConf * conf = TrapperConf::instance();
00117 QDomElement confElem = conf->viewModeConf();
00118
00119 QDomNode node = confElem.firstChild();
00120 while ( !node.isNull() )
00121 {
00122 if ( node.isElement() && node.nodeName() == "modeView" )
00123 {
00124 QDomElement e = node.toElement();
00125 ViewMode * m = new ViewMode( e, secItDict );
00126 viewModeDict.insert( node.toElement().attribute("name",""), m );
00127 }
00128 node = node.nextSibling();
00129 }
00130 setMode(viewMode);
00131 }
00132
00133 void ViewModes::setMode(QString mode)
00134 {
00135 cerr<<"******************* mode: "<<mode<<endl;
00136 m_currentViewMode = viewModeDict[mode];
00137 Q_CHECK_PTR( m_currentViewMode );
00138 }
00139
00140
00141 ViewMode * ViewModes::currentViewMode()
00142 {
00143 return m_currentViewMode;
00144 }
00145 void ViewModes::initFeatureIterators( TrapperDoc * doc )
00146 {
00147 std::list< std::string > aList = GeneralMaker::listRegistered();
00148 for ( std::list< std::string >::iterator it = aList.begin(); it != aList.end(); ++it )
00149 {
00150 GeneralData * data = GeneralMaker::newData( *it );
00151 FeatureData * fdata = dynamic_cast<FeatureData *>( data );
00152
00153
00154 if ( fdata )
00155 {
00156
00157 Database::SecondaryIterator<FeatureData> * secIt =
00158 new Database::SecondaryIterator<FeatureData>( "readRecno", doc, it->c_str() );
00159 secItDict.insert(it->c_str(), secIt);
00160 }
00161
00162 delete data;
00163 data = NULL;
00164 }
00165 }
00166