/*************************************************************************
 *
 *  $RCSfile: status.hxx,v $
 *
 *  $Revision: 1.1.1.1 $
 *
 *  last change: $Author: hr $ $Date: 2000/09/19 10:23:07 $
 *
 *  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): _______________________________________
 *
 *
 ************************************************************************/

#ifndef _SV_STATUS_HXX
#define _SV_STATUS_HXX

#ifndef _SV_SV_H
#include <vcl/sv.h>
#endif
#ifndef _SV_VIRDEV_HXX
#include <vcl/virdev.hxx>
#endif
#ifndef _SV_WINDOW_HXX
#include <vcl/window.hxx>
#endif

class ImplStatusItemList;

// --------------------
// - Progress-Ausgabe -
// --------------------

void DrawProgress( Window* pWindow, const Point& rPos,
				   long nOffset, long nPrgsWidth, long nPrgsHeight,
				   USHORT nPercent1, USHORT nPercent2, USHORT nPercentCount );

// ---------------------
// - StatusBarItemBits -
// ---------------------

typedef USHORT StatusBarItemBits;

// ----------------------------
// - Bits fuer StatusBarItems -
// ----------------------------

#define SIB_LEFT					((StatusBarItemBits)0x0001)
#define SIB_CENTER					((StatusBarItemBits)0x0002)
#define SIB_RIGHT					((StatusBarItemBits)0x0004)
#define SIB_IN						((StatusBarItemBits)0x0008)
#define SIB_OUT 					((StatusBarItemBits)0x0010)
#define SIB_FLAT					((StatusBarItemBits)0x0020)
#define SIB_AUTOSIZE				((StatusBarItemBits)0x0040)
#define SIB_USERDRAW				((StatusBarItemBits)0x0080)

// -------------------
// - StatusBar-Types -
// -------------------

#define STATUSBAR_APPEND			((USHORT)0xFFFF)
#define STATUSBAR_ITEM_NOTFOUND 	((USHORT)0xFFFF)
#define STATUSBAR_OFFSET			((long)5)

// -------------
// - StatusBar -
// -------------

class StatusBar : public Window
{
private:
	ImplStatusItemList* mpItemList;
	VirtualDevice*		mpVirDev;
	XubString			maPrgsTxt;
	Point				maPrgsTxtPos;
	Rectangle			maPrgsFrameRect;
	long				mnPrgsSize;
	long				mnItemsWidth;
	long				mnDX;
	long				mnDY;
	long				mnCalcHeight;
	long				mnTextY;
	long				mnItemY;
	long				mnDummyLong;
	USHORT				mnCurItemId;
	USHORT				mnPercent;
	USHORT				mnPercentCount;
	USHORT				mnDummy1;
	BOOL				mbVisibleItems;
	BOOL				mbFormat;
	BOOL				mbProgressMode;
	BOOL				mbInUserDraw;
	BOOL				mbBottomBorder;
	BOOL				mbDummy1;
	BOOL				mbDummy2;
	BOOL				mbDummy3;
	Link				maClickHdl;
	Link				maDoubleClickHdl;

#ifdef _SV_STATUS_CXX
	void				ImplInit( Window* pParent, WinBits nStyle );
	void				ImplInitSettings( BOOL bFont, BOOL bForeground, BOOL bBackground );
	void				ImplFormat();
	BOOL				ImplIsItemUpdate();
	void				ImplDrawText( BOOL bOffScreen, long nOldTextWidth );
	void				ImplDrawItem( BOOL bOffScreen, USHORT nPos, BOOL bDrawText, BOOL bDrawFrame );
	void				ImplDrawProgress( BOOL bPaint,
										  USHORT nOldPerc, USHORT nNewPerc );
	void				ImplCalcProgressRect();
	Rectangle			ImplGetItemRectPos( USHORT nPos ) const;
#endif

public:
						StatusBar( Window* pParent,
								   WinBits nWinStyle = WB_BORDER | WB_RIGHT );
						StatusBar( Window* pParent, const ResId& rResId );
						~StatusBar();

	virtual void		MouseButtonDown( const MouseEvent& rMEvt );
	virtual void		Paint( const Rectangle& rRect );
	virtual void		Move();
	virtual void		Resize();
	virtual void		RequestHelp( const HelpEvent& rHEvt );
	virtual void		StateChanged( StateChangedType nType );
	virtual void		DataChanged( const DataChangedEvent& rDCEvt );

	virtual void		Click();
	virtual void		DoubleClick();
	virtual void		UserDraw( const UserDrawEvent& rUDEvt );

	void				InsertItem( USHORT nItemId, ULONG nWidth,
									StatusBarItemBits nBits = SIB_CENTER | SIB_IN,
									long nOffset = STATUSBAR_OFFSET,
									USHORT nPos = STATUSBAR_APPEND );
	void				RemoveItem( USHORT nItemId );

	void				ShowItem( USHORT nItemId );
	void				HideItem( USHORT nItemId );
	BOOL				IsItemVisible( USHORT nItemId ) const;

	void				ShowItems();
	void				HideItems();
	BOOL				AreItemsVisible() const { return mbVisibleItems; }

	void				CopyItems( const StatusBar& rStatusBar );
	void				Clear();

	USHORT				GetItemCount() const;
	USHORT				GetItemId( USHORT nPos ) const;
	USHORT				GetItemId( const Point& rPos ) const;
	USHORT				GetItemPos( USHORT nItemId ) const;
	Rectangle			GetItemRect( USHORT nItemId ) const;
	Point				GetItemTextPos( USHORT nItemId ) const;
	USHORT				GetCurItemId() const { return mnCurItemId; }

	ULONG				GetItemWidth( USHORT nItemId ) const;
	StatusBarItemBits	GetItemBits( USHORT nItemId ) const;
	long				GetItemOffset( USHORT nItemId ) const;

	void				SetItemText( USHORT nItemId, const XubString& rText );
	const XubString& 	GetItemText( USHORT nItemId ) const;

	void				SetItemData( USHORT nItemId, void* pNewData );
	void*				GetItemData( USHORT nItemId ) const;

	void				SetHelpText( USHORT nItemId, const XubString& rText );
	const XubString& 	GetHelpText( USHORT nItemId ) const;

	void				SetHelpId( USHORT nItemId, ULONG nHelpId );
	ULONG				GetHelpId( USHORT nItemId ) const;

	void				SetBottomBorder( BOOL bBottomBorder = TRUE );
	BOOL				IsBottomBorder() const { return mbBottomBorder; }

	void				StartProgressMode( const XubString& rText );
	void				SetProgressValue( USHORT nPercent );
	void				EndProgressMode();
	BOOL				IsProgressMode() const { return mbProgressMode; }

	void				SetText( const XubString& rText );

	void				SetHelpText( const XubString& rText )
							{ Window::SetHelpText( rText ); }
	const XubString& 	GetHelpText() const
							{ return Window::GetHelpText(); }

	void				SetHelpId( ULONG nId )
							{ Window::SetHelpId( nId ); }
	ULONG				GetHelpId() const
							{ return Window::GetHelpId(); }

	Size				CalcWindowSizePixel() const;

	void				SetClickHdl( const Link& rLink ) { maClickHdl = rLink; }
	const Link& 		GetClickHdl() const { return maClickHdl; }
	void				SetDoubleClickHdl( const Link& rLink ) { maDoubleClickHdl = rLink; }
	const Link& 		GetDoubleClickHdl() const { return maDoubleClickHdl; }
};

#endif	// _SV_STATUS_HXX
