Date: prev next · Thread: first prev next last
2013 Archives by date, by thread · List index


Hi,

I have submitted a patch for review:

    https://gerrit.libreoffice.org/1715

To pull it, you can do:

    git pull ssh://gerrit.libreoffice.org:29418/core refs/changes/15/1715/1

Template Manager: show names on several lines

Change-Id: I6990bb6ac52889de36f3ec2cce33e4dc2f3da2ea
---
M sfx2/inc/sfx2/thumbnailviewitem.hxx
M sfx2/source/control/templatecontaineritem.cxx
M sfx2/source/control/templatelocalview.cxx
M sfx2/source/control/templateviewitem.cxx
M sfx2/source/control/thumbnailviewitem.cxx
5 files changed, 70 insertions(+), 76 deletions(-)



diff --git a/sfx2/inc/sfx2/thumbnailviewitem.hxx b/sfx2/inc/sfx2/thumbnailviewitem.hxx
index 9609667..18b7eae 100644
--- a/sfx2/inc/sfx2/thumbnailviewitem.hxx
+++ b/sfx2/inc/sfx2/thumbnailviewitem.hxx
@@ -22,6 +22,7 @@
 
 #include <basegfx/vector/b2dvector.hxx>
 #include <drawinglayer/attribute/fontattribute.hxx>
+#include <drawinglayer/primitive2d/baseprimitive2d.hxx>
 #include <osl/mutex.hxx>
 #include <vcl/bitmapex.hxx>
 #include "sfx2/dllapi.h"
@@ -106,6 +107,7 @@
 
     virtual void Paint (drawinglayer::processor2d::BaseProcessor2D *pProcessor,
                         const ThumbnailItemAttributes *pAttrs);
+    void addTextPrimitives (const rtl::OUString& rText, const ThumbnailItemAttributes *pAttrs, 
Point aPos, drawinglayer::primitive2d::Primitive2DSequence& rSeq);
 
     static drawinglayer::primitive2d::PolygonHairlinePrimitive2D*
         createBorderLine (const basegfx::B2DPolygon &rPolygon);
diff --git a/sfx2/source/control/templatecontaineritem.cxx 
b/sfx2/source/control/templatecontaineritem.cxx
index 25fa5fe..febd87f 100644
--- a/sfx2/source/control/templatecontaineritem.cxx
+++ b/sfx2/source/control/templatecontaineritem.cxx
@@ -84,8 +84,6 @@
     Size aThumbSize( ( maThumbnailArea.getWidth() - 3 * nThumbPadding ) / 2, ( 
maThumbnailArea.getHeight() - 3* nThumbPadding ) / 2 );
 
     // Draw thumbnail
-    Point aPos = maPrev1Pos;
-
     for (int i=0; i<4; ++i)
     {
         long nPosX = 0;
@@ -153,21 +151,7 @@
         }
     }
 
-    // Draw centered text below thumbnail
-    aPos = maTextPos;
-
-    // Create the text primitive
-    basegfx::B2DHomMatrix aTextMatrix( createScaleTranslateB2DHomMatrix(
-                pAttrs->aFontSize.getX(), pAttrs->aFontSize.getY(),
-                double( aPos.X() ), double( aPos.Y() ) ) );
-
-    aSeq[nCount++] = Primitive2DReference(
-                new TextSimplePortionPrimitive2D(aTextMatrix,
-                                                 maTitle,0,maTitle.getLength(),
-                                                 std::vector< double >( ),
-                                                 pAttrs->aFontAttr,
-                                                 com::sun::star::lang::Locale(),
-                                                 Color(COL_BLACK).getBColor() ) );
+    addTextPrimitives(maTitle, pAttrs, maTextPos, aSeq);
 
     pProcessor->process(aSeq);
 }
diff --git a/sfx2/source/control/templatelocalview.cxx b/sfx2/source/control/templatelocalview.cxx
index 7956101..76516d7 100644
--- a/sfx2/source/control/templatelocalview.cxx
+++ b/sfx2/source/control/templatelocalview.cxx
@@ -51,12 +51,6 @@
     {
         OUString aRegionName(mpDocTemplates->GetFullRegionName(i));
 
-        if ((sal_uInt32)aRegionName.getLength() > mpItemAttrs->nMaxTextLenght)
-        {
-            aRegionName = aRegionName.copy(0,mpItemAttrs->nMaxTextLenght-3);
-            aRegionName += "...";
-        }
-
         TemplateContainerItem* pItem = new TemplateContainerItem( *this );
         pItem->mnId = i+1;
         pItem->maTitle = aRegionName;
@@ -68,12 +62,6 @@
         {
             OUString aName = mpDocTemplates->GetName(i,j);
             OUString aURL = mpDocTemplates->GetPath(i,j);
-
-            if ((sal_uInt32)aName.getLength() > mpItemAttrs->nMaxTextLenght)
-            {
-                aName = aName.copy(0,mpItemAttrs->nMaxTextLenght-3);
-                aName += "...";
-            }
 
             TemplateItemProperties aProperties;;
             aProperties.nId = j+1;
@@ -181,12 +169,6 @@
         return false;
 
     OUString aRegionName = rName;
-
-    if ((sal_uInt32)aRegionName.getLength() > mpItemAttrs->nMaxTextLenght)
-    {
-        aRegionName = aRegionName.copy(0,mpItemAttrs->nMaxTextLenght-3);
-        aRegionName += "...";
-    }
 
     TemplateContainerItem* pItem = new TemplateContainerItem( *this );
     pItem->mnId = nRegionId+1;
diff --git a/sfx2/source/control/templateviewitem.cxx b/sfx2/source/control/templateviewitem.cxx
index 51a2862..9f06ebb 100644
--- a/sfx2/source/control/templateviewitem.cxx
+++ b/sfx2/source/control/templateviewitem.cxx
@@ -108,34 +108,11 @@
     // draw thumbnail borders
     aSeq[3] = Primitive2DReference(createBorderLine(aBounds));
 
-    // Draw centered text below thumbnail
-
-    // Create the text primitive
-    basegfx::B2DHomMatrix aTitleMatrix( createScaleTranslateB2DHomMatrix(
-                pAttrs->aFontSize.getX(), pAttrs->aFontSize.getY(),
-                double( maTextPos.X() ), double( maTextPos.Y() ) ) );
-
-    aSeq[4] = Primitive2DReference(
-                new TextSimplePortionPrimitive2D(aTitleMatrix,
-                                                 maTitle,0,pAttrs->nMaxTextLenght,
-                                                 std::vector< double >( ),
-                                                 pAttrs->aFontAttr,
-                                                 com::sun::star::lang::Locale(),
-                                                 Color(COL_BLACK).getBColor() ) );
+    addTextPrimitives(maTitle, pAttrs, maTextPos, aSeq);
 
     if (!maSubTitle.isEmpty())
     {
-        basegfx::B2DHomMatrix aSubTitleMatrix( createScaleTranslateB2DHomMatrix(
-                    pAttrs->aFontSize.getX()*SUBTITLE_SCALE_FACTOR, 
pAttrs->aFontSize.getY()*SUBTITLE_SCALE_FACTOR,
-                    double( maSubTitlePos.X() ), double( maSubTitlePos.Y() ) ) );
-
-        aSeq[5] = Primitive2DReference(
-                    new TextSimplePortionPrimitive2D(aSubTitleMatrix,
-                                                     maSubTitle,0,pAttrs->nMaxTextLenght,
-                                                     std::vector< double >( ),
-                                                     pAttrs->aFontAttr,
-                                                     com::sun::star::lang::Locale(),
-                                                     Color(COL_BLACK).getBColor() ) );
+        addTextPrimitives(maSubTitle, pAttrs, maSubTitlePos, aSeq);
     }
 
     pProcessor->process(aSeq);
diff --git a/sfx2/source/control/thumbnailviewitem.cxx b/sfx2/source/control/thumbnailviewitem.cxx
index e5a07db..2e6eb96 100644
--- a/sfx2/source/control/thumbnailviewitem.cxx
+++ b/sfx2/source/control/thumbnailviewitem.cxx
@@ -34,6 +34,7 @@
 #include <drawinglayer/processor2d/baseprocessor2d.hxx>
 #include <vcl/button.hxx>
 #include <vcl/svapp.hxx>
+#include <vcl/texteng.hxx>
 
 using namespace basegfx;
 using namespace basegfx::tools;
@@ -127,7 +128,8 @@
     if ( mbSelected || mbHover )
         aFillColor = pAttrs->aHighlightColor;
 
-    aSeq[0] = Primitive2DReference( new PolyPolygonColorPrimitive2D(
+    sal_uInt32 nPrimitive = 0;
+    aSeq[nPrimitive++] = Primitive2DReference( new PolyPolygonColorPrimitive2D(
                                                
B2DPolyPolygon(Polygon(maDrawArea,5,5).getB2DPolygon()),
                                                aFillColor));
 
@@ -135,7 +137,7 @@
     Point aPos = maPrev1Pos;
     Size aImageSize = maPreview1.GetSizePixel();
 
-    aSeq[1] = Primitive2DReference( new FillBitmapPrimitive2D(
+    aSeq[nPrimitive++] = Primitive2DReference( new FillBitmapPrimitive2D(
                                         createTranslateB2DHomMatrix(aPos.X(),aPos.Y()),
                                         FillBitmapAttribute(maPreview1,
                                                             B2DPoint(0,0),
@@ -156,27 +158,74 @@
     aBounds.append(B2DPoint(fPosX,fPosY+fHeight));
     aBounds.setClosed(true);
 
-    aSeq[2] = Primitive2DReference(createBorderLine(aBounds));
+    aSeq[nPrimitive++] = Primitive2DReference(createBorderLine(aBounds));
 
-    // Draw centered text below thumbnail
+    // Draw text below thumbnail
     aPos = maTextPos;
 
-    // Create the text primitive
-    basegfx::B2DHomMatrix aTextMatrix( createScaleTranslateB2DHomMatrix(
-                pAttrs->aFontSize.getX(), pAttrs->aFontSize.getY(),
-                double( aPos.X() ), double( aPos.Y() ) ) );
-
-    aSeq[3] = Primitive2DReference(
-                new TextSimplePortionPrimitive2D(aTextMatrix,
-                                                 maTitle,0,pAttrs->nMaxTextLenght,
-                                                 std::vector< double >( ),
-                                                 pAttrs->aFontAttr,
-                                                 com::sun::star::lang::Locale(),
-                                                 Color(COL_BLACK).getBColor() ) );
+    addTextPrimitives( maTitle, pAttrs, maTextPos, aSeq );
 
     pProcessor->process(aSeq);
 }
 
+void ThumbnailViewItem::addTextPrimitives (const rtl::OUString& rText, const 
ThumbnailItemAttributes *pAttrs, Point aPos, Primitive2DSequence& rSeq)
+{
+    drawinglayer::primitive2d::TextLayouterDevice aTextDev;
+
+    rtl::OUString aText (rText);
+
+    TextEngine aTextEngine;
+    aTextEngine.SetMaxTextWidth(maDrawArea.getWidth());
+    aTextEngine.SetText(rText);
+
+    sal_Int32 nPrimitives = rSeq.getLength();
+    rSeq.realloc(nPrimitives + aTextEngine.GetLineCount(0));
+
+    // Create the text primitives
+    sal_uInt16 nLineStart = 0;
+    for (sal_uInt16 i=0; i<aTextEngine.GetLineCount(0); ++i)
+    {
+        sal_uInt16 nLineLength = aTextEngine.GetLineLen(0, i);
+        double nLineWidth = aTextDev.getTextWidth (aText, nLineStart, nLineLength);
+
+        bool bTooLong = (aPos.getY() + aTextEngine.GetCharHeight()) > maDrawArea.Bottom();
+        if (bTooLong && (nLineLength + nLineStart) < rText.getLength())
+        {
+            // Add the '...' to the last line to show, even though it may require to shorten the 
line
+            double nDotsWidth = aTextDev.getTextWidth(rtl::OUString("..."),0,3);
+
+            sal_uInt16 nLength = nLineLength - 1;
+            while ( nDotsWidth + aTextDev.getTextWidth(aText, nLineStart, nLength) > 
maDrawArea.getWidth() && nLength > 0)
+            {
+                --nLength;
+            }
+
+            aText = aText.copy(0, nLineStart+nLength);
+            aText += "...";
+            nLineLength = nLength + 3;
+        }
+
+        double nLineX = maDrawArea.Left() + (maDrawArea.getWidth() - nLineWidth) / 2.0;
+
+        basegfx::B2DHomMatrix aTextMatrix( createScaleTranslateB2DHomMatrix(
+                    pAttrs->aFontSize.getX(), pAttrs->aFontSize.getY(),
+                    nLineX, double( aPos.Y() ) ) );
+
+        rSeq[nPrimitives++] = Primitive2DReference(
+                    new TextSimplePortionPrimitive2D(aTextMatrix,
+                                                     aText,nLineStart,nLineLength,
+                                                     std::vector< double >( ),
+                                                     pAttrs->aFontAttr,
+                                                     com::sun::star::lang::Locale(),
+                                                     Color(COL_BLACK).getBColor() ) );
+        nLineStart += nLineLength;
+        aPos.setY(aPos.getY() + aTextEngine.GetCharHeight());
+
+        if (bTooLong)
+            break;
+    }
+}
+
 drawinglayer::primitive2d::PolygonHairlinePrimitive2D*
 ThumbnailViewItem::createBorderLine (const basegfx::B2DPolygon& rPolygon)
 {

-- 
To view, visit https://gerrit.libreoffice.org/1715
To unsubscribe, visit https://gerrit.libreoffice.org/settings

Gerrit-MessageType: newchange
Gerrit-Change-Id: I6990bb6ac52889de36f3ec2cce33e4dc2f3da2ea
Gerrit-PatchSet: 1
Gerrit-Project: core
Gerrit-Branch: libreoffice-4-0
Gerrit-Owner: Bosdonnat Cedric <cedric.bosdonnat@free.fr>


Context


Privacy Policy | Impressum (Legal Info) | Copyright information: Unless otherwise specified, all text and images on this website are licensed under the Creative Commons Attribution-Share Alike 3.0 License. This does not include the source code of LibreOffice, which is licensed under the Mozilla Public License (MPLv2). "LibreOffice" and "The Document Foundation" are registered trademarks of their corresponding registered owners or are in actual use as trademarks in one or more countries. Their respective logos and icons are also subject to international copyright laws. Use thereof is explained in our trademark policy.