Blame SOURCES/0001-Resolves-fdo-78151-change-style-on-toggling-bullets-.patch

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