代码改变世界

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    //新增此行

 

四、编译后效果图