michael@0: /* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ michael@0: /* This Source Code Form is subject to the terms of the Mozilla Public michael@0: * License, v. 2.0. If a copy of the MPL was not distributed with this michael@0: * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ michael@0: michael@0: #include "nsQueryContentEventResult.h" michael@0: #include "nsIWidget.h" michael@0: #include "nsPoint.h" michael@0: #include "mozilla/TextEvents.h" michael@0: michael@0: using namespace mozilla; michael@0: michael@0: NS_INTERFACE_MAP_BEGIN(nsQueryContentEventResult) michael@0: NS_INTERFACE_MAP_ENTRY_AMBIGUOUS(nsISupports, nsIQueryContentEventResult) michael@0: NS_INTERFACE_MAP_ENTRY(nsIQueryContentEventResult) michael@0: NS_INTERFACE_MAP_END michael@0: michael@0: NS_IMPL_ADDREF(nsQueryContentEventResult) michael@0: NS_IMPL_RELEASE(nsQueryContentEventResult) michael@0: michael@0: nsQueryContentEventResult::nsQueryContentEventResult() : michael@0: mEventID(0), mSucceeded(false) michael@0: { michael@0: } michael@0: michael@0: nsQueryContentEventResult::~nsQueryContentEventResult() michael@0: { michael@0: } michael@0: michael@0: NS_IMETHODIMP michael@0: nsQueryContentEventResult::GetOffset(uint32_t *aOffset) michael@0: { michael@0: bool notFound; michael@0: nsresult rv = GetNotFound(¬Found); michael@0: NS_ENSURE_SUCCESS(rv, rv); michael@0: NS_ENSURE_TRUE(!notFound, NS_ERROR_NOT_AVAILABLE); michael@0: *aOffset = mOffset; michael@0: return NS_OK; michael@0: } michael@0: michael@0: static bool IsRectEnabled(uint32_t aEventID) michael@0: { michael@0: return aEventID == NS_QUERY_CARET_RECT || michael@0: aEventID == NS_QUERY_TEXT_RECT || michael@0: aEventID == NS_QUERY_EDITOR_RECT || michael@0: aEventID == NS_QUERY_CHARACTER_AT_POINT; michael@0: } michael@0: michael@0: NS_IMETHODIMP michael@0: nsQueryContentEventResult::GetReversed(bool *aReversed) michael@0: { michael@0: NS_ENSURE_TRUE(mSucceeded, NS_ERROR_NOT_AVAILABLE); michael@0: NS_ENSURE_TRUE(mEventID == NS_QUERY_SELECTED_TEXT, michael@0: NS_ERROR_NOT_AVAILABLE); michael@0: *aReversed = mReversed; michael@0: return NS_OK; michael@0: } michael@0: michael@0: NS_IMETHODIMP michael@0: nsQueryContentEventResult::GetLeft(int32_t *aLeft) michael@0: { michael@0: NS_ENSURE_TRUE(mSucceeded, NS_ERROR_NOT_AVAILABLE); michael@0: NS_ENSURE_TRUE(IsRectEnabled(mEventID), michael@0: NS_ERROR_NOT_AVAILABLE); michael@0: *aLeft = mRect.x; michael@0: return NS_OK; michael@0: } michael@0: michael@0: NS_IMETHODIMP michael@0: nsQueryContentEventResult::GetWidth(int32_t *aWidth) michael@0: { michael@0: NS_ENSURE_TRUE(mSucceeded, NS_ERROR_NOT_AVAILABLE); michael@0: NS_ENSURE_TRUE(IsRectEnabled(mEventID), michael@0: NS_ERROR_NOT_AVAILABLE); michael@0: *aWidth = mRect.width; michael@0: return NS_OK; michael@0: } michael@0: michael@0: NS_IMETHODIMP michael@0: nsQueryContentEventResult::GetTop(int32_t *aTop) michael@0: { michael@0: NS_ENSURE_TRUE(mSucceeded, NS_ERROR_NOT_AVAILABLE); michael@0: NS_ENSURE_TRUE(IsRectEnabled(mEventID), michael@0: NS_ERROR_NOT_AVAILABLE); michael@0: *aTop = mRect.y; michael@0: return NS_OK; michael@0: } michael@0: michael@0: NS_IMETHODIMP michael@0: nsQueryContentEventResult::GetHeight(int32_t *aHeight) michael@0: { michael@0: NS_ENSURE_TRUE(mSucceeded, NS_ERROR_NOT_AVAILABLE); michael@0: NS_ENSURE_TRUE(IsRectEnabled(mEventID), michael@0: NS_ERROR_NOT_AVAILABLE); michael@0: *aHeight = mRect.height; michael@0: return NS_OK; michael@0: } michael@0: michael@0: NS_IMETHODIMP michael@0: nsQueryContentEventResult::GetText(nsAString &aText) michael@0: { michael@0: NS_ENSURE_TRUE(mSucceeded, NS_ERROR_NOT_AVAILABLE); michael@0: NS_ENSURE_TRUE(mEventID == NS_QUERY_SELECTED_TEXT || michael@0: mEventID == NS_QUERY_TEXT_CONTENT, michael@0: NS_ERROR_NOT_AVAILABLE); michael@0: aText = mString; michael@0: return NS_OK; michael@0: } michael@0: michael@0: NS_IMETHODIMP michael@0: nsQueryContentEventResult::GetSucceeded(bool *aSucceeded) michael@0: { michael@0: NS_ENSURE_TRUE(mEventID != 0, NS_ERROR_NOT_INITIALIZED); michael@0: *aSucceeded = mSucceeded; michael@0: return NS_OK; michael@0: } michael@0: michael@0: NS_IMETHODIMP michael@0: nsQueryContentEventResult::GetNotFound(bool *aNotFound) michael@0: { michael@0: NS_ENSURE_TRUE(mSucceeded, NS_ERROR_NOT_AVAILABLE); michael@0: NS_ENSURE_TRUE(mEventID == NS_QUERY_SELECTED_TEXT || michael@0: mEventID == NS_QUERY_CHARACTER_AT_POINT, michael@0: NS_ERROR_NOT_AVAILABLE); michael@0: *aNotFound = (mOffset == WidgetQueryContentEvent::NOT_FOUND); michael@0: return NS_OK; michael@0: } michael@0: michael@0: void michael@0: nsQueryContentEventResult::SetEventResult(nsIWidget* aWidget, michael@0: const WidgetQueryContentEvent &aEvent) michael@0: { michael@0: mEventID = aEvent.message; michael@0: mSucceeded = aEvent.mSucceeded; michael@0: mReversed = aEvent.mReply.mReversed; michael@0: mRect = aEvent.mReply.mRect; michael@0: mOffset = aEvent.mReply.mOffset; michael@0: mString = aEvent.mReply.mString; michael@0: michael@0: if (!IsRectEnabled(mEventID) || !aWidget || !mSucceeded) { michael@0: return; michael@0: } michael@0: michael@0: nsIWidget* topWidget = aWidget->GetTopLevelWidget(); michael@0: if (!topWidget || topWidget == aWidget) { michael@0: return; michael@0: } michael@0: michael@0: // Convert the top widget related coordinates to the given widget's. michael@0: nsIntPoint offset = michael@0: aWidget->WidgetToScreenOffset() - topWidget->WidgetToScreenOffset(); michael@0: mRect.MoveBy(-offset); michael@0: }