From ebb728c9c01b5e86926381fa816cf69cb3eb1e37 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Caol=C3=A1n=20McNamara?= Date: Tue, 22 Apr 2014 17:06:26 +0100 Subject: [PATCH] add a 'format all comments' feature Change-Id: Ie9530f0f58b38d014beda60b9efba3ce93fe5c0e --- .../org/openoffice/Office/UI/GenericCommands.xcu | 5 ++ sw/inc/PostItMgr.hxx | 5 ++ sw/inc/cmdid.h | 2 +- sw/inc/swcommands.h | 1 + sw/sdi/_annotsh.sdi | 6 ++ sw/sdi/_textsh.sdi | 5 ++ sw/sdi/swriter.sdi | 24 +++++++ .../core/uibase/docvw/AnnotationMenuButton.cxx | 2 + sw/source/core/uibase/docvw/PostItMgr.cxx | 77 +++++++++++++++++++++- sw/source/core/uibase/docvw/SidebarWin.cxx | 1 + sw/source/core/uibase/docvw/annotation.hrc | 1 + sw/source/core/uibase/inc/annotsh.hxx | 2 + sw/source/core/uibase/shells/annotsh.cxx | 17 +++-- sw/source/core/uibase/shells/textfld.cxx | 14 +++- sw/source/ui/app/mn.src | 6 ++ sw/source/ui/docvw/annotation.src | 5 ++ 16 files changed, 166 insertions(+), 7 deletions(-) diff --git a/officecfg/registry/data/org/openoffice/Office/UI/GenericCommands.xcu b/officecfg/registry/data/org/openoffice/Office/UI/GenericCommands.xcu index a16b900..a2d997c 100644 --- a/officecfg/registry/data/org/openoffice/Office/UI/GenericCommands.xcu +++ b/officecfg/registry/data/org/openoffice/Office/UI/GenericCommands.xcu @@ -5298,6 +5298,11 @@ Delete All Comments + + + Format All Comments + + Delete All Comments by This Author diff --git a/sw/inc/PostItMgr.hxx b/sw/inc/PostItMgr.hxx index 0ac0273..56760fd 100644 --- a/sw/inc/PostItMgr.hxx +++ b/sw/inc/PostItMgr.hxx @@ -44,6 +44,8 @@ class SfxBroadcaster; class SfxHint; class SwEditWin; class Color; +class SfxItemPool; +class SfxItemSet; class SvxSearchItem; class SvxLanguageItem; namespace sw { namespace annotation { @@ -219,6 +221,9 @@ class SwPostItMgr: public SfxListener void Delete(OUString aAuthor); void Delete(); + void ExecuteFormatAllDialog(SwView& rView); + void FormatAll(const SfxItemSet &rNewAttr); + void Hide( const OUString& rAuthor ); void Hide(); void Show(); diff --git a/sw/inc/cmdid.h b/sw/inc/cmdid.h index 7d506a3..b10359a 100644 --- a/sw/inc/cmdid.h +++ b/sw/inc/cmdid.h @@ -780,7 +780,7 @@ included in c-context files, so c++ style stuff will cause problems. #define FN_DELETE_COMMENT (FN_NOTES+6) #define FN_REPLY (FN_NOTES+7) - +#define FN_FORMAT_ALL_NOTES (FN_NOTES+8) #define FN_HEADERFOOTER_EDIT (FN_HEADERFOOTER+1) #define FN_HEADERFOOTER_DELETE (FN_HEADERFOOTER+2) diff --git a/sw/inc/swcommands.h b/sw/inc/swcommands.h index 0f5cd54..cc9bc07 100644 --- a/sw/inc/swcommands.h +++ b/sw/inc/swcommands.h @@ -116,6 +116,7 @@ #define CMD_FN_DELETE_COMMENT ".uno:DeleteComment" #define CMD_FN_DELETE_NOTE_AUTHOR ".uno:DeleteAuthor" #define CMD_FN_DELETE_ALL_NOTES ".uno:DeleteAllNotes" +#define CMD_FN_FORMAT_ALL_NOTES ".uno:FormatAllNotes" #define CMD_FN_HIDE_NOTE ".uno:HideNote" #define CMD_FN_HIDE_NOTE_AUTHOR ".uno:HideAuthor" #define CMD_FN_HIDE_ALL_NOTES ".uno:HideAllNotes" diff --git a/sw/sdi/_annotsh.sdi b/sw/sdi/_annotsh.sdi index 142d5e7..15f03ad 100644 --- a/sw/sdi/_annotsh.sdi +++ b/sw/sdi/_annotsh.sdi @@ -37,6 +37,12 @@ interface _Annotation StateMethod = GetNoteState ; ] + FN_FORMAT_ALL_NOTES + [ + ExecMethod = NoteExec ; + StateMethod = GetNoteState ; + ] + FN_HIDE_NOTE [ ExecMethod = NoteExec ; diff --git a/sw/sdi/_textsh.sdi b/sw/sdi/_textsh.sdi index 0fb5cdb..c90bfcd 100644 --- a/sw/sdi/_textsh.sdi +++ b/sw/sdi/_textsh.sdi @@ -941,6 +941,11 @@ interface BaseText ExecMethod = ExecField ; StateMethod = StateField; ] + FN_FORMAT_ALL_NOTES + [ + ExecMethod = ExecField ; + StateMethod = StateField; + ] FN_HIDE_NOTE [ ExecMethod = ExecField ; diff --git a/sw/sdi/swriter.sdi b/sw/sdi/swriter.sdi index f8218fe..9312844 100644 --- a/sw/sdi/swriter.sdi +++ b/sw/sdi/swriter.sdi @@ -9920,6 +9920,30 @@ SfxVoidItem DeleteAllNotes FN_DELETE_ALL_NOTES GroupId = GID_EDIT; ] +SfxVoidItem FormatAllNotes FN_FORMAT_ALL_NOTES +() +[ + /* flags: */ + AutoUpdate = FALSE, + Cachable = Cachable, + FastCall = FALSE, + HasCoreId = FALSE, + HasDialog = FALSE, + ReadOnlyDoc = FALSE, + Toggle = FALSE, + Container = FALSE, + RecordAbsolute = FALSE, + RecordPerSet; + Synchron; + + /* config: */ + AccelConfig = TRUE, + MenuConfig = TRUE, + StatusBarConfig = FALSE, + ToolBoxConfig = TRUE, + GroupId = GID_EDIT; +] + //-------------------------------------------------------------------------- SfxVoidItem HideNote FN_HIDE_NOTE () diff --git a/sw/source/ui/app/mn.src b/sw/source/ui/app/mn.src index eb5ee0e..94ddb2f 100644 --- a/sw/source/ui/app/mn.src +++ b/sw/source/ui/app/mn.src @@ -761,6 +761,12 @@ location: /uiconfig/[swriter|sweb|sglobal]/menubar/menubar.xml HelpId = CMD_FN_DELETE_ALL_NOTES ;\ Text [ en-US ] = "~Delete All Comments" ;\ };\ + MenuItem\ + {\ + Identifier = FN_FORMAT_ALL_NOTES ;\ + HelpId = CMD_FN_FORMAT_ALL_NOTES ;\ + Text [ en-US ] = "~Format All Comments" ;\ + };\ /* MenuItem\ {\ diff --git a/sw/source/ui/docvw/AnnotationMenuButton.cxx b/sw/source/ui/docvw/AnnotationMenuButton.cxx index 0bd4bf2..218daee 100644 --- a/sw/source/ui/docvw/AnnotationMenuButton.cxx +++ b/sw/source/ui/docvw/AnnotationMenuButton.cxx @@ -74,12 +74,14 @@ void AnnotationMenuButton::MouseButtonDown( const MouseEvent& rMEvt ) pButtonPopup->EnableItem( FN_DELETE_COMMENT, false ); pButtonPopup->EnableItem( FN_DELETE_NOTE_AUTHOR, false ); pButtonPopup->EnableItem( FN_DELETE_ALL_NOTES, false ); + pButtonPopup->EnableItem( FN_FORMAT_ALL_NOTES, false ); } else { pButtonPopup->EnableItem( FN_DELETE_COMMENT, !mrSidebarWin.IsProtected() ); pButtonPopup->EnableItem( FN_DELETE_NOTE_AUTHOR, true ); pButtonPopup->EnableItem( FN_DELETE_ALL_NOTES, true ); + pButtonPopup->EnableItem( FN_FORMAT_ALL_NOTES, true ); } if ( mrSidebarWin.IsProtected() ) diff --git a/sw/source/ui/docvw/PostItMgr.cxx b/sw/source/ui/docvw/PostItMgr.cxx index e6b7cb6..c2b1225 100644 --- a/sw/source/ui/docvw/PostItMgr.cxx +++ b/sw/source/ui/docvw/PostItMgr.cxx @@ -34,8 +34,8 @@ #include #include +#include #include - #include #include #include @@ -67,11 +67,14 @@ #include #include #include +#include #include #include #include +#include "annotsh.hxx" +#include "swabstdlg.hxx" #include "swevent.hxx" #include "switerator.hxx" @@ -1227,6 +1230,78 @@ void SwPostItMgr::Delete() CalcRects(); LayoutPostIts(); } + +void SwPostItMgr::ExecuteFormatAllDialog(SwView& rView) +{ + if (mvPostItFlds.empty()) + return; + sw::sidebarwindows::SwSidebarWin *pOrigActiveWin = GetActiveSidebarWin(); + sw::sidebarwindows::SwSidebarWin *pWin = pOrigActiveWin; + if (!pWin) + { + for (SwSidebarItem_iterator i = mvPostItFlds.begin(); i != mvPostItFlds.end(); ++i) + { + pWin = (*i)->pPostIt; + if (pWin) + break; + } + } + if (!pWin) + return; + SetActiveSidebarWin(pWin); + OutlinerView* pOLV = pWin->GetOutlinerView(); + SfxItemSet aEditAttr(pOLV->GetAttribs()); + SfxItemPool* pPool(SwAnnotationShell::GetAnnotationPool(rView)); + SfxItemSet aDlgAttr(*pPool, EE_ITEMS_START, EE_ITEMS_END); + aDlgAttr.Put(aEditAttr); + SwAbstractDialogFactory* pFact = SwAbstractDialogFactory::Create(); + SfxAbstractTabDialog* pDlg = pFact->CreateSwCharDlg(rView.GetWindow(), rView, aDlgAttr, DLG_CHAR_ANN); + sal_uInt16 nRet = pDlg->Execute(); + if (RET_OK == nRet) + { + aDlgAttr.Put(*pDlg->GetOutputItemSet()); + FormatAll(aDlgAttr); + } + delete pDlg; + SetActiveSidebarWin(pOrigActiveWin); +} + +void SwPostItMgr::FormatAll(const SfxItemSet &rNewAttr) +{ + mpWrtShell->StartAllAction(); + SwRewriter aRewriter; + aRewriter.AddRule(UndoArg1, SW_RES(STR_FORMAT_ALL_NOTES) ); + mpWrtShell->StartUndo( UNDO_INSATTR, &aRewriter ); + + for(SwSidebarItem_iterator i = mvPostItFlds.begin(); i != mvPostItFlds.end() ; ++i) + { + if (!(*i)->pPostIt) + continue; + OutlinerView* pOLV = (*i)->pPostIt->GetOutlinerView(); + //save old selection + ESelection aOrigSel(pOLV->GetSelection()); + //select all + Outliner *pOutliner = pOLV->GetOutliner(); + if (pOutliner) + { + sal_Int32 nParaCount = pOutliner->GetParagraphCount(); + if (nParaCount > 0) + pOLV->SelectRange(0, nParaCount); + } + //set new char properties + pOLV->SetAttribs(rNewAttr); + //restore old selection + pOLV->SetSelection(aOrigSel); + } + + mpWrtShell->EndUndo(); + PrepareView(); + mpWrtShell->EndAllAction(); + mbLayout = true; + CalcRects(); + LayoutPostIts(); +} + void SwPostItMgr::Hide( const OUString& rAuthor ) { for(SwSidebarItem_iterator i = mvPostItFlds.begin(); i != mvPostItFlds.end() ; ++i) diff --git a/sw/source/ui/docvw/SidebarWin.cxx b/sw/source/ui/docvw/SidebarWin.cxx index 275b72e..4a0d4a7 100644 --- a/sw/source/ui/docvw/SidebarWin.cxx +++ b/sw/source/ui/docvw/SidebarWin.cxx @@ -971,6 +971,7 @@ void SwSidebarWin::ExecuteCommand(sal_uInt16 nSlot) //Delete(); // do not kill the parent of our open popup menu mnEventId = Application::PostUserEvent( LINK( this, SwSidebarWin, DeleteHdl), 0 ); break; + case FN_FORMAT_ALL_NOTES: case FN_DELETE_ALL_NOTES: case FN_HIDE_ALL_NOTES: // not possible as slot as this would require that "this" is the active postit diff --git a/sw/source/ui/docvw/annotation.hrc b/sw/source/ui/docvw/annotation.hrc index 7daf555..5fe3e49 100644 --- a/sw/source/ui/docvw/annotation.hrc +++ b/sw/source/ui/docvw/annotation.hrc @@ -32,6 +32,7 @@ #define STR_NOAUTHOR (RC_ANNOTATION_BEGIN + 6) #define STR_REPLY (RC_ANNOTATION_BEGIN + 7) +#define STR_FORMAT_ALL_NOTES (RC_ANNOTATION_BEGIN + 8) #define ANNOTATION_ACT_END STR_REPLY diff --git a/sw/source/ui/docvw/annotation.src b/sw/source/ui/docvw/annotation.src index 46afad9..a45c3ca 100644 --- a/sw/source/ui/docvw/annotation.src +++ b/sw/source/ui/docvw/annotation.src @@ -35,6 +35,11 @@ String STR_DELETE_ALL_NOTES Text [ en-US ] = "All Comments" ; }; +String STR_FORMAT_ALL_NOTES +{ + Text [ en-US ] = "All Comments" ; +}; + String STR_DELETE_AUTHOR_NOTES { Text [ en-US ] = "Comments by " ; diff --git a/sw/source/ui/inc/annotsh.hxx b/sw/source/ui/inc/annotsh.hxx index 5872c95..09961a7 100644 --- a/sw/source/ui/inc/annotsh.hxx +++ b/sw/source/ui/inc/annotsh.hxx @@ -68,6 +68,8 @@ public: virtual ::svl::IUndoManager* GetUndoManager(); + + static SfxItemPool* GetAnnotationPool(SwView& rV); }; #endif diff --git a/sw/source/ui/shells/annotsh.cxx b/sw/source/ui/shells/annotsh.cxx index 1106013..c83a99d 100644 --- a/sw/source/ui/shells/annotsh.cxx +++ b/sw/source/ui/shells/annotsh.cxx @@ -145,11 +145,16 @@ SFX_IMPL_INTERFACE(SwAnnotationShell, SfxShell, SW_RES(STR_SHELLNAME_DRAW_TEXT)) TYPEINIT1(SwAnnotationShell,SfxShell) +SfxItemPool* SwAnnotationShell::GetAnnotationPool(SwView& rV) +{ + SwWrtShell &rSh = rV.GetWrtShell(); + return rSh.GetAttrPool().GetSecondaryPool(); +} + SwAnnotationShell::SwAnnotationShell( SwView& r ) -: rView(r) + : rView(r) { - SwWrtShell &rSh = rView.GetWrtShell(); - SetPool(rSh.GetAttrPool().GetSecondaryPool()); + SetPool(SwAnnotationShell::GetAnnotationPool(rView)); SfxShell::SetContextName(sfx2::sidebar::EnumContext::GetContextName(sfx2::sidebar::EnumContext::Context_Annotation)); } @@ -1087,9 +1092,12 @@ void SwAnnotationShell::NoteExec(SfxRequest &rReq) pPostItMgr->GetActiveSidebarWin()->ExecuteCommand(nSlot); break; - case FN_DELETE_ALL_NOTES: + case FN_DELETE_ALL_NOTES: pPostItMgr->Delete(); break; + case FN_FORMAT_ALL_NOTES: + pPostItMgr->ExecuteFormatAllDialog(rView); + break; case FN_DELETE_NOTE_AUTHOR: { SFX_REQUEST_ARG( rReq, pItem, SfxStringItem, nSlot, sal_False); @@ -1124,6 +1132,7 @@ void SwAnnotationShell::GetNoteState(SfxItemSet &rSet) case FN_POSTIT: case FN_DELETE_NOTE_AUTHOR: case FN_DELETE_ALL_NOTES: + case FN_FORMAT_ALL_NOTES: case FN_HIDE_NOTE: case FN_HIDE_NOTE_AUTHOR: case FN_HIDE_ALL_NOTES: diff --git a/sw/source/ui/shells/textfld.cxx b/sw/source/ui/shells/textfld.cxx index a7050c4..7289f37 100644 --- a/sw/source/ui/shells/textfld.cxx +++ b/sw/source/ui/shells/textfld.cxx @@ -18,9 +18,13 @@ */ +#include #include #include - +#include +#include +#include +#include #include #include #include @@ -321,6 +325,13 @@ void SwTextShell::ExecField(SfxRequest &rReq) if ( GetView().GetPostItMgr() ) GetView().GetPostItMgr()->Delete(); break; + case FN_FORMAT_ALL_NOTES: + { + SwPostItMgr* pPostItMgr = GetView().GetPostItMgr(); + if (pPostItMgr) + pPostItMgr->ExecuteFormatAllDialog(GetView()); + } + break; case FN_DELETE_NOTE_AUTHOR: { SFX_REQUEST_ARG( rReq, pNoteItem, SfxStringItem, nSlot, sal_False); @@ -629,6 +640,7 @@ void SwTextShell::StateField( SfxItemSet &rSet ) case FN_DELETE_COMMENT: case FN_DELETE_NOTE_AUTHOR: case FN_DELETE_ALL_NOTES: + case FN_FORMAT_ALL_NOTES: case FN_HIDE_NOTE: case FN_HIDE_NOTE_AUTHOR: case FN_HIDE_ALL_NOTES: