| OLD | NEW |
| 1 // Copyright (c) 2006-2008 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2006-2008 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "chrome/browser/views/constrained_window_impl.h" | 5 #include "chrome/browser/views/constrained_window_impl.h" |
| 6 | 6 |
| 7 #include "base/gfx/rect.h" | 7 #include "base/gfx/rect.h" |
| 8 #include "chrome/app/chrome_dll_resource.h" | 8 #include "chrome/app/chrome_dll_resource.h" |
| 9 #include "chrome/browser/browser_process.h" | 9 #include "chrome/browser/browser_process.h" |
| 10 #include "chrome/browser/profile.h" | 10 #include "chrome/browser/profile.h" |
| (...skipping 166 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 177 static SkBitmap* bitmaps_[FRAME_PART_BITMAP_COUNT]; | 177 static SkBitmap* bitmaps_[FRAME_PART_BITMAP_COUNT]; |
| 178 | 178 |
| 179 DISALLOW_EVIL_CONSTRUCTORS(OTRWindowResources); | 179 DISALLOW_EVIL_CONSTRUCTORS(OTRWindowResources); |
| 180 }; | 180 }; |
| 181 | 181 |
| 182 SkBitmap* XPWindowResources::bitmaps_[]; | 182 SkBitmap* XPWindowResources::bitmaps_[]; |
| 183 SkBitmap* VistaWindowResources::bitmaps_[]; | 183 SkBitmap* VistaWindowResources::bitmaps_[]; |
| 184 SkBitmap* OTRWindowResources::bitmaps_[]; | 184 SkBitmap* OTRWindowResources::bitmaps_[]; |
| 185 | 185 |
| 186 //////////////////////////////////////////////////////////////////////////////// | 186 //////////////////////////////////////////////////////////////////////////////// |
| 187 // ConstrainedWindowNonClientView | 187 // ConstrainedWindowFrameView |
| 188 | 188 |
| 189 class ConstrainedWindowNonClientView | 189 class ConstrainedWindowFrameView |
| 190 : public views::NonClientView, | 190 : public views::NonClientFrameView, |
| 191 public views::BaseButton::ButtonListener { | 191 public views::BaseButton::ButtonListener { |
| 192 public: | 192 public: |
| 193 ConstrainedWindowNonClientView(ConstrainedWindowImpl* container, | 193 explicit ConstrainedWindowFrameView(ConstrainedWindowImpl* container); |
| 194 TabContents* owner); | 194 virtual ~ConstrainedWindowFrameView(); |
| 195 virtual ~ConstrainedWindowNonClientView(); | |
| 196 | 195 |
| 197 void UpdateWindowTitle(); | 196 void UpdateWindowTitle(); |
| 198 | 197 |
| 199 // Overridden from views::NonClientView: | 198 // Overridden from views::NonClientFrameView: |
| 200 virtual gfx::Rect CalculateClientAreaBounds(int width, int height) const; | 199 virtual gfx::Rect GetBoundsForClientView() const; |
| 201 virtual gfx::Size CalculateWindowSizeForClientSize(int width, | 200 virtual bool AlwaysUseCustomFrame() const; |
| 202 int height) const; | 201 virtual gfx::Rect GetWindowBoundsForClientBounds( |
| 202 const gfx::Rect& client_bounds) const; |
| 203 virtual gfx::Point GetSystemMenuPoint() const; | 203 virtual gfx::Point GetSystemMenuPoint() const; |
| 204 virtual int NonClientHitTest(const gfx::Point& point); | 204 virtual int NonClientHitTest(const gfx::Point& point); |
| 205 virtual void GetWindowMask(const gfx::Size& size, gfx::Path* window_mask); | 205 virtual void GetWindowMask(const gfx::Size& size, gfx::Path* window_mask); |
| 206 virtual void EnableClose(bool enable); | 206 virtual void EnableClose(bool enable); |
| 207 virtual void ResetWindowControls() { } | 207 virtual void ResetWindowControls() { } |
| 208 | 208 |
| 209 // Overridden from views::View: | 209 // Overridden from views::View: |
| 210 virtual void Paint(ChromeCanvas* canvas); | 210 virtual void Paint(ChromeCanvas* canvas); |
| 211 virtual void Layout(); | 211 virtual void Layout(); |
| 212 virtual void ViewHierarchyChanged(bool is_add, View *parent, View *child); | 212 virtual void ThemeChanged(); |
| 213 | 213 |
| 214 // Overridden from views::BaseButton::ButtonListener: | 214 // Overridden from views::BaseButton::ButtonListener: |
| 215 virtual void ButtonPressed(views::BaseButton* sender); | 215 virtual void ButtonPressed(views::BaseButton* sender); |
| 216 | 216 |
| 217 private: | 217 private: |
| 218 // Returns the thickness of the border that makes up the window frame edges. | 218 // Returns the thickness of the border that makes up the window frame edges. |
| 219 // This does not include any client edge. | 219 // This does not include any client edge. |
| 220 int FrameBorderThickness() const; | 220 int FrameBorderThickness() const; |
| 221 | 221 |
| 222 // Returns the thickness of the entire nonclient left, right, and bottom | 222 // Returns the thickness of the entire nonclient left, right, and bottom |
| (...skipping 12 matching lines...) Expand all Loading... |
| 235 // Paints different parts of the window to the incoming canvas. | 235 // Paints different parts of the window to the incoming canvas. |
| 236 void PaintFrameBorder(ChromeCanvas* canvas); | 236 void PaintFrameBorder(ChromeCanvas* canvas); |
| 237 void PaintTitleBar(ChromeCanvas* canvas); | 237 void PaintTitleBar(ChromeCanvas* canvas); |
| 238 void PaintClientEdge(ChromeCanvas* canvas); | 238 void PaintClientEdge(ChromeCanvas* canvas); |
| 239 | 239 |
| 240 // Layout various sub-components of this view. | 240 // Layout various sub-components of this view. |
| 241 void LayoutWindowControls(); | 241 void LayoutWindowControls(); |
| 242 void LayoutTitleBar(); | 242 void LayoutTitleBar(); |
| 243 void LayoutClientView(); | 243 void LayoutClientView(); |
| 244 | 244 |
| 245 // Returns the bounds of the client area for the specified view size. |
| 246 gfx::Rect CalculateClientAreaBounds(int width, int height) const; |
| 247 |
| 245 SkColor GetTitleColor() const { | 248 SkColor GetTitleColor() const { |
| 246 return (container_->owner()->profile()->IsOffTheRecord() || | 249 return (container_->owner()->profile()->IsOffTheRecord() || |
| 247 !win_util::ShouldUseVistaFrame()) ? SK_ColorWHITE : SK_ColorBLACK; | 250 !win_util::ShouldUseVistaFrame()) ? SK_ColorWHITE : SK_ColorBLACK; |
| 248 } | 251 } |
| 249 | 252 |
| 253 // Loads the appropriate set of WindowResources for the frame view. |
| 254 void InitWindowResources(); |
| 255 |
| 250 ConstrainedWindowImpl* container_; | 256 ConstrainedWindowImpl* container_; |
| 251 | 257 |
| 252 scoped_ptr<views::WindowResources> resources_; | 258 scoped_ptr<views::WindowResources> resources_; |
| 253 | 259 |
| 254 gfx::Rect title_bounds_; | 260 gfx::Rect title_bounds_; |
| 255 | 261 |
| 256 views::Button* close_button_; | 262 views::Button* close_button_; |
| 257 | 263 |
| 264 // The bounds of the ClientView. |
| 265 gfx::Rect client_view_bounds_; |
| 266 |
| 258 static void InitClass(); | 267 static void InitClass(); |
| 259 | 268 |
| 260 // The font to be used to render the titlebar text. | 269 // The font to be used to render the titlebar text. |
| 261 static ChromeFont title_font_; | 270 static ChromeFont title_font_; |
| 262 | 271 |
| 263 DISALLOW_EVIL_CONSTRUCTORS(ConstrainedWindowNonClientView); | 272 DISALLOW_EVIL_CONSTRUCTORS(ConstrainedWindowFrameView); |
| 264 }; | 273 }; |
| 265 | 274 |
| 266 ChromeFont ConstrainedWindowNonClientView::title_font_; | 275 ChromeFont ConstrainedWindowFrameView::title_font_; |
| 267 | 276 |
| 268 namespace { | 277 namespace { |
| 269 // The frame border is only visible in restored mode and is hardcoded to 4 px on | 278 // The frame border is only visible in restored mode and is hardcoded to 4 px on |
| 270 // each side regardless of the system window border size. | 279 // each side regardless of the system window border size. |
| 271 const int kFrameBorderThickness = 4; | 280 const int kFrameBorderThickness = 4; |
| 272 // Various edges of the frame border have a 1 px shadow along their edges; in a | 281 // Various edges of the frame border have a 1 px shadow along their edges; in a |
| 273 // few cases we shift elements based on this amount for visual appeal. | 282 // few cases we shift elements based on this amount for visual appeal. |
| 274 const int kFrameShadowThickness = 1; | 283 const int kFrameShadowThickness = 1; |
| 275 // In the window corners, the resize areas don't actually expand bigger, but the | 284 // In the window corners, the resize areas don't actually expand bigger, but the |
| 276 // 16 px at the end of each edge triggers diagonal resizing. | 285 // 16 px at the end of each edge triggers diagonal resizing. |
| (...skipping 10 matching lines...) Expand all Loading... |
| 287 // The caption buttons are always drawn 1 px down from the visible top of the | 296 // The caption buttons are always drawn 1 px down from the visible top of the |
| 288 // window (the true top in restored mode, or the top of the screen in maximized | 297 // window (the true top in restored mode, or the top of the screen in maximized |
| 289 // mode). | 298 // mode). |
| 290 const int kCaptionTopSpacing = 1; | 299 const int kCaptionTopSpacing = 1; |
| 291 | 300 |
| 292 const SkColor kContentsBorderShadow = SkColorSetARGB(51, 0, 0, 0); | 301 const SkColor kContentsBorderShadow = SkColorSetARGB(51, 0, 0, 0); |
| 293 const SkColor kContentsBorderColor = SkColorSetRGB(219, 235, 255); | 302 const SkColor kContentsBorderColor = SkColorSetRGB(219, 235, 255); |
| 294 } | 303 } |
| 295 | 304 |
| 296 //////////////////////////////////////////////////////////////////////////////// | 305 //////////////////////////////////////////////////////////////////////////////// |
| 297 // ConstrainedWindowNonClientView, public: | 306 // ConstrainedWindowFrameView, public: |
| 298 | 307 |
| 299 ConstrainedWindowNonClientView::ConstrainedWindowNonClientView( | 308 ConstrainedWindowFrameView::ConstrainedWindowFrameView( |
| 300 ConstrainedWindowImpl* container, TabContents* owner) | 309 ConstrainedWindowImpl* container) |
| 301 : NonClientView(), | 310 : NonClientFrameView(), |
| 302 container_(container), | 311 container_(container), |
| 303 close_button_(new views::Button) { | 312 close_button_(new views::Button) { |
| 304 InitClass(); | 313 InitClass(); |
| 305 if (owner->profile()->IsOffTheRecord()) { | 314 InitWindowResources(); |
| 306 resources_.reset(new OTRWindowResources); | |
| 307 } else { | |
| 308 if (win_util::ShouldUseVistaFrame()) { | |
| 309 resources_.reset(new VistaWindowResources); | |
| 310 } else { | |
| 311 resources_.reset(new XPWindowResources); | |
| 312 } | |
| 313 } | |
| 314 | 315 |
| 315 close_button_->SetImage(views::Button::BS_NORMAL, | 316 close_button_->SetImage(views::Button::BS_NORMAL, |
| 316 resources_->GetPartBitmap(FRAME_CLOSE_BUTTON_ICON)); | 317 resources_->GetPartBitmap(FRAME_CLOSE_BUTTON_ICON)); |
| 317 close_button_->SetImage(views::Button::BS_HOT, | 318 close_button_->SetImage(views::Button::BS_HOT, |
| 318 resources_->GetPartBitmap(FRAME_CLOSE_BUTTON_ICON_H)); | 319 resources_->GetPartBitmap(FRAME_CLOSE_BUTTON_ICON_H)); |
| 319 close_button_->SetImage(views::Button::BS_PUSHED, | 320 close_button_->SetImage(views::Button::BS_PUSHED, |
| 320 resources_->GetPartBitmap(FRAME_CLOSE_BUTTON_ICON_P)); | 321 resources_->GetPartBitmap(FRAME_CLOSE_BUTTON_ICON_P)); |
| 321 close_button_->SetImageAlignment(views::Button::ALIGN_CENTER, | 322 close_button_->SetImageAlignment(views::Button::ALIGN_CENTER, |
| 322 views::Button::ALIGN_MIDDLE); | 323 views::Button::ALIGN_MIDDLE); |
| 323 close_button_->SetListener(this, 0); | 324 close_button_->SetListener(this, 0); |
| 324 AddChildView(close_button_); | 325 AddChildView(close_button_); |
| 325 } | 326 } |
| 326 | 327 |
| 327 ConstrainedWindowNonClientView::~ConstrainedWindowNonClientView() { | 328 ConstrainedWindowFrameView::~ConstrainedWindowFrameView() { |
| 328 } | 329 } |
| 329 | 330 |
| 330 void ConstrainedWindowNonClientView::UpdateWindowTitle() { | 331 void ConstrainedWindowFrameView::UpdateWindowTitle() { |
| 331 SchedulePaint(title_bounds_, false); | 332 SchedulePaint(title_bounds_, false); |
| 332 } | 333 } |
| 333 | 334 |
| 334 //////////////////////////////////////////////////////////////////////////////// | 335 //////////////////////////////////////////////////////////////////////////////// |
| 335 // ConstrainedWindowNonClientView, views::NonClientView implementation: | 336 // ConstrainedWindowFrameView, views::NonClientFrameView implementation: |
| 336 | 337 |
| 337 gfx::Rect ConstrainedWindowNonClientView::CalculateClientAreaBounds( | 338 gfx::Rect ConstrainedWindowFrameView::GetBoundsForClientView() const { |
| 338 int width, | 339 return client_view_bounds_; |
| 339 int height) const { | 340 } |
| 341 |
| 342 bool ConstrainedWindowFrameView::AlwaysUseCustomFrame() const { |
| 343 // Constrained windows always use the custom frame - they just have a |
| 344 // different set of bitmaps. |
| 345 return true; |
| 346 } |
| 347 |
| 348 gfx::Rect ConstrainedWindowFrameView::GetWindowBoundsForClientBounds( |
| 349 const gfx::Rect& client_bounds) const { |
| 340 int top_height = NonClientTopBorderHeight(); | 350 int top_height = NonClientTopBorderHeight(); |
| 341 int border_thickness = NonClientBorderThickness(); | 351 int border_thickness = NonClientBorderThickness(); |
| 342 return gfx::Rect(border_thickness, top_height, | 352 return gfx::Rect(std::max(0, client_bounds.x() - border_thickness), |
| 343 std::max(0, width - (2 * border_thickness)), | 353 std::max(0, client_bounds.y() - top_height), |
| 344 std::max(0, height - top_height - border_thickness)); | 354 client_bounds.width() + (2 * border_thickness), |
| 355 client_bounds.height() + top_height + border_thickness); |
| 345 } | 356 } |
| 346 | 357 |
| 347 gfx::Size ConstrainedWindowNonClientView::CalculateWindowSizeForClientSize( | 358 gfx::Point ConstrainedWindowFrameView::GetSystemMenuPoint() const { |
| 348 int width, | |
| 349 int height) const { | |
| 350 int border_thickness = NonClientBorderThickness(); | |
| 351 return gfx::Size(width + (2 * border_thickness), | |
| 352 height + NonClientTopBorderHeight() + border_thickness); | |
| 353 } | |
| 354 | |
| 355 gfx::Point ConstrainedWindowNonClientView::GetSystemMenuPoint() const { | |
| 356 // Doesn't really matter, since we never show system menus on constrained | 359 // Doesn't really matter, since we never show system menus on constrained |
| 357 // windows... | 360 // windows... |
| 358 gfx::Point system_menu_point(FrameBorderThickness(), | 361 gfx::Point system_menu_point(FrameBorderThickness(), |
| 359 NonClientTopBorderHeight()); | 362 NonClientTopBorderHeight()); |
| 360 ConvertPointToScreen(this, &system_menu_point); | 363 ConvertPointToScreen(this, &system_menu_point); |
| 361 return system_menu_point; | 364 return system_menu_point; |
| 362 } | 365 } |
| 363 | 366 |
| 364 int ConstrainedWindowNonClientView::NonClientHitTest(const gfx::Point& point) { | 367 int ConstrainedWindowFrameView::NonClientHitTest(const gfx::Point& point) { |
| 365 if (!bounds().Contains(point)) | 368 if (!bounds().Contains(point)) |
| 366 return HTNOWHERE; | 369 return HTNOWHERE; |
| 367 | 370 |
| 368 int frame_component = container_->client_view()->NonClientHitTest(point); | 371 int frame_component = container_->client_view()->NonClientHitTest(point); |
| 369 if (frame_component != HTNOWHERE) | 372 if (frame_component != HTNOWHERE) |
| 370 return frame_component; | 373 return frame_component; |
| 371 | 374 |
| 372 // Then see if the point is within any of the window controls. | 375 // Then see if the point is within any of the window controls. |
| 373 if (close_button_->GetBounds(APPLY_MIRRORING_TRANSFORMATION).Contains(point)) | 376 if (close_button_->GetBounds(APPLY_MIRRORING_TRANSFORMATION).Contains(point)) |
| 374 return HTCLOSE; | 377 return HTCLOSE; |
| 375 | 378 |
| 376 int window_component = GetHTComponentForFrame(point, FrameBorderThickness(), | 379 int window_component = GetHTComponentForFrame(point, FrameBorderThickness(), |
| 377 NonClientBorderThickness(), kResizeAreaCornerSize, kResizeAreaCornerSize, | 380 NonClientBorderThickness(), kResizeAreaCornerSize, kResizeAreaCornerSize, |
| 378 container_->window_delegate()->CanResize()); | 381 container_->window_delegate()->CanResize()); |
| 379 // Fall back to the caption if no other component matches. | 382 // Fall back to the caption if no other component matches. |
| 380 return (window_component == HTNOWHERE) ? HTCAPTION : window_component; | 383 return (window_component == HTNOWHERE) ? HTCAPTION : window_component; |
| 381 } | 384 } |
| 382 | 385 |
| 383 void ConstrainedWindowNonClientView::GetWindowMask(const gfx::Size& size, | 386 void ConstrainedWindowFrameView::GetWindowMask(const gfx::Size& size, |
| 384 gfx::Path* window_mask) { | 387 gfx::Path* window_mask) { |
| 385 DCHECK(window_mask); | 388 DCHECK(window_mask); |
| 386 | 389 |
| 387 // Redefine the window visible region for the new size. | 390 // Redefine the window visible region for the new size. |
| 388 window_mask->moveTo(0, 3); | 391 window_mask->moveTo(0, 3); |
| 389 window_mask->lineTo(1, 2); | 392 window_mask->lineTo(1, 2); |
| 390 window_mask->lineTo(1, 1); | 393 window_mask->lineTo(1, 1); |
| 391 window_mask->lineTo(2, 1); | 394 window_mask->lineTo(2, 1); |
| 392 window_mask->lineTo(3, 0); | 395 window_mask->lineTo(3, 0); |
| 393 | 396 |
| 394 window_mask->lineTo(SkIntToScalar(size.width() - 3), 0); | 397 window_mask->lineTo(SkIntToScalar(size.width() - 3), 0); |
| 395 window_mask->lineTo(SkIntToScalar(size.width() - 2), 1); | 398 window_mask->lineTo(SkIntToScalar(size.width() - 2), 1); |
| 396 window_mask->lineTo(SkIntToScalar(size.width() - 1), 1); | 399 window_mask->lineTo(SkIntToScalar(size.width() - 1), 1); |
| 397 window_mask->lineTo(SkIntToScalar(size.width() - 1), 2); | 400 window_mask->lineTo(SkIntToScalar(size.width() - 1), 2); |
| 398 window_mask->lineTo(SkIntToScalar(size.width()), 3); | 401 window_mask->lineTo(SkIntToScalar(size.width()), 3); |
| 399 | 402 |
| 400 window_mask->lineTo(SkIntToScalar(size.width()), | 403 window_mask->lineTo(SkIntToScalar(size.width()), |
| 401 SkIntToScalar(size.height())); | 404 SkIntToScalar(size.height())); |
| 402 window_mask->lineTo(0, SkIntToScalar(size.height())); | 405 window_mask->lineTo(0, SkIntToScalar(size.height())); |
| 403 window_mask->close(); | 406 window_mask->close(); |
| 404 } | 407 } |
| 405 | 408 |
| 406 void ConstrainedWindowNonClientView::EnableClose(bool enable) { | 409 void ConstrainedWindowFrameView::EnableClose(bool enable) { |
| 407 close_button_->SetEnabled(enable); | 410 close_button_->SetEnabled(enable); |
| 408 } | 411 } |
| 409 | 412 |
| 410 //////////////////////////////////////////////////////////////////////////////// | 413 //////////////////////////////////////////////////////////////////////////////// |
| 411 // ConstrainedWindowNonClientView, views::View implementation: | 414 // ConstrainedWindowFrameView, views::View implementation: |
| 412 | 415 |
| 413 void ConstrainedWindowNonClientView::Paint(ChromeCanvas* canvas) { | 416 void ConstrainedWindowFrameView::Paint(ChromeCanvas* canvas) { |
| 414 PaintFrameBorder(canvas); | 417 PaintFrameBorder(canvas); |
| 415 PaintTitleBar(canvas); | 418 PaintTitleBar(canvas); |
| 416 PaintClientEdge(canvas); | 419 PaintClientEdge(canvas); |
| 417 } | 420 } |
| 418 | 421 |
| 419 void ConstrainedWindowNonClientView::Layout() { | 422 void ConstrainedWindowFrameView::Layout() { |
| 420 LayoutWindowControls(); | 423 LayoutWindowControls(); |
| 421 LayoutTitleBar(); | 424 LayoutTitleBar(); |
| 422 LayoutClientView(); | 425 LayoutClientView(); |
| 423 } | 426 } |
| 424 | 427 |
| 425 void ConstrainedWindowNonClientView::ViewHierarchyChanged(bool is_add, | 428 void ConstrainedWindowFrameView::ThemeChanged() { |
| 426 View *parent, | 429 InitWindowResources(); |
| 427 View *child) { | |
| 428 // Add our Client View as we are added to the Container so that if we are | |
| 429 // subsequently resized all the parent-child relationships are established. | |
| 430 if (is_add && GetWidget() && child == this) | |
| 431 AddChildView(container_->client_view()); | |
| 432 } | 430 } |
| 433 | 431 |
| 434 //////////////////////////////////////////////////////////////////////////////// | 432 //////////////////////////////////////////////////////////////////////////////// |
| 435 // ConstrainedWindowNonClientView, views::BaseButton::Button | 433 // ConstrainedWindowFrameView, views::BaseButton::Button |
| 436 // implementation: | 434 // implementation: |
| 437 | 435 |
| 438 void ConstrainedWindowNonClientView::ButtonPressed(views::BaseButton* sender) { | 436 void ConstrainedWindowFrameView::ButtonPressed(views::BaseButton* sender) { |
| 439 if (sender == close_button_) | 437 if (sender == close_button_) |
| 440 container_->ExecuteSystemMenuCommand(SC_CLOSE); | 438 container_->ExecuteSystemMenuCommand(SC_CLOSE); |
| 441 } | 439 } |
| 442 | 440 |
| 443 //////////////////////////////////////////////////////////////////////////////// | 441 //////////////////////////////////////////////////////////////////////////////// |
| 444 // ConstrainedWindowNonClientView, private: | 442 // ConstrainedWindowFrameView, private: |
| 445 | 443 |
| 446 int ConstrainedWindowNonClientView::FrameBorderThickness() const { | 444 int ConstrainedWindowFrameView::FrameBorderThickness() const { |
| 447 return kFrameBorderThickness; | 445 return kFrameBorderThickness; |
| 448 } | 446 } |
| 449 | 447 |
| 450 int ConstrainedWindowNonClientView::NonClientBorderThickness() const { | 448 int ConstrainedWindowFrameView::NonClientBorderThickness() const { |
| 451 return FrameBorderThickness() + kClientEdgeThickness; | 449 return FrameBorderThickness() + kClientEdgeThickness; |
| 452 } | 450 } |
| 453 | 451 |
| 454 int ConstrainedWindowNonClientView::NonClientTopBorderHeight() const { | 452 int ConstrainedWindowFrameView::NonClientTopBorderHeight() const { |
| 455 int title_top_spacing, title_thickness; | 453 int title_top_spacing, title_thickness; |
| 456 return TitleCoordinates(&title_top_spacing, &title_thickness); | 454 return TitleCoordinates(&title_top_spacing, &title_thickness); |
| 457 } | 455 } |
| 458 | 456 |
| 459 int ConstrainedWindowNonClientView::TitleCoordinates( | 457 int ConstrainedWindowFrameView::TitleCoordinates( |
| 460 int* title_top_spacing, | 458 int* title_top_spacing, |
| 461 int* title_thickness) const { | 459 int* title_thickness) const { |
| 462 int frame_thickness = FrameBorderThickness(); | 460 int frame_thickness = FrameBorderThickness(); |
| 463 int min_titlebar_height = kTitlebarMinimumHeight + frame_thickness; | 461 int min_titlebar_height = kTitlebarMinimumHeight + frame_thickness; |
| 464 *title_top_spacing = frame_thickness + kTitleTopSpacing; | 462 *title_top_spacing = frame_thickness + kTitleTopSpacing; |
| 465 // The bottom spacing should be the same apparent height as the top spacing, | 463 // The bottom spacing should be the same apparent height as the top spacing, |
| 466 // plus have the client edge tacked on. | 464 // plus have the client edge tacked on. |
| 467 int title_bottom_spacing = *title_top_spacing + kClientEdgeThickness; | 465 int title_bottom_spacing = *title_top_spacing + kClientEdgeThickness; |
| 468 *title_thickness = std::max(title_font_.height(), | 466 *title_thickness = std::max(title_font_.height(), |
| 469 min_titlebar_height - *title_top_spacing - title_bottom_spacing); | 467 min_titlebar_height - *title_top_spacing - title_bottom_spacing); |
| 470 return *title_top_spacing + *title_thickness + title_bottom_spacing; | 468 return *title_top_spacing + *title_thickness + title_bottom_spacing; |
| 471 } | 469 } |
| 472 | 470 |
| 473 void ConstrainedWindowNonClientView::PaintFrameBorder(ChromeCanvas* canvas) { | 471 void ConstrainedWindowFrameView::PaintFrameBorder(ChromeCanvas* canvas) { |
| 474 SkBitmap* top_left_corner = resources_->GetPartBitmap(FRAME_TOP_LEFT_CORNER); | 472 SkBitmap* top_left_corner = resources_->GetPartBitmap(FRAME_TOP_LEFT_CORNER); |
| 475 SkBitmap* top_right_corner = | 473 SkBitmap* top_right_corner = |
| 476 resources_->GetPartBitmap(FRAME_TOP_RIGHT_CORNER); | 474 resources_->GetPartBitmap(FRAME_TOP_RIGHT_CORNER); |
| 477 SkBitmap* top_edge = resources_->GetPartBitmap(FRAME_TOP_EDGE); | 475 SkBitmap* top_edge = resources_->GetPartBitmap(FRAME_TOP_EDGE); |
| 478 SkBitmap* right_edge = resources_->GetPartBitmap(FRAME_RIGHT_EDGE); | 476 SkBitmap* right_edge = resources_->GetPartBitmap(FRAME_RIGHT_EDGE); |
| 479 SkBitmap* left_edge = resources_->GetPartBitmap(FRAME_LEFT_EDGE); | 477 SkBitmap* left_edge = resources_->GetPartBitmap(FRAME_LEFT_EDGE); |
| 480 SkBitmap* bottom_left_corner = | 478 SkBitmap* bottom_left_corner = |
| 481 resources_->GetPartBitmap(FRAME_BOTTOM_LEFT_CORNER); | 479 resources_->GetPartBitmap(FRAME_BOTTOM_LEFT_CORNER); |
| 482 SkBitmap* bottom_right_corner = | 480 SkBitmap* bottom_right_corner = |
| 483 resources_->GetPartBitmap(FRAME_BOTTOM_RIGHT_CORNER); | 481 resources_->GetPartBitmap(FRAME_BOTTOM_RIGHT_CORNER); |
| (...skipping 23 matching lines...) Expand all Loading... |
| 507 bottom_edge->height()); | 505 bottom_edge->height()); |
| 508 canvas->DrawBitmapInt(*bottom_left_corner, 0, | 506 canvas->DrawBitmapInt(*bottom_left_corner, 0, |
| 509 height() - bottom_left_corner->height()); | 507 height() - bottom_left_corner->height()); |
| 510 | 508 |
| 511 // Left. | 509 // Left. |
| 512 canvas->TileImageInt(*left_edge, 0, top_left_corner->height(), | 510 canvas->TileImageInt(*left_edge, 0, top_left_corner->height(), |
| 513 left_edge->width(), | 511 left_edge->width(), |
| 514 height() - top_left_corner->height() - bottom_left_corner->height()); | 512 height() - top_left_corner->height() - bottom_left_corner->height()); |
| 515 } | 513 } |
| 516 | 514 |
| 517 void ConstrainedWindowNonClientView::PaintTitleBar(ChromeCanvas* canvas) { | 515 void ConstrainedWindowFrameView::PaintTitleBar(ChromeCanvas* canvas) { |
| 518 canvas->DrawStringInt(container_->GetWindowTitle(), title_font_, | 516 canvas->DrawStringInt(container_->GetWindowTitle(), title_font_, |
| 519 GetTitleColor(), MirroredLeftPointForRect(title_bounds_), | 517 GetTitleColor(), MirroredLeftPointForRect(title_bounds_), |
| 520 title_bounds_.y(), title_bounds_.width(), title_bounds_.height()); | 518 title_bounds_.y(), title_bounds_.width(), title_bounds_.height()); |
| 521 } | 519 } |
| 522 | 520 |
| 523 void ConstrainedWindowNonClientView::PaintClientEdge(ChromeCanvas* canvas) { | 521 void ConstrainedWindowFrameView::PaintClientEdge(ChromeCanvas* canvas) { |
| 524 gfx::Rect client_edge_bounds(CalculateClientAreaBounds(width(), height())); | 522 gfx::Rect client_edge_bounds(CalculateClientAreaBounds(width(), height())); |
| 525 client_edge_bounds.Inset(-kClientEdgeThickness, -kClientEdgeThickness); | 523 client_edge_bounds.Inset(-kClientEdgeThickness, -kClientEdgeThickness); |
| 526 gfx::Rect frame_shadow_bounds(client_edge_bounds); | 524 gfx::Rect frame_shadow_bounds(client_edge_bounds); |
| 527 frame_shadow_bounds.Inset(-kFrameShadowThickness, -kFrameShadowThickness); | 525 frame_shadow_bounds.Inset(-kFrameShadowThickness, -kFrameShadowThickness); |
| 528 | 526 |
| 529 canvas->FillRectInt(kContentsBorderShadow, frame_shadow_bounds.x(), | 527 canvas->FillRectInt(kContentsBorderShadow, frame_shadow_bounds.x(), |
| 530 frame_shadow_bounds.y(), frame_shadow_bounds.width(), | 528 frame_shadow_bounds.y(), frame_shadow_bounds.width(), |
| 531 frame_shadow_bounds.height()); | 529 frame_shadow_bounds.height()); |
| 532 | 530 |
| 533 canvas->FillRectInt(kContentsBorderColor, client_edge_bounds.x(), | 531 canvas->FillRectInt(kContentsBorderColor, client_edge_bounds.x(), |
| 534 client_edge_bounds.y(), client_edge_bounds.width(), | 532 client_edge_bounds.y(), client_edge_bounds.width(), |
| 535 client_edge_bounds.height()); | 533 client_edge_bounds.height()); |
| 536 } | 534 } |
| 537 | 535 |
| 538 void ConstrainedWindowNonClientView::LayoutWindowControls() { | 536 void ConstrainedWindowFrameView::LayoutWindowControls() { |
| 539 gfx::Size close_button_size = close_button_->GetPreferredSize(); | 537 gfx::Size close_button_size = close_button_->GetPreferredSize(); |
| 540 close_button_->SetBounds( | 538 close_button_->SetBounds( |
| 541 width() - close_button_size.width() - FrameBorderThickness(), | 539 width() - close_button_size.width() - FrameBorderThickness(), |
| 542 kCaptionTopSpacing, close_button_size.width(), | 540 kCaptionTopSpacing, close_button_size.width(), |
| 543 close_button_size.height()); | 541 close_button_size.height()); |
| 544 } | 542 } |
| 545 | 543 |
| 546 void ConstrainedWindowNonClientView::LayoutTitleBar() { | 544 void ConstrainedWindowFrameView::LayoutTitleBar() { |
| 547 // Size the title. | 545 // Size the title. |
| 548 int title_x = FrameBorderThickness() + kIconLeftSpacing; | 546 int title_x = FrameBorderThickness() + kIconLeftSpacing; |
| 549 int title_top_spacing, title_thickness; | 547 int title_top_spacing, title_thickness; |
| 550 TitleCoordinates(&title_top_spacing, &title_thickness); | 548 TitleCoordinates(&title_top_spacing, &title_thickness); |
| 551 title_bounds_.SetRect(title_x, | 549 title_bounds_.SetRect(title_x, |
| 552 title_top_spacing + ((title_thickness - title_font_.height()) / 2), | 550 title_top_spacing + ((title_thickness - title_font_.height()) / 2), |
| 553 std::max(0, close_button_->x() - kTitleCaptionSpacing - title_x), | 551 std::max(0, close_button_->x() - kTitleCaptionSpacing - title_x), |
| 554 title_font_.height()); | 552 title_font_.height()); |
| 555 } | 553 } |
| 556 | 554 |
| 557 void ConstrainedWindowNonClientView::LayoutClientView() { | 555 void ConstrainedWindowFrameView::LayoutClientView() { |
| 558 container_->client_view()->SetBounds(CalculateClientAreaBounds(width(), | 556 client_view_bounds_ = CalculateClientAreaBounds(width(), height()); |
| 559 height())); | 557 } |
| 558 |
| 559 gfx::Rect ConstrainedWindowFrameView::CalculateClientAreaBounds( |
| 560 int width, |
| 561 int height) const { |
| 562 int top_height = NonClientTopBorderHeight(); |
| 563 int border_thickness = NonClientBorderThickness(); |
| 564 return gfx::Rect(border_thickness, top_height, |
| 565 std::max(0, width - (2 * border_thickness)), |
| 566 std::max(0, height - top_height - border_thickness)); |
| 567 } |
| 568 |
| 569 void ConstrainedWindowFrameView::InitWindowResources() { |
| 570 if (container_->owner()->profile()->IsOffTheRecord()) { |
| 571 resources_.reset(new OTRWindowResources); |
| 572 } else { |
| 573 if (win_util::ShouldUseVistaFrame()) { |
| 574 resources_.reset(new VistaWindowResources); |
| 575 } else { |
| 576 resources_.reset(new XPWindowResources); |
| 577 } |
| 578 } |
| 560 } | 579 } |
| 561 | 580 |
| 562 // static | 581 // static |
| 563 void ConstrainedWindowNonClientView::InitClass() { | 582 void ConstrainedWindowFrameView::InitClass() { |
| 564 static bool initialized = false; | 583 static bool initialized = false; |
| 565 if (!initialized) { | 584 if (!initialized) { |
| 566 title_font_ = win_util::GetWindowTitleFont(); | 585 title_font_ = win_util::GetWindowTitleFont(); |
| 567 | 586 |
| 568 initialized = true; | 587 initialized = true; |
| 569 } | 588 } |
| 570 } | 589 } |
| 571 | 590 |
| 572 //////////////////////////////////////////////////////////////////////////////// | 591 //////////////////////////////////////////////////////////////////////////////// |
| 573 // ConstrainedWindowImpl, public: | 592 // ConstrainedWindowImpl, public: |
| 574 | 593 |
| 575 // The space (in pixels) between minimized pop-ups stacked horizontally and | 594 // The space (in pixels) between minimized pop-ups stacked horizontally and |
| 576 // vertically. | 595 // vertically. |
| 577 static const int kPopupRepositionOffset = 5; | 596 static const int kPopupRepositionOffset = 5; |
| 578 static const int kConstrainedWindowEdgePadding = 10; | 597 static const int kConstrainedWindowEdgePadding = 10; |
| 579 | 598 |
| 580 ConstrainedWindowImpl::~ConstrainedWindowImpl() { | 599 ConstrainedWindowImpl::~ConstrainedWindowImpl() { |
| 581 } | 600 } |
| 582 | 601 |
| 583 //////////////////////////////////////////////////////////////////////////////// | 602 //////////////////////////////////////////////////////////////////////////////// |
| 584 // ConstrainedWindowImpl, ConstrainedWindow implementation: | 603 // ConstrainedWindowImpl, ConstrainedWindow implementation: |
| 585 | 604 |
| 586 ConstrainedWindowNonClientView* ConstrainedWindowImpl::non_client_view() { | 605 views::NonClientFrameView* ConstrainedWindowImpl::CreateFrameViewForWindow() { |
| 587 return static_cast<ConstrainedWindowNonClientView*>(non_client_view_); | 606 return new ConstrainedWindowFrameView(this); |
| 588 } | 607 } |
| 589 | 608 |
| 590 void ConstrainedWindowImpl::UpdateWindowTitle() { | 609 void ConstrainedWindowImpl::UpdateWindowTitle() { |
| 591 UpdateUI(TabContents::INVALIDATE_TITLE); | 610 UpdateUI(TabContents::INVALIDATE_TITLE); |
| 592 } | 611 } |
| 593 | 612 |
| 594 void ConstrainedWindowImpl::ActivateConstrainedWindow() { | 613 void ConstrainedWindowImpl::ActivateConstrainedWindow() { |
| 595 // Other pop-ups are simply moved to the front of the z-order. | 614 // Other pop-ups are simply moved to the front of the z-order. |
| 596 SetWindowPos(HWND_TOP, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE | SWP_SHOWWINDOW); | 615 SetWindowPos(HWND_TOP, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE | SWP_SHOWWINDOW); |
| 597 | 616 |
| (...skipping 47 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 645 const gfx::Rect& ConstrainedWindowImpl::GetCurrentBounds() const { | 664 const gfx::Rect& ConstrainedWindowImpl::GetCurrentBounds() const { |
| 646 return current_bounds_; | 665 return current_bounds_; |
| 647 } | 666 } |
| 648 | 667 |
| 649 //////////////////////////////////////////////////////////////////////////////// | 668 //////////////////////////////////////////////////////////////////////////////// |
| 650 // ConstrainedWindowImpl, private: | 669 // ConstrainedWindowImpl, private: |
| 651 | 670 |
| 652 ConstrainedWindowImpl::ConstrainedWindowImpl( | 671 ConstrainedWindowImpl::ConstrainedWindowImpl( |
| 653 TabContents* owner, | 672 TabContents* owner, |
| 654 views::WindowDelegate* window_delegate) | 673 views::WindowDelegate* window_delegate) |
| 655 : CustomFrameWindow(window_delegate, | 674 : Window(window_delegate), |
| 656 new ConstrainedWindowNonClientView(this, owner)) { | 675 owner_(owner) { |
| 657 Init(owner); | 676 non_client_view_->SetFrameView(CreateFrameViewForWindow()); |
| 677 Init(); |
| 658 } | 678 } |
| 659 | 679 |
| 660 void ConstrainedWindowImpl::Init(TabContents* owner) { | 680 void ConstrainedWindowImpl::Init() { |
| 661 owner_ = owner; | |
| 662 focus_restoration_disabled_ = false; | 681 focus_restoration_disabled_ = false; |
| 663 set_window_style(WS_CHILD | WS_CLIPSIBLINGS | WS_CLIPCHILDREN | WS_CAPTION | | 682 set_window_style(WS_CHILD | WS_CLIPSIBLINGS | WS_CLIPCHILDREN | WS_CAPTION | |
| 664 WS_THICKFRAME | WS_SYSMENU); | 683 WS_THICKFRAME | WS_SYSMENU); |
| 665 set_focus_on_creation(false); | 684 set_focus_on_creation(false); |
| 666 } | 685 } |
| 667 | 686 |
| 668 void ConstrainedWindowImpl::InitAsDialog(const gfx::Rect& initial_bounds) { | 687 void ConstrainedWindowImpl::InitAsDialog(const gfx::Rect& initial_bounds) { |
| 669 CustomFrameWindow::Init(owner_->GetNativeView(), initial_bounds); | 688 Window::Init(owner_->GetNativeView(), initial_bounds); |
| 670 ActivateConstrainedWindow(); | 689 ActivateConstrainedWindow(); |
| 671 } | 690 } |
| 672 | 691 |
| 673 void ConstrainedWindowImpl::UpdateUI(unsigned int changed_flags) { | 692 void ConstrainedWindowImpl::UpdateUI(unsigned int changed_flags) { |
| 674 if (changed_flags & TabContents::INVALIDATE_TITLE) | 693 if (changed_flags & TabContents::INVALIDATE_TITLE) |
| 675 non_client_view()->UpdateWindowTitle(); | 694 UpdateWindowTitle(); |
| 676 } | 695 } |
| 677 | 696 |
| 678 //////////////////////////////////////////////////////////////////////////////// | 697 //////////////////////////////////////////////////////////////////////////////// |
| 679 // ConstrainedWindowImpl, views::WidgetWin overrides: | 698 // ConstrainedWindowImpl, views::WidgetWin overrides: |
| 680 | 699 |
| 681 void ConstrainedWindowImpl::OnDestroy() { | 700 void ConstrainedWindowImpl::OnDestroy() { |
| 682 // We do this here, rather than |Close|, since the window may be destroyed in | 701 // We do this here, rather than |Close|, since the window may be destroyed in |
| 683 // a way other than by some other component calling Close, e.g. by the native | 702 // a way other than by some other component calling Close, e.g. by the native |
| 684 // window hierarchy closing. We are guaranteed to receive a WM_DESTROY | 703 // window hierarchy closing. We are guaranteed to receive a WM_DESTROY |
| 685 // message regardless of how the window is closed. | 704 // message regardless of how the window is closed. |
| (...skipping 53 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 739 ConstrainedWindow* ConstrainedWindow::CreateConstrainedDialog( | 758 ConstrainedWindow* ConstrainedWindow::CreateConstrainedDialog( |
| 740 TabContents* parent, | 759 TabContents* parent, |
| 741 const gfx::Rect& initial_bounds, | 760 const gfx::Rect& initial_bounds, |
| 742 views::View* contents_view, | 761 views::View* contents_view, |
| 743 views::WindowDelegate* window_delegate) { | 762 views::WindowDelegate* window_delegate) { |
| 744 ConstrainedWindowImpl* window = new ConstrainedWindowImpl(parent, | 763 ConstrainedWindowImpl* window = new ConstrainedWindowImpl(parent, |
| 745 window_delegate); | 764 window_delegate); |
| 746 window->InitAsDialog(initial_bounds); | 765 window->InitAsDialog(initial_bounds); |
| 747 return window; | 766 return window; |
| 748 } | 767 } |
| OLD | NEW |