📄 browserpage.cpp
字号:
/*
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 + -