93f5d5a919
...so declare them as such. This avoids the recurring mistake of storing such IDs as sal_uInt32, truncating in 64 bit environments, causing RemoveUserEvent to potentially not remove the event, it thus firing "too late" and probably causing a crash. While at it, consolidate the trivially unnecessary overloads of both Application::PostUserEvent and Window::PostUserEvent. And in each of them, it looks like deleting the mpLink member was missing from the failure branch. Change-Id: Iab13afbb06e12ac15dec6a6b5b85a7e402a3c654
429 lines
16 KiB
C++
429 lines
16 KiB
C++
/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
|
|
/*
|
|
* This file is part of the LibreOffice project.
|
|
*
|
|
* This Source Code Form is subject to the terms of the Mozilla Public
|
|
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
|
* file, You can obtain one at http://mozilla.org/MPL/2.0/.
|
|
*
|
|
* This file incorporates work covered by the following license notice:
|
|
*
|
|
* 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 .
|
|
*/
|
|
|
|
#ifndef INCLUDED_SVTOOLS_SOURCE_INC_SVIMPBOX_HXX
|
|
#define INCLUDED_SVTOOLS_SOURCE_INC_SVIMPBOX_HXX
|
|
|
|
#include <vcl/seleng.hxx>
|
|
#include <vcl/scrbar.hxx>
|
|
#include <vcl/vclevent.hxx>
|
|
// #102891# ----------------
|
|
#include <unotools/intlwrapper.hxx>
|
|
// #97680# -----------------
|
|
#include <vector>
|
|
#include "svtaccessiblefactory.hxx"
|
|
|
|
class SvTreeListBox;
|
|
class Point;
|
|
class SvTreeList;
|
|
class SvImpLBox;
|
|
class SvTreeListEntry;
|
|
class SvLBoxTab;
|
|
namespace comphelper
|
|
{
|
|
namespace string
|
|
{
|
|
class NaturalStringSorter;
|
|
}
|
|
}
|
|
|
|
class ImpLBSelEng : public FunctionSet
|
|
{
|
|
SvImpLBox* pImp;
|
|
SelectionEngine* pSelEng;
|
|
SvTreeListBox* pView;
|
|
|
|
public:
|
|
ImpLBSelEng( SvImpLBox* pImp, SelectionEngine* pSelEng,
|
|
SvTreeListBox* pView );
|
|
virtual ~ImpLBSelEng();
|
|
void BeginDrag() SAL_OVERRIDE;
|
|
void CreateAnchor() SAL_OVERRIDE;
|
|
void DestroyAnchor() SAL_OVERRIDE;
|
|
bool SetCursorAtPoint( const Point& rPoint,
|
|
bool bDontSelectAtCursor=false ) SAL_OVERRIDE;
|
|
bool IsSelectionAtPoint( const Point& rPoint ) SAL_OVERRIDE;
|
|
void DeselectAtPoint( const Point& rPoint ) SAL_OVERRIDE;
|
|
void DeselectAll() SAL_OVERRIDE;
|
|
};
|
|
|
|
// Flags fuer nFlag
|
|
#define F_VER_SBARSIZE_WITH_HBAR 0x0001
|
|
#define F_HOR_SBARSIZE_WITH_VBAR 0x0002
|
|
#define F_IGNORE_NEXT_MOUSEMOVE 0x0004 // OS/2 only
|
|
#define F_IN_SCROLLING 0x0008
|
|
#define F_DESEL_ALL 0x0010
|
|
#define F_START_EDITTIMER 0x0020 // MAC only
|
|
#define F_IGNORE_SELECT 0x0040
|
|
#define F_IN_RESIZE 0x0080
|
|
#define F_REMOVED_ENTRY_INVISIBLE 0x0100
|
|
#define F_REMOVED_RECALC_MOST_RIGHT 0x0200
|
|
#define F_IGNORE_CHANGED_TABS 0x0400
|
|
#define F_PAINTED 0x0800
|
|
#define F_IN_PAINT 0x1000
|
|
#define F_ENDSCROLL_SET_VIS_SIZE 0x2000
|
|
#define F_FILLING 0x4000
|
|
|
|
|
|
class SvImpLBox
|
|
{
|
|
friend class ImpLBSelEng;
|
|
friend class SvTreeListBox;
|
|
private:
|
|
SvTreeListBox* pView;
|
|
SvTreeList* pTree;
|
|
SvTreeListEntry* pCursor;
|
|
SvTreeListEntry* pStartEntry;
|
|
SvTreeListEntry* pAnchor;
|
|
SvTreeListEntry* pMostRightEntry;
|
|
SvLBoxButton* pActiveButton;
|
|
SvTreeListEntry* pActiveEntry;
|
|
SvLBoxTab* pActiveTab;
|
|
|
|
ScrollBar aVerSBar;
|
|
ScrollBar aHorSBar;
|
|
ScrollBarBox aScrBarBox;
|
|
|
|
::svt::AccessibleFactoryAccess
|
|
m_aFactoryAccess;
|
|
|
|
static Image* s_pDefCollapsed;
|
|
static Image* s_pDefExpanded;
|
|
static oslInterlockedCount s_nImageRefCount; /// When 0 all static images will be destroyed
|
|
|
|
// Node Bitmaps
|
|
enum ImageType
|
|
{
|
|
itNodeExpanded = 0, // node is expanded ( usually a bitmap showing a minus )
|
|
itNodeCollapsed, // node is collapsed ( usually a bitmap showing a plus )
|
|
itNodeDontKnow, // don't know the node state
|
|
itEntryDefExpanded, // default for expanded entries
|
|
itEntryDefCollapsed, // default for collapsed entries
|
|
|
|
IT_IMAGE_COUNT
|
|
};
|
|
|
|
// all our images
|
|
Image m_aNodeAndEntryImages[ IT_IMAGE_COUNT ];
|
|
|
|
// wg. kompat. hier
|
|
Size aOutputSize;
|
|
SelectionEngine aSelEng;
|
|
ImpLBSelEng aFctSet;
|
|
Timer aAsyncBeginDragTimer;
|
|
Point aAsyncBeginDragPos;
|
|
|
|
long nYoffsNodeBmp;
|
|
long nNodeBmpTabDistance; // typisch kleiner 0
|
|
long nNodeBmpWidth;
|
|
long nNextVerVisSize;
|
|
long nMostRight;
|
|
sal_uLong nVisibleCount; // Anzahl Zeilen im Control
|
|
ImplSVEvent * nCurUserEvent;
|
|
short nHorSBarHeight, nVerSBarWidth;
|
|
sal_uInt16 nFlags;
|
|
sal_uInt16 nCurTabPos;
|
|
|
|
WinBits m_nStyle;
|
|
ExtendedWinBits nExtendedWinBits;
|
|
bool bSimpleTravel : 1; // ist true bei SINGLE_SELECTION
|
|
bool bUpdateMode : 1;
|
|
bool bInVScrollHdl : 1;
|
|
bool bAsyncBeginDrag : 1;
|
|
bool bSubLstOpRet : 1; // open/close sublist with return/enter, defaulted with false
|
|
bool bSubLstOpLR : 1; // open/close sublist with cursor left/right, defaulted with false
|
|
bool bContextMenuHandling : 1;
|
|
bool bIsCellFocusEnabled : 1;
|
|
|
|
bool bAreChildrenTransient;
|
|
|
|
Point aEditClickPos;
|
|
Timer aEditTimer;
|
|
|
|
// #102891# -------------------
|
|
comphelper::string::NaturalStringSorter *m_pStringSorter;
|
|
|
|
// #97680# --------------------
|
|
std::vector< short > aContextBmpWidthVector;
|
|
|
|
DECL_LINK(EditTimerCall, void *);
|
|
|
|
DECL_LINK( BeginDragHdl, void* );
|
|
DECL_LINK( MyUserEvent,void*);
|
|
void StopUserEvent();
|
|
|
|
void InvalidateEntriesFrom( long nY ) const;
|
|
void InvalidateEntry( long nY ) const;
|
|
void ShowVerSBar();
|
|
// setzt Thumb auf FirstEntryToDraw
|
|
void SyncVerThumb();
|
|
bool IsLineVisible( long nY ) const;
|
|
long GetEntryLine( SvTreeListEntry* pEntry ) const;
|
|
void FillView();
|
|
void CursorDown();
|
|
void CursorUp();
|
|
void KeyLeftRight( long nDiff );
|
|
void PageDown( sal_uInt16 nDelta );
|
|
void PageUp( sal_uInt16 nDelta );
|
|
|
|
void SetCursor( SvTreeListEntry* pEntry, bool bForceNoSelect = false );
|
|
|
|
void DrawNet();
|
|
|
|
// ScrollBar-Handler
|
|
DECL_LINK( ScrollUpDownHdl, ScrollBar * );
|
|
DECL_LINK( ScrollLeftRightHdl, ScrollBar * );
|
|
DECL_LINK( EndScrollHdl, void * );
|
|
|
|
void SetNodeBmpYOffset( const Image& );
|
|
void SetNodeBmpTabDistance();
|
|
|
|
// Selection-Engine
|
|
SvTreeListEntry* MakePointVisible( const Point& rPoint, bool bNotifyScroll=true );
|
|
|
|
void SetAnchorSelection( SvTreeListEntry* pOld,
|
|
SvTreeListEntry* pNewCursor );
|
|
void BeginDrag();
|
|
bool ButtonDownCheckCtrl( const MouseEvent& rMEvt, SvTreeListEntry* pEntry, long nY );
|
|
bool MouseMoveCheckCtrl( const MouseEvent& rMEvt, SvTreeListEntry* pEntry );
|
|
bool ButtonUpCheckCtrl( const MouseEvent& rMEvt );
|
|
bool ButtonDownCheckExpand( const MouseEvent&, SvTreeListEntry*,long nY );
|
|
|
|
void PositionScrollBars( Size& rOSize, sal_uInt16 nMask );
|
|
sal_uInt16 AdjustScrollBars( Size& rSize );
|
|
|
|
void BeginScroll();
|
|
void EndScroll();
|
|
bool InScroll() const { return (nFlags & F_IN_SCROLLING) != 0; }
|
|
Rectangle GetVisibleArea() const;
|
|
bool EntryReallyHit(SvTreeListEntry* pEntry, const Point& rPos, long nLine);
|
|
void InitScrollBarBox();
|
|
SvLBoxTab* NextTab( SvLBoxTab* );
|
|
|
|
bool SetMostRight( SvTreeListEntry* pEntry );
|
|
void FindMostRight( SvTreeListEntry* EntryToIgnore );
|
|
void FindMostRight( SvTreeListEntry* pParent, SvTreeListEntry* EntryToIgnore );
|
|
void FindMostRight_Impl( SvTreeListEntry* pParent,SvTreeListEntry* EntryToIgnore );
|
|
void NotifyTabsChanged();
|
|
|
|
// if element at cursor can be expanded in general
|
|
bool IsExpandable() const;
|
|
|
|
// if element at cursor can be expanded at this moment
|
|
bool IsNowExpandable() const;
|
|
|
|
static void implInitDefaultNodeImages();
|
|
|
|
void UpdateStringSorter();
|
|
|
|
// #97680# --------------------
|
|
short UpdateContextBmpWidthVector( SvTreeListEntry* pEntry, short nWidth );
|
|
void UpdateContextBmpWidthMax( SvTreeListEntry* pEntry );
|
|
void UpdateContextBmpWidthVectorFromMovedEntry( SvTreeListEntry* pEntry );
|
|
|
|
void CalcCellFocusRect( SvTreeListEntry* pEntry, Rectangle& rRect );
|
|
|
|
bool AreChildrenTransient() const { return bAreChildrenTransient; }
|
|
inline void SetChildrenNotTransient() { bAreChildrenTransient = false; }
|
|
|
|
public:
|
|
SvImpLBox( SvTreeListBox* pView, SvTreeList*, WinBits nWinStyle );
|
|
~SvImpLBox();
|
|
|
|
void Clear();
|
|
void SetStyle( WinBits i_nWinStyle );
|
|
void SetExtendedWindowBits( ExtendedWinBits _nBits );
|
|
ExtendedWinBits GetExtendedWindowBits() const { return nExtendedWinBits; }
|
|
void SetModel( SvTreeList* pModel ) { pTree = pModel;}
|
|
|
|
void EntryInserted( SvTreeListEntry*);
|
|
void RemovingEntry( SvTreeListEntry* pEntry );
|
|
void EntryRemoved();
|
|
void MovingEntry( SvTreeListEntry* pEntry );
|
|
void EntryMoved( SvTreeListEntry* pEntry );
|
|
void TreeInserted( SvTreeListEntry* pEntry );
|
|
|
|
void EntryExpanded( SvTreeListEntry* pEntry );
|
|
void EntryCollapsed( SvTreeListEntry* pEntry );
|
|
void CollapsingEntry( SvTreeListEntry* pEntry );
|
|
void EntrySelected( SvTreeListEntry* pEntry, bool bSelect );
|
|
|
|
void Paint( const Rectangle& rRect );
|
|
void MouseButtonDown( const MouseEvent& );
|
|
void MouseButtonUp( const MouseEvent& );
|
|
void MouseMove( const MouseEvent&);
|
|
bool KeyInput( const KeyEvent& );
|
|
void Resize();
|
|
void GetFocus();
|
|
void LoseFocus();
|
|
void UpdateAll( bool bInvalidateCompleteView= true, bool bUpdateVerSBar = true );
|
|
void SetEntryHeight( short nHeight );
|
|
void PaintEntry( SvTreeListEntry* pEntry );
|
|
void InvalidateEntry( SvTreeListEntry* );
|
|
void RecalcFocusRect();
|
|
|
|
void SelectEntry( SvTreeListEntry* pEntry, bool bSelect );
|
|
void SetDragDropMode( DragDropMode eDDMode );
|
|
void SetSelectionMode( SelectionMode eSelMode );
|
|
|
|
SvTreeListEntry* GetCurrentEntry() const { return pCursor; }
|
|
bool IsEntryInView( SvTreeListEntry* pEntry ) const;
|
|
SvTreeListEntry* GetEntry( const Point& rPos ) const;
|
|
// returns last entry, if Pos below last entry
|
|
SvTreeListEntry* GetClickedEntry( const Point& ) const;
|
|
SvTreeListEntry* GetCurEntry() const { return pCursor; }
|
|
void SetCurEntry( SvTreeListEntry* );
|
|
Point GetEntryPosition( SvTreeListEntry* ) const;
|
|
void MakeVisible( SvTreeListEntry* pEntry, bool bMoveToTop = false );
|
|
void ScrollToAbsPos( long nPos );
|
|
|
|
void PaintDDCursor( SvTreeListEntry* );
|
|
|
|
// Images
|
|
inline Image& implGetImageLocation( const ImageType _eType );
|
|
|
|
inline void SetExpandedNodeBmp( const Image& _rImg );
|
|
inline void SetCollapsedNodeBmp( const Image& _rImg );
|
|
|
|
inline const Image& GetExpandedNodeBmp( );
|
|
inline const Image& GetCollapsedNodeBmp( );
|
|
inline const Image& GetDontKnowNodeBmp( );
|
|
|
|
inline void SetDefaultEntryExpBmp( const Image& _rImg );
|
|
inline void SetDefaultEntryColBmp( const Image& _rImg );
|
|
inline const Image& GetDefaultEntryExpBmp( );
|
|
inline const Image& GetDefaultEntryColBmp( );
|
|
|
|
static const Image& GetDefaultExpandedNodeImage( );
|
|
static const Image& GetDefaultCollapsedNodeImage( );
|
|
|
|
const Size& GetOutputSize() const { return aOutputSize;}
|
|
void KeyUp( bool bPageUp, bool bNotifyScroll = true );
|
|
void KeyDown( bool bPageDown, bool bNotifyScroll = true );
|
|
void Command( const CommandEvent& rCEvt );
|
|
|
|
void Invalidate();
|
|
void DestroyAnchor() { pAnchor=0; aSelEng.Reset(); }
|
|
void SelAllDestrAnch( bool bSelect, bool bDestroyAnchor = true, bool bSingleSelToo = false );
|
|
void ShowCursor( bool bShow );
|
|
|
|
bool RequestHelp( const HelpEvent& rHEvt );
|
|
void EndSelection();
|
|
bool IsNodeButton( const Point& rPosPixel, SvTreeListEntry* pEntry ) const;
|
|
void RepaintScrollBars();
|
|
void EnableAsyncDrag( bool b ) { bAsyncBeginDrag = b; }
|
|
void SetUpdateMode( bool bMode );
|
|
bool GetUpdateMode() const { return bUpdateMode; }
|
|
Rectangle GetClipRegionRect() const;
|
|
bool HasHorScrollBar() const { return aHorSBar.IsVisible(); }
|
|
void ShowFocusRect( const SvTreeListEntry* pEntry );
|
|
void CallEventListeners( sal_uLong nEvent, void* pData = NULL );
|
|
|
|
/** Enables, that one cell of a tablistbox entry can be focused */
|
|
bool IsCellFocusEnabled() const { return bIsCellFocusEnabled; }
|
|
inline void EnableCellFocus() { bIsCellFocusEnabled = true; }
|
|
bool SetCurrentTabPos( sal_uInt16 _nNewPos );
|
|
inline sal_uInt16 GetCurrentTabPos() const { return nCurTabPos; }
|
|
|
|
bool IsSelectable( const SvTreeListEntry* pEntry );
|
|
};
|
|
|
|
inline Image& SvImpLBox::implGetImageLocation( const ImageType _eType )
|
|
{
|
|
DBG_ASSERT( ( _eType >= 0 ) && ( _eType < IT_IMAGE_COUNT ),
|
|
"SvImpLBox::implGetImageLocation: invalid image index (will crash)!" );
|
|
|
|
Image* _pSet = m_aNodeAndEntryImages;
|
|
return *( _pSet + (sal_Int32)_eType );
|
|
}
|
|
|
|
inline void SvImpLBox::SetExpandedNodeBmp( const Image& rImg )
|
|
{
|
|
implGetImageLocation( itNodeExpanded ) = rImg;
|
|
SetNodeBmpYOffset( rImg );
|
|
}
|
|
|
|
inline void SvImpLBox::SetCollapsedNodeBmp( const Image& rImg )
|
|
{
|
|
implGetImageLocation( itNodeCollapsed ) = rImg;
|
|
SetNodeBmpYOffset( rImg );
|
|
}
|
|
|
|
inline const Image& SvImpLBox::GetDontKnowNodeBmp( )
|
|
{
|
|
return implGetImageLocation( itNodeDontKnow );
|
|
}
|
|
|
|
inline const Image& SvImpLBox::GetExpandedNodeBmp( )
|
|
{
|
|
return implGetImageLocation( itNodeExpanded );
|
|
}
|
|
|
|
inline const Image& SvImpLBox::GetCollapsedNodeBmp( )
|
|
{
|
|
return implGetImageLocation( itNodeCollapsed );
|
|
}
|
|
|
|
inline void SvImpLBox::SetDefaultEntryExpBmp( const Image& _rImg )
|
|
{
|
|
implGetImageLocation( itEntryDefExpanded ) = _rImg;
|
|
}
|
|
|
|
inline void SvImpLBox::SetDefaultEntryColBmp( const Image& _rImg )
|
|
{
|
|
implGetImageLocation( itEntryDefCollapsed ) = _rImg;
|
|
}
|
|
|
|
inline const Image& SvImpLBox::GetDefaultEntryExpBmp( )
|
|
{
|
|
return implGetImageLocation( itEntryDefExpanded );
|
|
}
|
|
|
|
inline const Image& SvImpLBox::GetDefaultEntryColBmp( )
|
|
{
|
|
return implGetImageLocation( itEntryDefCollapsed );
|
|
}
|
|
|
|
inline Point SvImpLBox::GetEntryPosition( SvTreeListEntry* pEntry ) const
|
|
{
|
|
return Point( 0, GetEntryLine( pEntry ) );
|
|
}
|
|
|
|
inline void SvImpLBox::PaintEntry( SvTreeListEntry* pEntry )
|
|
{
|
|
long nY = GetEntryLine( pEntry );
|
|
pView->PaintEntry( pEntry, nY );
|
|
}
|
|
|
|
inline bool SvImpLBox::IsLineVisible( long nY ) const
|
|
{
|
|
bool bRet = true;
|
|
if ( nY < 0 || nY >= aOutputSize.Height() )
|
|
bRet = false;
|
|
return bRet;
|
|
}
|
|
|
|
inline void SvImpLBox::TreeInserted( SvTreeListEntry* pInsTree )
|
|
{
|
|
EntryInserted( pInsTree );
|
|
}
|
|
|
|
#endif // INCLUDED_SVTOOLS_SOURCE_INC_SVIMPBOX_HXX
|
|
|
|
/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
|