| OLD | NEW |
| 1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2011 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/autocomplete/autocomplete_edit_view_win.h" | 5 #include "chrome/browser/autocomplete/autocomplete_edit_view_win.h" |
| 6 | 6 |
| 7 #include <algorithm> | 7 #include <algorithm> |
| 8 #include <locale> | 8 #include <locale> |
| 9 #include <string> | 9 #include <string> |
| 10 | 10 |
| (...skipping 339 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 350 // Returns a lazily initialized property bag accessor for saving our state in a | 350 // Returns a lazily initialized property bag accessor for saving our state in a |
| 351 // TabContents. | 351 // TabContents. |
| 352 PropertyAccessor<AutocompleteEditState>* GetStateAccessor() { | 352 PropertyAccessor<AutocompleteEditState>* GetStateAccessor() { |
| 353 static PropertyAccessor<AutocompleteEditState> state; | 353 static PropertyAccessor<AutocompleteEditState> state; |
| 354 return &state; | 354 return &state; |
| 355 } | 355 } |
| 356 | 356 |
| 357 class PaintPatcher { | 357 class PaintPatcher { |
| 358 public: | 358 public: |
| 359 PaintPatcher() : refcount_(0) { } | 359 PaintPatcher() : refcount_(0) { } |
| 360 ~PaintPatcher() { DCHECK(refcount_ == 0); } | 360 ~PaintPatcher() { DCHECK_EQ(refcount_, 0); } |
| 361 | 361 |
| 362 void RefPatch() { | 362 void RefPatch() { |
| 363 if (refcount_ == 0) { | 363 if (refcount_ == 0) { |
| 364 DCHECK(!begin_paint_.is_patched()); | 364 DCHECK(!begin_paint_.is_patched()); |
| 365 DCHECK(!end_paint_.is_patched()); | 365 DCHECK(!end_paint_.is_patched()); |
| 366 begin_paint_.Patch(L"riched20.dll", "user32.dll", "BeginPaint", | 366 begin_paint_.Patch(L"riched20.dll", "user32.dll", "BeginPaint", |
| 367 &BeginPaintIntercept); | 367 &BeginPaintIntercept); |
| 368 end_paint_.Patch(L"riched20.dll", "user32.dll", "EndPaint", | 368 end_paint_.Patch(L"riched20.dll", "user32.dll", "EndPaint", |
| 369 &EndPaintIntercept); | 369 &EndPaintIntercept); |
| 370 } | 370 } |
| (...skipping 681 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1052 } | 1052 } |
| 1053 | 1053 |
| 1054 bool AutocompleteEditViewWin::IsItemForCommandIdDynamic(int command_id) const { | 1054 bool AutocompleteEditViewWin::IsItemForCommandIdDynamic(int command_id) const { |
| 1055 // No need to change the default IDS_PASTE_AND_GO label unless this is a | 1055 // No need to change the default IDS_PASTE_AND_GO label unless this is a |
| 1056 // search. | 1056 // search. |
| 1057 return command_id == IDS_PASTE_AND_GO; | 1057 return command_id == IDS_PASTE_AND_GO; |
| 1058 } | 1058 } |
| 1059 | 1059 |
| 1060 string16 AutocompleteEditViewWin::GetLabelForCommandId( | 1060 string16 AutocompleteEditViewWin::GetLabelForCommandId( |
| 1061 int command_id) const { | 1061 int command_id) const { |
| 1062 DCHECK(command_id == IDS_PASTE_AND_GO); | 1062 DCHECK_EQ(command_id, IDS_PASTE_AND_GO); |
| 1063 return l10n_util::GetStringUTF16(model_->is_paste_and_search() ? | 1063 return l10n_util::GetStringUTF16(model_->is_paste_and_search() ? |
| 1064 IDS_PASTE_AND_SEARCH : IDS_PASTE_AND_GO); | 1064 IDS_PASTE_AND_SEARCH : IDS_PASTE_AND_GO); |
| 1065 } | 1065 } |
| 1066 | 1066 |
| 1067 void AutocompleteEditViewWin::ExecuteCommand(int command_id) { | 1067 void AutocompleteEditViewWin::ExecuteCommand(int command_id) { |
| 1068 ScopedFreeze freeze(this, GetTextObjectModel()); | 1068 ScopedFreeze freeze(this, GetTextObjectModel()); |
| 1069 if (command_id == IDS_PASTE_AND_GO) { | 1069 if (command_id == IDS_PASTE_AND_GO) { |
| 1070 // This case is separate from the switch() below since we don't want to wrap | 1070 // This case is separate from the switch() below since we don't want to wrap |
| 1071 // it in OnBefore/AfterPossibleChange() calls. | 1071 // it in OnBefore/AfterPossibleChange() calls. |
| 1072 model_->PasteAndGo(); | 1072 model_->PasteAndGo(); |
| (...skipping 958 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2031 | 2031 |
| 2032 void AutocompleteEditViewWin::GetSelection(CHARRANGE& sel) const { | 2032 void AutocompleteEditViewWin::GetSelection(CHARRANGE& sel) const { |
| 2033 GetSel(sel); | 2033 GetSel(sel); |
| 2034 | 2034 |
| 2035 // See if we need to reverse the direction of the selection. | 2035 // See if we need to reverse the direction of the selection. |
| 2036 ITextDocument* const text_object_model = GetTextObjectModel(); | 2036 ITextDocument* const text_object_model = GetTextObjectModel(); |
| 2037 if (!text_object_model) | 2037 if (!text_object_model) |
| 2038 return; | 2038 return; |
| 2039 ScopedComPtr<ITextSelection> selection; | 2039 ScopedComPtr<ITextSelection> selection; |
| 2040 const HRESULT hr = text_object_model->GetSelection(selection.Receive()); | 2040 const HRESULT hr = text_object_model->GetSelection(selection.Receive()); |
| 2041 DCHECK(hr == S_OK); | 2041 DCHECK_EQ(hr, S_OK); |
| 2042 long flags; | 2042 long flags; |
| 2043 selection->GetFlags(&flags); | 2043 selection->GetFlags(&flags); |
| 2044 if (flags & tomSelStartActive) | 2044 if (flags & tomSelStartActive) |
| 2045 std::swap(sel.cpMin, sel.cpMax); | 2045 std::swap(sel.cpMin, sel.cpMax); |
| 2046 } | 2046 } |
| 2047 | 2047 |
| 2048 string16 AutocompleteEditViewWin::GetSelectedText() const { | 2048 string16 AutocompleteEditViewWin::GetSelectedText() const { |
| 2049 // Figure out the length of the selection. | 2049 // Figure out the length of the selection. |
| 2050 CHARRANGE sel; | 2050 CHARRANGE sel; |
| 2051 GetSel(sel); | 2051 GetSel(sel); |
| 2052 | 2052 |
| 2053 // Grab the selected text. | 2053 // Grab the selected text. |
| 2054 string16 str; | 2054 string16 str; |
| 2055 GetSelText(WriteInto(&str, sel.cpMax - sel.cpMin + 1)); | 2055 GetSelText(WriteInto(&str, sel.cpMax - sel.cpMin + 1)); |
| 2056 return str; | 2056 return str; |
| 2057 } | 2057 } |
| 2058 | 2058 |
| 2059 void AutocompleteEditViewWin::SetSelection(LONG start, LONG end) { | 2059 void AutocompleteEditViewWin::SetSelection(LONG start, LONG end) { |
| 2060 SetSel(start, end); | 2060 SetSel(start, end); |
| 2061 | 2061 |
| 2062 if (start <= end) | 2062 if (start <= end) |
| 2063 return; | 2063 return; |
| 2064 | 2064 |
| 2065 // We need to reverse the direction of the selection. | 2065 // We need to reverse the direction of the selection. |
| 2066 ITextDocument* const text_object_model = GetTextObjectModel(); | 2066 ITextDocument* const text_object_model = GetTextObjectModel(); |
| 2067 if (!text_object_model) | 2067 if (!text_object_model) |
| 2068 return; | 2068 return; |
| 2069 ScopedComPtr<ITextSelection> selection; | 2069 ScopedComPtr<ITextSelection> selection; |
| 2070 const HRESULT hr = text_object_model->GetSelection(selection.Receive()); | 2070 const HRESULT hr = text_object_model->GetSelection(selection.Receive()); |
| 2071 DCHECK(hr == S_OK); | 2071 DCHECK_EQ(hr, S_OK); |
| 2072 selection->SetFlags(tomSelStartActive); | 2072 selection->SetFlags(tomSelStartActive); |
| 2073 } | 2073 } |
| 2074 | 2074 |
| 2075 void AutocompleteEditViewWin::PlaceCaretAt(string16::size_type pos) { | 2075 void AutocompleteEditViewWin::PlaceCaretAt(string16::size_type pos) { |
| 2076 SetSelection(static_cast<LONG>(pos), static_cast<LONG>(pos)); | 2076 SetSelection(static_cast<LONG>(pos), static_cast<LONG>(pos)); |
| 2077 } | 2077 } |
| 2078 | 2078 |
| 2079 bool AutocompleteEditViewWin::IsSelectAllForRange(const CHARRANGE& sel) const { | 2079 bool AutocompleteEditViewWin::IsSelectAllForRange(const CHARRANGE& sel) const { |
| 2080 const int text_length = GetTextLength(); | 2080 const int text_length = GetTextLength(); |
| 2081 return ((sel.cpMin == 0) && (sel.cpMax >= text_length)) || | 2081 return ((sel.cpMin == 0) && (sel.cpMax >= text_length)) || |
| (...skipping 215 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2297 | 2297 |
| 2298 // Now copy what we drew to the target HDC. | 2298 // Now copy what we drew to the target HDC. |
| 2299 canvas.getTopPlatformDevice().drawToHDC(hdc, | 2299 canvas.getTopPlatformDevice().drawToHDC(hdc, |
| 2300 scheme_rect.left + canvas_paint_clip_rect.left - canvas_clip_rect.left, | 2300 scheme_rect.left + canvas_paint_clip_rect.left - canvas_clip_rect.left, |
| 2301 std::max(scheme_rect.top, client_rect.top) + canvas_paint_clip_rect.top - | 2301 std::max(scheme_rect.top, client_rect.top) + canvas_paint_clip_rect.top - |
| 2302 canvas_clip_rect.top, &canvas_paint_clip_rect); | 2302 canvas_clip_rect.top, &canvas_paint_clip_rect); |
| 2303 } | 2303 } |
| 2304 | 2304 |
| 2305 void AutocompleteEditViewWin::DrawDropHighlight( | 2305 void AutocompleteEditViewWin::DrawDropHighlight( |
| 2306 HDC hdc, const CRect& client_rect, const CRect& paint_clip_rect) { | 2306 HDC hdc, const CRect& client_rect, const CRect& paint_clip_rect) { |
| 2307 DCHECK(drop_highlight_position_ != -1); | 2307 DCHECK_NE(drop_highlight_position_, -1); |
| 2308 | 2308 |
| 2309 const int highlight_y = client_rect.top + font_y_adjustment_; | 2309 const int highlight_y = client_rect.top + font_y_adjustment_; |
| 2310 const int highlight_x = PosFromChar(drop_highlight_position_).x - 1; | 2310 const int highlight_x = PosFromChar(drop_highlight_position_).x - 1; |
| 2311 const CRect highlight_rect(highlight_x, | 2311 const CRect highlight_rect(highlight_x, |
| 2312 highlight_y, | 2312 highlight_y, |
| 2313 highlight_x + 1, | 2313 highlight_x + 1, |
| 2314 highlight_y + font_.GetHeight()); | 2314 highlight_y + font_.GetHeight()); |
| 2315 | 2315 |
| 2316 // Clip the highlight to the region being painted. | 2316 // Clip the highlight to the region being painted. |
| 2317 CRect clip_rect; | 2317 CRect clip_rect; |
| (...skipping 262 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2580 // PosFromChar(i) might return 0 when i is greater than 1. | 2580 // PosFromChar(i) might return 0 when i is greater than 1. |
| 2581 return font_.GetStringWidth(text) + GetHorizontalMargin(); | 2581 return font_.GetStringWidth(text) + GetHorizontalMargin(); |
| 2582 } | 2582 } |
| 2583 | 2583 |
| 2584 bool AutocompleteEditViewWin::IsCaretAtEnd() const { | 2584 bool AutocompleteEditViewWin::IsCaretAtEnd() const { |
| 2585 long length = GetTextLength(); | 2585 long length = GetTextLength(); |
| 2586 CHARRANGE sel; | 2586 CHARRANGE sel; |
| 2587 GetSelection(sel); | 2587 GetSelection(sel); |
| 2588 return sel.cpMin == sel.cpMax && sel.cpMin == length; | 2588 return sel.cpMin == sel.cpMax && sel.cpMin == length; |
| 2589 } | 2589 } |
| OLD | NEW |