From be9b8947d0090e20116822fe7caf5e7973d6b20a Mon Sep 17 00:00:00 2001 From: dsinclair Date: Wed, 18 May 2016 06:09:33 -0700 Subject: Pass objects instead of strings for undo/redo records. Currently the Undo/Redo records are serialized as byte strings and stored into a CFX_ByteStringArray. They are deserialized when used. This CL removes the serialization and stores the objects in a deque of unique pointers. Review-Url: https://codereview.chromium.org/1980293004 --- xfa/fwl/basewidget/fwl_comboboximp.cpp | 23 ++++++++------- xfa/fwl/basewidget/fwl_comboboximp.h | 4 +-- xfa/fwl/basewidget/fwl_editimp.cpp | 51 +++++++++++++++++----------------- xfa/fwl/basewidget/fwl_editimp.h | 25 +++++++++-------- xfa/fwl/basewidget/ifwl_combobox.h | 5 ++-- xfa/fwl/basewidget/ifwl_edit.h | 5 ++-- 6 files changed, 58 insertions(+), 55 deletions(-) (limited to 'xfa/fwl/basewidget') diff --git a/xfa/fwl/basewidget/fwl_comboboximp.cpp b/xfa/fwl/basewidget/fwl_comboboximp.cpp index 81c2fa75d3..6af49d8021 100644 --- a/xfa/fwl/basewidget/fwl_comboboximp.cpp +++ b/xfa/fwl/basewidget/fwl_comboboximp.cpp @@ -69,11 +69,11 @@ FWL_Error IFWL_ComboBox::SetEditLimit(int32_t nLimit) { FWL_Error IFWL_ComboBox::EditDoClipboard(int32_t iCmd) { return static_cast(GetImpl())->EditDoClipboard(iCmd); } -FX_BOOL IFWL_ComboBox::EditRedo(const CFX_ByteStringC& bsRecord) { - return static_cast(GetImpl())->EditRedo(bsRecord); +FX_BOOL IFWL_ComboBox::EditRedo(const IFDE_TxtEdtDoRecord* pRecord) { + return static_cast(GetImpl())->EditRedo(pRecord); } -FX_BOOL IFWL_ComboBox::EditUndo(const CFX_ByteStringC& bsRecord) { - return static_cast(GetImpl())->EditUndo(bsRecord); +FX_BOOL IFWL_ComboBox::EditUndo(const IFDE_TxtEdtDoRecord* pRecord) { + return static_cast(GetImpl())->EditUndo(pRecord); } IFWL_ListBox* IFWL_ComboBox::GetListBoxt() { return static_cast(GetImpl())->GetListBoxt(); @@ -789,16 +789,15 @@ FWL_Error CFWL_ComboBoxImp::EditDoClipboard(int32_t iCmd) { return FWL_Error::Indefinite; return m_pEdit->DoClipboard(iCmd); } -FX_BOOL CFWL_ComboBoxImp::EditRedo(const CFX_ByteStringC& bsRecord) { - if (!m_pEdit) - return FALSE; - return m_pEdit->Redo(bsRecord); + +FX_BOOL CFWL_ComboBoxImp::EditRedo(const IFDE_TxtEdtDoRecord* pRecord) { + return m_pEdit && m_pEdit->Redo(pRecord); } -FX_BOOL CFWL_ComboBoxImp::EditUndo(const CFX_ByteStringC& bsRecord) { - if (!m_pEdit) - return FALSE; - return m_pEdit->Undo(bsRecord); + +FX_BOOL CFWL_ComboBoxImp::EditUndo(const IFDE_TxtEdtDoRecord* pRecord) { + return m_pEdit && m_pEdit->Undo(pRecord); } + IFWL_ListBox* CFWL_ComboBoxImp::GetListBoxt() { return m_pListBox.get(); } diff --git a/xfa/fwl/basewidget/fwl_comboboximp.h b/xfa/fwl/basewidget/fwl_comboboximp.h index 45cb47d321..42452e6871 100644 --- a/xfa/fwl/basewidget/fwl_comboboximp.h +++ b/xfa/fwl/basewidget/fwl_comboboximp.h @@ -117,8 +117,8 @@ class CFWL_ComboBoxImp : public CFWL_WidgetImp { int32_t GetEditLimit(); FWL_Error SetEditLimit(int32_t nLimit); FWL_Error EditDoClipboard(int32_t iCmd); - FX_BOOL EditRedo(const CFX_ByteStringC& bsRecord); - FX_BOOL EditUndo(const CFX_ByteStringC& bsRecord); + FX_BOOL EditRedo(const IFDE_TxtEdtDoRecord* pRecord); + FX_BOOL EditUndo(const IFDE_TxtEdtDoRecord* pRecord); IFWL_ListBox* GetListBoxt(); FX_BOOL AfterFocusShowDropList(); FWL_Error OpenDropDownList(FX_BOOL bActivate); diff --git a/xfa/fwl/basewidget/fwl_editimp.cpp b/xfa/fwl/basewidget/fwl_editimp.cpp index 1e0fede4be..2d7d50580d 100644 --- a/xfa/fwl/basewidget/fwl_editimp.cpp +++ b/xfa/fwl/basewidget/fwl_editimp.cpp @@ -148,11 +148,11 @@ FX_BOOL IFWL_Edit::Paste(const CFX_WideString& wsPaste) { FX_BOOL IFWL_Edit::Delete() { return static_cast(GetImpl())->Delete(); } -FX_BOOL IFWL_Edit::Redo(const CFX_ByteStringC& bsRecord) { - return static_cast(GetImpl())->Redo(bsRecord); +FX_BOOL IFWL_Edit::Redo(const IFDE_TxtEdtDoRecord* pRecord) { + return static_cast(GetImpl())->Redo(pRecord); } -FX_BOOL IFWL_Edit::Undo(const CFX_ByteStringC& bsRecord) { - return static_cast(GetImpl())->Undo(bsRecord); +FX_BOOL IFWL_Edit::Undo(const IFDE_TxtEdtDoRecord* pRecord) { + return static_cast(GetImpl())->Undo(pRecord); } FX_BOOL IFWL_Edit::Undo() { return static_cast(GetImpl())->Undo(); @@ -749,36 +749,32 @@ FX_BOOL CFWL_EditImp::Delete() { return TRUE; } -FX_BOOL CFWL_EditImp::Redo(const CFX_ByteStringC& bsRecord) { +FX_BOOL CFWL_EditImp::Redo(const IFDE_TxtEdtDoRecord* pRecord) { if (!m_pEdtEngine) return FALSE; if (m_pProperties->m_dwStyleExes & FWL_STYLEEXT_EDT_NoRedoUndo) return TRUE; - return m_pEdtEngine->Redo(bsRecord); + return m_pEdtEngine->Redo(pRecord); } -FX_BOOL CFWL_EditImp::Undo(const CFX_ByteStringC& bsRecord) { +FX_BOOL CFWL_EditImp::Undo(const IFDE_TxtEdtDoRecord* pRecord) { if (!m_pEdtEngine) return FALSE; if (m_pProperties->m_dwStyleExes & FWL_STYLEEXT_EDT_NoRedoUndo) return TRUE; - return m_pEdtEngine->Undo(bsRecord); + return m_pEdtEngine->Undo(pRecord); } FX_BOOL CFWL_EditImp::Undo() { if (!CanUndo()) return FALSE; - - CFX_ByteString bsRecord = m_RecordArr[m_iCurRecord--]; - return Undo(bsRecord.AsStringC()); + return Undo(m_DoRecords[m_iCurRecord--].get()); } FX_BOOL CFWL_EditImp::Redo() { if (!CanRedo()) return FALSE; - - CFX_ByteString bsRecord = m_RecordArr[++m_iCurRecord]; - return Redo(bsRecord.AsStringC()); + return Redo(m_DoRecords[++m_iCurRecord].get()); } FX_BOOL CFWL_EditImp::CanUndo() { @@ -786,7 +782,7 @@ FX_BOOL CFWL_EditImp::CanUndo() { } FX_BOOL CFWL_EditImp::CanRedo() { - return m_iCurRecord < m_RecordArr.GetSize() - 1; + return m_iCurRecord < m_DoRecords.size() - 1; } FWL_Error CFWL_EditImp::SetTabWidth(FX_FLOAT fTabWidth, FX_BOOL bEquidistant) { @@ -931,8 +927,8 @@ FX_BOOL CFWL_EditImp::On_PageUnload(CFDE_TxtEdtEngine* pEdit, } void CFWL_EditImp::On_AddDoRecord(CFDE_TxtEdtEngine* pEdit, - const CFX_ByteStringC& bsDoRecord) { - AddDoRecord(bsDoRecord); + IFDE_TxtEdtDoRecord* pRecord) { + AddDoRecord(pRecord); } FX_BOOL CFWL_EditImp::On_Validate(CFDE_TxtEdtEngine* pEdit, @@ -1468,20 +1464,21 @@ FX_BOOL CFWL_EditImp::IsContentHeightOverflow() { return FALSE; return pPage->GetContentsBox().height > m_rtEngine.height + 1.0f; } -int32_t CFWL_EditImp::AddDoRecord(const CFX_ByteStringC& bsDoRecord) { - int32_t nCount = m_RecordArr.GetSize(); +int32_t CFWL_EditImp::AddDoRecord(IFDE_TxtEdtDoRecord* pRecord) { + int32_t nCount = m_DoRecords.size(); if (m_iCurRecord == nCount - 1) { if (nCount == m_iMaxRecord) { - m_RecordArr.RemoveAt(0); + m_DoRecords.pop_front(); m_iCurRecord--; } } else { - for (int32_t i = nCount - 1; i > m_iCurRecord; i--) { - m_RecordArr.RemoveAt(i); - } + m_DoRecords.erase(m_DoRecords.begin() + m_iCurRecord + 1, + m_DoRecords.end()); } - m_RecordArr.Add(CFX_ByteString(bsDoRecord)); - return m_iCurRecord = m_RecordArr.GetSize() - 1; + + m_DoRecords.push_back(std::unique_ptr(pRecord)); + m_iCurRecord = m_DoRecords.size() - 1; + return m_iCurRecord; } void CFWL_EditImp::Layout() { GetClientRect(m_rtClient); @@ -1736,10 +1733,12 @@ void CFWL_EditImp::InitCaret() { m_pCaret.reset(); } } + void CFWL_EditImp::ClearRecord() { m_iCurRecord = -1; - m_RecordArr.RemoveAll(); + m_DoRecords.clear(); } + void CFWL_EditImp::ProcessInsertError(int32_t iError) { switch (iError) { case -2: { diff --git a/xfa/fwl/basewidget/fwl_editimp.h b/xfa/fwl/basewidget/fwl_editimp.h index 9c0853b4fd..484c1f8841 100644 --- a/xfa/fwl/basewidget/fwl_editimp.h +++ b/xfa/fwl/basewidget/fwl_editimp.h @@ -7,6 +7,7 @@ #ifndef XFA_FWL_BASEWIDGET_FWL_EDITIMP_H_ #define XFA_FWL_BASEWIDGET_FWL_EDITIMP_H_ +#include #include #include @@ -15,14 +16,15 @@ #include "xfa/fwl/core/fwl_widgetimp.h" #include "xfa/fxgraphics/cfx_path.h" +class CFWL_EditImp; +class CFWL_EditImpDelegate; class CFWL_MsgActivate; class CFWL_MsgDeactivate; class CFWL_MsgMouse; -class CFWL_WidgetImpProperties; class CFWL_WidgetImpDelegate; +class CFWL_WidgetImpProperties; +class IFDE_TxtEdtDoRecord; class IFWL_Caret; -class CFWL_EditImp; -class CFWL_EditImpDelegate; class CFWL_EditImp : public CFWL_WidgetImp { public: @@ -71,8 +73,8 @@ class CFWL_EditImp : public CFWL_WidgetImp { virtual FX_BOOL Cut(CFX_WideString& wsCut); virtual FX_BOOL Paste(const CFX_WideString& wsPaste); virtual FX_BOOL Delete(); - virtual FX_BOOL Redo(const CFX_ByteStringC& bsRecord); - virtual FX_BOOL Undo(const CFX_ByteStringC& bsRecord); + virtual FX_BOOL Redo(const IFDE_TxtEdtDoRecord* pRecord); + virtual FX_BOOL Undo(const IFDE_TxtEdtDoRecord* pRecord); virtual FX_BOOL Undo(); virtual FX_BOOL Redo(); virtual FX_BOOL CanUndo(); @@ -95,8 +97,7 @@ class CFWL_EditImp : public CFWL_WidgetImp { FX_BOOL On_PageUnload(CFDE_TxtEdtEngine* pEdit, int32_t nPageIndex, int32_t nPurpose); - void On_AddDoRecord(CFDE_TxtEdtEngine* pEdit, - const CFX_ByteStringC& bsDoRecord); + void On_AddDoRecord(CFDE_TxtEdtEngine* pEdit, IFDE_TxtEdtDoRecord* pRecord); FX_BOOL On_Validate(CFDE_TxtEdtEngine* pEdit, CFX_WideString& wsText); void SetScrollOffset(FX_FLOAT fScrollOffset); FX_BOOL GetSuggestWords(CFX_PointF pointf, @@ -105,6 +106,9 @@ class CFWL_EditImp : public CFWL_WidgetImp { const CFX_ByteStringC& bsReplace); protected: + friend class CFWL_TxtEdtEventSink; + friend class CFWL_EditImpDelegate; + void DrawTextBk(CFX_Graphics* pGraphics, IFWL_ThemeProvider* pTheme, const CFX_Matrix* pMatrix = NULL); @@ -130,7 +134,7 @@ class CFWL_EditImp : public CFWL_WidgetImp { void ClearRecord(); FX_BOOL IsShowScrollBar(FX_BOOL bVert); FX_BOOL IsContentHeightOverflow(); - int32_t AddDoRecord(const CFX_ByteStringC& bsDoRecord); + int32_t AddDoRecord(IFDE_TxtEdtDoRecord* pRecord); void ProcessInsertError(int32_t iError); void DrawSpellCheck(CFX_Graphics* pGraphics, @@ -141,6 +145,7 @@ class CFWL_EditImp : public CFWL_WidgetImp { FX_FLOAT fOffSetX, FX_FLOAT fOffSetY); int32_t GetWordAtPoint(CFX_PointF pointf, int32_t& nCount); + CFX_RectF m_rtClient; CFX_RectF m_rtEngine; CFX_RectF m_rtStatic; @@ -162,12 +167,10 @@ class CFWL_EditImp : public CFWL_WidgetImp { std::unique_ptr m_pHorzScrollBar; std::unique_ptr m_pCaret; CFX_WideString m_wsCache; - friend class CFWL_TxtEdtEventSink; - friend class CFWL_EditImpDelegate; uint32_t m_backColor; FX_BOOL m_updateBackColor; CFX_WideString m_wsFont; - CFX_ByteStringArray m_RecordArr; + std::deque> m_DoRecords; int32_t m_iCurRecord; int32_t m_iMaxRecord; }; diff --git a/xfa/fwl/basewidget/ifwl_combobox.h b/xfa/fwl/basewidget/ifwl_combobox.h index 916e60b5bb..9755fc7686 100644 --- a/xfa/fwl/basewidget/ifwl_combobox.h +++ b/xfa/fwl/basewidget/ifwl_combobox.h @@ -11,6 +11,7 @@ #include "xfa/fxgraphics/include/cfx_graphics.h" class CFWL_WidgetImpProperties; +class IFDE_TxtEdtDoRecord; class IFWL_ComboBox; #define FWL_CLASS_ComboBox L"FWL_COMBOBOX" @@ -90,8 +91,8 @@ class IFWL_ComboBox : public IFWL_Widget { int32_t GetEditLimit(); FWL_Error SetEditLimit(int32_t nLimit); FWL_Error EditDoClipboard(int32_t iCmd); - FX_BOOL EditRedo(const CFX_ByteStringC& bsRecord); - FX_BOOL EditUndo(const CFX_ByteStringC& bsRecord); + FX_BOOL EditRedo(const IFDE_TxtEdtDoRecord* pRecord); + FX_BOOL EditUndo(const IFDE_TxtEdtDoRecord* pRecord); IFWL_ListBox* GetListBoxt(); FX_BOOL AfterFocusShowDropList(); FWL_Error OpenDropDownList(FX_BOOL bActivate); diff --git a/xfa/fwl/basewidget/ifwl_edit.h b/xfa/fwl/basewidget/ifwl_edit.h index 5650bce4dc..4cd0ab2d88 100644 --- a/xfa/fwl/basewidget/ifwl_edit.h +++ b/xfa/fwl/basewidget/ifwl_edit.h @@ -91,6 +91,7 @@ std::vector bsArraySuggestWords; END_FWL_EVENT_DEF class CFWL_WidgetImpProperties; +class IFDE_TxtEdtDoRecord; class IFWL_EditDP : public IFWL_DataProvider {}; @@ -128,8 +129,8 @@ class IFWL_Edit : public IFWL_Widget { FX_BOOL Cut(CFX_WideString& wsCut); FX_BOOL Paste(const CFX_WideString& wsPaste); FX_BOOL Delete(); - FX_BOOL Redo(const CFX_ByteStringC& bsRecord); - FX_BOOL Undo(const CFX_ByteStringC& bsRecord); + FX_BOOL Redo(const IFDE_TxtEdtDoRecord* pRecord); + FX_BOOL Undo(const IFDE_TxtEdtDoRecord* pRecord); FX_BOOL Undo(); FX_BOOL Redo(); FX_BOOL CanUndo(); -- cgit v1.2.3