| Index: fpdfsdk/pdfwindow/PWL_Wnd.cpp
|
| diff --git a/fpdfsdk/pdfwindow/PWL_Wnd.cpp b/fpdfsdk/pdfwindow/PWL_Wnd.cpp
|
| index 78a4363aa557784d2e12f1321f9e1708345e2a19..c9dc89c07e03c7c00176b13ebfbad2fd7260f1de 100644
|
| --- a/fpdfsdk/pdfwindow/PWL_Wnd.cpp
|
| +++ b/fpdfsdk/pdfwindow/PWL_Wnd.cpp
|
| @@ -270,27 +270,23 @@ void CPWL_Wnd::InvalidateProvider(IPWL_Provider* provider) {
|
|
|
| void CPWL_Wnd::Destroy() {
|
| KillFocus();
|
| -
|
| OnDestroy();
|
| -
|
| if (m_bCreated) {
|
| - for (int32_t i = m_aChildren.GetSize() - 1; i >= 0; i--) {
|
| - if (CPWL_Wnd* pChild = m_aChildren[i]) {
|
| + for (auto it = m_Children.rbegin(); it != m_Children.rend(); ++it) {
|
| + if (CPWL_Wnd* pChild = *it) {
|
| + *it = nullptr;
|
| pChild->Destroy();
|
| delete pChild;
|
| - pChild = nullptr;
|
| }
|
| }
|
| -
|
| if (m_sPrivateParam.pParentWnd)
|
| m_sPrivateParam.pParentWnd->OnNotify(this, PNM_REMOVECHILD);
|
| +
|
| m_bCreated = false;
|
| }
|
| -
|
| DestroyMsgControl();
|
| -
|
| FXSYS_memset(&m_sPrivateParam, 0, sizeof(PWL_CREATEPARAM));
|
| - m_aChildren.RemoveAll();
|
| + m_Children.clear();
|
| m_pVScrollBar = nullptr;
|
| }
|
|
|
| @@ -352,10 +348,9 @@ void CPWL_Wnd::GetThisAppearanceStream(CFX_ByteTextBuf& sAppStream) {
|
| }
|
|
|
| void CPWL_Wnd::GetChildAppearanceStream(CFX_ByteTextBuf& sAppStream) {
|
| - for (int32_t i = 0, sz = m_aChildren.GetSize(); i < sz; i++) {
|
| - if (CPWL_Wnd* pChild = m_aChildren.GetAt(i)) {
|
| + for (CPWL_Wnd* pChild : m_Children) {
|
| + if (pChild)
|
| pChild->GetAppearanceStream(sAppStream);
|
| - }
|
| }
|
| }
|
|
|
| @@ -389,15 +384,16 @@ void CPWL_Wnd::DrawThisAppearance(CFX_RenderDevice* pDevice,
|
|
|
| void CPWL_Wnd::DrawChildAppearance(CFX_RenderDevice* pDevice,
|
| CFX_Matrix* pUser2Device) {
|
| - for (int32_t i = 0, sz = m_aChildren.GetSize(); i < sz; i++) {
|
| - if (CPWL_Wnd* pChild = m_aChildren.GetAt(i)) {
|
| - CFX_Matrix mt = pChild->GetChildMatrix();
|
| - if (mt.IsIdentity()) {
|
| - pChild->DrawAppearance(pDevice, pUser2Device);
|
| - } else {
|
| - mt.Concat(*pUser2Device);
|
| - pChild->DrawAppearance(pDevice, &mt);
|
| - }
|
| + for (CPWL_Wnd* pChild : m_Children) {
|
| + if (!pChild)
|
| + continue;
|
| +
|
| + CFX_Matrix mt = pChild->GetChildMatrix();
|
| + if (mt.IsIdentity()) {
|
| + pChild->DrawAppearance(pDevice, pUser2Device);
|
| + } else {
|
| + mt.Concat(*pUser2Device);
|
| + pChild->DrawAppearance(pDevice, &mt);
|
| }
|
| }
|
| }
|
| @@ -426,55 +422,48 @@ void CPWL_Wnd::InvalidateRect(CFX_FloatRect* pRect) {
|
| }
|
| }
|
|
|
| -#define PWL_IMPLEMENT_KEY_METHOD(key_method_name) \
|
| - bool CPWL_Wnd::key_method_name(uint16_t nChar, uint32_t nFlag) { \
|
| - if (IsValid() && IsVisible() && IsEnabled()) { \
|
| - if (IsWndCaptureKeyboard(this)) { \
|
| - for (int32_t i = 0, sz = m_aChildren.GetSize(); i < sz; i++) { \
|
| - if (CPWL_Wnd* pChild = m_aChildren.GetAt(i)) { \
|
| - if (IsWndCaptureKeyboard(pChild)) { \
|
| - return pChild->key_method_name(nChar, nFlag); \
|
| - } \
|
| - } \
|
| - } \
|
| - } \
|
| - } \
|
| - return false; \
|
| - }
|
| -
|
| -#define PWL_IMPLEMENT_MOUSE_METHOD(mouse_method_name) \
|
| - bool CPWL_Wnd::mouse_method_name(const CFX_FloatPoint& point, \
|
| - uint32_t nFlag) { \
|
| - if (IsValid() && IsVisible() && IsEnabled()) { \
|
| - if (IsWndCaptureMouse(this)) { \
|
| - for (int32_t i = 0, sz = m_aChildren.GetSize(); i < sz; i++) { \
|
| - if (CPWL_Wnd* pChild = m_aChildren.GetAt(i)) { \
|
| - if (IsWndCaptureMouse(pChild)) { \
|
| - return pChild->mouse_method_name(pChild->ParentToChild(point), \
|
| - nFlag); \
|
| - } \
|
| - } \
|
| - } \
|
| - SetCursor(); \
|
| - } else { \
|
| - for (int32_t i = 0, sz = m_aChildren.GetSize(); i < sz; i++) { \
|
| - if (CPWL_Wnd* pChild = m_aChildren.GetAt(i)) { \
|
| - if (pChild->WndHitTest(pChild->ParentToChild(point))) { \
|
| - return pChild->mouse_method_name(pChild->ParentToChild(point), \
|
| - nFlag); \
|
| - } \
|
| - } \
|
| - } \
|
| - if (WndHitTest(point)) \
|
| - SetCursor(); \
|
| - } \
|
| - } \
|
| - return false; \
|
| +#define PWL_IMPLEMENT_KEY_METHOD(key_method_name) \
|
| + bool CPWL_Wnd::key_method_name(uint16_t nChar, uint32_t nFlag) { \
|
| + if (!IsValid() || !IsVisible() || !IsEnabled()) \
|
| + return false; \
|
| + if (!IsWndCaptureKeyboard(this)) \
|
| + return false; \
|
| + for (const auto& pChild : m_Children) { \
|
| + if (pChild && IsWndCaptureKeyboard(pChild)) \
|
| + return pChild->key_method_name(nChar, nFlag); \
|
| + } \
|
| + return false; \
|
| }
|
|
|
| PWL_IMPLEMENT_KEY_METHOD(OnKeyDown)
|
| PWL_IMPLEMENT_KEY_METHOD(OnKeyUp)
|
| PWL_IMPLEMENT_KEY_METHOD(OnChar)
|
| +#undef PWL_IMPLEMENT_KEY_METHOD
|
| +
|
| +#define PWL_IMPLEMENT_MOUSE_METHOD(mouse_method_name) \
|
| + bool CPWL_Wnd::mouse_method_name(const CFX_FloatPoint& point, \
|
| + uint32_t nFlag) { \
|
| + if (!IsValid() || !IsVisible() || !IsEnabled()) \
|
| + return false; \
|
| + if (IsWndCaptureMouse(this)) { \
|
| + for (const auto& pChild : m_Children) { \
|
| + if (pChild && IsWndCaptureMouse(pChild)) { \
|
| + return pChild->mouse_method_name(pChild->ParentToChild(point), \
|
| + nFlag); \
|
| + } \
|
| + } \
|
| + SetCursor(); \
|
| + return false; \
|
| + } \
|
| + for (const auto& pChild : m_Children) { \
|
| + if (pChild && pChild->WndHitTest(pChild->ParentToChild(point))) { \
|
| + return pChild->mouse_method_name(pChild->ParentToChild(point), nFlag); \
|
| + } \
|
| + } \
|
| + if (WndHitTest(point)) \
|
| + SetCursor(); \
|
| + return false; \
|
| + }
|
|
|
| PWL_IMPLEMENT_MOUSE_METHOD(OnLButtonDblClk)
|
| PWL_IMPLEMENT_MOUSE_METHOD(OnLButtonDown)
|
| @@ -485,37 +474,34 @@ PWL_IMPLEMENT_MOUSE_METHOD(OnMButtonUp)
|
| PWL_IMPLEMENT_MOUSE_METHOD(OnRButtonDown)
|
| PWL_IMPLEMENT_MOUSE_METHOD(OnRButtonUp)
|
| PWL_IMPLEMENT_MOUSE_METHOD(OnMouseMove)
|
| +#undef PWL_IMPLEMENT_MOUSE_METHOD
|
|
|
| bool CPWL_Wnd::OnMouseWheel(short zDelta,
|
| const CFX_FloatPoint& point,
|
| uint32_t nFlag) {
|
| - if (IsValid() && IsVisible() && IsEnabled()) {
|
| - SetCursor();
|
| - if (IsWndCaptureKeyboard(this)) {
|
| - for (int32_t i = 0, sz = m_aChildren.GetSize(); i < sz; i++) {
|
| - if (CPWL_Wnd* pChild = m_aChildren.GetAt(i)) {
|
| - if (IsWndCaptureKeyboard(pChild)) {
|
| - return pChild->OnMouseWheel(zDelta, pChild->ParentToChild(point),
|
| - nFlag);
|
| - }
|
| - }
|
| - }
|
| - }
|
| + if (!IsValid() || !IsVisible() || !IsEnabled())
|
| + return false;
|
| +
|
| + SetCursor();
|
| + if (!IsWndCaptureKeyboard(this))
|
| + return false;
|
| +
|
| + for (const auto& pChild : m_Children) {
|
| + if (pChild && IsWndCaptureKeyboard(pChild))
|
| + return pChild->OnMouseWheel(zDelta, pChild->ParentToChild(point), nFlag);
|
| }
|
| return false;
|
| }
|
|
|
| void CPWL_Wnd::AddChild(CPWL_Wnd* pWnd) {
|
| - m_aChildren.Add(pWnd);
|
| + m_Children.push_back(pWnd);
|
| }
|
|
|
| void CPWL_Wnd::RemoveChild(CPWL_Wnd* pWnd) {
|
| - for (int32_t i = m_aChildren.GetSize() - 1; i >= 0; i--) {
|
| - if (CPWL_Wnd* pChild = m_aChildren.GetAt(i)) {
|
| - if (pChild == pWnd) {
|
| - m_aChildren.RemoveAt(i);
|
| - break;
|
| - }
|
| + for (auto it = m_Children.rbegin(); it != m_Children.rend(); ++it) {
|
| + if (*it && *it == pWnd) {
|
| + m_Children.erase(std::next(it).base());
|
| + break;
|
| }
|
| }
|
| }
|
| @@ -675,10 +661,10 @@ void CPWL_Wnd::SetCapture() {
|
| }
|
|
|
| void CPWL_Wnd::ReleaseCapture() {
|
| - for (int32_t i = 0, sz = m_aChildren.GetSize(); i < sz; i++)
|
| - if (CPWL_Wnd* pChild = m_aChildren.GetAt(i))
|
| + for (const auto& pChild : m_Children) {
|
| + if (pChild)
|
| pChild->ReleaseCapture();
|
| -
|
| + }
|
| if (CPWL_MsgControl* pMsgCtrl = GetMsgControl())
|
| pMsgCtrl->ReleaseCapture();
|
| }
|
| @@ -718,18 +704,17 @@ const CPWL_Wnd* CPWL_Wnd::GetRootWnd() const {
|
| }
|
|
|
| void CPWL_Wnd::SetVisible(bool bVisible) {
|
| - if (IsValid()) {
|
| - for (int32_t i = 0, sz = m_aChildren.GetSize(); i < sz; i++) {
|
| - if (CPWL_Wnd* pChild = m_aChildren.GetAt(i)) {
|
| - pChild->SetVisible(bVisible);
|
| - }
|
| - }
|
| + if (!IsValid())
|
| + return;
|
|
|
| - if (bVisible != m_bVisible) {
|
| - m_bVisible = bVisible;
|
| - RePosChildWnd();
|
| - InvalidateRect();
|
| - }
|
| + for (const auto& pChild : m_Children) {
|
| + if (pChild)
|
| + pChild->SetVisible(bVisible);
|
| + }
|
| + if (bVisible != m_bVisible) {
|
| + m_bVisible = bVisible;
|
| + RePosChildWnd();
|
| + InvalidateRect();
|
| }
|
| }
|
|
|
| @@ -866,22 +851,17 @@ int32_t CPWL_Wnd::GetTransparency() {
|
| }
|
|
|
| void CPWL_Wnd::SetTransparency(int32_t nTransparency) {
|
| - for (int32_t i = 0, sz = m_aChildren.GetSize(); i < sz; i++) {
|
| - if (CPWL_Wnd* pChild = m_aChildren.GetAt(i)) {
|
| + for (const auto& pChild : m_Children) {
|
| + if (pChild)
|
| pChild->SetTransparency(nTransparency);
|
| - }
|
| }
|
| -
|
| m_sPrivateParam.nTransparency = nTransparency;
|
| }
|
|
|
| CFX_Matrix CPWL_Wnd::GetWindowMatrix() const {
|
| CFX_Matrix mt = GetChildToRoot();
|
| -
|
| - if (IPWL_Provider* pProvider = GetProvider()) {
|
| + if (IPWL_Provider* pProvider = GetProvider())
|
| mt.Concat(pProvider->GetWindowMatrix(GetAttachedData()));
|
| - return mt;
|
| - }
|
|
|
| return mt;
|
| }
|
| @@ -982,28 +962,23 @@ void CPWL_Wnd::SetChildMatrix(const CFX_Matrix& mt) {
|
| }
|
|
|
| const CPWL_Wnd* CPWL_Wnd::GetFocused() const {
|
| - if (CPWL_MsgControl* pMsgCtrl = GetMsgControl()) {
|
| - return pMsgCtrl->m_pMainKeyboardWnd;
|
| - }
|
| -
|
| - return nullptr;
|
| + CPWL_MsgControl* pMsgCtrl = GetMsgControl();
|
| + return pMsgCtrl ? pMsgCtrl->m_pMainKeyboardWnd : nullptr;
|
| }
|
|
|
| void CPWL_Wnd::EnableWindow(bool bEnable) {
|
| - if (m_bEnabled != bEnable) {
|
| - for (int32_t i = 0, sz = m_aChildren.GetSize(); i < sz; i++) {
|
| - if (CPWL_Wnd* pChild = m_aChildren.GetAt(i)) {
|
| - pChild->EnableWindow(bEnable);
|
| - }
|
| - }
|
| -
|
| - m_bEnabled = bEnable;
|
| + if (m_bEnabled == bEnable)
|
| + return;
|
|
|
| - if (bEnable)
|
| - OnEnabled();
|
| - else
|
| - OnDisabled();
|
| + for (const auto& pChild : m_Children) {
|
| + if (pChild)
|
| + pChild->EnableWindow(bEnable);
|
| }
|
| + m_bEnabled = bEnable;
|
| + if (bEnable)
|
| + OnEnabled();
|
| + else
|
| + OnDisabled();
|
| }
|
|
|
| bool CPWL_Wnd::IsEnabled() {
|
|
|