forked from mirrors/gecko-dev
		
	 139876e527
			
		
	
	
		139876e527
		
	
	
	
	
		
			
			Now, `IMContextWrapper::Selection` and `IMMHandler::Selection` have same structure. Therefore, we can merge them into one place. This will help to fix bug 1259690 in the future. Differential Revision: https://phabricator.services.mozilla.com/D137421
		
			
				
	
	
		
			84 lines
		
	
	
	
		
			2.9 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
			
		
		
	
	
			84 lines
		
	
	
	
		
			2.9 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
| /* -*- Mode: C++; tab-width: 40; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
 | |
| /* This Source Code Form is subject to the terms of the Mozilla Public
 | |
|  * License, v. 2.0. If a copy of the MPL was not distributed with this
 | |
|  * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
 | |
| 
 | |
| #ifndef mozilla_ContentData_h
 | |
| #define mozilla_ContentData_h
 | |
| 
 | |
| #include <sstream>
 | |
| 
 | |
| #include "mozilla/Attributes.h"
 | |
| #include "mozilla/Debug.h"
 | |
| #include "mozilla/EventForwards.h"
 | |
| #include "mozilla/Maybe.h"
 | |
| #include "mozilla/WritingModes.h"
 | |
| #include "mozilla/widget/IMEData.h"
 | |
| 
 | |
| /**
 | |
|  * This file is intended for declaring classes which store DOM content data for
 | |
|  * widget classes.  Those data should be retrived by `WidgetQueryContentEvent`,
 | |
|  * notified with `IMENotification`, or set assumed data as result of dispatching
 | |
|  * widget events such as `WidgetKeyboardEvent`, `WidgetCompositionEvent`,
 | |
|  * `WidgetSelectionEvent` etc.
 | |
|  */
 | |
| 
 | |
| namespace mozilla {
 | |
| 
 | |
| /**
 | |
|  * ContentSelection stores DOM selection in flattend text by
 | |
|  * ContentEventHandler.  It should be retrieved with `eQuerySelectedText` event,
 | |
|  * notified with `NOTIFY_IME_OF_SELECTION_CHANGE` or set by widget itself.
 | |
|  */
 | |
| class ContentSelection {
 | |
|  public:
 | |
|   using SelectionChangeDataBase =
 | |
|       widget::IMENotification::SelectionChangeDataBase;
 | |
|   ContentSelection() = default;
 | |
|   explicit ContentSelection(const SelectionChangeDataBase& aSelectionChangeData)
 | |
|       : mOffsetAndData(Some(aSelectionChangeData.ToUint32OffsetAndData())),
 | |
|         mWritingMode(aSelectionChangeData.GetWritingMode()) {}
 | |
|   explicit ContentSelection(const WidgetQueryContentEvent& aSelectedTextEvent);
 | |
|   ContentSelection(uint32_t aOffset, const WritingMode& aWritingMode)
 | |
|       : mOffsetAndData(Some(OffsetAndData<uint32_t>(
 | |
|             aOffset, EmptyString(), OffsetAndDataFor::SelectedString))),
 | |
|         mWritingMode(aWritingMode) {}
 | |
| 
 | |
|   const OffsetAndData<uint32_t>& OffsetAndDataRef() const {
 | |
|     return mOffsetAndData.ref();
 | |
|   }
 | |
| 
 | |
|   void Collapse(uint32_t aOffset) {
 | |
|     if (mOffsetAndData.isSome()) {
 | |
|       mOffsetAndData->Collapse(aOffset);
 | |
|     } else {
 | |
|       mOffsetAndData.emplace(aOffset, EmptyString(),
 | |
|                              OffsetAndDataFor::SelectedString);
 | |
|     }
 | |
|   }
 | |
|   void Clear() {
 | |
|     mOffsetAndData.reset();
 | |
|     mWritingMode = WritingMode();
 | |
|   }
 | |
| 
 | |
|   bool HasRange() const { return mOffsetAndData.isSome(); }
 | |
|   const WritingMode& WritingModeRef() const { return mWritingMode; }
 | |
| 
 | |
|   friend std::ostream& operator<<(std::ostream& aStream,
 | |
|                                   const ContentSelection& aContentSelection) {
 | |
|     if (aContentSelection.HasRange()) {
 | |
|       return aStream << "{ HasRange()=false }";
 | |
|     }
 | |
|     aStream << "{ mOffsetAndData=" << aContentSelection.mOffsetAndData
 | |
|             << ", mWritingMode=" << aContentSelection.mWritingMode << " }";
 | |
|     return aStream;
 | |
|   }
 | |
| 
 | |
|  private:
 | |
|   Maybe<OffsetAndData<uint32_t>> mOffsetAndData;
 | |
|   WritingMode mWritingMode;
 | |
| };
 | |
| 
 | |
| }  // namespace mozilla
 | |
| 
 | |
| #endif  // #ifndef mozilla_ContentData_h
 |