GME  13
ItemData.cpp
Go to the documentation of this file.
00001 // ItemData.cpp: implementation of the CItemData class.
00002 //
00004 
00005 #include "stdafx.h"
00006 #include "CommonMath.h"
00007 #include "objectinspector.h"
00008 #include "ItemData.h"
00009 #include "MgaUtil.h"
00010 
00011 #ifdef _DEBUG
00012 #undef THIS_FILE
00013 static char THIS_FILE[]=__FILE__;
00014 #define new DEBUG_NEW
00015 #endif
00016 
00017 // Split Function
00018 void str_split( CString str, CStringArray &returnArray)
00019 {
00020    int  iNum     = 0;
00021    int  iCurrPos = 0;
00022    while( -1 != (iCurrPos = str.FindOneOf(_T("\n"))))
00023    {
00024        returnArray.Add(str.Left(iCurrPos));
00025        returnArray[iNum].TrimRight(_T("\r\n"));
00026        str = str.Right(str.GetLength() - iCurrPos - 1);
00027        iNum++;
00028    }
00029 
00030    if (str.GetLength() > 0)      // the last one...
00031    {
00032        returnArray.Add(str);
00033        returnArray[iNum].TrimRight(_T("\r\n"));
00034        iNum++;
00035    }
00036 }
00037 
00038 /*static*/ const TCHAR * CItemData::m_defFMTSTR = _T("%.12g");
00039 /*static*/ CString      CItemData::m_fmtStr    = _T("%.12g");
00041 // Construction/Destruction
00043 
00044 //static
00045 void CItemData::getRealFmtString()
00046 {
00047         CComPtr<IMgaRegistrar> registrar;
00048         try {
00049                 COMTHROW( registrar.CoCreateInstance(OLESTR("MGA.MgaRegistrar")) );
00050                 ASSERT( registrar != NULL );
00051 
00052                 CComBSTR bs_fmt_str;
00053                 COMTHROW( registrar->GetRealNmbFmtStr( REGACCESS_USER, &bs_fmt_str));
00054                 if( bs_fmt_str) 
00055                         CopyTo( bs_fmt_str, CItemData::m_fmtStr);
00056 
00057                 if( CItemData::m_fmtStr.IsEmpty())
00058                         CItemData::m_fmtStr = CItemData::m_defFMTSTR;
00059         } 
00060         catch (hresult_exception &) {
00061                 CItemData::m_fmtStr = CItemData::m_defFMTSTR;
00062         }
00063 }
00064 
00065 
00067 CListItem::CListItem()
00068 {
00069         bIsContainer=false;
00070         bIsContainerOpen=true;
00071         bIsDefault=false;
00072         bIsReadOnly=false;
00073         bIsDifferentValue=false;
00074         dwKeyValue=0;
00075 
00076 }
00077 
00078 CListItem::CListItem(CListItem& srcListItem)
00079 {
00080         // Calling operator=
00081         *this=srcListItem;
00082 }
00083 
00084 void CListItem:: operator =(const CListItem& srcListItem)
00085 {
00086         strName=srcListItem.strName;                    
00087         strToolTip=srcListItem.strToolTip;      
00088         strContentType=srcListItem.strContentType;
00089         bIsDefault=srcListItem.bIsDefault;
00090         bIsReadOnly=srcListItem.bIsReadOnly;
00091         bIsContainer=srcListItem.bIsContainer;
00092         bIsContainerOpen=srcListItem.bIsContainerOpen;
00093         bIsDifferentValue=srcListItem.bIsDifferentValue;
00094 
00095         dwKeyValue=srcListItem.dwKeyValue;
00096         dwUserData=srcListItem.dwUserData;
00097 
00098         m_ContainedListItemArray.Copy(srcListItem.m_ContainedListItemArray);
00099 
00100         // Values
00101         Value=srcListItem.Value;
00102         DefValue=srcListItem.DefValue;
00103 }
00104 
00105 
00106 void CListItem::RestoreDefault()
00107 {
00108         if(bIsContainer || bIsReadOnly)return;
00109 
00110         ASSERT(DefValue.dataType!=ITEMDATA_NULL);
00111 
00112         if(!bIsDefault)
00113         {
00114                 Value=DefValue;
00115                 bIsDefault=true;
00116         }
00117 }
00119 
00121 
00122 
00123 CItemData::CItemData()
00124 {       
00125         CommonInit();
00126 }
00127 
00128 CItemData::~CItemData()
00129 {
00130 
00131 }
00132 
00133 CItemData::CItemData(CItemData&srcItemData)
00134 {
00135         *this=srcItemData;
00136 }
00137 
00138 bool CItemData::Validate()
00139 {
00140         bool retVal=false;
00141         switch(dataType)
00142         {
00143                 case ITEMDATA_NULL:
00144                         {
00145                                 retVal=false;
00146                         }break;
00147                 case ITEMDATA_STRING:
00148                         {
00149                                 retVal=true;
00150                         }break;
00151                 case ITEMDATA_FIXED_LIST:
00152                         {
00153                                 retVal=(listVal<stringVal.GetSize()&&listVal>=0)?true:false;                            
00154                         }break;
00155 
00156                 case ITEMDATA_INTEGER:
00157                         {
00158                                 retVal=false;
00159                                 if(stringVal.GetSize()==1)                              
00160                                 {
00161                                         TCHAR* endptr;
00162                                         long l = _tcstol(stringVal[0], &endptr, 10);
00163                                         if(*endptr==_T('\0'))
00164                                         {
00165                                                 intVal=l;
00166                                                 retVal=true;
00167                                         }                               
00168                                 }
00169                                 else
00170                                 {
00171                                         ASSERT(0);
00172                                 }
00173                         }break;
00174                 case ITEMDATA_DOUBLE:   
00175                         {
00176                                 retVal=false;
00177                                 if(stringVal.GetSize()==1)                              
00178                                 {
00179                                         TCHAR* endptr;
00180                                         double d;
00181                                         if (ParseSpecialDouble(stringVal[0], d))
00182                                         {
00183                                                 doubleVal = d;
00184                                                 retVal = true;
00185                                         }
00186                                         else
00187                                         {
00188                                                 d = _tcstod(stringVal[0], &endptr);
00189                                                 if (*endptr == _T('\0'))
00190                                                 {
00191                                                         doubleVal = d;
00192                                                         retVal = true;
00193                                                 }
00194                                         }
00195                                 }
00196                                 else
00197                                 {
00198                                         ASSERT(0);
00199                                 }
00200 
00201                         }break;
00202 
00203                 case ITEMDATA_BOOLEAN:
00204                         {
00205                                 retVal=false;
00206                                 if(stringVal.GetSize()==1)                              
00207                                 {
00208                                         if(stringVal[0]==_T("True"))
00209                                         {
00210                                                 boolVal=true;
00211                                                 retVal=true;
00212                                         }
00213                                         else if(stringVal[0]==_T("False"))
00214                                         {
00215                                                 boolVal=false;
00216                                                 retVal=true;
00217                                         }
00218                                 }
00219                                 else
00220                                 {
00221                                         ASSERT(0);
00222                                 }
00223 
00224                         }break;
00225 
00226                 case ITEMDATA_COLOR:
00227                         {
00228                                 retVal=false;
00229                                 if(stringVal.GetSize()==1)                              
00230                                 {
00231                                         TCHAR* endptr;
00232                                         long l = _tcstol(stringVal[0], &endptr, 16);
00233                                         if(*endptr == _T('\0'))
00234                                         {
00235                                                 colorVal=l;
00236                                                 retVal=true;
00237                                         }                               
00238                                 }
00239                                 else
00240                                 {
00241                                         ASSERT(0);
00242                                 }
00243 
00244 
00245                         }break;
00246 
00247                 case ITEMDATA_COMPASS:
00248                         {
00249                                 retVal=false;
00250                                 if(stringVal.GetSize()==1)                              
00251                                 {
00252                                         UINT uValue;
00253                                         retVal=CCompassData::ParseCompassValue(stringVal[0],uValue);
00254                                         if(retVal) compassVal=uValue;
00255                                 }
00256                                 else
00257                                 {
00258                                         ASSERT(0);
00259                                 }
00260 
00261                         }break;
00262                 case ITEMDATA_COMPASS_EXCL:
00263                         {
00264                                 retVal=false;
00265                                 if(stringVal.GetSize()==1)                              
00266                                 {
00267                                         UINT uValue;
00268                                         retVal=CCompassData::ParseCompassValue(stringVal[0],uValue);
00269                                         if(retVal) compassVal=uValue;
00270                                 }
00271                                 else
00272                                 {
00273                                         ASSERT(0);
00274                                 }
00275 
00276                         }break;
00277         }
00278         return retVal;
00279 
00280 };
00281 
00282 
00283 //Set functions
00284 void CItemData::SetIntValue(int i)
00285 {
00286         stringListNames.RemoveAll();
00287         stringVal.RemoveAll();
00288         intVal=i; dataType=ITEMDATA_INTEGER;
00289         toString();
00290 }
00291 
00292 
00293 void CItemData::SetDoubleValue(double d)
00294 {
00295         stringVal.RemoveAll();
00296         stringListNames.RemoveAll();
00297         doubleVal=d; 
00298         dataType=ITEMDATA_DOUBLE;
00299         toString();
00300 }
00301 
00302 
00303 void CItemData::SetBoolValue(bool b)
00304 {
00305         stringVal.RemoveAll();
00306         stringListNames.RemoveAll();
00307         boolVal=b; 
00308         dataType=ITEMDATA_BOOLEAN;
00309         toString();
00310 };
00311 
00312 
00313 void CItemData::SetColorValue(COLORREF c)
00314 {
00315         stringVal.RemoveAll();
00316         stringListNames.RemoveAll();
00317         colorVal=c; 
00318         dataType=ITEMDATA_COLOR;
00319         toString();
00320 }
00321 
00322 
00323 void CItemData::SetCompassValue(UINT cmps)
00324 {
00325         stringVal.RemoveAll();
00326         stringListNames.RemoveAll();
00327         compassVal=cmps; 
00328         dataType=ITEMDATA_COMPASS;
00329         toString();
00330 }
00331 
00332 
00333 void CItemData::SetCompassExclValue(UINT cmps)
00334 {
00335         stringVal.RemoveAll();
00336         stringListNames.RemoveAll();
00337         compassVal=cmps; 
00338         dataType=ITEMDATA_COMPASS_EXCL;
00339         toString();
00340 }
00341 
00342 void CItemData::SetListValue(CStringArray& strArr,CStringArray& strArrNames, UINT nSelection)
00343 {
00344         ASSERT(nSelection<=(UINT)strArr.GetUpperBound());
00345         
00346         dataType=ITEMDATA_FIXED_LIST;
00347         stringVal.Copy(strArr); 
00348         stringListNames.Copy(strArrNames);
00349 
00350         listVal=nSelection;     
00351 }
00352 
00353 void CItemData::SetListValue(CStringArray& strArr, UINT nSelection)
00354 {
00355         ASSERT(nSelection<=(UINT)strArr.GetUpperBound());
00356         
00357         dataType=ITEMDATA_FIXED_LIST;
00358         stringVal.Copy(strArr); 
00359 
00360         listVal=nSelection;     
00361 }
00362 
00363 
00364 
00365 void CItemData::SetStringValue(CStringArray& strArr,BYTE cDispLineNum)
00366 {
00367         stringVal.Copy(strArr);
00368         dataType=ITEMDATA_STRING;
00369         cLineNum=cDispLineNum;
00370 }
00371 
00372 
00373 void CItemData::SetStringValue(CString str)
00374 {
00375         stringVal.RemoveAll();
00376         stringListNames.RemoveAll();
00377         stringVal.SetAtGrow(0,str); 
00378         dataType=ITEMDATA_STRING;
00379         cLineNum=1;
00380 }
00381 
00382 
00383 
00384 
00385 
00386 
00387 
00389 // Converts the actual value to string
00391 bool CItemData::toString(CString& strString)const
00392 {
00393         bool bRetVal=false;
00394         switch(dataType)
00395         {
00396         case ITEMDATA_NULL:
00397                 {
00398                         bRetVal=false;
00399                 }break;
00400 
00401         case ITEMDATA_STRING:
00402                 {               
00403                         if(cLineNum>1) // Multiline
00404                         {                       
00405                                 strString.Empty();
00406                                 int nUpperBound=stringVal.GetUpperBound();
00407                                 for(int i=0;i<=nUpperBound;i++)
00408                                 {
00409                                         strString+=stringVal[i];
00410                                         if( i != nUpperBound)
00411                                                 strString+=_T("\r\n");
00412                                 }
00413                                 //WAS: Trimming last _T("\r\n")
00414                                 //WAS: strString=strString.Left(strString.GetLength()-2);
00415                                 bRetVal=true;
00416                         }
00417                         else
00418                         {
00419                                 strString=stringVal[0];
00420                                 bRetVal=true;
00421                         }
00422                         
00423                 }break;
00424         
00425                 case ITEMDATA_FIXED_LIST:
00426                 {                       
00427                         if(listVal<stringVal.GetSize()&&listVal>=0)
00428                         {
00429                                 strString=stringVal[listVal];
00430                                 bRetVal=true;
00431                         }
00432                         else
00433                         {
00434                                 bRetVal=false;
00435                         }
00436                         
00437                 }break;
00438 
00439 
00440         case ITEMDATA_INTEGER:
00441                 {
00442                         strString.Format(_T("%d"),intVal);
00443                         bRetVal=true;
00444                 }break;
00445         case ITEMDATA_DOUBLE:
00446                 {
00447                         strString.Format( CItemData::m_fmtStr,doubleVal);
00448                         bRetVal=true;
00449                 }break;
00450         case ITEMDATA_BOOLEAN:
00451                 {
00452                         if(boolVal)
00453                         {
00454                                 strString=_T("True");
00455                         }
00456                         else
00457                         {
00458                                 strString=_T("False");
00459                         }
00460                         bRetVal=true;
00461                 }break;
00462 
00463         case ITEMDATA_COLOR     :
00464                 {
00465                         strString.Format(_T("Red: %u; Green: %u; Blue: %u;"),GetRValue(colorVal),GetGValue(colorVal),GetBValue(colorVal));                      
00466                         bRetVal=true;
00467                 }break;
00468 
00469         case ITEMDATA_COMPASS:
00470                 {
00471                         strString=CCompassData::toString(compassVal);
00472                         bRetVal=true;
00473                 }break;
00474         case ITEMDATA_COMPASS_EXCL:
00475                 {
00476                         strString=CCompassData::toString(compassVal);
00477                         bRetVal=true;
00478                 }break;
00479 
00480 
00481         }
00482 
00483         return bRetVal;
00484 }
00485 
00486 
00487 void CItemData::operator=(const CItemData&srcItemData)
00488 {
00489         dataType=srcItemData.dataType;
00490 
00491         stringVal.Copy(srcItemData.stringVal);
00492         stringListNames.Copy(srcItemData.stringListNames);
00493 
00494         //For the union copy only the largest size data
00495         // If Microsoft tries to screw us later, here come some asserts:
00496         ASSERT(sizeof(double)==8);
00497         ASSERT(sizeof(int)==4);
00498         ASSERT(sizeof(COLORREF)==4);
00499         ASSERT(sizeof(bool)==1);
00500         ASSERT(sizeof(UINT)==4);
00501 
00502 
00503         doubleVal=srcItemData.doubleVal;
00504 
00505 }
00506 
00507 void CItemData::toString()
00508 {
00509         if(dataType==ITEMDATA_STRING||dataType==ITEMDATA_FIXED_LIST)
00510         {
00511                 return;
00512         }
00513 
00514         stringVal.RemoveAll();
00515 
00516         CString strTemp;
00517         if(toString(strTemp))
00518         {
00519                 stringVal.SetAtGrow(0,strTemp);
00520         }
00521 }
00522 
00523 void CItemData::CommonInit()
00524 {
00525         dataType=ITEMDATA_NULL;
00526 }
00527 
00528 void CListItem::SetDirty()
00529 {
00530         bIsDefault=false;
00531 }
00532 
00533 void CListItem::CopyWithNoState(const CListItem &srcListItem)
00534 {
00535 
00536         // Copying without bIsContainerOpen and m_ContainedListItemArray
00537 
00538         strName=srcListItem.strName;                    
00539         strToolTip=srcListItem.strToolTip;      
00540         strContentType=srcListItem.strContentType;
00541         bIsDefault=srcListItem.bIsDefault;
00542         bIsReadOnly=srcListItem.bIsReadOnly;
00543         bIsContainer=srcListItem.bIsContainer;
00544         bIsDifferentValue=srcListItem.bIsDifferentValue;
00545 
00546         dwKeyValue=srcListItem.dwKeyValue;
00547         dwUserData=srcListItem.dwUserData;
00548         
00549 
00550         // Values
00551         Value=srcListItem.Value;
00552         DefValue=srcListItem.DefValue;
00553 }