⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 browserpage.cpp

📁 Last change: 2008-02-03 This is the source code of KCeasy。
💻 CPP
📖 第 1 页 / 共 2 页
字号:
/*
This file is part of KCeasy (http://www.kceasy.com)
Copyright (C) 2002-2004 Markus Kern <mkern@kceasy.com>

This program is free software; you can redistribute it and/or
modify it under the terms of the GNU General Public License
as published by the Free Software Foundation; either version 2
of the License, or (at your option) any later version.

This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
GNU General Public License for more details.
*/
//---------------------------------------------------------------------------
#include <vcl.h>
#include <KCeasy.h>
#pragma hdrstop

#include "BrowserPage.h"
#include "MagnetDialog.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma link "SHDocVw_OCX"
#pragma resource "*.dfm"
TBrowserForm *BrowserForm;
//---------------------------------------------------------------------------
__fastcall TBrowserForm::TBrowserForm(TComponent* Owner)
:   TForm(Owner),
    BookmarkPopup(NULL),
    Bookmarks(NULL),
    BlockNewWindows(false)
{
    TranslateComponent(this);
    UrlEdit->DoubleBuffered = true;

    StatusAnimate->ResName = "THROBBER_AVI";
    StatusAnimate->Visible = false;
    PopupImage->Visible = false;
    StopBtn->Enabled = false;
    ForwardBtn->Enabled = false;
    BackBtn->Enabled = false;

    TabControl->Tabs->Clear();
    // update settings from config
    ConfigChanged();

    // load bookmarks
    Bookmarks = new TBookmarkManager();
    // get bookmark.conf path
    string BookmarkPath = Application->ExeName.c_str();
    BookmarkPath.erase(BookmarkPath.rfind('\\'));
    Bookmarks->Load(BookmarkPath + BOOKMARKS_CONF_PATH,"browser");
}

__fastcall TBrowserForm::~TBrowserForm()
{
    CloseAllTabs();

    // save bookmarks
    string BookmarkPath = Application->ExeName.c_str();
    BookmarkPath.erase(BookmarkPath.rfind('\\'));
    Bookmarks->Save(BookmarkPath + BOOKMARKS_CONF_PATH,"browser");
    delete Bookmarks;
    delete BookmarkPopup;
}
//---------------------------------------------------------------------------

bool __fastcall TBrowserForm::EngineCallback(TCallbackInfo* CbInfo)
{
    switch(CbInfo->Code) {
    case CbcStateChange:
        for(int i=0; i < TabControl->Tabs->Count; i++) {
            TBrowserWrapper* Wrapper = (TBrowserWrapper*)TabControl->Tabs->Objects[i];
            BrowserCallScript(Wrapper->GetBrowser(), "KCeasyOnlineStatusChange");
        }
        // fall through
    case CbcNetworksUpdate:
        for(int i=0; i < TabControl->Tabs->Count; i++) {
            TBrowserWrapper* Wrapper = (TBrowserWrapper*)TabControl->Tabs->Objects[i];
            BrowserCallScript(Wrapper->GetBrowser(), "KCeasyNetworksChange");
        }
        return true;
    }
    return false;
}

//---------------------------------------------------------------------------

void __fastcall TBrowserForm::PageActivated()
{
    if(!GetActiveBrowser())
        return;
    GetActiveBrowser()->SetFocus();
    BrowserCallScript(GetActiveBrowser(), "KCeasyFocusSearch");
}

void __fastcall TBrowserForm::ConfigChanged()
{
    if(Config->GetValueInt("gui/show_browser_page")) {
        if(!GetActiveBrowser())
            NavigateToHome();
    } else {
         if(GetActiveBrowser())
            CloseAllTabs();
    }

    TabControl->Visible = Config->GetValueInt("browser/enable_tabs");
    NewTabBtn->Enabled = TabControl->Visible;
    if(!TabControl->Visible && TabControl->Tabs->Count > 1)
        CloseAllOtherTabs(TabControl->TabIndex);

    if(Config->GetValueInt("browser/tabs_with_close_button"))
        TabControl->Images = BrowserImageList;
    else
        TabControl->Images = NULL;

    HandleMagnets = Config->GetValueInt("browser/handle_magnets");
}
//---------------------------------------------------------------------------

void TBrowserForm::NavigateTo(const string Url, bool NewTab, bool SwitchToTab)
{
    TCppWebBrowser* Browser = GetActiveBrowser();

    if((NewTab && Config->GetValueInt("browser/enable_tabs")) || !Browser)
        Browser = CreateTab(SwitchToTab)->GetBrowser();

    if(Browser == GetActiveBrowser())
        UrlEdit->Text = Url.c_str();
    Browser->Navigate(WideString(Url.c_str()));
}

void TBrowserForm::NavigateToResource(const string Resource, bool NewTab,
                                      bool SwitchToTab)
{
    char Path[MAX_PATH];
    GetModuleFileName(NULL,Path,MAX_PATH);
    string Url = string("res://") + Path + "/" + Resource;
    NavigateTo(Url, NewTab, SwitchToTab);
}

void TBrowserForm::NavigateToHome()
{
    // load webpage from resources if config url is missing
    if(Config->GetValue("browser/home_url") != "")
        NavigateTo(Config->GetValue("browser/home_url"),false);
    else
        NavigateToResource("startpage_htm",false);
}

void TBrowserForm::CloseAllTabs()
{
    for(int i=0; i < TabControl->Tabs->Count; i++) {
        TBrowserWrapper* Wrapper = (TBrowserWrapper*)TabControl->Tabs->Objects[i];
        delete Wrapper->GetBrowser();
        Wrapper->Release();
    }
    TabControl->Tabs->Clear();
}
//---------------------------------------------------------------------------

// tab management
TBrowserWrapper* TBrowserForm::CreateTab(bool SwitchToTab)
{
    // create browser
    TCppWebBrowser* Browser = new TCppWebBrowser(TabPanel);
    Browser->TOleControl::Parent = TabPanel;
    Browser->Visible = false;
    Browser->Align = alClient;

    Browser->OnTitleChange = BrowserTitleChange;
    Browser->OnCommandStateChange = BrowserCommandStateChange;
    Browser->OnProgressChange = BrowserProgressChange;
    Browser->OnNewWindow2 = BrowserNewWindow2;
    Browser->OnWindowClosing = BrowserWindowClosing;
    Browser->OnBeforeNavigate2 = BrowserBeforeNavigate2;
    Browser->OnDocumentComplete = BrowserDocumentComplete;
    Browser->OnStatusTextChange = BrowserStatusTextChange;
    Browser->OnNavigateError = BrowserNavigateError;

    // wrap browser
    TBrowserWrapper* Wrapper = new TBrowserWrapper(Browser);
    TExternalDispatch* External = new TExternalDispatch();
    Wrapper->SetExternal(External);
    External->Release();

    // add to tab control
    int i = TabControl->Tabs->AddObject("",(TObject*)Wrapper);
    // TRANSLATOR: Browser tab caption for pages with no title
    SetTabCaption(i,_("(Untitled)"));
    if(SwitchToTab) {
        TabControl->TabIndex = i;
        TabControlChange(NULL);
    }

    // make sure tabs are shown
    TabControl->Visible = true;

    return Wrapper;
}

void TBrowserForm::CloseTab(int Index)
{
    int SelectedTab = TabControl->TabIndex;
    TBrowserWrapper* Wrapper = (TBrowserWrapper*)TabControl->Tabs->Objects[Index];
    delete Wrapper->GetBrowser();
    Wrapper->Release();

    if(SelectedTab >= Index)
        SelectedTab = SelectedTab > 0 ? SelectedTab - 1 : 0;
    TabControl->Tabs->Delete(Index);
    TabControl->TabIndex = SelectedTab;
    TabControlChange(NULL);
}

void TBrowserForm::CloseAllOtherTabs(int Index)
{
    TBrowserWrapper* WrapperKeep = (TBrowserWrapper*)TabControl->Tabs->Objects[Index];

    // delete all other tabs
    for(int i = TabControl->Tabs->Count-1; i >= 0 ; i--) {
        TBrowserWrapper* Wrapper = (TBrowserWrapper*)TabControl->Tabs->Objects[i];
        if(Wrapper != WrapperKeep) {
            delete Wrapper->GetBrowser();
            Wrapper->Release();
            TabControl->Tabs->Delete(i);
        }
    }
    TabControl->TabIndex = 0;
    TabControlChange(NULL);
}

void TBrowserForm::SetTabCaption(int Index, AnsiString Caption)
{
    int MaxCaptionWidth = 150;
    int Width = TabControl->Canvas->TextWidth(Caption);
    AnsiString NewCaption = Caption;

    for(int Len = NewCaption.Length(); Len > 0 && Width > MaxCaptionWidth; Len--) {
        NewCaption = Caption.SubString(0,Len) + "...";
        Width = TabControl->Canvas->TextWidth(NewCaption);
    }
    TabControl->Tabs->Strings[Index] = NewCaption;
}

TBrowserWrapper* TBrowserForm::GetActiveBrowserWrapper()
{
    if(TabControl->TabIndex == -1)
        return NULL;
    return (TBrowserWrapper*)TabControl->Tabs->Objects[TabControl->TabIndex];
}

TCppWebBrowser* TBrowserForm::GetActiveBrowser()
{
    TBrowserWrapper* Wrapper = GetActiveBrowserWrapper();
    if(!Wrapper)
        return NULL;
    return Wrapper->GetBrowser();
}

void __fastcall TBrowserForm::TabControlChange(TObject *Sender)
{
    // move browser associated with tab to foreground
    TCppWebBrowser* Browser = GetActiveBrowser();
    Browser->Visible = true;
    Browser->BringToFront();
    if(MainForm->GetVisiblePage() == this) {
        Browser->SetFocus();
        BrowserCallScript(Browser, "KCeasyFocusSearch");
    }

    // update ctrl panel
    UrlEdit->Text = AnsiString(Browser->LocationURL);
    MainForm->MainStatusBar->Panels->Items[1]->Text = "";
    StopBtn->Enabled = Browser->Busy;
    StatusAnimate->Visible = Browser->Busy;
    StatusAnimate->Active = Browser->Busy;
    PopupImage->Visible = !Browser->Busy && ((int)Browser->GetProperty(WideString("browser_blocked"))) > 0;
    if(Browser->Busy)
        StatusAnimate->BringToFront();
    else
        PopupImage->BringToFront();
    ForwardBtn->Enabled = Browser->GetProperty(WideString("browser_navigateforward"));
    BackBtn->Enabled = Browser->GetProperty(WideString("browser_navigateback"));
}

void __fastcall TBrowserForm::TabControlGetImageIndex(TObject *Sender,
      int TabIndex, int &ImageIndex)
{
    ImageIndex = 0;
}

void __fastcall TBrowserForm::TabControlMouseUp(TObject *Sender,
      TMouseButton Button, TShiftState Shift, int X, int Y)
{
    if(Button != mbLeft || !TabControl->GetHitTestInfoAt(X,Y).Contains(htOnIcon))
        return;
    int ClickedTab = TabControl->IndexOfTabAt(X,Y);

    if(ClickedTab == -1)
        return;

    // always keep one tab around
    if(TabControl->Tabs->Count == 1)
        NavigateToHome();
    else
        CloseTab(ClickedTab);
}
//---------------------------------------------------------------------------

void __fastcall TBrowserForm::NewTabMnuClick(TObject *Sender)
{
    if(Config->GetValueInt("browser/enable_tabs") || !GetActiveBrowser())
        CreateTab(true);
}

void __fastcall TBrowserForm::CloseTabMnuClick(TObject *Sender)
{
    TPoint ClickPoint = TabControl->ScreenToClient(TabPopupMenu->PopupPoint);
    int ClickedTab = TabControl->IndexOfTabAt(ClickPoint.x,ClickPoint.y);

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -