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/views/label.h" | 5 #include "chrome/views/label.h" |
6 | 6 |
7 #include <math.h> | 7 #include <math.h> |
8 | 8 |
9 #include "base/logging.h" | 9 #include "base/logging.h" |
10 #include "base/string_util.h" | 10 #include "base/string_util.h" |
(...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
43 SetText(text); | 43 SetText(text); |
44 url_set_ = false; | 44 url_set_ = false; |
45 color_ = kEnabledColor; | 45 color_ = kEnabledColor; |
46 horiz_alignment_ = ALIGN_CENTER; | 46 horiz_alignment_ = ALIGN_CENTER; |
47 is_multi_line_ = false; | 47 is_multi_line_ = false; |
48 } | 48 } |
49 | 49 |
50 Label::~Label() { | 50 Label::~Label() { |
51 } | 51 } |
52 | 52 |
53 void Label::GetPreferredSize(CSize* out) { | 53 gfx::Size Label::GetPreferredSize() { |
54 DCHECK(out); | 54 gfx::Size prefsize; |
55 if (is_multi_line_) { | 55 if (is_multi_line_) { |
56 ChromeCanvas cc(0, 0, true); | 56 ChromeCanvas cc(0, 0, true); |
57 int w = width(), h = 0; | 57 int w = width(), h = 0; |
58 cc.SizeStringInt(text_, font_, &w, &h, ComputeMultiLineFlags()); | 58 cc.SizeStringInt(text_, font_, &w, &h, ComputeMultiLineFlags()); |
59 out->cx = w; | 59 prefsize.SetSize(w, h); |
60 out->cy = h; | |
61 } else { | 60 } else { |
62 GetTextSize(out); | 61 prefsize = GetTextSize(); |
63 } | 62 } |
64 | 63 |
65 gfx::Insets insets = GetInsets(); | 64 gfx::Insets insets = GetInsets(); |
66 out->cx += insets.left() + insets.right(); | 65 prefsize.Enlarge(insets.left() + insets.right(), |
67 out->cy += insets.top() + insets.bottom(); | 66 insets.top() + insets.bottom()); |
| 67 return prefsize; |
68 } | 68 } |
69 | 69 |
70 int Label::ComputeMultiLineFlags() { | 70 int Label::ComputeMultiLineFlags() { |
71 int flags = ChromeCanvas::MULTI_LINE; | 71 int flags = ChromeCanvas::MULTI_LINE; |
72 switch (horiz_alignment_) { | 72 switch (horiz_alignment_) { |
73 case ALIGN_LEFT: | 73 case ALIGN_LEFT: |
74 flags |= ChromeCanvas::TEXT_ALIGN_LEFT; | 74 flags |= ChromeCanvas::TEXT_ALIGN_LEFT; |
75 break; | 75 break; |
76 case ALIGN_CENTER: | 76 case ALIGN_CENTER: |
77 flags |= ChromeCanvas::TEXT_ALIGN_CENTER; | 77 flags |= ChromeCanvas::TEXT_ALIGN_CENTER; |
(...skipping 94 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
172 return text_; | 172 return text_; |
173 } | 173 } |
174 | 174 |
175 const GURL Label::GetURL() const { | 175 const GURL Label::GetURL() const { |
176 if (url_set_) | 176 if (url_set_) |
177 return url_; | 177 return url_; |
178 else | 178 else |
179 return GURL(text_); | 179 return GURL(text_); |
180 } | 180 } |
181 | 181 |
182 void Label::GetTextSize(CSize* out) { | 182 gfx::Size Label::GetTextSize() { |
183 if (!text_size_valid_) { | 183 if (!text_size_valid_) { |
184 text_size_.cx = font_.GetStringWidth(text_); | 184 text_size_.SetSize(font_.GetStringWidth(text_), font_.height()); |
185 text_size_.cy = font_.height(); | |
186 text_size_valid_ = true; | 185 text_size_valid_ = true; |
187 } | 186 } |
188 | 187 |
189 if (text_size_valid_) { | 188 if (text_size_valid_) |
190 *out = text_size_; | 189 return text_size_; |
191 } else { | 190 return gfx::Size(); |
192 out->cx = out->cy = 0; | |
193 } | |
194 } | 191 } |
195 | 192 |
196 int Label::GetHeightForWidth(int w) { | 193 int Label::GetHeightForWidth(int w) { |
197 if (is_multi_line_) { | 194 if (is_multi_line_) { |
198 int h = 0; | 195 int h = 0; |
199 ChromeCanvas cc(0, 0, true); | 196 ChromeCanvas cc(0, 0, true); |
200 cc.SizeStringInt(text_, font_, &w, &h, ComputeMultiLineFlags()); | 197 cc.SizeStringInt(text_, font_, &w, &h, ComputeMultiLineFlags()); |
201 return h; | 198 return h; |
202 } | 199 } |
203 | 200 |
(...skipping 103 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
307 | 304 |
308 void Label::SetContainsMouse(bool contains_mouse) { | 305 void Label::SetContainsMouse(bool contains_mouse) { |
309 if (contains_mouse_ == contains_mouse) | 306 if (contains_mouse_ == contains_mouse) |
310 return; | 307 return; |
311 contains_mouse_ = contains_mouse; | 308 contains_mouse_ = contains_mouse; |
312 if (GetMouseOverBackground()) | 309 if (GetMouseOverBackground()) |
313 SchedulePaint(); | 310 SchedulePaint(); |
314 } | 311 } |
315 | 312 |
316 gfx::Rect Label::GetTextBounds() { | 313 gfx::Rect Label::GetTextBounds() { |
317 CSize text_size; | 314 gfx::Size text_size = GetTextSize(); |
318 GetTextSize(&text_size); | |
319 gfx::Insets insets = GetInsets(); | 315 gfx::Insets insets = GetInsets(); |
320 int avail_width = width() - insets.left() - insets.right(); | 316 int avail_width = width() - insets.left() - insets.right(); |
321 // Respect the size set by the owner view | 317 // Respect the size set by the owner view |
322 text_size.cx = std::min(avail_width, static_cast<int>(text_size.cx)); | 318 text_size.set_width(std::min(avail_width, text_size.width())); |
323 | 319 |
324 int text_y = insets.top() + | 320 int text_y = insets.top() + |
325 (height() - text_size.cy - insets.top() - insets.bottom()) / 2; | 321 (height() - text_size.height() - insets.top() - insets.bottom()) / 2; |
326 int text_x; | 322 int text_x; |
327 switch (horiz_alignment_) { | 323 switch (horiz_alignment_) { |
328 case ALIGN_LEFT: | 324 case ALIGN_LEFT: |
329 text_x = insets.left(); | 325 text_x = insets.left(); |
330 break; | 326 break; |
331 case ALIGN_CENTER: | 327 case ALIGN_CENTER: |
332 // We put any extra margin pixel on the left rather than the right, since | 328 // We put any extra margin pixel on the left rather than the right, since |
333 // GetTextExtentPoint32() can report a value one too large on the right. | 329 // GetTextExtentPoint32() can report a value one too large on the right. |
334 text_x = insets.left() + (avail_width + 1 - text_size.cx) / 2; | 330 text_x = insets.left() + (avail_width + 1 - text_size.width()) / 2; |
335 break; | 331 break; |
336 case ALIGN_RIGHT: | 332 case ALIGN_RIGHT: |
337 text_x = width() - insets.right() - text_size.cx; | 333 text_x = width() - insets.right() - text_size.width(); |
338 break; | 334 break; |
339 } | 335 } |
340 return gfx::Rect(text_x, text_y, text_size.cx, text_size.cy); | 336 return gfx::Rect(text_x, text_y, text_size.width(), text_size.height()); |
341 } | 337 } |
342 | 338 |
343 void Label::SizeToFit(int max_width) { | 339 void Label::SizeToFit(int max_width) { |
344 DCHECK(is_multi_line_); | 340 DCHECK(is_multi_line_); |
345 | 341 |
346 std::vector<std::wstring> lines; | 342 std::vector<std::wstring> lines; |
347 SplitString(text_, L'\n', &lines); | 343 SplitString(text_, L'\n', &lines); |
348 | 344 |
349 int label_width = 0; | 345 int label_width = 0; |
350 for (std::vector<std::wstring>::const_iterator iter = lines.begin(); | 346 for (std::vector<std::wstring>::const_iterator iter = lines.begin(); |
(...skipping 23 matching lines...) Expand all Loading... |
374 | 370 |
375 bool Label::GetAccessibleState(VARIANT* state) { | 371 bool Label::GetAccessibleState(VARIANT* state) { |
376 DCHECK(state); | 372 DCHECK(state); |
377 | 373 |
378 state->lVal |= STATE_SYSTEM_READONLY; | 374 state->lVal |= STATE_SYSTEM_READONLY; |
379 return true; | 375 return true; |
380 } | 376 } |
381 | 377 |
382 } | 378 } |
383 | 379 |
OLD | NEW |