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/2673

To pull it, you can do:

    git pull ssh://gerrit.libreoffice.org:29418/core refs/changes/73/2673/1

Changes to enable display of comments annotations in pptx files

Change-Id: Iefb3be71837ab4c05d8b83e695f86e433cd2119d
---
A oox/inc/oox/ppt/comments.hxx
M oox/inc/oox/ppt/slidefragmenthandler.hxx
M oox/inc/oox/ppt/slidepersist.hxx
M oox/source/ppt/presentationfragmenthandler.cxx
M oox/source/ppt/slidefragmenthandler.cxx
5 files changed, 302 insertions(+), 2 deletions(-)



diff --git a/oox/inc/oox/ppt/comments.hxx b/oox/inc/oox/ppt/comments.hxx
new file mode 100644
index 0000000..6f0551b
--- /dev/null
+++ b/oox/inc/oox/ppt/comments.hxx
@@ -0,0 +1,200 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*
+ * This file is part of the LibreOffice project.
+ *
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ *
+ * This file incorporates work covered by the following license notice:
+ *
+ *   Licensed to the Apache Software Foundation (ASF) under one or more
+ *   contributor license agreements. See the NOTICE file distributed
+ *   with this work for additional information regarding copyright
+ *   ownership. The ASF licenses this file to you under the Apache
+ *   License, Version 2.0 (the "License"); you may not use this file
+ *   except in compliance with the License. You may obtain a copy of
+ *   the License at http://www.apache.org/licenses/LICENSE-2.0 .
+ */
+
+
+#ifndef OOX_PPT_COMMENTS_HXX
+#define OOX_PPT_COMMENTS_HXX
+
+#define ELEMENT_NOT_FOUND 0
+
+using rtl::OUString;
+#include <vector>
+#include <boost/algorithm/string.hpp> //split function to tokenize for date time
+
+#include <com/sun/star/util/DateTime.hpp>
+
+
+struct commentAuthor
+{
+    ::rtl::OUString clrIdx;
+    ::rtl::OUString id;
+    ::rtl::OUString initials;
+    ::rtl::OUString lastIdx;
+    ::rtl::OUString name;
+};
+
+class commentAuthorList
+{
+    private:
+        std::vector<commentAuthor> cmAuthorLst;
+    public:
+        void setValues( commentAuthorList list)
+        {
+            std::vector<commentAuthor>::iterator it;
+            for(it=list.cmAuthorLst.begin();it!=list.cmAuthorLst.end();it++)
+            {
+                commentAuthor temp;
+                cmAuthorLst.push_back(temp);
+                cmAuthorLst.back().clrIdx = it->clrIdx;
+                cmAuthorLst.back().id = it->id;
+                cmAuthorLst.back().initials = it->initials;
+                cmAuthorLst.back().lastIdx = it->lastIdx;
+                cmAuthorLst.back().name = it->name;
+            }
+        }
+
+        std::vector<commentAuthor> getCmAuthorLst()
+        {
+            return cmAuthorLst;
+        }
+        void addAuthor(commentAuthor _author)
+        {
+            cmAuthorLst.push_back(_author);
+        }
+        friend class comment;
+};
+
+class comment
+{
+    private:
+        ::rtl::OUString authorId;
+        ::rtl::OUString dt;
+        ::rtl::OUString idx;
+        ::rtl::OUString x;
+        ::rtl::OUString y;
+        ::rtl::OUString text;
+        ::com::sun::star::util::DateTime aDateTime;
+
+    public:
+        void setAuthorId(::rtl::OUString _aId)
+        {
+            authorId = _aId;
+        }
+        void setdt(::rtl::OUString _dt)
+        {
+            dt=_dt;
+            setDateTime(_dt);
+        }
+        void setidx(::rtl::OUString _idx)
+        {
+            idx=_idx;
+        }
+        void setPoint(::rtl::OUString _x, ::rtl::OUString _y)
+        {
+            x=_x;
+            y=_y;
+        }
+        void setText(std::string _text)
+        {
+            text = rtl::OUString::createFromAscii (  _text.c_str() );
+        }
+        void setText(rtl::OUString _text)
+        {
+            text = _text;
+        }
+
+    private:
+    //DateTime is saved as : 2013-01-10T15:53:26.000
+        void setDateTime (::rtl::OUString datetime)
+        {
+            std::string _datetime = rtl::OUStringToOString(datetime, 
RTL_TEXTENCODING_UTF8).getStr();
+            std::vector<std::string> _dt;
+            boost::split( _dt, _datetime, boost::is_any_of( "-:T" ) );
+            aDateTime.Year = atoi(_dt.at(0).c_str());
+            aDateTime.Month = atoi(_dt.at(1).c_str());
+            aDateTime.Day = atoi(_dt.at(2).c_str());
+            aDateTime.Hours = atoi(_dt.at(3).c_str());
+            aDateTime.Minutes = atoi(_dt.at(4).c_str());
+            aDateTime.HundredthSeconds = atoi(_dt.at(5).c_str());
+            std::vector<std::string>::iterator i;
+        }
+
+    public:
+        ::rtl::OUString getAuthorId()
+        {
+            return authorId;
+        }
+        ::rtl::OUString getdt()
+        {
+            return dt;
+        }
+        ::rtl::OUString getidx()
+        {
+            return idx;
+        }
+        ::rtl::OUString get_X()
+        {
+            return x;
+        }
+        ::rtl::OUString get_Y()
+        {
+            return y;
+        }
+        ::rtl::OUString get_text()
+        {
+            return text;
+        }
+        ::com::sun::star::util::DateTime getDateTime()
+        {
+            return aDateTime;
+        }
+        int getIntX()
+        {
+            std::string temp = rtl::OUStringToOString(get_X(), RTL_TEXTENCODING_UTF8).getStr();
+            return atoi(temp.c_str());
+        }
+        int getIntY()
+        {
+            std::string temp = rtl::OUStringToOString(get_Y(), RTL_TEXTENCODING_UTF8).getStr();
+            return atoi(temp.c_str());
+        }
+        commentAuthor getAuthor ( commentAuthorList list )
+        {
+            std::string temp = rtl::OUStringToOString(authorId, RTL_TEXTENCODING_UTF8).getStr();
+            int aId = atoi(temp.c_str());
+            std::vector<commentAuthor>::iterator it;
+            for(it = list.cmAuthorLst.begin(); it != list.cmAuthorLst.end(); it++)
+            {
+                temp = rtl::OUStringToOString(it->id, RTL_TEXTENCODING_UTF8).getStr();
+                int list_aId = atoi(temp.c_str());
+                if(list_aId == aId)
+                    return *(it);
+            }
+            throw ELEMENT_NOT_FOUND;
+        }
+};
+
+class commentList
+{
+    public:
+        std::vector<comment> cmLst;
+        int getSize ()
+        {
+            return (int)cmLst.size();
+        }
+        comment getCommentAtIndex (int index)
+        {
+            if(index < (int)cmLst.size() && index >= 0)
+                return cmLst.at(index);
+            else
+                throw ELEMENT_NOT_FOUND;
+        }
+};
+
+#endif
\ No newline at end of file
diff --git a/oox/inc/oox/ppt/slidefragmenthandler.hxx b/oox/inc/oox/ppt/slidefragmenthandler.hxx
index 4bca8cc..6cd50ab 100644
--- a/oox/inc/oox/ppt/slidefragmenthandler.hxx
+++ b/oox/inc/oox/ppt/slidefragmenthandler.hxx
@@ -39,7 +39,7 @@
 
     virtual void finalizeImport();
     virtual ::oox::core::ContextHandlerRef onCreateContext( sal_Int32 aElementToken, const 
AttributeList& rAttribs );
-
+    void        onCharacters( const ::rtl::OUString& rChars );
 protected:
     SlidePersistPtr     mpSlidePersistPtr;
     ShapeLocation       meShapeLocation;
@@ -47,6 +47,11 @@
 private:
     ::rtl::OUString     maSlideName;
     PropertyMap         maSlideProperties;
+private:
+    ::std::vector< rtl::OUString> charVector; // handle char in OnCharacters
+public:
+    ::std::vector< rtl::OUString> getCharVector(void) { return charVector; }
+
 };
 
 } }
diff --git a/oox/inc/oox/ppt/slidepersist.hxx b/oox/inc/oox/ppt/slidepersist.hxx
index 3c8bf33..68caa18 100644
--- a/oox/inc/oox/ppt/slidepersist.hxx
+++ b/oox/inc/oox/ppt/slidepersist.hxx
@@ -32,6 +32,8 @@
 #include <com/sun/star/animations/XAnimationNode.hpp>
 #include "oox/core/fragmenthandler.hxx"
 
+#include "oox/ppt/comments.hxx"
+
 #include <list>
 
 namespace oox { namespace vml { class Drawing; } }
@@ -116,6 +118,15 @@
     ::oox::drawingml::ShapePtr getShape( const ::rtl::OUString & id ) { return maShapeMap[ id ]; }
     ::oox::drawingml::ShapeIdMap& getShapeMap() { return maShapeMap; }
 
+    //comments
+private:
+    commentList commentsList;
+    commentAuthorList commentAuthors;
+
+public:
+    commentList* getCommentsList() { return &commentsList; }
+    commentAuthorList* getCommentAuthors() { return &commentAuthors; }
+
 private:
     rtl::OUString                                                           maPath;
     rtl::OUString                                                           maLayoutPath;
diff --git a/oox/source/ppt/presentationfragmenthandler.cxx 
b/oox/source/ppt/presentationfragmenthandler.cxx
index 6d077e7..076955b 100644
--- a/oox/source/ppt/presentationfragmenthandler.cxx
+++ b/oox/source/ppt/presentationfragmenthandler.cxx
@@ -31,6 +31,9 @@
 #include <com/sun/star/presentation/XPresentationPage.hpp>
 #include <com/sun/star/task/XStatusIndicator.hpp>
 
+#include <com/sun/star/office/XAnnotation.hpp>
+#include <com/sun/star/office/XAnnotationAccess.hpp> //for comments
+#include <com/sun/star/awt/Point.hpp>
 #include "oox/drawingml/theme.hxx"
 #include "oox/drawingml/drawingmltypes.hxx"
 #include "oox/drawingml/themefragmenthandler.hxx"
@@ -41,6 +44,9 @@
 #include "oox/ppt/layoutfragmenthandler.hxx"
 #include "oox/ppt/pptimport.hxx"
 
+#include "oox/ppt/comments.hxx"
+
+using rtl::OUString;
 using namespace ::com::sun::star;
 using namespace ::oox::core;
 using namespace ::oox::drawingml;
@@ -132,6 +138,8 @@
 
 void PresentationFragmentHandler::finalizeImport()
 {
+    commentAuthorList AuthorList;
+    int readCommentAuthors; // read commentAuthors.xml only once
     // todo: localized progress bar text
     const Reference< task::XStatusIndicator >& rxStatusIndicator( getFilter().getStatusIndicator() 
);
     if ( rxStatusIndicator.is() )
@@ -149,6 +157,7 @@
         Reference< drawing::XDrawPagesSupplier > xDPS( xModel, uno::UNO_QUERY_THROW );
         Reference< drawing::XDrawPages > xDrawPages( xDPS->getDrawPages(), uno::UNO_QUERY_THROW );
 
+        readCommentAuthors = 0; // as commentAuthors.xml has not been read still
         for( nSlide = 0; nSlide < maSlidesVector.size(); nSlide++ )
         {
             if ( rxStatusIndicator.is() )
@@ -171,6 +180,7 @@
 
                 // importing the corresponding masterpage/layout
                 OUString aLayoutFragmentPath = 
xSlideFragmentHandler->getFragmentPathFromFirstType( CREATE_OFFICEDOC_RELATION_TYPE( "slideLayout" 
) );
+                OUString aCommentFragmentPath = 
xSlideFragmentHandler->getFragmentPathFromFirstType( CREATE_OFFICEDOC_RELATION_TYPE( "comments" ) );
                 if ( !aLayoutFragmentPath.isEmpty() )
                 {
                     // importing layout
@@ -279,6 +289,48 @@
                         }
                     }
                 }
+
+                if( !aCommentFragmentPath.isEmpty() && readCommentAuthors == 0 )
+                {// Comments are present and commentAuthors.xml has still not been read
+                    readCommentAuthors = 1; //set to true
+                    rtl::OUString aCommentAuthorsFragmentPath = "ppt/commentAuthors.xml";
+                    Reference< XPresentationPage > xPresentationPage( xSlide, UNO_QUERY );
+                    Reference< XDrawPage > xCommentAuthorsPage( xPresentationPage->getNotesPage() 
);
+                    SlidePersistPtr pCommentAuthorsPersistPtr( new SlidePersist( rFilter, 
sal_False, sal_True, xCommentAuthorsPage,
+                                ShapePtr( new PPTShape( Slide, "com.sun.star.drawing.GroupShape" ) 
), mpTextListStyle ) );
+                    FragmentHandlerRef xCommentAuthorsFragmentHandler( new SlideFragmentHandler( 
getFilter(), aCommentAuthorsFragmentPath, pCommentAuthorsPersistPtr, Slide ) );
+
+                    importSlide( xCommentAuthorsFragmentHandler, pCommentAuthorsPersistPtr );
+                    AuthorList.setValues(*(pCommentAuthorsPersistPtr->getCommentAuthors()));
+                }
+                if( !aCommentFragmentPath.isEmpty() )
+                {   Reference< XPresentationPage > xPresentationPage( xSlide, UNO_QUERY );
+                    Reference< XDrawPage > xCommentsPage( xPresentationPage->getNotesPage() );
+                    SlidePersistPtr pCommentsPersistPtr( new SlidePersist( rFilter, sal_False, 
sal_True, xCommentsPage,
+                                ShapePtr( new PPTShape( Slide, "com.sun.star.drawing.GroupShape" ) 
), mpTextListStyle ) );
+                    FragmentHandlerRef xCommentsFragmentHandler( new SlideFragmentHandler( 
getFilter(), aCommentFragmentPath, pCommentsPersistPtr, Slide ) );
+                    pCommentsPersistPtr->getCommentsList()->cmLst.clear();
+                    importSlide( xCommentsFragmentHandler, pCommentsPersistPtr );
+                    SlideFragmentHandler *comment_handler = 
dynamic_cast<SlideFragmentHandler*>(xCommentsFragmentHandler.get());
+                    pCommentsPersistPtr->getCommentsList()->cmLst.back().setText( 
comment_handler->getCharVector().back() );//set comment chars for last comment on slide
+
+                    pCommentsPersistPtr->getCommentAuthors()->setValues(AuthorList);
+                    //insert all comments from commentsList
+                    for(int i=0;   i<pCommentsPersistPtr->getCommentsList()->getSize();   i++)
+                    {
+                        uno::Reference< office::XAnnotationAccess > xAnnotationAccess( xSlide, 
UNO_QUERY_THROW );
+                        uno::Reference< office::XAnnotation > xAnnotation( 
xAnnotationAccess->createAndInsertAnnotation() );
+                        int nPosX = 
pCommentsPersistPtr->getCommentsList()->getCommentAtIndex(i).getIntX();
+                        int nPosY = 
pCommentsPersistPtr->getCommentsList()->getCommentAtIndex(i).getIntY();
+                        xAnnotation->setPosition( geometry::RealPoint2D( 
::oox::drawingml::convertEmuToHmm( nPosX ) * 15.87 , ::oox::drawingml::convertEmuToHmm( nPosY ) * 
15.87 ) );
+                        xAnnotation->setAuthor( 
pCommentsPersistPtr->getCommentsList()->getCommentAtIndex(i).getAuthor(*(pCommentsPersistPtr->getCommentAuthors())).name
 );
+                        xAnnotation->setDateTime( 
pCommentsPersistPtr->getCommentsList()->getCommentAtIndex(i).getDateTime() );
+                        uno::Reference< text::XText > xText( xAnnotation->getTextRange() );
+                        xText->setString( 
pCommentsPersistPtr->getCommentsList()->getCommentAtIndex(i).get_text());
+                    }
+
+                }
+
             }
         }
         ResolveTextFields( rFilter );
diff --git a/oox/source/ppt/slidefragmenthandler.cxx b/oox/source/ppt/slidefragmenthandler.cxx
index 12b0ebb..5d69d34 100644
--- a/oox/source/ppt/slidefragmenthandler.cxx
+++ b/oox/source/ppt/slidefragmenthandler.cxx
@@ -39,6 +39,7 @@
 #include "oox/ppt/pptimport.hxx"
 
 
+using rtl::OUString;
 using namespace ::com::sun::star;
 using namespace ::oox::core;
 using namespace ::oox::drawingml;
@@ -188,11 +189,42 @@
     case PPT_TOKEN( custDataLst ):      // CT_CustomerDataList
     case PPT_TOKEN( tagLst ):           // CT_TagList
         return this;
+
+    //for Comments
+    case PPT_TOKEN( cmLst ):
+    break;
+    case PPT_TOKEN( cm ):
+
+        if(!mpSlidePersistPtr->getCommentsList()->cmLst.empty())
+        {    mpSlidePersistPtr->getCommentsList()->cmLst.back().setText( getCharVector().back() ); 
// set comment text for earlier comment
+        }
+        mpSlidePersistPtr->getCommentsList()->cmLst.push_back(comment()); // insert a new comment 
in vector commentsList
+        
mpSlidePersistPtr->getCommentsList()->cmLst.back().setAuthorId(rAttribs.getString(XML_authorId, 
OUString())); //set AuthorId
+        mpSlidePersistPtr->getCommentsList()->cmLst.back().setdt(rAttribs.getString(XML_dt, 
OUString())); //set dt
+        mpSlidePersistPtr->getCommentsList()->cmLst.back().setidx(rAttribs.getString(XML_idx, 
OUString()));  //set idx
+        break;
+
+    case PPT_TOKEN( pos ):
+        mpSlidePersistPtr->getCommentsList()->cmLst.back().setPoint(rAttribs.getString(XML_x, 
OUString()),rAttribs.getString(XML_y, OUString())); //set x , set y
+        break;
+   //case PPT_TOKEN( text ):
+
+    case PPT_TOKEN( cmAuthor ):
+        commentAuthor _author;
+        _author.clrIdx = rAttribs.getString(XML_clrIdx, OUString()); //set clrIdx
+        _author.id = rAttribs.getString(XML_id, OUString()); // set id
+        _author.initials = rAttribs.getString(XML_initials, OUString()); // set initials
+        _author.lastIdx = rAttribs.getString(XML_lastIdx, OUString()); // set lastIdx
+        _author.name = rAttribs.getString(XML_name, OUString()); //set name
+        mpSlidePersistPtr->getCommentAuthors()->addAuthor(_author); // insert a new comment Author 
in cmAuthorList
     }
 
     return this;
 }
-
+void SlideFragmentHandler::onCharacters( const OUString& rChars)
+{
+    charVector.push_back(rChars);
+}
 void SlideFragmentHandler::finalizeImport()
 {
     try

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

Gerrit-MessageType: newchange
Gerrit-Change-Id: Iefb3be71837ab4c05d8b83e695f86e433cd2119d
Gerrit-PatchSet: 1
Gerrit-Project: core
Gerrit-Branch: master
Gerrit-Owner: Fridrich Strba <fridrich@documentfoundation.org>
Gerrit-Reviewer: vinaya mandke <vinaya.mandke@synerzip.com>


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.