libreofficekit/qa/gtktiledviewer/gtktiledviewer.cxx | 2 sc/source/core/data/column2.cxx | 43 ++++++++++----- sc/source/ui/docshell/docfunc.cxx | 11 +++ sc/source/ui/docshell/docsh4.cxx | 56 ++++++++++++++++++++ sc/source/ui/inc/docsh.hxx | 3 + 5 files changed, 98 insertions(+), 17 deletions(-)
New commits: commit 748361ada42ffef774a7cb68f704de0e9edb5639 Author: Pranav Kant <pran...@collabora.co.uk> Date: Thu Feb 16 00:54:48 2017 +0530 gtktiledviewer: Different UNO command for calc Change-Id: I229451bac7cf4c223efd3fa18c177d650d3f9954 Reviewed-on: https://gerrit.libreoffice.org/34327 Tested-by: Jenkins <c...@libreoffice.org> Reviewed-by: pranavk <pran...@collabora.co.uk> diff --git a/libreofficekit/qa/gtktiledviewer/gtktiledviewer.cxx b/libreofficekit/qa/gtktiledviewer/gtktiledviewer.cxx index 28a1f6b..3115fd4 100644 --- a/libreofficekit/qa/gtktiledviewer/gtktiledviewer.cxx +++ b/libreofficekit/qa/gtktiledviewer/gtktiledviewer.cxx @@ -347,7 +347,7 @@ static void deleteCommentButtonClicked(GtkWidget* pWidget, gpointer userdata) boost::property_tree::write_json(aStream, aTree); std::string aArguments = aStream.str(); - lok_doc_view_post_command(LOK_DOC_VIEW(rWindow.m_pDocView), ".uno:DeleteComment", aArguments.c_str(), false); + lok_doc_view_post_command(LOK_DOC_VIEW(rWindow.m_pDocView), rWindow.m_aToolItemCommandNames[rWindow.m_pDeleteComment].c_str(), aArguments.c_str(), false); } GtkWidget* CommentsSidebar::createCommentBox(const boost::property_tree::ptree& aComment) commit 57056e5d6032ff1ce0a91c078ebaa1deeaa9dc6f Author: Pranav Kant <pran...@collabora.co.uk> Date: Wed Feb 15 23:55:38 2017 +0530 sc lok: implement comment callbacks Change-Id: I1253138aa530ecb2b63bf6cda658d480ac62ada5 Reviewed-on: https://gerrit.libreoffice.org/34326 Tested-by: Jenkins <c...@libreoffice.org> Reviewed-by: pranavk <pran...@collabora.co.uk> diff --git a/sc/source/core/data/column2.cxx b/sc/source/core/data/column2.cxx index b11a297..1fda6e2 100644 --- a/sc/source/core/data/column2.cxx +++ b/sc/source/core/data/column2.cxx @@ -18,6 +18,7 @@ */ #include "column.hxx" +#include "docsh.hxx" #include "scitems.hxx" #include "formulacell.hxx" #include "document.hxx" @@ -1875,26 +1876,38 @@ void ScColumn::SetCellNote(SCROW nRow, ScPostIt* pNote) } namespace { -class ForgetCellNoteCaptionsHandler -{ + class CellNoteHandler + { + const ScDocument* m_pDocument; + const ScAddress m_aAddress; // 'incomplete' address consisting of tab, column + const bool m_bForgetCaptionOwnership; -public: - ForgetCellNoteCaptionsHandler() {} + public: + CellNoteHandler(const ScDocument* pDocument, const ScAddress& rPos, bool bForgetCaptionOwnership) : + m_pDocument(pDocument), + m_aAddress(rPos), + m_bForgetCaptionOwnership(bForgetCaptionOwnership) {} - void operator() ( size_t /*nRow*/, ScPostIt* p ) - { - p->ForgetCaption(); - } -}; -} + void operator() ( size_t nRow, ScPostIt* p ) + { + if (m_bForgetCaptionOwnership) + p->ForgetCaption(); + + // Create a 'complete' address object + ScAddress aAddr(m_aAddress); + aAddr.SetRow(nRow); + // Notify our LOK clients + ScDocShell::LOKCommentNotify(LOKCommentNotificationType::Remove, m_pDocument, aAddr, p); + } + }; +} // anonymous namespace void ScColumn::DeleteCellNotes( sc::ColumnBlockPosition& rBlockPos, SCROW nRow1, SCROW nRow2, bool bForgetCaptionOwnership ) { - if (bForgetCaptionOwnership) - { - ForgetCellNoteCaptionsHandler aFunc; - sc::ParseNote(maCellNotes.begin(), maCellNotes, nRow1, nRow2, aFunc); - } + ScAddress aAddr(nCol, 0, nTab); + CellNoteHandler aFunc(pDocument, aAddr, bForgetCaptionOwnership); + sc::ParseNote(maCellNotes.begin(), maCellNotes, nRow1, nRow2, aFunc); + rBlockPos.miCellNotePos = maCellNotes.set_empty(rBlockPos.miCellNotePos, nRow1, nRow2); } diff --git a/sc/source/ui/docshell/docfunc.cxx b/sc/source/ui/docshell/docfunc.cxx index dde0818..6c5dbe7 100644 --- a/sc/source/ui/docshell/docfunc.cxx +++ b/sc/source/ui/docshell/docfunc.cxx @@ -1290,10 +1290,12 @@ void ScDocFunc::ReplaceNote( const ScAddress& rPos, const OUString& rNoteText, c // create new note (creates drawing undo action for the new caption object) ScNoteData aNewData; - if( ScPostIt* pNewNote = ScNoteUtil::CreateNoteFromString( rDoc, rPos, rNoteText, false, true ) ) + ScPostIt* pNewNote = nullptr; + if( (pNewNote = ScNoteUtil::CreateNoteFromString( rDoc, rPos, rNoteText, false, true )) ) { if( pAuthor ) pNewNote->SetAuthor( *pAuthor ); if( pDate ) pNewNote->SetDate( *pDate ); + // rescue note data for undo aNewData = pNewNote->GetNoteData(); } @@ -1309,6 +1311,13 @@ void ScDocFunc::ReplaceNote( const ScAddress& rPos, const OUString& rNoteText, c rDoc.SetStreamValid(rPos.Tab(), false); aModificator.SetDocumentModified(); + + // Let our LOK clients know about the new/modified note + if (pNewNote) + { + ScDocShell::LOKCommentNotify(pOldNote ? LOKCommentNotificationType::Modify : LOKCommentNotificationType::Add, + &rDoc, rPos, pNewNote); + } } else if (!bApi) { diff --git a/sc/source/ui/docshell/docsh4.cxx b/sc/source/ui/docshell/docsh4.cxx index 6b2ee92..207b37b 100644 --- a/sc/source/ui/docshell/docsh4.cxx +++ b/sc/source/ui/docshell/docsh4.cxx @@ -19,6 +19,8 @@ #include <config_features.h> +#include <boost/property_tree/json_parser.hpp> + #include <com/sun/star/embed/XEmbeddedObject.hpp> #include <com/sun/star/frame/Desktop.hpp> #include <com/sun/star/frame/XComponentLoader.hpp> @@ -51,7 +53,9 @@ using namespace ::com::sun::star; #include <svl/documentlockfile.hxx> #include <svl/sharecontrolfile.hxx> #include <unotools/securityoptions.hxx> +#include <LibreOfficeKit/LibreOfficeKitEnums.h> +#include <comphelper/lok.hxx> #include <comphelper/processfactory.hxx> #include "docuno.hxx" @@ -2238,6 +2242,58 @@ bool ScDocShell::DdeSetData( const OUString& rItem, return pObj; } +void ScDocShell::LOKCommentNotify(LOKCommentNotificationType nType, const ScDocument* pDocument, const ScAddress& rPos, const ScPostIt* pNote) +{ + if ( !pDocument->IsDocVisible() || // don't want callbacks until document load + !comphelper::LibreOfficeKit::isActive() || + comphelper::LibreOfficeKit::isTiledAnnotations() ) + return; + + boost::property_tree::ptree aAnnotation; + aAnnotation.put("action", (nType == LOKCommentNotificationType::Add ? "Add" : + (nType == LOKCommentNotificationType::Remove ? "Remove" : + (nType == LOKCommentNotificationType::Modify ? "Modify" : "???")))); + OUString aCellId = rPos.Format(ScRefFlags::VALID | ScRefFlags::TAB_3D, pDocument, + ScAddress::Details(formula::FormulaGrammar::AddressConvention::CONV_ODF, rPos)); + aAnnotation.put("id", aCellId.toUtf8().getStr()); + if (nType != LOKCommentNotificationType::Remove && pNote) + { + aAnnotation.put("author", pNote->GetAuthor()); + aAnnotation.put("dateTime", pNote->GetDate()); + aAnnotation.put("text", pNote->GetText()); + + // Calculating the cell cursor position + ScViewData* pViewData = GetViewData(); + if (pViewData && pViewData->GetActiveWin()) + { + Point aScrPos = pViewData->GetScrPos(rPos.Col(), rPos.Row(), pViewData->GetActivePart(), true); + long nSizeXPix; + long nSizeYPix; + pViewData->GetMergeSizePixel(rPos.Col(), rPos.Row(), nSizeXPix, nSizeYPix); + + const double fPPTX = pViewData->GetPPTX(); + const double fPPTY = pViewData->GetPPTY(); + Rectangle aRect(Point(aScrPos.getX() / fPPTX, aScrPos.getY() / fPPTY), + Size(nSizeXPix / fPPTX, nSizeYPix / fPPTY)); + + aAnnotation.put("cellPos", aRect.toString()); + } + } + + boost::property_tree::ptree aTree; + aTree.add_child("comment", aAnnotation); + std::stringstream aStream; + boost::property_tree::write_json(aStream, aTree); + std::string aPayload = aStream.str(); + + SfxViewShell* pViewShell = SfxViewShell::GetFirst(); + while (pViewShell) + { + pViewShell->libreOfficeKitViewCallback(LOK_CALLBACK_COMMENT, aPayload.c_str()); + pViewShell = SfxViewShell::GetNext(*pViewShell); + } +} + ScViewData* ScDocShell::GetViewData() { SfxViewShell* pCur = SfxViewShell::Current(); diff --git a/sc/source/ui/inc/docsh.hxx b/sc/source/ui/inc/docsh.hxx index e2a75c3..a9349b4 100644 --- a/sc/source/ui/inc/docsh.hxx +++ b/sc/source/ui/inc/docsh.hxx @@ -75,6 +75,8 @@ typedef std::unordered_map< sal_uLong, sal_uLong > ScChangeActionMergeMap; //enum ScDBFormat { SC_FORMAT_SDF, SC_FORMAT_DBF }; +enum class LOKCommentNotificationType { Add, Modify, Remove }; + // Extra flags for Repaint #define SC_PF_LINES 1 #define SC_PF_TESTMERGE 2 @@ -398,6 +400,7 @@ public: static OUString GetDBaseFilterName(); static OUString GetDifFilterName(); static bool HasAutomaticTableName( const OUString& rFilter ); + static void LOKCommentNotify(LOKCommentNotificationType nType, const ScDocument* pDocument, const ScAddress& rPos, const ScPostIt* pNote); DECL_LINK( RefreshDBDataHdl, Timer*, void ); _______________________________________________ Libreoffice-commits mailing list libreoffice-comm...@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/libreoffice-commits