summaryrefslogtreecommitdiff
path: root/svtools/inc/svtools/svicnvw.hxx
blob: 30773b1015479ef0d7175cbd6a22063118e39f21 (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
/* -*- 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 _SVICNVW_HXX
#define _SVICNVW_HXX

#include <vcl/image.hxx>
#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        // only for entries (uses config? from the view)
};

class SvIcnVwDataEntry : public SvViewDataEntry
{
friend class SvImpIconView;
    sal_uInt16      nIcnVwFlags;
    SvIconViewTextMode eTextMode;
public:
    Rectangle   aRect;              // Bounding-Rect of the Entry
    Rectangle   aGridRect;          // set in grid mode
    Size        aTextSize;          // set in grid mode only
    sal_uInt16  nX,nY;              // for keyboard control
                SvIcnVwDataEntry();
    virtual     ~SvIcnVwDataEntry();

    sal_Bool        IsEntryPosLocked() const { return (sal_Bool)((nIcnVwFlags & ICNVW_FLAG_POS_LOCKED) !=0); }
    void        ClearVwFlags( sal_uInt16 nMask ) { nIcnVwFlags &= (~nMask); }
    void        SetVwFlags( sal_uInt16 nMask ) { nIcnVwFlags |= nMask; }
    sal_uInt16      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;
    sal_uInt16          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,
                        sal_Bool bChildsOnDemand = sal_False,
                        sal_uLong nPos=LIST_APPEND );

    SvLBoxEntry*    InsertEntry( const XubString& rText,
                        const Image& rExpandedEntryBmp,
                        const Image& rCollapsedEntryBmp,
                        SvLBoxEntry* pParent = 0,
                        sal_Bool bChildsOnDemand = sal_False,
                        sal_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 sal_uInt16  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( sal_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, sal_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*, sal_Bool bShow );
    using Window::GetDropTarget;
    virtual SvLBoxEntry* GetDropTarget( const Point& );
    virtual Region  GetDragRegion() const;
    // NotifyMoving/Copying is overloaded, since GetDropTarget
    // returns a "magic pointer" if the drop happens in/on an empty
    // area(?) of the IconView
    virtual sal_Bool    NotifyMoving( SvLBoxEntry* pTarget, SvLBoxEntry* pEntry,
                        SvLBoxEntry*& rpNewParent, sal_uLong& rNewChildPos);
    virtual sal_Bool    NotifyCopying( SvLBoxEntry* pTarget, SvLBoxEntry* pEntry,
                        SvLBoxEntry*& rpNewParent, sal_uLong& rNewChildPos);

    // returns TopLeft of the BoundingRect. Add MapMode.Origin to get the
    // position relative to the window
     Point          GetEntryPosition( SvLBoxEntry* ) const;
    void            SetEntryPosition( SvLBoxEntry*, const Point& rDocPos);
    void            SetEntryPosition( SvLBoxEntry*, const Point& rDocPos,
                                      sal_Bool bAdjustAtGrid );

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

    using SvLBox::GetEntry;
    SvLBoxEntry*    GetEntry( const Point& rPixPos, sal_Bool  ) const;
    // returns the entry just above pCurEntry (z-wise)
    SvLBoxEntry*    GetNextEntry( const Point& rPixPos, SvLBoxEntry* pCurEntry, sal_Bool  ) const;
    // returns the entry just below pCurEntry (z-wise)
    SvLBoxEntry*    GetPrevEntry( const Point& rPixPos, SvLBoxEntry* pCurEntry, sal_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;
    sal_Bool            Select( SvLBoxEntry* pEntry, sal_Bool bSelect=sal_True );
    void            SelectAll( sal_Bool bSelect, sal_Bool bPaint=sal_True );
    virtual void    SetCurEntry( SvLBoxEntry* _pEntry );
    virtual SvLBoxEntry*
                    GetCurEntry() const;

    // locigal coordinates
    void            SelectRect(
                        const Rectangle& rRect,
                        sal_Bool bAdd = sal_False,
                        // inverts the intersection with rRect
                        // (ignored if bAdd == sal_False)
                        SvPtrarr* pOtherRects = 0,
                        short nBorderOffs = -5 );
    sal_uLong           GetSelectionCount() const;

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

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

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

    virtual void    ModelNotification( sal_uInt16 nActionId, SvListEntry* pEntry1,
                        SvListEntry* pEntry2, sal_uLong nPos );

    // pass (0, 0) to switch off grid mode
    void            SetGrid( long nDX, long nDY );

    // nDeltaY < 0 : View moves up relative to Doc
    // nDeltaY > 0 : View moves down relative to Doc
    // nDeltaX < 0 : View moves left relative to Doc
    // nDeltaX > 0 : View moves right relative to Doc
    using Window::Scroll;
    virtual void    Scroll( long nDeltaX, long nDeltaY, sal_uInt16 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 );

    // to scroll during Drag&Drop
    void            CalcScrollOffsets(
                        const Point& rRefPosPixel,
                        long& rScrollX,
                        long& rScrollY,
                        sal_Bool bInDragDrop = sal_False,
                        sal_uInt16 nBorderWidth = 10 );

    using Window::EndTracking;
    void            EndTracking();
    void            AdjustAtGrid( SvLBoxEntry* pEntry = 0 );
    void            LockEntryPos( SvLBoxEntry* pEntry, sal_Bool bLock = sal_True );
    sal_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

/* vim:set shiftwidth=4 softtabstop=4 expandtab: */