[PATCH] fdo#47011 autosave feature work in progress

Krisztian Pinter (via Code Review) gerrit at gerrit.libreoffice.org
Sat Mar 2 02:39:34 PST 2013


Hi,

I have submitted a patch for review:

    https://gerrit.libreoffice.org/2506

To pull it, you can do:

    git pull ssh://gerrit.libreoffice.org:29418/core refs/changes/06/2506/1

fdo#47011 autosave feature work in progress

Change-Id: Ib2cbcc33e6188c60c183b5f47e9ae9c9d4c91b95
---
M cui/source/options/optsave.cxx
M cui/source/options/optsave.hrc
M cui/source/options/optsave.hxx
M cui/source/options/optsave.src
M framework/inc/services/autorecovery.hxx
M framework/source/services/autorecovery.cxx
M officecfg/registry/data/org/openoffice/Office/Recovery.xcu
M officecfg/registry/schema/org/openoffice/Office/Recovery.xcs
M sfx2/inc/sfx2/sfxsids.hrc
M sfx2/source/appl/appcfg.cxx
M shell/source/backends/gconfbe/gconfaccess.cxx
M shell/source/backends/gconfbe/gconfaccess.hxx
M unotools/inc/unotools/saveopt.hxx
M unotools/source/config/saveopt.cxx
14 files changed, 186 insertions(+), 20 deletions(-)



diff --git a/cui/source/options/optsave.cxx b/cui/source/options/optsave.cxx
index d977cac..2ada021 100644
--- a/cui/source/options/optsave.cxx
+++ b/cui/source/options/optsave.cxx
@@ -55,8 +55,9 @@
 
 #define CFG_PAGE_AND_GROUP          OUString("General"), OUString("LoadSave")
 // !! you have to update these index, if you changed the list of the child windows !!
-#define WININDEX_AUTOSAVE           ((sal_uInt16)6)
-#define WININDEX_SAVEURL_RELFSYS    ((sal_uInt16)9)
+#define WININDEX_AUTOSAVE           ((sal_uInt16) 6)
+#define WININDEX_USERAUTOSAVE       ((sal_uInt16) 9)
+#define WININDEX_SAVEURL_RELFSYS    ((sal_uInt16)10)
 
 // ----------------------------------------------------------------------
 
@@ -102,6 +103,7 @@
     aMinuteFT           ( this, CUI_RES( FT_MINUTE ) ),
     aRelativeFsysCB     ( this, CUI_RES( BTN_RELATIVE_FSYS ) ),
     aRelativeInetCB     ( this, CUI_RES( BTN_RELATIVE_INET ) ),
+    aUserAutoSaveCB     ( this, CUI_RES( BTN_USERAUTOSAVE ) ),
 
     aDefaultFormatFL    ( this, CUI_RES( FL_FILTER ) ),
     aODFVersionFT       ( this, CUI_RES( FT_ODF_VERSION ) ),
@@ -239,11 +241,22 @@
         aAutoSaveEdit.Hide();
         aMinuteFT.Hide();
         // the other controls have to move upwards the height of checkbox + space
-        nDelta += aRelativeFsysCB.GetPosPixel().Y() - aAutoSaveCB.GetPosPixel().Y();
+        nDelta += aUserAutoSaveCB.GetPosPixel().Y() - aAutoSaveCB.GetPosPixel().Y();
     }
     else if ( nDelta > 0 )
         // the "AutoSave" controls have to move upwards too
         nWinIndex = WININDEX_AUTOSAVE;
+
+    if ( aOptionsDlgOpt.IsOptionHidden( "UserAutoSave", CFG_PAGE_AND_GROUP ) )
+    {
+        // hide controls of "UserAutoSave"
+        aUserAutoSaveCB.Hide();
+        // the other controls have to move upwards the height of checkbox + space
+        nDelta += aRelativeFsysCB.GetPosPixel().Y() - aUserAutoSaveCB.GetPosPixel().Y();
+    }
+    else if ( nDelta > 0 )
+        // the "UserAutoSave" controls have to move upwards too
+        nWinIndex = WININDEX_USERAUTOSAVE;
 
     if ( nDelta > 0 )
     {
@@ -313,6 +326,13 @@
     {
         rSet.Put( SfxUInt16Item( GetWhich( SID_ATTR_AUTOSAVEMINUTE ),
                                  (sal_uInt16)aAutoSaveEdit.GetValue() ) );
+        bModified |= sal_True;
+    }
+
+    if ( aUserAutoSaveCB.IsChecked() != aUserAutoSaveCB.GetSavedValue() )
+    {
+        rSet.Put( SfxBoolItem( GetWhich( SID_ATTR_USERAUTOSAVE ),
+                               aUserAutoSaveCB.IsChecked() ) );
         bModified |= sal_True;
     }
     // save relatively
@@ -489,6 +509,7 @@
     aBackupFI.Show(bBackupRO);
 
     aAutoSaveCB.Check(aSaveOpt.IsAutoSave());
+    aUserAutoSaveCB.Check(aSaveOpt.IsUserAutoSave());
     aWarnAlienFormatCB.Check(aSaveOpt.IsWarnAlienFormat());
     aWarnAlienFormatCB.Enable(!aSaveOpt.IsReadOnly(SvtSaveOptions::E_WARNALIENFORMAT));
 
@@ -515,6 +536,8 @@
     aAutoSaveCB.SaveValue();
     aAutoSaveEdit.SaveValue();
 
+    aUserAutoSaveCB.SaveValue();
+
     aRelativeFsysCB.SaveValue();
     aRelativeInetCB.SaveValue();
     aODFVersionLB.SaveValue();
@@ -530,11 +553,13 @@
         {
             aAutoSaveEdit.Enable();
             aMinuteFT.Enable();
+            aUserAutoSaveCB.Enable();
         }
         else
         {
             aAutoSaveEdit.Disable();
             aMinuteFT.Disable();
+            aUserAutoSaveCB.Disable();
         }
     }
     return 0;
diff --git a/cui/source/options/optsave.hrc b/cui/source/options/optsave.hrc
index 16891bc..36a95b6 100644
--- a/cui/source/options/optsave.hrc
+++ b/cui/source/options/optsave.hrc
@@ -29,6 +29,7 @@
 #define BTN_AUTOSAVE            16
 #define ED_AUTOSAVE             17
 #define FT_MINUTE               18
+#define BTN_USERAUTOSAVE        19
 #define BTN_NOPRETTYPRINTING    20
 #define FI_BACKUP               21
 #define BTN_WARNALIENFORMAT     22
diff --git a/cui/source/options/optsave.hxx b/cui/source/options/optsave.hxx
index 4ab3082..00cb63f 100644
--- a/cui/source/options/optsave.hxx
+++ b/cui/source/options/optsave.hxx
@@ -54,6 +54,7 @@
     CheckBox                aAutoSaveCB;
     NumericField            aAutoSaveEdit;
     FixedText               aMinuteFT;
+    CheckBox                aUserAutoSaveCB;
     CheckBox                aRelativeFsysCB;
     CheckBox                aRelativeInetCB;
 
diff --git a/cui/source/options/optsave.src b/cui/source/options/optsave.src
index 6dc878e..32bcb6e 100644
--- a/cui/source/options/optsave.src
+++ b/cui/source/options/optsave.src
@@ -110,36 +110,43 @@
         Size = MAP_APPFONT ( 65 , 8 ) ;
         Text [ en-US ] = "Minutes" ;
     };
+    CheckBox BTN_USERAUTOSAVE
+    {
+        HelpID = "cui:CheckBox:RID_SFXPAGE_SAVE:BTN_USERAUTOSAVE"; //? FIX ME
+        Pos = MAP_APPFONT ( 12 , 74 ) ;
+        Size = MAP_APPFONT ( 163 , 10 ) ;
+        Text [ en-US ] = "Save document when saving AutoRecovery information" ;
+    };
     CheckBox BTN_RELATIVE_FSYS
     {
         HelpID = "cui:CheckBox:RID_SFXPAGE_SAVE:BTN_RELATIVE_FSYS";
-        Pos = MAP_APPFONT ( 12 , 74 ) ;
+        Pos = MAP_APPFONT ( 12 , 85 ) ;
         Size = MAP_APPFONT ( 236 , 10 ) ;
         Text [ en-US ] = "Save URLs relative to file system" ;
     };
     CheckBox BTN_RELATIVE_INET
     {
         HelpID = "cui:CheckBox:RID_SFXPAGE_SAVE:BTN_RELATIVE_INET";
-        Pos = MAP_APPFONT ( 12 , 85 ) ;
+        Pos = MAP_APPFONT ( 12 , 96 ) ;
         Size = MAP_APPFONT ( 248 , 10 ) ;
         Text [ en-US ] = "Save URLs relative to internet" ;
     };
     FixedLine FL_FILTER
     {
-        Pos = MAP_APPFONT ( 6 , 97 ) ;
+        Pos = MAP_APPFONT ( 6 , 108 ) ;
         Size = MAP_APPFONT ( 248 , 8 ) ;
         Text [ en-US ] = "Default file format and ODF settings" ;
     };
     FixedText FT_ODF_VERSION
     {
-        Pos = MAP_APPFONT ( 12 , 107 ) ;
+        Pos = MAP_APPFONT ( 12 , 118 ) ;
         Size = MAP_APPFONT ( 121 , 8 ) ;
         Text [ en-US ] = "ODF format version" ;
     };
     ListBox LB_ODF_VERSION
     {
         HelpID = "cui:ListBox:RID_SFXPAGE_SAVE:LB_ODF_VERSION";
-        Pos = MAP_APPFONT ( 136 , 105 ) ;
+        Pos = MAP_APPFONT ( 136 , 116 ) ;
         Size = MAP_APPFONT ( 108 , 58 ) ;
         Border = TRUE;
         DropDown = TRUE;
@@ -154,33 +161,33 @@
     CheckBox BTN_NOPRETTYPRINTING
     {
         HelpID = "cui:CheckBox:RID_SFXPAGE_SAVE:BTN_NOPRETTYPRINTING";
-        Pos = MAP_APPFONT ( 12 , 120 ) ;
+        Pos = MAP_APPFONT ( 12 , 131 ) ;
         Size = MAP_APPFONT ( 248 , 10 ) ;
         Text [ en-US ] = "Size optimization for ODF format" ;
     };
     CheckBox BTN_WARNALIENFORMAT
     {
         HelpID = "cui:CheckBox:RID_SFXPAGE_SAVE:BTN_WARNALIENFORMAT";
-        Pos = MAP_APPFONT ( 12 , 131 ) ;
+        Pos = MAP_APPFONT ( 12 , 142 ) ;
         Size = MAP_APPFONT ( 248 , 10 ) ;
         Text [ en-US ] = "Warn when not saving in ODF or default format" ;
     };
     FixedText FT_APP
     {
-        Pos = MAP_APPFONT ( 12 , 142 ) ;
+        Pos = MAP_APPFONT ( 12 , 153 ) ;
         Size = MAP_APPFONT ( 120 , 8 ) ;
         Text [ en-US ] = "D~ocument type";
     };
     FixedText FT_FILTER
     {
-        Pos = MAP_APPFONT ( 136 , 142 ) ;
+        Pos = MAP_APPFONT ( 136 , 153 ) ;
         Size = MAP_APPFONT ( 120 , 8 ) ;
         Text [ en-US ] = "Always sa~ve as";
     };
     ListBox LB_APP
     {
         HelpID = "cui:ListBox:RID_SFXPAGE_SAVE:LB_APP";
-        Pos = MAP_APPFONT ( 12 , 153 ) ;
+        Pos = MAP_APPFONT ( 12 , 164 ) ;
         Size = MAP_APPFONT ( 108 , 58 ) ;
         Border = TRUE;
         DropDown = TRUE;
@@ -197,14 +204,14 @@
     };
     FixedImage FI_FILTER
     {
-        Pos = MAP_APPFONT ( 129, 154 ) ;
+        Pos = MAP_APPFONT ( 129, 165 ) ;
         Size = MAP_APPFONT ( 6 , 6 ) ;
         Hide = TRUE;
     };
     ListBox LB_FILTER
     {
         HelpID = "cui:ListBox:RID_SFXPAGE_SAVE:LB_FILTER";
-        Pos = MAP_APPFONT ( 136 , 153 ) ;
+        Pos = MAP_APPFONT ( 136 , 164 ) ;
         Size = MAP_APPFONT ( 108 , 58 ) ;
         Border = TRUE;
         Sort = TRUE;
@@ -212,13 +219,13 @@
     };
     FixedImage FI_ODF_WARNING
     {
-        Pos = MAP_APPFONT ( 12, 169 ) ;
+        Pos = MAP_APPFONT ( 12, 170 ) ;
         Size = MAP_APPFONT ( 8 , 8 ) ;
         Hide = TRUE;
     };
     FixedText FT_WARN
     {
-        Pos = MAP_APPFONT ( 23 , 169 ) ;
+        Pos = MAP_APPFONT ( 23 , 170 ) ;
         Size = MAP_APPFONT ( 239 , 8 ) ;
         Hide = TRUE;
         Text [ en-US ] = "Not using ODF 1.2 Extended may cause information to be lost.";
diff --git a/framework/inc/services/autorecovery.hxx b/framework/inc/services/autorecovery.hxx
index 9ef0a2f..90e98e7 100644
--- a/framework/inc/services/autorecovery.hxx
+++ b/framework/inc/services/autorecovery.hxx
@@ -213,7 +213,8 @@
             E_SESSION_RESTORE           = 128,
             E_DISABLE_AUTORECOVERY      = 256,
             E_SET_AUTOSAVE_STATE        = 512,
-            E_SESSION_QUIET_QUIT        = 1024
+            E_SESSION_QUIET_QUIT        = 1024,
+            E_USER_AUTO_SAVE            = 2048
         };
 
         //---------------------------------------
diff --git a/framework/source/services/autorecovery.cxx b/framework/source/services/autorecovery.cxx
index e1415df..8cc7e01 100644
--- a/framework/source/services/autorecovery.cxx
+++ b/framework/source/services/autorecovery.cxx
@@ -21,6 +21,8 @@
 #include "services/autorecovery.hxx"
 #include <loadenv/loadenv.hxx>
 
+#include <sfx2/sfxbasemodel.hxx> //?
+
 #include <loadenv/targethelper.hxx>
 #include <pattern/frame.hxx>
 #include <threadhelp/readguard.hxx>
@@ -123,6 +125,8 @@
 
 static const char CFG_ENTRY_AUTOSAVE_ENABLED[] = "AutoSave/Enabled";
 static const char CFG_ENTRY_AUTOSAVE_TIMEINTERVALL[] = "AutoSave/TimeIntervall"; //sic!
+
+static const char CFG_ENTRY_USERAUTOSAVE_ENABLED[] = "AutoSave/UserAutoSaveEnabled";
 
 static const char CFG_PATH_AUTOSAVE[] = "AutoSave";
 static const char CFG_ENTRY_MINSPACE_DOCSAVE[] = "MinSpaceDocSave";
@@ -977,12 +981,25 @@
     sal_Bool bEnabled = sal_False;
     xCommonRegistry->getByHierarchicalName(rtl::OUString(CFG_ENTRY_AUTOSAVE_ENABLED)) >>= bEnabled;
 
+    // UserAutoSave [bool]
+    sal_Bool bUserEnabled = sal_False;
+    xCommonRegistry->getByHierarchicalName(rtl::OUString(CFG_ENTRY_USERAUTOSAVE_ENABLED)) >>= bUserEnabled;
+
     // SAFE -> ------------------------------
     WriteGuard aWriteLock(m_aLock);
     if (bEnabled)
     {
         m_eJob       |= AutoRecovery::E_AUTO_SAVE;
         m_eTimerType  = AutoRecovery::E_NORMAL_AUTOSAVE_INTERVALL;
+
+        if (bUserEnabled)
+        {
+            m_eJob       |= AutoRecovery::E_USER_AUTO_SAVE;
+        }
+        else
+        {
+            m_eJob       &= ~AutoRecovery::E_USER_AUTO_SAVE;
+        }
     }
     else
     {
@@ -2328,6 +2345,7 @@
     // Mark AutoSave state as "INCOMPLETE" if it failed.
     // Because the last temp file is to old and does not include all changes.
     Reference< XDocumentRecovery > xDocRecover(rInfo.Document, css::uno::UNO_QUERY_THROW);
+    Reference< XStorable > xDocSave(rInfo.Document, css::uno::UNO_QUERY_THROW);
 
     // safe the state about "trying to save"
     // ... we need it for recovery if e.g. a crash occures inside next line!
@@ -2342,6 +2360,13 @@
         {
             xDocRecover->storeToRecoveryFile( rInfo.NewTempURL, lNewArgs.getAsConstPropertyValueList() );
 
+            // if userautosave is enabled, also save to the original file
+            //if((m_eJob & AutoRecovery::E_USER_AUTO_SAVE) == AutoRecovery::E_USER_AUTO_SAVE)
+            if(true)
+            {
+                xDocSave->store();
+            }
+
 #ifdef TRIGGER_FULL_DISC_CHECK
             throw css::uno::Exception();
 #else  // TRIGGER_FULL_DISC_CHECK
diff --git a/officecfg/registry/data/org/openoffice/Office/Recovery.xcu b/officecfg/registry/data/org/openoffice/Office/Recovery.xcu
index e5fbed4..92cbff7 100644
--- a/officecfg/registry/data/org/openoffice/Office/Recovery.xcu
+++ b/officecfg/registry/data/org/openoffice/Office/Recovery.xcu
@@ -25,6 +25,10 @@
       <value oor:external=
           "com.sun.star.configuration.backend.GconfBackend AutoSaveEnabled"/>
     </prop>
+    <prop oor:name="UserAutoSaveEnabled">
+      <value oor:external=
+          "com.sun.star.configuration.backend.GconfBackend UserAutoSaveEnabled"/>
+    </prop>
     <prop oor:name="TimeIntervall">
       <value oor:external=
        "com.sun.star.configuration.backend.GconfBackend AutoSaveTimeIntervall"/>
diff --git a/officecfg/registry/schema/org/openoffice/Office/Recovery.xcs b/officecfg/registry/schema/org/openoffice/Office/Recovery.xcs
index 19203f0..a44e611 100644
--- a/officecfg/registry/schema/org/openoffice/Office/Recovery.xcs
+++ b/officecfg/registry/schema/org/openoffice/Office/Recovery.xcs
@@ -131,6 +131,12 @@
                 </info>
                 <value>true</value>
             </prop>
+            <prop oor:name="UserAutoSaveEnabled" oor:type="xs:boolean" oor:nillable="false">
+                <info>
+                    <desc> </desc>
+                </info>
+                <value>true</value>
+            </prop>
             <prop oor:name="TimeIntervall" oor:type="xs:int" oor:nillable="false">
                 <info>
                     <desc> </desc>
diff --git a/sfx2/inc/sfx2/sfxsids.hrc b/sfx2/inc/sfx2/sfxsids.hrc
index d379d9f..33be620 100644
--- a/sfx2/inc/sfx2/sfxsids.hrc
+++ b/sfx2/inc/sfx2/sfxsids.hrc
@@ -514,6 +514,7 @@
 #define SID_ATTR_AUTOSAVE               (SID_OPTIONS_START +  2)
 #define SID_ATTR_AUTOSAVEPROMPT         (SID_OPTIONS_START +  3)
 #define SID_ATTR_AUTOSAVEMINUTE         (SID_OPTIONS_START +  5)
+#define SID_ATTR_USERAUTOSAVE           (SID_OPTIONS_START +  6)
 #define SID_ATTR_WORKINGSET             (SID_OPTIONS_START + 13)
 #define SID_ATTR_UNDO_COUNT             (SID_OPTIONS_START + 16)
     // unused
diff --git a/sfx2/source/appl/appcfg.cxx b/sfx2/source/appl/appcfg.cxx
index 11441cd..061f697 100644
--- a/sfx2/source/appl/appcfg.cxx
+++ b/sfx2/source/appl/appcfg.cxx
@@ -226,6 +226,14 @@
                                 bRet = sal_False;
                     }
                     break;
+                case SID_ATTR_USERAUTOSAVE :
+                    {
+                        bRet = sal_True;
+                        if (!aSaveOptions.IsReadOnly(SvtSaveOptions::E_USERAUTOSAVE))
+                            if (!rSet.Put( SfxBoolItem( rPool.GetWhich( SID_ATTR_USERAUTOSAVE ), aSaveOptions.IsUserAutoSave())))
+                                bRet = sal_False;
+                    }
+                    break;
                 case SID_ATTR_DOCINFO :
                     {
                         bRet = sal_True;
@@ -582,6 +590,13 @@
         aSaveOptions.SetAutoSaveTime(((const SfxUInt16Item *)pItem)->GetValue());
     }
 
+    // UserAutoSave
+    if ( SFX_ITEM_SET == rSet.GetItemState(rPool.GetWhich(SID_ATTR_USERAUTOSAVE), sal_True, &pItem))
+    {
+        DBG_ASSERT(pItem->ISA(SfxBoolItem), "BoolItem expected");
+        aSaveOptions.SetUserAutoSave( ( (const SfxBoolItem*)pItem )->GetValue() );
+    }
+
     // DocInfo
     if ( SFX_ITEM_SET == rSet.GetItemState(rPool.GetWhich(SID_ATTR_DOCINFO), sal_True, &pItem))
     {
diff --git a/shell/source/backends/gconfbe/gconfaccess.cxx b/shell/source/backends/gconfbe/gconfaccess.cxx
index 4705013..71276da 100644
--- a/shell/source/backends/gconfbe/gconfaccess.cxx
+++ b/shell/source/backends/gconfbe/gconfaccess.cxx
@@ -34,6 +34,7 @@
 
 #define GCONF_PROXY_MODE_KEY "/system/proxy/mode"
 #define GCONF_AUTO_SAVE_KEY  "/apps/openoffice/auto_save"
+#define GCONF_USER_AUTO_SAVE_KEY  "/apps/openoffice/user_auto_save"
 
 namespace gconfaccess {
 
@@ -433,6 +434,18 @@
             }
         }
             break;
+        case SETTING_USER_AUTO_SAVE:
+        {
+            GConfValue* pGconfValue = gconf_client_get( pClient, GCONF_USER_AUTO_SAVE_KEY, NULL );
+
+            if( ( pGconfValue != NULL ) )
+            {
+                bool bOk = gconf_value_get_bool( pGconfValue );
+                gconf_value_free( pGconfValue );
+                if (bOk) return sal_True;
+            }
+        }
+            break;
 #endif // ENABLE_LOCKDOWN
 
         default:
@@ -599,6 +612,14 @@
     },
 
     {
+        SETTING_USER_AUTO_SAVE,
+        GCONF_USER_AUTO_SAVE_KEY,
+        RTL_CONSTASCII_STRINGPARAM("UserAutoSaveEnabled"),
+        sal_False,
+        SETTINGS_LAST
+    },
+
+    {
         SETTING_AUTO_SAVE_INTERVAL,
         "/apps/openoffice/auto_save_interval",
         RTL_CONSTASCII_STRINGPARAM("AutoSaveTimeIntervall"),
diff --git a/shell/source/backends/gconfbe/gconfaccess.hxx b/shell/source/backends/gconfbe/gconfaccess.hxx
index 98ce947..7f0a52a 100644
--- a/shell/source/backends/gconfbe/gconfaccess.hxx
+++ b/shell/source/backends/gconfbe/gconfaccess.hxx
@@ -80,6 +80,7 @@
     SETTING_CREATE_BACKUP,
     SETTING_WARN_ALIEN_FORMAT,
     SETTING_AUTO_SAVE,
+    SETTING_USER_AUTO_SAVE,
     SETTING_AUTO_SAVE_INTERVAL,
     SETTING_WRITER_DEFAULT_DOC_FORMAT,
     SETTING_IMPRESS_DEFAULT_DOC_FORMAT,
diff --git a/unotools/inc/unotools/saveopt.hxx b/unotools/inc/unotools/saveopt.hxx
index 349b5e6..771c721 100644
--- a/unotools/inc/unotools/saveopt.hxx
+++ b/unotools/inc/unotools/saveopt.hxx
@@ -47,7 +47,8 @@
         E_LOADDOCPRINTER,
         E_ODFDEFAULTVERSION,
         E_USESHA1INODF12,
-        E_USEBLOWFISHINODF12
+        E_USEBLOWFISHINODF12,
+        E_USERAUTOSAVE,
     };
 
     // keep enum values sorted that a less or greater compare maps to older and newer versions!
@@ -81,6 +82,9 @@
     void                    SetAutoSavePrompt( sal_Bool b );
     sal_Bool                IsAutoSavePrompt() const;
 
+    void                    SetUserAutoSave( sal_Bool b );
+    sal_Bool                IsUserAutoSave() const;
+
     void                    SetDocInfoSave(sal_Bool b);
     sal_Bool                IsDocInfoSave() const;
 
diff --git a/unotools/source/config/saveopt.cxx b/unotools/source/config/saveopt.cxx
index 1618638..b0b8f06 100644
--- a/unotools/source/config/saveopt.cxx
+++ b/unotools/source/config/saveopt.cxx
@@ -57,6 +57,7 @@
                                         bBackup,
                                         bAutoSave,
                                         bAutoSavePrompt,
+                                        bUserAutoSave,
                                         bDocInfSave,
                                         bSaveWorkingSet,
                                         bSaveDocView,
@@ -76,6 +77,7 @@
                                         bROBackup,
                                         bROAutoSave,
                                         bROAutoSavePrompt,
+                                        bROUserAutoSave,
                                         bRODocInfSave,
                                         bROSaveWorkingSet,
                                         bROSaveDocView,
@@ -101,6 +103,7 @@
     sal_Bool                    IsBackup() const                    { return bBackup; }
     sal_Bool                    IsAutoSave() const                  { return bAutoSave; }
     sal_Bool                    IsAutoSavePrompt() const            { return bAutoSavePrompt; }
+    sal_Bool                    IsUserAutoSave() const              { return bUserAutoSave; }
     sal_Bool                    IsDocInfoSave() const               { return bDocInfSave; }
     sal_Bool                    IsSaveWorkingSet() const            { return bSaveWorkingSet;         }
     sal_Bool                    IsSaveDocView() const               { return bSaveDocView; }
@@ -121,6 +124,7 @@
     void                    SetBackup( sal_Bool b );
     void                    SetAutoSave( sal_Bool b );
     void                    SetAutoSavePrompt( sal_Bool b );
+    void                    SetUserAutoSave( sal_Bool b );
     void                    SetDocInfoSave( sal_Bool b );
     void                    SetSaveWorkingSet( sal_Bool b );
     void                    SetSaveDocView( sal_Bool b );
@@ -178,6 +182,16 @@
     {
         bAutoSavePrompt = b;
         SetModified();
+    }
+}
+
+void SvtSaveOptions_Impl::SetUserAutoSave( sal_Bool b )
+{
+    if (!bROUserAutoSave && bUserAutoSave!=b)
+    {
+        bUserAutoSave = b;
+        SetModified();
+        Commit();
     }
 }
 
@@ -282,6 +296,9 @@
         case SvtSaveOptions::E_AUTOSAVEPROMPT :
             bReadOnly = bROAutoSavePrompt;
             break;
+        case SvtSaveOptions::E_USERAUTOSAVE :
+            bReadOnly = bROUserAutoSave;
+            break;
         case SvtSaveOptions::E_DOCINFSAVE :
             bReadOnly = bRODocInfSave;
             break;
@@ -340,6 +357,7 @@
 #define ODFDEFAULTVERSION   15
 #define USESHA1INODF12      16
 #define USEBLOWFISHINODF12  17
+#define USERAUTOSAVE        18
 
 Sequence< OUString > GetPropertyNames()
 {
@@ -362,7 +380,8 @@
         "WorkingSet",
         "ODF/DefaultVersion",
         "ODF/UseSHA1InODF12",
-        "ODF/UseBlowfishInODF12"
+        "ODF/UseBlowfishInODF12",
+        "Document/UserAutoSave"
     };
 
     const int nCount = sizeof( aPropNames ) / sizeof( const char* );
@@ -383,6 +402,7 @@
     , bBackup( sal_False )
     , bAutoSave( sal_False )
     , bAutoSavePrompt( sal_False )
+    , bUserAutoSave( sal_False )
     , bDocInfSave( sal_False )
     , bSaveWorkingSet( sal_False )
     , bSaveDocView( sal_False )
@@ -400,6 +420,7 @@
     , bROBackup( CFG_READONLY_DEFAULT )
     , bROAutoSave( CFG_READONLY_DEFAULT )
     , bROAutoSavePrompt( CFG_READONLY_DEFAULT )
+    , bROUserAutoSave( CFG_READONLY_DEFAULT )
     , bRODocInfSave( CFG_READONLY_DEFAULT )
     , bROSaveWorkingSet( CFG_READONLY_DEFAULT )
     , bROSaveDocView( CFG_READONLY_DEFAULT )
@@ -478,6 +499,10 @@
                                 case AUTOSAVE :
                                     bAutoSave = bTemp;
                                     bROAutoSave = pROStates[nProp];
+                                    break;
+                                case USERAUTOSAVE :
+                                    bUserAutoSave = bTemp;
+                                    bROUserAutoSave = pROStates[nProp];
                                     break;
                                 case PROMPT :
                                     bAutoSavePrompt = bTemp;
@@ -563,6 +588,11 @@
         xCFG,
         ::rtl::OUString("AutoSave"),
         ::rtl::OUString("TimeIntervall")) >>= nAutoSaveTime;
+
+    ::comphelper::ConfigurationHelper::readRelativeKey(
+        xCFG,
+        ::rtl::OUString("AutoSave"),
+        ::rtl::OUString("UserAutoSaveEnabled")) >>= bUserAutoSave;
     }
     catch(const css::uno::Exception&)
         { OSL_FAIL("Could not find needed informations for AutoSave feature."); }
@@ -626,6 +656,14 @@
                 if (!bROAutoSavePrompt)
                 {
                     pValues[nRealCount] <<= bAutoSavePrompt;
+                    pNames[nRealCount] = pOrgNames[i];
+                    ++nRealCount;
+                }
+                break;
+            case USERAUTOSAVE :
+                if (!bROUserAutoSave)
+                {
+                    pValues[nRealCount] <<= bUserAutoSave;
                     pNames[nRealCount] = pOrgNames[i];
                     ++nRealCount;
                 }
@@ -752,6 +790,12 @@
         ::rtl::OUString("AutoSave"),
         ::rtl::OUString("Enabled"),
         css::uno::makeAny(bAutoSave));
+
+    ::comphelper::ConfigurationHelper::writeRelativeKey(
+        xCFG,
+        ::rtl::OUString("AutoSave"),
+        ::rtl::OUString("UserAutoSaveEnabled"),
+        css::uno::makeAny(bUserAutoSave));
 
     ::comphelper::ConfigurationHelper::flush(xCFG);
 }
@@ -908,6 +952,16 @@
     return pImp->pSaveOpt->IsAutoSavePrompt();
 }
 
+void SvtSaveOptions::SetUserAutoSave( sal_Bool b )
+{
+    pImp->pSaveOpt->SetUserAutoSave( b );
+}
+
+sal_Bool SvtSaveOptions::IsUserAutoSave() const
+{
+    return pImp->pSaveOpt->IsUserAutoSave();
+}
+
 void SvtSaveOptions::SetDocInfoSave(sal_Bool b)
 {
     pImp->pSaveOpt->SetDocInfoSave( b );

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

Gerrit-MessageType: newchange
Gerrit-Change-Id: Ib2cbcc33e6188c60c183b5f47e9ae9c9d4c91b95
Gerrit-PatchSet: 1
Gerrit-Project: core
Gerrit-Branch: master
Gerrit-Owner: Krisztian Pinter <pin.terminator at gmail.com>



More information about the LibreOffice mailing list