blob: 5304ab9aa7fe0b84c1a6203564543dc1283b340c [file] [log] [blame]
/**************************************************************
*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (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.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*
*************************************************************/
#ifndef _SFXDATWIN_HXX
#define _SFXDATWIN_HXX
#ifndef _BRWBOX_HXX
#include <svtools/brwbox.hxx>
#endif
#include <svtools/brwhead.hxx>
#include <vcl/timer.hxx>
#ifndef _IMAGE_HXX //autogen
#include <vcl/image.hxx>
#endif
#include <tools/list.hxx>
#include <svtools/transfer.hxx>
//===================================================================
#define MIN_COLUMNWIDTH 2
#define DRAG_CRITICAL 4
DECLARE_LIST( RectangleList, Rectangle* )
//===================================================================
class ButtonFrame
{
Rectangle aRect;
Rectangle aInnerRect;
String aText;
sal_Bool bPressed;
sal_Bool bCurs;
sal_Bool bAbbr;
sal_Bool m_bDrawDisabled;
public:
ButtonFrame( const Point& rPt, const Size& rSz,
const String &rText,
sal_Bool bPress = sal_False,
sal_Bool bCursor = sal_False,
sal_Bool bAbbreviate = sal_True,
sal_Bool _bDrawDisabled = sal_False)
:aRect( rPt, rSz )
,aInnerRect( Point( aRect.Left()+1, aRect.Top()+1 ),
Size( aRect.GetWidth()-2, aRect.GetHeight()-2 ) )
,aText(rText)
,bPressed(bPress)
,bCurs(bCursor)
,bAbbr(bAbbreviate)
,m_bDrawDisabled(_bDrawDisabled)
{
}
void Draw( OutputDevice& rDev );
};
//===================================================================
class BrowserColumn
{
sal_uInt16 _nId;
sal_uLong _nOriginalWidth;
sal_uLong _nWidth;
Image _aImage;
String _aTitle;
sal_Bool _bFrozen;
HeaderBarItemBits _nFlags;
public:
BrowserColumn( sal_uInt16 nItemId, const Image &rImage,
const String& rTitle, sal_uLong nWidthPixel, const Fraction& rCurrentZoom,
HeaderBarItemBits nFlags );
virtual ~BrowserColumn();
sal_uInt16 GetId() const { return _nId; }
sal_uLong Width() { return _nWidth; }
Image& GetImage() { return _aImage; }
String& Title() { return _aTitle; }
HeaderBarItemBits& Flags() { return _nFlags; }
sal_Bool IsFrozen() const { return _bFrozen; }
void Freeze( sal_Bool bFreeze = sal_True ) { _bFrozen = bFreeze; }
virtual void Draw( BrowseBox& rBox, OutputDevice& rDev,
const Point& rPos, sal_Bool bCurs );
void SetWidth(sal_uLong nNewWidthPixel, const Fraction& rCurrentZoom);
void ZoomChanged(const Fraction& rNewZoom);
};
//===================================================================
class BrowserDataWin
:public Control
,public DragSourceHelper
,public DropTargetHelper
{
public:
BrowserHeader* pHeaderBar; // only for BROWSER_HEADERBAR_NEW
Window* pEventWin; // Window of forwarded events
ScrollBarBox* pCornerWin; // Window in the corner btw the ScrollBars
sal_Bool* pDtorNotify;
AutoTimer aMouseTimer; // recalls MouseMove on dragging out
MouseEvent aRepeatEvt; // a MouseEvent to repeat
Point aLastMousePos; // verhindert pseudo-MouseMoves
String aRealRowCount; // zur Anzeige im VScrollBar
RectangleList aInvalidRegion; // invalidated Rectangles during !UpdateMode
FASTBOOL bInPaint; // sal_True while in Paint
FASTBOOL bInCommand; // sal_True while in Command
FASTBOOL bNoScrollBack; // nur vorwaerts scrollen
FASTBOOL bNoHScroll; // kein horizontaler Scrollbar
FASTBOOL bNoVScroll; // no vertical scrollbar
FASTBOOL bAutoHScroll; // autohide horizontaler Scrollbar
FASTBOOL bAutoVScroll; // autohide horizontaler Scrollbar
FASTBOOL bUpdateMode; // nicht SV-UpdateMode wegen Invalidate()
FASTBOOL bAutoSizeLastCol;// last column always fills up window
FASTBOOL bResizeOnPaint; // outstanding resize-event
FASTBOOL bUpdateOnUnlock; // Update() while locked
FASTBOOL bInUpdateScrollbars; // Rekursionsschutz
FASTBOOL bHadRecursion; // Rekursion war aufgetreten
FASTBOOL bOwnDataChangedHdl; // dont change colors in DataChanged
FASTBOOL bCallingDropCallback; // we're in a callback to AcceptDrop or ExecuteDrop curently
sal_uInt16 nUpdateLock; // lock count, dont call Control::Update()!
short nCursorHidden; // new conuter for DoHide/ShowCursor
long m_nDragRowDividerLimit;
long m_nDragRowDividerOffset;
public:
BrowserDataWin( BrowseBox* pParent );
~BrowserDataWin();
virtual void DataChanged( const DataChangedEvent& rDCEvt );
virtual void Paint( const Rectangle& rRect );
virtual void RequestHelp( const HelpEvent& rHEvt );
virtual void Command( const CommandEvent& rEvt );
virtual void MouseButtonDown( const MouseEvent& rEvt );
virtual void MouseMove( const MouseEvent& rEvt );
DECL_LINK( RepeatedMouseMove, void * );
virtual void MouseButtonUp( const MouseEvent& rEvt );
virtual void KeyInput( const KeyEvent& rEvt );
virtual void Tracking( const TrackingEvent& rTEvt );
// DropTargetHelper overridables
virtual sal_Int8 AcceptDrop( const AcceptDropEvent& rEvt );
virtual sal_Int8 ExecuteDrop( const ExecuteDropEvent& rEvt );
// DragSourceHelper overridables
virtual void StartDrag( sal_Int8 _nAction, const Point& _rPosPixel );
BrowseEvent CreateBrowseEvent( const Point& rPosPixel );
void Repaint();
BrowseBox* GetParent() const
{ return (BrowseBox*) Window::GetParent(); }
const String& GetRealRowCount() const { return aRealRowCount; }
void SetUpdateMode( sal_Bool bMode );
FASTBOOL GetUpdateMode() const { return bUpdateMode; }
void EnterUpdateLock() { ++nUpdateLock; }
void LeaveUpdateLock();
void Update();
void DoOutstandingInvalidations();
void Invalidate( sal_uInt16 nFlags = 0 );
void Invalidate( const Rectangle& rRect, sal_uInt16 nFlags = 0 );
void Invalidate( const Region& rRegion, sal_uInt16 nFlags = 0 )
{ Control::Invalidate( rRegion, nFlags ); }
protected:
void StartRowDividerDrag( const Point& _rStartPos );
sal_Bool ImplRowDividerHitTest( const BrowserMouseEvent& _rEvent );
};
//-------------------------------------------------------------------
inline void BrowserDataWin::Repaint()
{
if ( GetUpdateMode() )
Update();
Paint( Rectangle( Point(), GetOutputSizePixel() ) );
}
//===================================================================
class BrowserScrollBar: public ScrollBar
{
sal_uLong _nTip;
sal_uLong _nLastPos;
BrowserDataWin* _pDataWin;
public:
BrowserScrollBar( Window* pParent, WinBits nStyle,
BrowserDataWin *pDataWin )
: ScrollBar( pParent, nStyle ),
_nTip( 0 ),
_nLastPos( ULONG_MAX ),
_pDataWin( pDataWin )
{}
//ScrollBar( Window* pParent, const ResId& rResId );
virtual void Tracking( const TrackingEvent& rTEvt );
virtual void EndScroll();
};
//===================================================================
void InitSettings_Impl( Window *pWin,
sal_Bool bFont = sal_True, sal_Bool bForeground = sal_True, sal_Bool bBackground = sal_True );
//===================================================================
#ifdef DBG_MI
void DoLog_Impl( const BrowseBox *pThis, const char *pWhat, const char *pWho );
#define LOG(pThis,what,who) DoLog_Impl(pThis,what,who)
#else
#define LOG(pThis,what,who)
#endif
#endif