[Libreoffice-commits] .: 2 commits - sd/source svx/source

Libreoffice Gerrit user logerrit at kemper.freedesktop.org
Sun Oct 14 12:16:51 PDT 2012


 sd/source/ui/inc/ViewShellBase.hxx  |    4 ++++
 sd/source/ui/view/ViewShellBase.cxx |   18 ++++++++++++++++++
 svx/source/dialog/fntctrl.cxx       |   18 ++++++++----------
 3 files changed, 30 insertions(+), 10 deletions(-)

New commits:
commit 3d1f4649ee72dd85e1d994ac2bdccc3147830bbd
Author: Michael Stahl <mstahl at redhat.com>
Date:   Sun Oct 14 21:10:38 2012 +0200

    FontPrevWin_Impl::CheckScript(): assert that there is text:
    
    If there is no preview text here then aTextWidth will have no entries
    and we crash when writing to the non-existing first element.
    aText should come from the current SfxViewShell, from the font name
    (unless that is ambiguous, e.g. a selection of text with multiple
    fonts), or the Window text (Window::GetText(), whatever that is).

diff --git a/svx/source/dialog/fntctrl.cxx b/svx/source/dialog/fntctrl.cxx
index c09f3bf..cc775a5 100644
--- a/svx/source/dialog/fntctrl.cxx
+++ b/svx/source/dialog/fntctrl.cxx
@@ -176,7 +176,6 @@ class FontPrevWin_Impl
     bool m_bCTLEnabled;
 
 
-    void                _CheckScript();
 public:
     inline FontPrevWin_Impl() :
         pPrinter( NULL ), bDelPrinter( sal_False ),
@@ -213,12 +212,6 @@ public:
                             //  sets the 100%-Font-Widths
 };
 
-void FontPrevWin_Impl::CheckScript()
-{
-    if( aText != aScriptText )
-        _CheckScript();
-}
-
 inline void FontPrevWin_Impl::Invalidate100PercentFontWidth()
 {
     n100PercentFontWidth = n100PercentFontWidthCJK = n100PercentFontWidthCTL = -1;
@@ -237,15 +230,19 @@ inline sal_Bool FontPrevWin_Impl::Is100PercentFontWidthValid() const
 // class FontPrevWin_Impl -----------------------------------------------
 
 /*
- * void FontPrevWin_Impl::_CheckScript()
  * evalutates the scripttypes of the actual string.
  * Afterwards the positions of script change are notified in aScriptChg,
  * the scripttypes in aScriptType.
  * The aTextWidth array will be filled with zero.
  */
-
-void FontPrevWin_Impl::_CheckScript()
+void FontPrevWin_Impl::CheckScript()
 {
+    assert(aText.Len()); // must have a preview text here!
+    if (aText == aScriptText)
+    {
+        return; // already initialized
+    }
+
     aScriptText = aText;
 
     aScriptChg.clear();
@@ -258,6 +255,7 @@ void FontPrevWin_Impl::_CheckScript()
         xBreak = Reference< XBreakIterator >(xMSF->createInstance(
                 ::rtl::OUString("com.sun.star.i18n.BreakIterator") ),UNO_QUERY);
     }
+    assert(xBreak.is()); // no can do without breakiter
     if( xBreak.is() )
     {
         sal_uInt16 nScript = xBreak->getScriptType( aText, 0 );
commit 86b6bf6e53c234e3df951ebb08513b0d4fc47a14
Author: Michael Stahl <mstahl at redhat.com>
Date:   Sun Oct 14 21:05:15 2012 +0200

    sd: fix crash in character format dialog:
    
    When text with different fonts is selected in Draw or Impress, the
    character format dialog crashes, because (among other things) the
    selected text is not returned by SfxViewShell::GetSelectionText().
    Crash was observed both with GraphicViewShellBase and
    ImpressViewShellBase as current shell.
    Override that method in sd::ViewShellBase to forward to a main shell
    that happens to be a DrawViewShell which is not actually a SfxViewShell
    but happens to implement GetSelectionText() for mysterious reasons.

diff --git a/sd/source/ui/inc/ViewShellBase.hxx b/sd/source/ui/inc/ViewShellBase.hxx
index 089368a..7d1e7d5 100644
--- a/sd/source/ui/inc/ViewShellBase.hxx
+++ b/sd/source/ui/inc/ViewShellBase.hxx
@@ -123,6 +123,10 @@ public:
     */
     virtual void GetState (SfxItemSet& rSet);
 
+    /* override these from SfxViewShell */
+    virtual String GetSelectionText(sal_Bool);
+    virtual sal_Bool HasSelection(sal_Bool) const;
+
     SvBorder GetBorder (bool bOuterResize);
     virtual void InnerResizePixel (const Point& rOrigin, const Size& rSize);
     virtual void OuterResizePixel (const Point& rOrigin, const Size& rSize);
diff --git a/sd/source/ui/view/ViewShellBase.cxx b/sd/source/ui/view/ViewShellBase.cxx
index 7648841..d5d1ded 100644
--- a/sd/source/ui/view/ViewShellBase.cxx
+++ b/sd/source/ui/view/ViewShellBase.cxx
@@ -489,7 +489,25 @@ void ViewShellBase::InitializeFramework (void)
 }
 
 
+String ViewShellBase::GetSelectionText(sal_Bool bCompleteWords)
+{
+    ::boost::shared_ptr<ViewShell> const pMainShell(GetMainViewShell());
+    DrawViewShell *const pDrawViewShell(
+            dynamic_cast<DrawViewShell*>(pMainShell.get()));
+    return (pDrawViewShell)
+        ?   pDrawViewShell->GetSelectionText(bCompleteWords)
+        :   SfxViewShell::GetSelectionText(bCompleteWords);
+}
 
+sal_Bool ViewShellBase::HasSelection(sal_Bool bText) const
+{
+    ::boost::shared_ptr<ViewShell> const pMainShell(GetMainViewShell());
+    DrawViewShell *const pDrawViewShell(
+            dynamic_cast<DrawViewShell*>(pMainShell.get()));
+    return (pDrawViewShell)
+        ?   pDrawViewShell->HasSelection(bText)
+        :   SfxViewShell::HasSelection(bText);
+}
 
 void ViewShellBase::InnerResizePixel (const Point& rOrigin, const Size &rSize)
 {


More information about the Libreoffice-commits mailing list