1 /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
2 /* This Source Code Form is subject to the terms of the Mozilla Public
3  * License, v. 2.0. If a copy of the MPL was not distributed with this
4  * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
5 
6 #ifndef HTMLEditorEventListener_h
7 #define HTMLEditorEventListener_h
8 
9 #include "EditorEventListener.h"
10 #include "mozilla/HTMLEditor.h"
11 #include "nscore.h"
12 
13 namespace mozilla {
14 
15 namespace dom {
16 class Element;
17 }
18 
19 class EditorBase;
20 
21 class HTMLEditorEventListener final : public EditorEventListener {
22  public:
HTMLEditorEventListener()23   HTMLEditorEventListener()
24       : EditorEventListener(),
25         mListeningToMouseMoveEventForResizers(false),
26         mListeningToMouseMoveEventForGrabber(false),
27         mListeningToResizeEvent(false) {}
28 
29   // nsIDOMEventListener
30   MOZ_CAN_RUN_SCRIPT NS_IMETHOD HandleEvent(dom::Event* aEvent) override;
31 
32   /**
33    * Connect() fails if aEditorBase isn't an HTMLEditor instance.
34    */
35   virtual nsresult Connect(EditorBase* aEditorBase) override;
36 
37   virtual void Disconnect() override;
38 
39   /**
40    * ListenToMouseMoveEventForResizers() starts to listen to or stop
41    * listening to "mousemove" events for resizers.
42    */
ListenToMouseMoveEventForResizers(bool aListen)43   nsresult ListenToMouseMoveEventForResizers(bool aListen) {
44     if (aListen == mListeningToMouseMoveEventForResizers) {
45       return NS_OK;
46     }
47     nsresult rv = ListenToMouseMoveEventForResizersOrGrabber(aListen, false);
48     NS_WARNING_ASSERTION(NS_SUCCEEDED(rv),
49                          "HTMLEditorEventListener::"
50                          "ListenToMouseMoveEventForResizersOrGrabber() failed");
51     return rv;
52   }
53 
54   /**
55    * ListenToMouseMoveEventForResizers() starts to listen to or stop
56    * listening to "mousemove" events for grabber to move absolutely
57    * positioned element.
58    */
ListenToMouseMoveEventForGrabber(bool aListen)59   nsresult ListenToMouseMoveEventForGrabber(bool aListen) {
60     if (aListen == mListeningToMouseMoveEventForGrabber) {
61       return NS_OK;
62     }
63     nsresult rv = ListenToMouseMoveEventForResizersOrGrabber(aListen, true);
64     NS_WARNING_ASSERTION(NS_SUCCEEDED(rv),
65                          "HTMLEditorEventListener::"
66                          "ListenToMouseMoveEventForResizersOrGrabber() failed");
67     return rv;
68   }
69 
70   /**
71    * ListenToWindowResizeEvent() starts to listen to or stop listening to
72    * "resize" events of the document.
73    */
74   nsresult ListenToWindowResizeEvent(bool aListen);
75 
76  protected:
77   MOZ_CAN_RUN_SCRIPT virtual nsresult MouseDown(
78       dom::MouseEvent* aMouseEvent) override;
79   MOZ_CAN_RUN_SCRIPT virtual nsresult MouseUp(
80       dom::MouseEvent* aMouseEvent) override;
81   MOZ_CAN_RUN_SCRIPT virtual nsresult MouseClick(
82       WidgetMouseEvent* aMouseClickEvent) override;
83 
84   nsresult ListenToMouseMoveEventForResizersOrGrabber(bool aListen,
85                                                       bool aForGrabber);
86 
87   MOZ_CAN_RUN_SCRIPT nsresult HandlePrimaryMouseButtonDown(
88       HTMLEditor& aHTMLEditor, dom::MouseEvent& aMouseEvent);
89   MOZ_CAN_RUN_SCRIPT nsresult HandleSecondaryMouseButtonDown(
90       HTMLEditor& aHTMLEditor, dom::MouseEvent& aMouseEvent);
91 
92   bool mListeningToMouseMoveEventForResizers;
93   bool mListeningToMouseMoveEventForGrabber;
94   bool mListeningToResizeEvent;
95 };
96 
97 }  // namespace mozilla
98 
99 #endif  // #ifndef HTMLEditorEventListener_h
100