VDSM010MF.cpp 17 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591
  1. /****************************************************************************
  2. * @source :
  3. * @description :
  4. ****************************************************************************
  5. * DATE AUTHOR DESCRIPTION
  6. * --------------------------------------------------------------------------
  7. * 2011/12/24 정승호 최초작성
  8. *
  9. ****************************************************************************/
  10. //---------------------------------------------------------------------------
  11. #include <vcl.h>
  12. #include "ITSSkinF.h"
  13. #include "ITSUtilF.h"
  14. #include "AppGlobalF.h"
  15. #include "CDSCodeF.h"
  16. #include "CDSFacilityF.h"
  17. #include "XiMapUtilF.h"
  18. #pragma hdrstop
  19. #include "VDSM010MF.h"
  20. //---------------------------------------------------------------------------
  21. #pragma package(smart_init)
  22. #pragma link "cxButtons"
  23. #pragma link "cxCalendar"
  24. #pragma link "cxContainer"
  25. #pragma link "cxControls"
  26. #pragma link "cxDropDownEdit"
  27. #pragma link "cxEdit"
  28. #pragma link "cxGraphics"
  29. #pragma link "cxGroupBox"
  30. #pragma link "cxLabel"
  31. #pragma link "cxLookAndFeelPainters"
  32. #pragma link "cxLookAndFeels"
  33. #pragma link "cxMaskEdit"
  34. #pragma link "cxPC"
  35. #pragma link "cxPCdxBarPopupMenu"
  36. #pragma link "cxSpinEdit"
  37. #pragma link "cxSplitter"
  38. #pragma link "cxTextEdit"
  39. #pragma link "cxTimeEdit"
  40. #pragma link "dxSkinBlack"
  41. #pragma link "dxSkinBlue"
  42. #pragma link "dxSkinCaramel"
  43. #pragma link "dxSkinCoffee"
  44. #pragma link "dxSkinDarkRoom"
  45. #pragma link "dxSkinDarkSide"
  46. #pragma link "dxSkinFoggy"
  47. #pragma link "dxSkinGlassOceans"
  48. #pragma link "dxSkiniMaginary"
  49. #pragma link "dxSkinLilian"
  50. #pragma link "dxSkinLiquidSky"
  51. #pragma link "dxSkinLondonLiquidSky"
  52. #pragma link "dxSkinMcSkin"
  53. #pragma link "dxSkinMoneyTwins"
  54. #pragma link "dxSkinOffice2007Black"
  55. #pragma link "dxSkinOffice2007Blue"
  56. #pragma link "dxSkinOffice2007Green"
  57. #pragma link "dxSkinOffice2007Pink"
  58. #pragma link "dxSkinOffice2007Silver"
  59. #pragma link "dxSkinOffice2010Black"
  60. #pragma link "dxSkinOffice2010Blue"
  61. #pragma link "dxSkinOffice2010Silver"
  62. #pragma link "dxSkinsCore"
  63. #pragma link "dxSkinscxPCPainter"
  64. #pragma link "dxSkinSeven"
  65. #pragma link "dxSkinSharp"
  66. #pragma link "dxSkinSilver"
  67. #pragma link "dxSkinStardust"
  68. #pragma link "cxRadioGroup"
  69. #pragma link "cxClasses"
  70. #pragma link "cxCustomData"
  71. #pragma link "cxData"
  72. #pragma link "cxDataStorage"
  73. #pragma link "cxDBData"
  74. #pragma link "cxFilter"
  75. #pragma link "cxGrid"
  76. #pragma link "cxGridCustomTableView"
  77. #pragma link "cxGridCustomView"
  78. #pragma link "cxGridDBTableView"
  79. #pragma link "cxGridLevel"
  80. #pragma link "cxGridTableView"
  81. #pragma link "cxStyles"
  82. #pragma link "FRAME_GisMapF"
  83. #pragma link "cxCheckBox"
  84. #pragma link "FRAME_VdsListF"
  85. #pragma resource "*.dfm"
  86. TVDSM010M *VDSM010M = NULL;
  87. //---------------------------------------------------------------------------
  88. __fastcall TVDSM010M::TVDSM010M(TComponent* Owner)
  89. : TForm(Owner)
  90. {
  91. ITSSkin_Load(this);
  92. CMM_LoadForm(g_sFormsDir, this);
  93. FUpdate= false;
  94. FTitle = "VDS-제어기 관리";
  95. FRAMEVdsList1->PnlTop->Visible = false;
  96. FRAMEVdsList1->PnlBottom->Visible = false;
  97. FRAMEVdsList1->ColumnSel->Visible = false;
  98. FRAMEVdsList1->Column02->Visible = false;
  99. FRAMEGisMap1->LbDef->Caption = "(선택메뉴를 클릭하여 위치를 선택합니다.)";
  100. FRAMEGisMap1->LbDef->Hint = FRAMEGisMap1->LbDef->Caption;
  101. m_pGDC = FRAMEVdsList1->TvList->DataController;
  102. }
  103. //---------------------------------------------------------------------------
  104. /*
  105. * 닫기버튼 이나 x버튼 클릭시 공통으로 처리하는 로직이들어간다..
  106. * Form과 DataModule class를 delete시킨다.
  107. * arguments
  108. *
  109. * return
  110. * void
  111. */
  112. void __fastcall TVDSM010M::CommClose()
  113. {
  114. try
  115. {
  116. CMM_SaveForm(g_sFormsDir, this);
  117. }
  118. catch(...)
  119. {
  120. }
  121. }
  122. //---------------------------------------------------------------------------
  123. /*
  124. * Form을 보여줄때 호출되는 event 메서드이다.
  125. * arguments
  126. * Sender : event handler 객체
  127. * return
  128. * void
  129. */
  130. void __fastcall TVDSM010M::FormShow(TObject *Sender)
  131. {
  132. Refresh();
  133. CbTypeCd->Properties->Items->Clear();
  134. TItsCode *FCodeRMF = ItsCodeManager->FLists.Find("RMF");
  135. if (FCodeRMF)
  136. {
  137. FOR_STL(TItsSubCode *, pSubCode, FCodeRMF->FSubLists)
  138. {
  139. if (pSubCode->USE_YN == "N") continue;
  140. CbTypeCd->Properties->Items->Add(" [" + pSubCode->CMMN_CD + "] " + pSubCode->CMMN_CD_KOR_NM);
  141. }
  142. }
  143. CbTypeCd->ItemIndex = 0;
  144. FormInit();
  145. ChangeEditMode(1);
  146. TmrShow->Enabled = true;
  147. }
  148. //---------------------------------------------------------------------------
  149. /*
  150. * form 초기화
  151. *
  152. * arguments
  153. *
  154. * return
  155. * void
  156. */
  157. void __fastcall TVDSM010M::FormInit()
  158. {
  159. EdId->Text = "";
  160. EdMngmNmbr->Text = "";
  161. CbTypeCd->ItemIndex = 0;
  162. CbValidYn->ItemIndex = 0;
  163. SePosX->Value = 0;
  164. SePosY->Value = 0;
  165. EdLctn->Text = "";
  166. EdIP->Text = "";
  167. EdPort->Text = "";
  168. SeClctCycle->Value = 0;
  169. SeSttsCycl->Value = 0;
  170. SeBordNum->Value = 0;
  171. FNewDb = false;
  172. }
  173. //---------------------------------------------------------------------------
  174. /*
  175. * Form이 Show되고 난 후 최초 1회 수행되는 타이머 이벤트
  176. * arguments
  177. * Sender : event handler 객체
  178. * return
  179. * void
  180. */
  181. void __fastcall TVDSM010M::TmrShowTimer(TObject *Sender)
  182. {
  183. TmrShow->Enabled = false;
  184. FRAMEGisMap1->LinkLevel = 1;
  185. FRAMEGisMap1->LoadGisMap();
  186. //FRAMEGisMap1->ShowHideTrafficLayer(false);
  187. UpdateVdsIcon();
  188. FRAMEVdsList1->UpdateList();
  189. }
  190. //---------------------------------------------------------------------------
  191. /*
  192. * Close 버튼 클릭 이벤트 핸들러
  193. * arguments
  194. * Sender : event handler 객체
  195. * return
  196. * void
  197. */
  198. void __fastcall TVDSM010M::BtnCloseClick(TObject *Sender)
  199. {
  200. Close();
  201. }
  202. //---------------------------------------------------------------------------
  203. void __fastcall TVDSM010M::FormClose(TObject *Sender, TCloseAction &Action)
  204. {
  205. CommClose();
  206. VDSM010M = NULL;
  207. Action = caFree;
  208. }
  209. //---------------------------------------------------------------------------
  210. void __fastcall TVDSM010M::FormCloseQuery(TObject *Sender, bool &CanClose)
  211. {
  212. if (FUpdate)
  213. {
  214. POST_MSG(Application->MainForm->Handle, WM_DATABASE_REFRESH, WP_MSG_14, 0);
  215. }
  216. FRAMEVdsList1->OnCloseQuery(CanClose);
  217. }
  218. //---------------------------------------------------------------------------
  219. void __fastcall TVDSM010M::DisplayInfo(TItsVds* AObj)
  220. {
  221. FormInit();
  222. if (!AObj) return;
  223. EdId->Text = AObj->CTLR_MNGM_NMBR;
  224. EdMngmNmbr->Text = AObj->CTLR_MNGM_NMBR;
  225. CMM_SetComboBoxItem(CbTypeCd, AObj->CTLR_TYPE_CD);
  226. CbValidYn->Text = AObj->VALD_YN;
  227. SePosX->Value = StrToFloatDef(AObj->X_CRDN, 0);
  228. SePosY->Value = StrToFloatDef(AObj->Y_CRDN, 0);
  229. EdLctn->Text = AObj->LCTN;
  230. EdIP->Text = AObj->TRMN_IP;
  231. EdPort->Text = AObj->TRMN_PORT;
  232. SeClctCycle->Value = AObj->CTLR_CLCT_CYCL.ToIntDef(0);
  233. SeSttsCycl->Value = AObj->CTLR_STTS_CYCL.ToIntDef(0);
  234. SeBordNum->Value = AObj->DLTR_NMBR.ToIntDef(0);
  235. FRAMEGisMap1->SelectObjectByPos(SePosX->Value, SePosY->Value, true);
  236. ChangeEditMode(3);
  237. }
  238. //---------------------------------------------------------------------------
  239. void __fastcall TVDSM010M::FRAMEGisMap1xclntMapMouseDown(TObject *Sender, TMouseButton Button, TShiftState Shift, int X, int Y)
  240. {
  241. if (Button != mbLeft) return;
  242. if (FRAMEGisMap1->xclntMap->MapOperation != OnSelect) return;
  243. FRAMEGisMap1->xclntMap->SetFocus();
  244. TDDPoint dptCurr = FRAMEGisMap1->xclntMap->ScreenToReal(Point( X, Y));
  245. try {
  246. SePosX->Value = dptCurr.X;
  247. SePosY->Value = dptCurr.Y;
  248. } catch(...) {}
  249. }
  250. //---------------------------------------------------------------------------
  251. void __fastcall TVDSM010M::UpdateVdsIcon()
  252. {
  253. FRAMEGisMap1->xclntMap->ClearCCTVEvent(true);
  254. TItsFacility *pFacility;
  255. try
  256. {
  257. if (ChkViewIcon->Checked)
  258. {
  259. try
  260. {
  261. FRAMEVdsList1->MyItsVdsManager->FLists.Lock();
  262. FOR_STL(TItsVds*, pObj, FRAMEVdsList1->MyItsVdsManager->FLists)
  263. {
  264. if (pObj->DEL_YN == "Y") continue;
  265. //pFacility = ItsFacilityManager->FLists.Find(pObj->CTLR_MNGM_NMBR);
  266. //if (!pFacility) continue;
  267. try {
  268. String sTitle = "▶▶VDS-제어기 정보◀◀|VDS ID : " + pObj->CTLR_MNGM_NMBR + "|명칭 : " + pObj->LCTN;
  269. FRAMEGisMap1->xclntMap->ADDCCTVEvent(DDPoint(StrToFloatDef(pObj->X_CRDN, 0), StrToFloatDef(pObj->Y_CRDN, 0)), pObj->CTLR_MNGM_NMBR, "VDS", sTitle, 9, 1, 7);
  270. } catch(...) { }
  271. }
  272. }
  273. __finally
  274. {
  275. FRAMEVdsList1->MyItsVdsManager->FLists.UnLock();
  276. }
  277. }
  278. }
  279. catch(...)
  280. {
  281. }
  282. FRAMEGisMap1->xclntMap->ReDraw();
  283. }
  284. //---------------------------------------------------------------------------
  285. void __fastcall TVDSM010M::FRAMEVdsList1TvListCellDblClick(TcxCustomGridTableView *Sender, TcxGridTableDataCellViewInfo *ACellViewInfo,
  286. TMouseButton AButton, TShiftState AShift, bool &AHandled)
  287. {
  288. if (!ACellViewInfo) return;
  289. int nRow = FRAMEVdsList1->TvList->DataController->FocusedRecordIndex;
  290. if( nRow <= -1 )
  291. return;
  292. int nMemPtr = FRAMEVdsList1->TvList->DataController->Values[nRow][FRAMEVdsList1->Column99->Index];
  293. TItsVds* pObj = (TItsVds*)nMemPtr;
  294. DisplayInfo(pObj);
  295. }
  296. //---------------------------------------------------------------------------
  297. void __fastcall TVDSM010M::ChkViewIconClick(TObject *Sender)
  298. {
  299. UpdateVdsIcon();
  300. }
  301. //---------------------------------------------------------------------------
  302. void __fastcall TVDSM010M::BtnEditClick(TObject *Sender)
  303. {
  304. if (BtnEdit->Caption == "편집")
  305. {
  306. ChangeEditMode(0);
  307. FNewDb = false;
  308. }
  309. else
  310. {
  311. String sId = EdId->Text;
  312. ChangeEditMode(1);
  313. TItsVds *pObj = FRAMEVdsList1->MyItsVdsManager->FLists.Find(sId);
  314. if (pObj)
  315. {
  316. CMM_SetGridRow(FRAMEVdsList1->CxList, FRAMEVdsList1->TvList, sId, FRAMEVdsList1->Column01->Index);
  317. DisplayInfo(pObj);
  318. }
  319. }
  320. }
  321. //---------------------------------------------------------------------------
  322. void __fastcall TVDSM010M::ChangeEditMode(int AEdit)
  323. {
  324. bool bEnabled = false;
  325. switch(AEdit)
  326. {
  327. case 0: //편집버튼클릭
  328. {
  329. BtnEdit->Enabled = true;
  330. BtnInsert->Enabled = false;
  331. BtnDelete->Enabled = false;
  332. BtnSave->Enabled = true;
  333. BtnEdit->Caption = "취소";
  334. BtnEdit->Hint = "데이터 편집 취소";
  335. }
  336. break;
  337. case 1: //편집[취소]버튼클릭
  338. {
  339. FormInit(); //화면을 모두 지운다.
  340. BtnEdit->Enabled = false;
  341. BtnInsert->Enabled = true;
  342. BtnDelete->Enabled = false;
  343. BtnSave->Enabled = false;
  344. BtnEdit->Caption = "편집";
  345. BtnEdit->Hint = "데이터 편집";
  346. bEnabled = true;
  347. }
  348. break;
  349. case 2: //추가
  350. {
  351. BtnEdit->Enabled = true;
  352. BtnInsert->Enabled = false;
  353. BtnDelete->Enabled = false;
  354. BtnSave->Enabled = true;
  355. BtnEdit->Caption = "취소";
  356. BtnEdit->Hint = "데이터 편집 취소";
  357. }
  358. break;
  359. case 3: //수정모드
  360. {
  361. BtnEdit->Enabled = true;
  362. BtnInsert->Enabled = true;
  363. BtnDelete->Enabled = true;
  364. BtnSave->Enabled = false;
  365. BtnEdit->Caption = "편집";
  366. BtnEdit->Hint = "데이터 편집";
  367. bEnabled = true;
  368. }
  369. break;
  370. }
  371. if (AEdit == 0 || AEdit == 2)
  372. {
  373. FRAMEVdsList1->CxList->Enabled = false;
  374. }
  375. else
  376. {
  377. FRAMEVdsList1->CxList->Enabled = true;
  378. }
  379. EdId->Properties->ReadOnly = bEnabled;
  380. EdMngmNmbr->Properties->ReadOnly = bEnabled;
  381. CbTypeCd->Properties->ReadOnly = bEnabled;
  382. CbValidYn->Properties->ReadOnly = bEnabled;
  383. SePosX->Properties->ReadOnly = bEnabled;
  384. SePosY->Properties->ReadOnly = bEnabled;
  385. EdLctn->Properties->ReadOnly = bEnabled;
  386. EdIP->Properties->ReadOnly = bEnabled;
  387. EdPort->Properties->ReadOnly = bEnabled;
  388. SeClctCycle->Properties->ReadOnly = bEnabled;
  389. SeSttsCycl->Properties->ReadOnly = bEnabled;
  390. SeBordNum->Properties->ReadOnly = bEnabled;
  391. }
  392. //---------------------------------------------------------------------------
  393. void __fastcall TVDSM010M::BtnInsertClick(TObject *Sender)
  394. {
  395. FormInit();
  396. //신규아이디를 얻어와서 화면을 초기화한다.
  397. String sId;
  398. #if 0
  399. if (!FRAMEVdsList1->MyItsVdsManager->GetNextVdsId(sId))
  400. {
  401. Application->MessageBox(L"새로운 VDS-제어기 관리번호를 생성하지 못하였습니다.\r\n프로그램 종료후에 다시 시도해 보세요.",
  402. FTitle.c_str(), MB_OK|MB_ICONERROR|MB_APPLMODAL);
  403. return;
  404. }
  405. #else
  406. sId = InputBox("제어기 관리번호", "신규 제어기 관리번호를 입력하세요(20Byte).", "제어기 관리번호" );
  407. sId = sId.Trim();
  408. if (sId == "제어기 관리번호" || sId == "")
  409. {
  410. return;
  411. }
  412. if (AnsiString(sId).Length() > 20)
  413. {
  414. Application->MessageBox(L"제어기 관리번호는 20Byte를 초과할 수 없습니다.", FTitle.c_str(), MB_OK|MB_ICONERROR|MB_APPLMODAL);
  415. return;
  416. }
  417. TItsVds *pDb = (TItsVds *)FRAMEVdsList1->MyItsVdsManager->FLists.Find(sId);
  418. if (pDb)
  419. {
  420. Application->MessageBox(("[" + sId + "]는 사용할 수 없는 제어기 관리번호 입니다.").c_str(), FTitle.c_str(), MB_OK|MB_ICONERROR|MB_APPLMODAL);
  421. return;
  422. }
  423. #endif
  424. EdId->Text = sId;
  425. EdMngmNmbr->Text = sId;
  426. ChangeEditMode(2);
  427. FNewDb = true;
  428. }
  429. //---------------------------------------------------------------------------
  430. void __fastcall TVDSM010M::BtnDeleteClick(TObject *Sender)
  431. {
  432. int nIdx = m_pGDC->FocusedRecordIndex;
  433. if (nIdx < 0) return;
  434. String sId = EdId->Text;
  435. if (sId.IsEmpty())
  436. {
  437. Application->MessageBox(L"삭제할 VDS-제어기를 목록에서 선택하세요.\r\n목록에서 더블클릭하여 선택합니다.", FTitle.c_str(), MB_OK|MB_ICONERROR|MB_APPLMODAL);
  438. return;
  439. }
  440. String sMsg;
  441. sMsg = "ID: " + sId;
  442. sMsg+= "\r\n선택하신 VDS-제어기 정보를 삭제하시겠습니까?";
  443. if (Application->MessageBox(sMsg.c_str(), FTitle.c_str(), MB_YESNO|MB_ICONQUESTION|MB_APPLMODAL) != IDYES) return;
  444. TItsVds *pObj = FRAMEVdsList1->MyItsVdsManager->FLists.Find(sId);
  445. if (pObj)
  446. {
  447. if (FRAMEVdsList1->MyItsVdsManager->DeleteVds(pObj))
  448. {
  449. pObj->DEL_YN = "Y";
  450. FRAMEVdsList1->UpdateList();
  451. }
  452. TItsFacility *pFacility = ItsFacilityManager->FLists.Find(sId);
  453. if (pFacility)
  454. {
  455. FUpdate = true;
  456. }
  457. Application->MessageBox(L"VDS-제어기 정보삭제\r\nVDS-제어기 정보를 삭제 하였습니다.",
  458. FTitle.c_str(), MB_OK|MB_ICONINFORMATION|MB_APPLMODAL);
  459. FormInit();
  460. ChangeEditMode(1);
  461. }
  462. }
  463. //---------------------------------------------------------------------------
  464. void __fastcall TVDSM010M::BtnSaveClick(TObject *Sender)
  465. {
  466. if (EdId->Text.IsEmpty() ||
  467. EdLctn->Text.Trim().IsEmpty()||
  468. SePosX->Value == 0 ||
  469. SePosY->Value == 0 )
  470. //CbTypeCd->Text.IsEmpty() )
  471. {
  472. Application->MessageBox(L"★항목은 필수 입력 항목입니다.\r\n모두 입력후 진행해 주세요.",
  473. FTitle.c_str(), MB_OK|MB_ICONERROR|MB_APPLMODAL);
  474. return;
  475. }
  476. String sId = EdId->Text;
  477. TItsVds *pObj;
  478. if (FNewDb)
  479. pObj = new TItsVds();
  480. else
  481. pObj = FRAMEVdsList1->MyItsVdsManager->FLists.Find(sId);
  482. if (pObj)
  483. {
  484. pObj->CTLR_MNGM_NMBR = sId;
  485. pObj->CTLR_TYPE_CD = ITSUtil_GetCode(CbTypeCd->Text);
  486. pObj->VALD_YN = CbValidYn->Text;
  487. pObj->X_CRDN = VarToStr(SePosX->Value);
  488. pObj->Y_CRDN = VarToStr(SePosY->Value);
  489. pObj->LCTN = EdLctn->Text.Trim();
  490. pObj->TRMN_IP = EdIP->Text.Trim();
  491. pObj->TRMN_PORT = EdPort->Text.Trim();
  492. pObj->CTLR_CLCT_CYCL = VarToStr(SeClctCycle->Value);
  493. pObj->CTLR_STTS_CYCL = VarToStr(SeSttsCycl->Value);
  494. pObj->DLTR_NMBR = VarToStr(SeBordNum->Value);
  495. pObj->DEL_YN = "N";
  496. bool bResult;
  497. if (FNewDb)
  498. {
  499. bResult = FRAMEVdsList1->MyItsVdsManager->InsertVds(pObj);
  500. if (bResult)
  501. {
  502. FRAMEVdsList1->MyItsVdsManager->FLists.Push(sId, pObj);
  503. }
  504. }
  505. else
  506. {
  507. bResult = FRAMEVdsList1->MyItsVdsManager->UpdateVds(pObj);
  508. }
  509. if (bResult)
  510. {
  511. Application->MessageBox(L"VDS-제어기 정보저장\r\nVDS-제어기 정보를 저장 하였습니다.",
  512. FTitle.c_str(), MB_OK|MB_ICONINFORMATION|MB_APPLMODAL);
  513. FUpdate = true;
  514. FRAMEVdsList1->UpdateList();
  515. UpdateVdsIcon();
  516. CMM_SetGridRow(FRAMEVdsList1->CxList, FRAMEVdsList1->TvList, sId, FRAMEVdsList1->Column01->Index);
  517. DisplayInfo(pObj);
  518. }
  519. }
  520. }
  521. //---------------------------------------------------------------------------