зеркало из https://github.com/mozilla/gecko-dev.git
86 строки
2.5 KiB
C++
86 строки
2.5 KiB
C++
/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
|
|
/* vim: set ts=2 sw=2 et tw=78: */
|
|
/* 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/. */
|
|
|
|
#include "nsDOMTextEvent.h"
|
|
#include "nsPrivateTextRange.h"
|
|
#include "prtime.h"
|
|
#include "mozilla/TextEvents.h"
|
|
|
|
using namespace mozilla;
|
|
|
|
nsDOMTextEvent::nsDOMTextEvent(mozilla::dom::EventTarget* aOwner,
|
|
nsPresContext* aPresContext,
|
|
WidgetTextEvent* aEvent)
|
|
: nsDOMUIEvent(aOwner, aPresContext,
|
|
aEvent ? aEvent : new WidgetTextEvent(false, 0, nullptr))
|
|
{
|
|
NS_ASSERTION(mEvent->eventStructType == NS_TEXT_EVENT, "event type mismatch");
|
|
|
|
if (aEvent) {
|
|
mEventIsInternal = false;
|
|
}
|
|
else {
|
|
mEventIsInternal = true;
|
|
mEvent->time = PR_Now();
|
|
}
|
|
|
|
//
|
|
// extract the IME composition string
|
|
//
|
|
WidgetTextEvent* te = mEvent->AsTextEvent();
|
|
mText = te->theText;
|
|
|
|
//
|
|
// build the range list -- ranges need to be DOM-ified since the
|
|
// IME transaction will hold a ref, the widget representation
|
|
// isn't persistent
|
|
//
|
|
mTextRange = new nsPrivateTextRangeList(te->rangeCount);
|
|
if (mTextRange) {
|
|
uint16_t i;
|
|
|
|
for(i = 0; i < te->rangeCount; i++) {
|
|
nsRefPtr<nsPrivateTextRange> tempPrivateTextRange = new
|
|
nsPrivateTextRange(te->rangeArray[i]);
|
|
|
|
if (tempPrivateTextRange) {
|
|
mTextRange->AppendTextRange(tempPrivateTextRange);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
NS_IMPL_ADDREF_INHERITED(nsDOMTextEvent, nsDOMUIEvent)
|
|
NS_IMPL_RELEASE_INHERITED(nsDOMTextEvent, nsDOMUIEvent)
|
|
|
|
NS_INTERFACE_MAP_BEGIN(nsDOMTextEvent)
|
|
NS_INTERFACE_MAP_ENTRY(nsIPrivateTextEvent)
|
|
NS_INTERFACE_MAP_END_INHERITING(nsDOMUIEvent)
|
|
|
|
NS_METHOD nsDOMTextEvent::GetText(nsString& aText)
|
|
{
|
|
aText = mText;
|
|
return NS_OK;
|
|
}
|
|
|
|
NS_METHOD_(already_AddRefed<nsIPrivateTextRangeList>) nsDOMTextEvent::GetInputRange()
|
|
{
|
|
if (mEvent->message == NS_TEXT_TEXT) {
|
|
nsRefPtr<nsPrivateTextRangeList> textRange = mTextRange;
|
|
return textRange.forget();
|
|
}
|
|
return nullptr;
|
|
}
|
|
|
|
nsresult NS_NewDOMTextEvent(nsIDOMEvent** aInstancePtrResult,
|
|
mozilla::dom::EventTarget* aOwner,
|
|
nsPresContext* aPresContext,
|
|
WidgetTextEvent* aEvent)
|
|
{
|
|
nsDOMTextEvent* it = new nsDOMTextEvent(aOwner, aPresContext, aEvent);
|
|
return CallQueryInterface(it, aInstancePtrResult);
|
|
}
|