summaryrefslogtreecommitdiff
path: root/svtools/inc/svtools/svicnvw.hxx
blob: 68a76d25e10808b54b91b31b697aeade6ce488ff (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
/*************************************************************************
 *
 * 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 _SVICNVW_HXX
#define _SVICNVW_HXX

#ifndef _IMAGE_HXX
#include <vcl/image.hxx>
#endif
#include <svtools/svlbox.hxx>

class SvImpIconView;
class SvLBoxEntry;
class SvLBoxItem;
class SvLBoxString;
class SvLBoxContextBmp;
class SvPtrarr;

#define WB_ICON         0x0001
#define WB_NAME         0x0002
#define WB_TEXT         0x0004
#define WB_FLOW         0x0008

#define ICNVW_FLAG_POS_LOCKED   0x0001
#define ICNVW_FLAG_USER1        0x1000
#define ICNVW_FLAG_USER2        0x2000
#define ICNVW_FLAG_USER3        0x4000
#define ICNVW_FLAG_USER4        0x8000

enum SvIconViewTextMode
{
    ShowTextFull = 1,
    ShowTextShort,
    ShowTextSmart,          // not implemented
    ShowTextDontKnow        // nur fuer Eintraege (->Einstellung der View
                            // wird genommen)
};

class SvIcnVwDataEntry : public SvViewDataEntry
{
friend class SvImpIconView;
    USHORT      nIcnVwFlags;
    SvIconViewTextMode eTextMode;
public:
    Rectangle   aRect;              // Bounding-Rect des Entries
    Rectangle   aGridRect;          // gesetzt im Grid-Modus
    Size        aTextSize;          // nur gesetzt im Grid-Modus
    USHORT      nX,nY;              // fuer Tastatursteuerung
                SvIcnVwDataEntry();
    virtual     ~SvIcnVwDataEntry();

    BOOL        IsEntryPosLocked() const { return (BOOL)((nIcnVwFlags & ICNVW_FLAG_POS_LOCKED) !=0); }
    void        ClearVwFlags( USHORT nMask ) { nIcnVwFlags &= (~nMask); }
    void        SetVwFlags( USHORT nMask ) { nIcnVwFlags |= nMask; }
    USHORT      GetVwFlags() const { return nIcnVwFlags; }
    SvIconViewTextMode GetTextMode() const { return eTextMode; }
};

#define SV_LISTBOX_ID_ICONVIEW 2

class SvIconView : public SvLBox
{
    friend class SvImpIconView;

    SvImpIconView*  pImp;
    Image           aCollapsedEntryBmp;
    Image           aExpandedEntryBmp;
    USHORT          nIcnVwFlags;
    void            SetModel( SvLBoxTreeList* );

protected:

    using SvLBox::CreateEntry;
    SvLBoxEntry*    CreateEntry( const XubString&, const Image&, const Image&);
    void            ViewDataInitialized( SvLBoxEntry* );
    virtual SvViewData* CreateViewData( SvListEntry* );
    virtual void    InitViewData( SvViewData* pData, SvListEntry* pEntry );

    void            EditingRequest(SvLBoxEntry*,SvLBoxItem*,const Point& );
    void            EditedText( const XubString& );
    void            EditItemText( SvLBoxEntry*,SvLBoxItem*,const Selection& );
    SvLBoxEntry*    pCurEdEntry;
    SvLBoxItem*     pCurEdItem;

    virtual void    WriteDragServerInfo( const Point&, SvLBoxDDInfo* );
    virtual void    ReadDragServerInfo( const Point&, SvLBoxDDInfo* );
    virtual void    Command( const CommandEvent& rCEvt );
    virtual void    PreparePaint( SvLBoxEntry* );
    virtual void    StateChanged( StateChangedType nStateChange );

public:

    SvIconView( Window* pParent,WinBits nWinStyle=0 );
    SvIconView( Window* pParent,const ResId& rResId );
    ~SvIconView();

    void DisconnectFromModel();

    SvLBoxEntry*    InsertEntry( const XubString& rText, SvLBoxEntry* pParent = 0,
                        BOOL bChildsOnDemand = FALSE,
                        ULONG nPos=LIST_APPEND );

    SvLBoxEntry*    InsertEntry( const XubString& rText,
                        const Image& rExpandedEntryBmp,
                        const Image& rCollapsedEntryBmp,
                        SvLBoxEntry* pParent = 0,
                        BOOL bChildsOnDemand = FALSE,
                        ULONG nPos = LIST_APPEND );

    const Image&    GetDefaultExpandedEntryBmp() const { return aExpandedEntryBmp;}
    const Image&    GetDefaultCollapsedEntryBmp() const { return aCollapsedEntryBmp;}
    void            SetDefaultExpandedEntryBmp( const Image& rBmp) { aExpandedEntryBmp=rBmp;}
    void            SetDefaultCollapsedEntryBmp( const Image& rBmp ) { aCollapsedEntryBmp=rBmp;}

    void            SetEntryText(SvLBoxEntry*, const XubString& );
    void            SetExpandedEntryBmp(SvLBoxEntry*, const Image& );
    void            SetCollapsedEntryBmp(SvLBoxEntry*, const Image& );

    XubString       GetEntryText(SvLBoxEntry*) const;
    Image           GetExpandedEntryBmp(SvLBoxEntry*) const;
    Image           GetCollapsedEntryBmp(SvLBoxEntry*) const;

    virtual SvLBoxEntry* CloneEntry( SvLBoxEntry* pSource );

    virtual USHORT  IsA();

    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( BOOL );

    using SvListView::SetModel;
    virtual void    SetModel( SvLBoxTreeList*, SvLBoxEntry* pParent );
    virtual void    ModelHasCleared();
    virtual void    ModelHasInserted( SvListEntry* pEntry );
    virtual void    ModelHasInsertedTree( SvListEntry* pEntry );
    virtual void    ModelIsMoving(SvListEntry* pSource,
                        SvListEntry* pTargetParent, ULONG nChildPos );
    virtual void    ModelHasMoved(SvListEntry* pSource );
    virtual void    ModelIsRemoving( SvListEntry* pEntry );
    virtual void    ModelHasRemoved( SvListEntry* pEntry );
    virtual void    ModelHasEntryInvalidated( SvListEntry* pEntry );

    virtual void    ShowTargetEmphasis( SvLBoxEntry*, BOOL bShow );
    using Window::GetDropTarget;
    virtual SvLBoxEntry* GetDropTarget( const Point& );
    virtual Region  GetDragRegion() const;
    // NotifyMoving/Copying ueberladen, da wir bei GetDropTarget
    // einen "magic pointer" zurueckgeben, falls in einen leeren
    // Bereich auf der IconView gedroppt wird.
    virtual BOOL    NotifyMoving( SvLBoxEntry* pTarget, SvLBoxEntry* pEntry,
                        SvLBoxEntry*& rpNewParent, ULONG& rNewChildPos);
    virtual BOOL    NotifyCopying( SvLBoxEntry* pTarget, SvLBoxEntry* pEntry,
                        SvLBoxEntry*& rpNewParent, ULONG& rNewChildPos);

    // gibt TopLeft des BoundingRects zurueck
    // Konvertierung in Fensterposition: MapMode.Origin addieren
    Point           GetEntryPosition( SvLBoxEntry* ) const;
    void            SetEntryPosition( SvLBoxEntry*, const Point& rDocPos);
    void            SetEntryPosition( SvLBoxEntry*, const Point& rDocPos,
                                      BOOL bAdjustAtGrid );

    void            SetFont( const Font& rFont );
    void            SetDefaultFont();

    using SvLBox::GetEntry;
    SvLBoxEntry*    GetEntry( const Point& rPixPos, BOOL  ) const;
    // Gibt den naechsten ueber pCurEntry liegenden Eintrag (ZOrder)
    SvLBoxEntry*    GetNextEntry( const Point& rPixPos, SvLBoxEntry* pCurEntry, BOOL  ) const;
    // Gibt den naechsten unter pCurEntry liegenden Eintrag (ZOrder)
    SvLBoxEntry*    GetPrevEntry( const Point& rPixPos, SvLBoxEntry* pCurEntry, BOOL  ) const;

    SvLBoxEntry*    GetEntryFromLogicPos( const Point& rDocPos ) const;

    virtual void    PaintEntry( SvLBoxEntry* );
    virtual void    PaintEntry( SvLBoxEntry*, const Point& rDocPos );
    Rectangle       GetFocusRect( SvLBoxEntry* );
    void            InvalidateEntry( SvLBoxEntry* );
    void            MakeVisible( SvLBoxEntry* );

    void            SetDragDropMode( DragDropMode );
    void            SetSelectionMode( SelectionMode );

    using SvListView::Select;
    BOOL            Select( SvLBoxEntry* pEntry, BOOL bSelect=TRUE );
    void            SelectAll( BOOL bSelect, BOOL bPaint=TRUE );
    virtual void    SetCurEntry( SvLBoxEntry* _pEntry );
    virtual SvLBoxEntry*
                    GetCurEntry() const;

    // logische Koordinaten
    void            SelectRect(
                        const Rectangle& rRect,
                        BOOL bAdd = FALSE,
                        // die Schnittmenge mit rRect wird invertiert
                        // wird bei bAdd == FALSE ignoriert
                        SvPtrarr* pOtherRects = 0,
                        short nBorderOffs = -5 );
    ULONG           GetSelectionCount() const;

    virtual void    Arrange();
    void            SetSpaceBetweenEntries( long nHor, long Ver );
    long            GetHorSpaceBetweenEntries();
    long            GetVerSpaceBetweenEntries();

    void            EnableInplaceEditing( BOOL bEnable );
    void            EditEntry( SvLBoxEntry* pEntry = 0 );
    virtual BOOL    EditingEntry( SvLBoxEntry* pEntry, Selection& );
    virtual BOOL    EditedEntry( SvLBoxEntry*, const XubString& rNewText );

    void            SetCurParent( SvLBoxEntry* pNewParent );
    SvLBoxEntry*    GetCurParent() const;

    virtual void    ModelNotification( USHORT nActionId, SvListEntry* pEntry1,
                        SvListEntry* pEntry2, ULONG nPos );

    // 0,0: Grid-Modus ausschalten
    void            SetGrid( long nDX, long nDY );

    // nDeltaY < 0 : View bewegt sich auf dem Doc nach oben
    // nDeltaY > 0 : View bewegt sich auf dem Doc nach unten
    // nDeltaX < 0 : View bewegt sich auf dem Doc nach links
    // nDeltaX > 0 : View bewegt sich auf dem Doc nach rechts
    using Window::Scroll;
    virtual void    Scroll( long nDeltaX, long nDeltaY, USHORT nFlags = 0 );

    virtual void    PrepareCommandEvent( const CommandEvent& );
    virtual void    StartDrag( sal_Int8 nAction, const Point& );
    virtual void    DragFinished( sal_Int8 );
    virtual sal_Int8    AcceptDrop( const AcceptDropEvent& rEvt );
    using SvLBox::ExecuteDrop;
    virtual sal_Int8    ExecuteDrop( const ExecuteDropEvent& rEvt );

    void            ShowDDIcon( SvLBoxEntry* pRefEntry, const Point& rPos );
    void            HideDDIcon();
    void            HideShowDDIcon( SvLBoxEntry* pRefEntry, const Point& rPos );

    // fuers Scrollen beim D&D
    void            CalcScrollOffsets(
                        const Point& rRefPosPixel,
                        long& rScrollX,
                        long& rScrollY,
                        BOOL bInDragDrop = FALSE,
                        USHORT nBorderWidth = 10 );

    using Window::EndTracking;
    void            EndTracking();
    void            AdjustAtGrid( SvLBoxEntry* pEntry = 0 );
    void            LockEntryPos( SvLBoxEntry* pEntry, BOOL bLock = TRUE );
    BOOL            IsEntryPosLocked( const SvLBoxEntry* pEntry ) const;

    void            SetTextMode( SvIconViewTextMode, SvLBoxEntry* pEntry = 0 );
    SvIconViewTextMode GetTextMode( const SvLBoxEntry* pEntry = 0 ) const;

    void            ShowFocusRect( const SvLBoxEntry* pEntry );
};

#endif