/************************************************************** * * 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 _SVIMPLBOX_HXX #define _SVIMPLBOX_HXX #ifndef _SELENG_HXX #include #endif #ifndef _SCRBAR_HXX #include #endif #include // #102891# ---------------- #include // #97680# ----------------- #include #include "svtaccessiblefactory.hxx" class SvTreeListBox; class Point; class DropEvent; class SvLBoxTreeList; class SvImpLBox; class SvLBoxEntry; class SvLBoxItem; class SvLBoxTab; class TabBar; class ImpLBSelEng : public FunctionSet { SvImpLBox* pImp; SelectionEngine* pSelEng; SvTreeListBox* pView; public: ImpLBSelEng( SvImpLBox* pImp, SelectionEngine* pSelEng, SvTreeListBox* pView ); virtual ~ImpLBSelEng(); void BeginDrag(); void CreateAnchor(); void DestroyAnchor(); sal_Bool SetCursorAtPoint( const Point& rPoint, sal_Bool bDontSelectAtCursor=sal_False ); sal_Bool IsSelectionAtPoint( const Point& rPoint ); void DeselectAtPoint( const Point& rPoint ); void DeselectAll(); }; // 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; SvLBoxTreeList* pTree; SvLBoxEntry* pCursor; SvLBoxEntry* pStartEntry; SvLBoxEntry* pAnchor; SvLBoxEntry* pMostRightEntry; SvLBoxButton* pActiveButton; SvLBoxEntry* pActiveEntry; SvLBoxTab* pActiveTab; TabBar* pTabBar; ScrollBar aVerSBar; ScrollBar aHorSBar; ScrollBarBox aScrBarBox; ::svt::AccessibleFactoryAccess m_aFactoryAccess; static Image* s_pDefCollapsed; static Image* s_pDefExpanded; static Image* s_pDefCollapsedHC; static Image* s_pDefExpandedHC; 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 ]; // plus the high contrast versions Image m_aNodeAndEntryImages_HC[ 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 sal_uLong nCurUserEvent; //-1 == kein Userevent amn Laufen short nHorSBarHeight, nVerSBarWidth; sal_uInt16 nFlags; sal_uInt16 nCurTabPos; WinBits m_nStyle; ExtendedWinBits nExtendedWinBits; sal_Bool bSimpleTravel : 1; // ist sal_True bei SINGLE_SELECTION sal_Bool bUpdateMode : 1; sal_Bool bInVScrollHdl : 1; sal_Bool bAsyncBeginDrag : 1; sal_Bool bSubLstOpRet : 1; // open/close sublist with return/enter, defaulted with sal_False sal_Bool bSubLstOpLR : 1; // open/close sublist with cursor left/right, defaulted with sal_False sal_Bool bContextMenuHandling : 1; sal_Bool bIsCellFocusEnabled : 1; sal_Bool bAreChildrenTransient; Point aEditClickPos; Timer aEditTimer; // #102891# ------------------- IntlWrapper * pIntlWrapper; // #97680# -------------------- std::vector< short > aContextBmpWidthVector; DECL_LINK( EditTimerCall, Timer * ); 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(); sal_Bool IsLineVisible( long nY ) const; long GetEntryLine( SvLBoxEntry* pEntry ) const; void FillView(); void CursorDown(); void CursorUp(); void KeyLeftRight( long nDiff ); void PageDown( sal_uInt16 nDelta ); void PageUp( sal_uInt16 nDelta ); void SetCursor( SvLBoxEntry* pEntry, sal_Bool bForceNoSelect = sal_False ); void DrawNet(); // ScrollBar-Handler DECL_LINK( ScrollUpDownHdl, ScrollBar * ); DECL_LINK( ScrollLeftRightHdl, ScrollBar * ); DECL_LINK( EndScrollHdl, ScrollBar * ); void SetNodeBmpYOffset( const Image& ); void SetNodeBmpTabDistance(); // Selection-Engine SvLBoxEntry* MakePointVisible( const Point& rPoint, sal_Bool bNotifyScroll=sal_True ); void SetAnchorSelection( SvLBoxEntry* pOld, SvLBoxEntry* pNewCursor ); void BeginDrag(); sal_Bool ButtonDownCheckCtrl( const MouseEvent& rMEvt, SvLBoxEntry* pEntry, long nY ); sal_Bool MouseMoveCheckCtrl( const MouseEvent& rMEvt, SvLBoxEntry* pEntry ); sal_Bool ButtonUpCheckCtrl( const MouseEvent& rMEvt ); sal_Bool ButtonDownCheckExpand( const MouseEvent&, SvLBoxEntry*,long nY ); void PositionScrollBars( Size& rOSize, sal_uInt16 nMask ); sal_uInt16 AdjustScrollBars( Size& rSize ); void BeginScroll(); void EndScroll(); sal_Bool InScroll() const { return (sal_Bool)(nFlags & F_IN_SCROLLING)!=0;} Rectangle GetVisibleArea() const; sal_Bool EntryReallyHit(SvLBoxEntry* pEntry,const Point& rPos,long nLine); void InitScrollBarBox(); SvLBoxTab* NextTab( SvLBoxTab* ); sal_Bool SetMostRight( SvLBoxEntry* pEntry ); void FindMostRight( SvLBoxEntry* EntryToIgnore ); void FindMostRight( SvLBoxEntry* pParent, SvLBoxEntry* EntryToIgnore ); void FindMostRight_Impl( SvLBoxEntry* pParent,SvLBoxEntry* EntryToIgnore ); void NotifyTabsChanged(); inline sal_Bool IsExpandable() const // if element at cursor can be expanded in general { return pCursor->HasChilds() || pCursor->HasChildsOnDemand(); } inline sal_Bool IsNowExpandable() const // if element at cursor can be expanded at this moment { return IsExpandable() && !pView->IsExpanded( pCursor ); } static void implInitDefaultNodeImages(); // #102891# ------------------- void UpdateIntlWrapper(); // #97680# -------------------- short UpdateContextBmpWidthVector( SvLBoxEntry* pEntry, short nWidth ); void UpdateContextBmpWidthMax( SvLBoxEntry* pEntry ); void UpdateContextBmpWidthVectorFromMovedEntry( SvLBoxEntry* pEntry ); void CalcCellFocusRect( SvLBoxEntry* pEntry, Rectangle& rRect ); inline sal_Bool AreChildrenTransient() const { return bAreChildrenTransient; } inline void SetChildrenNotTransient() { bAreChildrenTransient = sal_False; } public: SvImpLBox( SvTreeListBox* pView, SvLBoxTreeList*, WinBits nWinStyle ); ~SvImpLBox(); void Clear(); void SetStyle( WinBits i_nWinStyle ); void SetExtendedWindowBits( ExtendedWinBits _nBits ); ExtendedWinBits GetExtendedWindowBits() const { return nExtendedWinBits; } void SetModel( SvLBoxTreeList* pModel ) { pTree = pModel;} void EntryInserted( SvLBoxEntry*); void RemovingEntry( SvLBoxEntry* pEntry ); void EntryRemoved(); void MovingEntry( SvLBoxEntry* pEntry ); void EntryMoved( SvLBoxEntry* pEntry ); void TreeInserted( SvLBoxEntry* pEntry ); void IndentChanged( short nIndentPixel ); void EntryExpanded( SvLBoxEntry* pEntry ); void EntryCollapsed( SvLBoxEntry* pEntry ); void CollapsingEntry( SvLBoxEntry* pEntry ); void EntrySelected( SvLBoxEntry*, sal_Bool bSelect ); void Paint( const Rectangle& rRect ); void RepaintSelectionItems(); void MouseButtonDown( const MouseEvent& ); void MouseButtonUp( const MouseEvent& ); void MouseMove( const MouseEvent&); sal_Bool KeyInput( const KeyEvent& ); void Resize(); void GetFocus(); void LoseFocus(); void UpdateAll( sal_Bool bInvalidateCompleteView= sal_True, sal_Bool bUpdateVerSBar = sal_True ); void SetEntryHeight( short nHeight ); void PaintEntry( SvLBoxEntry* pEntry ); void InvalidateEntry( SvLBoxEntry* ); void RecalcFocusRect(); inline void SelectEntry( SvLBoxEntry* pEntry, sal_Bool bSelect ); void SetDragDropMode( DragDropMode eDDMode ); void SetSelectionMode( SelectionMode eSelMode ); void SetAddMode( sal_Bool ) { aSelEng.AddAlways(sal_False); } sal_Bool IsAddMode() const { return aSelEng.IsAlwaysAdding(); } SvLBoxEntry* GetCurrentEntry() const { return pCursor; } sal_Bool IsEntryInView( SvLBoxEntry* ) const; SvLBoxEntry* GetEntry( const Point& rPos ) const; // gibt letzten Eintrag zurueck, falls Pos unter letztem Eintrag SvLBoxEntry* GetClickedEntry( const Point& ) const; SvLBoxEntry* GetCurEntry() const { return pCursor; } void SetCurEntry( SvLBoxEntry* ); Point GetEntryPosition( SvLBoxEntry* ) const; void MakeVisible( SvLBoxEntry* pEntry, sal_Bool bMoveToTop=sal_False ); void PaintDDCursor( SvLBoxEntry* ); // Images inline Image& implGetImageLocation( const ImageType _eType, BmpColorMode _eMode ); inline Image& implGetImageLocationWithFallback( const ImageType _eType, BmpColorMode _eMode ) const; inline void SetExpandedNodeBmp( const Image& _rImg, BmpColorMode _eMode = BMP_COLOR_NORMAL ); inline void SetCollapsedNodeBmp( const Image& _rImg, BmpColorMode _eMode = BMP_COLOR_NORMAL ); inline void SetDontKnowNodeBmp( const Image& rImg, BmpColorMode _eMode = BMP_COLOR_NORMAL ); inline const Image& GetExpandedNodeBmp( BmpColorMode _eMode = BMP_COLOR_NORMAL ) const; inline const Image& GetCollapsedNodeBmp( BmpColorMode _eMode = BMP_COLOR_NORMAL ) const; inline const Image& GetDontKnowNodeBmp( BmpColorMode _eMode = BMP_COLOR_NORMAL ) const; inline void SetDefaultEntryExpBmp( const Image& _rImg, BmpColorMode _eMode = BMP_COLOR_NORMAL ); inline void SetDefaultEntryColBmp( const Image& _rImg, BmpColorMode _eMode = BMP_COLOR_NORMAL ); inline const Image& GetDefaultEntryExpBmp( BmpColorMode _eMode = BMP_COLOR_NORMAL ); inline const Image& GetDefaultEntryColBmp( BmpColorMode _eMode = BMP_COLOR_NORMAL ); static const Image& GetDefaultExpandedNodeImage( BmpColorMode _eMode = BMP_COLOR_NORMAL ); static const Image& GetDefaultCollapsedNodeImage( BmpColorMode _eMode = BMP_COLOR_NORMAL ); const Size& GetOutputSize() const { return aOutputSize;} void KeyUp( sal_Bool bPageUp, sal_Bool bNotifyScroll = sal_True ); void KeyDown( sal_Bool bPageDown, sal_Bool bNotifyScroll = sal_True ); void Command( const CommandEvent& rCEvt ); void Invalidate(); void DestroyAnchor() { pAnchor=0; aSelEng.Reset(); } void SelAllDestrAnch( sal_Bool bSelect, sal_Bool bDestroyAnchor = sal_True, sal_Bool bSingleSelToo = sal_False ); void ShowCursor( sal_Bool bShow ); sal_Bool RequestHelp( const HelpEvent& rHEvt ); void EndSelection(); sal_Bool IsNodeButton( const Point& rPosPixel, SvLBoxEntry* pEntry ) const; void RepaintScrollBars(); void EnableAsyncDrag( sal_Bool b) { bAsyncBeginDrag = b; } void SetUpdateMode( sal_Bool ); void SetUpdateModeFast( sal_Bool ); sal_Bool GetUpdateMode() const { return bUpdateMode; } Rectangle GetClipRegionRect() const; sal_Bool HasHorScrollBar() const { return aHorSBar.IsVisible(); } void ShowFocusRect( const SvLBoxEntry* pEntry ); void SetTabBar( TabBar* pTabBar ); void CancelPendingEdit(); void CallEventListeners( sal_uLong nEvent, void* pData = NULL ); /** Enables, that one cell of a tablistbox entry can be focused */ inline sal_Bool IsCellFocusEnabled() const { return bIsCellFocusEnabled; } inline void EnableCellFocus() { bIsCellFocusEnabled = sal_True; } bool SetCurrentTabPos( sal_uInt16 _nNewPos ); inline sal_uInt16 GetCurrentTabPos() const { return nCurTabPos; } bool IsSelectable( const SvLBoxEntry* pEntry ); }; inline Image& SvImpLBox::implGetImageLocation( const ImageType _eType, BmpColorMode _eMode ) { DBG_ASSERT( ( BMP_COLOR_HIGHCONTRAST == _eMode ) || ( BMP_COLOR_NORMAL == _eMode ), "SvImpLBox::implGetImageLocation: invalid mode!" ); DBG_ASSERT( ( _eType >= 0 ) && ( _eType < IT_IMAGE_COUNT ), "SvImpLBox::implGetImageLocation: invalid image index (will crash)!" ); Image* _pSet = ( BMP_COLOR_HIGHCONTRAST == _eMode ) ? m_aNodeAndEntryImages_HC : m_aNodeAndEntryImages; return *( _pSet + (sal_Int32)_eType ); } inline Image& SvImpLBox::implGetImageLocationWithFallback( const ImageType _eType, BmpColorMode _eMode ) const { Image& rImage = const_cast< SvImpLBox* >( this )->implGetImageLocation( _eType, _eMode ); if ( !rImage ) // fallback to normal images in case the one for the special mode has not been set rImage = const_cast< SvImpLBox* >( this )->implGetImageLocation( _eType, BMP_COLOR_NORMAL ); return rImage; } inline void SvImpLBox::SetDontKnowNodeBmp( const Image& rImg, BmpColorMode _eMode ) { implGetImageLocation( itNodeDontKnow, _eMode ) = rImg; } inline void SvImpLBox::SetExpandedNodeBmp( const Image& rImg, BmpColorMode _eMode ) { implGetImageLocation( itNodeExpanded, _eMode ) = rImg; SetNodeBmpYOffset( rImg ); } inline void SvImpLBox::SetCollapsedNodeBmp( const Image& rImg, BmpColorMode _eMode ) { implGetImageLocation( itNodeCollapsed, _eMode ) = rImg; SetNodeBmpYOffset( rImg ); } inline const Image& SvImpLBox::GetDontKnowNodeBmp( BmpColorMode _eMode ) const { return implGetImageLocationWithFallback( itNodeDontKnow, _eMode ); } inline const Image& SvImpLBox::GetExpandedNodeBmp( BmpColorMode _eMode ) const { return implGetImageLocationWithFallback( itNodeExpanded, _eMode ); } inline const Image& SvImpLBox::GetCollapsedNodeBmp( BmpColorMode _eMode ) const { return implGetImageLocationWithFallback( itNodeCollapsed, _eMode ); } inline void SvImpLBox::SetDefaultEntryExpBmp( const Image& _rImg, BmpColorMode _eMode ) { implGetImageLocation( itEntryDefExpanded, _eMode ) = _rImg; } inline void SvImpLBox::SetDefaultEntryColBmp( const Image& _rImg, BmpColorMode _eMode ) { implGetImageLocation( itEntryDefCollapsed, _eMode ) = _rImg; } inline const Image& SvImpLBox::GetDefaultEntryExpBmp( BmpColorMode _eMode ) { return implGetImageLocationWithFallback( itEntryDefExpanded, _eMode ); } inline const Image& SvImpLBox::GetDefaultEntryColBmp( BmpColorMode _eMode ) { return implGetImageLocationWithFallback( itEntryDefCollapsed, _eMode ); } inline Point SvImpLBox::GetEntryPosition( SvLBoxEntry* pEntry ) const { return Point( 0, GetEntryLine( pEntry ) ); } inline void SvImpLBox::PaintEntry( SvLBoxEntry* pEntry ) { long nY = GetEntryLine( pEntry ); pView->PaintEntry( pEntry, nY ); } inline sal_Bool SvImpLBox::IsLineVisible( long nY ) const { sal_Bool bRet = sal_True; if ( nY < 0 || nY >= aOutputSize.Height() ) bRet = sal_False; return bRet; } inline void SvImpLBox::TreeInserted( SvLBoxEntry* pInsTree ) { EntryInserted( pInsTree ); } #endif // #ifndef _SVIMPLBOX_HXX