1 // Copyright (c) 2012 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.
5 #ifndef CHROME_BROWSER_CHROMEOS_INPUT_METHOD_CANDIDATE_WINDOW_CONTROLLER_IMPL_H_
6 #define CHROME_BROWSER_CHROMEOS_INPUT_METHOD_CANDIDATE_WINDOW_CONTROLLER_IMPL_H_
8 #include "chrome/browser/chromeos/input_method/candidate_window_controller.h"
10 #include "base/memory/scoped_ptr.h"
11 #include "base/observer_list.h"
12 #include "chrome/browser/chromeos/input_method/candidate_window_view.h"
13 #include "chrome/browser/chromeos/input_method/infolist_window_view.h"
14 #include "chromeos/ime/ibus_bridge.h"
15 #include "chromeos/ime/ibus_daemon_controller.h"
22 namespace input_method {
24 class CandidateWindow;
25 class DelayableWidget;
26 class ModeIndicatorController;
28 // The implementation of CandidateWindowController.
29 // CandidateWindowController controls the CandidateWindow.
30 class CandidateWindowControllerImpl
31 : public CandidateWindowController,
32 public CandidateWindowView::Observer,
33 public IBusPanelCandidateWindowHandlerInterface {
35 CandidateWindowControllerImpl();
36 virtual ~CandidateWindowControllerImpl();
38 // CandidateWindowController overrides:
39 virtual bool Init() OVERRIDE;
40 virtual void Shutdown() OVERRIDE;
41 virtual void AddObserver(
42 CandidateWindowController::Observer* observer) OVERRIDE;
43 virtual void RemoveObserver(
44 CandidateWindowController::Observer* observer) OVERRIDE;
47 // Returns infolist window position. This function handles right or bottom
48 // position overflow. Usually, infolist window is clipped with right-top of
49 // candidate window, but the position should be changed based on position
50 // overflow. If right of infolist window is out of screen, infolist window is
51 // shown left-top of candidate window. If bottom of infolist window is out of
52 // screen, infolist window is shown with clipping to bottom of screen.
53 // Infolist window does not overflow top and left direction.
54 static gfx::Point GetInfolistWindowPosition(
55 const gfx::Rect& candidate_window_rect,
56 const gfx::Rect& screen_rect,
57 const gfx::Size& infolist_winodw_size);
59 // Converts |candidate_window| to infolist entries. |focused_index| become
60 // InfolistWindowView::InvalidFocusIndex if there is no selected entries.
61 static void ConvertLookupTableToInfolistEntry(
62 const CandidateWindow& candidate_window,
63 std::vector<InfolistWindowView::Entry>* infolist_entries,
64 size_t* focused_index);
66 // Returns true if given |new_entries| is different from |old_entries| and
67 // should update current window.
68 static bool ShouldUpdateInfolist(
69 const std::vector<InfolistWindowView::Entry>& old_entries,
70 size_t old_focused_index,
71 const std::vector<InfolistWindowView::Entry>& new_entries,
72 size_t new_focused_index);
75 // CandidateWindowView::Observer implementation.
76 virtual void OnCandidateCommitted(int index, int button, int flags) OVERRIDE;
77 virtual void OnCandidateWindowOpened() OVERRIDE;
78 virtual void OnCandidateWindowClosed() OVERRIDE;
80 // Creates the candidate window view.
83 // IBusPanelCandidateWindowHandlerInterface overrides.
84 virtual void HideAuxiliaryText() OVERRIDE;
85 virtual void HideLookupTable() OVERRIDE;
86 virtual void HidePreeditText() OVERRIDE;
87 virtual void SetCursorLocation(const ibus::Rect& cursor_position,
88 const ibus::Rect& composition_head) OVERRIDE;
89 virtual void UpdateAuxiliaryText(const std::string& utf8_text,
90 bool visible) OVERRIDE;
91 virtual void UpdateLookupTable(const CandidateWindow& candidate_window,
92 bool visible) OVERRIDE;
93 virtual void UpdatePreeditText(const std::string& utf8_text,
94 unsigned int cursor, bool visible) OVERRIDE;
96 // Updates infolist bounds, if current bounds is up-to-date, this function
98 void UpdateInfolistBounds();
100 // The candidate window view.
101 CandidateWindowView* candidate_window_view_;
103 // This is the outer frame of the candidate window view. The frame will
104 // own |candidate_window_|.
105 scoped_ptr<views::Widget> frame_;
107 // This is the outer frame of the infolist window view. The frame will
108 // own |infolist_window_|.
109 scoped_ptr<DelayableWidget> infolist_window_;
111 // This is the controller of the IME mode indicator.
112 scoped_ptr<ModeIndicatorController> mode_indicator_controller_;
114 // The infolist entries and its focused index which currently shown in
116 std::vector<InfolistWindowView::Entry> latest_infolist_entries_;
117 size_t latest_infolist_focused_index_;
119 ObserverList<CandidateWindowController::Observer> observers_;
121 DISALLOW_COPY_AND_ASSIGN(CandidateWindowControllerImpl);
124 #endif // CHROME_BROWSER_CHROMEOS_INPUT_METHOD_CANDIDATE_WINDOW_CONTROLLER_IMPL_H_
126 } // namespace input_method
127 } // namespace chromeos