Vanya_Shestakov

Untitled

Oct 25th, 2021 (edited)
413
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 42.76 KB | None | 0 0
  1. #ifndef MainViewH
  2. #define MainViewH
  3.  
  4. #include <System.Classes.hpp>
  5. #include <Vcl.Controls.hpp>
  6. #include <Vcl.StdCtrls.hpp>
  7. #include <Vcl.Forms.hpp>
  8. #include <Vcl.Edge.hpp>
  9. #include <WebView2.hpp>
  10. #include <Winapi.ActiveX.hpp>
  11. #include <Vcl.TitleBarCtrls.hpp>
  12. #include <Vcl.ComCtrls.hpp>
  13. #include <Vcl.ToolWin.hpp>
  14. #include <Vcl.WinXCtrls.hpp>
  15. #include <SHDocVw.hpp>
  16. #include <Vcl.OleCtrls.hpp>
  17. #include <Vcl.Buttons.hpp>
  18. #include <Vcl.ExtCtrls.hpp>
  19. #include <Vcl.Graphics.hpp>
  20. #include <Vcl.Imaging.pngimage.hpp>
  21. #include <Vcl.Menus.hpp>
  22. #include <VCLTee.TeCanvas.hpp>
  23. #include <System.ImageList.hpp>
  24. #include <Vcl.ImgList.hpp>
  25. #include <vector>
  26. #include <utility>
  27.  
  28.  
  29. #include "PageInfoUnit.h"
  30. #include "BookmarksReader.h"
  31. #include "BookmarksWriter.h"
  32. #include "StringConverter.h"
  33. #include "SettingsView.h"
  34. #include "BookmarksManager.h"
  35. #include "HistoryManager.h"
  36. #include "AddBookmarkView.h"
  37. #include "AnonymModeView.h"
  38. #include "AboutProgramView.h"
  39.  
  40. class TWebView : public TForm
  41. {
  42. __published:
  43.  
  44.     TEdit *addressBar;
  45.     TTitleBarPanel *TitleBarPanel1;
  46.     TImage *backBtn;
  47.     TImage *forwardBtn;
  48.     TImage *updateBtn;
  49.     TImage *homeBtn;
  50.     TImage *searchBtn;
  51.     TImage *addBookmarkBtn;
  52.     TImage *settingsBtn;
  53.     TImage *closeBtn;
  54.     TImage *expandBtn;
  55.     TImage *hideBtn;
  56.     TImage *newTabBtn;
  57.     TPageControl *PageControl;
  58.     TImage *showBookmarksBtn;
  59.     TComboBox *bookmarksBox;
  60.     TPopupMenu *tabsPopup;
  61.     TMenuItem *closeChoice;
  62.     TActivityIndicator *activityIndicator;
  63.     TImage *deleteBookmarkBtn;
  64.     TPopupMenu *bookmarksPopup;
  65.     TMenuItem *N1;
  66.     TImage *disactivateAnonymModeBtn;
  67.     TImage *anonymModeIndicatorBtn;
  68.     TImage *activateAnonymModeBtn;
  69.     TImage *aboutProgramBtn;
  70.     TImageList *ImageList;
  71.     TImage *Image2;
  72.     void __fastcall FormCreate(TObject *Sender);
  73.     void __fastcall backBtnClick(TObject *Sender);
  74.     void __fastcall forwardBtnClick(TObject *Sender);
  75.     void __fastcall updateBtnClick(TObject *Sender);
  76.     void __fastcall searchBtnClick(TObject *Sender);
  77.     void __fastcall backBtnMouseDown(TObject *Sender, TMouseButton Button, TShiftState Shift,
  78.           int X, int Y);
  79.     void __fastcall backBtnMouseUp(TObject *Sender, TMouseButton Button, TShiftState Shift,
  80.           int X, int Y);
  81.     void __fastcall forwardBtnMouseDown(TObject *Sender, TMouseButton Button, TShiftState Shift,
  82.           int X, int Y);
  83.     void __fastcall forwardBtnMouseUp(TObject *Sender, TMouseButton Button, TShiftState Shift,
  84.           int X, int Y);
  85.     void __fastcall updateBtnMouseDown(TObject *Sender, TMouseButton Button, TShiftState Shift,
  86.           int X, int Y);
  87.     void __fastcall updateBtnMouseUp(TObject *Sender, TMouseButton Button, TShiftState Shift,
  88.           int X, int Y);
  89.     void __fastcall homeBtnMouseDown(TObject *Sender, TMouseButton Button, TShiftState Shift,
  90.           int X, int Y);
  91.     void __fastcall homeBtnMouseUp(TObject *Sender, TMouseButton Button, TShiftState Shift,
  92.           int X, int Y);
  93.     void __fastcall addressBarClick(TObject *Sender);
  94.     void __fastcall homeBtnClick(TObject *Sender);
  95.     void __fastcall searchBtnMouseDown(TObject *Sender, TMouseButton Button, TShiftState Shift,
  96.           int X, int Y);
  97.     void __fastcall searchBtnMouseUp(TObject *Sender, TMouseButton Button, TShiftState Shift,
  98.           int X, int Y);
  99.     void __fastcall settingsBtnMouseDown(TObject *Sender, TMouseButton Button, TShiftState Shift,
  100.           int X, int Y);
  101.     void __fastcall settingsBtnMouseUp(TObject *Sender, TMouseButton Button, TShiftState Shift,
  102.           int X, int Y);
  103.     void __fastcall closeBtnClick(TObject *Sender);
  104.     void __fastcall closeBtnMouseDown(TObject *Sender, TMouseButton Button, TShiftState Shift,
  105.           int X, int Y);
  106.     void __fastcall closeBtnMouseUp(TObject *Sender, TMouseButton Button, TShiftState Shift,
  107.           int X, int Y);
  108.     void __fastcall hideBtnClick(TObject *Sender);
  109.     void __fastcall hideBtnMouseDown(TObject *Sender, TMouseButton Button, TShiftState Shift,
  110.           int X, int Y);
  111.     void __fastcall hideBtnMouseUp(TObject *Sender, TMouseButton Button, TShiftState Shift,
  112.           int X, int Y);
  113.     void __fastcall expandBtnClick(TObject *Sender);
  114.     void __fastcall addressBarMouseLeave(TObject *Sender);
  115.     void __fastcall newTabBtnClick(TObject *Sender);
  116.     void __fastcall PageControlChange(TObject *Sender);
  117.     void __fastcall PageControlMouseUp(TObject *Sender, TMouseButton Button, TShiftState Shift,
  118.           int X, int Y);
  119.     void __fastcall showBookmarksBtnClick(TObject *Sender);
  120.     void __fastcall addBookmarkBtnClick(TObject *Sender);
  121.     void __fastcall newTabBtnMouseDown(TObject *Sender, TMouseButton Button, TShiftState Shift,
  122.           int X, int Y);
  123.     void __fastcall newTabBtnMouseUp(TObject *Sender, TMouseButton Button, TShiftState Shift,
  124.           int X, int Y);
  125.     void __fastcall showBookmarksBtnMouseDown(TObject *Sender, TMouseButton Button,
  126.           TShiftState Shift, int X, int Y);
  127.     void __fastcall showBookmarksBtnMouseUp(TObject *Sender, TMouseButton Button, TShiftState Shift,
  128.           int X, int Y);
  129.     void __fastcall bookmarksBoxSelect(TObject *Sender);
  130.     void __fastcall deleteBookmarkBtnClick(TObject *Sender);
  131.     void __fastcall settingsBtnClick(TObject *Sender);
  132.     void __fastcall closeChoiceClick(TObject *Sender);
  133.     void __fastcall FormKeyPress(TObject *Sender, System::WideChar &Key);
  134.     void __fastcall activateAnonymModeBtnClick(TObject *Sender);
  135.     void __fastcall disactivateAnonymModeBtnClick(TObject *Sender);
  136.     void __fastcall anonymModeIndicatorBtnClick(TObject *Sender);
  137.     void __fastcall PageControlMouseMove(TObject *Sender, TShiftState Shift, int X,
  138.           int Y);
  139.     void __fastcall aboutProgramBtnClick(TObject *Sender);
  140.  
  141. private:
  142.  
  143.     bool isFullScreen = false;
  144.     bool isLoaded = true;
  145.     bool isSelectedBar = false;
  146.     bool isAnonymMode = false;
  147.     int tabId = 0;
  148.     int tabPopupIndex = 0;
  149.     int loadingTab = 0;
  150.  
  151.     const int ANIMATION_OFFSET = 3;
  152.     const int TAB_POPUP_OFFSET = 75;
  153.     const String NEW_TAB_CAPTION = "Новая вкладка";
  154.     const String SEARCH_URL = "https://www.google.com/search?q=";
  155.     const String TAB_SPACE = "         ";
  156.     const String TAB_NAME_PREFIX = "tab";
  157.     const String BROWSER_NAME_POSTFIX = "_browser";
  158.     const std::string SECURE_URL_PREFIX = "https://";
  159.     const std::string URL_PREFIX = "http://";
  160.     const std::string BOOKMARKS_FILENAME = "bookmarks";
  161.     const wchar_t* BOOKMARKS_FILE_ACCESS_WARNING = L"Файл с закладками повреждён, все изменения сохранены не будут";
  162.     const wchar_t* MESSAGE_TITLE = L"NetBar";
  163.  
  164. public:
  165.     __fastcall TWebView(TComponent* Owner);
  166.     void createNewTab();
  167.     TWebBrowser* getCurrentBrowser();
  168.     void __fastcall DocumentComplete(TObject *ASender, _di_IDispatch const pDisp,
  169.           const OleVariant &URL);
  170.     void __fastcall TitleChange(TObject *ASender, const WideString Text);
  171.     void __fastcall NewWindow3(TObject *ASender, _di_IDispatch &ppDisp, WordBool &Cancel,
  172.            unsigned int val, const WideString bstrUrlContext, const WideString bstrUrl);
  173.     void __fastcall BeforeNavigate2(TObject *ASender, _di_IDispatch const pDisp,
  174.           const OleVariant &URL, const OleVariant &Flags, const OleVariant &TargetFrameName,
  175.           const OleVariant &PostData, const OleVariant &Headers,
  176.           WordBool &Cancel);
  177.     void updateBookmarksBox();
  178.     void registerSiteVisit(std::string title, std::string url);
  179.     void setAddBookmarkBtnVisible(bool isVisible);
  180.     void search(std::string request);
  181.     void setLoadingStatus(bool status);
  182.     void closeTab(int index);
  183.  
  184.     String title = "";
  185.     String pageURL = "";
  186.     BookmarksManager *bookmarksManager;
  187.     HistoryManager *historyManager;
  188.     BrowserManager *browserManager;
  189.     StringConverter *converter;
  190.     String homepageUrl;
  191.  
  192. };
  193. extern PACKAGE TWebView *WebView;
  194. #endif
  195.  
  196. #include <vcl.h>
  197. #include <vector>
  198. #include <fstream>
  199. #include <string>
  200. #pragma hdrstop
  201. #include "MainView.h"
  202.  
  203. #pragma package(smart_init)
  204. #pragma resource "*.dfm"
  205.  
  206. TWebView *WebView;
  207.  
  208. __fastcall TWebView::TWebView(TComponent* Owner)
  209.     : TForm(Owner)
  210. {
  211.     bookmarksManager = new BookmarksManager();
  212.     historyManager = new HistoryManager();
  213.     browserManager = new BrowserManager();
  214.     converter = new StringConverter();
  215.     homepageUrl = converter->convertToSystemString(browserManager->getHomepageUrl());
  216. }
  217.  
  218. void __fastcall TWebView::FormCreate(TObject *Sender)
  219. {
  220.     createNewTab();
  221.     auto bookmarks = bookmarksManager->getBookmarks();
  222.     for (int i = 0; i < bookmarks.size(); i++)
  223.     {
  224.         bookmarksBox
  225.             ->Items
  226.             ->Add(converter->convertToSystemString(bookmarks[i].first));
  227.     }
  228. }
  229.  
  230. void __fastcall TWebView::backBtnMouseDown(TObject *Sender, TMouseButton Button, TShiftState Shift,
  231.           int X, int Y)
  232. {
  233.     backBtn->Top = backBtn->Top + ANIMATION_OFFSET;
  234. }
  235.  
  236. void __fastcall TWebView::backBtnMouseUp(TObject *Sender, TMouseButton Button, TShiftState Shift,
  237.           int X, int Y)
  238. {
  239.     backBtn->Top = backBtn->Top - ANIMATION_OFFSET;
  240. }
  241.  
  242. void __fastcall TWebView::forwardBtnMouseDown(TObject *Sender, TMouseButton Button,
  243.           TShiftState Shift, int X, int Y)
  244. {
  245.     forwardBtn->Top = forwardBtn->Top + ANIMATION_OFFSET;
  246. }
  247.  
  248. void __fastcall TWebView::forwardBtnMouseUp(TObject *Sender, TMouseButton Button, TShiftState Shift,
  249.           int X, int Y)
  250. {
  251.     forwardBtn->Top = forwardBtn->Top - ANIMATION_OFFSET;
  252. }
  253.  
  254. void __fastcall TWebView::updateBtnMouseDown(TObject *Sender, TMouseButton Button, TShiftState Shift,
  255.           int X, int Y)
  256. {
  257.     updateBtn->Top = updateBtn->Top + ANIMATION_OFFSET;
  258. }
  259.  
  260. void __fastcall TWebView::updateBtnMouseUp(TObject *Sender, TMouseButton Button, TShiftState Shift,
  261.           int X, int Y)
  262. {
  263.     updateBtn->Top = updateBtn->Top - ANIMATION_OFFSET;
  264. }
  265.  
  266. void __fastcall TWebView::homeBtnMouseDown(TObject *Sender, TMouseButton Button, TShiftState Shift,
  267.           int X, int Y)
  268. {
  269.     homeBtn->Top = homeBtn->Top + ANIMATION_OFFSET;
  270. }
  271.  
  272. void __fastcall TWebView::homeBtnMouseUp(TObject *Sender, TMouseButton Button, TShiftState Shift,
  273.           int X, int Y)
  274. {
  275.     homeBtn->Top = homeBtn->Top - ANIMATION_OFFSET;
  276. }
  277.  
  278. void __fastcall TWebView::searchBtnMouseDown(TObject *Sender, TMouseButton Button, TShiftState Shift,
  279.           int X, int Y)
  280. {
  281.     searchBtn->Top = searchBtn->Top + ANIMATION_OFFSET;
  282. }
  283.  
  284. void __fastcall TWebView::searchBtnMouseUp(TObject *Sender, TMouseButton Button, TShiftState Shift,
  285.           int X, int Y)
  286. {
  287.     searchBtn->Top = searchBtn->Top - ANIMATION_OFFSET;
  288. }
  289.  
  290. void __fastcall TWebView::settingsBtnMouseDown(TObject *Sender, TMouseButton Button,
  291.           TShiftState Shift, int X, int Y)
  292. {
  293.     settingsBtn->Top = settingsBtn->Top + ANIMATION_OFFSET;
  294. }
  295.  
  296. void __fastcall TWebView::settingsBtnMouseUp(TObject *Sender, TMouseButton Button, TShiftState Shift,
  297.           int X, int Y)
  298. {
  299.     settingsBtn->Top = settingsBtn->Top - ANIMATION_OFFSET;
  300. }
  301.  
  302. void __fastcall TWebView::newTabBtnMouseDown(TObject *Sender, TMouseButton Button,
  303.           TShiftState Shift, int X, int Y)
  304. {
  305.     newTabBtn->Top = newTabBtn->Top + ANIMATION_OFFSET;
  306. }
  307.  
  308. void __fastcall TWebView::newTabBtnMouseUp(TObject *Sender, TMouseButton Button, TShiftState Shift,
  309.           int X, int Y)
  310. {
  311.     newTabBtn->Top = newTabBtn->Top - ANIMATION_OFFSET;
  312. }
  313.  
  314. void __fastcall TWebView::showBookmarksBtnMouseDown(TObject *Sender, TMouseButton Button,
  315.           TShiftState Shift, int X, int Y)
  316. {
  317.     showBookmarksBtn->Top = showBookmarksBtn->Top + ANIMATION_OFFSET;
  318. }
  319.  
  320. void __fastcall TWebView::showBookmarksBtnMouseUp(TObject *Sender, TMouseButton Button,
  321.           TShiftState Shift, int X, int Y)
  322. {
  323.     showBookmarksBtn->Top = showBookmarksBtn->Top - ANIMATION_OFFSET;
  324. }
  325.  
  326. void __fastcall TWebView::closeBtnMouseDown(TObject *Sender, TMouseButton Button,
  327.           TShiftState Shift, int X, int Y)
  328. {
  329.     closeBtn->Top = closeBtn->Top + ANIMATION_OFFSET;
  330. }
  331.  
  332. void __fastcall TWebView::closeBtnMouseUp(TObject *Sender, TMouseButton Button, TShiftState Shift,
  333.           int X, int Y)
  334. {
  335.     closeBtn->Top = closeBtn->Top - ANIMATION_OFFSET;
  336. }
  337.  
  338.  
  339. void __fastcall TWebView::hideBtnMouseDown(TObject *Sender, TMouseButton Button, TShiftState Shift,
  340.           int X, int Y)
  341. {
  342.     hideBtn->Top = hideBtn->Top + ANIMATION_OFFSET;
  343. }
  344.  
  345. void __fastcall TWebView::hideBtnMouseUp(TObject *Sender, TMouseButton Button, TShiftState Shift,
  346.           int X, int Y)
  347. {
  348.     hideBtn->Top = hideBtn->Top - ANIMATION_OFFSET;
  349. }
  350.  
  351. void __fastcall TWebView::hideBtnClick(TObject *Sender)
  352. {
  353.     Application->Minimize();
  354. }
  355.  
  356. void __fastcall TWebView::closeBtnClick(TObject *Sender)
  357. {
  358.    Application->Terminate();
  359. }
  360.  
  361.  
  362. void __fastcall TWebView::expandBtnClick(TObject *Sender)
  363. {
  364.     if (isFullScreen)
  365.     {
  366.         WebView->WindowState = wsNormal;
  367.         isFullScreen = false;
  368.     }
  369.     else
  370.     {
  371.         WebView->WindowState = wsMaximized;
  372.         isFullScreen = true;
  373.     }
  374. }
  375.  
  376. void __fastcall TWebView::backBtnClick(TObject *Sender)
  377. {
  378.     getCurrentBrowser()->GoBack();
  379. }
  380.  
  381. void __fastcall TWebView::forwardBtnClick(TObject *Sender)
  382. {
  383.     getCurrentBrowser()->GoForward();
  384. }
  385.  
  386. void __fastcall TWebView::updateBtnClick(TObject *Sender)
  387. {
  388.     getCurrentBrowser()->Refresh();
  389. }
  390.  
  391. void __fastcall TWebView::searchBtnClick(TObject *Sender)
  392. {
  393.     search(converter->convertToStdString(addressBar->Text));
  394. }
  395. void __fastcall TWebView::homeBtnClick(TObject *Sender)
  396. {
  397.     getCurrentBrowser()->Navigate(homepageUrl);
  398. }
  399.  
  400. void TWebView::search(std::string request)
  401. {
  402.     bool isPrefixContains = request.rfind(URL_PREFIX, 0) == 0  ||
  403.                             request.rfind(SECURE_URL_PREFIX, 0) == 0;
  404.     if (isPrefixContains)
  405.     {
  406.         getCurrentBrowser()->Navigate(converter->convertToSystemString(request));
  407.     }
  408.     else
  409.     {
  410.         getCurrentBrowser()->Navigate(SEARCH_URL + addressBar->Text);
  411.     }
  412. }
  413.  
  414. void __fastcall TWebView::addressBarClick(TObject *Sender)
  415. {
  416.     addressBar->Text = pageURL;
  417.     if (!isSelectedBar)
  418.     {
  419.         addressBar->SelectAll();
  420.     }
  421.     isSelectedBar = true;
  422. }
  423.  
  424. void __fastcall TWebView::addressBarMouseLeave(TObject *Sender)
  425. {
  426.     isSelectedBar = false;
  427. }
  428.  
  429.  
  430. void __fastcall TWebView::TitleChange(TObject *ASender, const WideString Text)
  431. {
  432.     title = Text;
  433.     if (PageControl->ActivePageIndex == loadingTab)
  434.     {
  435.         addressBar->Text = title;
  436.     }
  437.     if (!isLoaded) {
  438.         PageControl->Pages[loadingTab]->Caption = TAB_SPACE + title + TAB_SPACE;
  439.     }
  440.     else
  441.     {
  442.         addressBar->Text = title;
  443.         PageControl->ActivePage->Caption = TAB_SPACE + title + TAB_SPACE;
  444.     }
  445. }
  446.  
  447. void __fastcall TWebView::DocumentComplete(TObject *ASender, _di_IDispatch const pDisp, const OleVariant &URL)
  448. {
  449.     pageURL = URL;
  450.     setLoadingStatus(false);
  451.     if (!isAnonymMode)
  452.     {
  453.         registerSiteVisit(converter->convertToStdString(title), converter->convertToStdString(URL));
  454.     }
  455.     setAddBookmarkBtnVisible(!bookmarksManager->contains(converter->convertToStdString(pageURL)));
  456. }
  457.  
  458. void TWebView::registerSiteVisit(std::string title, std::string url)
  459. {
  460.     time_t now = time(0);
  461.     std::string stringTime = ctime(&now);
  462.     historyManager->addSiteVisit(stringTime, title, url);
  463. }
  464.  
  465. void TWebView::setAddBookmarkBtnVisible(bool isVisible)
  466. {
  467.     deleteBookmarkBtn->Visible = !isVisible;
  468.     addBookmarkBtn->Visible = isVisible;
  469. }
  470.  
  471. void __fastcall TWebView::NewWindow3(TObject *ASender, _di_IDispatch &ppDisp, WordBool &Cancel,
  472.           unsigned int val, const WideString bstrUrlContext, const WideString bstrUrl)
  473. {
  474.     createNewTab();
  475.     getCurrentBrowser()->Navigate(bstrUrl);
  476.     Cancel = true;
  477. }
  478.  
  479. void __fastcall TWebView::newTabBtnClick(TObject *Sender)
  480. {
  481.     if (isLoaded)
  482.     {
  483.         createNewTab();
  484.     }
  485. }
  486.  
  487. void TWebView::createNewTab()
  488. {
  489.     TTabSheet *tab = new TTabSheet(PageControl);
  490.     tab->Caption = NEW_TAB_CAPTION;
  491.     tab->PageControl = PageControl;
  492.     PageControl->ActivePage = tab;
  493.     tab->Name = TAB_NAME_PREFIX + String(tabId);
  494.  
  495.     TWebBrowser *browser = new TWebBrowser(PageControl);
  496.     browser->SelectedEngine = TWebBrowser::TSelectedEngine::EdgeOnly;
  497.     browser->TOleControl::Parent = tab;
  498.     browser->Width = tab->Width;
  499.     browser->Height = tab->Height;
  500.     browser->Align = alClient;
  501.     browser->Navigate(homepageUrl);
  502.     tab->Tag = Integer(browser);
  503.     browser->TOleControl::Name = tab->Name + BROWSER_NAME_POSTFIX;
  504.  
  505.     browser->OnDocumentComplete = DocumentComplete;
  506.     browser->OnNewWindow3 = NewWindow3;
  507.     browser->OnTitleChange = TitleChange;
  508.     browser->OnBeforeNavigate2 = BeforeNavigate2;
  509.  
  510.     tabId++;
  511. }
  512.  
  513. void TWebView::closeTab(int index)
  514. {
  515.     PageControl->Pages[index]->Free();
  516.     setLoadingStatus(false);
  517.     if (index != PageControl->PageCount)
  518.     {
  519.         PageControl->ActivePageIndex = index;
  520.     }
  521.     else
  522.     {
  523.         PageControl->ActivePageIndex = index - 1;
  524.     }
  525.     title = getCurrentBrowser()->LocationName;
  526.     pageURL = getCurrentBrowser()->LocationURL;
  527.     addressBar->Text = title;
  528.     setAddBookmarkBtnVisible(!bookmarksManager->contains(converter->convertToStdString(pageURL)));
  529. }
  530.  
  531. void __fastcall TWebView::PageControlChange(TObject *Sender)
  532. {
  533.     title = getCurrentBrowser()->LocationName;
  534.     pageURL = getCurrentBrowser()->LocationURL;
  535.     addressBar->Text = title;
  536.     setAddBookmarkBtnVisible(!bookmarksManager->contains(converter->convertToStdString(pageURL)));
  537. }
  538.  
  539. void TWebView::setLoadingStatus(bool status)
  540. {
  541.     isLoaded = !status;
  542.     if (status)
  543.     {
  544.         activityIndicator->StartAnimation();
  545.     }
  546.     else
  547.     {
  548.         activityIndicator->StopAnimation();
  549.     }
  550.     updateBtn->Visible = !status;
  551.     activityIndicator->Visible = status;
  552. }
  553.  
  554. void __fastcall TWebView::PageControlMouseUp(TObject *Sender, TMouseButton Button,
  555.           TShiftState Shift, int X, int Y)
  556. {
  557.     const int CLOSE_BTN_SIZE = 20;
  558.     if (Button == mbLeft)
  559.     {
  560.         TRect tabRect = PageControl->TabRect(PageControl->ActivePage->TabIndex);
  561.  
  562.         bool isClose = PtInRect(
  563.             Classes::Rect(tabRect.Left, tabRect.Top,
  564.             tabRect.Left + CLOSE_BTN_SIZE, tabRect.Top + CLOSE_BTN_SIZE),
  565.             Classes::Point(X, Y));
  566.  
  567.         if (isClose && PageControl->PageCount > 1)
  568.         {
  569.             closeTab(PageControl->IndexOfTabAt(X, Y));
  570.         }
  571.     }
  572. }
  573.  
  574. TWebBrowser* TWebView::getCurrentBrowser()
  575. {
  576.     return (TWebBrowser*) PageControl
  577.         ->ActivePage
  578.         ->FindChildControl(PageControl->ActivePage->Name + BROWSER_NAME_POSTFIX);
  579. }
  580.  
  581. void __fastcall TWebView::showBookmarksBtnClick(TObject *Sender)
  582. {
  583.     bookmarksBox->DroppedDown = true;
  584. }
  585.  
  586. void __fastcall TWebView::addBookmarkBtnClick(TObject *Sender)
  587. {
  588.     if (isLoaded)
  589.     {
  590.         AddBookmarkForm->ShowModal();
  591.     }
  592. }
  593.  
  594. void TWebView::updateBookmarksBox()
  595. {
  596.     bookmarksBox->Clear();
  597.     auto bookmarks = bookmarksManager->getBookmarks();
  598.     for (int i = 0; i < bookmarks.size(); i++)
  599.     {
  600.         bookmarksBox
  601.             ->Items
  602.             ->Add(converter->convertToSystemString(bookmarks[i].first));
  603.     }
  604. }
  605.  
  606. void __fastcall TWebView::BeforeNavigate2(TObject *ASender, _di_IDispatch const pDisp,
  607.           const OleVariant &URL, const OleVariant &Flags, const OleVariant &TargetFrameName,
  608.           const OleVariant &PostData, const OleVariant &Headers,
  609.           WordBool &Cancel)
  610. {
  611.     loadingTab = PageControl->ActivePageIndex;
  612.     setLoadingStatus(true);
  613. }
  614.  
  615. void __fastcall TWebView::bookmarksBoxSelect(TObject *Sender)
  616. {
  617.     auto bookmarks = bookmarksManager->getBookmarks();
  618.     String url = converter->convertToSystemString(bookmarks[bookmarksBox->ItemIndex].second);
  619.     getCurrentBrowser()->Navigate(url);
  620. }
  621.  
  622. void __fastcall TWebView::deleteBookmarkBtnClick(TObject *Sender)
  623. {
  624.     if (isLoaded)
  625.     {
  626.         bool isOpenFile = bookmarksManager->removeBookmark(converter->convertToStdString(pageURL));
  627.         if (!isOpenFile)
  628.         {
  629.             Application
  630.                 ->MessageBox(BOOKMARKS_FILE_ACCESS_WARNING,
  631.                          MESSAGE_TITLE,
  632.                          MB_OK | MB_ICONWARNING);
  633.         }
  634.         updateBookmarksBox();
  635.         addBookmarkBtn->Visible = true;
  636.         deleteBookmarkBtn->Visible = false;
  637.     }
  638. }
  639.  
  640. void __fastcall TWebView::settingsBtnClick(TObject *Sender)
  641. {
  642.     SettingsForm->ShowModal();
  643. }
  644.  
  645. void __fastcall TWebView::closeChoiceClick(TObject *Sender)
  646. {
  647.     PageControl->Pages[tabPopupIndex]->Free();
  648.     title = getCurrentBrowser()->LocationName;
  649.     pageURL = getCurrentBrowser()->LocationURL;
  650.     addressBar->Text = title;
  651.     setAddBookmarkBtnVisible(!bookmarksManager->contains(converter->convertToStdString(pageURL)));
  652. }
  653.  
  654. void __fastcall TWebView::FormKeyPress(TObject *Sender, System::WideChar &Key)
  655. {
  656.     if(Key == 13)
  657.     {
  658.         search(converter->convertToStdString(addressBar->Text));
  659.     }
  660. }
  661.  
  662. void __fastcall TWebView::activateAnonymModeBtnClick(TObject *Sender)
  663. {
  664.     activateAnonymModeBtn->Visible = false;
  665.     disactivateAnonymModeBtn->Visible = true;
  666.     anonymModeIndicatorBtn->Visible = true;
  667.     isAnonymMode = true;
  668. }
  669.  
  670. void __fastcall TWebView::disactivateAnonymModeBtnClick(TObject *Sender)
  671. {
  672.     activateAnonymModeBtn->Visible = true;
  673.     disactivateAnonymModeBtn->Visible = false;
  674.     anonymModeIndicatorBtn->Visible = false;
  675.     isAnonymMode = false;
  676. }
  677.  
  678. void __fastcall TWebView::anonymModeIndicatorBtnClick(TObject *Sender)
  679. {
  680.     AnonymModeForm->ShowModal();
  681. }
  682.  
  683. void __fastcall TWebView::PageControlMouseMove(TObject *Sender, TShiftState Shift,
  684.           int X, int Y)
  685. {
  686.     TRect R = PageControl->TabRect(PageControl->IndexOfTabAt(X, Y));
  687.     if (PtInRect(Classes::Rect(R.Left, R.Top, R.Left + 20, R.Top + 20), Classes::Point(X, Y)))
  688.     {
  689.         PageControl->Cursor = crHandPoint;
  690.     }
  691.     else
  692.     {
  693.         PageControl->Cursor = crDefault;
  694.     }
  695. }
  696.  
  697. void __fastcall TWebView::aboutProgramBtnClick(TObject *Sender)
  698. {
  699.     AboutProgramForm->ShowModal();
  700. }
  701.  
  702. #ifndef SettingsViewH
  703. #define SettingsViewH
  704.  
  705. #include <System.Classes.hpp>
  706. #include <Vcl.Controls.hpp>
  707. #include <Vcl.StdCtrls.hpp>
  708. #include <Vcl.Forms.hpp>
  709. #include <Vcl.TitleBarCtrls.hpp>
  710. #include <Vcl.ExtCtrls.hpp>
  711. #include <Vcl.Imaging.pngimage.hpp>
  712. #include <Vcl.Buttons.hpp>
  713. #include "BrowserManager.h"
  714. #include "MainView.h"
  715.  
  716. class TSettingsForm : public TForm
  717. {
  718.  
  719. __published:
  720.     TImage *hideBtn;
  721.     TImage *closeBtn;
  722.     TLabel *settingsTitle;
  723.     TLabel *casheTitle;
  724.     TLabel *casheSizeTitle;
  725.     TLabel *casheSizeLabel;
  726.     TBitBtn *clearCasheBtn;
  727.     TLabel *browserDataTitle;
  728.     TLabel *browserDataSizeTitle;
  729.     TLabel *browserDataSizeLabel;
  730.     TBitBtn *clearBrowserDataBtn;
  731.     TLabel *browserHistoryTitle;
  732.     TLabel *browserHistorySizeTitle;
  733.     TLabel *browserHistorySizeLabel;
  734.     TBitBtn *clearBrowserHistoryBtn;
  735.     TLabel *bookmarksTitle;
  736.     TLabel *bookmarksAmountTitle;
  737.     TLabel *Label5;
  738.     TBitBtn *clearBookmarksBtn;
  739.     TLabel *bookmarksAmountLabel;
  740.     TListBox *historyBox;
  741.     TLabel *Label3;
  742.     TEdit *homepageUrlEdit;
  743.     TBitBtn *changeHomepageBtn;
  744.     TLabel *Label1;
  745.     TBitBtn *showHistoryBtn;
  746.     void __fastcall closeBtnClick(TObject *Sender);
  747.     void __fastcall hideBtnClick(TObject *Sender);
  748.     void __fastcall FormShow(TObject *Sender);
  749.     void __fastcall clearCasheBtnClick(TObject *Sender);
  750.     void __fastcall clearBrowserDataBtnClick(TObject *Sender);
  751.     void __fastcall clearBookmarksBtnClick(TObject *Sender);
  752.     void __fastcall clearBrowserHistoryBtnClick(TObject *Sender);
  753.     void __fastcall showHistoryBtnClick(TObject *Sender);
  754.     void __fastcall historyBoxDblClick(TObject *Sender);
  755.     void __fastcall changeHomepageBtnClick(TObject *Sender);
  756.  
  757. private:
  758.  
  759.     BrowserManager *browserManager;
  760.     bool isOpenedHistory;
  761.     const int KB_SIZE = 1024;
  762.     const int EXTENDED_HEIGHT = 840;
  763.     const int DEFAULT_HEIGHT = 600;
  764.     const int EXTENDED_WIDTH = 1050;
  765.     const int DEFAULT_WIDTH = 500;
  766.     const wchar_t* MESSAGE_TITLE = L"NetBar";
  767.     const wchar_t* RESTART_WARNING = L"Для того, чтобы изменения вступили в силу, приложение сейчас перезапустится";
  768.     const wchar_t* BROWSER_CLEANING_WARNING = L"Очистка данных браузера приведёт к удалению всех паролей, cookie файлов, кэша и др. После очистки приложение будет перезапущено. Вы действительно хотите очистить все данные браузера?";
  769.     const wchar_t* BOOKMARKS_CLEANING_WARNING = L"Вы действительно хотите удалить все закладки безвозвратно";
  770.     const wchar_t* HOMEPAGE_WARNING = L"Внутренние файлы повреждены, изменения сохранены не будут";
  771.     const wchar_t* HOMEPAGE_SUCCESS = L"Домашняя страница успешно обновлена";
  772.     const String SHOW_HISTORY_CAPTION = "Показать историю";
  773.     const String HIDE_HISTORY_CAPTION = "Скрыть историю";
  774.  
  775. public:
  776.  
  777.     __fastcall TSettingsForm(TComponent* Owner);
  778.     void updateHistoryBox();
  779.  
  780. };
  781. extern PACKAGE TSettingsForm *SettingsForm;
  782. #endif
  783.  
  784. #include <vcl.h>
  785. #pragma hdrstop
  786.  
  787. #include "SettingsView.h"
  788. #include "SiteVisit.h"
  789. #include <vector>
  790.  
  791. #pragma resource "*.dfm"
  792. TSettingsForm *SettingsForm;
  793. __fastcall TSettingsForm::TSettingsForm(TComponent* Owner)
  794.     : TForm(Owner)
  795. {
  796.     browserManager = new BrowserManager();
  797. }
  798.  
  799. void __fastcall TSettingsForm::closeBtnClick(TObject *Sender)
  800. {
  801.     SettingsForm->Close();
  802. }
  803.  
  804. void __fastcall TSettingsForm::hideBtnClick(TObject *Sender)
  805. {
  806.     Application->Minimize();
  807. }
  808.  
  809. void __fastcall TSettingsForm::FormShow(TObject *Sender)
  810. {
  811.     int casheSize = browserManager->getCasheSize();
  812.     int browserDataSize = browserManager->getBrowserDataSize();
  813.     casheSizeLabel->Caption = IntToStr((casheSize / KB_SIZE / KB_SIZE)) + " MB";
  814.     browserDataSizeLabel->Caption = IntToStr((browserDataSize / KB_SIZE / KB_SIZE)) + " MB";
  815.     bookmarksAmountLabel->Caption = IntToStr(WebView->bookmarksManager->getSize());
  816.     browserHistorySizeLabel->Caption = IntToStr(WebView->historyManager->getSize());
  817.     updateHistoryBox();
  818.     isOpenedHistory = false;
  819.     homepageUrlEdit->Text = WebView->homepageUrl;
  820.     SettingsForm->Width = DEFAULT_WIDTH;
  821.     showHistoryBtn->Caption = SHOW_HISTORY_CAPTION;
  822. }
  823.  
  824. void __fastcall TSettingsForm::clearCasheBtnClick(TObject *Sender)
  825. {
  826.     browserManager->clearCashe();
  827.     Application
  828.         ->MessageBox(RESTART_WARNING,
  829.                      MESSAGE_TITLE,
  830.                      MB_OK | MB_ICONINFORMATION);
  831.     ShellExecute(0, 0, Application->ExeName.c_str(), 0, 0, SW_SHOW);
  832.     Application->Terminate();
  833. }
  834.  
  835. void __fastcall TSettingsForm::clearBrowserDataBtnClick(TObject *Sender)
  836. {
  837.     if (Application->MessageBox(BROWSER_CLEANING_WARNING, MESSAGE_TITLE,
  838.         MB_YESNO | MB_ICONINFORMATION) == IDYES)
  839.     {
  840.         delete WebView->PageControl;
  841.         Sleep(200);
  842.         browserManager->clearBrowserData();
  843.         ShellExecute(0, 0, Application->ExeName.c_str(), 0, 0, SW_SHOW);
  844.         Application->Terminate();
  845.     }
  846. }
  847.  
  848. void __fastcall TSettingsForm::clearBookmarksBtnClick(TObject *Sender)
  849. {
  850.     if (Application->MessageBox(BOOKMARKS_CLEANING_WARNING, MESSAGE_TITLE,
  851.         MB_YESNO | MB_ICONINFORMATION) == IDYES)
  852.     {
  853.         WebView->bookmarksManager->clearBookmarks();
  854.         WebView->bookmarksBox->Clear();
  855.         bookmarksAmountLabel->Caption = IntToStr(WebView->bookmarksManager->getSize());
  856.     }
  857. }
  858.  
  859. void TSettingsForm::updateHistoryBox()
  860. {
  861.     std::vector<SiteVisit> history = WebView->historyManager->getHistory();
  862.     historyBox->Clear();
  863.     for (int i = history.size() - 1; i >= 0; i--)
  864.     {
  865.         historyBox->Items->Add((history[i].getTime() + " - " +
  866.                                 history[i].getTitle()).c_str());
  867.     }
  868. }
  869.  
  870. void __fastcall TSettingsForm::clearBrowserHistoryBtnClick(TObject *Sender)
  871. {
  872.     WebView->historyManager->clearHistory();
  873.     historyBox->Clear();
  874.     browserHistorySizeLabel->Caption = IntToStr(WebView->historyManager->getSize());
  875. }
  876.  
  877. void __fastcall TSettingsForm::showHistoryBtnClick(TObject *Sender)
  878. {
  879.     if (isOpenedHistory)
  880.     {
  881.         isOpenedHistory = false;
  882.         SettingsForm->Width = DEFAULT_WIDTH;
  883.         showHistoryBtn->Caption = HIDE_HISTORY_CAPTION;
  884.     }
  885.     else
  886.     {
  887.         isOpenedHistory = true;
  888.         SettingsForm->Width = EXTENDED_WIDTH;
  889.         showHistoryBtn->Caption = SHOW_HISTORY_CAPTION;
  890.     }
  891. }
  892.  
  893. void __fastcall TSettingsForm::historyBoxDblClick(TObject *Sender)
  894. {
  895.     int size = WebView->historyManager->getSize();
  896.     int index = size - historyBox->ItemIndex - 1;
  897.     std::vector<SiteVisit> history = WebView->historyManager->getHistory();
  898.     WebView->createNewTab();
  899.     WebView->getCurrentBrowser()->Navigate(history[index].getUrl().c_str());
  900.     SettingsForm->Close();
  901. }
  902.  
  903. void __fastcall TSettingsForm::changeHomepageBtnClick(TObject *Sender)
  904. {
  905.     StringConverter *converter = new StringConverter();
  906.     String url = homepageUrlEdit->Text;
  907.     bool isOpen = WebView->browserManager->setHomepageUrl(converter->convertToStdString(url));
  908.     WebView->homepageUrl = url;
  909.     if (isOpen)
  910.     {
  911.         Application
  912.         ->MessageBox(HOMEPAGE_SUCCESS,
  913.                      MESSAGE_TITLE,
  914.                      MB_OK | MB_ICONINFORMATION);
  915.     }
  916.     else
  917.     {
  918.         Application
  919.         ->MessageBox(HOMEPAGE_WARNING,
  920.                      MESSAGE_TITLE,
  921.                      MB_OK | MB_ICONINFORMATION);
  922.     }
  923. }
  924.  
  925. #ifndef AddBookmarkViewH
  926. #define AddBookmarkViewH
  927.  
  928. #include <System.Classes.hpp>
  929. #include <Vcl.Controls.hpp>
  930. #include <Vcl.StdCtrls.hpp>
  931. #include <Vcl.Forms.hpp>
  932. #include <Vcl.Buttons.hpp>
  933. #include <Vcl.ExtCtrls.hpp>
  934. #include <Vcl.Imaging.pngimage.hpp>
  935.  
  936. #include <utility>
  937. #include <string>
  938. #include <regex>
  939. #include "MainView.h"
  940.  
  941. class TAddBookmarkForm : public TForm
  942. {
  943. __published:
  944.  
  945.     TEdit *titleEdit;
  946.     TBitBtn *addBtn;
  947.     TBitBtn *cancelBtn;
  948.     TLabel *casheSizeTitle;
  949.     void __fastcall cancelBtnClick(TObject *Sender);
  950.     void __fastcall addBtnClick(TObject *Sender);
  951.     void __fastcall FormShow(TObject *Sender);
  952.     void __fastcall titleEditChange(TObject *Sender);
  953.  
  954. private:
  955.  
  956.     const wchar_t* BOOKMARKS_FILE_ACCESS_WARNING = L"Файл с закладками повреждён, все изменения сохранены не будут";
  957.     const wchar_t* MESSAGE_TITLE = L"NetBar";
  958.  
  959. public:
  960.  
  961.     __fastcall TAddBookmarkForm(TComponent* Owner);
  962.  
  963. };
  964. extern PACKAGE TAddBookmarkForm *AddBookmarkForm;
  965. #endif
  966.  
  967. #include <vcl.h>
  968. #pragma hdrstop
  969.  
  970. #include "AddBookmarkView.h"
  971.  
  972. #pragma package(smart_init)
  973. #pragma resource "*.dfm"
  974.  
  975. TAddBookmarkForm *AddBookmarkForm;
  976.  
  977. __fastcall TAddBookmarkForm::TAddBookmarkForm(TComponent* Owner)
  978.     : TForm(Owner)
  979. {
  980.  
  981. }
  982.  
  983. void __fastcall TAddBookmarkForm::cancelBtnClick(TObject *Sender)
  984. {
  985.     AddBookmarkForm->Close();
  986. }
  987.  
  988. void __fastcall TAddBookmarkForm::addBtnClick(TObject *Sender)
  989. {
  990.     StringConverter *converter = new StringConverter();
  991.  
  992.     bool isOpenFile = WebView->bookmarksManager
  993.         ->addBookmark(converter->convertToStdString(titleEdit->Text.Trim()),
  994.                       converter->convertToStdString(WebView->pageURL));
  995.     delete converter;
  996.     if (!isOpenFile)
  997.     {
  998.         Application
  999.         ->MessageBox(BOOKMARKS_FILE_ACCESS_WARNING,
  1000.                      MESSAGE_TITLE,
  1001.                      MB_OK | MB_ICONWARNING);
  1002.     }
  1003.     WebView->updateBookmarksBox();
  1004.     WebView->addBookmarkBtn->Visible = false;
  1005.     WebView->deleteBookmarkBtn->Visible = true;
  1006.     AddBookmarkForm->Close();
  1007. }
  1008.  
  1009. void __fastcall TAddBookmarkForm::FormShow(TObject *Sender)
  1010. {
  1011.     titleEdit->Text = WebView->title;
  1012. }
  1013.  
  1014. void __fastcall TAddBookmarkForm::titleEditChange(TObject *Sender)
  1015. {
  1016.     StringConverter *converter = new StringConverter();
  1017.     std::string title = converter->convertToStdString(titleEdit->Text.Trim());
  1018.     addBtn->Enabled =
  1019.         !WebView->bookmarksManager->titleExists(title) &&
  1020.         title != "";
  1021. }
  1022.  
  1023. #ifndef BookmarksManagerH
  1024. #define BookmarksManagerH
  1025. #include <vector>
  1026. #include <utility>
  1027. #include <fstream>
  1028. #include <regex>
  1029.  
  1030. #include "BookmarksReader.h"
  1031. #include "BookmarksWriter.h"
  1032. #include "StringConverter.h"
  1033.  
  1034. class BookmarksManager
  1035. {
  1036.     private:
  1037.  
  1038.         std::vector<std::pair<std::string, std::string>> bookmarks;
  1039.         BookmarksWriter *writer;
  1040.         BookmarksReader *reader;
  1041.         void readBookmarks(std::string path);
  1042.         bool writeBookmarks(std::string path);
  1043.         const std::string FILENAME = "bookmarks";
  1044.  
  1045.     public:
  1046.  
  1047.         BookmarksManager();
  1048.         ~BookmarksManager();
  1049.         bool addBookmark(std::string title, std::string url);
  1050.         bool contains(std::string url);
  1051.         bool titleExists(std::string title);
  1052.         bool removeBookmark(std::string url);
  1053.         bool clearBookmarks();
  1054.         std::vector<std::pair<std::string, std::string>> getBookmarks();
  1055.         int getSize();
  1056.  
  1057. };
  1058. #endif
  1059.  
  1060. #pragma hdrstop
  1061.  
  1062. #include "BookmarksManager.h"
  1063.  
  1064. #pragma package(smart_init)
  1065.  
  1066. BookmarksManager::BookmarksManager()
  1067. {
  1068.     writer = new BookmarksWriter();
  1069.     reader = new BookmarksReader();
  1070.     readBookmarks(FILENAME);
  1071. }
  1072.  
  1073. BookmarksManager::~BookmarksManager()
  1074. {
  1075.     delete writer;
  1076.     delete reader;
  1077.     std::vector<std::pair<std::string, std::string>>().swap(bookmarks);
  1078. }
  1079.  
  1080. void BookmarksManager::readBookmarks(std::string path)
  1081. {
  1082.     bookmarks = reader->readBookmarks(path);
  1083. }
  1084.  
  1085. bool BookmarksManager::writeBookmarks(std::string path)
  1086. {
  1087.     return writer->writeBookmarks(bookmarks, path);
  1088. }
  1089.  
  1090. bool BookmarksManager::addBookmark(std::string title, std::string url)
  1091. {
  1092.     std::pair<std::string, std::string> pair;
  1093.     pair.first = title;
  1094.     pair.second = url;
  1095.     bookmarks.push_back(pair);
  1096.     return writeBookmarks(FILENAME);
  1097. }
  1098.  
  1099. bool BookmarksManager::clearBookmarks()
  1100. {
  1101.     bookmarks.clear();
  1102.     return writeBookmarks(FILENAME);
  1103. }
  1104.  
  1105. bool BookmarksManager::contains(std::string url)
  1106. {
  1107.     for (int i = 0; i < bookmarks.size(); ++i)
  1108.     {
  1109.        if (bookmarks[i].second == url)
  1110.        {
  1111.            return true;
  1112.        }
  1113.     }
  1114.     return false;
  1115. }
  1116.  
  1117. bool BookmarksManager::titleExists(std::string title)
  1118. {
  1119.     for (int i = 0; i < bookmarks.size(); ++i)
  1120.     {
  1121.        if (bookmarks[i].first == title)
  1122.        {
  1123.            return true;
  1124.        }
  1125.     }
  1126.     return false;
  1127. }
  1128.  
  1129. bool BookmarksManager::removeBookmark(std::string url)
  1130. {
  1131.     int index = 0;
  1132.     while (index < bookmarks.size() && url != bookmarks[index].second)
  1133.     {
  1134.         index++;
  1135.     }
  1136.     if (index != bookmarks.size()) {
  1137.         bookmarks.erase(bookmarks.begin() + index);
  1138.         return writeBookmarks(FILENAME);
  1139.     }
  1140.     return false;
  1141. }
  1142.  
  1143. std::vector<std::pair<std::string, std::string>> BookmarksManager::getBookmarks()
  1144. {
  1145.     return bookmarks;
  1146. }
  1147.  
  1148. int BookmarksManager::getSize()
  1149. {
  1150.     return bookmarks.size();
  1151. }
  1152.  
  1153. #ifndef HistoryManagerH
  1154. #define HistoryManagerH
  1155.  
  1156. #include <vector>
  1157. #include <utility>
  1158. #include <fstream>
  1159. #include <regex>
  1160.  
  1161. #include "HistoryReader.h"
  1162. #include "HistoryWriter.h"
  1163. #include "StringConverter.h"
  1164. #include "SiteVisit.h"
  1165.  
  1166. class HistoryManager
  1167. {
  1168.     private:
  1169.  
  1170.         std::vector<SiteVisit> history;
  1171.         HistoryWriter *writer;
  1172.         HistoryReader *reader;
  1173.         void readHistory(std::string path);
  1174.         bool writeHistory(std::string path);
  1175.         const std::string FILENAME = "history";
  1176.  
  1177.     public:
  1178.  
  1179.         HistoryManager();
  1180.         ~HistoryManager();
  1181.         bool addSiteVisit(std::string time, std::string title, std::string url);
  1182.         bool clearHistory();
  1183.         std::vector<SiteVisit> getHistory();
  1184.         int getSize();
  1185.  
  1186. };
  1187.  
  1188. #endif
  1189.  
  1190. #pragma hdrstop
  1191.  
  1192. #include "HistoryManager.h"
  1193.  
  1194. #pragma package(smart_init)
  1195.  
  1196. HistoryManager::HistoryManager()
  1197. {
  1198.     writer = new HistoryWriter();
  1199.     reader = new HistoryReader();
  1200.     readHistory(FILENAME);
  1201. }
  1202.  
  1203. HistoryManager::~HistoryManager()
  1204. {
  1205.     delete writer;
  1206.     delete reader;
  1207.     std::vector<SiteVisit>().swap(history);
  1208. }
  1209.  
  1210. void HistoryManager::readHistory(std::string path)
  1211. {
  1212.     history = reader->readHistory(path);
  1213. }
  1214.  
  1215. bool HistoryManager::writeHistory(std::string path)
  1216. {
  1217.     return writer->writeHistory(history, path);
  1218. }
  1219.  
  1220. bool HistoryManager::addSiteVisit(std::string time, std::string title, std::string url)
  1221. {
  1222.     SiteVisit *visit = new SiteVisit(title, url, time);
  1223.     history.push_back(*visit);
  1224.     return writeHistory(FILENAME);
  1225. }
  1226.  
  1227. bool HistoryManager::clearHistory()
  1228. {
  1229.     history.clear();
  1230.     return writeHistory(FILENAME);
  1231. }
  1232.  
  1233. std::vector<SiteVisit> HistoryManager::getHistory()
  1234. {
  1235.     return history;
  1236. }
  1237.  
  1238. int HistoryManager::getSize()
  1239. {
  1240.     return history.size();
  1241. }
  1242.  
  1243. #ifndef BrowserManagerH
  1244. #define BrowserManagerH
  1245.  
  1246. #include <System.Classes.hpp>
  1247. #include <utility>
  1248. #include <filesystem>
  1249. #include <fstream>
  1250. #include <string>
  1251. #include <ctype.h>
  1252.  
  1253. class BrowserManager
  1254. {
  1255.     private:
  1256.  
  1257.         const AnsiString CASHE_PATH = "Project1.exe.WebView2\\EBWebView\\Default\\Cache";
  1258.         const AnsiString BROWSER_DATA_PATH = "Project1.exe.WebView2\\EBWebView\\Default";
  1259.         const std::string DEFAULT_HOMEPAGE_URL = "https://www.google.com/";
  1260.         const std::string HOMEPAGE_FILENAME = "homepage";
  1261.         std::string homepageUrl;
  1262.         int getFolderSize(AnsiString folder, int &size);
  1263.         std::string readHomePageUrl(std::string path);
  1264.         bool writeHomepageUrl(std::string path, std::string newUrl);
  1265.  
  1266.     public:
  1267.  
  1268.         BrowserManager();
  1269.         int getCasheSize();
  1270.         std::string getHomepageUrl();
  1271.         void clearCashe();
  1272.         int getBrowserDataSize();
  1273.         void clearBrowserData();
  1274.         bool setHomepageUrl(std::string newUrl);
  1275. };
  1276. #endif
  1277.  
  1278. #pragma hdrstop
  1279.  
  1280. #include "BrowserManager.h"
  1281.  
  1282. #pragma package(smart_init)
  1283.  
  1284. BrowserManager::BrowserManager()
  1285. {
  1286.     homepageUrl = readHomePageUrl(HOMEPAGE_FILENAME);
  1287.     if (homepageUrl.empty())
  1288.     {
  1289.         homepageUrl = DEFAULT_HOMEPAGE_URL;
  1290.     }
  1291. }
  1292.  
  1293. int BrowserManager::getFolderSize(AnsiString folder, int &size)
  1294. {
  1295.     TSearchRec searchRec;
  1296.     if (folder[folder.Length()] == '\\')
  1297.     {
  1298.         folder.SetLength(folder.Length() - 1);
  1299.     }
  1300.  
  1301.     if (FindFirst(folder + "\\*.*", faAnyFile, searchRec) == 0)
  1302.     {
  1303.         do
  1304.         {
  1305.             if (searchRec.Name != "." && searchRec.Name != "..")
  1306.             {
  1307.                 if ((searchRec.Attr & faDirectory) != 0)
  1308.                 {
  1309.                     getFolderSize(folder + "\\" + searchRec.Name, size);
  1310.                 }
  1311.                 else
  1312.                 {
  1313.                     size += searchRec.Size;
  1314.                 }
  1315.             }
  1316.         } while (FindNext(searchRec) == 0);
  1317.     }
  1318.     FindClose(searchRec);
  1319.     return size;
  1320. }
  1321.  
  1322. int BrowserManager::getCasheSize()
  1323. {
  1324.     int size = 0;
  1325.     return getFolderSize(CASHE_PATH, size);
  1326. }
  1327.  
  1328. std::string BrowserManager::getHomepageUrl()
  1329. {
  1330.     return homepageUrl;
  1331. }
  1332.  
  1333. int BrowserManager::getBrowserDataSize()
  1334. {
  1335.     int size = 0;
  1336.     return getFolderSize(BROWSER_DATA_PATH, size);
  1337. }
  1338.  
  1339. void BrowserManager::clearCashe()
  1340. {
  1341.     std::filesystem::remove_all(CASHE_PATH.c_str());
  1342. }
  1343.  
  1344. void BrowserManager::clearBrowserData()
  1345. {
  1346.     std::filesystem::remove_all(BROWSER_DATA_PATH.c_str());
  1347. }
  1348.  
  1349. std::string BrowserManager::readHomePageUrl(std::string path)
  1350. {
  1351.     std::ifstream fileReader;
  1352.     std::string url;
  1353.     fileReader.open(path);
  1354.     if (fileReader.is_open())
  1355.     {
  1356.         std::getline(fileReader, url);
  1357.         fileReader.close();
  1358.     }
  1359.     return url;
  1360. }
  1361.  
  1362. bool BrowserManager::setHomepageUrl(std::string newUrl)
  1363. {
  1364.     homepageUrl = newUrl;
  1365.     return writeHomepageUrl(HOMEPAGE_FILENAME, newUrl);
  1366. }
  1367.  
  1368. bool BrowserManager::writeHomepageUrl(std::string path, std::string newUrl)
  1369. {
  1370.     std::ofstream fileWriter;
  1371.     std::string url;
  1372.     fileWriter.open(path);
  1373.     bool isOpen = fileWriter.is_open();
  1374.     if (isOpen)
  1375.     {
  1376.         fileWriter << newUrl;
  1377.     }
  1378.     return isOpen;
  1379. }
  1380.  
  1381. #ifndef BookmarksReaderH
  1382. #define BookmarksReaderH
  1383.  
  1384. #include <vector>
  1385. #include <utility>
  1386. #include <fstream>
  1387. #include <regex>
  1388.  
  1389. class BookmarksReader
  1390. {
  1391.     private:
  1392.  
  1393.     public:
  1394.         std::vector<std::pair<std::string, std::string>> readBookmarks(std::string path);
  1395. };
  1396. #endif
  1397.  
  1398. #pragma hdrstop
  1399.  
  1400. #include "BookmarksReader.h"
  1401.  
  1402. #pragma package(smart_init)
  1403.  
  1404. std::vector<std::pair<std::string, std::string>> BookmarksReader::readBookmarks(std::string path)
  1405. {
  1406.     const std::regex r(R"(^.+\S=.+\S$)");
  1407.     std::vector<std::pair<std::string, std::string>> bookmarks;
  1408.     std::ifstream fileReader;
  1409.     std::string line;
  1410.     fileReader.open(path);
  1411.     if (fileReader.is_open())
  1412.     {
  1413.         while (!fileReader.eof())
  1414.         {
  1415.             std::pair<std::string, std::string> pair;
  1416.             std::getline(fileReader, line);
  1417.             if (!std::regex_match(line, r))
  1418.             {
  1419.                 bookmarks.clear();
  1420.                 return bookmarks;
  1421.             }
  1422.             int index = line.find("=");
  1423.             pair.first = line.substr(0, index);
  1424.             pair.second = line.substr(index + 1);
  1425.             bookmarks.push_back(pair);
  1426.         }
  1427.         fileReader.close();
  1428.     }
  1429.     return bookmarks;
  1430. }
  1431.  
  1432. #ifndef BookmarksWriterH
  1433. #define BookmarksWriterH
  1434.  
  1435. #include <vector>
  1436. #include <utility>
  1437. #include <fstream>
  1438.  
  1439. class BookmarksWriter
  1440. {
  1441.     private:
  1442.  
  1443.     public:
  1444.         bool writeBookmarks(std::vector<std::pair<std::string, std::string>> bookmarks, std::string path);
  1445. };
  1446. #endif
  1447.  
  1448. #pragma hdrstop
  1449.  
  1450. #include "BookmarksWriter.h"
  1451.  
  1452. #pragma package(smart_init)
  1453.  
  1454. bool BookmarksWriter::writeBookmarks(std::vector<std::pair<std::string, std::string>> bookmarks, std::string path)
  1455. {
  1456.     std::ofstream writer;
  1457.     std::string line;
  1458.     writer.open(path);
  1459.     bool isOpen = writer.is_open();
  1460.     if (isOpen)
  1461.     {
  1462.         for (int i = 0; i < bookmarks.size(); ++i)
  1463.         {
  1464.             if(i + 1 == bookmarks.size())
  1465.             {
  1466.                 writer << bookmarks[i].first + "=" + bookmarks[i].second;
  1467.             }
  1468.             else
  1469.             {
  1470.                 writer << bookmarks[i].first + "=" + bookmarks[i].second << std::endl;
  1471.             }
  1472.         }
  1473.         writer.close();
  1474.     }
  1475.     return isOpen;
  1476. }
  1477.  
  1478. #ifndef HistoryReaderH
  1479. #define HistoryReaderH
  1480.  
  1481. #include "SiteVisit.h"
  1482. #include <vector>
  1483. #include <utility>
  1484. #include <fstream>
  1485. #include <regex>
  1486.  
  1487. class HistoryReader
  1488. {
  1489.     private:
  1490.  
  1491.     public:
  1492.         std::vector<SiteVisit> readHistory(std::string path);
  1493. };
  1494.  
  1495. #endif
  1496.  
  1497. #pragma hdrstop
  1498.  
  1499. #include "HistoryReader.h"
  1500.  
  1501. #pragma package(smart_init)
  1502.  
  1503. std::vector<SiteVisit> HistoryReader::readHistory(std::string path)
  1504. {
  1505.     std::vector<SiteVisit> history;
  1506.     std::ifstream fileReader;
  1507.     std::string line;
  1508.     std::string time;
  1509.     std::string title;
  1510.     std::string url;
  1511.     fileReader.open(path);
  1512.     if (fileReader.is_open())
  1513.     {
  1514.         while (!fileReader.eof())
  1515.         {
  1516.             std::getline(fileReader, time);
  1517.             if (!fileReader.eof())
  1518.             {
  1519.                 std::getline(fileReader, title);
  1520.             }
  1521.             else
  1522.             {
  1523.                 history.clear();
  1524.                 return history;
  1525.             }
  1526.  
  1527.             if (!fileReader.eof())
  1528.             {
  1529.                 std::getline(fileReader, url);
  1530.             }
  1531.             else
  1532.             {
  1533.                 history.clear();
  1534.                 return history;
  1535.             }
  1536.             SiteVisit *visit = new SiteVisit(title, url, time + "\n");
  1537.             history.push_back(*visit);
  1538.         }
  1539.         fileReader.close();
  1540.     }
  1541.     return history;
  1542. }
  1543.  
  1544. #ifndef HistoryWriterH
  1545. #define HistoryWriterH
  1546.  
  1547. #include "SiteVisit.h"
  1548. #include <vector>
  1549. #include <utility>
  1550. #include <fstream>
  1551.  
  1552. class HistoryWriter
  1553. {
  1554.     private:
  1555.  
  1556.     public:
  1557.  
  1558.         bool writeHistory(std::vector<SiteVisit> history, std::string path);
  1559. };
  1560. #endif
  1561.  
  1562. #pragma hdrstop
  1563.  
  1564. #include "HistoryWriter.h"
  1565.  
  1566. #pragma package(smart_init)
  1567.  
  1568. bool HistoryWriter::writeHistory(std::vector<SiteVisit> history, std::string path)
  1569. {
  1570.     std::ofstream writer;
  1571.     std::string line;
  1572.     writer.open(path);
  1573.     bool isOpen = writer.is_open();
  1574.     if (isOpen)
  1575.     {
  1576.         for (int i = 0; i < history.size(); ++i)
  1577.         {
  1578.             if(i + 1 == history.size())
  1579.             {
  1580.                 writer << history[i].getTime();
  1581.                 writer << history[i].getTitle() << std::endl;
  1582.                 writer << history[i].getUrl();
  1583.             }
  1584.             else
  1585.             {
  1586.                 writer << history[i].getTime();
  1587.                 writer << history[i].getTitle() << std::endl;
  1588.                 writer << history[i].getUrl() << std::endl;
  1589.             }
  1590.         }
  1591.         writer.close();
  1592.     }
  1593.     return isOpen;
  1594. }
  1595.  
  1596. #ifndef SiteVisitH
  1597. #define SiteVisitH
  1598.  
  1599. #include <string>
  1600.  
  1601. class SiteVisit
  1602. {
  1603.     private:
  1604.  
  1605.         std::string title;
  1606.         std::string url;
  1607.         std::string time;
  1608.  
  1609.     public:
  1610.  
  1611.         SiteVisit(std::string title, std::string url, std::string time);
  1612.         std::string getTitle();
  1613.         std::string getUrl();
  1614.         std::string getTime();
  1615. };
  1616.  
  1617. #endif
  1618.  
  1619. #pragma hdrstop
  1620.  
  1621. #include "SiteVisit.h"
  1622.  
  1623. #pragma package(smart_init)
  1624.  
  1625. SiteVisit::SiteVisit(std::string title, std::string url, std::string time)
  1626. {
  1627.     this->title = title;
  1628.     this->url = url;
  1629.     this->time = time;
  1630. }
  1631.  
  1632. std::string SiteVisit::getTitle()
  1633. {
  1634.     return this->title;
  1635. }
  1636.  
  1637. std::string SiteVisit::getUrl()
  1638. {
  1639.     return this->url;
  1640. }
  1641. std::string SiteVisit::getTime()
  1642. {
  1643.     return this->time;
  1644. }
  1645.  
  1646. #ifndef StringConverterH
  1647. #define StringConverterH
  1648.  
  1649. #include <string>
  1650. #include <System.Classes.hpp>
  1651.  
  1652. class StringConverter
  1653. {
  1654.     private:
  1655.  
  1656.     public:
  1657.  
  1658.         std::string convertToStdString(String str);
  1659.         String convertToSystemString(std::string str);
  1660. };
  1661. #endif
  1662.  
  1663. #pragma hdrstop
  1664.  
  1665. #include "StringConverter.h"
  1666.  
  1667. #pragma package(smart_init)
  1668.  
  1669. std::string StringConverter::convertToStdString(String str)
  1670. {
  1671.     AnsiString ansiStr = str;
  1672.     return ansiStr.c_str();
  1673. }
  1674.  
  1675. String StringConverter::convertToSystemString(std::string str)
  1676. {
  1677.     return str.c_str();
  1678. }
Add Comment
Please, Sign In to add comment