1 /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
3 * This file is part of the LibreOffice project.
5 * This Source Code Form is subject to the terms of the Mozilla Public
6 * License, v. 2.0. If a copy of the MPL was not distributed with this
7 * file, You can obtain one at http://mozilla.org/MPL/2.0/.
9 * This file incorporates work covered by the following license notice:
11 * Licensed to the Apache Software Foundation (ASF) under one or more
12 * contributor license agreements. See the NOTICE file distributed
13 * with this work for additional information regarding copyright
14 * ownership. The ASF licenses this file to you under the Apache
15 * License, Version 2.0 (the "License"); you may not use this file
16 * except in compliance with the License. You may obtain a copy of
17 * the License at http://www.apache.org/licenses/LICENSE-2.0 .
20 #ifndef INCLUDED_SVX_SOURCE_INC_DOCRECOVERY_HXX
21 #define INCLUDED_SVX_SOURCE_INC_DOCRECOVERY_HXX
23 #include <vcl/dialog.hxx>
24 #include <vcl/button.hxx>
25 #include <vcl/fixed.hxx>
26 #include <vcl/lstbox.hxx>
27 #include <vcl/tabdlg.hxx>
28 #include <vcl/tabpage.hxx>
29 #include <svtools/simptabl.hxx>
30 #include <svtools/svlbitm.hxx>
31 #include <svtools/svmedit2.hxx>
32 #include <svtools/treelistbox.hxx>
34 #include <cppuhelper/implbase1.hxx>
35 #include <cppuhelper/implbase2.hxx>
36 #include <com/sun/star/task/StatusIndicatorFactory.hpp>
37 #include <com/sun/star/frame/XStatusListener.hpp>
38 #include <com/sun/star/frame/XDispatch.hpp>
39 #include <com/sun/star/lang/XComponent.hpp>
42 #define RECOVERY_CMDPART_PROTOCOL "vnd.sun.star.autorecovery:"
44 #define RECOVERY_CMDPART_DO_EMERGENCY_SAVE "/doEmergencySave"
45 #define RECOVERY_CMDPART_DO_RECOVERY "/doAutoRecovery"
47 #define RECOVERY_CMD_DO_PREPARE_EMERGENCY_SAVE "vnd.sun.star.autorecovery:/doPrepareEmergencySave"
48 #define RECOVERY_CMD_DO_EMERGENCY_SAVE "vnd.sun.star.autorecovery:/doEmergencySave"
49 #define RECOVERY_CMD_DO_RECOVERY "vnd.sun.star.autorecovery:/doAutoRecovery"
50 #define RECOVERY_CMD_DO_ENTRY_BACKUP "vnd.sun.star.autorecovery:/doEntryBackup"
51 #define RECOVERY_CMD_DO_ENTRY_CLEANUP "vnd.sun.star.autorecovery:/doEntryCleanUp"
53 #define PROP_STATUSINDICATOR "StatusIndicator"
54 #define PROP_DISPATCHASYNCHRON "DispatchAsynchron"
55 #define PROP_SAVEPATH "SavePath"
56 #define PROP_ENTRYID "EntryID"
58 #define STATEPROP_ID "ID"
59 #define STATEPROP_STATE "DocumentState"
60 #define STATEPROP_ORGURL "OriginalURL"
61 #define STATEPROP_TEMPURL "TempURL"
62 #define STATEPROP_FACTORYURL "FactoryURL"
63 #define STATEPROP_TEMPLATEURL "TemplateURL"
64 #define STATEPROP_TITLE "Title"
65 #define STATEPROP_MODULE "Module"
67 #define RECOVERY_OPERATIONSTATE_START "start"
68 #define RECOVERY_OPERATIONSTATE_STOP "stop"
69 #define RECOVERY_OPERATIONSTATE_UPDATE "update"
71 #define DLG_RET_UNKNOWN -1
73 #define DLG_RET_CANCEL 0
74 #define DLG_RET_OK_AUTOLUNCH 101
78 namespace DocRecovery
{
85 /// default state, if a document was new created or loaded
87 /// modified against the original file
89 /// an active document can be postponed to be saved later.
91 /// was already handled during one AutoSave/Recovery session.
93 /** an action was started (saving/loading) ... Can be interesting later if the process may be was interrupted by an exception. */
95 E_TRY_LOAD_BACKUP
= 16,
96 E_TRY_LOAD_ORIGINAL
= 32,
100 /// the Auto/Emergency saved document isn't useable any longer
102 /// the Auto/Emergency saved document is not really up-to-date (some changes can be missing)
104 /// the Auto/Emergency saved document was processed successfully
111 E_SUCCESSFULLY_RECOVERED
,
112 E_ORIGINAL_DOCUMENT_RECOVERED
,
114 E_RECOVERY_IS_IN_PROGRESS
,
123 /// unique ID, which is specified by the underlying autorecovery core!
126 /// the full qualified document URL
129 /// the full qualified URL of the temp. file (if it's exists)
132 /// a may be existing factory URL (e.g. for untitled documents)
135 /// may be the document base on a template file !?
136 OUString TemplateURL
;
138 /// the pure file name, without path, disc etcpp.
139 OUString DisplayName
;
141 /// the application module, where this document was loaded
144 /// state info as e.g. VALID, CORRUPTED, NON EXISTING ...
147 /// ui representation for DocState!
148 ERecoveryState RecoveryState
;
157 , DocState (E_UNKNOWN
)
158 , RecoveryState(E_NOT_RECOVERED_YET
)
163 typedef ::std::vector
< TURLInfo
> TURLList
;
166 class IRecoveryUpdateListener
170 // inform listener about changed items, which should be refreshed
171 virtual void updateItems() = 0;
173 // inform listener about starting of the asynchronous recovery operation
174 virtual void start() = 0;
176 // inform listener about ending of the asynchronous recovery operation
177 virtual void end() = 0;
180 virtual void stepNext(TURLInfo
* pItem
) = 0;
183 ~IRecoveryUpdateListener() {}
187 class RecoveryCore
: public ::cppu::WeakImplHelper1
< css::frame::XStatusListener
>
198 css::uno::Reference
< css::uno::XComponentContext
> m_xContext
;
201 css::uno::Reference
< css::frame::XDispatch
> m_xRealCore
;
204 css::uno::Reference
< css::task::XStatusIndicator
> m_xProgress
;
210 IRecoveryUpdateListener
* m_pListener
;
212 /** @short knows the reason, why we listen on our internal m_xRealCore
215 @descr Because we listen for different operations
216 on the core dispatch implementation, we must know,
217 which URL we have to use for deregistration!
219 bool m_bListenForSaving
;
227 RecoveryCore(const css::uno::Reference
< css::uno::XComponentContext
>& rxContext
,
228 bool bUsedForSaving
);
232 virtual ~RecoveryCore();
236 css::uno::Reference
< css::uno::XComponentContext
> getComponentContext();
240 TURLList
& getURLListAccess();
244 static bool isBrokenTempEntry(const TURLInfo
& rInfo
);
245 void saveBrokenTempEntries(const OUString
& sSaveDir
);
246 void saveAllTempEntries(const OUString
& sSaveDir
);
247 void forgetBrokenTempEntries();
248 void forgetAllRecoveryEntries();
249 void forgetBrokenRecoveryEntries();
253 void setProgressHandler(const css::uno::Reference
< css::task::XStatusIndicator
>& xProgress
);
257 void setUpdateListener(IRecoveryUpdateListener
* pListener
);
261 void doEmergencySavePrepare();
262 void doEmergencySave();
267 static ERecoveryState
mapDocState2RecoverState(sal_Int32 eDocState
);
273 // css.frame.XStatusListener
274 virtual void SAL_CALL
statusChanged(const css::frame::FeatureStateEvent
& aEvent
)
275 throw(css::uno::RuntimeException
, std::exception
) SAL_OVERRIDE
;
277 // css.lang.XEventListener
278 virtual void SAL_CALL
disposing(const css::lang::EventObject
& aEvent
)
279 throw(css::uno::RuntimeException
, std::exception
) SAL_OVERRIDE
;
286 /** @short starts listening on the internal EmergencySave/AutoRecovery core.
288 void impl_startListening();
291 /** @short stop listening on the internal EmergencySave/AutoRecovery core.
293 void impl_stopListening();
297 css::util::URL
impl_getParsedURL(const OUString
& sURL
);
301 class PluginProgressWindow
: public vcl::Window
304 css::uno::Reference
< css::lang::XComponent
> m_xProgress
;
306 PluginProgressWindow( vcl::Window
* pParent
,
307 const css::uno::Reference
< css::lang::XComponent
>& xProgress
);
308 virtual ~PluginProgressWindow();
309 virtual void dispose() SAL_OVERRIDE
;
312 class PluginProgress
: public ::cppu::WeakImplHelper2
< css::task::XStatusIndicator
,
313 css::lang::XComponent
>
318 css::uno::Reference
< css::task::XStatusIndicatorFactory
> m_xProgressFactory
;
320 css::uno::Reference
< css::task::XStatusIndicator
> m_xProgress
;
322 VclPtr
<PluginProgressWindow
> m_pPlugProgressWindow
;
328 PluginProgress( vcl::Window
* pParent
,
329 const css::uno::Reference
< css::uno::XComponentContext
>& xContext
);
333 virtual ~PluginProgress();
341 virtual void SAL_CALL
start(const OUString
& sText
,
343 throw(css::uno::RuntimeException
, std::exception
) SAL_OVERRIDE
;
345 virtual void SAL_CALL
end()
346 throw(css::uno::RuntimeException
, std::exception
) SAL_OVERRIDE
;
348 virtual void SAL_CALL
setText(const OUString
& sText
)
349 throw(css::uno::RuntimeException
, std::exception
) SAL_OVERRIDE
;
351 virtual void SAL_CALL
setValue(sal_Int32 nValue
)
352 throw(css::uno::RuntimeException
, std::exception
) SAL_OVERRIDE
;
354 virtual void SAL_CALL
reset()
355 throw(css::uno::RuntimeException
, std::exception
) SAL_OVERRIDE
;
359 virtual void SAL_CALL
dispose()
360 throw(css::uno::RuntimeException
, std::exception
) SAL_OVERRIDE
;
362 virtual void SAL_CALL
addEventListener(const css::uno::Reference
< css::lang::XEventListener
>& xListener
)
363 throw(css::uno::RuntimeException
, std::exception
) SAL_OVERRIDE
;
365 virtual void SAL_CALL
removeEventListener( const css::uno::Reference
< css::lang::XEventListener
>& xListener
)
366 throw(css::uno::RuntimeException
, std::exception
) SAL_OVERRIDE
;
369 class SaveDialog
: public Dialog
373 VclPtr
<FixedText
> m_pTitleFT
;
374 VclPtr
<ListBox
> m_pFileListLB
;
375 VclPtr
<OKButton
> m_pOkBtn
;
376 RecoveryCore
* m_pCore
;
380 /** @short create all child controls of this dialog.
382 @descr The dialog isn't shown nor it starts any
386 can point to a parent window.
387 If its set to 0, the defmodal-dialog-parent
388 is used automatically.
391 provides access to the recovery core service
392 and the current list of open documents,
393 which should be shown inside this dialog.
395 SaveDialog(vcl::Window
* pParent
, RecoveryCore
* pCore
);
396 virtual ~SaveDialog();
397 virtual void dispose() SAL_OVERRIDE
;
399 DECL_LINK(OKButtonHdl
, void*);
402 class SaveProgressDialog
: public ModalDialog
403 , public IRecoveryUpdateListener
407 VclPtr
<vcl::Window
> m_pProgrParent
;
410 RecoveryCore
* m_pCore
;
413 css::uno::Reference
< css::task::XStatusIndicator
> m_xProgress
;
416 /** @short create all child controls of this dialog.
418 @descr The dialog isn't shown nor it starts any
422 can point to a parent window.
423 If its set to 0, the defmodal-dialog-parent
424 is used automatically.
427 used to start emegrency save.
429 SaveProgressDialog(vcl::Window
* pParent
,
430 RecoveryCore
* pCore
);
431 virtual ~SaveProgressDialog();
432 virtual void dispose() SAL_OVERRIDE
;
434 /** @short start the emergency save operation. */
435 virtual short Execute() SAL_OVERRIDE
;
437 // IRecoveryUpdateListener
438 virtual void updateItems() SAL_OVERRIDE
;
439 virtual void stepNext(TURLInfo
* pItem
) SAL_OVERRIDE
;
440 virtual void start() SAL_OVERRIDE
;
441 virtual void end() SAL_OVERRIDE
;
445 class RecovDocListEntry
: public SvLBoxString
451 RecovDocListEntry( SvTreeListEntry
* pEntry
,
453 const OUString
& sText
);
457 virtual void Paint(const Point
& rPos
, SvTreeListBox
& rOutDev
, vcl::RenderContext
& rRenderContext
,
458 const SvViewDataEntry
* pView
, const SvTreeListEntry
* pEntry
) SAL_OVERRIDE
;
462 class RecovDocList
: public SvSimpleTable
468 Image m_aGreenCheckImg
;
469 Image m_aYellowCheckImg
;
470 Image m_aRedCrossImg
;
472 OUString m_aSuccessRecovStr
;
473 OUString m_aOrigDocRecovStr
;
474 OUString m_aRecovFailedStr
;
475 OUString m_aRecovInProgrStr
;
476 OUString m_aNotRecovYetStr
;
484 RecovDocList(SvSimpleTableContainer
& rParent
, ResMgr
& rResMgr
);
487 virtual void InitEntry(SvTreeListEntry
* pEntry
,
488 const OUString
& rText
,
489 const Image
& rImage1
,
490 const Image
& rImage2
,
491 SvLBoxButtonKind eButtonKind
) SAL_OVERRIDE
;
495 class RecoveryDialog
: public Dialog
496 , public IRecoveryUpdateListener
500 VclPtr
<FixedText
> m_pTitleFT
;
501 VclPtr
<FixedText
> m_pDescrFT
;
502 VclPtr
<vcl::Window
> m_pProgrParent
;
503 VclPtr
<RecovDocList
> m_pFileListLB
;
504 VclPtr
<PushButton
> m_pNextBtn
;
505 VclPtr
<PushButton
> m_pCancelBtn
;
506 OUString m_aTitleRecoveryInProgress
;
507 OUString m_aRecoveryOnlyFinish
;
508 OUString m_aRecoveryOnlyFinishDescr
;
510 RecoveryCore
* m_pCore
;
511 css::uno::Reference
< css::task::XStatusIndicator
> m_xProgress
;
512 enum EInternalRecoveryState
514 E_RECOVERY_PREPARED
, // dialog started ... recovery prepared
515 E_RECOVERY_IN_PROGRESS
, // recovery core still in progress
516 E_RECOVERY_CORE_DONE
, // recovery core finished it's task
517 E_RECOVERY_DONE
, // user clicked "next" button
518 E_RECOVERY_CANCELED
, // user clicked "cancel" button
519 E_RECOVERY_CANCELED_BEFORE
, // user clicked "cancel" button before recovery was started
520 E_RECOVERY_CANCELED_AFTERWARDS
, // user clicked "cancel" button after reovery was finished
521 E_RECOVERY_HANDLED
// the recovery wizard page was shown already ... and will be shown now again ...
523 sal_Int32 m_eRecoveryState
;
525 bool m_bWasRecoveryStarted
;
530 RecoveryDialog(vcl::Window
* pParent
,
531 RecoveryCore
* pCore
);
533 virtual ~RecoveryDialog();
534 virtual void dispose() SAL_OVERRIDE
;
536 // IRecoveryUpdateListener
537 virtual void updateItems() SAL_OVERRIDE
;
538 virtual void stepNext(TURLInfo
* pItem
) SAL_OVERRIDE
;
539 virtual void start() SAL_OVERRIDE
;
540 virtual void end() SAL_OVERRIDE
;
547 DECL_LINK(NextButtonHdl
, void*);
548 DECL_LINK(CancelButtonHdl
, void*);
552 OUString
impl_getStatusString( const TURLInfo
& rInfo
) const;
556 class BrokenRecoveryDialog
: public ModalDialog
561 VclPtr
<ListBox
> m_pFileListLB
;
562 VclPtr
<Edit
> m_pSaveDirED
;
563 VclPtr
<PushButton
> m_pSaveDirBtn
;
564 VclPtr
<PushButton
> m_pOkBtn
;
565 VclPtr
<CancelButton
> m_pCancelBtn
;
567 OUString m_sSavePath
;
568 RecoveryCore
* m_pCore
;
569 bool m_bBeforeRecovery
;
570 bool m_bExecutionNeeded
;
578 BrokenRecoveryDialog(vcl::Window
* pParent
,
579 RecoveryCore
* pCore
,
580 bool bBeforeRecovery
);
581 virtual ~BrokenRecoveryDialog();
582 virtual void dispose() SAL_OVERRIDE
;
586 bool isExecutionNeeded();
590 OUString
getSaveDirURL();
602 DECL_LINK(SaveButtonHdl
, void*);
606 DECL_LINK(OkButtonHdl
, void*);
610 DECL_LINK(CancelButtonHdl
, void*);
614 void impl_askForSavePath();
621 /* vim:set shiftwidth=4 softtabstop=4 expandtab: */