summaryrefslogtreecommitdiff
path: root/svx/source/stbctrls/modctrl.cxx
diff options
context:
space:
mode:
authorDmitry Ashkadov <dmitry.ashkadov@gmail.com>2011-09-21 15:58:43 +0100
committerCaolán McNamara <caolanm@redhat.com>2011-09-21 16:03:22 +0100
commitbcbabc4b3a1c394cfab2602be14e2575a5b1ef42 (patch)
tree75e982b3f475484e7d66bdb493510c078e000d02 /svx/source/stbctrls/modctrl.cxx
parent1b2965833c97da449f5d38c9e683c14507a97462 (diff)
fdo#39430: Implement improved Saving Information Icon in the Status Bar
Diffstat (limited to 'svx/source/stbctrls/modctrl.cxx')
-rw-r--r--svx/source/stbctrls/modctrl.cxx88
1 files changed, 66 insertions, 22 deletions
diff --git a/svx/source/stbctrls/modctrl.cxx b/svx/source/stbctrls/modctrl.cxx
index 1e94cd99ae06..4d56d807d128 100644
--- a/svx/source/stbctrls/modctrl.cxx
+++ b/svx/source/stbctrls/modctrl.cxx
@@ -33,6 +33,7 @@
#include <vcl/status.hxx>
#include <vcl/image.hxx>
+#include <vcl/timer.hxx>
#include <svl/eitem.hxx>
#include <sfx2/app.hxx>
@@ -48,20 +49,37 @@ using ::rtl::OUString;
SFX_IMPL_STATUSBAR_CONTROL(SvxModifyControl, SfxBoolItem);
+
+namespace
+{
+const unsigned _FEEDBACK_TIMEOUT = 3000;
+}
+
+
// class SvxModifyControl ------------------------------------------------
struct SvxModifyControl::ImplData
{
- Image maModifiedButton;
- Image maNonModifiedButton;
+ enum ModificationState
+ {
+ 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() :
- maModifiedButton( SVX_RES(RID_SVXBMP_DOC_MODIFIED_YES) ),
- maNonModifiedButton( SVX_RES(RID_SVXBMP_DOC_MODIFIED_NO) ),
- mbModified(false)
+ ImplData():
+ mnModState(MODIFICATION_STATE_NO)
{
+ 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,
SfxStatusBarControl( _nSlotId, _nId, rStb ),
mpImpl(new ImplData)
{
+ mpImpl->maTimer.SetTimeoutHdl( LINK(this, SvxModifyControl, OnTimer) );
}
// -----------------------------------------------------------------------
@@ -84,13 +103,43 @@ void SvxModifyControl::StateChanged( sal_uInt16, SfxItemState eState,
DBG_ASSERT( pState->ISA( SfxBoolItem ), "invalid item type" );
SfxBoolItem* pItem = (SfxBoolItem*)pState;
- mpImpl->mbModified = pItem->GetValue();
+ mpImpl->maTimer.Stop();
- if ( GetStatusBar().AreItemsVisible() )
- GetStatusBar().SetItemData( GetId(), 0 ); // force repaint
+ bool modified = pItem->GetValue();
+ 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));
+
+ 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)
}
}
+
+
void SvxModifyControl::Paint( const UserDrawEvent& rUsrEvt )
{
OutputDevice* pDev = rUsrEvt.GetDevice();
Rectangle aRect = rUsrEvt.GetRect();
- if (mpImpl->mbModified)
- {
- Point aPt = centerImage(aRect, mpImpl->maModifiedButton);
- pDev->DrawImage(aPt, mpImpl->maModifiedButton);
- }
- else
- {
- Point aPt = centerImage(aRect, mpImpl->maNonModifiedButton);
- pDev->DrawImage(aPt, mpImpl->maNonModifiedButton);
- }
+ ImplData::ModificationState state = mpImpl->mnModState;
+ Point aPt = centerImage(aRect, mpImpl->maImages[state]);
+ pDev->DrawImage(aPt, mpImpl->maImages[state]);
}
void SvxModifyControl::DoubleClick()
{
- if (!mpImpl->mbModified)
+ if (mpImpl->mnModState != ImplData::MODIFICATION_STATE_YES)
// document not modified. nothing to do here.
return;