sw/inc/fesh.hxx | 2 ++ sw/qa/extras/uiwriter/data/tdf84695.odt |binary sw/qa/extras/uiwriter/uiwriter.cxx | 25 +++++++++++++++++++++++++ sw/source/core/frmedt/feshview.cxx | 25 ++++++++++++++----------- sw/source/uibase/docvw/edtwin.cxx | 28 ++++++++++++++++++++++++++++ 5 files changed, 69 insertions(+), 11 deletions(-)
New commits: commit 79509573b8666c18027f1e642d9bdadd88c3fcc6 Author: Miklos Vajna <vmik...@collabora.co.uk> Date: Tue Apr 5 09:45:21 2016 +0200 tdf#84695 sw: make TextBox in shape accessible without mouse F2 or Enter can now switch to text edit mode. Change-Id: I1aea09bd2fc4fa64db49b2037894082fe33af934 Reviewed-on: https://gerrit.libreoffice.org/23836 Reviewed-by: Miklos Vajna <vmik...@collabora.co.uk> Tested-by: Jenkins <c...@libreoffice.org> (cherry picked from commit ab450ee1ca2bee69cba752045781a3298311b181) Reviewed-on: https://gerrit.libreoffice.org/24080 Reviewed-by: Michael Stahl <mst...@redhat.com> diff --git a/sw/inc/fesh.hxx b/sw/inc/fesh.hxx index f036728..5821cb1 100644 --- a/sw/inc/fesh.hxx +++ b/sw/inc/fesh.hxx @@ -171,6 +171,8 @@ enum class SwPasteSdr #define SW_ADD_SELECT 1 #define SW_ENTER_GROUP 2 #define SW_LEAVE_FRAME 4 +/// Allow SwFEShell::SelectObj() to select the TextBox of a shape. +#define SW_ALLOW_TEXTBOX 8 enum class SwMove { diff --git a/sw/qa/extras/uiwriter/data/tdf84695.odt b/sw/qa/extras/uiwriter/data/tdf84695.odt new file mode 100644 index 0000000..f8c3b01 Binary files /dev/null and b/sw/qa/extras/uiwriter/data/tdf84695.odt differ diff --git a/sw/qa/extras/uiwriter/uiwriter.cxx b/sw/qa/extras/uiwriter/uiwriter.cxx index 246201e..c4adc56 100644 --- a/sw/qa/extras/uiwriter/uiwriter.cxx +++ b/sw/qa/extras/uiwriter/uiwriter.cxx @@ -184,6 +184,7 @@ public: void testTdf88453Table(); void testTdf98987(); void testTdf99004(); + void testTdf84695(); CPPUNIT_TEST_SUITE(SwUiWriterTest); CPPUNIT_TEST(testReplaceForward); @@ -274,6 +275,7 @@ public: CPPUNIT_TEST(testTdf88453Table); CPPUNIT_TEST(testTdf98987); CPPUNIT_TEST(testTdf99004); + CPPUNIT_TEST(testTdf84695); CPPUNIT_TEST_SUITE_END(); private: @@ -3159,6 +3161,29 @@ void SwUiWriterTest::testTdf99004() CPPUNIT_ASSERT(nTextBox1Bottom < nRectangle2Top); } +void SwUiWriterTest::testTdf84695() +{ + SwDoc* pDoc = createDoc("tdf84695.odt"); + SwWrtShell* pWrtShell = pDoc->GetDocShell()->GetWrtShell(); + SdrPage* pPage = pDoc->getIDocumentDrawModelAccess().GetDrawModel()->GetPage(0); + SdrObject* pObject = pPage->GetObj(1); + SwContact* pTextBox = static_cast<SwContact*>(pObject->GetUserCall()); + // First, make sure that pTextBox is a fly frame (textbox of a shape). + CPPUNIT_ASSERT_EQUAL(RES_FLYFRMFMT, static_cast<RES_FMT>(pTextBox->GetFormat()->Which())); + + // Then select it. + pWrtShell->SelectObj(Point(), 0, pObject); + + // Now Enter + a key should add some text. + SwXTextDocument* pXTextDocument = dynamic_cast<SwXTextDocument *>(mxComponent.get()); + pXTextDocument->postKeyEvent(LOK_KEYEVENT_KEYINPUT, 0, KEY_RETURN); + pXTextDocument->postKeyEvent(LOK_KEYEVENT_KEYINPUT, 'a', 0); + + uno::Reference<text::XTextRange> xShape(getShape(1), uno::UNO_QUERY); + // This was empty, Enter did not start the fly frame edit mode. + CPPUNIT_ASSERT_EQUAL(OUString("a"), xShape->getString()); +} + CPPUNIT_TEST_SUITE_REGISTRATION(SwUiWriterTest); CPPUNIT_PLUGIN_IMPLEMENT(); diff --git a/sw/source/core/frmedt/feshview.cxx b/sw/source/core/frmedt/feshview.cxx index 4526f4e..6e2917e 100644 --- a/sw/source/core/frmedt/feshview.cxx +++ b/sw/source/core/frmedt/feshview.cxx @@ -228,19 +228,22 @@ bool SwFEShell::SelectObj( const Point& rPt, sal_uInt8 nFlag, SdrObject *pObj ) } } - // If the fly frame is a textbox of a shape, then select the shape instead. - std::map<SwFrameFormat*, SwFrameFormat*> aTextBoxShapes = SwTextBoxHelper::findShapes(mpDoc); - for (size_t i = 0; i < rMrkList.GetMarkCount(); ++i) + if (!(nFlag & SW_ALLOW_TEXTBOX)) { - SdrObject* pObject = rMrkList.GetMark(i)->GetMarkedSdrObj(); - SwContact* pDrawContact = static_cast<SwContact*>(GetUserCall(pObject)); - SwFrameFormat* pFormat = pDrawContact->GetFormat(); - if (aTextBoxShapes.find(pFormat) != aTextBoxShapes.end()) + // If the fly frame is a textbox of a shape, then select the shape instead. + std::map<SwFrameFormat*, SwFrameFormat*> aTextBoxShapes = SwTextBoxHelper::findShapes(mpDoc); + for (size_t i = 0; i < rMrkList.GetMarkCount(); ++i) { - SdrObject* pShape = aTextBoxShapes[pFormat]->FindSdrObject(); - pDView->UnmarkAll(); - pDView->MarkObj(pShape, Imp()->GetPageView(), bAddSelect, bEnterGroup); - break; + SdrObject* pObject = rMrkList.GetMark(i)->GetMarkedSdrObj(); + SwContact* pDrawContact = static_cast<SwContact*>(GetUserCall(pObject)); + SwFrameFormat* pFormat = pDrawContact->GetFormat(); + if (aTextBoxShapes.find(pFormat) != aTextBoxShapes.end()) + { + SdrObject* pShape = aTextBoxShapes[pFormat]->FindSdrObject(); + pDView->UnmarkAll(); + pDView->MarkObj(pShape, Imp()->GetPageView(), bAddSelect, bEnterGroup); + break; + } } } diff --git a/sw/source/uibase/docvw/edtwin.cxx b/sw/source/uibase/docvw/edtwin.cxx index f83359d..48ccdf2 100644 --- a/sw/source/uibase/docvw/edtwin.cxx +++ b/sw/source/uibase/docvw/edtwin.cxx @@ -199,6 +199,26 @@ extern bool g_bExecuteDrag; static SfxShell* lcl_GetTextShellFromDispatcher( SwView& rView ); +/// Check if the selected shape has a TextBox: if so, go into that instead. +static bool lcl_goIntoTextBox(SwEditWin& rEditWin, SwWrtShell& rSh) +{ + SdrObject* pSdrObject = rSh.GetDrawView()->GetMarkedObjectList().GetMark(0)->GetMarkedSdrObj(); + SwFrameFormat* pObjectFormat = ::FindFrameFormat(pSdrObject); + if (SwFrameFormat* pTextBoxFormat = SwTextBoxHelper::findTextBox(pObjectFormat)) + { + SdrObject* pTextBox = pTextBoxFormat->FindRealSdrObject(); + SdrView* pSdrView = rSh.GetDrawView(); + // Unmark the shape. + pSdrView->UnmarkAllObj(); + // Mark the textbox. + rSh.SelectObj(Point(), SW_ALLOW_TEXTBOX, pTextBox); + // Clear the DrawFuncPtr. + rEditWin.StopInsFrame(); + return true; + } + return false; +} + class SwAnchorMarker { SdrHdl* pHdl; @@ -1888,7 +1908,11 @@ KEYINPUT_CHECKTABLE_INSDEL: else if((nSelectionType & nsSelectionType::SEL_DRW) && 0 == (nSelectionType & nsSelectionType::SEL_DRW_TXT) && rSh.GetDrawView()->GetMarkedObjectList().GetMarkCount() == 1) + { eKeyState = KS_GoIntoDrawing; + if (lcl_goIntoTextBox(*this, rSh)) + eKeyState = KS_GoIntoFly; + } else if( aTmpQHD.HasContent() && !rSh.HasSelection() && aTmpQHD.m_bIsAutoText ) eKeyState = KS_GlossaryExpand; @@ -2180,7 +2204,11 @@ KEYINPUT_CHECKTABLE_INSDEL: if(nSelectionType & nsSelectionType::SEL_FRM) eKeyState = KS_GoIntoFly; else if((nSelectionType & nsSelectionType::SEL_DRW)) + { eKeyState = KS_GoIntoDrawing; + if (lcl_goIntoTextBox(*this, rSh)) + eKeyState = KS_GoIntoFly; + } } break; } _______________________________________________ Libreoffice-commits mailing list libreoffice-comm...@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/libreoffice-commits