1 /* -*- Mode: C++; tab-width: 40; 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/. */
6 #ifndef mozilla_ContentData_h
7 #define mozilla_ContentData_h
11 #include "mozilla/Attributes.h"
12 #include "mozilla/Debug.h"
13 #include "mozilla/EventForwards.h"
14 #include "mozilla/Maybe.h"
15 #include "mozilla/WritingModes.h"
16 #include "mozilla/widget/IMEData.h"
19 * This file is intended for declaring classes which store DOM content data for
20 * widget classes. Those data should be retrived by `WidgetQueryContentEvent`,
21 * notified with `IMENotification`, or set assumed data as result of dispatching
22 * widget events such as `WidgetKeyboardEvent`, `WidgetCompositionEvent`,
23 * `WidgetSelectionEvent` etc.
29 * ContentSelection stores DOM selection in flattend text by
30 * ContentEventHandler. It should be retrieved with `eQuerySelectedText` event,
31 * notified with `NOTIFY_IME_OF_SELECTION_CHANGE` or set by widget itself.
33 class ContentSelection
{
35 using SelectionChangeDataBase
=
36 widget::IMENotification::SelectionChangeDataBase
;
37 ContentSelection() = default;
38 explicit ContentSelection(const SelectionChangeDataBase
& aSelectionChangeData
)
39 : mOffsetAndData(Some(aSelectionChangeData
.ToUint32OffsetAndData())),
40 mWritingMode(aSelectionChangeData
.GetWritingMode()) {}
41 explicit ContentSelection(const WidgetQueryContentEvent
& aSelectedTextEvent
);
42 ContentSelection(uint32_t aOffset
, const WritingMode
& aWritingMode
)
43 : mOffsetAndData(Some(OffsetAndData
<uint32_t>(
44 aOffset
, EmptyString(), OffsetAndDataFor::SelectedString
))),
45 mWritingMode(aWritingMode
) {}
47 const OffsetAndData
<uint32_t>& OffsetAndDataRef() const {
48 return mOffsetAndData
.ref();
51 void Collapse(uint32_t aOffset
) {
52 if (mOffsetAndData
.isSome()) {
53 mOffsetAndData
->Collapse(aOffset
);
55 mOffsetAndData
.emplace(aOffset
, EmptyString(),
56 OffsetAndDataFor::SelectedString
);
60 mOffsetAndData
.reset();
61 mWritingMode
= WritingMode();
64 bool HasRange() const { return mOffsetAndData
.isSome(); }
65 const WritingMode
& WritingModeRef() const { return mWritingMode
; }
67 friend std::ostream
& operator<<(std::ostream
& aStream
,
68 const ContentSelection
& aContentSelection
) {
69 if (aContentSelection
.HasRange()) {
70 return aStream
<< "{ HasRange()=false }";
72 aStream
<< "{ mOffsetAndData=" << aContentSelection
.mOffsetAndData
73 << ", mWritingMode=" << aContentSelection
.mWritingMode
<< " }";
78 Maybe
<OffsetAndData
<uint32_t>> mOffsetAndData
;
79 WritingMode mWritingMode
;
82 } // namespace mozilla
84 #endif // #ifndef mozilla_ContentData_h