FRAME_OpenMapF.cpp 19 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628
  1. //---------------------------------------------------------------------------
  2. #include <vcl.h>
  3. #include "AppGlobalF.h"
  4. #include "ITSSkinF.h"
  5. #include "ITSUtilF.h"
  6. #include "ITSLangTransF.h"
  7. #include "ITSMapF.h"
  8. #pragma hdrstop
  9. #include "FRAME_OpenMapF.h"
  10. //---------------------------------------------------------------------------
  11. #pragma package(smart_init)
  12. #pragma link "cxButtons"
  13. #pragma link "cxCheckBox"
  14. #pragma link "cxContainer"
  15. #pragma link "cxControls"
  16. #pragma link "cxEdit"
  17. #pragma link "cxGraphics"
  18. #pragma link "cxLabel"
  19. #pragma link "cxLookAndFeelPainters"
  20. #pragma link "cxLookAndFeels"
  21. #pragma link "cxTextEdit"
  22. #pragma link "dxSkinBlue"
  23. #pragma link "dxSkinsCore"
  24. #pragma link "dxSkinBlack"
  25. #pragma link "dxSkinCaramel"
  26. #pragma link "dxSkinCoffee"
  27. #pragma link "dxSkinDarkRoom"
  28. #pragma link "dxSkinDarkSide"
  29. #pragma link "dxSkinFoggy"
  30. #pragma link "dxSkinGlassOceans"
  31. #pragma link "dxSkiniMaginary"
  32. #pragma link "dxSkinLilian"
  33. #pragma link "dxSkinLiquidSky"
  34. #pragma link "dxSkinLondonLiquidSky"
  35. #pragma link "dxSkinMcSkin"
  36. #pragma link "dxSkinMoneyTwins"
  37. #pragma link "dxSkinOffice2007Black"
  38. #pragma link "dxSkinOffice2007Blue"
  39. #pragma link "dxSkinOffice2007Green"
  40. #pragma link "dxSkinOffice2007Pink"
  41. #pragma link "dxSkinOffice2007Silver"
  42. #pragma link "dxSkinOffice2010Black"
  43. #pragma link "dxSkinOffice2010Blue"
  44. #pragma link "dxSkinOffice2010Silver"
  45. #pragma link "dxSkinSeven"
  46. #pragma link "dxSkinSharp"
  47. #pragma link "dxSkinSilver"
  48. #pragma link "dxSkinStardust"
  49. #pragma resource "*.dfm"
  50. //TFRAMEOpenMap *FRAMEOpenMap;
  51. //---------------------------------------------------------------------------
  52. __fastcall TFRAMEOpenMap::TFRAMEOpenMap(TComponent* Owner)
  53. : TFrame(Owner), MapCallbackFunc(NULL)
  54. {
  55. LangTrans->Translate(this, ITSDb_GetConnection());
  56. ITSSkin_Load((TForm*)this);
  57. LoadLocalSkin();
  58. fJSExec = new TJSExec(WebBrowser1);
  59. reMsg->Lines->Clear();
  60. FLayerIdx = 0;
  61. FMapStart = false;
  62. }
  63. //---------------------------------------------------------------------------
  64. void __fastcall TFRAMEOpenMap::LoadLocalSkin()
  65. {
  66. }
  67. //---------------------------------------------------------------------------
  68. void __fastcall TFRAMEOpenMap::OpenMap()
  69. {
  70. TmrMapOpen->Enabled = true;
  71. }
  72. //---------------------------------------------------------------------------
  73. void __fastcall TFRAMEOpenMap::TmrMapOpenTimer(TObject *Sender)
  74. {
  75. TmrMapOpen->Enabled = false;
  76. LoadMap();
  77. }
  78. //---------------------------------------------------------------------------
  79. void __fastcall TFRAMEOpenMap::LoadMap()
  80. {
  81. FHtmlFileName = "";
  82. try {
  83. FHtmlFileName = ITSMap_MapOpen(g_sMapDir, g_nMapSource);
  84. if (FHtmlFileName != "")
  85. {
  86. #if 0
  87. //reMsg->Lines->Add(FHtmlFileName);
  88. WebBrowser1->Navigate(FHtmlFileName.c_str());
  89. #else
  90. TStringList *pStringList = NULL;
  91. TMemoryStream *mstm = NULL;
  92. TStreamAdapter *stmadt = NULL;
  93. IPersistStreamInit *pPersistStreamInit = NULL;
  94. String sHtml = "";
  95. try {
  96. try {
  97. pStringList = new TStringList();
  98. pStringList->LoadFromFile(FHtmlFileName);
  99. sHtml = pStringList->Text;
  100. if (g_GisInfo.sApiKey != "")
  101. {
  102. sHtml = StringReplace(sHtml, "MAP_API_KEY", g_GisInfo.sApiKey, TReplaceFlags() << rfReplaceAll);
  103. }
  104. #if 0
  105. sHtml = StringReplace(sHtml, "INIT_ZOOM", g_AppCfg.map.InitZoom, TReplaceFlags() << rfReplaceAll);
  106. sHtml = StringReplace(sHtml, "MIN_ZOOM", g_AppCfg.map.MinZoom, TReplaceFlags() << rfReplaceAll);
  107. sHtml = StringReplace(sHtml, "MAX_ZOOM", g_AppCfg.map.MaxZoom, TReplaceFlags() << rfReplaceAll);
  108. sHtml = StringReplace(sHtml, "INIT_LAT", g_AppCfg.map.InitLat, TReplaceFlags() << rfReplaceAll);
  109. sHtml = StringReplace(sHtml, "INIT_LNG", g_AppCfg.map.InitLng, TReplaceFlags() << rfReplaceAll);
  110. #endif
  111. sHtml.Trim();
  112. pStringList->Text = sHtml;
  113. //reMsg->Lines->Clear();
  114. //reMsg->Lines->Add(sHtml);
  115. if (DeleteFile(FHtmlFileName))
  116. {
  117. //FHtmlFileName = "";
  118. }
  119. if (!WebBrowser1->Document)
  120. {
  121. String sTmpUrl = "about:blank";
  122. WebBrowser1->Navigate(sTmpUrl.c_str());
  123. //WebBrowser1->Stop();
  124. //WebBrowser1->Navigate("about:blank");
  125. while(WebBrowser1->ReadyState != 4/*READYSTATE_COMPLETE*/)
  126. {
  127. Application->ProcessMessages();
  128. }
  129. }
  130. mstm = new TMemoryStream();
  131. pStringList->SaveToStream(mstm, TEncoding::Unicode);
  132. mstm->Seek(0, soFromBeginning);
  133. stmadt = new TStreamAdapter(mstm, soReference);
  134. if (S_OK == WebBrowser1->Document->QueryInterface(IID_IPersistStreamInit, (void**)&pPersistStreamInit))
  135. {
  136. pPersistStreamInit->Load(*stmadt);
  137. pPersistStreamInit->Release();
  138. pPersistStreamInit = NULL;
  139. }
  140. }
  141. catch(Exception &exception)
  142. {
  143. }
  144. }
  145. __finally {
  146. SAFE_DELETE(pStringList);
  147. SAFE_DELETE(mstm);
  148. //SAFE_DELETE(stmadt);
  149. if (DeleteFile(FHtmlFileName))
  150. {
  151. FHtmlFileName = "";
  152. }
  153. }
  154. #endif
  155. }
  156. } catch(...) {}
  157. }
  158. //---------------------------------------------------------------------------
  159. void __fastcall TFRAMEOpenMap::OnCloseQuery(bool &CanClose)
  160. {
  161. try
  162. {
  163. if (fJSExec)
  164. {
  165. fJSExec->Free();
  166. }
  167. if (FHtmlFileName != "")
  168. {
  169. if (FileExists(FHtmlFileName))
  170. {
  171. if (DeleteFile(FHtmlFileName))
  172. {
  173. FHtmlFileName = "";
  174. }
  175. }
  176. }
  177. }
  178. catch(Exception &exception)
  179. {
  180. }
  181. }
  182. //---------------------------------------------------------------------------
  183. bool __fastcall TFRAMEOpenMap::ExecScript(String AScript)
  184. {
  185. if (FMapStart == false) return false;
  186. try
  187. {
  188. fJSExec->RunJSFn(AScript);
  189. }
  190. catch(Exception &exception)
  191. {
  192. WriteLog("ExecScript: [%s]", AnsiString(exception.ClassName()+exception.Message).c_str());
  193. return false;
  194. }
  195. return true;
  196. }
  197. //---------------------------------------------------------------------------
  198. void __fastcall TFRAMEOpenMap::SelectObjectByPos(double dPosX, double dPosY, bool bArrow/*=false*/)
  199. {
  200. if (FMapStart == false) return;
  201. String sJs;
  202. sJs.printf(L"selectPos(0, '%.7f', '%.7f')", dPosX, dPosY);
  203. ExecScript(sJs);
  204. }
  205. //---------------------------------------------------------------------------
  206. bool __fastcall TFRAMEOpenMap::SelectLinkByPos(int X, int Y, String &ALinkId)
  207. {
  208. return false;
  209. }
  210. //---------------------------------------------------------------------------
  211. bool __fastcall TFRAMEOpenMap::GetLevelLinkId(int ALinkLevel, String &sLinkId, int X, int Y)
  212. {
  213. return false;
  214. }
  215. //---------------------------------------------------------------------------
  216. void __fastcall TFRAMEOpenMap::SelGisItem(int AType, String AId)
  217. {
  218. }
  219. //---------------------------------------------------------------------------
  220. void __fastcall TFRAMEOpenMap::WebBrowser1DownloadComplete(TObject *Sender)
  221. {
  222. // 웹페이지 스크롤바 없애기
  223. #if 0
  224. try
  225. {
  226. Variant vBody;
  227. Variant vObj = WebBrowser1->OleObject;
  228. String strDocCompatMode = vObj.OlePropertyGet("document").OlePropertyGet("compatMode");
  229. if (SameText(strDocCompatMode, "CSS1Compat"))
  230. vBody = vObj.OlePropertyGet("Document").OlePropertyGet("documentElement");
  231. else
  232. vBody = vObj.OlePropertyGet("Document").OlePropertyGet("body");
  233. vBody.OlePropertyGet("style").OlePropertySet("overflow", "hidden");
  234. }
  235. catch(Exception &e)
  236. {
  237. }
  238. #endif
  239. }
  240. //---------------------------------------------------------------------------
  241. void __fastcall TFRAMEOpenMap::BtnMapToJpgClick(TObject *Sender)
  242. {
  243. // 지도 이미지 저장
  244. String sFileName = "";
  245. Application->ProcessMessages();
  246. SaveDialog1->FileName = Now().FormatString("YYYYMMDDHHNNSS") + ".jpg";
  247. if (!SaveDialog1->Execute()) return;
  248. sFileName = SaveDialog1->FileName;
  249. if (sFileName == "")
  250. {
  251. return ;
  252. }
  253. ShowCursor(false);
  254. POINT oldCursorPos;
  255. GetCursorPos(&oldCursorPos);
  256. SetCursorPos(-1, -1);
  257. Application->ProcessMessages();
  258. HDC dc;
  259. RECT r;
  260. try
  261. {
  262. GetWindowRect(WebBrowser1->Handle, &r);
  263. dc = GetWindowDC(Handle);
  264. Graphics::TCanvas *MyCanvas = new Graphics::TCanvas;
  265. MyCanvas->Handle = dc;
  266. int nIW;
  267. int nIH;
  268. nIW = (r.right - r.left);
  269. nIH = (r.bottom - r.top);
  270. Image1->Width = nIW;
  271. Image1->Height = nIH;
  272. Image1->Picture->Bitmap->Width = nIW;
  273. Image1->Picture->Bitmap->Height = nIH;
  274. Image1->Picture->Bitmap->Canvas->CopyMode = cmSrcCopy;
  275. Image1->Picture->Bitmap->Canvas->CopyRect
  276. (
  277. TRect(0,0, Image1->Width, Image1->Height),
  278. MyCanvas,
  279. TRect(0,0,Image1->Width,Image1->Height)
  280. );
  281. delete MyCanvas;
  282. ReleaseDC(NULL,dc);
  283. TJPEGImage *jpeg = new TJPEGImage ();
  284. try
  285. {
  286. jpeg->Assign(Image1->Picture->Bitmap);
  287. jpeg->SaveToFile(sFileName);
  288. }
  289. __finally
  290. {
  291. delete jpeg;
  292. Image1->Picture->Bitmap->FreeImage();
  293. }
  294. }
  295. catch(Exception &e)
  296. {
  297. }
  298. ShowCursor(true);
  299. SetCursorPos(oldCursorPos.x, oldCursorPos.y);
  300. String sMsg;
  301. //sMsg = "The image file is saved.\r\n";
  302. sMsg = "이미지 파일을 저장하였습니다.\r\n";
  303. sMsg += sFileName;
  304. ShowMessage(sMsg);
  305. }
  306. //---------------------------------------------------------------------------
  307. void __fastcall TFRAMEOpenMap::BtnMoveMapToFitClick(TObject *Sender)
  308. {
  309. // 지도객체영역을 전체영역으로
  310. String sJs;
  311. sJs.printf(L"extentLayer(%d)", FLayerIdx);
  312. ExecScript(sJs);
  313. }
  314. //---------------------------------------------------------------------------
  315. void __fastcall TFRAMEOpenMap::BtnMoveDefBoundsClick(TObject *Sender)
  316. {
  317. // 지도 기본영역으로 이동
  318. ExecScript("stdExtent()");
  319. }
  320. //---------------------------------------------------------------------------
  321. void __fastcall TFRAMEOpenMap::BtnZoomInClick(TObject *Sender)
  322. {
  323. // 지도 확대
  324. ExecScript("zoomIn()");
  325. }
  326. //---------------------------------------------------------------------------
  327. void __fastcall TFRAMEOpenMap::BtnZoomOutClick(TObject *Sender)
  328. {
  329. // 지도 축소
  330. ExecScript("zoomOut()");
  331. }
  332. //---------------------------------------------------------------------------
  333. void __fastcall TFRAMEOpenMap::BtnZoomPrevClick(TObject *Sender)
  334. {
  335. // 지도 이전영역 이동
  336. ExecScript("mapPrev()");
  337. }
  338. //---------------------------------------------------------------------------
  339. void __fastcall TFRAMEOpenMap::BtnZoomNextClick(TObject *Sender)
  340. {
  341. // 지도 다음영역 이동
  342. ExecScript("mapNext()");
  343. }
  344. //---------------------------------------------------------------------------
  345. void __fastcall TFRAMEOpenMap::BtnRefreshClick(TObject *Sender)
  346. {
  347. // 지도 새로고침
  348. ExecScript("refreshMap()");
  349. }
  350. //---------------------------------------------------------------------------
  351. void __fastcall TFRAMEOpenMap::ChkShowNmbrClick(TObject *Sender)
  352. {
  353. String sJs;
  354. sJs.printf(L"showLayerText(%d, %d)", FLayerIdx, (ChkShowNmbr->Checked) ? 1: 0);
  355. ExecScript(sJs);
  356. }
  357. //---------------------------------------------------------------------------
  358. void __fastcall TFRAMEOpenMap::BtnMapClickClick(TObject *Sender)
  359. {
  360. String sJs;
  361. sJs.printf(L"setMouseClick(%d)", (BtnMapClick->SpeedButtonOptions->Down) ? 1: 0);
  362. ExecScript(sJs);
  363. EdMapPos->Visible = BtnMapClick->SpeedButtonOptions->Down;
  364. EdMapPos->Text = "";
  365. }
  366. //---------------------------------------------------------------------------
  367. void __fastcall TFRAMEOpenMap::PnlGisToolDblClick(TObject *Sender)
  368. {
  369. if (EdMapPos->Visible)
  370. {
  371. ExecScript("setMouseClick(0)");
  372. }
  373. else
  374. {
  375. ExecScript("setMouseClick(1)");
  376. }
  377. EdMapPos->Visible = !EdMapPos->Visible;
  378. EdMapPos->Text = "";
  379. }
  380. //---------------------------------------------------------------------------
  381. void __fastcall TFRAMEOpenMap::BtnMapSelectClick(TObject *Sender)
  382. {
  383. //
  384. }
  385. //---------------------------------------------------------------------------
  386. void __fastcall TFRAMEOpenMap::WebBrowser1BeforeNavigate2(TObject *ASender, const IDispatch *pDisp, OleVariant &URL, OleVariant &Flags,
  387. OleVariant &TargetFrameName, OleVariant &PostData, OleVariant &Headers, WordBool &Cancel)
  388. {
  389. bool bFirst = false;
  390. bool bCancel = false;
  391. String sUrl, sFunc, sArgs;
  392. try
  393. {
  394. sUrl = URL.operator UnicodeString();
  395. URL.VOleStr = NULL;
  396. int nFuncIdx = sUrl.Pos(":");
  397. sFunc = sUrl.SubString(0, nFuncIdx-1).LowerCase();
  398. //sArgs = sUrl.SubString(nFuncIdx+1, sUrl.Length()).LowerCase();
  399. sArgs = sUrl.SubString(nFuncIdx+1, sUrl.Length());
  400. WriteLog("mapEvent: %s, %s", AnsiString(sFunc).c_str(), AnsiString(sArgs).c_str());
  401. Application->ProcessMessages();
  402. if (nFuncIdx > 0 && sFunc.Pos("onmap"))
  403. {
  404. TStringList *pStringList = new TStringList;
  405. pStringList->CommaText = sArgs;
  406. try
  407. {
  408. String sZoom = pStringList->Strings[0];
  409. String sCenterLat = pStringList->Strings[1];
  410. String sCenterLng = pStringList->Strings[2];
  411. FMapZoom = sZoom.ToIntDef(0);
  412. FCenterX = sCenterLat.ToDouble();
  413. FCenterY = sCenterLng.ToDouble();
  414. LblZoom->Caption = "Zoom: " + sZoom;
  415. }
  416. catch(Exception &e)
  417. {
  418. }
  419. delete pStringList;
  420. try
  421. {
  422. if (FHtmlFileName != "")
  423. {
  424. if (FileExists(FHtmlFileName))
  425. {
  426. if (DeleteFile(FHtmlFileName))
  427. {
  428. FHtmlFileName = "";
  429. }
  430. }
  431. }
  432. }
  433. catch(Exception &e) {}
  434. if (sFunc == "onmapinit")
  435. {
  436. FMapStart = true;
  437. String sJs;
  438. sJs.printf(L"setMapInfo('%.7f', '%.7f', %d, %d, %d, %d, '%s', '%s')",
  439. g_GisInfo.dCenterX, g_GisInfo.dCenterY, g_GisInfo.nZoomLevel, g_GisInfo.nMinZoom, g_GisInfo.nMaxZoom, g_GisInfo.mapType,
  440. g_GisInfo.imagePath.c_str(), g_GisInfo.mapUrl.c_str());
  441. ExecScript(sJs);
  442. ExecScript("DoMap()");
  443. Cancel = true;
  444. return;
  445. }
  446. else
  447. if (sFunc == "onmapzoomchanged")
  448. {
  449. }
  450. else
  451. if (sFunc == "onmapdragstart")
  452. {
  453. }
  454. else
  455. if (sFunc == "onmapdragend")
  456. {
  457. }
  458. else
  459. if (sFunc == "onmapcompleted")
  460. {
  461. FMapStart = true;
  462. PnlToolbar->Enabled = true;
  463. bFirst = true;
  464. }
  465. bCancel = true;
  466. }
  467. else
  468. if (nFuncIdx > 0 && sFunc.Pos("onchangedmaptype"))
  469. {
  470. bCancel = true;
  471. TStringList *pStringList = new TStringList;
  472. pStringList->CommaText = sArgs;
  473. try
  474. {
  475. String sMapType = pStringList->Strings[0];
  476. g_GisInfo.mapType = sMapType.ToIntDef(1);
  477. WriteConfigInfo(g_AppCfg.sConfigFile, "MAP", "MAPTYPE", String(g_GisInfo.mapType));
  478. }
  479. catch(Exception &e)
  480. {
  481. }
  482. delete pStringList;
  483. }
  484. else
  485. if (nFuncIdx > 0 && sFunc.Pos("onmouseclick"))
  486. {
  487. bCancel = true;
  488. EdMapPos->Text = sArgs;
  489. }
  490. else
  491. if (nFuncIdx > 0 && sFunc.Pos("onfacilityclick"))
  492. {
  493. bCancel = true;
  494. }
  495. else
  496. if (nFuncIdx > 0 && sFunc.Pos("onfacilityrightclick"))
  497. {
  498. bCancel = true;
  499. }
  500. else
  501. if (nFuncIdx > 0 && sFunc.Pos("onfacilitydragstart"))
  502. {
  503. bCancel = true;
  504. }
  505. else
  506. if (nFuncIdx > 0 && sFunc.Pos("onfacilitydragmove"))
  507. {
  508. bCancel = true;
  509. }
  510. else
  511. if (nFuncIdx > 0 && sFunc.Pos("onfacilitydragend"))
  512. {
  513. bCancel = true;
  514. }
  515. else
  516. if (nFuncIdx > 0 && sFunc.Pos("onlinkclick"))
  517. {
  518. bCancel = true;
  519. }
  520. else
  521. if (nFuncIdx > 0 && sFunc.Pos("onlinkrightclick"))
  522. {
  523. bCancel = true;
  524. }
  525. else
  526. if (nFuncIdx > 0 && sFunc.Pos("ondebug"))
  527. {
  528. bCancel = true;
  529. }
  530. else
  531. if (nFuncIdx > 0 && sFunc.Pos("onlayervisiblechanged"))
  532. {
  533. bCancel = true;
  534. }
  535. else
  536. if (nFuncIdx > 0 && sFunc.Pos("onextentmap"))
  537. {
  538. bCancel = true;
  539. }
  540. }
  541. catch(Exception &e)
  542. {
  543. }
  544. Cancel = bCancel;
  545. try
  546. {
  547. if (bCancel && MapCallbackFunc)
  548. {
  549. MapCallbackFunc(ASender, sFunc, sArgs, bFirst);
  550. }
  551. }
  552. catch(Exception &exception) {}
  553. }
  554. //---------------------------------------------------------------------------
  555. void TFRAMEOpenMap::WriteLog(char *AFmt, ...)
  556. {
  557. if (!reMsg->Visible) return;
  558. va_list ap;
  559. int cnt;
  560. char szFmtData[2048];
  561. try
  562. {
  563. va_start(ap, AFmt);
  564. cnt = vsprintf(szFmtData, AFmt, ap);
  565. va_end(ap);
  566. reMsg->Lines->Add(Now().FormatString("nn:ss.zzz") + ", " + String(szFmtData));
  567. }
  568. catch(Exception &exception)
  569. {
  570. }
  571. }
  572. //---------------------------------------------------------------------------
  573. void __fastcall TFRAMEOpenMap::LblZoomDblClick(TObject *Sender)
  574. {
  575. reMsg->Visible = !reMsg->Visible;
  576. }
  577. //---------------------------------------------------------------------------
  578. void __fastcall TFRAMEOpenMap::reMsgDblClick(TObject *Sender)
  579. {
  580. reMsg->Lines->Clear();
  581. }
  582. //---------------------------------------------------------------------------