123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764 |
- //---------------------------------------------------------------------------
- #include <vcl.h>
- #include "ITSSkinF.h"
- #include "ITSUtilF.h"
- #include "AppGlobalF.h"
- #include "CDSNodeF.h"
- #include "CDSLinkF.h"
- #include "CDSIfscF.h"
- #include "CDSRoadF.h"
- #include "ITSLangTransF.h"
- #pragma hdrstop
- #include "ITSSELAMF.h"
- #include "CommFlashF.h"
- //---------------------------------------------------------------------------
- #pragma package(smart_init)
- #pragma link "cxButtons"
- #pragma link "cxCalc"
- #pragma link "cxClasses"
- #pragma link "cxContainer"
- #pragma link "cxControls"
- #pragma link "cxCustomData"
- #pragma link "cxData"
- #pragma link "cxDataStorage"
- #pragma link "cxEdit"
- #pragma link "cxFilter"
- #pragma link "cxGraphics"
- #pragma link "cxGrid"
- #pragma link "cxGridCustomTableView"
- #pragma link "cxGridCustomView"
- #pragma link "cxGridLevel"
- #pragma link "cxGridTableView"
- #pragma link "cxGroupBox"
- #pragma link "cxLabel"
- #pragma link "cxLookAndFeelPainters"
- #pragma link "cxLookAndFeels"
- #pragma link "cxPC"
- #pragma link "cxPCdxBarPopupMenu"
- #pragma link "cxSplitter"
- #pragma link "cxStyles"
- #pragma link "cxTextEdit"
- #pragma link "dxSkinBlack"
- #pragma link "dxSkinBlue"
- #pragma link "dxSkinsCore"
- #pragma link "dxSkinscxPCPainter"
- #pragma link "FRAME_GoogleMapF"
- #pragma link "FRAME_LinkListF"
- #pragma link "FRAME_NodeListF"
- #pragma link "FRAME_RoadListF"
- #pragma link "FRAME_ServiceLinkListF"
- #pragma link "GMClasses"
- #pragma link "GMLinkedComponents"
- #pragma link "GMMap"
- #pragma link "GMPolyline"
- #pragma link "GMPolylineVCL"
- #pragma link "GMMarker"
- #pragma link "GMMarkerVCL"
- #pragma resource "*.dfm"
- TITSSELAM *ITSSELAM = NULL;
- //---------------------------------------------------------------------------
- __fastcall TITSSELAM::TITSSELAM(TComponent* Owner, int ALinkLevel/*=1*/)
- : TForm(Owner)
- {
- LangTrans->Translate(this, ITSDb_GetConnection());
- ITSSkin_Load(this);
- CMM_LoadForm(g_sFormsDir, this);
- LoadLocalSkin();
- FTitle = Caption;//"구간 선택";
- MapStart = false;
- FRefreshId = "";
- FSelPosX = "0";
- FSelPosY = "0";
- FSelected = false;
- FMultiSelect = false;
- FLinkId = "";
- FPosX = FPosY = 0;
- FMouseDownPosX = FMouseDownPosY = 0;
- FSelManager = new TSelManager();
- FSelLink = NULL;
- PgList->Properties->ActivePage = TabNode;
- TvList->OptionsView->NoDataToDisplayInfoText = FrmLang->lblNoInfo->Caption;//"<선택구간목록>";
- FRAMENodeList1->PnlTop->Visible = false;
- FRAMENodeList1->PnlBottom->Visible = false;
- FRAMELinkList1->PnlTop->Visible = false;
- FRAMELinkList1->PnlBottom->Visible = false;
- FRAMEServiceLinkList1->PnlTop->Visible = false;
- FRAMEServiceLinkList1->PnlBottom->Visible = false;
- FRAMERoadList1->PnlTop->Visible = false;
- FRAMERoadList1->PnlBottom->Visible = false;
- FLinkLevel = ALinkLevel;
- FRAMEGoogleMap1->BtnIconSelect->Visible = true;
- FRAMEGoogleMap1->BtnIconSelect->Enabled = true;
- FRAMEGoogleMap1->FOnZoomChanged = FRAMEGoogleMapOnZoomChange;
- OpenMap();
- }
- //---------------------------------------------------------------------------
- /*
- * 닫기버튼 이나 x버튼 클릭시 공통으로 처리하는 로직이들어간다..
- * Form과 DataModule class를 delete시킨다.
- * arguments
- *
- * return
- * void
- */
- void __fastcall TITSSELAM::CommClose()
- {
- try
- {
- CMM_SaveForm(g_sFormsDir, this);
- CloseMap();
- if (FSelManager)
- {
- delete FSelManager;
- FSelManager = NULL;
- }
- }
- catch(...)
- {
- }
- }
- //---------------------------------------------------------------------------
- void __fastcall TITSSELAM::LoadLocalSkin()
- {
- }
- //---------------------------------------------------------------------------
- /*
- * Form을 보여줄때 호출되는 event 메서드이다.
- * arguments
- * Sender : event handler 객체
- * return
- * void
- */
- void __fastcall TITSSELAM::FormShow(TObject *Sender)
- {
- Refresh();
- FormInit();
- TmrShow->Enabled = true;
- }
- //---------------------------------------------------------------------------
- void __fastcall TITSSELAM::SetLinkLevel(int ALinkLevel)
- {
- TabLink->Visible = false;
- TabLink->TabVisible = false;
- TabServiceLink->Visible = false;
- TabServiceLink->TabVisible = false;
- TabRoad->Visible = false;
- TabRoad->TabVisible = false;
- switch(ALinkLevel)
- {
- case 1:
- FRAMELinkList1->UpdateList();
- TabLink->Visible = true;
- TabLink->TabVisible = true;
- TabServiceLink->Visible = false;
- TabServiceLink->TabVisible = false;
- TabRoad->Visible = false;
- TabRoad->TabVisible = false;
- break;
- case 2:
- FRAMEServiceLinkList1->UpdateList();
- TabLink->Visible = false;
- TabLink->TabVisible = false;
- TabServiceLink->Visible = true;
- TabServiceLink->TabVisible = true;
- TabRoad->Visible = false;
- TabRoad->TabVisible = false;
- break;
- case 3:
- FRAMERoadList1->UpdateList();
- TabLink->Visible = false;
- TabLink->TabVisible = false;
- TabServiceLink->Visible = false;
- TabServiceLink->TabVisible = false;
- TabRoad->Visible = true;
- TabRoad->TabVisible = true;
- break;
- default: return;
- }
- FLinkLevel = ALinkLevel;
- }
- //---------------------------------------------------------------------------
- void __fastcall TITSSELAM::FormInit()
- {
- FRAMENodeList1->UpdateList();
- }
- //---------------------------------------------------------------------------
- void __fastcall TITSSELAM::TmrShowTimer(TObject *Sender)
- {
- TmrShow->Enabled = false;
- BtnSearchClick((TObject*)BtnSearch);
- Application->ProcessMessages();
- cxGroupBox1->Caption = cxGroupBox1->Caption + " - Level: " + String(LinkLevel);
- DrawLink();
- MapStart = true;
- RefreshId();
- }
- //---------------------------------------------------------------------------
- void __fastcall TITSSELAM::DrawLink()
- {
- TGMPolyline *pLink = GMPolyLink;
- TPolyline *pLn = NULL;
- if (FLinkLevel == 1)
- {
- pLink = GMPolyLink;
- try
- {
- ItsLinkManager->FLists.Lock();
- FOR_STL(TItsLink*, pObj, ItsLinkManager->FLists)
- {
- if (pObj->Coords.Size() < 2) continue;
- pLn = pLink->Add();
- if (!pLn) continue;
- pLn->Tag = (int)pObj;
- pLn->FObject = (TObject*)&pObj->bounds;
- pLn->Text = pObj->LINK_ID;
- FOR_STL(TItsCoord*, pCoord, pObj->Coords)
- {
- pLn->AddLinePoint(pCoord->Y, pCoord->X);
- }
- pLn->StrokeColor = clBlue;
- pLn->StrokeWeight = 4;
- pLn->StrokeOpacity = 1;
- pLn->AutoUpdatePath = true;
- pLn->Visible = true;
- pLn->Clickable = true;
- FSelManager->FLists.Push(pLn->Text, pLn);
- }
- }
- __finally
- {
- ItsLinkManager->FLists.UnLock();
- pLink->Map = FRAMEGoogleMap1->GMMap1;
- }
- }
- else
- if (FLinkLevel == 2)
- {
- pLink = GMPolyLink;
- try
- {
- ItsIfscManager->FLists.Lock();
- FOR_STL(TItsIfsc*, pObj, ItsIfscManager->FLists)
- {
- if (pObj->Coords.Size() < 2) continue;
- pLn = pLink->Add();
- if (!pLn) continue;
- pLn->Tag = (int)pObj;
- pLn->FObject = (TObject*)&pObj->bounds;
- pLn->Text = pObj->IFSC_ID;
- FOR_STL(TItsCoord*, pCoord, pObj->Coords)
- {
- pLn->AddLinePoint(pCoord->Y, pCoord->X);
- }
- pLn->StrokeColor = clBlue;
- pLn->StrokeWeight = 4;
- pLn->StrokeOpacity = 1;
- pLn->AutoUpdatePath = true;
- pLn->Visible = true;
- pLn->Clickable = true;
- FSelManager->FLists.Push(pLn->Text, pLn);
- }
- }
- __finally
- {
- ItsIfscManager->FLists.UnLock();
- pLink->Map = FRAMEGoogleMap1->GMMap1;
- }
- }
- else
- if (FLinkLevel == 3)
- {
- pLink = GMPolyLink;
- try
- {
- ItsRoadManager->FLists.Lock();
- FOR_STL(TItsRoad*, pObj, ItsRoadManager->FLists)
- {
- if (pObj->Coords.Size() < 2) continue;
- pLn = pLink->Add();
- if (!pLn) continue;
- pLn->Tag = (int)pObj;
- pLn->FObject = (TObject*)&pObj->bounds;
- pLn->Text = pObj->ROAD_ID;
- FOR_STL(TItsCoord*, pCoord, pObj->Coords)
- {
- pLn->AddLinePoint(pCoord->Y, pCoord->X);
- }
- pLn->StrokeColor = clBlue;
- pLn->StrokeWeight = 4;
- pLn->StrokeOpacity = 1;
- pLn->AutoUpdatePath = true;
- pLn->Visible = true;
- pLn->Clickable = true;
- FSelManager->FLists.Push(pLn->Text, pLn);
- }
- }
- __finally
- {
- ItsRoadManager->FLists.UnLock();
- pLink->Map = FRAMEGoogleMap1->GMMap1;
- }
- }
- GMMarkerPos->Map = FRAMEGoogleMap1->GMMap1;
- }
- //---------------------------------------------------------------------------
- void __fastcall TITSSELAM::RefreshId()
- {
- if (FRefreshId.IsEmpty()) return;
- Application->ProcessMessages();
- SelGisItem(FLinkLevel, FRefreshId);
- Application->ProcessMessages();
- }
- //---------------------------------------------------------------------------
- /*
- * Search 버튼 클릭 이벤트 핸들러
- * arguments
- * Sender : event handler 객체
- * return
- * void
- */
- void __fastcall TITSSELAM::BtnSearchClick(TObject *Sender)
- {
- Application->ProcessMessages();
- TSqlCursor sqlCrs((TControl*)BtnSearch);
- RefreshData();
- }
- //---------------------------------------------------------------------------
- /*
- * Refresh Data Event Function
- * arguments
- *
- * return
- * void
- */
- void __fastcall TITSSELAM::RefreshData()
- {
- }
- //---------------------------------------------------------------------------
- void __fastcall TITSSELAM::SelListData()
- {
- }
- //---------------------------------------------------------------------------
- /*
- * Close 버튼 클릭 이벤트 핸들러
- * arguments
- * Sender : event handler 객체
- * return
- * void
- */
- void __fastcall TITSSELAM::BtnCloseClick(TObject *Sender)
- {
- Close();
- }
- //---------------------------------------------------------------------------
- void __fastcall TITSSELAM::FormClose(TObject *Sender, TCloseAction &Action)
- {
- CommClose();
- ITSSELAM = NULL;
- //Action = caFree;
- }
- //---------------------------------------------------------------------------
- void __fastcall TITSSELAM::FRAMENodeList1TvListCellDblClick(TcxCustomGridTableView *Sender, TcxGridTableDataCellViewInfo *ACellViewInfo,
- TMouseButton AButton, TShiftState AShift, bool &AHandled)
- {
- if (!MapStart) return;
- int nIndex = Sender->DataController->FocusedRecordIndex;
- if (nIndex < 0) return;
- String sX = Sender->DataController->Values[nIndex][FRAMENodeList1->Column06->Index];
- String sY = Sender->DataController->Values[nIndex][FRAMENodeList1->Column07->Index];
- TMarker *pMarker = GMMarkerPos->Items[0];
- if (pMarker == NULL)
- pMarker = GMMarkerPos->Items[0];
- if (!pMarker) return;
- TmrPosClear->Enabled = false;
- pMarker->Visible = false;
- pMarker->Position->Lat = sY.ToDouble(); // dLat;
- pMarker->Position->Lng = sX.ToDouble(); // dLng;
- pMarker->CenterMapTo();
- pMarker->CenterMapToMarker();
- pMarker->Animation->OnDrop = false;
- pMarker->Animation->OnDrop = true;
- pMarker->Visible = true;
- TmrPosClear->Enabled = true;
- }
- //---------------------------------------------------------------------------
- void __fastcall TITSSELAM::FRAMELinkList1TvListCellDblClick(TcxCustomGridTableView *Sender, TcxGridTableDataCellViewInfo *ACellViewInfo,
- TMouseButton AButton, TShiftState AShift, bool &AHandled)
- {
- int nIndex = Sender->DataController->FocusedRecordIndex;
- if (nIndex < 0) return;
- SelGisItem(1, Sender->DataController->Values[nIndex][FRAMELinkList1->Column01->Index]);
- }
- //---------------------------------------------------------------------------
- void __fastcall TITSSELAM::FRAMEServiceLinkList1TvListCellClick(TcxCustomGridTableView *Sender, TcxGridTableDataCellViewInfo *ACellViewInfo,
- TMouseButton AButton, TShiftState AShift, bool &AHandled)
- {
- int nIndex = Sender->DataController->FocusedRecordIndex;
- if (nIndex < 0) return;
- SelGisItem(2, Sender->DataController->Values[nIndex][FRAMEServiceLinkList1->Column01->Index]);
- }
- //---------------------------------------------------------------------------
- void __fastcall TITSSELAM::FRAMERoadList1TvListCellClick(TcxCustomGridTableView *Sender, TcxGridTableDataCellViewInfo *ACellViewInfo,
- TMouseButton AButton, TShiftState AShift, bool &AHandled)
- {
- int nIndex = Sender->DataController->FocusedRecordIndex;
- if (nIndex < 0) return;
- SelGisItem(3, Sender->DataController->Values[nIndex][FRAMERoadList1->Column01->Index]);
- }
- //---------------------------------------------------------------------------
- void __fastcall TITSSELAM::BtnSelectClick(TObject *Sender)
- {
- if (TvList->DataController->RecordCount <= 0)
- {
- Application->MessageBox(lblText1->Caption.c_str(),//L"구간이 선택되지 않았습니다.\r\n지도에서 구간을 선택하세요.",
- FTitle.c_str(), MB_OK|MB_ICONERROR|MB_APPLMODAL);
- return;
- }
- FLinkId = EdLinkId->Text.Trim();
- FSelected = true;
- Close();
- Application->ProcessMessages();
- }
- //---------------------------------------------------------------------------
- void __fastcall TITSSELAM::SelGisItem(int AType, String AId)
- {
- if (!MapStart) return;
- if (AType == 0) return; //노드
- TmrClearTimer(NULL);
- TPolyline* pLn = FSelManager->FLists.Find(AId);
- if (pLn)
- {
- FSelLink = pLn;
- FSelColor= pLn->StrokeColor;
- pLn->StrokeColor = clGreen;
- pLn->ZoomToPoints();
- TmrClear->Enabled = true;
- }
- }
- //---------------------------------------------------------------------------
- void __fastcall TITSSELAM::TmrClearTimer(TObject *Sender)
- {
- TmrClear->Enabled = false;
- if (FSelLink)
- {
- FSelLink->StrokeColor = FSelColor;
- }
- FSelLink = NULL;
- }
- //---------------------------------------------------------------------------
- void __fastcall TITSSELAM::BtnDeleteClick(TObject *Sender)
- {
- try
- {
- TcxDataController *pGDC = TvList->DataController;
- TvList->BeginUpdate();
- try
- {
- for (int ii = 0; ii < pGDC->RecordCount; ii++)
- {
- String sLinkId = pGDC->Values[ii][Column01->Index];
- DeleteSelect(sLinkId);
- }
- TvList->Controller->DeleteSelection();
- }
- catch(...)
- {
- }
- }
- __finally
- {
- TvList->EndUpdate();
- }
- RefreshSelect();
- }
- //---------------------------------------------------------------------------
- bool __fastcall TITSSELAM::GetLinkId(int X, int Y, String &ALinkId)
- {
- return true;
- }
- //---------------------------------------------------------------------------
- void __fastcall TITSSELAM::UpdateSelect(String ALinkId, double X, double Y)
- {
- try
- {
- int nRow;
- TcxDataController *pGDC = TvList->DataController;
- TvList->BeginUpdate();
- try
- {
- bool bAdd = true;
- if (!FMultiSelect)
- {
- for (int ii = 0; ii < pGDC->RecordCount; ii++)
- {
- String sLinkId = pGDC->Values[ii][Column01->Index];
- DeleteSelect(sLinkId);
- }
- CMM_ClearGridTableView(TvList);
- }
- else
- {
- for (int ii = 0; ii < pGDC->RecordCount; ii++)
- {
- String sTmpLinkId = pGDC->Values[ii][Column01->Index];
- if (sTmpLinkId == ALinkId)
- {
- pGDC->Values[ii][Column02->Index] = X;
- pGDC->Values[ii][Column03->Index] = Y;
- bAdd = false;
- break;
- }
- }
- }
- if (bAdd)
- {
- nRow = pGDC->AppendRecord();
- pGDC->Values[nRow][Column01->Index] = ALinkId;
- pGDC->Values[nRow][Column02->Index] = X;
- pGDC->Values[nRow][Column03->Index] = Y;
- }
- }
- catch(...)
- {
- }
- }
- __finally
- {
- TvList->EndUpdate();
- }
- RefreshSelect();
- }
- //---------------------------------------------------------------------------
- void __fastcall TITSSELAM::DeleteSelect(String ALinkId)
- {
- TPolyline* pLn = FSelManager->FLists.Find(ALinkId);
- if (pLn)
- {
- pLn->StrokeColor = clBlue;
- }
- }
- //---------------------------------------------------------------------------
- void __fastcall TITSSELAM::FRAMEGoogleMapOnZoomChange(TObject *Sender)
- {
- int nStrokeWeight = 4;
- if (FRAMEGoogleMap1->FMapZoom >= 14)
- {
- nStrokeWeight = 8;
- }
- FOR_STL(TPolyline*, pLn, FSelManager->FLists)
- {
- pLn->StrokeWeight = nStrokeWeight;
- }
- }
- //---------------------------------------------------------------------------
- void __fastcall TITSSELAM::RefreshSelect()
- {
- if (!MapStart) return;
- try
- {
- int nRow;
- TcxDataController *pGDC = TvList->DataController;
- TvList->BeginUpdate();
- try
- {
- for (int ii = 0; ii < pGDC->RecordCount; ii++)
- {
- String sLinkId = pGDC->Values[ii][Column01->Index];
- TPolyline* pLn = FSelManager->FLists.Find(sLinkId);
- if (pLn)
- {
- pLn->StrokeColor = clRed;
- }
- }
- }
- catch(...)
- {
- }
- }
- __finally
- {
- TvList->EndUpdate();
- }
- }
- //---------------------------------------------------------------------------
- void __fastcall TITSSELAM::OpenMap()
- {
- TMarker *pMarker = GMMarkerPos->Items[0];
- if (pMarker == NULL)
- pMarker = GMMarkerPos->Items[0];
- if (pMarker)
- {
- pMarker->Icon = g_sImageDir + "pos.png";
- }
- FRAMEGoogleMap1->LinkLevel = LinkLevel;
- FRAMEGoogleMap1->LoadGisMap();
- }
- //---------------------------------------------------------------------------
- void __fastcall TITSSELAM::CloseMap()
- {
- FRAMEGoogleMap1->GMMap1->Active = false;
- }
- //---------------------------------------------------------------------------
- void __fastcall TITSSELAM::TvListCellDblClick(TcxCustomGridTableView *Sender, TcxGridTableDataCellViewInfo *ACellViewInfo,
- TMouseButton AButton, TShiftState AShift,
- bool &AHandled)
- {
- if (!MapStart) return;
- int nIndex = Sender->DataController->FocusedRecordIndex;
- if (nIndex < 0) return;
- String sX = Sender->DataController->Values[nIndex][Column02->Index];
- String sY = Sender->DataController->Values[nIndex][Column03->Index];
- TMarker *pMarker = GMMarkerPos->Items[0];
- if (pMarker == NULL)
- pMarker = GMMarkerPos->Items[0];
- if (!pMarker) return;
- TmrPosClear->Enabled = false;
- pMarker->Visible = false;
- pMarker->Position->Lat = sY.ToDouble(); // dLat;
- pMarker->Position->Lng = sX.ToDouble(); // dLng;
- pMarker->CenterMapTo();
- pMarker->CenterMapToMarker();
- pMarker->Animation->OnDrop = false;
- pMarker->Animation->OnDrop = true;
- pMarker->Visible = true;
- TmrPosClear->Enabled = true;
- }
- //---------------------------------------------------------------------------
- void __fastcall TITSSELAM::GMPolyLinkClick(TObject *Sender, TLatLng *LatLng, int Index,
- TLinkedComponent *LinkedComponent)
- {
- TGMPolyline* pGrpLink = (TGMPolyline*)Sender;
- TPolyline* pLink = pGrpLink->Items[Index];
- if (FRAMEGoogleMap1->BtnIconSelect->SpeedButtonOptions->Down)
- {
- UpdateSelect(pLink->Text, LatLng->Lng, LatLng->Lat);
- }
- }
- //---------------------------------------------------------------------------
- void __fastcall TITSSELAM::FRAMEGoogleMap1GMMap1Click(TObject *Sender, TLatLng *LatLng,
- double X, double Y)
- {
- StatusBar->Panels->Items[1]->Text = "Click: " + LatLng->LngToStr(FRAMEGoogleMap1->GMMap1->Precision) + "," + LatLng->LatToStr(FRAMEGoogleMap1->GMMap1->Precision);
- }
- //---------------------------------------------------------------------------
- void __fastcall TITSSELAM::TmrPosClearTimer(TObject *Sender)
- {
- TmrPosClear->Enabled = false;
- TMarker *pMarker = GMMarkerPos->Items[0];
- if (pMarker == NULL)
- pMarker = GMMarkerPos->Items[0];
- if (pMarker)
- {
- pMarker->Visible = false;
- }
- }
- //---------------------------------------------------------------------------
|