diff options
Diffstat (limited to 'svtools/inc/svtools/svtreebx.hxx')
-rw-r--r-- | svtools/inc/svtools/svtreebx.hxx | 420 |
1 files changed, 420 insertions, 0 deletions
diff --git a/svtools/inc/svtools/svtreebx.hxx b/svtools/inc/svtools/svtreebx.hxx new file mode 100644 index 000000000000..6edd32110317 --- /dev/null +++ b/svtools/inc/svtools/svtreebx.hxx @@ -0,0 +1,420 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/************************************************************************* + * + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * Copyright 2000, 2010 Oracle and/or its affiliates. + * + * OpenOffice.org - a multi-platform office productivity suite + * + * This file is part of OpenOffice.org. + * + * OpenOffice.org is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License version 3 + * only, as published by the Free Software Foundation. + * + * OpenOffice.org 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 version 3 for more details + * (a copy is included in the LICENSE file that accompanied this code). + * + * You should have received a copy of the GNU Lesser General Public License + * version 3 along with OpenOffice.org. If not, see + * <http://www.openoffice.org/license.html> + * for a copy of the LGPLv3 License. + * + ************************************************************************/ + +#ifndef _SVTREEBOX_HXX +#define _SVTREEBOX_HXX + +#include "svtools/svtdllapi.h" +#include <svtools/svlbox.hxx> +#include <svtools/svlbitm.hxx> + +// forward and defines --------------------------------------------------- + +class SvImpLBox; +class SvInplaceEdit; +class TabBar; + +#define SV_TAB_BORDER 8 + +#define SV_LISTBOX_ID_TREEBOX 1 // fuer SvLBox::IsA() +#define SV_ENTRYHEIGHTOFFS_PIXEL 2 + +#define TREEFLAG_CHKBTN 0x0001 +#define TREEFLAG_USESEL 0x0002 +#define TREEFLAG_MANINS 0x0004 +#define TREEFLAG_RECALCTABS 0x0008 + +typedef sal_Int64 ExtendedWinBits; + +// disable the behavior of automatically selecting a "CurEntry" upon painting the control +#define EWB_NO_AUTO_CURENTRY 0x00000001 + +// class SvTreeListBox --------------------------------------------------- + +class SVT_DLLPUBLIC SvTreeListBox : public SvLBox +{ + friend class SvImpLBox; + friend class ImpLBSelEng; + friend class TreeControlPeer; + + SvImpLBox* pImp; + Link aCheckButtonHdl; + Link aScrolledHdl; + Accelerator aInpEditAcc; + Image aPrevInsertedExpBmp; + Image aPrevInsertedColBmp; + Image aCurInsertedExpBmp; + Image aCurInsertedColBmp; + + short nContextBmpWidthMax; + sal_uInt16 nFirstSelTab, nLastSelTab; + short nEntryHeight; + short nEntryHeightOffs; + short nIndent; + short nFocusWidth; + sal_uInt16 aContextBmpMode; + +#ifdef _SVTREEBX_CXX + DECL_DLLPRIVATE_LINK( CheckButtonClick, SvLBoxButtonData * ); + + SVT_DLLPRIVATE short GetHeightOffset( const Image& rBmp, Size& rLogicSize); + SVT_DLLPRIVATE short GetHeightOffset( const Font& rFont, Size& rLogicSize); + + SVT_DLLPRIVATE void SetEntryHeight( SvLBoxEntry* pEntry ); + SVT_DLLPRIVATE void AdjustEntryHeight( const Image& rBmp ); + SVT_DLLPRIVATE void AdjustEntryHeight( const Font& rFont ); + + SVT_DLLPRIVATE void ImpEntryInserted( SvLBoxEntry* pEntry ); + SVT_DLLPRIVATE long PaintEntry1( SvLBoxEntry*, long nLine, + sal_uInt16 nTabFlagMask=0xffff, + sal_Bool bHasClipRegion=sal_False ); + + SVT_DLLPRIVATE void InitTreeView(); + SVT_DLLPRIVATE SvLBoxItem* GetItem_Impl( SvLBoxEntry*, long nX, SvLBoxTab** ppTab, + sal_uInt16 nEmptyWidth ); + SVT_DLLPRIVATE void ImplInitStyle(); + +#endif + +protected: + SvLBoxButtonData* pCheckButtonData; + sal_uInt16 nTreeFlags; + + SvLBoxEntry* pEdEntry; + SvLBoxItem* pEdItem; + + void EditItemText( SvLBoxEntry* pEntry, SvLBoxString* pItem, + const Selection& ); + void EditedText( const XubString& ); + void EditingRequest( SvLBoxEntry* pEntry, SvLBoxItem* pItem, + const Point& rMousePos ); + + SvPtrarr aTabs; + + // berechnet abhaengig von TreeList-Style & Bitmap-Groessen + // alle Tabulatoren neu; wird beim Einfuegen/Austauschen von + // Bitmaps, beim Wechsel des Models usw. automatisch gerufen + virtual void SetTabs(); + void SetTabs_Impl(); + void AddTab( long nPos,sal_uInt16 nFlags=SV_LBOXTAB_ADJUST_LEFT, + void* pUserData = 0 ); + sal_uInt16 TabCount() const { return aTabs.Count(); } + SvLBoxTab* GetFirstDynamicTab() const; + SvLBoxTab* GetFirstDynamicTab( sal_uInt16& rTabPos ) const; + SvLBoxTab* GetFirstTab( sal_uInt16 nFlagMask, sal_uInt16& rTabPos ); + SvLBoxTab* GetLastTab( sal_uInt16 nFlagMask, sal_uInt16& rTabPos ); + SvLBoxTab* GetTab( SvLBoxEntry*, SvLBoxItem* ) const; + void ClearTabList(); + + virtual void InitEntry(SvLBoxEntry*,const XubString&,const Image&,const Image&,SvLBoxButtonKind); + + virtual void NotifyBeginScroll(); + virtual void NotifyEndScroll(); + // nLines == 0 => horizontales Scrolling + virtual void NotifyScrolling( long nLines ); + virtual void NotifyScrolled(); + void SetScrolledHdl( const Link& rLink ) { aScrolledHdl = rLink; } + const Link& GetScrolledHdl() const { return aScrolledHdl; } + long GetXOffset() const { return GetMapMode().GetOrigin().X(); } + + // wird aufgerufen, _bevor_ Bereiche im Control invalidiert werden, + // kann zum Hiden von Elementen benutzt werden, die von aussen + // in das Control hineingezeichnet werden + virtual void NotifyInvalidating(); + + virtual sal_uLong GetAscInsertionPos( SvLBoxEntry*, SvLBoxEntry* pParent ); + virtual sal_uLong GetDescInsertionPos( SvLBoxEntry*, SvLBoxEntry* pParent ); + virtual void Command( const CommandEvent& rCEvt ); + + virtual void RequestHelp( const HelpEvent& rHEvt ); + virtual void CursorMoved( SvLBoxEntry* pNewCursor ); + virtual void PreparePaint( SvLBoxEntry* ); + virtual void DataChanged( const DataChangedEvent& rDCEvt ); + virtual void StateChanged( StateChangedType nStateChange ); + + void InitSettings(sal_Bool bFont,sal_Bool bForeground,sal_Bool bBackground); + sal_Bool IsCellFocusEnabled() const; + bool SetCurrentTabPos( sal_uInt16 _nNewPos ); + sal_uInt16 GetCurrentTabPos() const; + void CallImplEventListeners(sal_uLong nEvent, void* pData); + + void ImplEditEntry( SvLBoxEntry* pEntry ); + + sal_Bool AreChildrenTransient() const; + void SetChildrenNotTransient(); + +public: + SvTreeListBox( Window* pParent, WinBits nWinStyle=0 ); + SvTreeListBox( Window* pParent, const ResId& rResId ); + ~SvTreeListBox(); + + void SetExtendedWinBits( ExtendedWinBits _nBits ); + ExtendedWinBits GetExtendedWinBits() const; + + void DisconnectFromModel(); + + void EnableCheckButton( SvLBoxButtonData* ); + void SetCheckButtonData( SvLBoxButtonData* ); + void SetNodeBitmaps( const Image& rCollapsedNodeBmp, const Image& rExpandedNodeBmp ); + + /** returns the default image which clients should use for expanded nodes, to have a consistent user + interface experience in the whole product. + */ + static const Image& GetDefaultExpandedNodeImage( ); + + /** returns the default image which clients should use for expanded nodes, to have a consistent user + interface experience in the whole product. + */ + static const Image& GetDefaultCollapsedNodeImage( ); + + /** sets default bitmaps for collapsed and expanded nodes. + */ + inline void SetNodeDefaultImages( ) + { + SetNodeBitmaps( + GetDefaultCollapsedNodeImage( ), + GetDefaultExpandedNodeImage( ) + ); + } + + virtual SvLBoxEntry* InsertEntry( const XubString& rText, SvLBoxEntry* pParent = 0, + sal_Bool bChildsOnDemand = sal_False, + sal_uLong nPos=LIST_APPEND, void* pUserData = 0, + SvLBoxButtonKind eButtonKind = SvLBoxButtonKind_enabledCheckbox ); + + virtual SvLBoxEntry* InsertEntry( const XubString& rText, + const Image& rExpandedEntryBmp, + const Image& rCollapsedEntryBmp, + SvLBoxEntry* pParent = 0, + sal_Bool bChildsOnDemand = sal_False, + sal_uLong nPos = LIST_APPEND, void* pUserData = 0, + SvLBoxButtonKind eButtonKind = SvLBoxButtonKind_enabledCheckbox ); + + const Image& GetDefaultExpandedEntryBmp( ) const; + const Image& GetDefaultCollapsedEntryBmp( ) const; + + void SetDefaultExpandedEntryBmp( const Image& rBmp ); + void SetDefaultCollapsedEntryBmp( const Image& rBmp ); + + void SetCheckButtonState( SvLBoxEntry*, SvButtonState ); + SvButtonState GetCheckButtonState( SvLBoxEntry* ) const; + + void ShowExpandBitmapOnCursor( sal_Bool ); + sal_Bool IsExpandBitmapOnCursor() const { return (sal_Bool)(aContextBmpMode & SVLISTENTRYFLAG_FOCUSED)!=0; } + + void SetEntryText(SvLBoxEntry*, const XubString& ); + void SetExpandedEntryBmp( SvLBoxEntry* _pEntry, const Image& _rImage ); + void SetCollapsedEntryBmp( SvLBoxEntry* _pEntry, const Image& _rImage ); + + virtual String GetEntryText( SvLBoxEntry* pEntry ) const; + String SearchEntryText( SvLBoxEntry* pEntry ) const; + const Image& GetExpandedEntryBmp(SvLBoxEntry* _pEntry ) const; + const Image& GetCollapsedEntryBmp(SvLBoxEntry* _pEntry ) const; + + void SetCheckButtonHdl( const Link& rLink ) { aCheckButtonHdl=rLink; } + Link GetCheckButtonHdl() const { return aCheckButtonHdl; } + virtual void CheckButtonHdl(); + + virtual SvLBoxEntry* CloneEntry( SvLBoxEntry* pSource ); + + virtual sal_uInt16 IsA(); + + void SetSublistOpenWithReturn( sal_Bool bMode = sal_True ); // open/close sublist with return/enter + sal_Bool IsSublistOpenWithReturn() const; + void SetSublistOpenWithLeftRight( sal_Bool bMode = sal_True ); // open/close sublist with cursor left/right + sal_Bool IsSublistOpenWithLeftRight() const; + + void EnableInplaceEditing( sal_Bool bEnable ); + sal_Bool IsInplaceEditingEnabled() const { return SvLBox::IsInplaceEditingEnabled(); } + inline void ForbidEmptyText() { SvLBox::ForbidEmptyText(); } + // Editiert das erste StringItem des Entries, 0==Cursor + void EditEntry( SvLBoxEntry* pEntry = NULL ); + void CancelEditing(); + virtual sal_Bool EditingEntry( SvLBoxEntry* pEntry, Selection& ); + virtual sal_Bool EditedEntry( SvLBoxEntry* pEntry, const XubString& rNewText ); + sal_Bool IsEditingActive() const { return SvLBox::IsEditingActive(); } + void EndEditing( sal_Bool bCancel = sal_False ) { SvLBox::EndEditing( bCancel ); } + sal_Bool EditingCanceled() const { return SvLBox::EditingCanceled(); } + + virtual void RequestingChilds( SvLBoxEntry* pParent ); + + virtual void Paint( const Rectangle& rRect ); + virtual void MouseButtonDown( const MouseEvent& rMEvt ); + virtual void MouseButtonUp( const MouseEvent& rMEvt ); + virtual void MouseMove( const MouseEvent& rMEvt ); + virtual void KeyInput( const KeyEvent& rKEvt ); + virtual void Resize(); + virtual void GetFocus(); + virtual void LoseFocus(); + void SetUpdateMode( sal_Bool ); + // aktualisiert nicht die vertikale ScrollBar + void SetUpdateModeFast( sal_Bool ); + + using SvListView::SetModel; + void SetModel( SvLBoxTreeList* ); + virtual void ModelHasCleared(); + virtual void ModelHasInserted( SvListEntry* pEntry ); + virtual void ModelHasInsertedTree( SvListEntry* pEntry ); + virtual void ModelIsMoving(SvListEntry* pSource, + SvListEntry* pTargetParent, sal_uLong nChildPos ); + virtual void ModelHasMoved(SvListEntry* pSource ); + virtual void ModelIsRemoving( SvListEntry* pEntry ); + virtual void ModelHasRemoved( SvListEntry* pEntry ); + virtual void ModelHasEntryInvalidated( SvListEntry* pEntry ); + + void ShowTargetEmphasis( SvLBoxEntry*, sal_Bool bShow ); + using Window::GetDropTarget; + SvLBoxEntry* GetDropTarget( const Point& ); + void ScrollOutputArea( short nDeltaEntries ); + + short GetEntryHeight() const { return nEntryHeight; } + void SetEntryHeight( short nHeight, sal_Bool bAlways = sal_False ); + Size GetOutputSizePixel() const; + short GetIndent() const { return nIndent; } + void SetIndent( short nIndent ); + void SetSpaceBetweenEntries( short nSpace ); + short GetSpaceBetweenEntries() const {return nEntryHeightOffs;} + Point GetEntryPosition( SvLBoxEntry* ) const; + void ShowEntry( SvLBoxEntry* ); // !!!OBSOLETE, use MakeVisible + virtual void MakeVisible( SvLBoxEntry* ); + void MakeVisible( SvLBoxEntry*, sal_Bool bMoveToTop ); + + void SetCollapsedNodeBmp( const Image& ); + void SetExpandedNodeBmp( const Image& ); + Image GetCollapsedNodeBmp( ) const; + Image GetExpandedNodeBmp( ) const; + + void SetFont( const Font& rFont ); + + using Window::SetCursor; + void SetCursor( SvLBoxEntry* pEntry, sal_Bool bForceNoSelect = sal_False ); + + SvLBoxEntry* GetEntry( const Point& rPos, sal_Bool bHit = sal_False ) const; + SvLBoxEntry* GetEntry( SvLBoxEntry* pParent, sal_uLong nPos ) const { return SvLBox::GetEntry(pParent,nPos); } + SvLBoxEntry* GetEntry( sal_uLong nRootPos ) const { return SvLBox::GetEntry(nRootPos);} + + void PaintEntry( SvLBoxEntry* ); + long PaintEntry( SvLBoxEntry*, long nLine, + sal_uInt16 nTabFlagMask=0xffff ); + virtual Rectangle GetFocusRect( SvLBoxEntry*, long nLine ); + // Beruecksichtigt Einrueckung + virtual long GetTabPos( SvLBoxEntry*, SvLBoxTab* ); + void InvalidateEntry( SvLBoxEntry* ); + SvLBoxItem* GetItem( SvLBoxEntry*, long nX, SvLBoxTab** ppTab); + SvLBoxItem* GetItem( SvLBoxEntry*, long nX ); + SvLBoxItem* GetFirstDynamicItem( SvLBoxEntry* pEntry ); + + void SetDragDropMode( DragDropMode ); + void SetSelectionMode( SelectionMode ); + void SetAddMode( sal_Bool bAdd ); + sal_Bool IsAddMode() const; + + virtual sal_Bool Expand( SvLBoxEntry* pParent ); + virtual sal_Bool Collapse( SvLBoxEntry* pParent ); + virtual sal_Bool Select( SvLBoxEntry* pEntry, sal_Bool bSelect=sal_True ); + virtual sal_uLong SelectChilds( SvLBoxEntry* pParent, sal_Bool bSelect ); + virtual void SelectAll( sal_Bool bSelect, sal_Bool bPaint = sal_True ); + virtual void SetCurEntry( SvLBoxEntry* _pEntry ); + virtual SvLBoxEntry* + GetCurEntry() const; + + using Window::Invalidate; + virtual void Invalidate( sal_uInt16 nFlags = 0); + virtual void Invalidate( const Rectangle&, sal_uInt16 nFlags = 0 ); + + void SetHighlightRange(sal_uInt16 nFirstTab=0,sal_uInt16 nLastTab=0xffff); + void RemoveHighlightRange(); + + virtual Region GetDragRegion() const; + + // Childs des Parents werden Childs des naechstoberen Parents + void RemoveParentKeepChilds( SvLBoxEntry* pParent ); + + DECL_LINK( DefaultCompare, SvSortData* ); + virtual void ModelNotification( sal_uInt16 nActionId, SvListEntry* pEntry1, + SvListEntry* pEntry2, sal_uLong nPos ); + + long GetTextOffset() const; + void EndSelection(); + sal_Bool IsNodeButton( const Point& rPos ) const; + void RepaintScrollBars() const; + ScrollBar* GetVScroll(); + ScrollBar* GetHScroll(); + void EnableAsyncDrag( sal_Bool b ); + + SvLBoxEntry* GetFirstEntryInView() const; + SvLBoxEntry* GetNextEntryInView(SvLBoxEntry*) const; + + void ShowFocusRect( const SvLBoxEntry* pEntry ); + void SetTabBar( TabBar* pTabBar ); + void InitStartEntry(); + + // reset all what could lead to editingText in e.g. a contextmenu call + void CancelPendingEdit(); + + virtual PopupMenu* CreateContextMenu( void ); + virtual void ExcecuteContextMenuAction( sal_uInt16 nSelectedPopupEntry ); + + void EnableContextMenuHandling( void ); + void EnableContextMenuHandling( sal_Bool bEnable ); + sal_Bool IsContextMenuHandlingEnabled( void ) const; + + void EnableList( bool _bEnable ); + + // ACCESSIBILITY ========================================================== + + /** Creates and returns the accessible object of the Box. */ + virtual ::com::sun::star::uno::Reference< + ::com::sun::star::accessibility::XAccessible > CreateAccessible(); + + /** Fills the StateSet with all states (except DEFUNC, done by the accessible object). */ + virtual void FillAccessibleStateSet( ::utl::AccessibleStateSetHelper& rStateSet ) const; + + /** Fills the StateSet of one entry. */ + virtual void FillAccessibleEntryStateSet( SvLBoxEntry* pEntry, ::utl::AccessibleStateSetHelper& rStateSet ) const; + + /** Calculate and returns the bounding rectangle of an entry. + @param pEntry + The entry. + @return The bounding rectangle of an entry. */ + virtual Rectangle GetBoundingRect( SvLBoxEntry* pEntry ); + + /** Enables, that one cell of a tablistbox entry can be focused */ + void EnableCellFocus(); + +protected: + using SvListView::Expand; + using SvListView::Collapse; + using SvListView::Select; + using SvListView::SelectChilds; + using SvListView::SelectAll; +}; + +#endif + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ |