From 1c0faa439590fc700d9735051ab4c353ac9a265c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Caol=C3=A1n=20McNamara?= Date: Thu, 6 Nov 2014 17:03:25 +0000 Subject: [PATCH] Resolves: fdo#78151 change underlying style on toggling bullets on/off in master view --- ...51-change-style-on-toggling-bullets-.patch | 810 ++++++++++++++++++ libreoffice.spec | 8 +- 2 files changed, 814 insertions(+), 4 deletions(-) create mode 100644 0001-Resolves-fdo-78151-change-style-on-toggling-bullets-.patch diff --git a/0001-Resolves-fdo-78151-change-style-on-toggling-bullets-.patch b/0001-Resolves-fdo-78151-change-style-on-toggling-bullets-.patch new file mode 100644 index 0000000..81fce2e --- /dev/null +++ b/0001-Resolves-fdo-78151-change-style-on-toggling-bullets-.patch @@ -0,0 +1,810 @@ +From 5399853eb369457d3060190ed0f1af348004501c Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?Caol=C3=A1n=20McNamara?= +Date: Fri, 6 Jun 2014 15:13:26 +0100 +Subject: [PATCH] Resolves: fdo#78151 change style on toggling bullets on + master page outliners + +"do what I mean" + +In master pages prior to this if we toggle bullets on and off the that changes +the *level* of the paragraph. And because the paragraph is effectively a +preview of the equivalent style level, changing the level disconnects it from +the style which is useless for us. + +So instead turn the numbering off at the given outline level. In order to +toggle the numbering back split the defaults-setting into a reusable piece that +sets the numbering indent which we can call to toggle numbering back on + +Also split out the broadcast style change *and explicit child* broadcast code +into a reusable method, the absence of which left me stumped for well over an +hour as to why my changes only worked on level 1 + +Related: fdo#78151 force outliners in master view to be read-only text + +because these contain place-holder text and it doesn't make sense +to be able to edit them (unless some-day we support custom place-holder +prompts) + +because they are now read-only add a pair of "show next level" and "hide +last level" features so on right clicking the last outline paragraph +you can make the next one visible, or make the last one invisible + +Change-Id: Iea24d810f298156cfe2f32aa53d0515da45e08eb +(cherry picked from commit 7e600aca08ebbd69b0c8ef924c84af4dcf80df56) + +Change-Id: I311c7f35f1ca7dff1d151c6141ff5faa7f15c5a2 +(cherry picked from commit 8a5b3971057237b178f7e65437deec766b56f9c4) +--- + .../openoffice/Office/UI/DrawImpressCommands.xcu | 10 +++ + sd/inc/app.hrc | 5 +- + sd/inc/sdcommands.h | 2 + + sd/inc/stlpool.hxx | 2 + + sd/inc/stlsheet.hxx | 8 +++ + sd/sdi/_drvwsh.sdi | 10 +++ + sd/sdi/sdraw.sdi | 48 ++++++++++++++ + sd/source/core/stlpool.cxx | 57 +++++++++++----- + sd/source/core/stlsheet.cxx | 30 ++++++++- + sd/source/ui/app/popup.src | 13 ++++ + sd/source/ui/func/futempl.cxx | 21 +----- + sd/source/ui/inc/DrawViewShell.hxx | 6 ++ + sd/source/ui/inc/View.hxx | 19 ++++++ + sd/source/ui/view/drtxtob1.cxx | 76 ++++++++++++++++++++-- + sd/source/ui/view/drviews2.cxx | 50 ++++++++++++++ + sd/source/ui/view/drviews7.cxx | 66 +++++++++++++++++++ + sd/source/ui/view/sdview.cxx | 30 ++++++++- + 17 files changed, 408 insertions(+), 45 deletions(-) + +diff --git a/officecfg/registry/data/org/openoffice/Office/UI/DrawImpressCommands.xcu b/officecfg/registry/data/org/openoffice/Office/UI/DrawImpressCommands.xcu +index b4b6366..31aa4d7 100644 +--- a/officecfg/registry/data/org/openoffice/Office/UI/DrawImpressCommands.xcu ++++ b/officecfg/registry/data/org/openoffice/Office/UI/DrawImpressCommands.xcu +@@ -584,6 +584,16 @@ + H~yperlink... + + ++ ++ ++ ~Hide Last Level ++ ++ ++ ++ ++ ~Show Next Level ++ ++ + + + ~Page... +diff --git a/sd/inc/app.hrc b/sd/inc/app.hrc +index ef8631f..fae13da 100644 +--- a/sd/inc/app.hrc ++++ b/sd/inc/app.hrc +@@ -447,9 +447,10 @@ + + #define SID_ADD_MOTION_PATH (SID_SD_START+442) + #define SID_TABLE_TOOLBOX (SID_SD_START+443) +- + // free +-#define SID_PRESENTATION_MINIMIZER (SID_SD_START+450) ++#define SID_HIDE_LAST_LEVEL (SID_SD_START+448) ++#define SID_SHOW_NEXT_LEVEL (SID_SD_START+449) ++#define SID_PRESENTATION_MINIMIZER (SID_SD_START+450) + #endif + + /* vim:set shiftwidth=4 softtabstop=4 expandtab: */ +diff --git a/sd/inc/sdcommands.h b/sd/inc/sdcommands.h +index 2041d8f..276bf6d 100644 +--- a/sd/inc/sdcommands.h ++++ b/sd/inc/sdcommands.h +@@ -119,6 +119,8 @@ + #define CMD_SID_INSERTPAGE_LAYOUT_MENU ".uno:TaskPaneInsertPage" + #define CMD_SID_PHOTOALBUM ".uno:PhotoAlbumDialog" + #define CMD_SID_PRESENTATION_MINIMIZER ".uno:PresentationMinimizer" ++#define CMD_SID_HIDE_LAST_LEVEL ".uno:HideLastLevel" ++#define CMD_SID_SHOW_NEXT_LEVEL ".uno:ShowNextLevel" + + #endif + +diff --git a/sd/inc/stlpool.hxx b/sd/inc/stlpool.hxx +index 31cb814..7af9fe9 100644 +--- a/sd/inc/stlpool.hxx ++++ b/sd/inc/stlpool.hxx +@@ -42,6 +42,7 @@ class SdStyleSheet; + class SdDrawDocument; + class SdPage; + class SfxStyleSheetBase; ++class SvxNumberFormat; + + typedef std::map< const SdPage*, SdStyleFamilyRef > SdStyleFamilyMap; + +@@ -92,6 +93,7 @@ public: + + static SdStyleSheetVector CreateChildList( SdStyleSheet* pSheet ); + ++ static void setDefaultOutlineNumberFormatBulletAndIndent(sal_uInt16 i, SvxNumberFormat &rNumberFormat); + + public: + void throwIfDisposed() throw(::com::sun::star::uno::RuntimeException); +diff --git a/sd/inc/stlsheet.hxx b/sd/inc/stlsheet.hxx +index a64366b..d8b1183 100644 +--- a/sd/inc/stlsheet.hxx ++++ b/sd/inc/stlsheet.hxx +@@ -39,6 +39,8 @@ + + #include + ++#include "prlayout.hxx" ++ + class ModifyListenerForewarder; + + typedef cppu::ImplInheritanceHelper5< SfxUnoStyleSheet, +@@ -75,6 +77,12 @@ public: + + static SdStyleSheet* CreateEmptyUserStyle( SfxStyleSheetBasePool& rPool, SfxStyleFamily eFamily ); + ++ //Broadcast that a SdStyleSheet has changed, taking into account outline sublevels ++ //which need to be explicitly broadcast as changing if their parent style was ++ //the one that changed ++ static void BroadcastSdStyleSheetChange(SfxStyleSheetBase* pStyleSheet, PresentationObjects ePO, ++ SfxStyleSheetBasePool* pSSPool); ++ + // XInterface + virtual void SAL_CALL release( ) throw () SAL_OVERRIDE; + +diff --git a/sd/sdi/_drvwsh.sdi b/sd/sdi/_drvwsh.sdi +index d328cf4..f8119e9 100644 +--- a/sd/sdi/_drvwsh.sdi ++++ b/sd/sdi/_drvwsh.sdi +@@ -2309,6 +2309,16 @@ interface DrawView + ExecMethod = FuTemporary ; + StateMethod = GetMenuState ; + ] ++ SID_HIDE_LAST_LEVEL // ole : no, status : ? ++ [ ++ ExecMethod = FuTemporary ; ++ StateMethod = GetMenuState ; ++ ] ++ SID_SHOW_NEXT_LEVEL // ole : no, status : ? ++ [ ++ ExecMethod = FuTemporary ; ++ StateMethod = GetMenuState ; ++ ] + SID_TRANSLITERATE_UPPER // ole : no, status : ? + [ + ExecMethod = FuSupport ; +diff --git a/sd/sdi/sdraw.sdi b/sd/sdi/sdraw.sdi +index 9a03c4f..de7f1a2 100644 +--- a/sd/sdi/sdraw.sdi ++++ b/sd/sdi/sdraw.sdi +@@ -7025,3 +7025,51 @@ SfxVoidItem PresentationMinimizer SID_PRESENTATION_MINIMIZER + ToolBoxConfig = TRUE, + GroupId = GID_OPTIONS; + ] ++ ++SfxVoidItem HideLastLevel SID_HIDE_LAST_LEVEL ++() ++[ ++ /* flags: */ ++ AutoUpdate = FALSE, ++ Cachable = Cachable, ++ FastCall = FALSE, ++ HasCoreId = FALSE, ++ HasDialog = TRUE, ++ ReadOnlyDoc = FALSE, ++ Toggle = FALSE, ++ Container = FALSE, ++ RecordAbsolute = FALSE, ++ RecordPerSet; ++ Synchron; ++ ++ /* config: */ ++ AccelConfig = FALSE, ++ MenuConfig = FALSE, ++ StatusBarConfig = FALSE, ++ ToolBoxConfig = FALSE, ++ GroupId = GID_OPTIONS; ++] ++ ++SfxVoidItem ShowNextLevel SID_SHOW_NEXT_LEVEL ++() ++[ ++ /* flags: */ ++ AutoUpdate = FALSE, ++ Cachable = Cachable, ++ FastCall = FALSE, ++ HasCoreId = FALSE, ++ HasDialog = TRUE, ++ ReadOnlyDoc = FALSE, ++ Toggle = FALSE, ++ Container = FALSE, ++ RecordAbsolute = FALSE, ++ RecordPerSet; ++ Synchron; ++ ++ /* config: */ ++ AccelConfig = FALSE, ++ MenuConfig = FALSE, ++ StatusBarConfig = FALSE, ++ ToolBoxConfig = FALSE, ++ GroupId = GID_OPTIONS; ++] +diff --git a/sd/source/core/stlpool.cxx b/sd/source/core/stlpool.cxx +index 17ca4f0..2015613 100644 +--- a/sd/source/core/stlpool.cxx ++++ b/sd/source/core/stlpool.cxx +@@ -1052,9 +1052,49 @@ void SdStyleSheetPool::UpdateStdNames() + } + } + +-// Set new SvxNumBulletItem for the respective style sheet ++void SdStyleSheetPool::setDefaultOutlineNumberFormatBulletAndIndent(sal_uInt16 i, SvxNumberFormat &rNumberFormat) ++{ ++ rNumberFormat.SetBulletChar( 0x25CF ); // StarBats: 0xF000 + 34 ++ rNumberFormat.SetBulletRelSize(45); ++ const short nLSpace = (i + 1) * 1200; ++ rNumberFormat.SetLSpace(nLSpace); ++ rNumberFormat.SetAbsLSpace(nLSpace); ++ short nFirstLineOffset = -600; ++ ++ switch(i) ++ { ++ case 0: ++ { ++ nFirstLineOffset = -900; ++ } ++ break; + ++ case 1: ++ { ++ rNumberFormat.SetBulletChar( 0x2013 ); // StarBats: 0xF000 + 150 ++ rNumberFormat.SetBulletRelSize(75); ++ nFirstLineOffset = -900; ++ } ++ break; + ++ case 2: ++ { ++ nFirstLineOffset = -800; ++ } ++ break; ++ ++ case 3: ++ { ++ rNumberFormat.SetBulletChar( 0x2013 ); // StarBats: 0xF000 + 150 ++ rNumberFormat.SetBulletRelSize(75); ++ } ++ break; ++ } ++ ++ rNumberFormat.SetFirstLineOffset(nFirstLineOffset); ++} ++ ++// Set new SvxNumBulletItem for the respective style sheet + void SdStyleSheetPool::PutNumBulletItem( SfxStyleSheetBase* pSheet, + Font& rBulletFont ) + { +@@ -1134,12 +1174,7 @@ void SdStyleSheetPool::PutNumBulletItem( SfxStyleSheetBase* pSheet, + SVX_MAX_NUM, false ); + for( sal_uInt16 i = 0; i < aNumRule.GetLevelCount(); i++ ) + { +- aNumberFormat.SetBulletChar( 0x25CF ); // StarBats: 0xF000 + 34 +- aNumberFormat.SetBulletRelSize(45); +- const short nLSpace = (i + 1) * 1200; +- aNumberFormat.SetLSpace(nLSpace); +- aNumberFormat.SetAbsLSpace(nLSpace); +- short nFirstLineOffset = -600; ++ setDefaultOutlineNumberFormatBulletAndIndent(i, aNumberFormat); + + sal_uLong nFontSize = 20; + switch(i) +@@ -1147,36 +1182,28 @@ void SdStyleSheetPool::PutNumBulletItem( SfxStyleSheetBase* pSheet, + case 0: + { + nFontSize = 32; +- nFirstLineOffset = -900; + } + break; + + case 1: + { +- aNumberFormat.SetBulletChar( 0x2013 ); // StarBats: 0xF000 + 150 +- aNumberFormat.SetBulletRelSize(75); + nFontSize = 32; +- nFirstLineOffset = -900; + } + break; + + case 2: + { + nFontSize = 28; +- nFirstLineOffset = -800; + } + break; + + case 3: + { +- aNumberFormat.SetBulletChar( 0x2013 ); // StarBats: 0xF000 + 150 +- aNumberFormat.SetBulletRelSize(75); + nFontSize = 24; + } + break; + } + +- aNumberFormat.SetFirstLineOffset(nFirstLineOffset); + nFontSize = (sal_uInt16)((nFontSize * 2540L) / 72); // Pt --> 1/100 mm + rBulletFont.SetSize(Size(0,846)); // 24 pt + aNumberFormat.SetBulletFont(&rBulletFont); +diff --git a/sd/source/core/stlsheet.cxx b/sd/source/core/stlsheet.cxx +index 5df055f..c0f34e0 100644 +--- a/sd/source/core/stlsheet.cxx ++++ b/sd/source/core/stlsheet.cxx +@@ -1364,12 +1364,38 @@ Any SAL_CALL SdStyleSheet::getPropertyDefault( const OUString& aPropertyName ) t + return aRet; + } + +- +- + /** this is used because our property map is not sorted yet */ + const SfxItemPropertySimpleEntry* SdStyleSheet::getPropertyMapEntry( const OUString& rPropertyName ) const throw() + { + return GetStylePropertySet().getPropertyMapEntry(rPropertyName); + } + ++//Broadcast that a SdStyleSheet has changed, taking into account outline sublevels ++//which need to be explicitly broadcast as changing if their parent style was ++//the one that changed ++void SdStyleSheet::BroadcastSdStyleSheetChange(SfxStyleSheetBase* pStyleSheet, ++ PresentationObjects ePO, SfxStyleSheetBasePool* pSSPool) ++{ ++ SdStyleSheet* pRealSheet =((SdStyleSheet*)pStyleSheet)->GetRealStyleSheet(); ++ pRealSheet->Broadcast(SfxSimpleHint(SFX_HINT_DATACHANGED)); ++ ++ if( (ePO >= PO_OUTLINE_1) && (ePO <= PO_OUTLINE_8) ) ++ { ++ OUString sStyleName(SD_RESSTR(STR_PSEUDOSHEET_OUTLINE) + " "); ++ ++ for( sal_uInt16 n = (sal_uInt16)(ePO - PO_OUTLINE_1 + 2); n < 10; n++ ) ++ { ++ OUString aName( sStyleName + OUString::number(n) ); ++ ++ SfxStyleSheetBase* pSheet = pSSPool->Find( aName, SD_STYLE_FAMILY_PSEUDO); ++ ++ if(pSheet) ++ { ++ SdStyleSheet* pRealStyleSheet = ((SdStyleSheet*)pSheet)->GetRealStyleSheet(); ++ pRealStyleSheet->Broadcast(SfxSimpleHint(SFX_HINT_DATACHANGED)); ++ } ++ } ++ } ++} ++ + /* vim:set shiftwidth=4 softtabstop=4 expandtab: */ +diff --git a/sd/source/ui/app/popup.src b/sd/source/ui/app/popup.src +index 7f8692f..1fd5561 100644 +--- a/sd/source/ui/app/popup.src ++++ b/sd/source/ui/app/popup.src +@@ -33,6 +33,19 @@ Menu RID_DRAW_TEXTOBJ_INSIDE_POPUP + { + ItemList = + { ++ MenuItem ++ { ++ Identifier = SID_HIDE_LAST_LEVEL; ++ Command = CMD_SID_HIDE_LAST_LEVEL; ++ Text [ en-US ] = "~Hide Last Level"; ++ }; ++ MenuItem ++ { ++ Identifier = SID_SHOW_NEXT_LEVEL; ++ Command = CMD_SID_SHOW_NEXT_LEVEL; ++ Text [ en-US ] = "~Show Next Level"; ++ }; ++ SEPARATOR + MN_SET_DEFAULT + SEPARATOR + MN_TEXTATTR +diff --git a/sd/source/ui/func/futempl.cxx b/sd/source/ui/func/futempl.cxx +index 1dd0c40..42b453c 100644 +--- a/sd/source/ui/func/futempl.cxx ++++ b/sd/source/ui/func/futempl.cxx +@@ -428,27 +428,8 @@ void FuTemplate::DoExecute( SfxRequest& rReq ) + } + } + +- OUString sStyleName(SD_RESSTR(STR_PSEUDOSHEET_OUTLINE) + " "); +- + pStyleSheet->GetItemSet().Put(aTempSet); +- SdStyleSheet* pRealSheet =((SdStyleSheet*)pStyleSheet)->GetRealStyleSheet(); +- pRealSheet->Broadcast(SfxSimpleHint(SFX_HINT_DATACHANGED)); +- +- if( (ePO >= PO_OUTLINE_1) && (ePO <= PO_OUTLINE_8) ) +- { +- for( sal_uInt16 n = (sal_uInt16)(ePO - PO_OUTLINE_1 + 2); n < 10; n++ ) +- { +- OUString aName( sStyleName + OUString::number(n) ); +- +- SfxStyleSheetBase* pSheet = pSSPool->Find( aName, SD_STYLE_FAMILY_PSEUDO); +- +- if(pSheet) +- { +- SdStyleSheet* pRealStyleSheet = ((SdStyleSheet*)pSheet)->GetRealStyleSheet(); +- pRealStyleSheet->Broadcast(SfxSimpleHint(SFX_HINT_DATACHANGED)); +- } +- } +- } ++ SdStyleSheet::BroadcastSdStyleSheetChange(pStyleSheet, ePO, pSSPool); + } + + SfxItemSet& rAttr = pStyleSheet->GetItemSet(); +diff --git a/sd/source/ui/inc/DrawViewShell.hxx b/sd/source/ui/inc/DrawViewShell.hxx +index 96c5c9c..996b35b 100644 +--- a/sd/source/ui/inc/DrawViewShell.hxx ++++ b/sd/source/ui/inc/DrawViewShell.hxx +@@ -31,6 +31,7 @@ + #include + #include + ++class Outliner; + class SdPage; + class DrawDocShell; + class TabBar; +@@ -41,6 +42,7 @@ class TransferableClipboardListener; + class AbstractSvxNameDialog; + class SdrLayer; + class SvxClipboardFmtItem; ++struct ESelection; + + namespace sd { + +@@ -161,6 +163,10 @@ public: + virtual OUString GetSelectionText( bool bCompleteWords = false ); + virtual bool HasSelection( bool bText = true ) const; + ++ //If we are editing an PRESOBJ_OUTLINE return the Outliner and fill rSel ++ //with the current selection ++ ::Outliner* GetOutlinerForMasterPageOutlineTextObj(ESelection &rSel); ++ + void ExecCtrl(SfxRequest& rReq); + void GetCtrlState(SfxItemSet& rSet); + void GetDrawAttrState(SfxItemSet& rSet); +diff --git a/sd/source/ui/inc/View.hxx b/sd/source/ui/inc/View.hxx +index cd80568..2c59ade 100644 +--- a/sd/source/ui/inc/View.hxx ++++ b/sd/source/ui/inc/View.hxx +@@ -63,6 +63,24 @@ struct SdViewRedrawRec + Rectangle aRect; + }; + ++//For master view we want to force that master ++//textboxes have readonly text, because the ++//text is the auto-generated click-here-to-edit ++//and it doesn't help to change it ++class OutlinerMasterViewFilter ++{ ++private: ++ SdrOutliner *m_pOutl; ++ bool m_bReadOnly; ++public: ++ OutlinerMasterViewFilter() ++ : m_pOutl(0) ++ , m_bReadOnly(false) ++ { ++ } ++ void Start(SdrOutliner *pOutl); ++ void End(); ++}; + + class View : public FmFormView + { +@@ -275,6 +293,7 @@ protected: + + private: + ::std::auto_ptr mpClipboard; ++ OutlinerMasterViewFilter maMasterViewFilter; + }; + + +diff --git a/sd/source/ui/view/drtxtob1.cxx b/sd/source/ui/view/drtxtob1.cxx +index 605983c..761ed63 100644 +--- a/sd/source/ui/view/drtxtob1.cxx ++++ b/sd/source/ui/view/drtxtob1.cxx +@@ -57,10 +57,14 @@ + #include + + #include "app.hrc" +- ++#include "glob.hrc" ++#include "sdresid.hxx" ++#include "prlayout.hxx" + #include "ViewShell.hxx" + #include "drawview.hxx" + #include "drawdoc.hxx" ++#include "stlpool.hxx" ++#include "stlsheet.hxx" + #include "OutlineView.hxx" + #include "Window.hxx" + #include "futempl.hxx" +@@ -316,10 +320,74 @@ void TextObjectBar::Execute( SfxRequest &rReq ) + break; + + case FN_NUM_BULLET_ON: +- if( pOLV ) +- pOLV->ToggleBullets(); +- break; ++ { ++ if (pOLV) ++ { ++ bool bMasterPage = false; ++ SdrPageView* pPageView = mpView->GetSdrPageView(); ++ if (pPageView) ++ { ++ SdPage* pPage = (SdPage*)pPageView->GetPage(); ++ bMasterPage = pPage && (pPage->GetPageKind() == PK_STANDARD) && pPage->IsMasterPage(); ++ } + ++ if (!bMasterPage) ++ pOLV->ToggleBullets(); ++ else ++ { ++ //Resolves: fdo#78151 in master pages if we toggle bullets on ++ //and off then just disable/enable the bulleting, but do not ++ //change the *level* of the paragraph, because the paragraph is ++ //effectively a preview of the equivalent style level, and ++ //changing the level disconnects it from the style ++ ++ ::Outliner* pOL = pOLV->GetOutliner(); ++ if (pOL) ++ { ++ const SvxNumBulletItem *pItem = NULL; ++ SfxStyleSheetBasePool* pSSPool = mpView->GetDocSh()->GetStyleSheetPool(); ++ OUString sStyleName(SD_RESSTR(STR_PSEUDOSHEET_OUTLINE) + " 1"); ++ SfxStyleSheetBase* pFirstStyleSheet = pSSPool->Find(sStyleName, SD_STYLE_FAMILY_PSEUDO); ++ if( pFirstStyleSheet ) ++ pFirstStyleSheet->GetItemSet().GetItemState(EE_PARA_NUMBULLET, false, (const SfxPoolItem**)&pItem); ++ ++ if (pItem ) ++ { ++ SvxNumRule aNewRule(*((SvxNumBulletItem*)pItem)->GetNumRule()); ++ ESelection aSel = pOLV->GetSelection(); ++ aSel.Adjust(); ++ sal_Int32 nStartPara = aSel.nStartPara; ++ sal_Int32 nEndPara = aSel.nEndPara; ++ for (sal_Int32 nPara = nStartPara; nPara <= nEndPara; ++nPara) ++ { ++ sal_uInt16 nLevel = pOL->GetDepth(nPara); ++ SvxNumberFormat aFmt(aNewRule.GetLevel(nLevel)); ++ ++ if (aFmt.GetNumberingType() == SVX_NUM_NUMBER_NONE) ++ { ++ aFmt.SetNumberingType(SVX_NUM_CHAR_SPECIAL); ++ SdStyleSheetPool::setDefaultOutlineNumberFormatBulletAndIndent(nLevel, aFmt); ++ } ++ else ++ { ++ aFmt.SetNumberingType(SVX_NUM_NUMBER_NONE); ++ aFmt.SetLSpace(0); ++ aFmt.SetAbsLSpace(0); ++ aFmt.SetFirstLineOffset(0); ++ } ++ ++ aNewRule.SetLevel(nLevel, aFmt); ++ } ++ ++ pFirstStyleSheet->GetItemSet().Put(SvxNumBulletItem(aNewRule, EE_PARA_NUMBULLET)); ++ ++ SdStyleSheet::BroadcastSdStyleSheetChange(pFirstStyleSheet, PO_OUTLINE_1, pSSPool); ++ } ++ } ++ } ++ } ++ break; ++ } + case SID_GROW_FONT_SIZE: + case SID_SHRINK_FONT_SIZE: + { +diff --git a/sd/source/ui/view/drviews2.cxx b/sd/source/ui/view/drviews2.cxx +index 384a6c7..1b56692 100644 +--- a/sd/source/ui/view/drviews2.cxx ++++ b/sd/source/ui/view/drviews2.cxx +@@ -1824,6 +1824,56 @@ void DrawViewShell::FuTemporary(SfxRequest& rReq) + } + break; + ++ case SID_HIDE_LAST_LEVEL: ++ { ++ ESelection aSel; ++ // fdo#78151 editing a PRESOBJ_OUTLINE in a master page ? ++ ::Outliner* pOL = GetOutlinerForMasterPageOutlineTextObj(aSel); ++ if (pOL) ++ { ++ //we are on the last paragraph ++ aSel.Adjust(); ++ if (aSel.nEndPara == pOL->GetParagraphCount() - 1) ++ { ++ sal_uInt16 nDepth = pOL->GetDepth(aSel.nEndPara); ++ //there exists a previous numbering level ++ if (nDepth != sal_uInt16(-1) && nDepth > 0) ++ { ++ Paragraph* pPara = pOL->GetParagraph(aSel.nEndPara); ++ pOL->Remove(pPara, 1); ++ } ++ } ++ } ++ Cancel(); ++ rReq.Done (); ++ } ++ break; ++ ++ case SID_SHOW_NEXT_LEVEL: ++ { ++ ESelection aSel; ++ // fdo#78151 editing a PRESOBJ_OUTLINE in a master page ? ++ ::Outliner* pOL = GetOutlinerForMasterPageOutlineTextObj(aSel); ++ if (pOL) ++ { ++ //we are on the last paragraph ++ aSel.Adjust(); ++ if (aSel.nEndPara == pOL->GetParagraphCount() - 1) ++ { ++ sal_uInt16 nDepth = pOL->GetDepth(aSel.nEndPara); ++ //there exists a previous numbering level ++ if (nDepth != sal_uInt16(-1) && nDepth < 8) ++ { ++ sal_uInt16 nNewDepth = nDepth+1; ++ pOL->Insert(SD_RESSTR(STR_PRESOBJ_MPOUTLINE+nNewDepth), EE_PARA_APPEND, nNewDepth); ++ } ++ } ++ } ++ Cancel(); ++ rReq.Done (); ++ } ++ break; ++ + case SID_INSERT_FLD_DATE_FIX: + case SID_INSERT_FLD_DATE_VAR: + case SID_INSERT_FLD_TIME_FIX: +diff --git a/sd/source/ui/view/drviews7.cxx b/sd/source/ui/view/drviews7.cxx +index 81e2e00..d57b4a6 100644 +--- a/sd/source/ui/view/drviews7.cxx ++++ b/sd/source/ui/view/drviews7.cxx +@@ -212,6 +212,37 @@ void DrawViewShell::GetDrawAttrState(SfxItemSet& rSet) + rSet.Put(aSet,false); + } + ++::Outliner* DrawViewShell::GetOutlinerForMasterPageOutlineTextObj(ESelection &rSel) ++{ ++ if( !mpDrawView ) ++ return NULL; ++ ++ //when there is one object selected ++ if (!mpDrawView->AreObjectsMarked() || (mpDrawView->GetMarkedObjectList().GetMarkCount() != 1)) ++ return NULL; ++ ++ //and we are editing the outline object ++ if (!mpDrawView->IsTextEdit()) ++ return NULL; ++ ++ SdrPageView* pPageView = mpDrawView->GetSdrPageView(); ++ if (!pPageView) ++ return NULL; ++ ++ SdPage* pPage = (SdPage*)pPageView->GetPage(); ++ //only show these in a normal master page ++ if (!pPage || (pPage->GetPageKind() != PK_STANDARD) || !pPage->IsMasterPage()) ++ return NULL; ++ ++ OutlinerView* pOLV = mpDrawView->GetTextEditOutlinerView(); ++ ::Outliner* pOL = pOLV ? pOLV->GetOutliner() : NULL; ++ if (!pOL) ++ return NULL; ++ rSel = pOLV->GetSelection(); ++ ++ return pOL; ++} ++ + void DrawViewShell::GetMenuState( SfxItemSet &rSet ) + { + if (mpDrawView == NULL) +@@ -1565,6 +1596,41 @@ void DrawViewShell::GetMenuState( SfxItemSet &rSet ) + if ( bDisableEditHyperlink ) + rSet.DisableItem( SID_OPEN_HYPERLINK ); + ++ //fdo#78151 enable show next level/hide last level if editing a master page ++ //PRESOBJ_OUTLINE object and the current selection allow that to happen ++ { ++ bool bDisableShowNextLevel = true; ++ bool bDisableHideLastLevel = true; ++ ++ ESelection aSel; ++ ::Outliner* pOL = GetOutlinerForMasterPageOutlineTextObj(aSel); ++ if (pOL) ++ { ++ //and are on the last paragraph ++ aSel.Adjust(); ++ if (aSel.nEndPara == pOL->GetParagraphCount() - 1) ++ { ++ sal_uInt16 nDepth = pOL->GetDepth(aSel.nEndPara); ++ if (nDepth != sal_uInt16(-1)) ++ { ++ //there exists another numbering level that ++ //is currently hidden ++ if (nDepth < 8) ++ bDisableShowNextLevel = false; ++ //there exists a previous numbering level ++ if (nDepth > 0) ++ bDisableHideLastLevel = false; ++ } ++ } ++ } ++ ++ if (bDisableShowNextLevel) ++ rSet.DisableItem(SID_SHOW_NEXT_LEVEL); ++ ++ if (bDisableHideLastLevel) ++ rSet.DisableItem(SID_HIDE_LAST_LEVEL); ++ } ++ + #if defined WNT || defined UNX + if( !mxScannerManager.is() ) + { +diff --git a/sd/source/ui/view/sdview.cxx b/sd/source/ui/view/sdview.cxx +index 53e48a5..8755f8e 100644 +--- a/sd/source/ui/view/sdview.cxx ++++ b/sd/source/ui/view/sdview.cxx +@@ -653,12 +653,33 @@ static void SetSpellOptions( const SdDrawDocument& rDoc, sal_uLong& rCntrl ) + rCntrl &= ~EE_CNTRL_ONLINESPELLING; + } + ++void OutlinerMasterViewFilter::Start(SdrOutliner *pOutl) ++{ ++ m_pOutl = pOutl; ++ OutlinerView* pOutlView = m_pOutl->GetView(0); ++ m_bReadOnly = pOutlView->IsReadOnly(); ++ pOutlView->SetReadOnly(true); ++} ++ ++void OutlinerMasterViewFilter::End() ++{ ++ if (m_pOutl) ++ { ++ OutlinerView* pOutlView = m_pOutl->GetView(0); ++ pOutlView->SetReadOnly(m_bReadOnly); ++ m_pOutl = NULL; ++ } ++} ++ + bool View::SdrBeginTextEdit( + SdrObject* pObj, SdrPageView* pPV, ::Window* pWin, + bool bIsNewObj, + SdrOutliner* pOutl, OutlinerView* pGivenOutlinerView, + bool bDontDeleteOutliner, bool bOnlyOneView, bool bGrabFocus ) + { ++ SdrPage* pPage = pObj->GetPage(); ++ bool bMasterPage = pPage && pPage->IsMasterPage(); ++ + GetViewShell()->GetViewShellBase().GetEventMultiplexer()->MultiplexEvent( + sd::tools::EventMultiplexerEvent::EID_BEGIN_TEXT_EDIT, (void*)pObj ); + +@@ -731,12 +752,17 @@ bool View::SdrBeginTextEdit( + } + } + +- return(bReturn); ++ if (bMasterPage && bReturn) ++ maMasterViewFilter.Start(pOutl); ++ ++ return bReturn; + } + + /** ends current text editing */ +-SdrEndTextEditKind View::SdrEndTextEdit(bool bDontDeleteReally ) ++SdrEndTextEditKind View::SdrEndTextEdit(bool bDontDeleteReally) + { ++ maMasterViewFilter.End(); ++ + SdrObjectWeakRef xObj( GetTextEditObject() ); + + bool bDefaultTextRestored = RestoreDefaultText( dynamic_cast< SdrTextObj* >( GetTextEditObject() ) ); +-- +1.9.3 + diff --git a/libreoffice.spec b/libreoffice.spec index a93754e..54a1339 100644 --- a/libreoffice.spec +++ b/libreoffice.spec @@ -46,7 +46,7 @@ Summary: Free Software Productivity Suite Name: libreoffice Epoch: 1 Version: %{libo_version}.2 -Release: 5%{?libo_prerelease}%{?dist} +Release: 4%{?libo_prerelease}%{?dist} License: (MPLv1.1 or LGPLv3+) and LGPLv3 and LGPLv2+ and BSD and (MPLv1.1 or GPLv2 or LGPLv2 or Netscape) and Public Domain and ASL 2.0 and Artistic and MPLv2.0 and CC0 Group: Applications/Productivity URL: http://www.libreoffice.org/ @@ -344,6 +344,7 @@ Patch46: 0001-Resolves-fdo-62682-crash-on-second-export-of-svg.patch Patch47: 0001-fdo-85247-copy-and-paste-of-a-slide-results-in-a-blu.patch Patch48: 0001-fdo-60712-Inherits-cell-styles-in-inserting-rows-col.patch Patch49: 0001-implement-toggling-off-removeable-master-elements-wi.patch +Patch50: 0001-Resolves-fdo-78151-change-style-on-toggling-bullets-.patch %define instdir %{_libdir} %define baseinstdir %{instdir}/libreoffice @@ -2310,11 +2311,10 @@ update-desktop-database %{_datadir}/applications &> /dev/null || : %endif %changelog -* Thu Nov 06 2014 Caolán McNamara - 1:4.3.3.2-5-UNBUILT -- implement toggling off removeable master elements with delete - * Thu Nov 06 2014 Caolán McNamara - 1:4.3.3.2-4 - Resolves: fdo#60712 Inherits cell styles in inserting rows/columns +- implement toggling off removeable master elements with delete +- Resolves: fdo#78151 change underlying style on toggling bullets on/off in master view * Thu Nov 06 2014 Caolán McNamara - 1:4.3.3.2-3 - Resolves: fdo#76581 copy-and-paste -> slideshow crash in presenter console