blob: 48043d1a1d346191a5473d3ce531120b3b269b1e [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 _SVLBOX_HXX
#define _SVLBOX_HXX
#include "svtools/svtdllapi.h"
#ifndef INCLUDED_DEQUE
#include <deque>
#define INCLUDED_DEQUE
#endif
#ifndef _CTRL_HXX
#include <vcl/ctrl.hxx>
#endif
#include <vcl/seleng.hxx>
#ifndef _EDIT_HXX
#include <vcl/edit.hxx>
#endif
#include <vcl/timer.hxx>
#ifndef _ACCEL_HXX
#include <vcl/accel.hxx>
#endif
#include <vcl/mnemonicengine.hxx>
#include <vcl/quickselectionengine.hxx>
#include <tools/gen.hxx>
#include <svtools/treelist.hxx>
#include <svl/svarray.hxx>
#include <svtools/transfer.hxx>
class Application;
class SvLBox;
class SvLBoxEntry;
class SvViewDataItem;
class SvViewDataEntry;
class SvInplaceEdit;
class SvInplaceEdit2;
class SvLBoxString;
class SvLBoxButton;
class SvLBoxContextBmp;
class SvLBoxBmp;
struct SvLBoxDDInfo;
namespace utl {
class AccessibleStateSetHelper;
}
// *********************************************************************
// *************************** Tabulatoren *****************************
// *********************************************************************
#define SV_LBOXTAB_DYNAMIC 0x0001 // Ausgabespalte des Items verschiebt
// sich entsprechend Child-Tiefe
#define SV_LBOXTAB_ADJUST_RIGHT 0x0002 // rechter Rand des Items am Tabulator
#define SV_LBOXTAB_ADJUST_LEFT 0x0004 // linker Rand ...
#define SV_LBOXTAB_ADJUST_CENTER 0x0008 // Item am Tabulator zentrieren
#define SV_LBOXTAB_ADJUST_NUMERIC 0x0010 // Dezimalpunkt am Tabulator (Strings)
// wird nicht mehr unterstuetzt! Fokus richtet sich jetzt nach Selektion!
#define SV_LBOXTAB_SHOW_FOCUS 0x0020 // Fokus visualisieren
#define SV_LBOXTAB_SHOW_SELECTION 0x0040 // Selektionszustand visualisieren
// Item muss umschliessendes Polygon
// zurueckgeben koennen (D&D-Cursor)
#define SV_LBOXTAB_EDITABLE 0x0100 // Item an Tabulator editierbar
#define SV_LBOXTAB_PUSHABLE 0x0200 // Item verhaelt sich wie ein Button
#define SV_LBOXTAB_INV_ALWAYS 0x0400 // Hintergrund immer loeschen
#define SV_LBOXTAB_FORCE 0x0800 // Default-Berechnung des ersten Tabulators
// (auf die sich Abo-Tabpage, Extras/Optionen/Anpassen,
// etc. verlassen) ausschalten. Die Position des ersten
// Tabs entspricht jetzt exakt den eingestellten Flags &
// Spaltenbreiten.
class SvLBoxTab
{
long nPos;
void* pUserData;
public:
SvLBoxTab();
SvLBoxTab( long nPos, sal_uInt16 nFlags=SV_LBOXTAB_ADJUST_LEFT );
SvLBoxTab( const SvLBoxTab& );
~SvLBoxTab();
sal_uInt16 nFlags;
void SetUserData( void* pPtr ) { pUserData = pPtr; }
void* GetUserData() const { return pUserData; }
sal_Bool IsDynamic() const { return (sal_Bool)((nFlags & SV_LBOXTAB_DYNAMIC)!=0); }
void SetPos( long nNewPos) { nPos = nNewPos; }
long GetPos() const { return nPos; }
long CalcOffset( long nItemLength, long nTabWidth );
// long CalcOffset( const String&, const OutputDevice& );
sal_Bool IsEditable() const { return (sal_Bool)((nFlags & SV_LBOXTAB_EDITABLE)!=0); }
sal_Bool IsPushable() const { return (sal_Bool)((nFlags & SV_LBOXTAB_PUSHABLE)!=0); }
};
// *********************************************************************
// *********************** View-abhaengige Daten ***********************
// *********************************************************************
class SvViewDataItem
{
public:
Size aSize;
SvViewDataItem();
~SvViewDataItem();
};
// View-abhaengige Daten fuer einen Entry werden in virtueller Fkt.
// SvLBox::CreateViewData erzeugt. Die ViewDaten-Erzeugung von
// Items kann nicht veraendert werden (wg. Array)
class SvViewDataEntry : public SvViewData
{
public:
SvViewDataItem* pItemData; // ein Array von SvViewDataItems
sal_uInt16 nItmCnt; // Anzahl Items fuer delete-operator
SvViewDataEntry();
virtual ~SvViewDataEntry();
};
// *********************************************************************
// ****************************** Items ********************************
// *********************************************************************
class SVT_DLLPUBLIC SvLBoxItem
{
public:
SvLBoxItem( SvLBoxEntry*, sal_uInt16 nFlags );
SvLBoxItem();
virtual ~SvLBoxItem();
virtual sal_uInt16 IsA() = 0;
const Size& GetSize( SvLBox* pView, SvLBoxEntry* pEntry );
const Size& GetSize( SvLBoxEntry*, SvViewDataEntry* );
const Size& GetSize( SvViewDataEntry* pData, sal_uInt16 nItemPos )
{
SvViewDataItem* pIData=pData->pItemData+nItemPos;
return pIData->aSize;
}
virtual void Paint( const Point& rPos, SvLBox& rOutDev,
sal_uInt16 nViewDataEntryFlags,
SvLBoxEntry* pEntry ) = 0;
virtual void InitViewData( SvLBox* pView, SvLBoxEntry* pEntry,
// wenn != 0 muss dieser Pointer benutzt werden!
// wenn == 0 muss er ueber die View geholt werden
SvViewDataItem* pViewData = 0) = 0;
virtual SvLBoxItem* Create() const = 0;
// view-abhaengige Daten werden nicht geklont
virtual void Clone( SvLBoxItem* pSource ) = 0;
};
// Flags, die am Model haengen
#define SV_ENTRYFLAG_CHILDS_ON_DEMAND 0x0001
#define SV_ENTRYFLAG_DISABLE_DROP 0x0002
#define SV_ENTRYFLAG_IN_USE 0x0004
// wird gesetzt, wenn RequestingChilds keine Childs gestzt hat
#define SV_ENTRYFLAG_NO_NODEBMP 0x0008
// Eintrag hatte oder hat Kinder
#define SV_ENTRYFLAG_HAD_CHILDREN 0x0010
#define SV_ENTRYFLAG_USER_FLAGS 0xF000
#define SV_ENTRYFLAG_SEMITRANSPARENT 0x8000 // draw semi-transparent entry bitmaps
class SVT_DLLPUBLIC SvLBoxEntry : public SvListEntry
{
friend class SvLBox;
SvPtrarr aItems;
sal_Bool bIsMarked;
void* pUserData;
sal_uInt16 nEntryFlags;
//#if 0 // _SOLAR__PRIVATE
SVT_DLLPRIVATE void DeleteItems_Impl();
//#endif
public:
SvLBoxEntry();
virtual ~SvLBoxEntry();
sal_uInt16 ItemCount() const { return (sal_uInt16)aItems.Count(); }
// DARF NUR GERUFEN WERDEN, WENN DER EINTRAG NOCH NICHT IM MODEL
// EINGEFUEGT IST, DA SONST FUER DAS ITEM KEINE VIEW-ABHAENGIGEN
// DATEN ALLOZIERT WERDEN!
void AddItem( SvLBoxItem* pItem );
void ReplaceItem( SvLBoxItem* pNewItem, sal_uInt16 nPos );
SvLBoxItem* GetItem( sal_uInt16 nPos ) const { return (SvLBoxItem*)aItems.GetObject(nPos ); }
SvLBoxItem* GetFirstItem( sal_uInt16 nId );
sal_uInt16 GetPos( SvLBoxItem* pItem ) const { return aItems.GetPos( pItem ); }
void* GetUserData() const { return pUserData; }
void SetUserData( void* pPtr ) { pUserData = pPtr; }
virtual void Clone( SvListEntry* pSource );
void EnableChildsOnDemand( sal_Bool bEnable=sal_True );
sal_Bool HasChildsOnDemand() const { return (sal_Bool)((nEntryFlags & SV_ENTRYFLAG_CHILDS_ON_DEMAND)!=0); }
sal_Bool HasInUseEmphasis() const { return (sal_Bool)((nEntryFlags & SV_ENTRYFLAG_IN_USE)!=0); }
sal_uInt16 GetFlags() const { return nEntryFlags; }
void SetFlags( sal_uInt16 nFlags ) { nEntryFlags = nFlags; }
sal_Bool GetIsMarked() const { return bIsMarked ; }
void SetMarked( sal_Bool IsMarked ) { bIsMarked =IsMarked ; }
};
// *********************************************************************
// ****************************** SvLBox *******************************
// *********************************************************************
#define WB_FORCE_SELECTION ((WinBits)0x8000)
#define DragDropMode sal_uInt16
#define SV_DRAGDROP_NONE (DragDropMode)0x0000
#define SV_DRAGDROP_CTRL_MOVE (DragDropMode)0x0001
#define SV_DRAGDROP_CTRL_COPY (DragDropMode)0x0002
#define SV_DRAGDROP_APP_MOVE (DragDropMode)0x0004
#define SV_DRAGDROP_APP_COPY (DragDropMode)0x0008
#define SV_DRAGDROP_APP_DROP (DragDropMode)0x0010
// Entries duerfen ueber den obersten Eintrag gedroppt werden.
// Das Drop-Target ist in diesem Fall 0
#define SV_DRAGDROP_ENABLE_TOP (DragDropMode)0x0020
DECLARE_SVTREELIST(SvLBoxTreeList, SvLBoxEntry*)
#define SVLISTBOX_ID_LBOX 0 // fuer SvLBox::IsA()
#define SVLBOX_IN_EDT 0x0001
#define SVLBOX_EDT_ENABLED 0x0002
#define SVLBOX_IS_EXPANDING 0x0004
#define SVLBOX_IS_TRAVELSELECT 0x0008
#define SVLBOX_TARGEMPH_VIS 0x0010
#define SVLBOX_EDTEND_CALLED 0x0020
class SvLBox;
struct SvLBox_Impl
{
bool m_bIsEmptyTextAllowed;
bool m_bEntryMnemonicsEnabled;
bool m_bDoingQuickSelection;
Link* m_pLink;
::vcl::MnemonicEngine m_aMnemonicEngine;
::vcl::QuickSelectionEngine m_aQuickSelectionEngine;
SvLBox_Impl( SvLBox& _rBox );
};
class SVT_DLLPUBLIC SvLBox
:public Control
,public SvListView
,public DropTargetHelper
,public DragSourceHelper
,public ::vcl::IMnemonicEntryList
,public ::vcl::ISearchableStringList
{
friend class SvLBoxEntry;
//#if 0 // _SOLAR__PRIVATE
DECL_DLLPRIVATE_LINK( TextEditEndedHdl_Impl, SvInplaceEdit2 * );
// Handler, der von TreeList zum Clonen eines Entries aufgerufen wird
DECL_DLLPRIVATE_LINK( CloneHdl_Impl, SvListEntry* );
// handler and methods for Drag - finished handler.
// The with get GetDragFinishedHdl() get link can set on the
// TransferDataContainer. This link is a callback for the DragFinished
// call. AddBox method is called from the GetDragFinishedHdl() and the
// remove is called in link callback and in the destructor. So it can't
// called to a deleted object.
SVT_DLLPRIVATE static void AddBoxToDDList_Impl( const SvLBox& rB );
SVT_DLLPRIVATE static void RemoveBoxFromDDList_Impl( const SvLBox& rB );
DECL_DLLPRIVATE_STATIC_LINK( SvLBox, DragFinishHdl_Impl, sal_Int8* );
//#endif
DragDropMode nOldDragMode;
protected:
Link aExpandedHdl;
Link aExpandingHdl;
Link aSelectHdl;
Link aDeselectHdl;
Link aDoubleClickHdl;
SvLBoxEntry* pHdlEntry;
SvLBoxItem* pHdlItem;
SvLBoxEntry* pTargetEntry;
SvLBox_Impl* pLBoxImpl;
sal_uInt16 nImpFlags;
// Move/CopySelection: Position des aktuellen Eintrags in Selektionsliste
sal_uInt16 nCurEntrySelPos;
DragDropMode nDragDropMode;
SelectionMode eSelMode;
sal_Int8 nDragOptions;
sal_Bool CheckDragAndDropMode( SvLBox* pSource, sal_Int8 );
void ImplShowTargetEmphasis( SvLBoxEntry* pEntry, sal_Bool bShow);
void EnableSelectionAsDropTarget( sal_Bool bEnable = sal_True,
sal_Bool bWithChilds = sal_True );
// standard impl gibt 0 zurueck; muss von abgeleiteten Klassen, die
// D&D unterstuetzen, ueberladen werden
using Window::GetDropTarget;
virtual SvLBoxEntry* GetDropTarget( const Point& );
// view-spezifische Daten in den Dragserver stellen
// wird an der Source-View aufgerufen (im BeginDrag-Handler)
virtual void WriteDragServerInfo( const Point&, SvLBoxDDInfo* );
// wird an der Target-View aufgerufen (im Drop-Handler)
virtual void ReadDragServerInfo( const Point&,SvLBoxDDInfo* );
// invalidate children on enable/disable
virtual void StateChanged( StateChangedType );
virtual sal_uLong Insert( SvLBoxEntry* pEnt,SvLBoxEntry* pPar,sal_uLong nPos=LIST_APPEND);
virtual sal_uLong Insert( SvLBoxEntry* pEntry,sal_uLong nRootPos = LIST_APPEND );
void InsertTree( SvLBoxEntry* pTree, SvLBoxEntry* pTarget) {pModel->InsertTree( pTree, pTarget ); }
// Inplace-Editing
SvInplaceEdit2* pEdCtrl;
void EnableInplaceEditing( sal_Bool bEnable){if(bEnable)nImpFlags|=SVLBOX_EDT_ENABLED; else nImpFlags&=~SVLBOX_EDT_ENABLED;}
sal_Bool IsInplaceEditingEnabled() const { return (sal_Bool)((nImpFlags&SVLBOX_EDT_ENABLED)!=0); }
virtual void EditingRequest( SvLBoxEntry* pEntry, SvLBoxItem* pItem,
const Point& rMousePos );
void EditText( const String&, const Rectangle&,const Selection&);
void EditText( const String&, const Rectangle&,const Selection&, sal_Bool bMulti);
void EditTextMultiLine( const String&, const Rectangle&,const Selection&);
void CancelTextEditing();
sal_Bool IsEditingActive() const { return (sal_Bool)((nImpFlags & SVLBOX_IN_EDT)!=0); }
sal_Bool EditingCanceled() const;
void EndEditing( sal_Bool bCancel = sal_False );
bool IsEmptyTextAllowed() const;
void ForbidEmptyText();
// Callback EditText
virtual void EditedText( const String& );
// Rueckgabewert muss von SvViewDataEntry abgeleitet sein!
virtual SvViewData* CreateViewData( SvListEntry* );
// InitViewData wird direkt nach CreateViewData aufgerufen
// In InitViewData ist der Entry noch nicht in die View eingefuegt!
virtual void InitViewData( SvViewData*, SvListEntry* pEntry );
// ruft fuer Items aller Entries InitViewData auf
void RecalcViewData();
// Callback von RecalcViewData
virtual void ViewDataInitialized( SvLBoxEntry* );
virtual void Command( const CommandEvent& rCEvt );
virtual void KeyInput( const KeyEvent& rKEvt );
virtual SvLBoxEntry* GetEntry( const Point& rPos, sal_Bool bHit=sal_False ) const;
virtual void ModelHasEntryInvalidated( SvListEntry* pEntry );
// handler and methods for Drag - finished handler. This link can be set
// to the TransferDataContainer. The AddBox/RemoveBox methods must be
// called before the StartDrag call.
// The Remove will be called from the handler, which then called
// DragFinish method. The Remove also called in the DTOR of the SvLBox -
// so it can't called to a deleted object.
Link GetDragFinishedHdl() const;
// for asynchronous D&D
sal_Int8 ExecuteDrop( const ExecuteDropEvent& rEvt, SvLBox* pSourceView );
void OnCurrentEntryChanged();
// IMnemonicEntryList
virtual const void* FirstSearchEntry( String& _rEntryText ) const;
virtual const void* NextSearchEntry( const void* _pCurrentSearchEntry, String& _rEntryText ) const;
virtual void SelectSearchEntry( const void* _pEntry );
virtual void ExecuteSearchEntry( const void* _pEntry ) const;
// ISearchableStringList
virtual ::vcl::StringEntryIdentifier CurrentEntry( String& _out_entryText ) const;
virtual ::vcl::StringEntryIdentifier NextEntry( ::vcl::StringEntryIdentifier _currentEntry, String& _out_entryText ) const;
virtual void SelectEntry( ::vcl::StringEntryIdentifier _entry );
public:
SvLBox( Window* pParent, WinBits nWinStyle=0 );
SvLBox( Window* pParent, const ResId& rResId );
~SvLBox();
SvLBoxTreeList* GetModel() const { return (SvLBoxTreeList*)pModel; }
using SvListView::SetModel;
void SetModel( SvLBoxTreeList* );
void DisconnectFromModel();
virtual sal_uInt16 IsA();
sal_uLong GetEntryCount() const {return pModel->GetEntryCount();}
SvLBoxEntry* First() const { return (SvLBoxEntry*)(pModel->First()); }
SvLBoxEntry* Next( SvLBoxEntry* pEntry, sal_uInt16* pDepth=0 ) const { return (SvLBoxEntry*)(pModel->Next(pEntry,pDepth));}
SvLBoxEntry* Prev( SvLBoxEntry* pEntry, sal_uInt16* pDepth=0 ) const { return (SvLBoxEntry*)(pModel->Prev(pEntry,pDepth));}
SvLBoxEntry* Last( sal_uInt16* pDepth=0 ) const { return (SvLBoxEntry*)(pModel->Last(pDepth));}
SvLBoxEntry* FirstChild(SvLBoxEntry* pParent ) const { return (SvLBoxEntry*)(pModel->FirstChild(pParent)); }
SvLBoxEntry* NextSibling(SvLBoxEntry* pEntry ) const { return (SvLBoxEntry*)(pModel->NextSibling( pEntry )); }
SvLBoxEntry* PrevSibling(SvLBoxEntry* pEntry ) const { return (SvLBoxEntry*)(pModel->PrevSibling( pEntry )); }
SvLBoxEntry* FirstSelected() const { return (SvLBoxEntry*)SvListView::FirstSelected(); }
using SvListView::NextSelected;
SvLBoxEntry* NextSelected( SvLBoxEntry* pEntry ) const { return (SvLBoxEntry*)(SvListView::NextSelected(pEntry)); }
using SvListView::PrevSelected;
SvLBoxEntry* PrevSelected( SvLBoxEntry* pEntry ) const { return (SvLBoxEntry*)(SvListView::PrevSelected(pEntry)); }
SvLBoxEntry* LastSelected() const { return (SvLBoxEntry*)(SvListView::LastSelected()); }
sal_Bool CopySelection( SvLBox* pSource, SvLBoxEntry* pTarget );
sal_Bool MoveSelection( SvLBox* pSource, SvLBoxEntry* pTarget );
sal_Bool MoveSelectionCopyFallbackPossible( SvLBox* pSource, SvLBoxEntry* pTarget, sal_Bool bAllowCopyFallback );
void RemoveSelection();
DragDropMode GetDragDropMode() const { return nDragDropMode; }
virtual void SetDragDropMode( DragDropMode );
SelectionMode GetSelectionMode() const { return eSelMode; }
virtual void SetSelectionMode( SelectionMode );
// pParent==0 -> Root-Ebene
SvLBoxEntry* GetEntry( SvLBoxEntry* pParent, sal_uLong nPos ) const { return (SvLBoxEntry*)(pModel->GetEntry(pParent,nPos)); }
SvLBoxEntry* GetEntry( sal_uLong nRootPos ) const { return (SvLBoxEntry*)(pModel->GetEntry(nRootPos)); }
SvLBoxEntry* GetEntryFromPath( const ::std::deque< sal_Int32 >& _rPath ) const;
void FillEntryPath( SvLBoxEntry* pEntry, ::std::deque< sal_Int32 >& _rPath ) const;
virtual String GetEntryText( SvLBoxEntry* pEntry ) const;
using Window::GetParent;
SvLBoxEntry* GetParent( SvLBoxEntry* pEntry ) const { return (SvLBoxEntry*)(pModel->GetParent(pEntry)); }
SvLBoxEntry* GetRootLevelParent(SvLBoxEntry* pEntry ) const { return (SvLBoxEntry*)(pModel->GetRootLevelParent( pEntry ));}
using Window::GetChildCount;
sal_uLong GetChildCount( SvLBoxEntry* pParent ) const { return pModel->GetChildCount(pParent); }
sal_uLong GetLevelChildCount( SvLBoxEntry* pParent ) const;
SvViewDataEntry* GetViewDataEntry( SvListEntry* pEntry ) const { return (SvViewDataEntry*)SvListView::GetViewData(pEntry); }
SvViewDataItem* GetViewDataItem( SvListEntry*, SvLBoxItem* ) const;
virtual void MakeVisible( SvLBoxEntry* pEntry );
void Clear();
/** enables or disables mnemonic characters in the entry texts.
If mnemonics are enabled, then entries are selected and made current when
there mnemonic character is pressed. If there are multiple entries with the
same mnemonic, the selection cycles between them.
Entries with an collapsed ancestor are not included in the calculation of
mnemonics. That is, if you press the accelerator key of an invisible
entry, then this entry is *not* selected.
Be aware that enabling mnemonics is the more expensive the more
entries you have in your list.
*/
void EnableEntryMnemonics( bool _bEnable = true );
bool IsEntryMnemonicsEnabled() const;
/** handles the given key event.
At the moment, this merely checks for accelerator keys, if entry mnemonics
are enabled.
The method might come handy when you want to use keyboard acceleration
while the control does not have the focus.
When the key event describes the pressing of a shortcut for an entry,
then SelectSearchEntry resp. ExecuteSearchEntry are called.
@see IMnemonicEntryList
@see MnemonicEngine
@return
<TRUE/> if the event has been consumed, <FALSE/> otherwise.
*/
bool HandleKeyInput( const KeyEvent& rKEvt );
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 ) = 0;
virtual SvLBoxEntry*
GetCurEntry() const = 0;
// Model
void SetInUseEmphasis( SvLBoxEntry* pEntry, sal_Bool bInUse=sal_True);
// View
void SetCursorEmphasis( SvLBoxEntry* pEntry, sal_Bool bCursored=sal_True);
sal_Bool HasCursorEmphasis( SvLBoxEntry* pEntry ) const;
void SetSelectHdl( const Link& rNewHdl ) {aSelectHdl=rNewHdl; }
void SetDeselectHdl( const Link& rNewHdl ) {aDeselectHdl=rNewHdl; }
void SetDoubleClickHdl(const Link& rNewHdl) {aDoubleClickHdl=rNewHdl;}
const Link& GetSelectHdl() const { return aSelectHdl; }
const Link& GetDeselectHdl() const { return aDeselectHdl; }
const Link& GetDoubleClickHdl() const { return aDoubleClickHdl; }
void SetExpandingHdl(const Link& rNewHdl){aExpandingHdl=rNewHdl;}
void SetExpandedHdl(const Link& rNewHdl){aExpandedHdl=rNewHdl;}
const Link& GetExpandingHdl() const { return aExpandingHdl; }
virtual void ExpandedHdl();
virtual long ExpandingHdl();
virtual void SelectHdl();
virtual void DeselectHdl();
virtual sal_Bool DoubleClickHdl();
sal_Bool IsTravelSelect() const { return (sal_Bool)((nImpFlags&SVLBOX_IS_TRAVELSELECT)!=0);}
SvLBoxEntry* GetHdlEntry() const { return pHdlEntry; }
SvLBoxItem* GetHdlItem() const;
// wird aufgerufen, wenn ein Eintrag mit gesetztem
// ENTRYFLAG_CHILDS_ON_DEMAND expandiert wird.
virtual void RequestingChilds( SvLBoxEntry* pParent );
// Drag & Drop
//JP 28.3.2001: new Drag & Drop API
virtual sal_Int8 AcceptDrop( const AcceptDropEvent& rEvt );
virtual sal_Int8 ExecuteDrop( const ExecuteDropEvent& rEvt );
virtual void StartDrag( sal_Int8 nAction, const Point& rPosPixel );
virtual DragDropMode NotifyStartDrag( TransferDataContainer& rData,
SvLBoxEntry* );
virtual void DragFinished( sal_Int8 nDropAction );
virtual sal_Bool NotifyAcceptDrop( SvLBoxEntry* );
void SetDragOptions( sal_Int8 nOptions ) { nDragOptions = nOptions; }
sal_Int8 GetDragOptions() const { return nDragOptions; }
SvLBox* GetSourceView() const;
SvLBox* GetTargetView() const;
virtual void NotifyRemoving( SvLBoxEntry* );
virtual void ShowTargetEmphasis( SvLBoxEntry*, sal_Bool bShow );
virtual SvLBoxEntry* CloneEntry( SvLBoxEntry* pSource );
virtual SvLBoxEntry* CreateEntry() const; // zum 'new'en von Entries
// Rueckgabe: sal_True==Ok, sal_False==Abbrechen
virtual sal_Bool NotifyMoving(
SvLBoxEntry* pTarget, // D&D-Drop-Position in this->GetModel()
SvLBoxEntry* pEntry, // Zu verschiebender Entry aus
// GetSourceListBox()->GetModel()
SvLBoxEntry*& rpNewParent, // Neuer Target-Parent
sal_uLong& rNewChildPos); // Position in Childlist des Target-Parents
// Rueckgabe: sal_True==Ok, sal_False==Abbrechen
virtual sal_Bool NotifyCopying(
SvLBoxEntry* pTarget, // D&D-Drop-Position in this->GetModel()
SvLBoxEntry* pEntry, // Zu kopierender Entry aus
// GetSourceListBox()->GetModel()
SvLBoxEntry*& rpNewParent, // Neuer Target-Parent
sal_uLong& rNewChildPos); // Position in Childlist des Target-Parents
// 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;
/** 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 );
protected:
using SvListView::Expand;
using SvListView::Collapse;
using SvListView::Select;
using SvListView::SelectChilds;
using SvListView::SelectAll;
};
#define SV_LBOX_DD_FORMAT "SV_LBOX_DD_FORMAT"
struct SvLBoxDDInfo
{
Application* pApp;
SvLBox* pSource;
SvLBoxEntry* pDDStartEntry;
// relative Position im Eintrag bei Drag-Beginn (IconView)
long nMouseRelX,nMouseRelY;
sal_uLong nRes1,nRes2,nRes3,nRes4;
};
class SvInplaceEdit : public Edit
{
Link aCallBackHdl;
Accelerator aAccReturn;
Accelerator aAccEscape;
Timer aTimer;
sal_Bool bCanceled;
sal_Bool bAlreadyInCallBack;
//#if 0 // _SOLAR__PRIVATE
void CallCallBackHdl_Impl();
DECL_LINK( Timeout_Impl, Timer * );
DECL_LINK( ReturnHdl_Impl, Accelerator * );
DECL_LINK( EscapeHdl_Impl, Accelerator * );
//#endif
public:
SvInplaceEdit( Window* pParent, const Point& rPos, const Size& rSize,
const String& rData, const Link& rNotifyEditEnd,
const Selection& );
~SvInplaceEdit();
virtual void KeyInput( const KeyEvent& rKEvt );
virtual void LoseFocus();
sal_Bool EditingCanceled() const { return bCanceled; }
String GetText() const { return Edit::GetText(); }
void StopEditing( sal_Bool bCancel = sal_False );
};
class SvInplaceEdit2
{
Link aCallBackHdl;
Accelerator aAccReturn;
Accelerator aAccEscape;
Timer aTimer;
Edit* pEdit;
sal_Bool bCanceled;
sal_Bool bAlreadyInCallBack;
sal_Bool bMultiLine;
//#if 0 // _SOLAR__PRIVATE
void CallCallBackHdl_Impl();
DECL_LINK( Timeout_Impl, Timer * );
DECL_LINK( ReturnHdl_Impl, Accelerator * );
DECL_LINK( EscapeHdl_Impl, Accelerator * );
//#endif
public:
SvInplaceEdit2( Window* pParent, const Point& rPos, const Size& rSize,
const String& rData, const Link& rNotifyEditEnd,
const Selection&, sal_Bool bMultiLine = sal_False );
~SvInplaceEdit2();
sal_Bool KeyInput( const KeyEvent& rKEvt );
void LoseFocus();
sal_Bool EditingCanceled() const { return bCanceled; }
String GetText() const;
String GetSavedValue() const;
void StopEditing( sal_Bool bCancel = sal_False );
void Hide();
};
inline SvViewDataItem* SvLBox::GetViewDataItem( SvListEntry* pEntry,
SvLBoxItem* pItem) const
{
SvViewDataEntry* pEntryData =
(SvViewDataEntry*)SvListView::GetViewData(pEntry);
DBG_ASSERT(pEntryData,"Entry not in View");
DBG_ASSERT(pEntryData->pItemData,"No ItemData");
sal_uInt16 nItemPos = ((SvLBoxEntry*)pEntry)->GetPos( pItem );
return (pEntryData->pItemData+nItemPos);
}
#endif