summaryrefslogtreecommitdiff
path: root/svx/source/stbctrls/pszctrl.cxx
diff options
context:
space:
mode:
Diffstat (limited to 'svx/source/stbctrls/pszctrl.cxx')
-rw-r--r--svx/source/stbctrls/pszctrl.cxx486
1 files changed, 486 insertions, 0 deletions
diff --git a/svx/source/stbctrls/pszctrl.cxx b/svx/source/stbctrls/pszctrl.cxx
new file mode 100644
index 0000000000..2ac33846da
--- /dev/null
+++ b/svx/source/stbctrls/pszctrl.cxx
@@ -0,0 +1,486 @@
+/*************************************************************************
+ *
+ * $RCSfile: pszctrl.cxx,v $
+ *
+ * $Revision: 1.1.1.1 $
+ *
+ * last change: $Author: hr $ $Date: 2000-09-18 17:01:23 $
+ *
+ * The Contents of this file are made available subject to the terms of
+ * either of the following licenses
+ *
+ * - GNU Lesser General Public License Version 2.1
+ * - Sun Industry Standards Source License Version 1.1
+ *
+ * Sun Microsystems Inc., October, 2000
+ *
+ * GNU Lesser General Public License Version 2.1
+ * =============================================
+ * Copyright 2000 by Sun Microsystems, Inc.
+ * 901 San Antonio Road, Palo Alto, CA 94303, USA
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License version 2.1, as published by the Free Software Foundation.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston,
+ * MA 02111-1307 USA
+ *
+ *
+ * Sun Industry Standards Source License Version 1.1
+ * =================================================
+ * The contents of this file are subject to the Sun Industry Standards
+ * Source License Version 1.1 (the "License"); You may not use this file
+ * except in compliance with the License. You may obtain a copy of the
+ * License at http://www.openoffice.org/license.html.
+ *
+ * Software provided under this License is provided on an "AS IS" basis,
+ * WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
+ * WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
+ * MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
+ * See the License for the specific provisions governing your rights and
+ * obligations concerning the Software.
+ *
+ * The Initial Developer of the Original Code is: Sun Microsystems, Inc.
+ *
+ * Copyright: 2000 by Sun Microsystems, Inc.
+ *
+ * All Rights Reserved.
+ *
+ * Contributor(s): _______________________________________
+ *
+ *
+ ************************************************************************/
+
+// include ---------------------------------------------------------------
+
+#include <limits.h>
+
+#ifndef _SHL_HXX //autogen
+#include <tools/shl.hxx>
+#endif
+#ifndef _STATUS_HXX //autogen
+#include <vcl/status.hxx>
+#endif
+#ifndef _MENU_HXX //autogen
+#include <vcl/menu.hxx>
+#endif
+#ifndef _SV_IMAGE_HXX
+#include <vcl/image.hxx>
+#endif
+#ifndef _SFXSTRITEM_HXX //autogen
+#include <svtools/stritem.hxx>
+#endif
+#ifndef _SFXPTITEM_HXX //autogen
+#include <svtools/ptitem.hxx>
+#endif
+#ifndef _SFXITEMPOOL_HXX
+#include <svtools/itempool.hxx>
+#endif
+#ifndef _SFXAPP_HXX
+#include <sfx2/app.hxx>
+#endif
+#ifndef _SFXMODULE_HXX
+#include <sfx2/module.hxx>
+#endif
+#ifndef _SFX_SAVEOPT_HXX //autogen
+#include <sfx2/saveopt.hxx>
+#endif
+#ifndef _SFXDISPATCH_HXX //autogen
+#include <sfx2/dispatch.hxx>
+#endif
+#ifndef _SFX_OBJSH_HXX //autogen
+#include <sfx2/objsh.hxx>
+#endif
+#pragma hdrstop
+
+#define _SVX_PSZCTRL_CXX
+
+#include "pszctrl.hxx"
+
+#define PAINT_OFFSET 5
+
+#define ITEMID_SIZE SID_ATTR_SIZE
+#include "sizeitem.hxx"
+#include "dialmgr.hxx"
+#include "dlgutil.hxx"
+#include "stbctrls.h"
+
+#include "dialogs.hrc"
+
+// -----------------------------------------------------------------------
+
+/* [Beschreibung]
+
+ Funktion, mit der ein metrischer Wert in textueller Darstellung
+ umgewandelt wird.
+
+ nVal ist hier der metrische Wert in der Einheit eUnit.
+
+ [Querverweise]
+
+ <SvxPosSizeStatusBarControl::Paint(const UserDrawEvent&)>
+*/
+
+String GetMetricStr_Impl( long nVal, SfxMapUnit eUnit )
+{
+ // Applikations-Metrik besorgen und setzen
+ FieldUnit eOutUnit = SFX_APP()->GetOptions().GetMetric();
+ GET_MODULE_FIELDUNIT( eOutUnit );
+ FieldUnit eInUnit = FUNIT_TWIP;
+
+ if ( SFX_MAPUNIT_100TH_MM == eUnit )
+ eInUnit = FUNIT_100TH_MM;
+
+ String sMetric;
+ char cSep = GetpApp()->GetAppInternational().GetNumDecimalSep();
+ long nConvVal = MetricField::ConvertValue( nVal * 100, 0L, 0,
+ eInUnit, eOutUnit );
+
+ if ( nConvVal < 0 && ( nConvVal / 100 == 0 ) )
+ sMetric += '-';
+ sMetric += String::CreateFromInt32( nConvVal / 100 );
+
+ if( FUNIT_NONE != eOutUnit )
+ {
+ sMetric += cSep;
+ long nFract = nConvVal % 100;
+
+ if ( nFract < 0 )
+ nFract *= -1;
+ if ( nFract < 10 )
+ sMetric += '0';
+ sMetric += String::CreateFromInt32( nFract );
+ }
+
+ return sMetric;
+}
+
+// -----------------------------------------------------------------------
+
+SFX_IMPL_STATUSBAR_CONTROL(SvxPosSizeStatusBarControl, SvxSizeItem);
+
+// class FunctionPopup_Impl ----------------------------------------------
+
+class FunctionPopup_Impl : public PopupMenu
+{
+public:
+ FunctionPopup_Impl( USHORT nCheck );
+
+ USHORT GetSelected() const { return nSelected; }
+
+private:
+ USHORT nSelected;
+
+ virtual void Select();
+};
+
+// -----------------------------------------------------------------------
+
+FunctionPopup_Impl::FunctionPopup_Impl( USHORT nCheck ) :
+ PopupMenu( ResId( RID_SVXMNU_PSZ_FUNC, DIALOG_MGR() ) ),
+ nSelected( 0 )
+{
+ if (nCheck)
+ CheckItem( nCheck );
+}
+
+// -----------------------------------------------------------------------
+
+void FunctionPopup_Impl::Select()
+{
+ nSelected = GetCurItemId();
+}
+
+// struct SvxPosSizeStatusBarControl_Impl --------------------------------
+
+struct SvxPosSizeStatusBarControl_Impl
+
+/* [Beschreibung]
+
+ Diese Implementations-Struktur der Klasse SvxPosSizeStatusBarControl
+ dient der Entkopplung von "Anderungen vom exportierten Interface sowie
+ der Verringerung von extern sichtbaren Symbolen.
+
+ Eine Instanz exisitiert pro SvxPosSizeStatusBarControl-Instanz
+ f"ur deren Laufzeit.
+*/
+
+{
+ Point aPos; // g"ultig, wenn eine Position angezeigt wird
+ Size aSize; // g"ultig, wenn eine Gr"o/se angezeigt wird
+ String aStr; // g"ultig, wenn ein Text angezeigt wird
+ BOOL bTime; // Zeit und Datum anzeigen? (nichts anzeigen (#65302#))
+ BOOL bSize; // Gr"o/se anzeigen?
+ BOOL bTable; // Tabellenindex anzeigen?
+ BOOL bHasMenu; // StarCalc Popup-Menue anzeigen?
+ USHORT nFunction; // selektierte StarCalc Funktion
+ Image aPosImage; // Image f"ur die Positionsanzeige
+ Image aSizeImage; // Image f"ur die Gr"o/senanzeige
+};
+
+// class SvxPosSizeStatusBarControl ------------------------------------------
+
+/* [Beschreibung]
+
+ Ctor():
+ Anlegen einer Impl-Klassen-Instanz, Default die Zeitanzeige enablen,
+ Images fu"r die Position und Gro"sse laden.
+*/
+
+SvxPosSizeStatusBarControl::SvxPosSizeStatusBarControl( USHORT nId,
+ StatusBar& rStb,
+ SfxBindings& rBind ) :
+ SfxStatusBarControl( nId, rStb, rBind ),
+
+ aPosForwarder( SID_ATTR_POSITION, *this ),
+ aTableForwarder( SID_TABLE_CELL, *this ),
+ aFuncForwarder( SID_PSZ_FUNCTION, *this ),
+ pImp( new SvxPosSizeStatusBarControl_Impl )
+
+{
+ pImp->bTime = TRUE;
+ pImp->bSize = FALSE;
+ pImp->bTable = FALSE;
+ pImp->bHasMenu = FALSE;
+ pImp->nFunction = 0;
+ pImp->aPosImage = Image( ResId( RID_SVXBMP_POSITION, DIALOG_MGR() ) );
+ pImp->aSizeImage = Image( ResId( RID_SVXBMP_SIZE, DIALOG_MGR() ) );
+}
+
+// -----------------------------------------------------------------------
+
+/* [Beschreibung]
+
+ Dtor():
+ Pointer auf die Impl-Klasse lo"schen, damit der Timer gestoppt wird.
+*/
+
+SvxPosSizeStatusBarControl::~SvxPosSizeStatusBarControl()
+{
+ delete pImp;
+}
+
+// -----------------------------------------------------------------------
+
+/* [Beschreibung]
+
+ SID_PSZ_FUNCTION aktiviert das Popup-Menue fuer Calc, ansonsten:
+
+ Statusbenachrichtigung;
+ Je nach Item-Typ wird eine bestimmte Anzeige enabled, die anderen disabled.
+
+ NULL/Void SfxPointItem SvxSizeItem SfxStringItem
+ ------------------------------------------------------------------------
+ Zeit TRUE FALSE FALSE FALSE
+ Position FALSE FALSE
+ Gro"sse FALSE TRUE FALSE
+ Text FALSE FALSE TRUE
+
+ Ein anderes Item bewirkt einen Assert, die Zeitanzeige wird enabled.
+*/
+
+void SvxPosSizeStatusBarControl::StateChanged( USHORT nSID, SfxItemState eState,
+ const SfxPoolItem* pState )
+{
+ // da Kombi-Controller, immer die aktuelle Id als HelpId setzen
+ // gecachten HelpText vorher l"oschen
+ GetStatusBar().SetHelpText( GetId(), String() );
+ GetStatusBar().SetHelpId( GetId(), nSID );
+
+ if ( nSID == SID_PSZ_FUNCTION )
+ {
+ if ( eState == SFX_ITEM_AVAILABLE )
+ {
+ pImp->bHasMenu = TRUE;
+ if ( pState && pState->ISA(SfxUInt16Item) )
+ pImp->nFunction = ((const SfxUInt16Item*)pState)->GetValue();
+ }
+ else
+ pImp->bHasMenu = FALSE;
+ }
+ else if ( SFX_ITEM_AVAILABLE != eState )
+ {
+ // Datum und Zeit anzeigen
+ pImp->bTime = TRUE;
+ pImp->bSize = FALSE;
+ pImp->bTable = FALSE;
+ }
+ else if ( pState->ISA( SfxPointItem ) )
+ {
+ // Position anzeigen
+ pImp->aPos = ( (SfxPointItem*)pState )->GetValue();
+ pImp->bTime = FALSE;
+ pImp->bTable = FALSE;
+ }
+ else if ( pState->ISA( SvxSizeItem ) )
+ {
+ // Groesse anzeigen
+ pImp->aSize = ( (SvxSizeItem*)pState )->GetSize();
+ pImp->bSize = TRUE;
+ pImp->bTime = FALSE;
+ pImp->bTable = FALSE;
+ }
+ else if ( pState->ISA( SfxStringItem ) )
+ {
+ // String anzeigen (Tabellen-Zelle oder anderes)
+ pImp->aStr = ( (SfxStringItem*)pState )->GetValue();
+ pImp->bTable = TRUE;
+ pImp->bTime = FALSE;
+ pImp->bSize = FALSE;
+ }
+ else
+ {
+ DBG_ERRORFILE( "invalid item type" );
+ // trotzdem Datum und Zeit anzeigen
+ pImp->bTime = TRUE;
+ pImp->bSize = FALSE;
+ pImp->bTable = FALSE;
+ }
+
+ if ( GetStatusBar().AreItemsVisible() )
+ GetStatusBar().SetItemData( GetId(), 0 );
+
+ // nur Strings auch als Text an der StatusBar setzen, damit Tip-Hilfe
+ // funktioniert, wenn der Text zu lang ist.
+ String aText;
+ if ( pImp->bTable )
+ aText = pImp->aStr;
+ GetStatusBar().SetItemText( GetId(), aText );
+}
+
+// -----------------------------------------------------------------------
+
+/* [Beschreibung]
+
+ Popup-Menue ausfuehren, wenn per Status enabled
+*/
+
+void SvxPosSizeStatusBarControl::Command( const CommandEvent& rCEvt )
+{
+ if ( rCEvt.GetCommand() == COMMAND_CONTEXTMENU && pImp->bHasMenu )
+ {
+ USHORT nSelect = pImp->nFunction;
+ if (!nSelect)
+ nSelect = PSZ_FUNC_NONE;
+ FunctionPopup_Impl aMenu( nSelect );
+ if ( aMenu.Execute( &GetStatusBar(),
+ GetStatusBar().OutputToScreenPixel( rCEvt.GetMousePosPixel() ) ) )
+ {
+ nSelect = aMenu.GetSelected();
+ if (nSelect)
+ {
+ if (nSelect == PSZ_FUNC_NONE)
+ nSelect = 0;
+
+ SfxUInt16Item aItem( SID_PSZ_FUNCTION, nSelect );
+ GetBindings().GetDispatcher()->Execute( SID_PSZ_FUNCTION, SFX_CALLMODE_RECORD, &aItem, 0L );
+ }
+ }
+ }
+ else
+ SfxStatusBarControl::Command( rCEvt );
+}
+
+// -----------------------------------------------------------------------
+
+/* [Beschreibung]
+
+ Je nach enableden Anzeigentyp, wird der Wert angezeigt. Vorher wird
+ das Rectangle u"bermalt (gelo"scht).
+*/
+
+void SvxPosSizeStatusBarControl::Paint( const UserDrawEvent& rUsrEvt )
+{
+ OutputDevice* pDev = rUsrEvt.GetDevice();
+ DBG_ASSERT( pDev, "no OutputDevice on UserDrawEvent" );
+ const Rectangle& rRect = rUsrEvt.GetRect();
+ StatusBar& rBar = GetStatusBar();
+ Point aItemPos = rBar.GetItemTextPos( GetId() );
+ Color aOldLineColor = pDev->GetLineColor();
+ Color aOldFillColor = pDev->GetFillColor();
+ pDev->SetLineColor();
+ pDev->SetFillColor( pDev->GetBackground().GetColor() );
+
+ if ( pImp->bTime )
+ {
+ // PB: Datum und Uhrzeit nicht mehr ausgeben (#65302#)
+ pDev->DrawRect( rRect );
+ }
+ else if ( !pImp->bTable )
+ {
+ // Position fuer Size-Anzeige berechnen
+ long nSizePosX =
+ rRect.Left() + rRect.GetWidth() / 2 + PAINT_OFFSET;
+ // Metric besorgen
+ SfxMapUnit eUnit = SFX_MAPUNIT_TWIP;
+ SfxObjectShell* pSh = SfxObjectShell::Current();
+ if ( pSh )
+ eUnit = pSh->GetPool().GetMetric( SID_ATTR_SIZE );
+
+ // Position zeichnen
+ Point aPnt = rRect.TopLeft();
+ aPnt.Y() = aItemPos.Y();
+ aPnt.X() += PAINT_OFFSET;
+ pDev->DrawImage( aPnt, pImp->aPosImage );
+ aPnt.X() += pImp->aPosImage.GetSizePixel().Width();
+ aPnt.X() += PAINT_OFFSET;
+ String aStr = GetMetricStr_Impl( pImp->aPos.X(), eUnit );
+ aStr.AppendAscii(" / ");
+ aStr += GetMetricStr_Impl( pImp->aPos.Y(), eUnit );
+ pDev->DrawRect(
+ Rectangle( aPnt, Point( nSizePosX, rRect.Bottom() ) ) );
+ pDev->DrawText( aPnt, aStr );
+
+ // falls verf"ugbar, Gr"osse zeichnen
+ aPnt.X() = nSizePosX;
+
+ if ( pImp->bSize )
+ {
+ pDev->DrawImage( aPnt, pImp->aSizeImage );
+ aPnt.X() += pImp->aSizeImage.GetSizePixel().Width();
+ Point aDrwPnt = aPnt;
+ aPnt.X() += PAINT_OFFSET;
+ aStr = GetMetricStr_Impl( pImp->aSize.Width(), eUnit );
+ aStr.AppendAscii(" x ");
+ aStr += GetMetricStr_Impl( pImp->aSize.Height(), eUnit );
+ pDev->DrawRect( Rectangle( aDrwPnt, rRect.BottomRight() ) );
+ pDev->DrawText( aPnt, aStr );
+ }
+ else
+ pDev->DrawRect( Rectangle( aPnt, rRect.BottomRight() ) );
+ }
+ else if ( pImp->bTable )
+ {
+ pDev->DrawRect( rRect );
+ pDev->DrawText( Point(
+ rRect.Left() + rRect.GetWidth() / 2 - pDev->GetTextWidth( pImp->aStr ) / 2,
+ aItemPos.Y() ), pImp->aStr );
+ }
+
+ pDev->SetLineColor( aOldLineColor );
+ pDev->SetFillColor( aOldFillColor );
+}
+
+// -----------------------------------------------------------------------
+
+ULONG SvxPosSizeStatusBarControl::GetDefItemWidth(const StatusBar& rStb)
+{
+ Image aTmpPosImage( ResId( RID_SVXBMP_POSITION, DIALOG_MGR() ) );
+ Image aTmpSizeImage( ResId( RID_SVXBMP_SIZE, DIALOG_MGR() ) );
+
+ ULONG nWidth=PAINT_OFFSET+aTmpPosImage.GetSizePixel().Width();
+ nWidth+=PAINT_OFFSET+aTmpSizeImage.GetSizePixel().Width();
+ nWidth+=2*(PAINT_OFFSET+rStb.GetTextWidth(String::CreateFromAscii("XXXX,XX / XXXX,XX")));
+
+ return nWidth;
+}
+
+