[PATCH] Create Photo Album implementation

Gergő Mocsi (via_Code_Review) gerrit at gerrit.libreoffice.org
Tue Apr 2 04:08:09 PDT 2013


Hi,

I have submitted a patch for review:

    https://gerrit.libreoffice.org/3169

To pull it, you can do:

    git pull ssh://gerrit.libreoffice.org:29418/core refs/changes/69/3169/1

Create Photo Album implementation

Added a checkbox to enable/diable Keep Aspect ratio, plus 2 images/slide option is implemented.

Change-Id: I68d2a3e00f8c55b909fe4d98aa3958188653390e
---
M sd/source/ui/dlg/PhotoAlbumDialog.cxx
M sd/source/ui/dlg/PhotoAlbumDialog.hxx
M sd/uiconfig/simpress/ui/photoalbum.ui
3 files changed, 276 insertions(+), 61 deletions(-)



diff --git a/sd/source/ui/dlg/PhotoAlbumDialog.cxx b/sd/source/ui/dlg/PhotoAlbumDialog.cxx
index 03ccd07..ff0e7d7 100644
--- a/sd/source/ui/dlg/PhotoAlbumDialog.cxx
+++ b/sd/source/ui/dlg/PhotoAlbumDialog.cxx
@@ -8,17 +8,15 @@
 */
 #include "PhotoAlbumDialog.hxx"
 
-#include <com/sun/star/graphic/GraphicProvider.hpp>
-#include <com/sun/star/graphic/XGraphicProvider.hpp>
 #include <comphelper/namedvaluecollection.hxx>
 #include <comphelper/processfactory.hxx>
 #include <comphelper/componentcontext.hxx>
 
 #include <com/sun/star/ui/dialogs/TemplateDescription.hpp>
 #include <com/sun/star/drawing/XMasterPagesSupplier.hpp>
-#include <com/sun/star/drawing/XDrawPages.hpp>
-#include <com/sun/star/drawing/XDrawPage.hpp>
+
 #include <com/sun/star/drawing/XDrawPagesSupplier.hpp>
+#include <com/sun/star/text/XText.hpp>
 
 #include <sfx2/filedlghelper.hxx>
 #include <tools/urlobj.hxx>
@@ -28,13 +26,6 @@
 #include <unotools/ucbstreamhelper.hxx>
 
 #include <vcl/msgbox.hxx>
-
-
-
-
-using namespace ::com::sun::star;
-using namespace ::com::sun::star::uno;
-using namespace ::com::sun::star::presentation;
 
 namespace sd
 {
@@ -57,6 +48,8 @@
 
     get(pInsTypeCombo, "opt_combo");
 
+    get(pASRCheck, "asr_check");
+
     pCancelBtn->SetClickHdl(LINK(this, SdPhotoAlbumDialog, CancelHdl));
     pCreateBtn->SetClickHdl(LINK(this, SdPhotoAlbumDialog, CreateHdl));
 
@@ -67,6 +60,7 @@
     pRemoveBtn->SetClickHdl(LINK(this, SdPhotoAlbumDialog, RemoveHdl));
 
     pImagesLst->SetSelectHdl(LINK(this, SdPhotoAlbumDialog, SelectHdl));
+
     mpGraphicFilter = new GraphicFilter;
 
 }
@@ -111,52 +105,52 @@
                 OUString sUrl = pImagesLst->GetEntry( i );
                 if (sUrl != "Text Box")
                 {
-                    ::comphelper::NamedValueCollection aMediaProperties;
-                    aMediaProperties.put( "URL", OUString( sUrl ) );
-
-                    Reference< graphic::XGraphic> xGraphic =
-                        xProvider->queryGraphic( aMediaProperties.getPropertyValues() );
-
-                    Reference< drawing::XDrawPage > xSlide;
-                    Reference< container::XIndexAccess > xIndexAccess( xDrawPages, uno::UNO_QUERY );
-                    xSlide = xDrawPages->insertNewByIndex( xIndexAccess->getCount() );
-                    SdPage* pSlide = pDoc->GetSdPage( pDoc->GetSdPageCount(PK_STANDARD)-1, PK_STANDARD);
-                    pSlide->SetAutoLayout(AUTOLAYOUT_NONE, sal_True);
-
+                    Reference< drawing::XDrawPage > xSlide = appendNewSlide(AUTOLAYOUT_NONE, xDrawPages);
                     Reference< beans::XPropertySet > xSlideProps( xSlide, uno::UNO_QUERY );
+
+                    Reference< graphic::XGraphic > xGraphic = createXGraphicFromUrl(sUrl, xProvider);
+
+                    Image aImg(xGraphic);
+                    // Save the original size, multiplied with 100
+                    ::awt::Size aPicSize(aImg.GetSizePixel().Width()*100, aImg.GetSizePixel().Height()*100);
 
                     Reference< drawing::XShape > xShape(
                         xShapeFactory->createInstance("com.sun.star.drawing.GraphicObjectShape"),
-                        uno::UNO_QUERY
-                    );
+                        uno::UNO_QUERY);
 
                     Reference< beans::XPropertySet > xProps( xShape, uno::UNO_QUERY );
                     xProps->setPropertyValue("Graphic", ::uno::Any(xGraphic));
 
-                    ::awt::Size aPicSize = xShape->getSize();
+
                     ::awt::Size aPageSize;
 
                     xSlideProps->getPropertyValue(
                         OUString("Width")) >>= aPageSize.Width;
                     xSlideProps->getPropertyValue(
                         OUString("Height")) >>= aPageSize.Height;
-                    aPicSize.Width = aPageSize.Width;
-                    aPicSize.Height = aPageSize.Height;
+
                     ::awt::Point aPicPos;
 
+                    if(pASRCheck->IsChecked())
+                    {
+                        // Resize the image, with keeping ASR
+                        aPicSize = createASRSize(aPicSize, aPageSize);
+                    }
+                    else
+                    {
+                        aPicSize.Width = aPageSize.Width;
+                        aPicSize.Height = aPageSize.Height;
+                    }
+                    xShape->setSize(aPicSize);
                     aPicPos.X = (aPageSize.Width - aPicSize.Width)/2;
                     aPicPos.Y = (aPageSize.Height - aPicSize.Height)/2;
-                    xShape->setSize(aPicSize);
+
                     xShape->setPosition(aPicPos);
                     xSlide->add(xShape);
                 }
                 else // insert an empty slide, with centered text box
                 {
-                    Reference< drawing::XDrawPage > xSlide;
-                    Reference< container::XIndexAccess > xIndexAccess( xDrawPages, uno::UNO_QUERY );
-                    xSlide = xDrawPages->insertNewByIndex( xIndexAccess->getCount() );
-                    SdPage* pSlide = pDoc->GetSdPage( pDoc->GetSdPageCount(PK_STANDARD)-1, PK_STANDARD);
-                    pSlide->SetAutoLayout(AUTOLAYOUT_ONLY_TEXT, sal_True);
+                    appendNewSlide(AUTOLAYOUT_ONLY_TEXT, xDrawPages);
                 }
             }
         }
@@ -168,35 +162,18 @@
                 OUString sUrl = pImagesLst->GetEntry( i );
                 if ( sUrl != "Text Box" )
                 {
-                    ::comphelper::NamedValueCollection aMediaProperties;
-                    aMediaProperties.put( "URL", OUString( sUrl ) );
-
-                    Reference< graphic::XGraphic> xGraphic =
-                        xProvider->queryGraphic( aMediaProperties.getPropertyValues() );
-
-                    Reference< drawing::XDrawPage > xSlide;
-                    Reference< container::XIndexAccess > xIndexAccess( xDrawPages, uno::UNO_QUERY );
-                    xSlide = xDrawPages->insertNewByIndex( xIndexAccess->getCount() );
-
+                    Reference< drawing::XDrawPage > xSlide = appendNewSlide(AUTOLAYOUT_NONE, xDrawPages);
                     Reference< beans::XPropertySet > xSlideProps( xSlide, uno::UNO_QUERY );
+                    Reference< drawing::XShape > xShape = createXShapeFromUrl(sUrl, xShapeFactory, xProvider);
 
-                    Reference< drawing::XShape > xShape(
-                        xShapeFactory->createInstance("com.sun.star.drawing.GraphicObjectShape"),
-                        uno::UNO_QUERY
-                    );
-
-                    Reference< beans::XPropertySet > xProps( xShape, uno::UNO_QUERY );
-                    xProps->setPropertyValue("Graphic", ::uno::Any(xGraphic));
-
-                    ::awt::Size aPicSize = xShape->getSize();
+                    ::awt::Size aPicSize(xShape->getSize());
                     ::awt::Size aPageSize;
 
                     xSlideProps->getPropertyValue(
                         OUString("Width")) >>= aPageSize.Width;
                     xSlideProps->getPropertyValue(
                         OUString("Height")) >>= aPageSize.Height;
-                    aPicSize.Width = aPageSize.Width/2;
-                    aPicSize.Height = aPageSize.Height/2;
+
                     ::awt::Point aPicPos;
 
                     aPicPos.X = (aPageSize.Width - aPicSize.Width)/2;
@@ -211,12 +188,116 @@
                 }
                 else // insert an empty slide, with centered text box
                 {
-                    Reference< drawing::XDrawPage > xSlide;
-                    Reference< container::XIndexAccess > xIndexAccess( xDrawPages, uno::UNO_QUERY );
-                    xSlide = xDrawPages->insertNewByIndex( xIndexAccess->getCount() );
-                    SdPage* pSlide = pDoc->GetSdPage( pDoc->GetSdPageCount(PK_STANDARD)-1, PK_STANDARD);
-                    pSlide->SetAutoLayout(AUTOLAYOUT_ONLY_TEXT, sal_True);
+                    appendNewSlide(AUTOLAYOUT_ONLY_TEXT, xDrawPages);
                 }
+            }
+        }
+        else if( sOpt == "2 images" )
+        {
+            OUString sUrl1("");
+            OUString sUrl2("");
+
+            for( sal_Int32 i = 0; i < pImagesLst->GetEntryCount(); i+=2 )
+            {
+                // create the slide
+                Reference< drawing::XDrawPage > xSlide = appendNewSlide(AUTOLAYOUT_NONE, xDrawPages);
+                Reference< beans::XPropertySet > xSlideProps( xSlide, uno::UNO_QUERY );
+                //Slide dimensions
+                ::awt::Size aPageSize;
+
+                xSlideProps->getPropertyValue(
+                    OUString("Width")) >>= aPageSize.Width;
+                xSlideProps->getPropertyValue(
+                    OUString("Height")) >>= aPageSize.Height;
+
+                // grab the left one
+                sUrl1 = pImagesLst->GetEntry( i );
+                // grab the right one
+                sUrl2 = pImagesLst->GetEntry( i+1 );
+
+                if( sUrl1 == "Text Box" )
+                {
+                    SdPage* pSlide = pDoc->GetSdPage( pDoc->GetSdPageCount(PK_STANDARD)-1, PK_STANDARD);
+                    pSlide->CreatePresObj(PRESOBJ_TEXT, sal_False, Rectangle(Point(100,100), Point(aPageSize.Width/2-100, aPageSize.Height-100)), sal_True);
+                }
+                else if( sUrl1.isEmpty()){}
+                else
+                {
+
+                    Reference< graphic::XGraphic > xGraphic = createXGraphicFromUrl(sUrl1, xProvider);
+
+                    Image aImg(xGraphic);
+                    // Save the original size, multiplied with 100
+                    ::awt::Size aPicSize(aImg.GetSizePixel().Width()*100, aImg.GetSizePixel().Height()*100);
+
+                    Reference< drawing::XShape > xShape(
+                        xShapeFactory->createInstance("com.sun.star.drawing.GraphicObjectShape"),
+                        uno::UNO_QUERY);
+
+                    Reference< beans::XPropertySet > xProps( xShape, uno::UNO_QUERY );
+                    xProps->setPropertyValue("Graphic", ::uno::Any(xGraphic));
+
+                    ::awt::Point aPicPos;
+
+                    if(pASRCheck->IsChecked())
+                    {
+                        // Resize the image, with keeping ASR
+                        aPicSize = createASRSize(aPicSize, ::awt::Size(aPageSize.Width/2, aPageSize.Height/2));
+                    }
+                    else
+                    {
+                        aPicSize.Width = aPageSize.Width/2;
+                        aPicSize.Height = aPageSize.Height/2;
+                    }
+                    xShape->setSize(aPicSize);
+                    aPicPos.X = 0;
+                    aPicPos.Y = aPageSize.Height/2 - aPicSize.Height/2;
+
+                    xShape->setPosition(aPicPos);
+                    xSlide->add(xShape);
+                }
+
+                if( sUrl2 == "Text Box" )
+                {
+                    SdPage* pSlide = pDoc->GetSdPage( pDoc->GetSdPageCount(PK_STANDARD)-1, PK_STANDARD);
+                    pSlide->CreatePresObj(PRESOBJ_TEXT, sal_False, Rectangle(Point(aPageSize.Width/2 + 100,100), Point(aPageSize.Width-100, aPageSize.Height-100)), sal_True);
+                }
+                else if( sUrl2.isEmpty()){}
+                else
+                {
+                    Reference< graphic::XGraphic > xGraphic = createXGraphicFromUrl(sUrl2, xProvider);
+
+                    Image aImg(xGraphic);
+                    // Save the original size, multiplied with 100
+                    ::awt::Size aPicSize(aImg.GetSizePixel().Width()*100, aImg.GetSizePixel().Height()*100);
+
+                    Reference< drawing::XShape > xShape(
+                        xShapeFactory->createInstance("com.sun.star.drawing.GraphicObjectShape"),
+                        uno::UNO_QUERY);
+
+                    Reference< beans::XPropertySet > xProps( xShape, uno::UNO_QUERY );
+                    xProps->setPropertyValue("Graphic", ::uno::Any(xGraphic));
+
+                    ::awt::Point aPicPos;
+
+                    if(pASRCheck->IsChecked())
+                    {
+                        // Resize the image, with keeping ASR
+                        aPicSize = createASRSize(aPicSize, ::awt::Size(aPageSize.Width/2, aPageSize.Height/2));
+                    }
+                    else
+                    {
+                        aPicSize.Width = aPageSize.Width/2;
+                        aPicSize.Height = aPageSize.Height/2;
+                    }
+                    xShape->setSize(aPicSize);
+                    aPicPos.X = aPageSize.Width/2;
+                    aPicPos.Y = aPageSize.Height/2 - aPicSize.Height/2;
+
+                    xShape->setPosition(aPicPos);
+                    xSlide->add(xShape);
+                }
+
             }
         }
         else
@@ -301,6 +382,7 @@
 IMPL_LINK_NOARG(SdPhotoAlbumDialog, RemoveHdl)
 {
     pImagesLst->RemoveEntry( pImagesLst->GetSelectEntryPos() );
+    pImg->SetImage(Image());
     return 0;
 }
 
@@ -374,5 +456,97 @@
     pFirstSlide->SetObjText(pAuthorObj, NULL, PRESOBJ_TEXT, OUString("Author: ") + aUserOptions.GetFullName());
 }
 
+Reference< drawing::XDrawPage > SdPhotoAlbumDialog::appendNewSlide(AutoLayout aLayout,
+    Reference< drawing::XDrawPages > xDrawPages
+)
+{
+    Reference< drawing::XDrawPage > xSlide; // Create the slide
+    Reference< container::XIndexAccess > xIndexAccess( xDrawPages, uno::UNO_QUERY );
+    xSlide = xDrawPages->insertNewByIndex( xIndexAccess->getCount() );
+    SdPage* pSlide = pDoc->GetSdPage( pDoc->GetSdPageCount(PK_STANDARD)-1, PK_STANDARD);
+    pSlide->SetAutoLayout(aLayout, sal_True); // Set the layout here
+    return xSlide;
+}
+
+awt::Size SdPhotoAlbumDialog::createASRSize(const awt::Size& aPicSize, const awt::Size& aMaxSize)
+{
+    double resizeWidth = aPicSize.Width;
+    double resizeHeight = aPicSize.Height;
+    double aspect = resizeWidth/resizeHeight;
+
+    if( resizeWidth > aMaxSize.Width )
+    {
+        resizeWidth = aMaxSize.Width;
+        resizeHeight = resizeWidth / aspect;
+    }
+
+    if( resizeHeight > aMaxSize.Height )
+    {
+        aspect = resizeWidth/resizeHeight;
+        resizeHeight = aMaxSize.Height;
+        resizeWidth = resizeHeight * aspect;
+    }
+    return awt::Size(resizeWidth, resizeHeight);
+    /*double wRatio, hRatio, resizeRatio;
+    if(aPicSize.Width >= aPicSize.Height)
+    {
+        if(aPicSize.Width <= aMaxSize.Width && aPicSize.Height <= aMaxSize.Height)
+        {
+            // no resize required
+            return aPicSize;
+        }
+        wRatio = aMaxSize.Width / aPicSize.Width;
+        hRatio = aMaxSize.Height / aPicSize.Height;
+    }
+    else
+    {
+        if(aPicSize.Height <= aMaxSize.Width && aPicSize.Width <= aMaxSize.Height)
+        {
+            // no resize required
+            return aPicSize;
+        }
+        wRatio = aMaxSize.Height / aPicSize.Width;
+        hRatio = aMaxSize.Width / aPicSize.Height;
+    }
+    if(wRatio <= hRatio)
+        resizeRatio = wRatio;
+    else
+        resizeRatio = hRatio;
+    return awt::Size(aPicSize.Width * resizeRatio, aPicSize.Height * resizeRatio);*/
+}
+
+Reference< drawing::XShape > SdPhotoAlbumDialog::createXShapeFromUrl(const OUString& sUrl,
+    Reference< lang::XMultiServiceFactory > xShapeFactory,
+    Reference< graphic::XGraphicProvider> xProvider
+)
+{
+    //First, we create an XGraphic
+    ::comphelper::NamedValueCollection aMediaProperties;
+    aMediaProperties.put( "URL", OUString( sUrl ) );
+    Reference< graphic::XGraphic> xGraphic =
+        xProvider->queryGraphic( aMediaProperties.getPropertyValues() );
+    //And then, we can create the XShape from the XGraphic
+    Reference< drawing::XShape > xShape(
+        xShapeFactory->createInstance("com.sun.star.drawing.GraphicObjectShape"),
+        uno::UNO_QUERY
+    );
+
+    Reference< beans::XPropertySet > xProps( xShape, uno::UNO_QUERY );
+    xProps->setPropertyValue("Graphic", ::uno::Any(xGraphic));
+
+    return xShape; // Image loaded into XShape
+}
+
+Reference< graphic::XGraphic> SdPhotoAlbumDialog::createXGraphicFromUrl(const OUString& sUrl,
+    Reference< graphic::XGraphicProvider> xProvider
+)
+{
+    ::comphelper::NamedValueCollection aMediaProperties;
+    aMediaProperties.put( "URL", OUString( sUrl ) );
+    Reference< graphic::XGraphic> xGraphic =
+        xProvider->queryGraphic( aMediaProperties.getPropertyValues() );
+    return xGraphic;
+}
+
 }
 /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/source/ui/dlg/PhotoAlbumDialog.hxx b/sd/source/ui/dlg/PhotoAlbumDialog.hxx
index cf70fc8..a03d441 100644
--- a/sd/source/ui/dlg/PhotoAlbumDialog.hxx
+++ b/sd/source/ui/dlg/PhotoAlbumDialog.hxx
@@ -23,9 +23,18 @@
 #include <vcl/graphicfilter.hxx>
 #include <svx/svdotext.hxx>
 
+#include <com/sun/star/drawing/XDrawPage.hpp>
+#include <com/sun/star/drawing/XDrawPages.hpp>
+#include <com/sun/star/graphic/GraphicProvider.hpp>
+#include <com/sun/star/graphic/XGraphicProvider.hpp>
+
 class SdrTextObj;
 class SdDrawDocument;
 class SdPage;
+
+using namespace ::com::sun::star;
+using namespace ::com::sun::star::uno;
+using namespace ::com::sun::star::presentation;
 
 namespace sd
 {
@@ -49,7 +58,9 @@
     ListBox*        pImagesLst;
     FixedImage*     pImg;
 
-    ListBox*   pInsTypeCombo;
+    ListBox*    pInsTypeCombo;
+
+    CheckBox*   pASRCheck;
 
     SdDrawDocument* pDoc;
     GraphicFilter* mpGraphicFilter;
@@ -66,6 +77,18 @@
     DECL_LINK(SelectHdl, void*);
 
     void setFirstSlide(SdPage* pFirstSlide);
+
+    Reference< drawing::XDrawPage > appendNewSlide(AutoLayout aLayout,
+        Reference< drawing::XDrawPages > xDrawPages);
+
+    awt::Size createASRSize(const awt::Size& aPicSize, const awt::Size& aMaxSize);
+
+    Reference< drawing::XShape > createXShapeFromUrl(const OUString& sUrl,
+        Reference< lang::XMultiServiceFactory > xShapeFactory,
+        Reference< graphic::XGraphicProvider> xProvider);
+
+    Reference< graphic::XGraphic> createXGraphicFromUrl(const OUString& sUrl,
+        Reference< graphic::XGraphicProvider> xProvider);
 };
 
 }
diff --git a/sd/uiconfig/simpress/ui/photoalbum.ui b/sd/uiconfig/simpress/ui/photoalbum.ui
index e88b2cb..b071667 100644
--- a/sd/uiconfig/simpress/ui/photoalbum.ui
+++ b/sd/uiconfig/simpress/ui/photoalbum.ui
@@ -297,6 +297,24 @@
                                 <property name="height">1</property>
                               </packing>
                             </child>
+                            <child>
+                              <object class="GtkCheckButton" id="asr_check">
+                                <property name="label" translatable="yes">Keep Aspect Ratio</property>
+                                <property name="use_action_appearance">False</property>
+                                <property name="visible">True</property>
+                                <property name="can_focus">True</property>
+                                <property name="receives_default">False</property>
+                                <property name="use_action_appearance">False</property>
+                                <property name="xalign">0</property>
+                                <property name="draw_indicator">True</property>
+                              </object>
+                              <packing>
+                                <property name="left_attach">0</property>
+                                <property name="top_attach">4</property>
+                                <property name="width">1</property>
+                                <property name="height">1</property>
+                              </packing>
+                            </child>
                           </object>
                           <packing>
                             <property name="left_attach">0</property>

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

Gerrit-MessageType: newchange
Gerrit-Change-Id: I68d2a3e00f8c55b909fe4d98aa3958188653390e
Gerrit-PatchSet: 1
Gerrit-Project: core
Gerrit-Branch: master
Gerrit-Owner: Gergő Mocsi <gmocsi91 at gmail.com>



More information about the LibreOffice mailing list