Kaydet (Commit) bcbabc4b authored tarafından Dmitry Ashkadov's avatar Dmitry Ashkadov Kaydeden (comit) Caolán McNamara

fdo#39430: Implement improved Saving Information Icon in the Status Bar

üst 1b296583
...@@ -1156,9 +1156,10 @@ ...@@ -1156,9 +1156,10 @@
#define SVX_OOO_BUILD_START (RID_SVX_START + 1200) #define SVX_OOO_BUILD_START (RID_SVX_START + 1200)
#define RID_SVXBMP_DOC_MODIFIED_YES (SVX_OOO_BUILD_START + 1) #define RID_SVXBMP_DOC_MODIFIED_YES (SVX_OOO_BUILD_START + 1)
#define RID_SVXBMP_DOC_MODIFIED_NO (SVX_OOO_BUILD_START + 2) #define RID_SVXBMP_DOC_MODIFIED_NO (SVX_OOO_BUILD_START + 2)
#define RID_SVXSTR_DOC_MODIFIED_YES (SVX_OOO_BUILD_START + 3) #define RID_SVXBMP_DOC_MODIFIED_FEEDBACK (SVX_OOO_BUILD_START + 3)
#define RID_SVXSTR_DOC_MODIFIED_NO (SVX_OOO_BUILD_START + 4) #define RID_SVXSTR_DOC_MODIFIED_YES (SVX_OOO_BUILD_START + 4)
#define RID_SVXSTR_DOC_MODIFIED_NO (SVX_OOO_BUILD_START + 5)
#endif #endif
...@@ -30,11 +30,15 @@ ...@@ -30,11 +30,15 @@
// include --------------------------------------------------------------- // include ---------------------------------------------------------------
#include <tools/link.hxx>
#include <sfx2/stbitem.hxx> #include <sfx2/stbitem.hxx>
#include "svx/svxdllapi.h" #include "svx/svxdllapi.h"
#include <boost/shared_ptr.hpp> #include <boost/shared_ptr.hpp>
// Forward declarations
class Timer;
// class SvxModifyControl ------------------------------------------------ // class SvxModifyControl ------------------------------------------------
class SVX_DLLPUBLIC SvxModifyControl : public SfxStatusBarControl class SVX_DLLPUBLIC SvxModifyControl : public SfxStatusBarControl
...@@ -49,6 +53,12 @@ public: ...@@ -49,6 +53,12 @@ public:
SvxModifyControl( sal_uInt16 nSlotId, sal_uInt16 nId, StatusBar& rStb ); SvxModifyControl( sal_uInt16 nSlotId, sal_uInt16 nId, StatusBar& rStb );
private: // Links
DECL_LINK( OnTimer, Timer * );
private: // Functions
void _repaint();
private: private:
struct ImplData; struct ImplData;
::boost::shared_ptr<ImplData> mpImpl; ::boost::shared_ptr<ImplData> mpImpl;
......
...@@ -33,6 +33,7 @@ ...@@ -33,6 +33,7 @@
#include <vcl/status.hxx> #include <vcl/status.hxx>
#include <vcl/image.hxx> #include <vcl/image.hxx>
#include <vcl/timer.hxx>
#include <svl/eitem.hxx> #include <svl/eitem.hxx>
#include <sfx2/app.hxx> #include <sfx2/app.hxx>
...@@ -48,20 +49,37 @@ using ::rtl::OUString; ...@@ -48,20 +49,37 @@ using ::rtl::OUString;
SFX_IMPL_STATUSBAR_CONTROL(SvxModifyControl, SfxBoolItem); SFX_IMPL_STATUSBAR_CONTROL(SvxModifyControl, SfxBoolItem);
namespace
{
const unsigned _FEEDBACK_TIMEOUT = 3000;
}
// class SvxModifyControl ------------------------------------------------ // class SvxModifyControl ------------------------------------------------
struct SvxModifyControl::ImplData struct SvxModifyControl::ImplData
{ {
Image maModifiedButton; enum ModificationState
Image maNonModifiedButton; {
MODIFICATION_STATE_NO = 0,
MODIFICATION_STATE_YES,
MODIFICATION_STATE_FEEDBACK,
MODIFICATION_STATE_SIZE
};
Timer maTimer;
Image maImages[MODIFICATION_STATE_SIZE];
bool mbModified; ModificationState mnModState;
ImplData() : ImplData():
maModifiedButton( SVX_RES(RID_SVXBMP_DOC_MODIFIED_YES) ), mnModState(MODIFICATION_STATE_NO)
maNonModifiedButton( SVX_RES(RID_SVXBMP_DOC_MODIFIED_NO) ),
mbModified(false)
{ {
maImages[MODIFICATION_STATE_NO] = Image(SVX_RES(RID_SVXBMP_DOC_MODIFIED_NO));
maImages[MODIFICATION_STATE_YES] = Image(SVX_RES(RID_SVXBMP_DOC_MODIFIED_YES));
maImages[MODIFICATION_STATE_FEEDBACK] = Image(SVX_RES(RID_SVXBMP_DOC_MODIFIED_FEEDBACK));
maTimer.SetTimeout(_FEEDBACK_TIMEOUT);
} }
}; };
...@@ -72,6 +90,7 @@ SvxModifyControl::SvxModifyControl( sal_uInt16 _nSlotId, ...@@ -72,6 +90,7 @@ SvxModifyControl::SvxModifyControl( sal_uInt16 _nSlotId,
SfxStatusBarControl( _nSlotId, _nId, rStb ), SfxStatusBarControl( _nSlotId, _nId, rStb ),
mpImpl(new ImplData) mpImpl(new ImplData)
{ {
mpImpl->maTimer.SetTimeoutHdl( LINK(this, SvxModifyControl, OnTimer) );
} }
// ----------------------------------------------------------------------- // -----------------------------------------------------------------------
...@@ -84,13 +103,43 @@ void SvxModifyControl::StateChanged( sal_uInt16, SfxItemState eState, ...@@ -84,13 +103,43 @@ void SvxModifyControl::StateChanged( sal_uInt16, SfxItemState eState,
DBG_ASSERT( pState->ISA( SfxBoolItem ), "invalid item type" ); DBG_ASSERT( pState->ISA( SfxBoolItem ), "invalid item type" );
SfxBoolItem* pItem = (SfxBoolItem*)pState; SfxBoolItem* pItem = (SfxBoolItem*)pState;
mpImpl->mbModified = pItem->GetValue(); mpImpl->maTimer.Stop();
if ( GetStatusBar().AreItemsVisible() ) bool modified = pItem->GetValue();
GetStatusBar().SetItemData( GetId(), 0 ); // force repaint bool start = ( !modified && mpImpl->mnModState == ImplData::MODIFICATION_STATE_YES); // should timer be started and feedback image displayed ?
int nResId = mpImpl->mbModified ? RID_SVXSTR_DOC_MODIFIED_YES : RID_SVXSTR_DOC_MODIFIED_NO; mpImpl->mnModState = (start ? ImplData::MODIFICATION_STATE_FEEDBACK : (modified ? ImplData::MODIFICATION_STATE_YES : ImplData::MODIFICATION_STATE_NO));
_repaint();
int nResId = modified ? RID_SVXSTR_DOC_MODIFIED_YES : RID_SVXSTR_DOC_MODIFIED_NO;
GetStatusBar().SetQuickHelpText(GetId(), SVX_RESSTR(nResId)); GetStatusBar().SetQuickHelpText(GetId(), SVX_RESSTR(nResId));
if ( start )
mpImpl->maTimer.Start();
}
// -----------------------------------------------------------------------
IMPL_LINK( SvxModifyControl, OnTimer, Timer *, pTimer )
{
if (pTimer == 0)
return 0;
pTimer->Stop();
mpImpl->mnModState = ImplData::MODIFICATION_STATE_NO;
_repaint();
return 0;
}
// -----------------------------------------------------------------------
void SvxModifyControl::_repaint()
{
if ( GetStatusBar().AreItemsVisible() )
GetStatusBar().SetItemData( GetId(), 0 ); // force repaint
} }
// ----------------------------------------------------------------------- // -----------------------------------------------------------------------
...@@ -119,26 +168,21 @@ Point centerImage(const Rectangle& rBoundingRect, const Image& rImg) ...@@ -119,26 +168,21 @@ Point centerImage(const Rectangle& rBoundingRect, const Image& rImg)
} }
} }
void SvxModifyControl::Paint( const UserDrawEvent& rUsrEvt ) void SvxModifyControl::Paint( const UserDrawEvent& rUsrEvt )
{ {
OutputDevice* pDev = rUsrEvt.GetDevice(); OutputDevice* pDev = rUsrEvt.GetDevice();
Rectangle aRect = rUsrEvt.GetRect(); Rectangle aRect = rUsrEvt.GetRect();
if (mpImpl->mbModified) ImplData::ModificationState state = mpImpl->mnModState;
{ Point aPt = centerImage(aRect, mpImpl->maImages[state]);
Point aPt = centerImage(aRect, mpImpl->maModifiedButton); pDev->DrawImage(aPt, mpImpl->maImages[state]);
pDev->DrawImage(aPt, mpImpl->maModifiedButton);
}
else
{
Point aPt = centerImage(aRect, mpImpl->maNonModifiedButton);
pDev->DrawImage(aPt, mpImpl->maNonModifiedButton);
}
} }
void SvxModifyControl::DoubleClick() void SvxModifyControl::DoubleClick()
{ {
if (!mpImpl->mbModified) if (mpImpl->mnModState != ImplData::MODIFICATION_STATE_YES)
// document not modified. nothing to do here. // document not modified. nothing to do here.
return; return;
......
...@@ -301,3 +301,11 @@ Image RID_SVXBMP_DOC_MODIFIED_NO ...@@ -301,3 +301,11 @@ Image RID_SVXBMP_DOC_MODIFIED_NO
}; };
MaskColor = STD_MASKCOLOR; MaskColor = STD_MASKCOLOR;
}; };
Image RID_SVXBMP_DOC_MODIFIED_FEEDBACK
{
ImageBitmap = Bitmap
{
File = "doc_modified_feedback.png" ;
};
MaskColor = STD_MASKCOLOR;
};
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment