| OLD | NEW |
| (Empty) |
| 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 | |
| 3 // found in the LICENSE file. | |
| 4 | |
| 5 #ifndef CHROME_BROWSER_AUTOCOMPLETE_AUTOCOMPLETE_POPUP_VIEW_WIN_H_ | |
| 6 #define CHROME_BROWSER_AUTOCOMPLETE_AUTOCOMPLETE_POPUP_VIEW_WIN_H_ | |
| 7 | |
| 8 #include <atlbase.h> | |
| 9 #include <atlapp.h> | |
| 10 #include <atlcrack.h> | |
| 11 #include <atlmisc.h> | |
| 12 | |
| 13 #include <string> | |
| 14 | |
| 15 #include "app/gfx/font.h" | |
| 16 #include "base/scoped_ptr.h" | |
| 17 #include "base/win_util.h" | |
| 18 #include "chrome/browser/autocomplete/autocomplete.h" | |
| 19 #include "chrome/browser/autocomplete/autocomplete_popup_view.h" | |
| 20 #include "webkit/glue/window_open_disposition.h" | |
| 21 | |
| 22 class AutocompletePopupModel; | |
| 23 class AutocompleteEditModel; | |
| 24 class AutocompleteEditViewWin; | |
| 25 class Profile; | |
| 26 class SkBitmap; | |
| 27 | |
| 28 #define AUTOCOMPLETEPOPUPVIEW_CLASSNAME L"Chrome_AutocompletePopupView" | |
| 29 | |
| 30 // This class implements a popup window used to display autocomplete results. | |
| 31 class AutocompletePopupViewWin | |
| 32 : public CWindowImpl<AutocompletePopupViewWin, CWindow, CControlWinTraits>, | |
| 33 public AutocompletePopupView { | |
| 34 public: | |
| 35 DECLARE_WND_CLASS_EX(AUTOCOMPLETEPOPUPVIEW_CLASSNAME, | |
| 36 ((win_util::GetWinVersion() < win_util::WINVERSION_XP) ? | |
| 37 0 : CS_DROPSHADOW), COLOR_WINDOW) | |
| 38 | |
| 39 BEGIN_MSG_MAP(AutocompletePopupViewWin) | |
| 40 MSG_WM_ERASEBKGND(OnEraseBkgnd) | |
| 41 MSG_WM_LBUTTONDOWN(OnLButtonDown) | |
| 42 MSG_WM_MBUTTONDOWN(OnMButtonDown) | |
| 43 MSG_WM_LBUTTONUP(OnLButtonUp) | |
| 44 MSG_WM_MBUTTONUP(OnMButtonUp) | |
| 45 MSG_WM_MOUSEACTIVATE(OnMouseActivate) | |
| 46 MSG_WM_MOUSELEAVE(OnMouseLeave) | |
| 47 MSG_WM_MOUSEMOVE(OnMouseMove) | |
| 48 MSG_WM_PAINT(OnPaint) | |
| 49 END_MSG_MAP() | |
| 50 | |
| 51 AutocompletePopupViewWin(const gfx::Font& font, | |
| 52 AutocompleteEditViewWin* edit_view, | |
| 53 AutocompleteEditModel* edit_model, | |
| 54 Profile* profile); | |
| 55 | |
| 56 // Returns true if the popup is currently open. | |
| 57 virtual bool IsOpen() const { return m_hWnd != NULL; } | |
| 58 | |
| 59 // Invalidates one line of the autocomplete popup. | |
| 60 virtual void InvalidateLine(size_t line); | |
| 61 | |
| 62 // Redraws the popup window to match any changes in the result set; this may | |
| 63 // mean opening or closing the window. | |
| 64 virtual void UpdatePopupAppearance(); | |
| 65 | |
| 66 // Called by the model when hover is enabled or disabled. | |
| 67 virtual void OnHoverEnabledOrDisabled(bool disabled); | |
| 68 | |
| 69 virtual void PaintUpdatesNow() { UpdateWindow(); } | |
| 70 | |
| 71 virtual AutocompletePopupModel* GetModel() { return model_.get(); } | |
| 72 | |
| 73 private: | |
| 74 class MirroringContext; | |
| 75 | |
| 76 // Caches GDI objects and information for drawing. | |
| 77 struct DrawLineInfo { | |
| 78 enum LineStatus { | |
| 79 NORMAL = 0, | |
| 80 HOVERED, | |
| 81 SELECTED, | |
| 82 MAX_STATUS_ENTRIES | |
| 83 }; | |
| 84 | |
| 85 explicit DrawLineInfo(const gfx::Font& font); | |
| 86 ~DrawLineInfo(); | |
| 87 | |
| 88 static COLORREF AlphaBlend(COLORREF foreground, | |
| 89 COLORREF background, | |
| 90 BYTE alpha); | |
| 91 | |
| 92 static const wchar_t ellipsis_str[]; | |
| 93 | |
| 94 gfx::Font regular_font; // Fonts used for rendering AutocompleteMatches. | |
| 95 gfx::Font bold_font; | |
| 96 int font_height; // Height (in pixels) of a line of text w/o | |
| 97 // padding. | |
| 98 int line_height; // Height (in pixels) of a line of text w/padding. | |
| 99 int ave_char_width; // Width (in pixels) of an average character of | |
| 100 // the regular font. | |
| 101 int ellipsis_width; // Width (in pixels) of the ellipsis_str. | |
| 102 | |
| 103 // colors | |
| 104 COLORREF background_colors[MAX_STATUS_ENTRIES]; | |
| 105 COLORREF text_colors[MAX_STATUS_ENTRIES]; | |
| 106 COLORREF url_colors[MAX_STATUS_ENTRIES]; | |
| 107 | |
| 108 // brushes | |
| 109 HBRUSH brushes[MAX_STATUS_ENTRIES]; | |
| 110 | |
| 111 private: | |
| 112 static double LuminosityContrast(COLORREF color1, COLORREF color2); | |
| 113 static double Luminosity(COLORREF color); | |
| 114 }; | |
| 115 | |
| 116 // message handlers | |
| 117 LRESULT OnEraseBkgnd(HDC hdc) { | |
| 118 // We do all needed erasing ourselves in OnPaint, so the only thing that | |
| 119 // WM_ERASEBKGND will do is cause flicker. Disable it by just returning | |
| 120 // nonzero here ("erase completed") without doing anything. | |
| 121 return 1; | |
| 122 } | |
| 123 void OnLButtonDown(UINT keys, const CPoint& point); | |
| 124 void OnMButtonDown(UINT keys, const CPoint& point); | |
| 125 void OnLButtonUp(UINT keys, const CPoint& point); | |
| 126 void OnMButtonUp(UINT keys, const CPoint& point); | |
| 127 LRESULT OnMouseActivate(HWND window, UINT hit_test, UINT mouse_message); | |
| 128 void OnMouseLeave(); | |
| 129 void OnMouseMove(UINT keys, const CPoint& point); | |
| 130 void OnPaint(HDC hdc); | |
| 131 | |
| 132 // Called by On*ButtonUp() to do the actual work of handling a button | |
| 133 // release. Opens the item at the given coordinate, using the supplied | |
| 134 // disposition. | |
| 135 void OnButtonUp(const CPoint& point, WindowOpenDisposition disposition); | |
| 136 | |
| 137 // Gives the topmost y coordinate within |line|, which should be within the | |
| 138 // range of valid lines. | |
| 139 int LineTopPixel(size_t line) const; | |
| 140 | |
| 141 // Converts the given y-coordinate to a line. Due to drawing slop (window | |
| 142 // borders, etc.), |y| might be within the window but outside the range of | |
| 143 // pixels which correspond to lines; in this case the result will be clamped, | |
| 144 // i.e., the top and bottom lines will be treated as extending to the top and | |
| 145 // bottom edges of the window, respectively. | |
| 146 size_t PixelToLine(int y) const; | |
| 147 | |
| 148 // Draws a light border around the inside of the window with the given client | |
| 149 // rectangle and DC. | |
| 150 void DrawBorder(const RECT& rc, HDC dc); | |
| 151 | |
| 152 // Draws a single run of text with a particular style. Handles both LTR and | |
| 153 // RTL text as well as eliding. Returns the width, in pixels, of the string | |
| 154 // as it was actually displayed. | |
| 155 int DrawString(HDC dc, | |
| 156 int x, | |
| 157 int y, | |
| 158 int max_x, | |
| 159 const wchar_t* text, | |
| 160 int length, | |
| 161 int style, | |
| 162 const DrawLineInfo::LineStatus status, | |
| 163 const MirroringContext* context, | |
| 164 bool text_direction_is_rtl) const; | |
| 165 | |
| 166 // Draws a string from the autocomplete controller which can have specially | |
| 167 // marked "match" portions. | |
| 168 void DrawMatchFragments(HDC dc, | |
| 169 const std::wstring& text, | |
| 170 const ACMatchClassifications& classifications, | |
| 171 int x, | |
| 172 int y, | |
| 173 int max_x, | |
| 174 DrawLineInfo::LineStatus status) const; | |
| 175 | |
| 176 // Draws one line of the text in the box. | |
| 177 void DrawEntry(HDC dc, | |
| 178 const RECT& client_rect, | |
| 179 size_t line, | |
| 180 DrawLineInfo::LineStatus status, | |
| 181 bool all_descriptions_empty, | |
| 182 bool starred) const; | |
| 183 | |
| 184 // Draws the star at the specified location | |
| 185 void DrawStar(HDC dc, int x, int y) const; | |
| 186 | |
| 187 scoped_ptr<AutocompletePopupModel> model_; | |
| 188 | |
| 189 AutocompleteEditViewWin* edit_view_; | |
| 190 | |
| 191 // Cached GDI information for drawing. | |
| 192 DrawLineInfo line_info_; | |
| 193 | |
| 194 // Bitmap for the star. This is owned by the ResourceBundle. | |
| 195 SkBitmap* star_; | |
| 196 | |
| 197 // A context used for mirroring regions. | |
| 198 scoped_ptr<MirroringContext> mirroring_context_; | |
| 199 | |
| 200 // When hovered_line_ is kNoMatch, this holds the screen coordinates of the | |
| 201 // mouse position when hover tracking was turned off. If the mouse moves to a | |
| 202 // point over the popup that has different coordinates, hover tracking will be | |
| 203 // re-enabled. When hovered_line_ is a valid line, the value here is | |
| 204 // out-of-date and should be ignored. | |
| 205 CPoint last_hover_coordinates_; | |
| 206 | |
| 207 DISALLOW_COPY_AND_ASSIGN(AutocompletePopupViewWin); | |
| 208 }; | |
| 209 | |
| 210 #endif // CHROME_BROWSER_AUTOCOMPLETE_AUTOCOMPLETE_POPUP_VIEW_WIN_H_ | |
| OLD | NEW |