GME
13
|
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 }