chrome 左侧功能区切分页面实现方法
2012-11-22 09:52 cdamo 阅读(944) 评论(0) 编辑 收藏 举报
一、功能目标:
在chrome浏览器左侧切分一块区域,如下图.
二、实验环境:
1. 硬件配置intel i7 2600K CPU + 8G内存
2. windows7 64位操作系统 + VS2010 + win8SDK
3.chromium.r140492 tarball压缩包
注: 具体安装编译环境可以参看http://www.cnblogs.com/cdamo/archive/2012/10/12/2720842.html
三、实验步骤
1. 修改src\chrome\browser\ui\views\frame\browser_view.h 文件
在line 629增加
// 左边栏窗口webView
views::WebView* toolbar_container_;
在line 631增加
//与主内容窗口的单切分view
//Split view containing the contents container and functions container.
views::SingleSplitView* toolbar_split_;
在line 640增加
//左边栏窗口的显示模式,靠左边或右边 (默认是靠左边)
// Side to dock toolbar to
ToolBarDockSide toolbar_dock_side_;
在line 474增加
// Shows docked functions.
void ShowToolbarContainer();
// Hides docked functions.
void HideToolbarContainer();
2. 修改src\chrome\browser\ui\views\frame\browser_view.cc 文件
变量初始化:
主要操作是先将左边栏窗口的View与主窗口的view 合并生成toolbar_split_;
然后再将functions_split_与DevTools 窗口的view再合并生成devtools_split_;
在 line 1860行 处修改Init()函数
void BrowserView::Init() {
………………………………….
SkColor bg_color = GetWidget()->GetThemeProvider()->
GetColor(ThemeService::COLOR_TOOLBAR);
views::View* contents_view = contents_;
//cdamo add 2012-11-15
toolbar_container_ = new views::WebView(browser_->profile());
toolbar_container_->set_id(VIEW_ID_TOOLBAR_DOCKED);
toolbar_container_->SetVisible(false);
toolbar_split_ = new views::SingleSplitView(
toolbar_container_,
contents_view,
views::SingleSplitView::VERTICAL_SPLIT,
this);
toolbar_split_->set_id(VIEW_ID_CONTENTS_SPLIT);
toolbar_split_->SetAccessibleName(
l10n_util::GetStringUTF16(IDS_ACCNAME_WEB_CONTENTS));
toolbar_split_->set_background(
views::Background::CreateSolidBackground(bg_color));
toolbar_container_->GetWebContents();
toolbar_container_->LoadInitialURL(GURL(“www.google.com.hk”);
//toolbar_container_->LoadInitialURL(GURL(chrome::kChromeUIHelloWorldURL)); //内嵌页面
toolbar_container_->web_contents()->Focus();
devtools_container_ = new views::WebView(browser_->profile());
devtools_container_->set_id(VIEW_ID_DEV_TOOLS_DOCKED);
devtools_container_->SetVisible(false);
//AddChildView(functions_split_);
//set_contents_view(functions_split_);
contents_split_ = new views::SingleSplitView(
toolbar_split_,
devtools_container_,
views::SingleSplitView::VERTICAL_SPLIT,
this);
contents_split_->set_id(VIEW_ID_CONTENTS_SPLIT);
contents_split_->SetAccessibleName(
l10n_util::GetStringUTF16(IDS_ACCNAME_WEB_CONTENTS));
contents_split_->set_background(
views::Background::CreateSolidBackground(bg_color));
AddChildView(contents_split_);
set_contents_view(contents_split_);
status_bubble_.reset(new StatusBubbleViews(contents_));
………………………………………………………………
}
3. 左边栏窗口显示隐藏控制函数
//cdamo 2012-11-15
在2052处增加 ShowToolbarContainer()函数
void BrowserView::ShowToolbarContainer() {
/* if (!devtools_focus_tracker_.get()) {
// Install devtools focus tracker when dev tools window is shown for the
// first time.
devtools_focus_tracker_.reset(
new views::ExternalFocusTracker(devtools_container_,
GetFocusManager()));
}
*/
bool dock_to_right = toolbar_dock_side_ == TOOLBAR_DOCK_SIDE_LEFT;
int contents_size = toolbar_split_->width();
int min_size = kMinDevToolsWidth;
// Restore split offset.
int split_offset = browser_->profile()->GetPrefs()->
GetInteger(dock_to_right ? prefs::kDevToolsVSplitLocation :
prefs::kDevToolsHSplitLocation);
if (split_offset == -1)
split_offset = contents_size * 1 / 3;
// Make sure user can see both panes.
split_offset = std::max(min_size, split_offset);
split_offset = std::min(contents_size - kMinContentsSize, split_offset);
if (split_offset < 0)
split_offset = contents_size * 1 / 3;
toolbar_split_->set_divider_offset(contents_size - split_offset);
toolbar_container_->SetVisible(true);
toolbar_split_->set_orientation(
dock_to_right ? views::SingleSplitView::HORIZONTAL_SPLIT
: views::SingleSplitView::VERTICAL_SPLIT);
toolbar_split_->InvalidateLayout();
Layout();
}
void BrowserView::HideToolbarContainer() {
// Store split offset when hiding devtools window only.
bool dock_to_right = toolbar_dock_side_ == TOOLBAR_DOCK_SIDE_LEFT;
int contents_size = dock_to_right ? toolbar_split_->width() :
toolbar_split_->height();
browser_->profile()->GetPrefs()->SetInteger(
dock_to_right ? prefs::kDevToolsVSplitLocation :
prefs::kDevToolsHSplitLocation,
contents_size - toolbar_split_->divider_offset());
// Restore focus to the last focused view when hiding devtools window.
//devtools_focus_tracker_->FocusLastFocusedExternalView();
toolbar_container_->SetVisible(false);
toolbar_split_->InvalidateLayout();
Layout();
}
4.按F12显示DevTool面版处加入左侧栏窗口显示控件函数.
5. 修改src\chrome\browser\ui\browser_window.h 文件
在line 60增加
enum ToolBarDockSide {
TOOLBAR_DOCK_SIDE_LEFT = 0,
TOOLBAR_DOCK_SIDE_RIGHT = 1,
};
6. 修改src\chrome\browser\ui\view_ids.h 文件
在line 80 修改
// Plus button on location bar.
VIEW_ID_ACTION_BOX_BUTTON, //加一个逗号
VIEW_ID_TOOLBAR_DOCKED //新增此行
四、编译后效果图