Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(170)

Side by Side Diff: chrome/browser/autocomplete/autocomplete_popup_view_win.h

Issue 160378: Make TOOLKIT_VIEWS port use views-based Autocomplete popup.... (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src/
Patch Set: '' Created 11 years, 4 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
(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_
OLDNEW
« no previous file with comments | « chrome/browser/autocomplete/autocomplete_popup_view_gtk.cc ('k') | chrome/browser/autocomplete/autocomplete_popup_view_win.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698