nim_duilib/examples/multi_browser/browser/multi_browser_form.cpp

690 lines
18 KiB
C++
Raw Normal View History

2019-04-19 17:19:57 +08:00
#include "multi_browser_form.h"
#include "browser/browser_box.h"
#include "browser/multi_browser_manager.h"
#include "control/browser_tab_item.h"
#include "custom_layout.h"
using namespace ui;
using namespace std;
namespace
{
// ע<><D7A2><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϣ<EFBFBD><CFA2><EFBFBD>յ<EFBFBD><D5B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϣ<EFBFBD><CFA2><EFBFBD><EFBFBD>ʾ<EFBFBD><CABE><EFBFBD>ڶ<EFBFBD>Ӧ<EFBFBD><D3A6><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ť<EFBFBD><C5A5>ϵͳ<CFB5><CDB3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD>ʼ<EFBFBD><CABC>ITaskbarList4<74>ӿ<EFBFBD>
UINT WM_TASKBARBUTTONCREATED = ::RegisterWindowMessage(TEXT("TaskbarButtonCreated"));
// <20><><EFBFBD><EFBFBD><EFBFBD>յ<EFBFBD>WM_CLOSE<53><45>Ϣ<EFBFBD><CFA2>ԭ<EFBFBD><D4AD>
enum CloseReason
{
kDefaultClose = 0, // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD><D2BB>رմ<D8B1><D5B4>ڣ<EFBFBD><DAA3><EFBFBD>Alt+F4<46>ȳ<EFBFBD><C8B3><EFBFBD>ԭ<EFBFBD><D4AD>
kBrowserBoxClose = 1 // <20>ر<EFBFBD><D8B1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD><D2BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ӵ<EFBFBD><D3B5>´<EFBFBD><C2B4>ڹر<DAB9>
};
}
const LPCTSTR MultiBrowserForm::kClassName = L"MultiBrowserForm";
MultiBrowserForm::MultiBrowserForm()
{
btn_max_restore_ = nullptr;
drop_helper_ = NULL;
tab_list_ = NULL;
borwser_box_tab_ = NULL;
active_browser_box_ = NULL;
is_drag_state_ = false;
old_drag_point_.x = old_drag_point_.y = 0;
}
std::wstring MultiBrowserForm::GetSkinFolder()
{
return L"multi_browser";
}
std::wstring MultiBrowserForm::GetSkinFile()
{
return L"multi_browser.xml";
}
std::wstring MultiBrowserForm::GetWindowClassName() const
{
return kClassName;
}
UINT MultiBrowserForm::GetClassStyle() const
{
return (UI_CLASSSTYLE_FRAME | CS_DBLCLKS);
}
ui::Control* MultiBrowserForm::CreateControl(const std::wstring& pstrClass)
{
if (pstrClass == _T("CustomTabBox"))
{
if ((GetWindowExStyle(this->GetHWND()) & WS_EX_LAYERED) != 0)
return new TabBox(new CustomLayout);
else
return new TabBox(new Layout);
}
return NULL;
}
void MultiBrowserForm::InitWindow()
{
m_pRoot->AttachBubbledEvent(ui::kEventClick, nbase::Bind(&MultiBrowserForm::OnClicked, this, std::placeholders::_1));
btn_max_restore_ = static_cast<Button*>(FindControl(L"btn_max_restore"));
edit_url_ = static_cast<RichEdit*>(FindControl(L"edit_url"));
lbl_title_ = static_cast<Label*>(FindControl(L"title"));
edit_url_->AttachReturn(nbase::Bind(&MultiBrowserForm::OnReturn, this, std::placeholders::_1));
tab_list_ = static_cast<ListBox*>(FindControl(L"tab_list"));
borwser_box_tab_ = static_cast<TabBox*>(FindControl(L"browser_box_tab"));
tab_list_->AttachSelect(nbase::Bind(&MultiBrowserForm::OnTabItemSelected, this, std::placeholders::_1));
InitDragDrop();
}
LRESULT MultiBrowserForm::HandleMessage(UINT uMsg, WPARAM wParam, LPARAM lParam)
{
if (uMsg == WM_SIZE)
{
if (wParam == SIZE_RESTORED)
OnWndSizeMax(false);
else if (wParam == SIZE_MAXIMIZED)
OnWndSizeMax(true);
}
else if (uMsg == WM_KEYDOWN)
{
// <20><><EFBFBD><EFBFBD>Ctrl+Tab<61><62><EFBFBD>ݼ<EFBFBD>
if (wParam == VK_TAB && ::GetKeyState(VK_CONTROL) < 0)
{
int next = tab_list_->GetCurSel();
next = (next + 1) % GetBoxCount();
tab_list_->SelectItem(next);
return 0;
}
// <20><><EFBFBD><EFBFBD>ESC<53><43><EFBFBD>ݼ<EFBFBD>
else if (wParam == VK_ESCAPE)
{
BOOL bHandled = FALSE;
if (!MultiBrowserManager::GetInstance()->IsDragingBorwserBox() && NULL != active_browser_box_)
{
this->CloseBox(active_browser_box_->GetId());
}
return 0;
}
}
else if (uMsg == WM_TASKBARBUTTONCREATED)
{
taskbar_manager_.Init(this);
// <20><>Ϊ<EFBFBD><CEAA><EFBFBD>ڸմ<DAB8><D5B4><EFBFBD>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ѿ<EFBFBD><D1BE><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1>û<EFBFBD><C3BB><EFBFBD>յ<EFBFBD>WM_TASKBARBUTTONCREATED<45><44>Ϣ<EFBFBD><CFA2><EFBFBD><EFBFBD><EFBFBD><EFBFBD>RegisterTab<61><62><EFBFBD><EFBFBD>û<EFBFBD>б<EFBFBD><D0B1><EFBFBD><EFBFBD>ã<EFBFBD><C3A3><EFBFBD><EFBFBD><EFBFBD><EFBFBD>յ<EFBFBD><D5B5><EFBFBD>Ϣ<EFBFBD><CFA2><EFBFBD><EFBFBD><EFBFBD>±<EFBFBD><C2B1><EFBFBD>һ<EFBFBD><D2BB>û<EFBFBD>б<EFBFBD>ע<EFBFBD><D7A2><EFBFBD><EFBFBD>Tab
for (int i = 0; i < borwser_box_tab_->GetCount(); i++)
{
Control *box_item = borwser_box_tab_->GetItemAt(i);
ASSERT(NULL != box_item);
if (NULL == box_item)
continue;
BrowserBox* browser_box = dynamic_cast<BrowserBox*>(box_item);
if (NULL == browser_box)
continue;
TaskbarTabItem* taskbar_item = browser_box->GetTaskbarItem();
if (NULL == taskbar_item)
continue;
taskbar_manager_.RegisterTab(*taskbar_item);
}
return TRUE;
}
return __super::HandleMessage(uMsg, wParam, lParam);
}
LRESULT MultiBrowserForm::OnClose(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled)
{
CloseReason closeReason = (CloseReason)wParam;
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϊ<EFBFBD><CEAA><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ӷ<EFBFBD><D3B6>ر<EFBFBD><D8B1>˵<EFBFBD><CBB5>´<EFBFBD><C2B4>ڹرգ<D8B1><D5A3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
if (kBrowserBoxClose == closeReason)
{
return __super::OnClose(uMsg, wParam, lParam, bHandled);
}
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ԭ<EFBFBD>򴥷<EFBFBD><F2B4A5B7><EFBFBD>WM_CLOSE
else
{
int browser_count = GetBoxCount();
if (browser_count > 0 && NULL != active_browser_box_)
{
// <20><><EFBFBD><EFBFBD>ֻ<EFBFBD><D6BB>һ<EFBFBD><D2BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ӣ<EFBFBD><D3A3><EFBFBD>ֱ<EFBFBD>ӹر<D3B9>
if (1 == browser_count)
{
CloseBox(active_browser_box_->GetId());
}
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ӣ<EFBFBD><D3A3><EFBFBD>ѯ<EFBFBD><D1AF><EFBFBD>û<EFBFBD>
else
{
MsgboxCallback cb = ToWeakCallback([this](MsgBoxRet ret)
{
if (ret == MB_YES)
{
while (GetBoxCount() > 0)
{
Control *tab_item = tab_list_->GetItemAt(0);
ASSERT(NULL != tab_item);
if (NULL == tab_item)
break;
CloseBox(tab_item->GetUTF8Name());
}
}
});
ShowMsgBox(this->GetHWND(), cb, L"STRID_CEF_BROWSER_CLOSING", true, L"STRING_TIPS", true, L"STRING_OK", true, L"STRING_NO", true);
}
bHandled = TRUE;
return 0;
}
}
return __super::OnClose(uMsg, wParam, lParam, bHandled);
}
void MultiBrowserForm::OnFinalMessage(HWND hWnd)
{
// ʹ<><CAB9>tab_list_<74><5F><EFBFBD>ж<EFBFBD><D0B6><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>browser_box_tab_<62><5F>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>׼ȷ
int browser_box_count = GetBoxCount();
for (int i = 0; i < browser_box_count; i++)
{
Control *box_item = borwser_box_tab_->GetItemAt(i);
ASSERT(NULL != box_item);
if (NULL == box_item)
continue;;
BrowserBox* browser_box = dynamic_cast<BrowserBox*>(box_item);
if (NULL != browser_box)
browser_box->UninitBrowserBox();
}
UnInitDragDrop();
__super::OnFinalMessage(hWnd);
}
void MultiBrowserForm::OnWndSizeMax(bool max)
{
if (btn_max_restore_)
btn_max_restore_->SetClass(max ? L"btn_wnd_restore" : L"btn_wnd_max");
}
bool MultiBrowserForm::OnClicked( ui::EventArgs* arg )
{
std::wstring name = arg->pSender->GetName();
if (name == L"btn_max_restore")
{
DWORD style = GetWindowLong(GetHWND(), GWL_STYLE);
if (style & WS_MAXIMIZE)
::ShowWindow(GetHWND(), SW_RESTORE);
else
::ShowWindow(GetHWND(), SW_MAXIMIZE);
}
else if (name == L"btn_close")
{
if (NULL == active_browser_box_)
{
ASSERT(0);
return true;
}
CloseBox(active_browser_box_->GetId());
}
else if (name == L"btn_min")
{
SendMessage(WM_SYSCOMMAND, SC_MINIMIZE, 0);
}
else if (name == L"btn_add")
{
nbase::TimeDelta time_delta = nbase::TimeDelta::FromMicroseconds(nbase::Time::Now().ToInternalValue());
std::string timeStamp = nbase::StringPrintf("%I64u", time_delta.ToMilliseconds());
MultiBrowserManager::GetInstance()->CreateBorwserBox(this, timeStamp, L"");
2019-04-19 17:19:57 +08:00
}
else if (active_browser_box_)
{
auto cef_control = active_browser_box_->GetCefControl();
if (!cef_control)
return true;
if (name == L"btn_back")
{
cef_control->GoBack();
}
else if (name == L"btn_forward")
{
cef_control->GoForward();
}
else if (name == L"btn_refresh")
{
cef_control->Refresh();
}
}
return true;
}
bool MultiBrowserForm::OnReturn(ui::EventArgs* arg)
{
std::wstring name = arg->pSender->GetName();
if (name == L"edit_url")
{
#if 0
// <20>ڵ<EFBFBD>ǰҳ<C7B0><D2B3><EFBFBD><EFBFBD>ת
auto cef_control = active_browser_box_->GetCefControl();
if (cef_control)
cef_control->LoadURL(edit_url_->GetText());
#endif
nbase::TimeDelta time_delta = nbase::TimeDelta::FromMicroseconds(nbase::Time::Now().ToInternalValue());
std::string timeStamp = nbase::StringPrintf("%I64u", time_delta.ToMilliseconds());
2019-04-19 17:19:57 +08:00
// <20>½<EFBFBD><C2BD><EFBFBD>ǩҳ
MultiBrowserManager::GetInstance()->CreateBorwserBox(this, timeStamp, edit_url_->GetText());
2019-04-19 17:19:57 +08:00
}
return false;
}
BrowserBox* MultiBrowserForm::CreateBox(const std::string &browser_id, std::wstring url)
{
std::wstring id = nbase::UTF8ToUTF16(browser_id);
if (NULL != FindTabItem(id))
{
ASSERT(0);
return NULL;
}
if (NULL != FindBox(id))
{
ASSERT(0);
return NULL;
}
BrowserTabItem *tab_item = new BrowserTabItem;
GlobalManager::FillBoxWithCache(tab_item, L"multi_browser/tab_item.xml");
tab_list_->AddAt(tab_item, GetBoxCount());
tab_item->AttachAllEvents(nbase::Bind(&MultiBrowserForm::OnProcessTabItemDrag, this, std::placeholders::_1));
tab_item->AttachButtonDown(nbase::Bind(&MultiBrowserForm::OnTabItemSelected, this, std::placeholders::_1));
tab_item->InitControl(browser_id);
Button *btn_item_close = (Button*)tab_item->FindSubControl(L"tab_item_close");
btn_item_close->AttachClick(nbase::Bind(&MultiBrowserForm::OnTabItemClose, this, std::placeholders::_1, browser_id));
BrowserBox* browser_box = new BrowserBox(browser_id);
borwser_box_tab_->Add(browser_box);
GlobalManager::FillBoxWithCache(browser_box, L"multi_browser/browser_box.xml", nbase::Bind(&BrowserBox::CreateControl, browser_box, std::placeholders::_1));
browser_box->SetName(id);
browser_box->InitBrowserBox(url);
auto taskbar_item = browser_box->GetTaskbarItem();
if (taskbar_item)
taskbar_manager_.RegisterTab(*taskbar_item);
if (GetBoxCount() <= 1)
active_browser_box_ = browser_box;
// <20>л<EFBFBD><D0BB><EFBFBD><EFBFBD>µ<EFBFBD><C2B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// <20><><EFBFBD><EFBFBD>tab_item<65><6D><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>״̬<D7B4><CCAC><EFBFBD><EFBFBD><EFBFBD>޷<EFBFBD>˳<EFBFBD><CBB3><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ѡ<EFBFBD><D1A1><EFBFBD>¼<EFBFBD><C2BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֱ<EFBFBD><D6B1><EFBFBD>л<EFBFBD><D0BB><EFBFBD>Ŀ<EFBFBD><C4BF><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
tab_item->Selected(true, false);
ChangeToBox(id);
return browser_box;
}
void MultiBrowserForm::CloseBox(const std::string &browser_id)
{
if (browser_id.empty())
return;
std::wstring id = nbase::UTF8ToUTF16(browser_id);
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>б<EFBFBD><D0B1><EFBFBD><EFBFBD>Ƴ<EFBFBD><C6B3><EFBFBD>Ӧitem
BrowserTabItem *tab_item = FindTabItem(id);
if (NULL != tab_item)
{
tab_list_->Remove(tab_item);
}
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>б<EFBFBD><D0B1><EFBFBD><EFBFBD>ҵ<EFBFBD><D2B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ӳ<EFBFBD><D3B2><EFBFBD><EFBFBD>Ƴ<EFBFBD><C6B3><EFBFBD><EFBFBD><EFBFBD>
BrowserBox *browser_box = FindBox(id);
ASSERT(NULL != browser_box);
if (NULL != browser_box)
{
auto taskbar_item = browser_box->GetTaskbarItem();
if (taskbar_item)
taskbar_manager_.UnregisterTab(*taskbar_item);
browser_box->UninitBrowserBox();
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ӵ<EFBFBD><D3B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>1<EFBFBD><31><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ƴ<EFBFBD><C6B3><EFBFBD><EFBFBD>ӣ<EFBFBD><D3A3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ƴ<EFBFBD>
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD><D2BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ƴ<EFBFBD><C6B3><EFBFBD><EFBFBD>ڴ<EFBFBD><DAB4>ڹر<DAB9>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϊû<CEAA>пؼ<D0BF><D8BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ɺ<EFBFBD>ɫ
// <20><><EFBFBD>ڹر<DAB9>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD><EFBFBD>Զ<EFBFBD><D4B6><EFBFBD><EFBFBD>Ƴ<EFBFBD><C6B3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
if (borwser_box_tab_->GetCount() > 1)
borwser_box_tab_->Remove(browser_box);
else
active_browser_box_ = NULL;
}
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1><EFBFBD>ر<EFBFBD><D8B1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
if (GetBoxCount() == 0)
{
this->Close(kBrowserBoxClose);
}
}
bool MultiBrowserForm::AttachBox(BrowserBox *browser_box)
{
if (NULL == browser_box)
return false;
std::wstring id = nbase::UTF8ToUTF16(browser_box->GetId());
if (NULL != FindTabItem(id))
{
ASSERT(0);
return false;
}
if (NULL != FindBox(id))
{
ASSERT(0);
return false;
}
BrowserTabItem *tab_item = new BrowserTabItem;
GlobalManager::FillBoxWithCache(tab_item, L"multi_browser/tab_item.xml");
tab_list_->AddAt(tab_item, GetBoxCount());
tab_item->AttachAllEvents(nbase::Bind(&MultiBrowserForm::OnProcessTabItemDrag, this, std::placeholders::_1));
tab_item->AttachButtonDown(nbase::Bind(&MultiBrowserForm::OnTabItemSelected, this, std::placeholders::_1));
tab_item->InitControl(browser_box->GetId());
tab_item->SetTitle(browser_box->GetTitle());
Button *btn_item_close = (Button*)tab_item->FindSubControl(L"tab_item_close");
btn_item_close->AttachClick(nbase::Bind(&MultiBrowserForm::OnTabItemClose, this, std::placeholders::_1, browser_box->GetId()));
// <20><><EFBFBD><EFBFBD>һ<EFBFBD><D2BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><E5B4B4><EFBFBD><EFBFBD>browser_box<6F><78><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ӿؼ<D3BF><D8BC><EFBFBD><EFBFBD>ӵ<EFBFBD><D3B5><EFBFBD>һ<EFBFBD><D2BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ڵ<EFBFBD><DAB5><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ؼ<EFBFBD>ʱ
// Add<64><64><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>µ<EFBFBD><C2B5>޸<EFBFBD>browser_box<6F><78><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ӿؼ<D3BF><D8BC><EFBFBD>m_pWindowΪ<77>µĴ<C2B5><C4B4><EFBFBD>ָ<EFBFBD><D6B8>
borwser_box_tab_->Add(browser_box);
auto taskbar_item = browser_box->GetTaskbarItem();
if (taskbar_item)
taskbar_manager_.RegisterTab(*taskbar_item);
if (GetBoxCount() <= 1)
active_browser_box_ = browser_box;
// <20>л<EFBFBD><D0BB><EFBFBD><EFBFBD>µ<EFBFBD><C2B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// <20><><EFBFBD><EFBFBD>tab_item<65><6D><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>״̬<D7B4><CCAC><EFBFBD><EFBFBD><EFBFBD>޷<EFBFBD>˳<EFBFBD><CBB3><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ѡ<EFBFBD><D1A1><EFBFBD>¼<EFBFBD><C2BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֱ<EFBFBD><D6B1><EFBFBD>л<EFBFBD><D0BB><EFBFBD>Ŀ<EFBFBD><C4BF><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
tab_item->Selected(true, false);
ChangeToBox(id);
return true;
}
bool MultiBrowserForm::DetachBox(BrowserBox *browser_box)
{
if (NULL == browser_box)
return false;
std::wstring id = nbase::UTF8ToUTF16(browser_box->GetId());
// <20>Ӷ<EFBFBD><D3B6><EFBFBD><EFBFBD><EFBFBD>ǩҳ<C7A9>Ƴ<EFBFBD><C6B3><EFBFBD>Ӧitem
BrowserTabItem *tab_item = FindTabItem(id);
if (NULL == tab_item)
return false;
tab_list_->Remove(tab_item);
auto taskbar_item = browser_box->GetTaskbarItem();
if (taskbar_item)
taskbar_manager_.UnregisterTab(*taskbar_item);
// <20><><EFBFBD>Ҳ<EFBFBD>Tab<61><62><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>б<EFBFBD><D0B1><EFBFBD><EFBFBD>ҵ<EFBFBD><D2B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ӳ<EFBFBD><D3B2><EFBFBD><EFBFBD>Ƴ<EFBFBD><C6B3><EFBFBD><EFBFBD><EFBFBD>
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFB2BB>delete browser_box
bool auto_destroy = borwser_box_tab_->IsAutoDestroy();
borwser_box_tab_->SetAutoDestroy(false);
if (!borwser_box_tab_->Remove(browser_box))
{
borwser_box_tab_->SetAutoDestroy(auto_destroy);
return false;
}
borwser_box_tab_->SetAutoDestroy(auto_destroy);
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1><EFBFBD>ر<EFBFBD><D8B1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
if (GetBoxCount() == 0)
{
this->Close(kBrowserBoxClose);
}
return true;
}
BrowserBox* MultiBrowserForm::GetSelectedBox()
{
return active_browser_box_;
}
void MultiBrowserForm::SetActiveBox(const std::string &browser_id)
{
if (browser_id.empty())
return;
ActiveWindow();
// <20>Ӵ<EFBFBD><D3B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>б<EFBFBD><D0B1>ҵ<EFBFBD>Ҫ<EFBFBD><D2AA><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
std::wstring id = nbase::UTF8ToUTF16(browser_id);
BrowserTabItem *tab_item = FindTabItem(id);
if (NULL == tab_item)
return;
// <20><><EFBFBD><EFBFBD>tab_item<65><6D><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>״̬<D7B4><CCAC><EFBFBD><EFBFBD><EFBFBD>޷<EFBFBD>˳<EFBFBD><CBB3><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ѡ<EFBFBD><D1A1><EFBFBD>¼<EFBFBD><C2BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֱ<EFBFBD><D6B1><EFBFBD>л<EFBFBD><D0BB><EFBFBD>Ŀ<EFBFBD><C4BF><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
tab_item->Selected(true, false);
ChangeToBox(id);
}
bool MultiBrowserForm::IsActiveBox(const BrowserBox *browser_box)
{
ASSERT(NULL != browser_box);
return (browser_box == active_browser_box_ && ::GetForegroundWindow() == GetHWND() && !::IsIconic(GetHWND()) && IsWindowVisible(GetHWND()));
}
bool MultiBrowserForm::IsActiveBox(const std::wstring &browser_id)
{
ASSERT(!browser_id.empty());
return (::GetForegroundWindow() == GetHWND() && !::IsIconic(GetHWND()) && IsWindowVisible(GetHWND()) && FindBox(browser_id) == active_browser_box_);
}
int MultiBrowserForm::GetBoxCount() const
{
return tab_list_->GetCount() - 1; // <20><>ȥ<EFBFBD>ұ<EFBFBD><D2B1>Ǹ<EFBFBD><C7B8>Ӻŵ<D3BA><C5B5><EFBFBD><EFBFBD><EFBFBD>
}
void MultiBrowserForm::OnBeforeDragBoxCallback(const std::wstring &browser_id)
{
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ǰ<EFBFBD><C7B0><EFBFBD><EFBFBD>ק<EFBFBD><D7A7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֻ<EFBFBD><D6BB>һ<EFBFBD><D2BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ӣ<EFBFBD><D3A3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>קʱ<D7A7><CAB1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
int box_count = this->GetBoxCount();
if (1 == box_count)
{
this->ShowWindow(false);
}
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ر<EFBFBD><D8B1><EFBFBD>ק<EFBFBD><D7A7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ӻͱ<D3BA>ǩ
else
{
BrowserBox *browser_box = FindBox(browser_id);
if (NULL != browser_box)
browser_box->SetVisible(false);
BrowserTabItem *tab_item = FindTabItem(browser_id);
if (NULL != tab_item)
tab_item->SetVisible(false);
// <20>ҵ<EFBFBD><D2B5>µı<C2B5><C4B1><EFBFBD>ʾ<EFBFBD><CABE><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
int index = tab_item->GetIndex();
if (index > 0)
index--;
else
index++;
BrowserTabItem *new_tab_item = static_cast<BrowserTabItem*>(tab_list_->GetItemAt(index));
if (NULL != new_tab_item)
{
new_tab_item->Selected(true, false);
ChangeToBox(new_tab_item->GetName());
}
draging_browser_id_ = browser_id;
}
}
void MultiBrowserForm::OnAfterDragBoxCallback(bool drop_succeed)
{
is_drag_state_ = false;
if (drop_succeed)
{
int box_count = this->GetBoxCount();
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ǰ<EFBFBD><C7B0><EFBFBD><EFBFBD>ק<EFBFBD><D7A7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֻ<EFBFBD><D6BB>һ<EFBFBD><D2BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ӣ<EFBFBD><D3A3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ק<EFBFBD><D7A7><EFBFBD>µ<EFBFBD><C2B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFA3AC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ھͻ<DABE><CDBB>ر<EFBFBD>
if (1 == box_count)
{
}
else
{
}
}
else
{
int box_count = this->GetBoxCount();
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ǰ<EFBFBD><C7B0><EFBFBD><EFBFBD>ק<EFBFBD><D7A7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֻ<EFBFBD><D6BB>һ<EFBFBD><D2BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ӣ<EFBFBD><D3A3><EFBFBD><EFBFBD><EFBFBD>û<EFBFBD><C3BB><EFBFBD><EFBFBD>ק<EFBFBD><D7A7><EFBFBD>µ<EFBFBD><C2B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// <20><><EFBFBD><EFBFBD>ʾ<EFBFBD><CABE><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
if (1 == box_count)
{
this->ShowWindow(true);
}
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ǰ<EFBFBD><C7B0><EFBFBD><EFBFBD>ק<EFBFBD><D7A7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ж<EFBFBD><D0B6><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ӣ<EFBFBD><D3A3><EFBFBD><EFBFBD><EFBFBD>û<EFBFBD><C3BB><EFBFBD><EFBFBD>ק<EFBFBD><D7A7><EFBFBD>µ<EFBFBD><C2B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// <20><><EFBFBD><EFBFBD>ʾ֮ǰ<D6AE><C7B0><EFBFBD><EFBFBD><EFBFBD>ص<EFBFBD><D8B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ӻͱ<D3BA>ǩ
else
{
BrowserBox *browser_box = FindBox(draging_browser_id_);
if (NULL != browser_box)
browser_box->SetVisible(true);
BrowserTabItem *tab_item = FindTabItem(draging_browser_id_);
if (NULL != tab_item)
{
tab_item->SetVisible(true);
tab_item->Selected(true, false);
ChangeToBox(draging_browser_id_);
}
draging_browser_id_.clear();
}
}
}
bool MultiBrowserForm::OnTabItemSelected(ui::EventArgs* param)
{
if (kEventSelect == param->Type)
{
std::wstring name = param->pSender->GetName();
if (name == L"tab_list")
{
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>˶<EFBFBD><CBB6><EFBFBD><EFBFBD>ı<EFBFBD>ǩ<EFBFBD><C7A9><EFBFBD><EFBFBD><EFBFBD>ҵ<EFBFBD><D2B5>·<EFBFBD>Tab<61><62><EFBFBD><EFBFBD>Ӧ<EFBFBD><D3A6><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ӳ<EFBFBD>ѡ<EFBFBD><D1A1>
Control *select_item = tab_list_->GetItemAt(tab_list_->GetCurSel());
ASSERT(NULL != select_item);
if (NULL == select_item)
return true;
std::wstring session_id = select_item->GetName();
ChangeToBox(session_id);
}
}
else if (kEventMouseButtonDown == param->Type)
{
BrowserTabItem *tab_item = dynamic_cast<BrowserTabItem*>(param->pSender);
if (tab_item)
{
std::wstring browser_id = tab_item->GetName();
ChangeToBox(browser_id);
}
}
return false;
}
bool MultiBrowserForm::OnTabItemClose(ui::EventArgs* param, const std::string& browser_id)
{
if (param->pSender->GetName() == L"tab_item_close")
{
CloseBox(browser_id);
}
return false;
}
BrowserBox* MultiBrowserForm::FindBox(const std::wstring &browser_id)
{
for (int i = 0; i < borwser_box_tab_->GetCount(); i++)
{
Control *box_item = borwser_box_tab_->GetItemAt(i);
ASSERT(NULL != box_item);
if (NULL == box_item)
return NULL;
if (box_item->GetName() == browser_id)
return dynamic_cast<BrowserBox*>(box_item);
}
return NULL;
}
BrowserTabItem* MultiBrowserForm::FindTabItem(const std::wstring &browser_id)
{
for (int i = 0; i < GetBoxCount(); i++)
{
Control *tab_item = tab_list_->GetItemAt(i);
ASSERT(NULL != tab_item);
if (NULL == tab_item)
return NULL;
if (tab_item->GetName() == browser_id)
return static_cast<BrowserTabItem*>(tab_item);
}
return NULL;
}
void MultiBrowserForm::SetTabItemName(const std::wstring &browser_id, const std::wstring &name)
{
BrowserTabItem *tab_item = FindTabItem(browser_id);
if (NULL != tab_item)
{
tab_item->SetTitle(name);
}
}
void MultiBrowserForm::SetURL(const std::string &browser_id, const std::wstring &url)
{
if (active_browser_box_ && active_browser_box_->GetId() == browser_id)
edit_url_->SetText(url);
}
bool MultiBrowserForm::ChangeToBox(const std::wstring &browser_id)
{
if (browser_id.empty())
return false;
BrowserBox *box_item = FindBox(browser_id);
if (NULL == box_item)
return false;
borwser_box_tab_->SelectItem(box_item);
box_item->SetFocus();
active_browser_box_ = box_item;
edit_url_->SetText(active_browser_box_->GetCefControl()->GetURL());
// <20><><EFBFBD>ݵ<EFBFBD>ǰ<EFBFBD><C7B0><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ӣ<EFBFBD><D3A3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͼ<EFBFBD><CDBC><EFBFBD>ͱ<EFBFBD><CDB1><EFBFBD>
return true;
}