xref: /trunk/main/svx/source/stbctrls/pszctrl.cxx (revision f6e50924346d0b8c0b07c91832a97665dd718b0c)
1*f6e50924SAndrew Rist /**************************************************************
2cdf0e10cSrcweir  *
3*f6e50924SAndrew Rist  * Licensed to the Apache Software Foundation (ASF) under one
4*f6e50924SAndrew Rist  * or more contributor license agreements.  See the NOTICE file
5*f6e50924SAndrew Rist  * distributed with this work for additional information
6*f6e50924SAndrew Rist  * regarding copyright ownership.  The ASF licenses this file
7*f6e50924SAndrew Rist  * to you under the Apache License, Version 2.0 (the
8*f6e50924SAndrew Rist  * "License"); you may not use this file except in compliance
9*f6e50924SAndrew Rist  * with the License.  You may obtain a copy of the License at
10cdf0e10cSrcweir  *
11*f6e50924SAndrew Rist  *   http://www.apache.org/licenses/LICENSE-2.0
12cdf0e10cSrcweir  *
13*f6e50924SAndrew Rist  * Unless required by applicable law or agreed to in writing,
14*f6e50924SAndrew Rist  * software distributed under the License is distributed on an
15*f6e50924SAndrew Rist  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16*f6e50924SAndrew Rist  * KIND, either express or implied.  See the License for the
17*f6e50924SAndrew Rist  * specific language governing permissions and limitations
18*f6e50924SAndrew Rist  * under the License.
19cdf0e10cSrcweir  *
20*f6e50924SAndrew Rist  *************************************************************/
21*f6e50924SAndrew Rist 
22*f6e50924SAndrew Rist 
23cdf0e10cSrcweir 
24cdf0e10cSrcweir // MARKER(update_precomp.py): autogen include statement, do not remove
25cdf0e10cSrcweir #include "precompiled_svx.hxx"
26cdf0e10cSrcweir 
27cdf0e10cSrcweir // include ---------------------------------------------------------------
28cdf0e10cSrcweir 
29cdf0e10cSrcweir #include <limits.h>
30cdf0e10cSrcweir #include <tools/shl.hxx>
31cdf0e10cSrcweir #include <vcl/status.hxx>
32cdf0e10cSrcweir #include <vcl/menu.hxx>
33cdf0e10cSrcweir #include <vcl/image.hxx>
34cdf0e10cSrcweir #include <svl/stritem.hxx>
35cdf0e10cSrcweir #include <svl/ptitem.hxx>
36cdf0e10cSrcweir #include <svl/itempool.hxx>
37cdf0e10cSrcweir #include <sfx2/app.hxx>
38cdf0e10cSrcweir #include <sfx2/module.hxx>
39cdf0e10cSrcweir #include <sfx2/dispatch.hxx>
40cdf0e10cSrcweir #include <sfx2/objsh.hxx>
41cdf0e10cSrcweir #include <svl/intitem.hxx>
42cdf0e10cSrcweir #define _SVX_PSZCTRL_CXX
43cdf0e10cSrcweir 
44cdf0e10cSrcweir #include "svx/pszctrl.hxx"
45cdf0e10cSrcweir 
46cdf0e10cSrcweir #define PAINT_OFFSET    5
47cdf0e10cSrcweir 
48cdf0e10cSrcweir #include <editeng/sizeitem.hxx>
49cdf0e10cSrcweir #include <svx/dialmgr.hxx>
50cdf0e10cSrcweir #include "svx/dlgutil.hxx"
51cdf0e10cSrcweir #include "stbctrls.h"
52cdf0e10cSrcweir #include "sfx2/module.hxx"
53cdf0e10cSrcweir 
54cdf0e10cSrcweir #include <svx/dialogs.hrc>
55cdf0e10cSrcweir #include <unotools/localedatawrapper.hxx>
56cdf0e10cSrcweir #ifndef _UNOTOOLS_PROCESSFACTORY_HXX
57cdf0e10cSrcweir #include <comphelper/processfactory.hxx>
58cdf0e10cSrcweir #endif
59cdf0e10cSrcweir 
60cdf0e10cSrcweir // -----------------------------------------------------------------------
61cdf0e10cSrcweir 
62cdf0e10cSrcweir /*  [Beschreibung]
63cdf0e10cSrcweir 
64cdf0e10cSrcweir     Funktion, mit der ein metrischer Wert in textueller Darstellung
65cdf0e10cSrcweir     umgewandelt wird.
66cdf0e10cSrcweir 
67cdf0e10cSrcweir     nVal ist hier der metrische Wert in der Einheit eUnit.
68cdf0e10cSrcweir 
69cdf0e10cSrcweir     [Querverweise]
70cdf0e10cSrcweir 
71cdf0e10cSrcweir     <SvxPosSizeStatusBarControl::Paint(const UserDrawEvent&)>
72cdf0e10cSrcweir */
73cdf0e10cSrcweir 
74cdf0e10cSrcweir String SvxPosSizeStatusBarControl::GetMetricStr_Impl( long nVal )
75cdf0e10cSrcweir {
76cdf0e10cSrcweir     // Applikations-Metrik besorgen und setzen
77cdf0e10cSrcweir     FieldUnit eOutUnit = SfxModule::GetModuleFieldUnit( getFrameInterface() );
78cdf0e10cSrcweir     FieldUnit eInUnit = FUNIT_100TH_MM;
79cdf0e10cSrcweir 
80cdf0e10cSrcweir     String sMetric;
81cdf0e10cSrcweir     const sal_Unicode cSep = Application::GetSettings().GetLocaleDataWrapper().getNumDecimalSep().GetChar(0);
82cdf0e10cSrcweir     sal_Int64 nConvVal = MetricField::ConvertValue( nVal * 100, 0L, 0, eInUnit, eOutUnit );
83cdf0e10cSrcweir 
84cdf0e10cSrcweir     if ( nConvVal < 0 && ( nConvVal / 100 == 0 ) )
85cdf0e10cSrcweir         sMetric += '-';
86cdf0e10cSrcweir     sMetric += String::CreateFromInt64( nConvVal / 100 );
87cdf0e10cSrcweir 
88cdf0e10cSrcweir     if( FUNIT_NONE != eOutUnit )
89cdf0e10cSrcweir     {
90cdf0e10cSrcweir         sMetric += cSep;
91cdf0e10cSrcweir         sal_Int64 nFract = nConvVal % 100;
92cdf0e10cSrcweir 
93cdf0e10cSrcweir         if ( nFract < 0 )
94cdf0e10cSrcweir             nFract *= -1;
95cdf0e10cSrcweir         if ( nFract < 10 )
96cdf0e10cSrcweir             sMetric += '0';
97cdf0e10cSrcweir         sMetric += String::CreateFromInt64( nFract );
98cdf0e10cSrcweir     }
99cdf0e10cSrcweir 
100cdf0e10cSrcweir     return sMetric;
101cdf0e10cSrcweir }
102cdf0e10cSrcweir 
103cdf0e10cSrcweir // -----------------------------------------------------------------------
104cdf0e10cSrcweir 
105cdf0e10cSrcweir SFX_IMPL_STATUSBAR_CONTROL(SvxPosSizeStatusBarControl, SvxSizeItem);
106cdf0e10cSrcweir 
107cdf0e10cSrcweir // class FunctionPopup_Impl ----------------------------------------------
108cdf0e10cSrcweir 
109cdf0e10cSrcweir class FunctionPopup_Impl : public PopupMenu
110cdf0e10cSrcweir {
111cdf0e10cSrcweir public:
112cdf0e10cSrcweir     FunctionPopup_Impl( sal_uInt16 nCheck );
113cdf0e10cSrcweir 
114cdf0e10cSrcweir     sal_uInt16          GetSelected() const { return nSelected; }
115cdf0e10cSrcweir 
116cdf0e10cSrcweir private:
117cdf0e10cSrcweir     sal_uInt16          nSelected;
118cdf0e10cSrcweir 
119cdf0e10cSrcweir     virtual void    Select();
120cdf0e10cSrcweir };
121cdf0e10cSrcweir 
122cdf0e10cSrcweir // -----------------------------------------------------------------------
123cdf0e10cSrcweir 
124cdf0e10cSrcweir FunctionPopup_Impl::FunctionPopup_Impl( sal_uInt16 nCheck ) :
125cdf0e10cSrcweir     PopupMenu( ResId( RID_SVXMNU_PSZ_FUNC, DIALOG_MGR() ) ),
126cdf0e10cSrcweir     nSelected( 0 )
127cdf0e10cSrcweir {
128cdf0e10cSrcweir     if (nCheck)
129cdf0e10cSrcweir         CheckItem( nCheck );
130cdf0e10cSrcweir }
131cdf0e10cSrcweir 
132cdf0e10cSrcweir // -----------------------------------------------------------------------
133cdf0e10cSrcweir 
134cdf0e10cSrcweir void FunctionPopup_Impl::Select()
135cdf0e10cSrcweir {
136cdf0e10cSrcweir     nSelected = GetCurItemId();
137cdf0e10cSrcweir }
138cdf0e10cSrcweir 
139cdf0e10cSrcweir // struct SvxPosSizeStatusBarControl_Impl --------------------------------
140cdf0e10cSrcweir 
141cdf0e10cSrcweir struct SvxPosSizeStatusBarControl_Impl
142cdf0e10cSrcweir 
143cdf0e10cSrcweir /*  [Beschreibung]
144cdf0e10cSrcweir 
145cdf0e10cSrcweir     Diese Implementations-Struktur der Klasse SvxPosSizeStatusBarControl
146cdf0e10cSrcweir     dient der Entkopplung von "Anderungen vom exportierten Interface sowie
147cdf0e10cSrcweir     der Verringerung von extern sichtbaren Symbolen.
148cdf0e10cSrcweir 
149cdf0e10cSrcweir     Eine Instanz exisitiert pro SvxPosSizeStatusBarControl-Instanz
150cdf0e10cSrcweir     f"ur deren Laufzeit.
151cdf0e10cSrcweir */
152cdf0e10cSrcweir 
153cdf0e10cSrcweir {
154cdf0e10cSrcweir     Point   aPos;       // g"ultig, wenn eine Position angezeigt wird
155cdf0e10cSrcweir     Size    aSize;      // g"ultig, wenn eine Gr"o/se angezeigt wird
156cdf0e10cSrcweir     String  aStr;       // g"ultig, wenn ein Text angezeigt wird
157cdf0e10cSrcweir     sal_Bool    bPos;       // show position
158cdf0e10cSrcweir     sal_Bool    bSize;      // Gr"o/se anzeigen?
159cdf0e10cSrcweir     sal_Bool    bTable;     // Tabellenindex anzeigen?
160cdf0e10cSrcweir     sal_Bool    bHasMenu;   // StarCalc Popup-Menue anzeigen?
161cdf0e10cSrcweir     sal_uInt16  nFunction;  // selektierte StarCalc Funktion
162cdf0e10cSrcweir     Image   aPosImage;  // Image f"ur die Positionsanzeige
163cdf0e10cSrcweir     Image   aSizeImage; // Image f"ur die Gr"o/senanzeige
164cdf0e10cSrcweir };
165cdf0e10cSrcweir 
166cdf0e10cSrcweir // class SvxPosSizeStatusBarControl ------------------------------------------
167cdf0e10cSrcweir 
168cdf0e10cSrcweir /*  [Beschreibung]
169cdf0e10cSrcweir 
170cdf0e10cSrcweir     Ctor():
171cdf0e10cSrcweir     Anlegen einer Impl-Klassen-Instanz, Default die Zeitanzeige enablen,
172cdf0e10cSrcweir     Images fu"r die Position und Gro"sse laden.
173cdf0e10cSrcweir */
174cdf0e10cSrcweir 
175cdf0e10cSrcweir #define STR_POSITION ".uno:Position"
176cdf0e10cSrcweir #define STR_TABLECELL ".uno:StateTableCell"
177cdf0e10cSrcweir #define STR_FUNC ".uno:StatusBarFunc"
178cdf0e10cSrcweir 
179cdf0e10cSrcweir SvxPosSizeStatusBarControl::SvxPosSizeStatusBarControl( sal_uInt16 _nSlotId,
180cdf0e10cSrcweir                                                         sal_uInt16 _nId,
181cdf0e10cSrcweir                                                         StatusBar& rStb ) :
182cdf0e10cSrcweir     SfxStatusBarControl( _nSlotId, _nId, rStb ),
183cdf0e10cSrcweir     pImp( new SvxPosSizeStatusBarControl_Impl )
184cdf0e10cSrcweir {
185cdf0e10cSrcweir     pImp->bPos = sal_False;
186cdf0e10cSrcweir     pImp->bSize = sal_False;
187cdf0e10cSrcweir     pImp->bTable = sal_False;
188cdf0e10cSrcweir     pImp->bHasMenu = sal_False;
189cdf0e10cSrcweir     pImp->nFunction = 0;
190cdf0e10cSrcweir     pImp->aPosImage = Image( ResId( RID_SVXBMP_POSITION, DIALOG_MGR() ) );
191cdf0e10cSrcweir     pImp->aSizeImage = Image( ResId( RID_SVXBMP_SIZE, DIALOG_MGR() ) );
192cdf0e10cSrcweir 
193cdf0e10cSrcweir     addStatusListener( rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( STR_POSITION )));         // SID_ATTR_POSITION
194cdf0e10cSrcweir     addStatusListener( rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( STR_TABLECELL )));   // SID_TABLE_CELL
195cdf0e10cSrcweir     addStatusListener( rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( STR_FUNC )));    // SID_PSZ_FUNCTION
196cdf0e10cSrcweir }
197cdf0e10cSrcweir 
198cdf0e10cSrcweir // -----------------------------------------------------------------------
199cdf0e10cSrcweir 
200cdf0e10cSrcweir /*  [Beschreibung]
201cdf0e10cSrcweir 
202cdf0e10cSrcweir     Dtor():
203cdf0e10cSrcweir     Pointer auf die Impl-Klasse lo"schen, damit der Timer gestoppt wird.
204cdf0e10cSrcweir */
205cdf0e10cSrcweir 
206cdf0e10cSrcweir SvxPosSizeStatusBarControl::~SvxPosSizeStatusBarControl()
207cdf0e10cSrcweir {
208cdf0e10cSrcweir     delete pImp;
209cdf0e10cSrcweir }
210cdf0e10cSrcweir 
211cdf0e10cSrcweir // -----------------------------------------------------------------------
212cdf0e10cSrcweir 
213cdf0e10cSrcweir /*  [Beschreibung]
214cdf0e10cSrcweir 
215cdf0e10cSrcweir     SID_PSZ_FUNCTION aktiviert das Popup-Menue fuer Calc, ansonsten:
216cdf0e10cSrcweir 
217cdf0e10cSrcweir     Statusbenachrichtigung;
218cdf0e10cSrcweir     Je nach Item-Typ wird eine bestimmte Anzeige enabled, die anderen disabled.
219cdf0e10cSrcweir 
220cdf0e10cSrcweir                 NULL/Void   SfxPointItem    SvxSizeItem     SfxStringItem
221cdf0e10cSrcweir     ------------------------------------------------------------------------
222cdf0e10cSrcweir     Zeit        sal_True        sal_False           sal_False           FALSE
223cdf0e10cSrcweir     Position    sal_False                                       FALSE
224cdf0e10cSrcweir     Gro"sse     FALSE                       TRUE            FALSE
225cdf0e10cSrcweir     Text        sal_False                       sal_False           TRUE
226cdf0e10cSrcweir 
227cdf0e10cSrcweir     Ein anderes Item bewirkt einen Assert, die Zeitanzeige wird enabled.
228cdf0e10cSrcweir */
229cdf0e10cSrcweir 
230cdf0e10cSrcweir void SvxPosSizeStatusBarControl::StateChanged( sal_uInt16 nSID, SfxItemState eState,
231cdf0e10cSrcweir                                                const SfxPoolItem* pState )
232cdf0e10cSrcweir {
233cdf0e10cSrcweir     // da Kombi-Controller, immer die aktuelle Id als HelpId setzen
234cdf0e10cSrcweir     // gecachten HelpText vorher l"oschen
235cdf0e10cSrcweir     GetStatusBar().SetHelpText( GetId(), String() );
236cdf0e10cSrcweir 
237cdf0e10cSrcweir     switch ( nSID )
238cdf0e10cSrcweir     {
239cdf0e10cSrcweir         case SID_ATTR_POSITION : GetStatusBar().SetHelpId( GetId(), STR_POSITION ); break;
240cdf0e10cSrcweir         case SID_TABLE_CELL: GetStatusBar().SetHelpId( GetId(), STR_TABLECELL ); break;
241cdf0e10cSrcweir         case SID_PSZ_FUNCTION: GetStatusBar().SetHelpId( GetId(), STR_FUNC ); break;
242cdf0e10cSrcweir         default: break;
243cdf0e10cSrcweir     }
244cdf0e10cSrcweir 
245cdf0e10cSrcweir     if ( nSID == SID_PSZ_FUNCTION )
246cdf0e10cSrcweir     {
247cdf0e10cSrcweir         if ( eState == SFX_ITEM_AVAILABLE )
248cdf0e10cSrcweir         {
249cdf0e10cSrcweir             pImp->bHasMenu = sal_True;
250cdf0e10cSrcweir             if ( pState && pState->ISA(SfxUInt16Item) )
251cdf0e10cSrcweir                 pImp->nFunction = ((const SfxUInt16Item*)pState)->GetValue();
252cdf0e10cSrcweir         }
253cdf0e10cSrcweir         else
254cdf0e10cSrcweir             pImp->bHasMenu = sal_False;
255cdf0e10cSrcweir     }
256cdf0e10cSrcweir     else if ( SFX_ITEM_AVAILABLE != eState )
257cdf0e10cSrcweir     {
258cdf0e10cSrcweir         // #i34458# don't switch to empty display before an empty state was
259cdf0e10cSrcweir         // notified for all display types
260cdf0e10cSrcweir 
261cdf0e10cSrcweir         if ( nSID == SID_TABLE_CELL )
262cdf0e10cSrcweir             pImp->bTable = sal_False;
263cdf0e10cSrcweir         else if ( nSID == SID_ATTR_POSITION )
264cdf0e10cSrcweir             pImp->bPos = sal_False;
265cdf0e10cSrcweir         else if ( nSID == GetSlotId() )     // controller is registered for SID_ATTR_SIZE
266cdf0e10cSrcweir             pImp->bSize = sal_False;
267cdf0e10cSrcweir         else
268cdf0e10cSrcweir         {
269cdf0e10cSrcweir             DBG_ERRORFILE("unknown slot id");
270cdf0e10cSrcweir         }
271cdf0e10cSrcweir     }
272cdf0e10cSrcweir     else if ( pState->ISA( SfxPointItem ) )
273cdf0e10cSrcweir     {
274cdf0e10cSrcweir         // Position anzeigen
275cdf0e10cSrcweir         pImp->aPos = ( (SfxPointItem*)pState )->GetValue();
276cdf0e10cSrcweir         pImp->bPos = sal_True;
277cdf0e10cSrcweir         pImp->bTable = sal_False;
278cdf0e10cSrcweir     }
279cdf0e10cSrcweir     else if ( pState->ISA( SvxSizeItem ) )
280cdf0e10cSrcweir     {
281cdf0e10cSrcweir         // Groesse anzeigen
282cdf0e10cSrcweir         pImp->aSize = ( (SvxSizeItem*)pState )->GetSize();
283cdf0e10cSrcweir         pImp->bSize = sal_True;
284cdf0e10cSrcweir         pImp->bTable = sal_False;
285cdf0e10cSrcweir     }
286cdf0e10cSrcweir     else if ( pState->ISA( SfxStringItem ) )
287cdf0e10cSrcweir     {
288cdf0e10cSrcweir         // String anzeigen (Tabellen-Zelle oder anderes)
289cdf0e10cSrcweir         pImp->aStr = ( (SfxStringItem*)pState )->GetValue();
290cdf0e10cSrcweir         pImp->bTable = sal_True;
291cdf0e10cSrcweir         pImp->bPos = sal_False;
292cdf0e10cSrcweir         pImp->bSize = sal_False;
293cdf0e10cSrcweir     }
294cdf0e10cSrcweir     else
295cdf0e10cSrcweir     {
296cdf0e10cSrcweir         DBG_ERRORFILE( "invalid item type" );
297cdf0e10cSrcweir         // trotzdem Datum und Zeit anzeigen
298cdf0e10cSrcweir         pImp->bPos = sal_False;
299cdf0e10cSrcweir         pImp->bSize = sal_False;
300cdf0e10cSrcweir         pImp->bTable = sal_False;
301cdf0e10cSrcweir     }
302cdf0e10cSrcweir 
303cdf0e10cSrcweir     if ( GetStatusBar().AreItemsVisible() )
304cdf0e10cSrcweir         GetStatusBar().SetItemData( GetId(), 0 );
305cdf0e10cSrcweir 
306cdf0e10cSrcweir     //  nur Strings auch als Text an der StatusBar setzen, damit Tip-Hilfe
307cdf0e10cSrcweir     //  funktioniert, wenn der Text zu lang ist.
308cdf0e10cSrcweir     String aText;
309cdf0e10cSrcweir     if ( pImp->bTable )
310cdf0e10cSrcweir         aText = pImp->aStr;
311cdf0e10cSrcweir     GetStatusBar().SetItemText( GetId(), aText );
312cdf0e10cSrcweir }
313cdf0e10cSrcweir 
314cdf0e10cSrcweir // -----------------------------------------------------------------------
315cdf0e10cSrcweir 
316cdf0e10cSrcweir /*  [Beschreibung]
317cdf0e10cSrcweir 
318cdf0e10cSrcweir     Popup-Menue ausfuehren, wenn per Status enabled
319cdf0e10cSrcweir */
320cdf0e10cSrcweir 
321cdf0e10cSrcweir void SvxPosSizeStatusBarControl::Command( const CommandEvent& rCEvt )
322cdf0e10cSrcweir {
323cdf0e10cSrcweir     if ( rCEvt.GetCommand() == COMMAND_CONTEXTMENU && pImp->bHasMenu )
324cdf0e10cSrcweir     {
325cdf0e10cSrcweir         sal_uInt16 nSelect = pImp->nFunction;
326cdf0e10cSrcweir         if (!nSelect)
327cdf0e10cSrcweir             nSelect = PSZ_FUNC_NONE;
328cdf0e10cSrcweir         FunctionPopup_Impl aMenu( nSelect );
329cdf0e10cSrcweir         if ( aMenu.Execute( &GetStatusBar(), rCEvt.GetMousePosPixel() ) )
330cdf0e10cSrcweir         {
331cdf0e10cSrcweir             nSelect = aMenu.GetSelected();
332cdf0e10cSrcweir             if (nSelect)
333cdf0e10cSrcweir             {
334cdf0e10cSrcweir                 if (nSelect == PSZ_FUNC_NONE)
335cdf0e10cSrcweir                     nSelect = 0;
336cdf0e10cSrcweir 
337cdf0e10cSrcweir                 ::com::sun::star::uno::Any a;
338cdf0e10cSrcweir                 SfxUInt16Item aItem( SID_PSZ_FUNCTION, nSelect );
339cdf0e10cSrcweir 
340cdf0e10cSrcweir                 ::com::sun::star::uno::Sequence< ::com::sun::star::beans::PropertyValue > aArgs( 1 );
341cdf0e10cSrcweir                 aArgs[0].Name  = rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "StatusBarFunc" ));
342cdf0e10cSrcweir                 aItem.QueryValue( a );
343cdf0e10cSrcweir                 aArgs[0].Value = a;
344cdf0e10cSrcweir 
345cdf0e10cSrcweir                 execute( rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( ".uno:StatusBarFunc" )), aArgs );
346cdf0e10cSrcweir //              GetBindings().GetDispatcher()->Execute( SID_PSZ_FUNCTION, SFX_CALLMODE_RECORD, &aItem, 0L );
347cdf0e10cSrcweir             }
348cdf0e10cSrcweir         }
349cdf0e10cSrcweir     }
350cdf0e10cSrcweir     else
351cdf0e10cSrcweir         SfxStatusBarControl::Command( rCEvt );
352cdf0e10cSrcweir }
353cdf0e10cSrcweir 
354cdf0e10cSrcweir // -----------------------------------------------------------------------
355cdf0e10cSrcweir 
356cdf0e10cSrcweir /*  [Beschreibung]
357cdf0e10cSrcweir 
358cdf0e10cSrcweir     Je nach enableden Anzeigentyp, wird der Wert angezeigt. Vorher wird
359cdf0e10cSrcweir     das Rectangle u"bermalt (gelo"scht).
360cdf0e10cSrcweir */
361cdf0e10cSrcweir 
362cdf0e10cSrcweir void SvxPosSizeStatusBarControl::Paint( const UserDrawEvent& rUsrEvt )
363cdf0e10cSrcweir {
364cdf0e10cSrcweir     OutputDevice* pDev = rUsrEvt.GetDevice();
365cdf0e10cSrcweir     DBG_ASSERT( pDev, "no OutputDevice on UserDrawEvent" );
366cdf0e10cSrcweir     const Rectangle& rRect = rUsrEvt.GetRect();
367cdf0e10cSrcweir     StatusBar& rBar = GetStatusBar();
368cdf0e10cSrcweir     Point aItemPos = rBar.GetItemTextPos( GetId() );
369cdf0e10cSrcweir     Color aOldLineColor = pDev->GetLineColor();
370cdf0e10cSrcweir     Color aOldFillColor = pDev->GetFillColor();
371cdf0e10cSrcweir     pDev->SetLineColor();
372cdf0e10cSrcweir     pDev->SetFillColor( pDev->GetBackground().GetColor() );
373cdf0e10cSrcweir 
374cdf0e10cSrcweir     if ( pImp->bPos || pImp->bSize )
375cdf0e10cSrcweir     {
376cdf0e10cSrcweir         // Position fuer Size-Anzeige berechnen
377cdf0e10cSrcweir         long nSizePosX =
378cdf0e10cSrcweir             rRect.Left() + rRect.GetWidth() / 2 + PAINT_OFFSET;
379cdf0e10cSrcweir         // Position zeichnen
380cdf0e10cSrcweir         Point aPnt = rRect.TopLeft();
381cdf0e10cSrcweir         aPnt.Y() = aItemPos.Y();
382cdf0e10cSrcweir         aPnt.X() += PAINT_OFFSET;
383cdf0e10cSrcweir         pDev->DrawImage( aPnt, pImp->aPosImage );
384cdf0e10cSrcweir         aPnt.X() += pImp->aPosImage.GetSizePixel().Width();
385cdf0e10cSrcweir         aPnt.X() += PAINT_OFFSET;
386cdf0e10cSrcweir         String aStr = GetMetricStr_Impl( pImp->aPos.X());
387cdf0e10cSrcweir         aStr.AppendAscii(" / ");
388cdf0e10cSrcweir         aStr += GetMetricStr_Impl( pImp->aPos.Y());
389cdf0e10cSrcweir         pDev->DrawRect(
390cdf0e10cSrcweir             Rectangle( aPnt, Point( nSizePosX, rRect.Bottom() ) ) );
391cdf0e10cSrcweir         pDev->DrawText( aPnt, aStr );
392cdf0e10cSrcweir 
393cdf0e10cSrcweir         // falls verf"ugbar, Gr"osse zeichnen
394cdf0e10cSrcweir         aPnt.X() = nSizePosX;
395cdf0e10cSrcweir 
396cdf0e10cSrcweir         if ( pImp->bSize )
397cdf0e10cSrcweir         {
398cdf0e10cSrcweir             pDev->DrawImage( aPnt, pImp->aSizeImage );
399cdf0e10cSrcweir             aPnt.X() += pImp->aSizeImage.GetSizePixel().Width();
400cdf0e10cSrcweir             Point aDrwPnt = aPnt;
401cdf0e10cSrcweir             aPnt.X() += PAINT_OFFSET;
402cdf0e10cSrcweir             aStr = GetMetricStr_Impl( pImp->aSize.Width() );
403cdf0e10cSrcweir             aStr.AppendAscii(" x ");
404cdf0e10cSrcweir             aStr += GetMetricStr_Impl( pImp->aSize.Height() );
405cdf0e10cSrcweir             pDev->DrawRect( Rectangle( aDrwPnt, rRect.BottomRight() ) );
406cdf0e10cSrcweir             pDev->DrawText( aPnt, aStr );
407cdf0e10cSrcweir         }
408cdf0e10cSrcweir         else
409cdf0e10cSrcweir             pDev->DrawRect( Rectangle( aPnt, rRect.BottomRight() ) );
410cdf0e10cSrcweir     }
411cdf0e10cSrcweir     else if ( pImp->bTable )
412cdf0e10cSrcweir     {
413cdf0e10cSrcweir         pDev->DrawRect( rRect );
414cdf0e10cSrcweir         pDev->DrawText( Point(
415cdf0e10cSrcweir             rRect.Left() + rRect.GetWidth() / 2 - pDev->GetTextWidth( pImp->aStr ) / 2,
416cdf0e10cSrcweir             aItemPos.Y() ), pImp->aStr );
417cdf0e10cSrcweir     }
418cdf0e10cSrcweir     else
419cdf0e10cSrcweir     {
420cdf0e10cSrcweir         // Empty display if neither size nor table position are available.
421cdf0e10cSrcweir         // Date/Time are no longer used (#65302#).
422cdf0e10cSrcweir         pDev->DrawRect( rRect );
423cdf0e10cSrcweir     }
424cdf0e10cSrcweir 
425cdf0e10cSrcweir     pDev->SetLineColor( aOldLineColor );
426cdf0e10cSrcweir     pDev->SetFillColor( aOldFillColor );
427cdf0e10cSrcweir }
428cdf0e10cSrcweir 
429cdf0e10cSrcweir // -----------------------------------------------------------------------
430cdf0e10cSrcweir 
431cdf0e10cSrcweir sal_uIntPtr SvxPosSizeStatusBarControl::GetDefItemWidth(const StatusBar& rStb)
432cdf0e10cSrcweir {
433cdf0e10cSrcweir     Image aTmpPosImage( ResId( RID_SVXBMP_POSITION, DIALOG_MGR() ) );
434cdf0e10cSrcweir     Image aTmpSizeImage( ResId( RID_SVXBMP_SIZE, DIALOG_MGR() ) );
435cdf0e10cSrcweir 
436cdf0e10cSrcweir     sal_uIntPtr nWidth=PAINT_OFFSET+aTmpPosImage.GetSizePixel().Width();
437cdf0e10cSrcweir     nWidth+=PAINT_OFFSET+aTmpSizeImage.GetSizePixel().Width();
438cdf0e10cSrcweir     nWidth+=2*(PAINT_OFFSET+rStb.GetTextWidth(String::CreateFromAscii("XXXX,XX / XXXX,XX")));
439cdf0e10cSrcweir 
440cdf0e10cSrcweir     return nWidth;
441cdf0e10cSrcweir }
442cdf0e10cSrcweir 
443cdf0e10cSrcweir 
444