diff options
author | deanm@chromium.org <deanm@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2009-02-27 15:34:07 +0000 |
---|---|---|
committer | deanm@chromium.org <deanm@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2009-02-27 15:34:07 +0000 |
commit | af3007ee6faba103422849943886fe86aac52939 (patch) | |
tree | 53375960d7cc8fa115bf3912204f986565d27207 /chrome/browser/autocomplete/autocomplete_popup_view.h | |
parent | f387f1b80dc74fd2d77820e23b885e7984455763 (diff) | |
download | chromium_src-af3007ee6faba103422849943886fe86aac52939.zip chromium_src-af3007ee6faba103422849943886fe86aac52939.tar.gz chromium_src-af3007ee6faba103422849943886fe86aac52939.tar.bz2 |
Make AutocompletePopupView a virtual interface.
The AutocompletePopupModel needs to be able to communicate with the view. Since the view implementation will be platform specific, we abstract our a virtual interface that the different platform view implementations must all implement. This allows the Model and View to communicate, while hiding the platform differences.
This change makes the previous Windows AutocompletePopupView into AutocompletePopupViewWin, a subclass of AutocompletePopupView.
Review URL: http://codereview.chromium.org/28258
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@10607 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'chrome/browser/autocomplete/autocomplete_popup_view.h')
-rw-r--r-- | chrome/browser/autocomplete/autocomplete_popup_view.h | 197 |
1 files changed, 22 insertions, 175 deletions
diff --git a/chrome/browser/autocomplete/autocomplete_popup_view.h b/chrome/browser/autocomplete/autocomplete_popup_view.h index 235e342..0db0af6 100644 --- a/chrome/browser/autocomplete/autocomplete_popup_view.h +++ b/chrome/browser/autocomplete/autocomplete_popup_view.h @@ -2,200 +2,47 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. +// This file defines the interface class AutocompletePopupView. Each toolkit +// will implement the popup view differently, so that code is inheriently +// platform specific. However, the AutocompletePopupModel needs to do some +// communication with the view. Since the model is shared between platforms, +// we need to define an interface that all view implementations will share. + #ifndef CHROME_BROWSER_AUTOCOMPLETE_AUTOCOMPLETE_POPUP_VIEW_H_ #define CHROME_BROWSER_AUTOCOMPLETE_AUTOCOMPLETE_POPUP_VIEW_H_ -#include <atlbase.h> -#include <atlapp.h> -#include <atlcrack.h> -#include <atlmisc.h> - -#include "base/win_util.h" -#include "chrome/browser/autocomplete/autocomplete.h" -#include "chrome/common/gfx/chrome_font.h" -#include "chrome/views/view.h" +#include "base/basictypes.h" class AutocompleteEditView; -class MirroringContext; -class SkBitmap; - class AutocompletePopupModel; +class ChromeFont; -// TODO(pkasting): http://b/1343512 The names and contents of the classes in -// this file are temporary. I am in hack-and-slash mode right now. - -#define AUTOCOMPLETEPOPUPVIEW_CLASSNAME L"Chrome_AutocompletePopupView" - -// This class implements a popup window used to display autocomplete results. -class AutocompletePopupView - : public CWindowImpl<AutocompletePopupView, CWindow, CControlWinTraits> { +class AutocompletePopupView { public: - DECLARE_WND_CLASS_EX(AUTOCOMPLETEPOPUPVIEW_CLASSNAME, - ((win_util::GetWinVersion() < win_util::WINVERSION_XP) ? - 0 : CS_DROPSHADOW), COLOR_WINDOW) - - BEGIN_MSG_MAP(AutocompletePopupView) - MSG_WM_ERASEBKGND(OnEraseBkgnd) - MSG_WM_LBUTTONDOWN(OnLButtonDown) - MSG_WM_MBUTTONDOWN(OnMButtonDown) - MSG_WM_LBUTTONUP(OnLButtonUp) - MSG_WM_MBUTTONUP(OnMButtonUp) - MSG_WM_MOUSEACTIVATE(OnMouseActivate) - MSG_WM_MOUSELEAVE(OnMouseLeave) - MSG_WM_MOUSEMOVE(OnMouseMove) - MSG_WM_PAINT(OnPaint) - END_MSG_MAP() + static AutocompletePopupView* CreatePopupView( + AutocompletePopupModel* model, + const ChromeFont& font, + AutocompleteEditView* edit_view); - AutocompletePopupView(AutocompletePopupModel* model, - const ChromeFont& font, - AutocompleteEditView* edit_view); + virtual ~AutocompletePopupView() { } // Returns true if the popup is currently open. - bool IsOpen() const { return m_hWnd != NULL; } + virtual bool IsOpen() const = 0; // Invalidates one line of the autocomplete popup. - void InvalidateLine(size_t line); + virtual void InvalidateLine(size_t line) = 0; // Redraws the popup window to match any changes in the result set; this may // mean opening or closing the window. - void UpdatePopupAppearance(); + virtual void UpdatePopupAppearance() = 0; // Called by the model when hover is enabled or disabled. - void OnHoverEnabledOrDisabled(bool disabled); - - private: - // Caches GDI objects and information for drawing. - struct DrawLineInfo { - enum LineStatus { - NORMAL = 0, - HOVERED, - SELECTED, - MAX_STATUS_ENTRIES - }; - - explicit DrawLineInfo(const ChromeFont& font); - ~DrawLineInfo(); - - static COLORREF AlphaBlend(COLORREF foreground, - COLORREF background, - BYTE alpha); - - static const wchar_t ellipsis_str[]; - - ChromeFont regular_font; // Fonts used for rendering AutocompleteMatches. - ChromeFont bold_font; - int font_height; // Height (in pixels) of a line of text w/o - // padding. - int line_height; // Height (in pixels) of a line of text w/padding. - int ave_char_width; // Width (in pixels) of an average character of - // the regular font. - int ellipsis_width; // Width (in pixels) of the ellipsis_str. - - // colors - COLORREF background_colors[MAX_STATUS_ENTRIES]; - COLORREF text_colors[MAX_STATUS_ENTRIES]; - COLORREF url_colors[MAX_STATUS_ENTRIES]; - - // brushes - HBRUSH brushes[MAX_STATUS_ENTRIES]; - - private: - static double LuminosityContrast(COLORREF color1, COLORREF color2); - static double Luminosity(COLORREF color); - }; - - // message handlers - LRESULT OnEraseBkgnd(HDC hdc) { - // We do all needed erasing ourselves in OnPaint, so the only thing that - // WM_ERASEBKGND will do is cause flicker. Disable it by just returning - // nonzero here ("erase completed") without doing anything. - return 1; - } - void OnLButtonDown(UINT keys, const CPoint& point); - void OnMButtonDown(UINT keys, const CPoint& point); - void OnLButtonUp(UINT keys, const CPoint& point); - void OnMButtonUp(UINT keys, const CPoint& point); - LRESULT OnMouseActivate(HWND window, UINT hit_test, UINT mouse_message); - void OnMouseLeave(); - void OnMouseMove(UINT keys, const CPoint& point); - void OnPaint(HDC hdc); - - // Called by On*ButtonUp() to do the actual work of handling a button - // release. Opens the item at the given coordinate, using the supplied - // disposition. - void OnButtonUp(const CPoint& point, WindowOpenDisposition disposition); - - // Gives the topmost y coordinate within |line|, which should be within the - // range of valid lines. - int LineTopPixel(size_t line) const; - - // Converts the given y-coordinate to a line. Due to drawing slop (window - // borders, etc.), |y| might be within the window but outside the range of - // pixels which correspond to lines; in this case the result will be clamped, - // i.e., the top and bottom lines will be treated as extending to the top and - // bottom edges of the window, respectively. - size_t PixelToLine(int y) const; - - // Draws a light border around the inside of the window with the given client - // rectangle and DC. - void DrawBorder(const RECT& rc, HDC dc); - - // Draws a single run of text with a particular style. Handles both LTR and - // RTL text as well as eliding. Returns the width, in pixels, of the string - // as it was actually displayed. - int DrawString(HDC dc, - int x, - int y, - int max_x, - const wchar_t* text, - int length, - int style, - const DrawLineInfo::LineStatus status, - const MirroringContext* context, - bool text_direction_is_rtl) const; - - // Draws a string from the autocomplete controller which can have specially - // marked "match" portions. - void DrawMatchFragments(HDC dc, - const std::wstring& text, - const ACMatchClassifications& classifications, - int x, - int y, - int max_x, - DrawLineInfo::LineStatus status) const; - - // Draws one line of the text in the box. - void DrawEntry(HDC dc, - const RECT& client_rect, - size_t line, - DrawLineInfo::LineStatus status, - bool all_descriptions_empty, - bool starred) const; - - // Draws the star at the specified location - void DrawStar(HDC dc, int x, int y) const; - - AutocompletePopupModel* model_; - - AutocompleteEditView* edit_view_; - - // Cached GDI information for drawing. - DrawLineInfo line_info_; - - // Bitmap for the star. This is owned by the ResourceBundle. - SkBitmap* star_; - - // A context used for mirroring regions. - scoped_ptr<MirroringContext> mirroring_context_; - - // When hovered_line_ is kNoMatch, this holds the screen coordinates of the - // mouse position when hover tracking was turned off. If the mouse moves to a - // point over the popup that has different coordinates, hover tracking will be - // re-enabled. When hovered_line_ is a valid line, the value here is - // out-of-date and should be ignored. - CPoint last_hover_coordinates_; + virtual void OnHoverEnabledOrDisabled(bool disabled) = 0; - DISALLOW_COPY_AND_ASSIGN(AutocompletePopupView); +#if defined(OS_WIN) + // Cause a WM_PAINT immediately (see msdn on UpdateWindow()). + virtual void PaintUpdatesNow() = 0; +#endif }; #endif // CHROME_BROWSER_AUTOCOMPLETE_AUTOCOMPLETE_POPUP_VIEW_H_ |