summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKohei Yoshida <kyoshida@novell.com>2009-07-23 13:20:58 -0400
committerKohei Yoshida <kyoshida@novell.com>2009-07-23 13:24:59 -0400
commit27ab7e8c7013f5dc90b3f35a9fc82cec4927b2a1 (patch)
tree36aaa2ad3ee94c2679e7cf87ce062186bd5a0171
parente148cbcb63e2fe4ba4f19ad0e05410977f3cc837 (diff)
WIP: Fancier document modified status in the status bar.
The goal of this task is to display an icon for document modified and unmodified status, instead of simply displaying '*' when the document is modified, hopefully to get more attention of the user for the modified state. * patches/test/statusbar-fancy-modified-status.diff: initial plumbing is done. For now, I'm borrowing the plus and minus icons for the zoom slide bar. WIP = work in progress
-rw-r--r--patches/test/statusbar-fancy-modified-status.diff259
1 files changed, 259 insertions, 0 deletions
diff --git a/patches/test/statusbar-fancy-modified-status.diff b/patches/test/statusbar-fancy-modified-status.diff
new file mode 100644
index 000000000..be6d633b0
--- /dev/null
+++ b/patches/test/statusbar-fancy-modified-status.diff
@@ -0,0 +1,259 @@
+diff --git sc/uiconfig/scalc/statusbar/statusbar.xml sc/uiconfig/scalc/statusbar/statusbar.xml
+index 1ddff7a..28dfaf4 100644
+--- sc/uiconfig/scalc/statusbar/statusbar.xml
++++ sc/uiconfig/scalc/statusbar/statusbar.xml
+@@ -5,7 +5,7 @@
+ <statusbar:statusbaritem xlink:href=".uno:StatusPageStyle" statusbar:align="left" statusbar:autosize="true" statusbar:width="83" statusbar:helpid="helpid:26115"/>
+ <statusbar:statusbaritem xlink:href=".uno:InsertMode" statusbar:align="center" statusbar:width="41" statusbar:helpid="helpid:10221"/>
+ <statusbar:statusbaritem xlink:href=".uno:StatusSelectionMode" statusbar:align="center" statusbar:width="34" statusbar:helpid="helpid:26116"/>
+- <statusbar:statusbaritem xlink:href=".uno:ModifiedStatus" statusbar:align="center" statusbar:width="18" statusbar:helpid="helpid:5584"/>
++ <statusbar:statusbaritem xlink:href=".uno:ModifiedStatus" statusbar:align="center" statusbar:ownerdraw="true" statusbar:width="18" statusbar:helpid="helpid:5584"/>
+ <statusbar:statusbaritem xlink:href=".uno:Signature" statusbar:align="center" statusbar:ownerdraw="true" statusbar:width="16" statusbar:helpid="helpid:5699"/>
+ <statusbar:statusbaritem xlink:href=".uno:Size" statusbar:align="center" statusbar:autosize="true" statusbar:ownerdraw="true" statusbar:width="212" statusbar:helpid="helpid:10224"/>
+ <statusbar:statusbaritem xlink:href=".uno:ZoomSlider" statusbar:align="center" statusbar:ownerdraw="true" statusbar:width="140" statusbar:helpid="helpid:11065"/>
+diff --git sfx2/sdi/sfx.sdi sfx2/sdi/sfx.sdi
+index 41e1df9..dcce53b 100644
+--- sfx2/sdi/sfx.sdi
++++ sfx2/sdi/sfx.sdi
+@@ -4336,7 +4336,7 @@ SfxBoolItem Modified SID_MODIFIED
+ ]
+
+ //--------------------------------------------------------------------------
+-SfxStringItem ModifiedStatus SID_DOC_MODIFIED
++SfxBoolItem ModifiedStatus SID_DOC_MODIFIED
+
+ [
+ /* flags: */
+diff --git sfx2/source/doc/objserv.cxx sfx2/source/doc/objserv.cxx
+index 1ee9eb6..9e0936a 100644
+--- sfx2/source/doc/objserv.cxx
++++ sfx2/source/doc/objserv.cxx
+@@ -1060,7 +1060,7 @@ void SfxObjectShell::GetState_Impl(SfxItemSet &rSet)
+
+ case SID_DOC_MODIFIED:
+ {
+- rSet.Put( SfxStringItem( SID_DOC_MODIFIED, IsModified() ? '*' : ' ' ) );
++ rSet.Put( SfxBoolItem( SID_DOC_MODIFIED, IsModified() ) );
+ break;
+ }
+
+diff --git svx/inc/modctrl.hxx svx/inc/modctrl.hxx
+index e1f41a8..5941e89 100644
+--- svx/inc/modctrl.hxx
++++ svx/inc/modctrl.hxx
+@@ -35,6 +35,8 @@
+ #include <sfx2/stbitem.hxx>
+ #include "svx/svxdllapi.h"
+
++#include <boost/shared_ptr.hpp>
++
+ // class SvxModifyControl ------------------------------------------------
+
+ class SVX_DLLPUBLIC SvxModifyControl : public SfxStatusBarControl
+@@ -42,7 +44,7 @@ class SVX_DLLPUBLIC SvxModifyControl : public SfxStatusBarControl
+ public:
+ virtual void StateChanged( USHORT nSID, SfxItemState eState,
+ const SfxPoolItem* pState );
+- virtual void Paint( const UserDrawEvent& rEvt );
++ virtual void Paint( const UserDrawEvent& rUsrEvt );
+
+ SFX_DECL_STATUSBAR_CONTROL();
+
+@@ -51,11 +53,8 @@ public:
+ static ULONG GetDefItemWidth(const StatusBar& rStb);
+
+ private:
+- BOOL bState;
+-
+-#ifdef _SVX_MODCTRL_CXX
+- SVX_DLLPRIVATE void DrawItemText_Impl();
+-#endif
++ struct ImplData;
++ ::boost::shared_ptr<ImplData> mpImpl;
+ };
+
+
+diff --git svx/inc/svx/dialogs.hrc svx/inc/svx/dialogs.hrc
+index 57e4e9f..0a1f152 100644
+--- svx/inc/svx/dialogs.hrc
++++ svx/inc/svx/dialogs.hrc
+@@ -191,6 +191,8 @@
+ #define RID_SVXBMP_SLIDERBUTTON_HC (RID_SVX_START + 70)
+ #define RID_SVXBMP_SLIDERDECREASE_HC (RID_SVX_START + 71)
+ #define RID_SVXBMP_SLIDERINCREASE_HC (RID_SVX_START + 72)
++#define RID_SVXBMP_DOC_MODIFIED_YES (RID_SVX_START + 73)
++#define RID_SVXBMP_DOC_MODIFIED_NO (RID_SVX_START + 74)
+
+ // Alignment-TabPage
+ #define RID_SVXPAGE_ALIGNMENT (RID_SVX_START + 90)
+diff --git svx/source/stbctrls/makefile.mk svx/source/stbctrls/makefile.mk
+index 7a6fad6..e5bff5a 100644
+--- svx/source/stbctrls/makefile.mk
++++ svx/source/stbctrls/makefile.mk
+@@ -59,6 +59,7 @@ SLOFILES= \
+ $(SLO)$/zoomsliderctrl.obj
+
+ EXCEPTIONSFILES= \
++ $(SLO)$/modctrl.obj \
+ $(SLO)$/zoomsliderctrl.obj
+
+ HXX1TARGET=stbctrls
+diff --git svx/source/stbctrls/modctrl.cxx svx/source/stbctrls/modctrl.cxx
+index 843c845..3db5f2d 100644
+--- svx/source/stbctrls/modctrl.cxx
++++ svx/source/stbctrls/modctrl.cxx
+@@ -33,29 +33,44 @@
+
+ // include ---------------------------------------------------------------
+
+-#ifndef _STATUS_HXX //autogen
++#include "modctrl.hxx"
++
+ #include <vcl/status.hxx>
+-#endif
++#include <vcl/image.hxx>
+ #include <svtools/eitem.hxx>
+ #include <sfx2/app.hxx>
+
+-#define _SVX_MODCTRL_CXX
+
+ #include <svx/dialogs.hrc>
+-
+-#include "modctrl.hxx"
+ #include <svx/dialmgr.hxx>
+
++using ::rtl::OUString;
++
+ SFX_IMPL_STATUSBAR_CONTROL(SvxModifyControl, SfxBoolItem);
+
+ // class SvxModifyControl ------------------------------------------------
+
++struct SvxModifyControl::ImplData
++{
++ Image maModifiedButton;
++ Image maNonModifiedButton;
++
++ bool mbState;
++
++ ImplData() :
++ maModifiedButton( SVX_RES(RID_SVXBMP_DOC_MODIFIED_YES) ),
++ maNonModifiedButton( SVX_RES(RID_SVXBMP_DOC_MODIFIED_NO) ),
++ mbState(false)
++ {
++ }
++};
++
+ SvxModifyControl::SvxModifyControl( USHORT _nSlotId,
+ USHORT _nId,
+ StatusBar& rStb ) :
+
+ SfxStatusBarControl( _nSlotId, _nId, rStb ),
+- bState( TRUE )
++ mpImpl(new ImplData)
+ {
+ }
+
+@@ -64,33 +79,61 @@ SvxModifyControl::SvxModifyControl( USHORT _nSlotId,
+ void SvxModifyControl::StateChanged( USHORT, SfxItemState eState,
+ const SfxPoolItem* pState )
+ {
++ StackPrinter __stack_printer__("SvxModifyControl::StateChanged");
+ if ( SFX_ITEM_AVAILABLE != eState )
+- GetStatusBar().SetItemText( GetId(), String() );
+- else
+- {
+- DBG_ASSERT( pState->ISA( SfxBoolItem ), "invalid item type" );
+- SfxBoolItem* pItem = (SfxBoolItem*)pState;
+- bState = pItem->GetValue();
+- DrawItemText_Impl();
+- }
+-}
++ return;
+
+-// -----------------------------------------------------------------------
++ DBG_ASSERT( pState->ISA( SfxBoolItem ), "invalid item type" );
++ SfxBoolItem* pItem = (SfxBoolItem*)pState;
++ mpImpl->mbState = pItem->GetValue();
++ fprintf(stdout, "SvxModifyControl::StateChanged: state = %d\n", mpImpl->mbState);
+
+-void SvxModifyControl::Paint( const UserDrawEvent& )
+-{
+- DrawItemText_Impl();
++ if ( GetStatusBar().AreItemsVisible() )
++ GetStatusBar().SetItemData( GetId(), 0 ); // force repaint
+ }
+
+ // -----------------------------------------------------------------------
+
+-void SvxModifyControl::DrawItemText_Impl()
++namespace {
++
++/**
++ * Given a bounding rectangle and an image, determine the top-left position
++ * of the image so that the image would look centered both horizontally and
++ * vertically.
++ *
++ * @param rBoundingRect bounding rectangle
++ * @param rImg image
++ *
++ * @return Point top-left corner of the centered image position
++ */
++Point centerImage(const Rectangle& rBoundingRect, const Image& rImg)
+ {
+- String sMode;
++ Size aImgSize = rImg.GetSizePixel();
++ Size aRectSize = rBoundingRect.GetSize();
++ long nXOffset = (aRectSize.getWidth() - aImgSize.getWidth())/2;
++ long nYOffset = (aRectSize.getHeight() - aImgSize.getHeight())/2;
++ Point aPt = rBoundingRect.TopLeft();
++ aPt += Point(nXOffset, nYOffset);
++ return aPt;
++}
+
+- if ( bState )
+- sMode = '*';
+- GetStatusBar().SetItemText( GetId(), sMode );
++}
++void SvxModifyControl::Paint( const UserDrawEvent& rUsrEvt )
++{
++ const Rectangle aControlRect = getControlRect();
++ OutputDevice* pDev = rUsrEvt.GetDevice();
++ Rectangle aRect = rUsrEvt.GetRect();
++
++ if (mpImpl->mbState)
++ {
++ Point aPt = centerImage(aRect, mpImpl->maModifiedButton);
++ pDev->DrawImage(aPt, mpImpl->maModifiedButton);
++ }
++ else
++ {
++ Point aPt = centerImage(aRect, mpImpl->maNonModifiedButton);
++ pDev->DrawImage(aPt, mpImpl->maNonModifiedButton);
++ }
+ }
+
+ ULONG SvxModifyControl::GetDefItemWidth(const StatusBar& rStb)
+diff --git svx/source/stbctrls/stbctrls.src svx/source/stbctrls/stbctrls.src
+index b4dac87..98d9d74 100644
+--- svx/source/stbctrls/stbctrls.src
++++ svx/source/stbctrls/stbctrls.src
+@@ -323,3 +323,19 @@ Image RID_SVXBMP_SLIDERINCREASE_HC
+ MaskColor = STD_MASKCOLOR;
+ };
+
++Image RID_SVXBMP_DOC_MODIFIED_YES
++{
++ ImageBitmap = Bitmap
++ {
++ File = "slidezoomin_11.png" ;
++ };
++ MaskColor = STD_MASKCOLOR;
++};
++Image RID_SVXBMP_DOC_MODIFIED_NO
++{
++ ImageBitmap = Bitmap
++ {
++ File = "slidezoomout_11.png" ;
++ };
++ MaskColor = STD_MASKCOLOR;
++};