aboutsummaryrefslogtreecommitdiff
path: root/include/cru/osx/gui/Window.hpp
blob: 710246bc7cdf83e4d4e490cbeee3b7121ab0e1ca (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
#pragma once
#include "Resource.hpp"
#include "cru/platform/gui/Base.hpp"
#include "cru/platform/gui/InputMethod.hpp"
#include "cru/platform/gui/Window.hpp"

#include <memory>

namespace cru::platform::gui::osx {
namespace details {
class OsxWindowPrivate;
class OsxInputMethodContextPrivate;
}  // namespace details

class OsxUiApplication;
class OsxInputMethodContext;

class OsxWindow : public OsxGuiResource, public INativeWindow {
  friend details::OsxWindowPrivate;
  friend OsxInputMethodContext;
  friend details::OsxInputMethodContextPrivate;

 public:
  OsxWindow(OsxUiApplication* ui_application, INativeWindow* parent,
            bool frame);

  CRU_DELETE_COPY(OsxWindow)
  CRU_DELETE_MOVE(OsxWindow)

  ~OsxWindow() override;

 public:
  void Close() override;

  INativeWindow* GetParent() override;

  bool IsVisible() override;
  void SetVisible(bool is_visible) override;

  Size GetClientSize() override;
  void SetClientSize(const Size& size) override;

  Rect GetWindowRect() override;
  void SetWindowRect(const Rect& rect) override;

  Point GetMousePosition() override;

  bool CaptureMouse() override;
  bool ReleaseMouse() override;

  void SetCursor(std::shared_ptr<ICursor> cursor) override;

  void RequestRepaint() override;

  std::unique_ptr<graphics::IPainter> BeginPaint() override;

  IEvent<std::nullptr_t>* DestroyEvent() override { return &destroy_event_; }
  IEvent<std::nullptr_t>* PaintEvent() override { return &paint_event_; }
  IEvent<Size>* ResizeEvent() override { return &resize_event_; }
  IEvent<FocusChangeType>* FocusEvent() override { return &focus_event_; }
  IEvent<MouseEnterLeaveType>* MouseEnterLeaveEvent() override {
    return &mouse_enter_leave_event_;
  }
  IEvent<Point>* MouseMoveEvent() override { return &mouse_move_event_; }
  IEvent<NativeMouseButtonEventArgs>* MouseDownEvent() override {
    return &mouse_down_event_;
  }
  IEvent<NativeMouseButtonEventArgs>* MouseUpEvent() override {
    return &mouse_up_event_;
  }
  IEvent<NativeMouseWheelEventArgs>* MouseWheelEvent() override {
    return &mouse_wheel_event_;
  }
  IEvent<NativeKeyEventArgs>* KeyDownEvent() override {
    return &key_down_event_;
  }
  IEvent<NativeKeyEventArgs>* KeyUpEvent() override { return &key_up_event_; }

  IInputMethodContext* GetInputMethodContext() override;

 private:
  void CreateWindow();

 private:
  std::unique_ptr<details::OsxWindowPrivate> p_;

  Event<std::nullptr_t> destroy_event_;
  Event<std::nullptr_t> paint_event_;
  Event<Size> resize_event_;
  Event<FocusChangeType> focus_event_;
  Event<MouseEnterLeaveType> mouse_enter_leave_event_;
  Event<Point> mouse_move_event_;
  Event<NativeMouseButtonEventArgs> mouse_down_event_;
  Event<NativeMouseButtonEventArgs> mouse_up_event_;
  Event<NativeMouseWheelEventArgs> mouse_wheel_event_;
  Event<NativeKeyEventArgs> key_down_event_;
  Event<NativeKeyEventArgs> key_up_event_;
};

class OsxInputMethodContext : public OsxGuiResource,
                              public IInputMethodContext {
  friend details::OsxInputMethodContextPrivate;

 public:
  explicit OsxInputMethodContext(OsxWindow* window);

  CRU_DELETE_COPY(OsxInputMethodContext)
  CRU_DELETE_MOVE(OsxInputMethodContext)

  ~OsxInputMethodContext() override;

 public:
  bool ShouldManuallyDrawCompositionText() override;

  void EnableIME() override;

  void DisableIME() override;

  void CompleteComposition() override;

  void CancelComposition() override;

  CompositionText GetCompositionText() override;

  void SetCandidateWindowPosition(const Point& point) override;

  IEvent<std::nullptr_t>* CompositionStartEvent() override;

  IEvent<std::nullptr_t>* CompositionEndEvent() override;

  IEvent<std::nullptr_t>* CompositionEvent() override;

  IEvent<StringView>* TextEvent() override;

 private:
  std::unique_ptr<details::OsxInputMethodContextPrivate> p_;
};
}  // namespace cru::platform::gui::osx