- add sources.
[platform/framework/web/crosswalk.git] / src / chrome / browser / chromeos / input_method / candidate_window_controller_impl.h
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.
4
5 #ifndef CHROME_BROWSER_CHROMEOS_INPUT_METHOD_CANDIDATE_WINDOW_CONTROLLER_IMPL_H_
6 #define CHROME_BROWSER_CHROMEOS_INPUT_METHOD_CANDIDATE_WINDOW_CONTROLLER_IMPL_H_
7
8 #include "chrome/browser/chromeos/input_method/candidate_window_controller.h"
9
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"
16
17 namespace views {
18 class Widget;
19 }  // namespace views
20
21 namespace chromeos {
22 namespace input_method {
23
24 class CandidateWindow;
25 class DelayableWidget;
26 class ModeIndicatorController;
27
28 // The implementation of CandidateWindowController.
29 // CandidateWindowController controls the CandidateWindow.
30 class CandidateWindowControllerImpl
31     : public CandidateWindowController,
32       public CandidateWindowView::Observer,
33       public IBusPanelCandidateWindowHandlerInterface {
34  public:
35   CandidateWindowControllerImpl();
36   virtual ~CandidateWindowControllerImpl();
37
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;
45
46  protected:
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);
58
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);
65
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);
73
74  private:
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;
79
80   // Creates the candidate window view.
81   void CreateView();
82
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;
95
96   // Updates infolist bounds, if current bounds is up-to-date, this function
97   // does nothing.
98   void UpdateInfolistBounds();
99
100   // The candidate window view.
101   CandidateWindowView* candidate_window_view_;
102
103   // This is the outer frame of the candidate window view. The frame will
104   // own |candidate_window_|.
105   scoped_ptr<views::Widget> frame_;
106
107   // This is the outer frame of the infolist window view. The frame will
108   // own |infolist_window_|.
109   scoped_ptr<DelayableWidget> infolist_window_;
110
111   // This is the controller of the IME mode indicator.
112   scoped_ptr<ModeIndicatorController> mode_indicator_controller_;
113
114   // The infolist entries and its focused index which currently shown in
115   // Infolist window.
116   std::vector<InfolistWindowView::Entry> latest_infolist_entries_;
117   size_t latest_infolist_focused_index_;
118
119   ObserverList<CandidateWindowController::Observer> observers_;
120
121   DISALLOW_COPY_AND_ASSIGN(CandidateWindowControllerImpl);
122 };
123
124 #endif  // CHROME_BROWSER_CHROMEOS_INPUT_METHOD_CANDIDATE_WINDOW_CONTROLLER_IMPL_H_
125
126 }  // namespace input_method
127 }  // namespace chromeos