1*b1cdbd2cSJim Jagielski /**************************************************************
2*b1cdbd2cSJim Jagielski  *
3*b1cdbd2cSJim Jagielski  * Licensed to the Apache Software Foundation (ASF) under one
4*b1cdbd2cSJim Jagielski  * or more contributor license agreements.  See the NOTICE file
5*b1cdbd2cSJim Jagielski  * distributed with this work for additional information
6*b1cdbd2cSJim Jagielski  * regarding copyright ownership.  The ASF licenses this file
7*b1cdbd2cSJim Jagielski  * to you under the Apache License, Version 2.0 (the
8*b1cdbd2cSJim Jagielski  * "License"); you may not use this file except in compliance
9*b1cdbd2cSJim Jagielski  * with the License.  You may obtain a copy of the License at
10*b1cdbd2cSJim Jagielski  *
11*b1cdbd2cSJim Jagielski  *   http://www.apache.org/licenses/LICENSE-2.0
12*b1cdbd2cSJim Jagielski  *
13*b1cdbd2cSJim Jagielski  * Unless required by applicable law or agreed to in writing,
14*b1cdbd2cSJim Jagielski  * software distributed under the License is distributed on an
15*b1cdbd2cSJim Jagielski  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16*b1cdbd2cSJim Jagielski  * KIND, either express or implied.  See the License for the
17*b1cdbd2cSJim Jagielski  * specific language governing permissions and limitations
18*b1cdbd2cSJim Jagielski  * under the License.
19*b1cdbd2cSJim Jagielski  *
20*b1cdbd2cSJim Jagielski  *************************************************************/
21*b1cdbd2cSJim Jagielski 
22*b1cdbd2cSJim Jagielski 
23*b1cdbd2cSJim Jagielski 
24*b1cdbd2cSJim Jagielski // MARKER(update_precomp.py): autogen include statement, do not remove
25*b1cdbd2cSJim Jagielski #include "precompiled_svtools.hxx"
26*b1cdbd2cSJim Jagielski 
27*b1cdbd2cSJim Jagielski #include <limits.h>
28*b1cdbd2cSJim Jagielski #ifndef _METRIC_HXX
29*b1cdbd2cSJim Jagielski #include <vcl/metric.hxx>
30*b1cdbd2cSJim Jagielski #endif
31*b1cdbd2cSJim Jagielski #include <vcl/svapp.hxx>
32*b1cdbd2cSJim Jagielski #ifdef DBG_UTIL
33*b1cdbd2cSJim Jagielski #include <vcl/sound.hxx>
34*b1cdbd2cSJim Jagielski #endif
35*b1cdbd2cSJim Jagielski 
36*b1cdbd2cSJim Jagielski #include <svtools/svlbox.hxx>
37*b1cdbd2cSJim Jagielski #include <svtools/svicnvw.hxx>
38*b1cdbd2cSJim Jagielski #include <svimpicn.hxx>
39*b1cdbd2cSJim Jagielski #ifndef _SVLBITM_HXX
40*b1cdbd2cSJim Jagielski #include <svtools/svlbitm.hxx>
41*b1cdbd2cSJim Jagielski #endif
42*b1cdbd2cSJim Jagielski #include <svl/svarray.hxx>
43*b1cdbd2cSJim Jagielski 
44*b1cdbd2cSJim Jagielski 
45*b1cdbd2cSJim Jagielski 
46*b1cdbd2cSJim Jagielski #define VIEWMODE_ICON 	0x0001	// Text unter Bitmap
47*b1cdbd2cSJim Jagielski #define VIEWMODE_NAME 	0x0002  // Text rechts neben Bitmap
48*b1cdbd2cSJim Jagielski #define VIEWMODE_TEXT 	0x0004  // Text ohne Bitmap
49*b1cdbd2cSJim Jagielski 
50*b1cdbd2cSJim Jagielski #define DD_SCROLL_PIXEL 10
51*b1cdbd2cSJim Jagielski 
52*b1cdbd2cSJim Jagielski // alle Angaben in Pixel
53*b1cdbd2cSJim Jagielski 
54*b1cdbd2cSJim Jagielski #define ICONVIEW_OFFS_BMP_STRING	3
55*b1cdbd2cSJim Jagielski 
56*b1cdbd2cSJim Jagielski // fuer das Bounding-Rectangle
57*b1cdbd2cSJim Jagielski #define LROFFS_BOUND				2
58*b1cdbd2cSJim Jagielski #define TBOFFS_BOUND				2
59*b1cdbd2cSJim Jagielski 
60*b1cdbd2cSJim Jagielski // fuer das Focus-Rectangle um Icons
61*b1cdbd2cSJim Jagielski #define LROFFS_ICON					2
62*b1cdbd2cSJim Jagielski #define TBOFFS_ICON					2
63*b1cdbd2cSJim Jagielski 
64*b1cdbd2cSJim Jagielski #define NAMEVIEW_OFFS_BMP_STRING	3
65*b1cdbd2cSJim Jagielski 
66*b1cdbd2cSJim Jagielski // Abstaende von Fensterraendern
67*b1cdbd2cSJim Jagielski #define LROFFS_WINBORDER			4
68*b1cdbd2cSJim Jagielski #define TBOFFS_WINBORDER			4
69*b1cdbd2cSJim Jagielski 
70*b1cdbd2cSJim Jagielski // Breitenoffset Highlight-Rect bei Text
71*b1cdbd2cSJim Jagielski #define LROFFS_TEXT					2
72*b1cdbd2cSJim Jagielski 
73*b1cdbd2cSJim Jagielski 
74*b1cdbd2cSJim Jagielski #define ICNVIEWDATA(xPtr) (SvIcnVwDataEntry*)(pView->GetViewDataEntry(xPtr))
75*b1cdbd2cSJim Jagielski #define ICNVIEWDATA2(xPtr) (SvIcnVwDataEntry*)(pView->pView->GetViewDataEntry(xPtr))
76*b1cdbd2cSJim Jagielski 
77*b1cdbd2cSJim Jagielski //--------------------------------------------------------------------------
78*b1cdbd2cSJim Jagielski //--------------------------------------------------------------------------
79*b1cdbd2cSJim Jagielski //--------------------------------------------------------------------------
80*b1cdbd2cSJim Jagielski // -------------------------------------------------------------------------
81*b1cdbd2cSJim Jagielski // Hilfsfunktionen von Thomas Hosemann zur mehrzeiligen Ausgabe von
82*b1cdbd2cSJim Jagielski // Strings. Die Funktionen werden spaeter in StarView integriert.
83*b1cdbd2cSJim Jagielski // -------------------------------------------------------------------------
84*b1cdbd2cSJim Jagielski //--------------------------------------------------------------------------
85*b1cdbd2cSJim Jagielski //--------------------------------------------------------------------------
86*b1cdbd2cSJim Jagielski //--------------------------------------------------------------------------
87*b1cdbd2cSJim Jagielski 
88*b1cdbd2cSJim Jagielski // keine doppelten Defines
89*b1cdbd2cSJim Jagielski #ifdef TEXT_DRAW_CLIP
90*b1cdbd2cSJim Jagielski #undef TEXT_DRAW_CLIP
91*b1cdbd2cSJim Jagielski #endif
92*b1cdbd2cSJim Jagielski #ifdef TEXT_DRAW_MULTILINE
93*b1cdbd2cSJim Jagielski #undef TEXT_DRAW_MULTILINE
94*b1cdbd2cSJim Jagielski #endif
95*b1cdbd2cSJim Jagielski #ifdef TEXT_DRAW_WORDBREAK
96*b1cdbd2cSJim Jagielski #undef TEXT_DRAW_WORDBREAK
97*b1cdbd2cSJim Jagielski #endif
98*b1cdbd2cSJim Jagielski 
99*b1cdbd2cSJim Jagielski // #define TEXT_DRAW_DISABLE           ((sal_uInt16)0x0001)
100*b1cdbd2cSJim Jagielski // #define TEXT_DRAW_3DLOOK            ((sal_uInt16)0x0002)
101*b1cdbd2cSJim Jagielski // #define TEXT_DRAW_MNEMONIC          ((sal_uInt16)0x0004)
102*b1cdbd2cSJim Jagielski #define TEXT_DRAW_LEFT              ((sal_uInt16)0x0010)
103*b1cdbd2cSJim Jagielski #define TEXT_DRAW_CENTER            ((sal_uInt16)0x0020)
104*b1cdbd2cSJim Jagielski #define TEXT_DRAW_RIGHT             ((sal_uInt16)0x0040)
105*b1cdbd2cSJim Jagielski #define TEXT_DRAW_TOP               ((sal_uInt16)0x0080)
106*b1cdbd2cSJim Jagielski #define TEXT_DRAW_VCENTER           ((sal_uInt16)0x0100)
107*b1cdbd2cSJim Jagielski #define TEXT_DRAW_BOTTOM            ((sal_uInt16)0x0200)
108*b1cdbd2cSJim Jagielski #define TEXT_DRAW_ENDELLIPSIS       ((sal_uInt16)0x0400)
109*b1cdbd2cSJim Jagielski #define TEXT_DRAW_PATHELLIPSIS      ((sal_uInt16)0x0800)
110*b1cdbd2cSJim Jagielski #define TEXT_DRAW_CLIP              ((sal_uInt16)0x1000)
111*b1cdbd2cSJim Jagielski #define TEXT_DRAW_MULTILINE         ((sal_uInt16)0x2000)
112*b1cdbd2cSJim Jagielski #define TEXT_DRAW_WORDBREAK         ((sal_uInt16)0x4000)
113*b1cdbd2cSJim Jagielski 
GetEllipsisString(OutputDevice * pDev,const XubString & rStr,long nMaxWidth,sal_uInt16 nStyle=TEXT_DRAW_ENDELLIPSIS)114*b1cdbd2cSJim Jagielski XubString GetEllipsisString( OutputDevice* pDev,
115*b1cdbd2cSJim Jagielski 							const XubString& rStr, long nMaxWidth,
116*b1cdbd2cSJim Jagielski 							sal_uInt16 nStyle = TEXT_DRAW_ENDELLIPSIS )
117*b1cdbd2cSJim Jagielski {
118*b1cdbd2cSJim Jagielski 	XubString aStr = rStr;
119*b1cdbd2cSJim Jagielski 
120*b1cdbd2cSJim Jagielski 	if ( nStyle & TEXT_DRAW_ENDELLIPSIS )
121*b1cdbd2cSJim Jagielski 	{
122*b1cdbd2cSJim Jagielski 		sal_uInt16 nIndex = pDev->GetTextBreak( rStr, nMaxWidth );
123*b1cdbd2cSJim Jagielski 		if ( nIndex != STRING_LEN )
124*b1cdbd2cSJim Jagielski 		{
125*b1cdbd2cSJim Jagielski 			aStr.Erase( nIndex );
126*b1cdbd2cSJim Jagielski 			if ( nIndex > 1 )
127*b1cdbd2cSJim Jagielski 			{
128*b1cdbd2cSJim Jagielski 				aStr.AppendAscii("...");
129*b1cdbd2cSJim Jagielski 				while ( aStr.Len() &&
130*b1cdbd2cSJim Jagielski 						(pDev->GetTextWidth( aStr ) > nMaxWidth) )
131*b1cdbd2cSJim Jagielski 				{
132*b1cdbd2cSJim Jagielski 					if ( (nIndex > 1) || (nIndex == aStr.Len()) )
133*b1cdbd2cSJim Jagielski 						nIndex--;
134*b1cdbd2cSJim Jagielski 					aStr.Erase( nIndex, 1 );
135*b1cdbd2cSJim Jagielski 				}
136*b1cdbd2cSJim Jagielski 			}
137*b1cdbd2cSJim Jagielski 
138*b1cdbd2cSJim Jagielski 			if ( !aStr.Len() && (nStyle & TEXT_DRAW_CLIP) )
139*b1cdbd2cSJim Jagielski 				aStr += rStr.GetChar( 0 );
140*b1cdbd2cSJim Jagielski 		}
141*b1cdbd2cSJim Jagielski 	}
142*b1cdbd2cSJim Jagielski 
143*b1cdbd2cSJim Jagielski 	return aStr;
144*b1cdbd2cSJim Jagielski }
145*b1cdbd2cSJim Jagielski 
146*b1cdbd2cSJim Jagielski class TextLineInfo
147*b1cdbd2cSJim Jagielski {
148*b1cdbd2cSJim Jagielski private:
149*b1cdbd2cSJim Jagielski 	long        mnWidth;
150*b1cdbd2cSJim Jagielski 	sal_uInt16      mnIndex;
151*b1cdbd2cSJim Jagielski 	sal_uInt16      mnLen;
152*b1cdbd2cSJim Jagielski 
153*b1cdbd2cSJim Jagielski public:
TextLineInfo(long nWidth,sal_uInt16 nIndex,sal_uInt16 nLen)154*b1cdbd2cSJim Jagielski 				TextLineInfo( long nWidth, sal_uInt16 nIndex, sal_uInt16 nLen )
155*b1cdbd2cSJim Jagielski 				{
156*b1cdbd2cSJim Jagielski 					mnWidth = nWidth;
157*b1cdbd2cSJim Jagielski 					mnIndex = nIndex;
158*b1cdbd2cSJim Jagielski 					mnLen   = nLen;
159*b1cdbd2cSJim Jagielski 				}
160*b1cdbd2cSJim Jagielski 
GetWidth() const161*b1cdbd2cSJim Jagielski 	long        GetWidth() const { return mnWidth; }
GetIndex() const162*b1cdbd2cSJim Jagielski 	sal_uInt16      GetIndex() const { return mnIndex; }
GetLen() const163*b1cdbd2cSJim Jagielski 	sal_uInt16      GetLen() const { return mnLen; }
164*b1cdbd2cSJim Jagielski };
165*b1cdbd2cSJim Jagielski 
166*b1cdbd2cSJim Jagielski #define MULTITEXTLINEINFO_RESIZE    16
167*b1cdbd2cSJim Jagielski typedef TextLineInfo* PTextLineInfo;
168*b1cdbd2cSJim Jagielski 
169*b1cdbd2cSJim Jagielski class MultiTextLineInfo
170*b1cdbd2cSJim Jagielski {
171*b1cdbd2cSJim Jagielski private:
172*b1cdbd2cSJim Jagielski 	PTextLineInfo*      mpLines;
173*b1cdbd2cSJim Jagielski 	sal_uInt16              mnLines;
174*b1cdbd2cSJim Jagielski 	sal_uInt16              mnSize;
175*b1cdbd2cSJim Jagielski 
176*b1cdbd2cSJim Jagielski public:
177*b1cdbd2cSJim Jagielski 						MultiTextLineInfo();
178*b1cdbd2cSJim Jagielski 						~MultiTextLineInfo();
179*b1cdbd2cSJim Jagielski 
180*b1cdbd2cSJim Jagielski 	void                AddLine( TextLineInfo* pLine );
181*b1cdbd2cSJim Jagielski 	void                Clear();
182*b1cdbd2cSJim Jagielski 
GetLine(sal_uInt16 nLine) const183*b1cdbd2cSJim Jagielski 	TextLineInfo*       GetLine( sal_uInt16 nLine ) const
184*b1cdbd2cSJim Jagielski 							{ return mpLines[nLine]; }
Count() const185*b1cdbd2cSJim Jagielski 	sal_uInt16              Count() const { return mnLines; }
186*b1cdbd2cSJim Jagielski 
187*b1cdbd2cSJim Jagielski private:
188*b1cdbd2cSJim Jagielski 						MultiTextLineInfo( const MultiTextLineInfo& );
189*b1cdbd2cSJim Jagielski 	MultiTextLineInfo&  operator=( const MultiTextLineInfo& );
190*b1cdbd2cSJim Jagielski };
191*b1cdbd2cSJim Jagielski 
MultiTextLineInfo()192*b1cdbd2cSJim Jagielski MultiTextLineInfo::MultiTextLineInfo()
193*b1cdbd2cSJim Jagielski {
194*b1cdbd2cSJim Jagielski 	mpLines         = new PTextLineInfo[MULTITEXTLINEINFO_RESIZE];
195*b1cdbd2cSJim Jagielski 	mnLines         = 0;
196*b1cdbd2cSJim Jagielski 	mnSize          = MULTITEXTLINEINFO_RESIZE;
197*b1cdbd2cSJim Jagielski }
198*b1cdbd2cSJim Jagielski 
~MultiTextLineInfo()199*b1cdbd2cSJim Jagielski MultiTextLineInfo::~MultiTextLineInfo()
200*b1cdbd2cSJim Jagielski {
201*b1cdbd2cSJim Jagielski 	for ( sal_uInt16 i = 0; i < mnLines; i++ )
202*b1cdbd2cSJim Jagielski 		delete mpLines[i];
203*b1cdbd2cSJim Jagielski 	delete [] mpLines;
204*b1cdbd2cSJim Jagielski }
205*b1cdbd2cSJim Jagielski 
AddLine(TextLineInfo * pLine)206*b1cdbd2cSJim Jagielski void MultiTextLineInfo::AddLine( TextLineInfo* pLine )
207*b1cdbd2cSJim Jagielski {
208*b1cdbd2cSJim Jagielski 	if ( mnSize == mnLines )
209*b1cdbd2cSJim Jagielski 	{
210*b1cdbd2cSJim Jagielski 		mnSize += MULTITEXTLINEINFO_RESIZE;
211*b1cdbd2cSJim Jagielski 		PTextLineInfo* pNewLines = new PTextLineInfo[mnSize];
212*b1cdbd2cSJim Jagielski 		memcpy( pNewLines, mpLines, mnLines*sizeof(PTextLineInfo) );
213*b1cdbd2cSJim Jagielski 		mpLines = pNewLines;
214*b1cdbd2cSJim Jagielski 	}
215*b1cdbd2cSJim Jagielski 
216*b1cdbd2cSJim Jagielski 	mpLines[mnLines] = pLine;
217*b1cdbd2cSJim Jagielski 	mnLines++;
218*b1cdbd2cSJim Jagielski }
219*b1cdbd2cSJim Jagielski 
Clear()220*b1cdbd2cSJim Jagielski void MultiTextLineInfo::Clear()
221*b1cdbd2cSJim Jagielski {
222*b1cdbd2cSJim Jagielski 	for ( sal_uInt16 i = 0; i < mnLines; i++ )
223*b1cdbd2cSJim Jagielski 		delete mpLines[i];
224*b1cdbd2cSJim Jagielski 	mnLines = 0;
225*b1cdbd2cSJim Jagielski }
226*b1cdbd2cSJim Jagielski 
227*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------
228*b1cdbd2cSJim Jagielski 
GetTextLines(OutputDevice * pDev,MultiTextLineInfo & rLineInfo,long nWidth,const XubString & rStr,sal_uInt16 nStyle=TEXT_DRAW_WORDBREAK)229*b1cdbd2cSJim Jagielski long GetTextLines( OutputDevice* pDev, MultiTextLineInfo& rLineInfo,
230*b1cdbd2cSJim Jagielski 				   long nWidth, const XubString& rStr,
231*b1cdbd2cSJim Jagielski 				   sal_uInt16 nStyle = TEXT_DRAW_WORDBREAK )
232*b1cdbd2cSJim Jagielski {
233*b1cdbd2cSJim Jagielski 	rLineInfo.Clear();
234*b1cdbd2cSJim Jagielski 	if ( !rStr.Len() )
235*b1cdbd2cSJim Jagielski 		return 0;
236*b1cdbd2cSJim Jagielski 	if ( nWidth <= 0 )
237*b1cdbd2cSJim Jagielski 		nWidth = 1;
238*b1cdbd2cSJim Jagielski 
239*b1cdbd2cSJim Jagielski 	sal_uInt16          nStartPos       = 0;                // Start-Position der Zeile
240*b1cdbd2cSJim Jagielski 	sal_uInt16          nLastLineLen    = 0;                // Zeilenlaenge bis zum vorherigen Wort
241*b1cdbd2cSJim Jagielski 	sal_uInt16          nLastWordPos    = 0;                // Position des letzten Wortanfangs
242*b1cdbd2cSJim Jagielski 	sal_uInt16          i               = 0;
243*b1cdbd2cSJim Jagielski 	sal_uInt16          nPos;                               // StartPositon der Zeile (nur Temp)
244*b1cdbd2cSJim Jagielski 	sal_uInt16          nLen;                               // Laenge der Zeile (nur Temp)
245*b1cdbd2cSJim Jagielski 	sal_uInt16          nStrLen         = rStr.Len();
246*b1cdbd2cSJim Jagielski 	long            nMaxLineWidth   = 0;                // Maximale Zeilenlaenge
247*b1cdbd2cSJim Jagielski 	long            nLineWidth;                         // Aktuelle Zeilenlaenge
248*b1cdbd2cSJim Jagielski 	long            nLastLineWidth  = 0;                // Zeilenlaenge der letzten Zeile
249*b1cdbd2cSJim Jagielski 	xub_Unicode          c;
250*b1cdbd2cSJim Jagielski 	xub_Unicode          c2;
251*b1cdbd2cSJim Jagielski 	const xub_Unicode*   pStr       = rStr.GetBuffer();
252*b1cdbd2cSJim Jagielski 	sal_Bool            bHardBreak      = sal_False;
253*b1cdbd2cSJim Jagielski 
254*b1cdbd2cSJim Jagielski 	do
255*b1cdbd2cSJim Jagielski 	{
256*b1cdbd2cSJim Jagielski 		c = pStr[i];
257*b1cdbd2cSJim Jagielski 
258*b1cdbd2cSJim Jagielski 		// Auf Zeilenende ermitteln
259*b1cdbd2cSJim Jagielski 		if ( (c == _CR) || (c == _LF) )
260*b1cdbd2cSJim Jagielski 			bHardBreak = sal_True;
261*b1cdbd2cSJim Jagielski 		else
262*b1cdbd2cSJim Jagielski 			bHardBreak = sal_False;
263*b1cdbd2cSJim Jagielski 
264*b1cdbd2cSJim Jagielski 		// Testen, ob ein Wortende erreicht ist
265*b1cdbd2cSJim Jagielski 		if ( bHardBreak || (i == nStrLen) ||
266*b1cdbd2cSJim Jagielski 			 (((c == ' ') || (c == '-')) && (nStyle & TEXT_DRAW_WORDBREAK)) )
267*b1cdbd2cSJim Jagielski 		{
268*b1cdbd2cSJim Jagielski 			nLen = i-nStartPos;
269*b1cdbd2cSJim Jagielski 			if ( c == '-' )
270*b1cdbd2cSJim Jagielski 				nLen++;
271*b1cdbd2cSJim Jagielski 			nLineWidth = pDev->GetTextWidth( rStr, nStartPos, nLen );
272*b1cdbd2cSJim Jagielski 
273*b1cdbd2cSJim Jagielski 			// Findet ein Zeilenumbruch statt
274*b1cdbd2cSJim Jagielski 			if ( bHardBreak || (i == nStrLen) ||
275*b1cdbd2cSJim Jagielski 				((nLineWidth >= nWidth) && (nStyle & TEXT_DRAW_WORDBREAK)) )
276*b1cdbd2cSJim Jagielski 			{
277*b1cdbd2cSJim Jagielski 				nPos = nStartPos;
278*b1cdbd2cSJim Jagielski 
279*b1cdbd2cSJim Jagielski 				if ( (nLineWidth >= nWidth) && (nStyle & TEXT_DRAW_WORDBREAK) )
280*b1cdbd2cSJim Jagielski 				{
281*b1cdbd2cSJim Jagielski 					nLineWidth      = nLastLineWidth;
282*b1cdbd2cSJim Jagielski 					nLen            = nLastLineLen;
283*b1cdbd2cSJim Jagielski 					nStartPos       = nLastWordPos;
284*b1cdbd2cSJim Jagielski 					nLastLineLen    = i-nStartPos;
285*b1cdbd2cSJim Jagielski 					nLastWordPos    = nStartPos+nLastLineLen+1;
286*b1cdbd2cSJim Jagielski 					if ( c == '-' )
287*b1cdbd2cSJim Jagielski 						nLastLineLen++;
288*b1cdbd2cSJim Jagielski 					else if ( bHardBreak && (i > nStartPos) )
289*b1cdbd2cSJim Jagielski 						i--;
290*b1cdbd2cSJim Jagielski 				}
291*b1cdbd2cSJim Jagielski 				else
292*b1cdbd2cSJim Jagielski 				{
293*b1cdbd2cSJim Jagielski 					nStartPos = i;
294*b1cdbd2cSJim Jagielski 					// Zeilenende-Zeichen und '-' beruecksichtigen
295*b1cdbd2cSJim Jagielski 					if ( bHardBreak )
296*b1cdbd2cSJim Jagielski 					{
297*b1cdbd2cSJim Jagielski 						nStartPos++;
298*b1cdbd2cSJim Jagielski 						c2 = pStr[i+1];
299*b1cdbd2cSJim Jagielski 						if ( (c != c2) && ((c2 == _CR) || (c2 == _LF)) )
300*b1cdbd2cSJim Jagielski 						{
301*b1cdbd2cSJim Jagielski 							nStartPos++;
302*b1cdbd2cSJim Jagielski 							i++;
303*b1cdbd2cSJim Jagielski 						}
304*b1cdbd2cSJim Jagielski 					}
305*b1cdbd2cSJim Jagielski 					else if ( c != '-' )
306*b1cdbd2cSJim Jagielski 						nStartPos++;
307*b1cdbd2cSJim Jagielski 					nLastWordPos    = nStartPos;
308*b1cdbd2cSJim Jagielski 					nLastLineLen    = 0;
309*b1cdbd2cSJim Jagielski 				}
310*b1cdbd2cSJim Jagielski 
311*b1cdbd2cSJim Jagielski 				if ( nLineWidth > nMaxLineWidth )
312*b1cdbd2cSJim Jagielski 					nMaxLineWidth = nLineWidth;
313*b1cdbd2cSJim Jagielski 
314*b1cdbd2cSJim Jagielski 				if ( nLen || bHardBreak  )
315*b1cdbd2cSJim Jagielski 					rLineInfo.AddLine( new TextLineInfo( nLineWidth, nPos, nLen ) );
316*b1cdbd2cSJim Jagielski 
317*b1cdbd2cSJim Jagielski 				// Testen, ob aktuelles Wort noch auf die Zeile passt,
318*b1cdbd2cSJim Jagielski 				// denn ansonsten mueessen wir es auftrennen
319*b1cdbd2cSJim Jagielski 				if ( nLastLineLen )
320*b1cdbd2cSJim Jagielski 				{
321*b1cdbd2cSJim Jagielski 					nLineWidth = pDev->GetTextWidth( rStr, nStartPos, nLastLineLen );
322*b1cdbd2cSJim Jagielski 					if ( nLineWidth > nWidth )
323*b1cdbd2cSJim Jagielski 					{
324*b1cdbd2cSJim Jagielski 						// Wenn ein Wortumbruch in einem Wort stattfindet,
325*b1cdbd2cSJim Jagielski 						// ist die maximale Zeilenlaenge die Laenge
326*b1cdbd2cSJim Jagielski 						// des laengsten Wortes
327*b1cdbd2cSJim Jagielski 						if ( nLineWidth > nMaxLineWidth )
328*b1cdbd2cSJim Jagielski 							nMaxLineWidth = nLineWidth;
329*b1cdbd2cSJim Jagielski 
330*b1cdbd2cSJim Jagielski 						// Solange Wort auftrennen, bis es auf eine Zeile passt
331*b1cdbd2cSJim Jagielski 						do
332*b1cdbd2cSJim Jagielski 						{
333*b1cdbd2cSJim Jagielski 							nPos = pDev->GetTextBreak( rStr, nWidth, nStartPos, nLastLineLen );
334*b1cdbd2cSJim Jagielski 							nLen = nPos-nStartPos;
335*b1cdbd2cSJim Jagielski 							if ( !nLen )
336*b1cdbd2cSJim Jagielski 							{
337*b1cdbd2cSJim Jagielski 								nPos++;
338*b1cdbd2cSJim Jagielski 								nLen++;
339*b1cdbd2cSJim Jagielski 							}
340*b1cdbd2cSJim Jagielski 							nLineWidth = pDev->GetTextWidth( rStr, nStartPos, nLen );
341*b1cdbd2cSJim Jagielski 							rLineInfo.AddLine( new TextLineInfo( nLineWidth, nStartPos, nLen ) );
342*b1cdbd2cSJim Jagielski 							nStartPos       = nPos;
343*b1cdbd2cSJim Jagielski 							nLastLineLen = nLastLineLen - nLen;
344*b1cdbd2cSJim Jagielski 							nLineWidth = pDev->GetTextWidth( rStr, nStartPos, nLastLineLen );
345*b1cdbd2cSJim Jagielski 						}
346*b1cdbd2cSJim Jagielski 						while ( nLineWidth > nWidth );
347*b1cdbd2cSJim Jagielski 					}
348*b1cdbd2cSJim Jagielski 					nLastLineWidth = nLineWidth;
349*b1cdbd2cSJim Jagielski 
350*b1cdbd2cSJim Jagielski 					// Bei Stringende muessen wir die letzte Zeile auch noch
351*b1cdbd2cSJim Jagielski 					// dranhaengen
352*b1cdbd2cSJim Jagielski 					if ( (i == nStrLen) && nLastLineLen )
353*b1cdbd2cSJim Jagielski 						rLineInfo.AddLine( new TextLineInfo( nLastLineWidth, nStartPos, nLastLineLen ) );
354*b1cdbd2cSJim Jagielski 				}
355*b1cdbd2cSJim Jagielski 				else
356*b1cdbd2cSJim Jagielski 					nLastLineWidth = 0;
357*b1cdbd2cSJim Jagielski 			}
358*b1cdbd2cSJim Jagielski 			else
359*b1cdbd2cSJim Jagielski 			{
360*b1cdbd2cSJim Jagielski 				nLastLineWidth  = nLineWidth;
361*b1cdbd2cSJim Jagielski 				nLastLineLen    = nLen;
362*b1cdbd2cSJim Jagielski 				nLastWordPos    = nStartPos+nLastLineLen;
363*b1cdbd2cSJim Jagielski 				if ( c != '-' )
364*b1cdbd2cSJim Jagielski 					nLastWordPos++;
365*b1cdbd2cSJim Jagielski 			}
366*b1cdbd2cSJim Jagielski 		}
367*b1cdbd2cSJim Jagielski 
368*b1cdbd2cSJim Jagielski 		i++;
369*b1cdbd2cSJim Jagielski 	}
370*b1cdbd2cSJim Jagielski 	while ( i <= nStrLen );
371*b1cdbd2cSJim Jagielski 
372*b1cdbd2cSJim Jagielski 	return nMaxLineWidth;
373*b1cdbd2cSJim Jagielski }
374*b1cdbd2cSJim Jagielski 
375*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------
376*b1cdbd2cSJim Jagielski 
GetTextLines(OutputDevice * pDev,const Rectangle & rRect,const XubString & rStr,sal_uInt16 nStyle=TEXT_DRAW_WORDBREAK,long * pMaxWidth=NULL)377*b1cdbd2cSJim Jagielski sal_uInt16 GetTextLines( OutputDevice* pDev, const Rectangle& rRect,
378*b1cdbd2cSJim Jagielski 					 const XubString& rStr,
379*b1cdbd2cSJim Jagielski 					 sal_uInt16 nStyle = TEXT_DRAW_WORDBREAK,
380*b1cdbd2cSJim Jagielski 					 long* pMaxWidth = NULL )
381*b1cdbd2cSJim Jagielski {
382*b1cdbd2cSJim Jagielski 	MultiTextLineInfo aMultiLineInfo;
383*b1cdbd2cSJim Jagielski 	long nMaxWidth = GetTextLines( pDev, aMultiLineInfo,
384*b1cdbd2cSJim Jagielski 								   rRect.GetWidth(), rStr, nStyle );
385*b1cdbd2cSJim Jagielski 	if ( pMaxWidth )
386*b1cdbd2cSJim Jagielski 		*pMaxWidth = nMaxWidth;
387*b1cdbd2cSJim Jagielski 	return aMultiLineInfo.Count();
388*b1cdbd2cSJim Jagielski }
389*b1cdbd2cSJim Jagielski 
390*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------
391*b1cdbd2cSJim Jagielski 
GetTextRect(OutputDevice * pDev,const Rectangle & rRect,const XubString & rStr,sal_uInt16 nStyle=TEXT_DRAW_WORDBREAK)392*b1cdbd2cSJim Jagielski Rectangle GetTextRect( OutputDevice* pDev, const Rectangle& rRect,
393*b1cdbd2cSJim Jagielski 					   const XubString& rStr,
394*b1cdbd2cSJim Jagielski 					   sal_uInt16 nStyle = TEXT_DRAW_WORDBREAK )
395*b1cdbd2cSJim Jagielski {
396*b1cdbd2cSJim Jagielski 	Rectangle           aRect = rRect;
397*b1cdbd2cSJim Jagielski 	sal_uInt16              nLines;
398*b1cdbd2cSJim Jagielski 	long                nWidth = rRect.GetWidth();
399*b1cdbd2cSJim Jagielski 	long                nMaxWidth;
400*b1cdbd2cSJim Jagielski 	long                nTextHeight;
401*b1cdbd2cSJim Jagielski 
402*b1cdbd2cSJim Jagielski 	if ( nStyle & TEXT_DRAW_MULTILINE )
403*b1cdbd2cSJim Jagielski 	{
404*b1cdbd2cSJim Jagielski 		MultiTextLineInfo   aMultiLineInfo;
405*b1cdbd2cSJim Jagielski 		TextLineInfo*       pLineInfo;
406*b1cdbd2cSJim Jagielski 		sal_uInt16              nFormatLines;
407*b1cdbd2cSJim Jagielski 
408*b1cdbd2cSJim Jagielski 		nMaxWidth = 0;
409*b1cdbd2cSJim Jagielski 		GetTextLines( pDev, aMultiLineInfo, nWidth, rStr, nStyle );
410*b1cdbd2cSJim Jagielski 		nFormatLines = aMultiLineInfo.Count();
411*b1cdbd2cSJim Jagielski 		nTextHeight = pDev->GetTextHeight();
412*b1cdbd2cSJim Jagielski 		nLines = (sal_uInt16)(aRect.GetHeight()/nTextHeight);
413*b1cdbd2cSJim Jagielski 		if ( nFormatLines <= nLines )
414*b1cdbd2cSJim Jagielski 			nLines = nFormatLines;
415*b1cdbd2cSJim Jagielski 		else
416*b1cdbd2cSJim Jagielski 		{
417*b1cdbd2cSJim Jagielski 			if ( !(nStyle & TEXT_DRAW_ENDELLIPSIS) )
418*b1cdbd2cSJim Jagielski 				nLines = nFormatLines;
419*b1cdbd2cSJim Jagielski 			else
420*b1cdbd2cSJim Jagielski 				nMaxWidth = nWidth;
421*b1cdbd2cSJim Jagielski 		}
422*b1cdbd2cSJim Jagielski 		for ( sal_uInt16 i = 0; i < nLines; i++ )
423*b1cdbd2cSJim Jagielski 		{
424*b1cdbd2cSJim Jagielski 			pLineInfo = aMultiLineInfo.GetLine( i );
425*b1cdbd2cSJim Jagielski 			if ( pLineInfo->GetWidth() > nMaxWidth )
426*b1cdbd2cSJim Jagielski 				nMaxWidth = pLineInfo->GetWidth();
427*b1cdbd2cSJim Jagielski 		}
428*b1cdbd2cSJim Jagielski 	}
429*b1cdbd2cSJim Jagielski 	else
430*b1cdbd2cSJim Jagielski 	{
431*b1cdbd2cSJim Jagielski 		nLines          = 1;
432*b1cdbd2cSJim Jagielski 		nMaxWidth       = pDev->GetTextWidth( rStr );
433*b1cdbd2cSJim Jagielski 		nTextHeight     = pDev->GetTextHeight();
434*b1cdbd2cSJim Jagielski 		if ( (nMaxWidth > nWidth) && (nStyle & TEXT_DRAW_ENDELLIPSIS) )
435*b1cdbd2cSJim Jagielski 			nMaxWidth = nWidth;
436*b1cdbd2cSJim Jagielski 	}
437*b1cdbd2cSJim Jagielski 
438*b1cdbd2cSJim Jagielski 	if ( nStyle & TEXT_DRAW_RIGHT )
439*b1cdbd2cSJim Jagielski 		aRect.Left() = aRect.Right()-nMaxWidth+1;
440*b1cdbd2cSJim Jagielski 	else if ( nStyle & TEXT_DRAW_CENTER )
441*b1cdbd2cSJim Jagielski 	{
442*b1cdbd2cSJim Jagielski 		aRect.Left() += (nWidth-nMaxWidth)/2;
443*b1cdbd2cSJim Jagielski 		aRect.Right() = aRect.Left()+nMaxWidth-1;
444*b1cdbd2cSJim Jagielski 	}
445*b1cdbd2cSJim Jagielski 	else
446*b1cdbd2cSJim Jagielski 		aRect.Right() = aRect.Left()+nMaxWidth-1;
447*b1cdbd2cSJim Jagielski 
448*b1cdbd2cSJim Jagielski 	if ( nStyle & TEXT_DRAW_BOTTOM )
449*b1cdbd2cSJim Jagielski 		aRect.Top() = aRect.Bottom()-(nTextHeight*nLines)+1;
450*b1cdbd2cSJim Jagielski 	else if ( nStyle & TEXT_DRAW_VCENTER )
451*b1cdbd2cSJim Jagielski 	{
452*b1cdbd2cSJim Jagielski 		aRect.Top()   += (aRect.GetHeight()-(nTextHeight*nLines))/2;
453*b1cdbd2cSJim Jagielski 		aRect.Bottom() = aRect.Top()+(nTextHeight*nLines)-1;
454*b1cdbd2cSJim Jagielski 	}
455*b1cdbd2cSJim Jagielski 	else
456*b1cdbd2cSJim Jagielski 		aRect.Bottom() = aRect.Top()+(nTextHeight*nLines)-1;
457*b1cdbd2cSJim Jagielski 
458*b1cdbd2cSJim Jagielski 	return aRect;
459*b1cdbd2cSJim Jagielski }
460*b1cdbd2cSJim Jagielski 
461*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------
462*b1cdbd2cSJim Jagielski 
DrawText(OutputDevice * pDev,const Rectangle & rRect,const XubString & rStr,sal_uInt16 nStyle=0)463*b1cdbd2cSJim Jagielski void DrawText( OutputDevice* pDev, const Rectangle& rRect,
464*b1cdbd2cSJim Jagielski 			   const XubString& rStr, sal_uInt16 nStyle = 0 )
465*b1cdbd2cSJim Jagielski {
466*b1cdbd2cSJim Jagielski 	if ( !rStr.Len() || rRect.IsEmpty() )
467*b1cdbd2cSJim Jagielski 		return;
468*b1cdbd2cSJim Jagielski 
469*b1cdbd2cSJim Jagielski 	Point       aPos    = rRect.TopLeft();
470*b1cdbd2cSJim Jagielski 	long        nWidth  = rRect.GetWidth();
471*b1cdbd2cSJim Jagielski 	long        nHeight = rRect.GetHeight();
472*b1cdbd2cSJim Jagielski 	FontAlign   eAlign  = pDev->GetFont().GetAlign();
473*b1cdbd2cSJim Jagielski 
474*b1cdbd2cSJim Jagielski 	if ( ((nWidth <= 0) || (nHeight <= 0)) && (nStyle & TEXT_DRAW_CLIP) )
475*b1cdbd2cSJim Jagielski 		return;
476*b1cdbd2cSJim Jagielski 
477*b1cdbd2cSJim Jagielski 	// Mehrzeiligen Text behandeln wir anders
478*b1cdbd2cSJim Jagielski 	if ( nStyle & TEXT_DRAW_MULTILINE )
479*b1cdbd2cSJim Jagielski 	{
480*b1cdbd2cSJim Jagielski 		String              aLastLine;
481*b1cdbd2cSJim Jagielski 		Region              aOldRegion;
482*b1cdbd2cSJim Jagielski 		MultiTextLineInfo   aMultiLineInfo;
483*b1cdbd2cSJim Jagielski 		TextLineInfo*       pLineInfo;
484*b1cdbd2cSJim Jagielski 		long                nTextHeight     = pDev->GetTextHeight();
485*b1cdbd2cSJim Jagielski 		long                nMaxTextWidth;
486*b1cdbd2cSJim Jagielski 		sal_uInt16              i;
487*b1cdbd2cSJim Jagielski 		sal_uInt16              nLines          = (sal_uInt16)(nHeight/nTextHeight);
488*b1cdbd2cSJim Jagielski 		sal_uInt16              nFormatLines;
489*b1cdbd2cSJim Jagielski 		sal_Bool                bIsClipRegion = sal_False;
490*b1cdbd2cSJim Jagielski 		nMaxTextWidth = GetTextLines( pDev, aMultiLineInfo, nWidth, rStr, nStyle );
491*b1cdbd2cSJim Jagielski 
492*b1cdbd2cSJim Jagielski 		nFormatLines = aMultiLineInfo.Count();
493*b1cdbd2cSJim Jagielski 		if ( nFormatLines > nLines )
494*b1cdbd2cSJim Jagielski 		{
495*b1cdbd2cSJim Jagielski 			if ( nStyle & TEXT_DRAW_ENDELLIPSIS )
496*b1cdbd2cSJim Jagielski 			{
497*b1cdbd2cSJim Jagielski 				// Letzte Zeile zusammenbauen und kuerzen
498*b1cdbd2cSJim Jagielski 				nFormatLines = nLines-1;
499*b1cdbd2cSJim Jagielski 				pLineInfo = aMultiLineInfo.GetLine( nFormatLines );
500*b1cdbd2cSJim Jagielski 				aLastLine = rStr.Copy( pLineInfo->GetIndex() );
501*b1cdbd2cSJim Jagielski 				aLastLine.ConvertLineEnd( LINEEND_LF );
502*b1cdbd2cSJim Jagielski 				aLastLine.SearchAndReplace( _LF, ' ' );
503*b1cdbd2cSJim Jagielski 				aLastLine = GetEllipsisString( pDev, aLastLine, nWidth, nStyle );
504*b1cdbd2cSJim Jagielski 				nStyle &= ~(TEXT_DRAW_VCENTER | TEXT_DRAW_BOTTOM);
505*b1cdbd2cSJim Jagielski 				nStyle |= TEXT_DRAW_TOP;
506*b1cdbd2cSJim Jagielski 			}
507*b1cdbd2cSJim Jagielski 		}
508*b1cdbd2cSJim Jagielski 		else
509*b1cdbd2cSJim Jagielski 		{
510*b1cdbd2cSJim Jagielski 			if ( nMaxTextWidth <= nWidth )
511*b1cdbd2cSJim Jagielski 				nStyle &= ~TEXT_DRAW_CLIP;
512*b1cdbd2cSJim Jagielski 		}
513*b1cdbd2cSJim Jagielski 
514*b1cdbd2cSJim Jagielski 		// Clipping setzen
515*b1cdbd2cSJim Jagielski 		if ( nStyle & TEXT_DRAW_CLIP )
516*b1cdbd2cSJim Jagielski 		{
517*b1cdbd2cSJim Jagielski 			bIsClipRegion = pDev->IsClipRegion();
518*b1cdbd2cSJim Jagielski 			if ( bIsClipRegion )
519*b1cdbd2cSJim Jagielski 			{
520*b1cdbd2cSJim Jagielski 				aOldRegion = pDev->GetClipRegion();
521*b1cdbd2cSJim Jagielski 				pDev->IntersectClipRegion( rRect );
522*b1cdbd2cSJim Jagielski 			}
523*b1cdbd2cSJim Jagielski 			else
524*b1cdbd2cSJim Jagielski 			{
525*b1cdbd2cSJim Jagielski 				Region aRegion( rRect );
526*b1cdbd2cSJim Jagielski 				pDev->SetClipRegion( aRegion );
527*b1cdbd2cSJim Jagielski 			}
528*b1cdbd2cSJim Jagielski 		}
529*b1cdbd2cSJim Jagielski 
530*b1cdbd2cSJim Jagielski 		// Vertikales Alignment
531*b1cdbd2cSJim Jagielski 		if ( nStyle & TEXT_DRAW_BOTTOM )
532*b1cdbd2cSJim Jagielski 			aPos.Y() += nHeight-(nFormatLines*nTextHeight);
533*b1cdbd2cSJim Jagielski 		else if ( nStyle & TEXT_DRAW_VCENTER )
534*b1cdbd2cSJim Jagielski 			aPos.Y() += (nHeight-(nFormatLines*nTextHeight))/2;
535*b1cdbd2cSJim Jagielski 
536*b1cdbd2cSJim Jagielski 		// Font Alignment
537*b1cdbd2cSJim Jagielski 		if ( eAlign == ALIGN_BOTTOM )
538*b1cdbd2cSJim Jagielski 			aPos.Y() += nTextHeight;
539*b1cdbd2cSJim Jagielski 		else if ( eAlign == ALIGN_BASELINE )
540*b1cdbd2cSJim Jagielski 			aPos.Y() += pDev->GetFontMetric().GetAscent();
541*b1cdbd2cSJim Jagielski 
542*b1cdbd2cSJim Jagielski 		// Alle Zeilen ausgeben, bis auf die letzte
543*b1cdbd2cSJim Jagielski 		for ( i = 0; i < nFormatLines; i++ )
544*b1cdbd2cSJim Jagielski 		{
545*b1cdbd2cSJim Jagielski 			pLineInfo = aMultiLineInfo.GetLine( i );
546*b1cdbd2cSJim Jagielski 			if ( nStyle & TEXT_DRAW_RIGHT )
547*b1cdbd2cSJim Jagielski 				aPos.X() += nWidth-pLineInfo->GetWidth();
548*b1cdbd2cSJim Jagielski 			else if ( nStyle & TEXT_DRAW_CENTER )
549*b1cdbd2cSJim Jagielski 				aPos.X() += (nWidth-pLineInfo->GetWidth())/2;
550*b1cdbd2cSJim Jagielski 			pDev->DrawText( aPos, rStr, pLineInfo->GetIndex(), pLineInfo->GetLen() );
551*b1cdbd2cSJim Jagielski 			aPos.Y() += nTextHeight;
552*b1cdbd2cSJim Jagielski 			aPos.X() = rRect.Left();
553*b1cdbd2cSJim Jagielski 		}
554*b1cdbd2cSJim Jagielski 
555*b1cdbd2cSJim Jagielski 		// Gibt es noch eine letzte Zeile, dann diese linksbuendig ausgeben,
556*b1cdbd2cSJim Jagielski 		// da die Zeile gekuerzt wurde
557*b1cdbd2cSJim Jagielski 		if ( aLastLine.Len() )
558*b1cdbd2cSJim Jagielski 			pDev->DrawText( aPos, aLastLine );
559*b1cdbd2cSJim Jagielski 
560*b1cdbd2cSJim Jagielski 		// Clipping zuruecksetzen
561*b1cdbd2cSJim Jagielski 		if ( nStyle & TEXT_DRAW_CLIP )
562*b1cdbd2cSJim Jagielski 		{
563*b1cdbd2cSJim Jagielski 			if ( bIsClipRegion )
564*b1cdbd2cSJim Jagielski 				pDev->SetClipRegion( aOldRegion );
565*b1cdbd2cSJim Jagielski 			else
566*b1cdbd2cSJim Jagielski 				pDev->SetClipRegion();
567*b1cdbd2cSJim Jagielski 		}
568*b1cdbd2cSJim Jagielski 	}
569*b1cdbd2cSJim Jagielski 	else
570*b1cdbd2cSJim Jagielski 	{
571*b1cdbd2cSJim Jagielski 		XubString    aStr = rStr;
572*b1cdbd2cSJim Jagielski 		Size        aTextSize(pDev->GetTextWidth( aStr ), pDev->GetTextHeight());
573*b1cdbd2cSJim Jagielski 
574*b1cdbd2cSJim Jagielski 		// Evt. Text kuerzen
575*b1cdbd2cSJim Jagielski 		if ( aTextSize.Width() > nWidth )
576*b1cdbd2cSJim Jagielski 		{
577*b1cdbd2cSJim Jagielski 			if ( nStyle & TEXT_DRAW_ENDELLIPSIS )
578*b1cdbd2cSJim Jagielski 			{
579*b1cdbd2cSJim Jagielski 				aStr = GetEllipsisString( pDev, rStr, nWidth, nStyle );
580*b1cdbd2cSJim Jagielski 				nStyle &= ~(TEXT_DRAW_CENTER | TEXT_DRAW_RIGHT);
581*b1cdbd2cSJim Jagielski 				nStyle |= TEXT_DRAW_LEFT;
582*b1cdbd2cSJim Jagielski 				aTextSize.Width() = pDev->GetTextWidth(aStr);
583*b1cdbd2cSJim Jagielski 			}
584*b1cdbd2cSJim Jagielski 		}
585*b1cdbd2cSJim Jagielski 		else
586*b1cdbd2cSJim Jagielski 		{
587*b1cdbd2cSJim Jagielski 			if ( aTextSize.Height() <= nHeight )
588*b1cdbd2cSJim Jagielski 				nStyle &= ~TEXT_DRAW_CLIP;
589*b1cdbd2cSJim Jagielski 		}
590*b1cdbd2cSJim Jagielski 
591*b1cdbd2cSJim Jagielski 		// Vertikales Alignment
592*b1cdbd2cSJim Jagielski 		if ( nStyle & TEXT_DRAW_RIGHT )
593*b1cdbd2cSJim Jagielski 			aPos.X() += nWidth-aTextSize.Width();
594*b1cdbd2cSJim Jagielski 		else if ( nStyle & TEXT_DRAW_CENTER )
595*b1cdbd2cSJim Jagielski 			aPos.X() += (nWidth-aTextSize.Width())/2;
596*b1cdbd2cSJim Jagielski 
597*b1cdbd2cSJim Jagielski 		// Font Alignment
598*b1cdbd2cSJim Jagielski 		if ( eAlign == ALIGN_BOTTOM )
599*b1cdbd2cSJim Jagielski 			aPos.Y() += aTextSize.Height();
600*b1cdbd2cSJim Jagielski 		else if ( eAlign == ALIGN_BASELINE )
601*b1cdbd2cSJim Jagielski 			aPos.Y() += pDev->GetFontMetric().GetAscent();
602*b1cdbd2cSJim Jagielski 
603*b1cdbd2cSJim Jagielski 		if ( nStyle & TEXT_DRAW_BOTTOM )
604*b1cdbd2cSJim Jagielski 			aPos.Y() += nHeight-aTextSize.Height();
605*b1cdbd2cSJim Jagielski 		else if ( nStyle & TEXT_DRAW_VCENTER )
606*b1cdbd2cSJim Jagielski 			aPos.Y() += (nHeight-aTextSize.Height())/2;
607*b1cdbd2cSJim Jagielski 
608*b1cdbd2cSJim Jagielski 		if ( nStyle & TEXT_DRAW_CLIP )
609*b1cdbd2cSJim Jagielski 		{
610*b1cdbd2cSJim Jagielski 			sal_Bool bIsClipRegion = pDev->IsClipRegion();
611*b1cdbd2cSJim Jagielski 			if ( bIsClipRegion )
612*b1cdbd2cSJim Jagielski 			{
613*b1cdbd2cSJim Jagielski 				Region aOldRegion = pDev->GetClipRegion();
614*b1cdbd2cSJim Jagielski 				pDev->IntersectClipRegion( rRect );
615*b1cdbd2cSJim Jagielski 				pDev->DrawText( aPos, aStr );
616*b1cdbd2cSJim Jagielski 				pDev->SetClipRegion( aOldRegion );
617*b1cdbd2cSJim Jagielski 			}
618*b1cdbd2cSJim Jagielski 			else
619*b1cdbd2cSJim Jagielski 			{
620*b1cdbd2cSJim Jagielski 				Region aRegion( rRect );
621*b1cdbd2cSJim Jagielski 				pDev->SetClipRegion( aRegion );
622*b1cdbd2cSJim Jagielski 				pDev->DrawText( aPos, aStr );
623*b1cdbd2cSJim Jagielski 				pDev->SetClipRegion();
624*b1cdbd2cSJim Jagielski 			}
625*b1cdbd2cSJim Jagielski 		}
626*b1cdbd2cSJim Jagielski 		else
627*b1cdbd2cSJim Jagielski 			pDev->DrawText( aPos, aStr );
628*b1cdbd2cSJim Jagielski 	}
629*b1cdbd2cSJim Jagielski }
630*b1cdbd2cSJim Jagielski 
631*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------
632*b1cdbd2cSJim Jagielski 
633*b1cdbd2cSJim Jagielski 
634*b1cdbd2cSJim Jagielski //--------------------------------------------------------------------------
635*b1cdbd2cSJim Jagielski //--------------------------------------------------------------------------
636*b1cdbd2cSJim Jagielski //--------------------------------------------------------------------------
637*b1cdbd2cSJim Jagielski 
638*b1cdbd2cSJim Jagielski 
639*b1cdbd2cSJim Jagielski #define DRAWTEXT_FLAGS (TEXT_DRAW_CENTER|TEXT_DRAW_TOP|TEXT_DRAW_ENDELLIPSIS|\
640*b1cdbd2cSJim Jagielski 						TEXT_DRAW_CLIP|TEXT_DRAW_MULTILINE|TEXT_DRAW_WORDBREAK)
641*b1cdbd2cSJim Jagielski 
642*b1cdbd2cSJim Jagielski 
643*b1cdbd2cSJim Jagielski class ImpIcnCursor
644*b1cdbd2cSJim Jagielski {
645*b1cdbd2cSJim Jagielski 	SvImpIconView*	pView;
646*b1cdbd2cSJim Jagielski 	SvPtrarr* 		pColumns;
647*b1cdbd2cSJim Jagielski 	SvPtrarr* 		pRows;
648*b1cdbd2cSJim Jagielski 	sal_Bool*			pGridMap;
649*b1cdbd2cSJim Jagielski 	long			nGridDX, nGridDY;
650*b1cdbd2cSJim Jagielski 	long			nGridCols, nGridRows;
651*b1cdbd2cSJim Jagielski 	long			nCols;
652*b1cdbd2cSJim Jagielski 	long			nRows;
653*b1cdbd2cSJim Jagielski 	short 			nDeltaWidth;
654*b1cdbd2cSJim Jagielski 	short 			nDeltaHeight;
655*b1cdbd2cSJim Jagielski 	SvLBoxEntry* 	pCurEntry;
656*b1cdbd2cSJim Jagielski 	void 			SetDeltas();
657*b1cdbd2cSJim Jagielski 	void 			ImplCreate();
Create()658*b1cdbd2cSJim Jagielski 	void 			Create() {	if( !pColumns )	ImplCreate(); }
659*b1cdbd2cSJim Jagielski 
660*b1cdbd2cSJim Jagielski 	sal_uInt16 			GetSortListPos( SvPtrarr* pList, long nValue, int bVertical);
661*b1cdbd2cSJim Jagielski 	SvLBoxEntry* 	SearchCol(sal_uInt16 nCol,sal_uInt16 nTop,sal_uInt16 nBottom,sal_uInt16 nPref,
662*b1cdbd2cSJim Jagielski 						sal_Bool bDown, sal_Bool bSimple );
663*b1cdbd2cSJim Jagielski 	SvLBoxEntry* 	SearchRow(sal_uInt16 nRow,sal_uInt16 nRight,sal_uInt16 nLeft,sal_uInt16 nPref,
664*b1cdbd2cSJim Jagielski 						sal_Bool bRight, sal_Bool bSimple );
665*b1cdbd2cSJim Jagielski 
666*b1cdbd2cSJim Jagielski 	void			ExpandGrid();
667*b1cdbd2cSJim Jagielski 	void			CreateGridMap();
668*b1cdbd2cSJim Jagielski 	// Rueckgabe sal_False: Eintrag liegt nicht in der GridMap. rGridx,y werden
669*b1cdbd2cSJim Jagielski 	// dann an nGridCols, nGridRows geclippt
670*b1cdbd2cSJim Jagielski 	sal_Bool	 		GetGrid( const Point& rDocPos, sal_uInt16& rGridX, sal_uInt16& rGridY ) const;
SetGridUsed(sal_uInt16 nDX,sal_uInt16 nDY,sal_Bool bUsed)671*b1cdbd2cSJim Jagielski 	void			SetGridUsed( sal_uInt16 nDX, sal_uInt16 nDY, sal_Bool bUsed )
672*b1cdbd2cSJim Jagielski 					{
673*b1cdbd2cSJim Jagielski 						pGridMap[ (nDY * nGridCols) + nDX ] = bUsed;
674*b1cdbd2cSJim Jagielski 					}
IsGridUsed(sal_uInt16 nDX,sal_uInt16 nDY)675*b1cdbd2cSJim Jagielski 	sal_Bool			IsGridUsed( sal_uInt16 nDX, sal_uInt16 nDY )
676*b1cdbd2cSJim Jagielski 					{
677*b1cdbd2cSJim Jagielski 						return pGridMap[ (nDY * nGridCols) + nDX ];
678*b1cdbd2cSJim Jagielski 					}
679*b1cdbd2cSJim Jagielski public:
680*b1cdbd2cSJim Jagielski 					ImpIcnCursor( SvImpIconView* pOwner );
681*b1cdbd2cSJim Jagielski 					~ImpIcnCursor();
682*b1cdbd2cSJim Jagielski 	void 			Clear( sal_Bool bGridToo = sal_True );
683*b1cdbd2cSJim Jagielski 
684*b1cdbd2cSJim Jagielski 	// fuer Cursortravelling usw.
685*b1cdbd2cSJim Jagielski 	SvLBoxEntry* 	GoLeftRight( SvLBoxEntry*, sal_Bool bRight );
686*b1cdbd2cSJim Jagielski 	SvLBoxEntry* 	GoUpDown( SvLBoxEntry*, sal_Bool bDown );
687*b1cdbd2cSJim Jagielski 
688*b1cdbd2cSJim Jagielski 	// Rueckgaebe: sal_False == Das leere Rect steht hinter dem letzten
689*b1cdbd2cSJim Jagielski 	// Eintrag; d.h. beim naechsten Einfuegen ergibt sich das naechste
690*b1cdbd2cSJim Jagielski 	// leere Rechteck durch Addition. Hinweis: Das Rechteck kann dann
691*b1cdbd2cSJim Jagielski 	// ausserhalb des View-Space liegen
692*b1cdbd2cSJim Jagielski 	sal_Bool			FindEmptyGridRect( Rectangle& rRect );
693*b1cdbd2cSJim Jagielski 
694*b1cdbd2cSJim Jagielski 	// Erzeugt fuer jede Zeile (Hoehe=nGridDY) eine nach BoundRect.Left()
695*b1cdbd2cSJim Jagielski 	// sortierte Liste der Eintraege, die in ihr stehen. Eine Liste kann
696*b1cdbd2cSJim Jagielski 	// leer sein. Die Listen gehen in das Eigentum des Rufenden ueber und
697*b1cdbd2cSJim Jagielski 	// muessen mit DestroyGridAdjustData geloescht werden
698*b1cdbd2cSJim Jagielski 	void			CreateGridAjustData( SvPtrarr& pLists, SvLBoxEntry* pRow=0);
699*b1cdbd2cSJim Jagielski 	static void 	DestroyGridAdjustData( SvPtrarr& rLists );
700*b1cdbd2cSJim Jagielski 	void			SetGridUsed( const Rectangle&, sal_Bool bUsed = sal_True );
701*b1cdbd2cSJim Jagielski };
702*b1cdbd2cSJim Jagielski 
703*b1cdbd2cSJim Jagielski 
704*b1cdbd2cSJim Jagielski 
705*b1cdbd2cSJim Jagielski 
SvImpIconView(SvIconView * pCurView,SvLBoxTreeList * pTree,WinBits i_nWinStyle)706*b1cdbd2cSJim Jagielski SvImpIconView::SvImpIconView( SvIconView* pCurView, SvLBoxTreeList* pTree,
707*b1cdbd2cSJim Jagielski 	WinBits i_nWinStyle ) :
708*b1cdbd2cSJim Jagielski 	aVerSBar( pCurView, WB_DRAG | WB_VSCROLL ),
709*b1cdbd2cSJim Jagielski 	aHorSBar( pCurView, WB_DRAG | WB_HSCROLL )
710*b1cdbd2cSJim Jagielski {
711*b1cdbd2cSJim Jagielski 	pView = pCurView;
712*b1cdbd2cSJim Jagielski 	pModel = pTree;
713*b1cdbd2cSJim Jagielski 	pCurParent = 0;
714*b1cdbd2cSJim Jagielski 	pZOrderList = new SvPtrarr;
715*b1cdbd2cSJim Jagielski 	SetStyle( i_nWinStyle );
716*b1cdbd2cSJim Jagielski 	nHorDist = 0;
717*b1cdbd2cSJim Jagielski 	nVerDist = 0;
718*b1cdbd2cSJim Jagielski 	nFlags = 0;
719*b1cdbd2cSJim Jagielski 	nCurUserEvent = 0;
720*b1cdbd2cSJim Jagielski 	nMaxVirtWidth = 200;
721*b1cdbd2cSJim Jagielski 	pDDRefEntry = 0;
722*b1cdbd2cSJim Jagielski 	pDDDev = 0;
723*b1cdbd2cSJim Jagielski 	pDDBufDev = 0;
724*b1cdbd2cSJim Jagielski 	pDDTempDev = 0;
725*b1cdbd2cSJim Jagielski 	eTextMode = ShowTextShort;
726*b1cdbd2cSJim Jagielski 	pImpCursor = new ImpIcnCursor( this );
727*b1cdbd2cSJim Jagielski 
728*b1cdbd2cSJim Jagielski 	aVerSBar.SetScrollHdl( LINK( this, SvImpIconView, ScrollUpDownHdl ) );
729*b1cdbd2cSJim Jagielski 	aHorSBar.SetScrollHdl( LINK( this, SvImpIconView, ScrollLeftRightHdl ) );
730*b1cdbd2cSJim Jagielski 	nHorSBarHeight = aHorSBar.GetSizePixel().Height();
731*b1cdbd2cSJim Jagielski 	nVerSBarWidth = aVerSBar.GetSizePixel().Width();
732*b1cdbd2cSJim Jagielski 
733*b1cdbd2cSJim Jagielski 	aMouseMoveTimer.SetTimeout( 20 );
734*b1cdbd2cSJim Jagielski 	aMouseMoveTimer.SetTimeoutHdl(LINK(this,SvImpIconView,MouseMoveTimeoutHdl));
735*b1cdbd2cSJim Jagielski 
736*b1cdbd2cSJim Jagielski 	aEditTimer.SetTimeout( 800 );
737*b1cdbd2cSJim Jagielski 	aEditTimer.SetTimeoutHdl(LINK(this,SvImpIconView,EditTimeoutHdl));
738*b1cdbd2cSJim Jagielski 
739*b1cdbd2cSJim Jagielski 	Clear( sal_True );
740*b1cdbd2cSJim Jagielski }
741*b1cdbd2cSJim Jagielski 
~SvImpIconView()742*b1cdbd2cSJim Jagielski SvImpIconView::~SvImpIconView()
743*b1cdbd2cSJim Jagielski {
744*b1cdbd2cSJim Jagielski 	StopEditTimer();
745*b1cdbd2cSJim Jagielski 	CancelUserEvent();
746*b1cdbd2cSJim Jagielski 	delete pZOrderList;
747*b1cdbd2cSJim Jagielski 	delete pImpCursor;
748*b1cdbd2cSJim Jagielski 	delete pDDDev;
749*b1cdbd2cSJim Jagielski 	delete pDDBufDev;
750*b1cdbd2cSJim Jagielski 	delete pDDTempDev;
751*b1cdbd2cSJim Jagielski 	ClearSelectedRectList();
752*b1cdbd2cSJim Jagielski }
753*b1cdbd2cSJim Jagielski 
Clear(sal_Bool bInCtor)754*b1cdbd2cSJim Jagielski void SvImpIconView::Clear( sal_Bool bInCtor )
755*b1cdbd2cSJim Jagielski {
756*b1cdbd2cSJim Jagielski 	StopEditTimer();
757*b1cdbd2cSJim Jagielski 	CancelUserEvent();
758*b1cdbd2cSJim Jagielski 	nMaxBmpWidth = 0;
759*b1cdbd2cSJim Jagielski 	nMaxBmpHeight = 0;
760*b1cdbd2cSJim Jagielski 	nMaxTextWidth = 0;
761*b1cdbd2cSJim Jagielski 	bMustRecalcBoundingRects = sal_False;
762*b1cdbd2cSJim Jagielski 	nMaxBoundHeight = 0;
763*b1cdbd2cSJim Jagielski 
764*b1cdbd2cSJim Jagielski 	//XXX
765*b1cdbd2cSJim Jagielski 	nFlags |= F_GRID_INSERT;
766*b1cdbd2cSJim Jagielski 	nFlags &= ~F_PAINTED;
767*b1cdbd2cSJim Jagielski 	SetNextEntryPos( Point( LROFFS_WINBORDER, TBOFFS_WINBORDER ) );
768*b1cdbd2cSJim Jagielski 	pCursor = 0;
769*b1cdbd2cSJim Jagielski 	if( !bInCtor )
770*b1cdbd2cSJim Jagielski 	{
771*b1cdbd2cSJim Jagielski 		pImpCursor->Clear();
772*b1cdbd2cSJim Jagielski 		aVirtOutputSize.Width() = 0;
773*b1cdbd2cSJim Jagielski 		aVirtOutputSize.Height() = 0;
774*b1cdbd2cSJim Jagielski 		pZOrderList->Remove(0,pZOrderList->Count());
775*b1cdbd2cSJim Jagielski 		MapMode aMapMode( pView->GetMapMode());
776*b1cdbd2cSJim Jagielski 		aMapMode.SetOrigin( Point() );
777*b1cdbd2cSJim Jagielski 		pView->SetMapMode( aMapMode );
778*b1cdbd2cSJim Jagielski 		if( pView->IsUpdateMode() )
779*b1cdbd2cSJim Jagielski 			pView->Invalidate();
780*b1cdbd2cSJim Jagielski 	}
781*b1cdbd2cSJim Jagielski 	AdjustScrollBars();
782*b1cdbd2cSJim Jagielski }
783*b1cdbd2cSJim Jagielski 
SetStyle(const WinBits i_nWinStyle)784*b1cdbd2cSJim Jagielski void SvImpIconView::SetStyle( const WinBits i_nWinStyle )
785*b1cdbd2cSJim Jagielski {
786*b1cdbd2cSJim Jagielski 	nViewMode = VIEWMODE_TEXT;
787*b1cdbd2cSJim Jagielski 	if( i_nWinStyle & WB_NAME )
788*b1cdbd2cSJim Jagielski 		nViewMode = VIEWMODE_NAME;
789*b1cdbd2cSJim Jagielski 	if( i_nWinStyle & WB_ICON )
790*b1cdbd2cSJim Jagielski 		nViewMode = VIEWMODE_ICON;
791*b1cdbd2cSJim Jagielski }
792*b1cdbd2cSJim Jagielski 
793*b1cdbd2cSJim Jagielski 
IMPL_LINK(SvImpIconView,ScrollUpDownHdl,ScrollBar *,pScrollBar)794*b1cdbd2cSJim Jagielski IMPL_LINK( SvImpIconView, ScrollUpDownHdl, ScrollBar *, pScrollBar )
795*b1cdbd2cSJim Jagielski {
796*b1cdbd2cSJim Jagielski 	pView->EndEditing( sal_True );
797*b1cdbd2cSJim Jagielski 	// Pfeil hoch: delta=-1; Pfeil runter: delta=+1
798*b1cdbd2cSJim Jagielski 	Scroll( 0, pScrollBar->GetDelta(), sal_True );
799*b1cdbd2cSJim Jagielski 	return 0;
800*b1cdbd2cSJim Jagielski }
801*b1cdbd2cSJim Jagielski 
IMPL_LINK(SvImpIconView,ScrollLeftRightHdl,ScrollBar *,pScrollBar)802*b1cdbd2cSJim Jagielski IMPL_LINK( SvImpIconView, ScrollLeftRightHdl, ScrollBar *, pScrollBar )
803*b1cdbd2cSJim Jagielski {
804*b1cdbd2cSJim Jagielski 	pView->EndEditing( sal_True );
805*b1cdbd2cSJim Jagielski 	// Pfeil links: delta=-1; Pfeil rechts: delta=+1
806*b1cdbd2cSJim Jagielski 	Scroll( pScrollBar->GetDelta(), 0, sal_True );
807*b1cdbd2cSJim Jagielski 	return 0;
808*b1cdbd2cSJim Jagielski }
809*b1cdbd2cSJim Jagielski 
ChangedFont()810*b1cdbd2cSJim Jagielski void SvImpIconView::ChangedFont()
811*b1cdbd2cSJim Jagielski {
812*b1cdbd2cSJim Jagielski 	StopEditTimer();
813*b1cdbd2cSJim Jagielski 	ImpArrange();
814*b1cdbd2cSJim Jagielski }
815*b1cdbd2cSJim Jagielski 
816*b1cdbd2cSJim Jagielski 
CheckAllSizes()817*b1cdbd2cSJim Jagielski void SvImpIconView::CheckAllSizes()
818*b1cdbd2cSJim Jagielski {
819*b1cdbd2cSJim Jagielski 	nMaxTextWidth = 0;
820*b1cdbd2cSJim Jagielski 	nMaxBmpWidth = 0;
821*b1cdbd2cSJim Jagielski 	nMaxBmpHeight = 0;
822*b1cdbd2cSJim Jagielski 	SvLBoxEntry* pEntry = pModel->First();
823*b1cdbd2cSJim Jagielski 	while( pEntry )
824*b1cdbd2cSJim Jagielski 	{
825*b1cdbd2cSJim Jagielski 		CheckSizes( pEntry );
826*b1cdbd2cSJim Jagielski 		pEntry = pModel->Next( pEntry );
827*b1cdbd2cSJim Jagielski 	}
828*b1cdbd2cSJim Jagielski }
829*b1cdbd2cSJim Jagielski 
CheckSizes(SvLBoxEntry * pEntry,const SvIcnVwDataEntry * pViewData)830*b1cdbd2cSJim Jagielski void SvImpIconView::CheckSizes( SvLBoxEntry* pEntry,
831*b1cdbd2cSJim Jagielski 	const SvIcnVwDataEntry* pViewData )
832*b1cdbd2cSJim Jagielski {
833*b1cdbd2cSJim Jagielski 	Size aSize;
834*b1cdbd2cSJim Jagielski 
835*b1cdbd2cSJim Jagielski 	if( !pViewData )
836*b1cdbd2cSJim Jagielski 		pViewData = ICNVIEWDATA(pEntry);
837*b1cdbd2cSJim Jagielski 
838*b1cdbd2cSJim Jagielski 	SvLBoxString* pStringItem = (SvLBoxString*)(pEntry->GetFirstItem(SV_ITEM_ID_LBOXSTRING));
839*b1cdbd2cSJim Jagielski 	if( pStringItem )
840*b1cdbd2cSJim Jagielski 	{
841*b1cdbd2cSJim Jagielski 		aSize = GetItemSize( pView, pEntry, pStringItem, pViewData );
842*b1cdbd2cSJim Jagielski 		if( aSize.Width() > nMaxTextWidth )
843*b1cdbd2cSJim Jagielski 		{
844*b1cdbd2cSJim Jagielski 			nMaxTextWidth = aSize.Width();
845*b1cdbd2cSJim Jagielski 			if( !(nFlags & F_GRIDMODE ) )
846*b1cdbd2cSJim Jagielski 				bMustRecalcBoundingRects = sal_True;
847*b1cdbd2cSJim Jagielski 		}
848*b1cdbd2cSJim Jagielski 	}
849*b1cdbd2cSJim Jagielski 	SvLBoxContextBmp* pBmpItem = (SvLBoxContextBmp*)(pEntry->GetFirstItem(SV_ITEM_ID_LBOXCONTEXTBMP));
850*b1cdbd2cSJim Jagielski 	if( pBmpItem )
851*b1cdbd2cSJim Jagielski 	{
852*b1cdbd2cSJim Jagielski 		aSize = GetItemSize( pView, pEntry, pBmpItem, pViewData );
853*b1cdbd2cSJim Jagielski 		if( aSize.Width() > nMaxBmpWidth )
854*b1cdbd2cSJim Jagielski 		{
855*b1cdbd2cSJim Jagielski 			nMaxBmpWidth = aSize.Width();
856*b1cdbd2cSJim Jagielski 			nMaxBmpWidth += (2*LROFFS_ICON);
857*b1cdbd2cSJim Jagielski 			if( !(nFlags & F_GRIDMODE ) )
858*b1cdbd2cSJim Jagielski 				bMustRecalcBoundingRects = sal_True;
859*b1cdbd2cSJim Jagielski 		}
860*b1cdbd2cSJim Jagielski 		if( aSize.Height() > nMaxBmpHeight )
861*b1cdbd2cSJim Jagielski 		{
862*b1cdbd2cSJim Jagielski 			nMaxBmpHeight = aSize.Height();
863*b1cdbd2cSJim Jagielski 			nMaxBmpHeight += (2*TBOFFS_ICON);;
864*b1cdbd2cSJim Jagielski 			if( !(nFlags & F_GRIDMODE ) )
865*b1cdbd2cSJim Jagielski 				bMustRecalcBoundingRects = sal_True;
866*b1cdbd2cSJim Jagielski 		}
867*b1cdbd2cSJim Jagielski 	}
868*b1cdbd2cSJim Jagielski }
869*b1cdbd2cSJim Jagielski 
EntryInserted(SvLBoxEntry * pEntry)870*b1cdbd2cSJim Jagielski void SvImpIconView::EntryInserted( SvLBoxEntry* pEntry )
871*b1cdbd2cSJim Jagielski {
872*b1cdbd2cSJim Jagielski 	if( pModel->GetParent(pEntry) == pCurParent )
873*b1cdbd2cSJim Jagielski 	{
874*b1cdbd2cSJim Jagielski 		StopEditTimer();
875*b1cdbd2cSJim Jagielski 		DBG_ASSERT(pZOrderList->GetPos(pEntry)==0xffff,"EntryInserted:ZOrder?");
876*b1cdbd2cSJim Jagielski 		pZOrderList->Insert( pEntry, pZOrderList->Count() );
877*b1cdbd2cSJim Jagielski 		if( nFlags & F_GRIDMODE	)
878*b1cdbd2cSJim Jagielski 			pImpCursor->Clear( sal_False );
879*b1cdbd2cSJim Jagielski 		else
880*b1cdbd2cSJim Jagielski 			pImpCursor->Clear( sal_True );
881*b1cdbd2cSJim Jagielski 		SvIcnVwDataEntry* pViewData = ICNVIEWDATA(pEntry);
882*b1cdbd2cSJim Jagielski 		CheckSizes( pEntry, pViewData );
883*b1cdbd2cSJim Jagielski 		if( pView->IsUpdateMode() )
884*b1cdbd2cSJim Jagielski 		{
885*b1cdbd2cSJim Jagielski 			FindBoundingRect( pEntry, pViewData );
886*b1cdbd2cSJim Jagielski 			PaintEntry( pEntry, pViewData );
887*b1cdbd2cSJim Jagielski 		}
888*b1cdbd2cSJim Jagielski 		else
889*b1cdbd2cSJim Jagielski 			InvalidateBoundingRect( pViewData->aRect );
890*b1cdbd2cSJim Jagielski 	}
891*b1cdbd2cSJim Jagielski }
892*b1cdbd2cSJim Jagielski 
RemovingEntry(SvLBoxEntry * pEntry)893*b1cdbd2cSJim Jagielski void SvImpIconView::RemovingEntry( SvLBoxEntry* pEntry )
894*b1cdbd2cSJim Jagielski {
895*b1cdbd2cSJim Jagielski 	if( pModel->GetParent(pEntry) == pCurParent)
896*b1cdbd2cSJim Jagielski 	{
897*b1cdbd2cSJim Jagielski 		StopEditTimer();
898*b1cdbd2cSJim Jagielski 		DBG_ASSERT(pZOrderList->GetPos(pEntry)!=0xffff,"RemovingEntry:ZOrder?");
899*b1cdbd2cSJim Jagielski 		SvIcnVwDataEntry* pViewData = ICNVIEWDATA(pEntry);
900*b1cdbd2cSJim Jagielski 		if( IsBoundingRectValid( pViewData->aRect ) )
901*b1cdbd2cSJim Jagielski 		{
902*b1cdbd2cSJim Jagielski 			// bei gueltigem Bounding-Rect muss in EntryRemoved eine
903*b1cdbd2cSJim Jagielski 			// Sonderbehandlung erfolgen
904*b1cdbd2cSJim Jagielski 			nFlags |= F_ENTRY_REMOVED;
905*b1cdbd2cSJim Jagielski 			pView->Invalidate( pViewData->aRect );
906*b1cdbd2cSJim Jagielski 		}
907*b1cdbd2cSJim Jagielski 		if( pEntry == pCursor )
908*b1cdbd2cSJim Jagielski 		{
909*b1cdbd2cSJim Jagielski 			SvLBoxEntry* pNewCursor = GetNewCursor();
910*b1cdbd2cSJim Jagielski 			ShowCursor( sal_False );
911*b1cdbd2cSJim Jagielski 			pCursor = 0; // damit er nicht deselektiert wird
912*b1cdbd2cSJim Jagielski 			SetCursor( pNewCursor );
913*b1cdbd2cSJim Jagielski 		}
914*b1cdbd2cSJim Jagielski 		sal_uInt16 nPos = pZOrderList->GetPos( (void*)pEntry );
915*b1cdbd2cSJim Jagielski 		pZOrderList->Remove( nPos, 1 );
916*b1cdbd2cSJim Jagielski 		pImpCursor->Clear();
917*b1cdbd2cSJim Jagielski 	}
918*b1cdbd2cSJim Jagielski }
919*b1cdbd2cSJim Jagielski 
EntryRemoved()920*b1cdbd2cSJim Jagielski void SvImpIconView::EntryRemoved()
921*b1cdbd2cSJim Jagielski {
922*b1cdbd2cSJim Jagielski 	if( (nFlags & (F_ENTRY_REMOVED | F_PAINTED)) == (F_ENTRY_REMOVED | F_PAINTED))
923*b1cdbd2cSJim Jagielski 	{
924*b1cdbd2cSJim Jagielski 		// Ein Eintrag mit gueltigem BoundRect wurde geloescht und wir
925*b1cdbd2cSJim Jagielski 		// haben schon mal gepaintet. In diesem Fall muessen wir die
926*b1cdbd2cSJim Jagielski 		// Position des naechsten Eintrags, der eingefuegt wird oder noch
927*b1cdbd2cSJim Jagielski 		// kein gueltiges BoundRect hat, "suchen" d.h. ein "Loch" in
928*b1cdbd2cSJim Jagielski 		// der View auffuellen.
929*b1cdbd2cSJim Jagielski 		nFlags &= ~( F_ENTRY_REMOVED | F_GRID_INSERT );
930*b1cdbd2cSJim Jagielski 	}
931*b1cdbd2cSJim Jagielski }
932*b1cdbd2cSJim Jagielski 
933*b1cdbd2cSJim Jagielski 
MovingEntry(SvLBoxEntry * pEntry)934*b1cdbd2cSJim Jagielski void SvImpIconView::MovingEntry( SvLBoxEntry* pEntry )
935*b1cdbd2cSJim Jagielski {
936*b1cdbd2cSJim Jagielski 	DBG_ASSERT(pEntry,"MovingEntry: 0!");
937*b1cdbd2cSJim Jagielski 	pNextCursor = 0;
938*b1cdbd2cSJim Jagielski 	StopEditTimer();
939*b1cdbd2cSJim Jagielski 	if( pModel->GetParent(pEntry) == pCurParent )
940*b1cdbd2cSJim Jagielski 	{
941*b1cdbd2cSJim Jagielski 		DBG_ASSERT(pZOrderList->GetPos(pEntry)!=0xffff,"MovingEntry:ZOrder?");
942*b1cdbd2cSJim Jagielski 		nFlags |= F_MOVING_SIBLING;
943*b1cdbd2cSJim Jagielski 		SvIcnVwDataEntry* pViewData = ICNVIEWDATA(pEntry);
944*b1cdbd2cSJim Jagielski 		if( IsBoundingRectValid( pViewData->aRect ) )
945*b1cdbd2cSJim Jagielski 			pView->Invalidate( pViewData->aRect );
946*b1cdbd2cSJim Jagielski 		// falls Eintrag seinen Parent wechselt vorsichtshalber
947*b1cdbd2cSJim Jagielski 		// die neue Cursorposition berechnen
948*b1cdbd2cSJim Jagielski 		if( pEntry == pCursor )
949*b1cdbd2cSJim Jagielski 			pNextCursor = GetNewCursor();
950*b1cdbd2cSJim Jagielski 		pImpCursor->Clear();
951*b1cdbd2cSJim Jagielski 	}
952*b1cdbd2cSJim Jagielski }
953*b1cdbd2cSJim Jagielski 
954*b1cdbd2cSJim Jagielski 
EntryMoved(SvLBoxEntry * pEntry)955*b1cdbd2cSJim Jagielski void SvImpIconView::EntryMoved( SvLBoxEntry* pEntry )
956*b1cdbd2cSJim Jagielski {
957*b1cdbd2cSJim Jagielski 	ShowCursor( sal_False );
958*b1cdbd2cSJim Jagielski 	SvIcnVwDataEntry* pViewData = ICNVIEWDATA(pEntry);
959*b1cdbd2cSJim Jagielski 	if( pModel->GetParent(pEntry)==pCurParent )
960*b1cdbd2cSJim Jagielski 	{
961*b1cdbd2cSJim Jagielski 		if( nFlags & F_MOVING_SIBLING )
962*b1cdbd2cSJim Jagielski 		{
963*b1cdbd2cSJim Jagielski 			// die Neu-Positionierung eines Eintrags bei D&D innerhalb
964*b1cdbd2cSJim Jagielski 			// einer IconView findet bereits in NotifyMoving statt
965*b1cdbd2cSJim Jagielski 			// (MovingEntry/EntryMoved wird dann nicht mehr gerufen)
966*b1cdbd2cSJim Jagielski 			ToTop( pEntry );
967*b1cdbd2cSJim Jagielski 		}
968*b1cdbd2cSJim Jagielski 		else
969*b1cdbd2cSJim Jagielski 		{
970*b1cdbd2cSJim Jagielski 			pImpCursor->Clear();
971*b1cdbd2cSJim Jagielski 			pZOrderList->Insert( pEntry, pZOrderList->Count() );
972*b1cdbd2cSJim Jagielski 			DBG_ASSERT(pZOrderList->Count()==pModel->GetChildCount(pCurParent),"EntryMoved:Bad zorder count");
973*b1cdbd2cSJim Jagielski 			FindBoundingRect( pEntry, pViewData );
974*b1cdbd2cSJim Jagielski 		}
975*b1cdbd2cSJim Jagielski 		PaintEntry( pEntry, pViewData );
976*b1cdbd2cSJim Jagielski 	}
977*b1cdbd2cSJim Jagielski 	else
978*b1cdbd2cSJim Jagielski 	{
979*b1cdbd2cSJim Jagielski 		if( pEntry == pCursor )
980*b1cdbd2cSJim Jagielski 		{
981*b1cdbd2cSJim Jagielski 			DBG_ASSERT(pNextCursor,"EntryMoved: Next cursor bad");
982*b1cdbd2cSJim Jagielski 			SetCursor( pNextCursor );
983*b1cdbd2cSJim Jagielski 		}
984*b1cdbd2cSJim Jagielski 		pImpCursor->Clear();
985*b1cdbd2cSJim Jagielski 		sal_uInt16 nPos = pZOrderList->GetPos( (void*)pEntry );
986*b1cdbd2cSJim Jagielski 		pZOrderList->Remove( nPos, 1 );
987*b1cdbd2cSJim Jagielski 		pView->Select( pEntry, sal_False );
988*b1cdbd2cSJim Jagielski 		// wenn er nochmal in dieser View auftaucht, muss sein
989*b1cdbd2cSJim Jagielski 		// Bounding-Rect neu berechnet werden
990*b1cdbd2cSJim Jagielski 		InvalidateBoundingRect( pViewData->aRect );
991*b1cdbd2cSJim Jagielski 	}
992*b1cdbd2cSJim Jagielski 	nFlags &= (~F_MOVING_SIBLING);
993*b1cdbd2cSJim Jagielski }
994*b1cdbd2cSJim Jagielski 
TreeInserted(SvLBoxEntry * pEntry)995*b1cdbd2cSJim Jagielski void SvImpIconView::TreeInserted( SvLBoxEntry* pEntry )
996*b1cdbd2cSJim Jagielski {
997*b1cdbd2cSJim Jagielski 	EntryMoved( pEntry ); // vorlaeufig
998*b1cdbd2cSJim Jagielski }
999*b1cdbd2cSJim Jagielski 
EntryExpanded(SvLBoxEntry *)1000*b1cdbd2cSJim Jagielski void SvImpIconView::EntryExpanded( SvLBoxEntry* )
1001*b1cdbd2cSJim Jagielski {
1002*b1cdbd2cSJim Jagielski }
1003*b1cdbd2cSJim Jagielski 
EntryCollapsed(SvLBoxEntry *)1004*b1cdbd2cSJim Jagielski void SvImpIconView::EntryCollapsed( SvLBoxEntry*)
1005*b1cdbd2cSJim Jagielski {
1006*b1cdbd2cSJim Jagielski }
1007*b1cdbd2cSJim Jagielski 
CollapsingEntry(SvLBoxEntry *)1008*b1cdbd2cSJim Jagielski void SvImpIconView::CollapsingEntry( SvLBoxEntry* )
1009*b1cdbd2cSJim Jagielski {
1010*b1cdbd2cSJim Jagielski }
1011*b1cdbd2cSJim Jagielski 
EntrySelected(SvLBoxEntry * pEntry,sal_Bool bSelect)1012*b1cdbd2cSJim Jagielski void SvImpIconView::EntrySelected( SvLBoxEntry* pEntry, sal_Bool bSelect )
1013*b1cdbd2cSJim Jagielski {
1014*b1cdbd2cSJim Jagielski 	if( pModel->GetParent(pEntry) != pCurParent  )
1015*b1cdbd2cSJim Jagielski 		return;
1016*b1cdbd2cSJim Jagielski 
1017*b1cdbd2cSJim Jagielski 	// bei SingleSelection dafuer sorgen, dass der Cursor immer
1018*b1cdbd2cSJim Jagielski 	// auf dem (einzigen) selektierten Eintrag steht
1019*b1cdbd2cSJim Jagielski 	if( bSelect && pCursor &&
1020*b1cdbd2cSJim Jagielski 		pView->GetSelectionMode() == SINGLE_SELECTION &&
1021*b1cdbd2cSJim Jagielski 		pEntry != pCursor )
1022*b1cdbd2cSJim Jagielski 	{
1023*b1cdbd2cSJim Jagielski 		SetCursor( pEntry );
1024*b1cdbd2cSJim Jagielski 		DBG_ASSERT(pView->GetSelectionCount()==1,"selection count?");
1025*b1cdbd2cSJim Jagielski 	}
1026*b1cdbd2cSJim Jagielski 	// bei Gummibandselektion ist uns das zu teuer
1027*b1cdbd2cSJim Jagielski 	if( !(nFlags & F_RUBBERING ))
1028*b1cdbd2cSJim Jagielski 		ToTop( pEntry );
1029*b1cdbd2cSJim Jagielski 	if( pView->IsUpdateMode() )
1030*b1cdbd2cSJim Jagielski 	{
1031*b1cdbd2cSJim Jagielski 		if( pEntry == pCursor )
1032*b1cdbd2cSJim Jagielski 			ShowCursor( sal_False );
1033*b1cdbd2cSJim Jagielski 		if( nFlags & F_RUBBERING )
1034*b1cdbd2cSJim Jagielski 			PaintEntry( pEntry );
1035*b1cdbd2cSJim Jagielski 		else
1036*b1cdbd2cSJim Jagielski 			pView->Invalidate( GetBoundingRect( pEntry ) );
1037*b1cdbd2cSJim Jagielski 		if( pEntry == pCursor )
1038*b1cdbd2cSJim Jagielski 			ShowCursor( sal_True );
1039*b1cdbd2cSJim Jagielski 	}
1040*b1cdbd2cSJim Jagielski }
1041*b1cdbd2cSJim Jagielski 
SetNextEntryPos(const Point & rPos)1042*b1cdbd2cSJim Jagielski void SvImpIconView::SetNextEntryPos(const Point& rPos)
1043*b1cdbd2cSJim Jagielski {
1044*b1cdbd2cSJim Jagielski 	aPrevBoundRect.SetPos( rPos );
1045*b1cdbd2cSJim Jagielski 	aPrevBoundRect.Right() = LONG_MAX;	// dont know
1046*b1cdbd2cSJim Jagielski }
1047*b1cdbd2cSJim Jagielski 
FindNextEntryPos(const Size & rBoundSize)1048*b1cdbd2cSJim Jagielski Point SvImpIconView::FindNextEntryPos( const Size& rBoundSize )
1049*b1cdbd2cSJim Jagielski {
1050*b1cdbd2cSJim Jagielski 	if( nFlags & F_GRIDMODE )
1051*b1cdbd2cSJim Jagielski 	{
1052*b1cdbd2cSJim Jagielski 		if( nFlags & F_GRID_INSERT )
1053*b1cdbd2cSJim Jagielski 		{
1054*b1cdbd2cSJim Jagielski 			if( aPrevBoundRect.Right() != LONG_MAX )
1055*b1cdbd2cSJim Jagielski 			{
1056*b1cdbd2cSJim Jagielski 				// passt der naechste Entry noch in die Zeile ?
1057*b1cdbd2cSJim Jagielski 				long nNextWidth = aPrevBoundRect.Right() + nGridDX + LROFFS_WINBORDER;
1058*b1cdbd2cSJim Jagielski 				if( nNextWidth > aVirtOutputSize.Width() )
1059*b1cdbd2cSJim Jagielski 				{
1060*b1cdbd2cSJim Jagielski 					// darf aVirtOutputSize verbreitert werden ?
1061*b1cdbd2cSJim Jagielski 					if( nNextWidth < nMaxVirtWidth )
1062*b1cdbd2cSJim Jagielski 					{
1063*b1cdbd2cSJim Jagielski 						// verbreitern & in Zeile aufnehmen
1064*b1cdbd2cSJim Jagielski 						aPrevBoundRect.Left() += nGridDX;
1065*b1cdbd2cSJim Jagielski 					}
1066*b1cdbd2cSJim Jagielski 					else
1067*b1cdbd2cSJim Jagielski 					{
1068*b1cdbd2cSJim Jagielski 						// erhoehen & neue Zeile beginnen
1069*b1cdbd2cSJim Jagielski 						aPrevBoundRect.Top() += nGridDY;
1070*b1cdbd2cSJim Jagielski 						aPrevBoundRect.Left() = LROFFS_WINBORDER;
1071*b1cdbd2cSJim Jagielski 					}
1072*b1cdbd2cSJim Jagielski 				}
1073*b1cdbd2cSJim Jagielski 				else
1074*b1cdbd2cSJim Jagielski 				{
1075*b1cdbd2cSJim Jagielski 					// in die Zeile aufnehmen
1076*b1cdbd2cSJim Jagielski 					aPrevBoundRect.Left() += nGridDX;
1077*b1cdbd2cSJim Jagielski 				}
1078*b1cdbd2cSJim Jagielski 			}
1079*b1cdbd2cSJim Jagielski 			aPrevBoundRect.SetSize( Size( nGridDX, nGridDY ) );
1080*b1cdbd2cSJim Jagielski 		}
1081*b1cdbd2cSJim Jagielski 		else
1082*b1cdbd2cSJim Jagielski 		{
1083*b1cdbd2cSJim Jagielski 			if( !pImpCursor->FindEmptyGridRect( aPrevBoundRect ) )
1084*b1cdbd2cSJim Jagielski 			{
1085*b1cdbd2cSJim Jagielski 				// mitten in den Entries gibts keine Loecher mehr,
1086*b1cdbd2cSJim Jagielski 				// wir koennen also wieder ins "Fast Insert" springen
1087*b1cdbd2cSJim Jagielski 				nFlags |= F_GRID_INSERT;
1088*b1cdbd2cSJim Jagielski 			}
1089*b1cdbd2cSJim Jagielski 		}
1090*b1cdbd2cSJim Jagielski 	}
1091*b1cdbd2cSJim Jagielski 	else
1092*b1cdbd2cSJim Jagielski 	{
1093*b1cdbd2cSJim Jagielski 		if( aPrevBoundRect.Right() != LONG_MAX )
1094*b1cdbd2cSJim Jagielski 		{
1095*b1cdbd2cSJim Jagielski 			// passt der naechste Entry noch in die Zeile ?
1096*b1cdbd2cSJim Jagielski 			long nNextWidth=aPrevBoundRect.Right()+rBoundSize.Width()+LROFFS_BOUND+nHorDist;
1097*b1cdbd2cSJim Jagielski 			if( nNextWidth > aVirtOutputSize.Width() )
1098*b1cdbd2cSJim Jagielski 			{
1099*b1cdbd2cSJim Jagielski 				// darf aVirtOutputSize verbreitert werden ?
1100*b1cdbd2cSJim Jagielski 				if( nNextWidth < nMaxVirtWidth )
1101*b1cdbd2cSJim Jagielski 				{
1102*b1cdbd2cSJim Jagielski 					// verbreitern & in Zeile aufnehmen
1103*b1cdbd2cSJim Jagielski 					aPrevBoundRect.SetPos( aPrevBoundRect.TopRight() );
1104*b1cdbd2cSJim Jagielski 					aPrevBoundRect.Left() += nHorDist;
1105*b1cdbd2cSJim Jagielski 				}
1106*b1cdbd2cSJim Jagielski 				else
1107*b1cdbd2cSJim Jagielski 				{
1108*b1cdbd2cSJim Jagielski 					// erhoehen & neue Zeile beginnen
1109*b1cdbd2cSJim Jagielski 					aPrevBoundRect.Top() += nMaxBoundHeight + nVerDist + TBOFFS_BOUND;
1110*b1cdbd2cSJim Jagielski 					aPrevBoundRect.Left() = LROFFS_WINBORDER;
1111*b1cdbd2cSJim Jagielski 				}
1112*b1cdbd2cSJim Jagielski 			}
1113*b1cdbd2cSJim Jagielski 			else
1114*b1cdbd2cSJim Jagielski 			{
1115*b1cdbd2cSJim Jagielski 				// in die Zeile aufnehmen
1116*b1cdbd2cSJim Jagielski 				aPrevBoundRect.SetPos( aPrevBoundRect.TopRight() );
1117*b1cdbd2cSJim Jagielski 				aPrevBoundRect.Left() += nHorDist;
1118*b1cdbd2cSJim Jagielski 			}
1119*b1cdbd2cSJim Jagielski 		}
1120*b1cdbd2cSJim Jagielski 		aPrevBoundRect.SetSize( rBoundSize );
1121*b1cdbd2cSJim Jagielski 	}
1122*b1cdbd2cSJim Jagielski 	return aPrevBoundRect.TopLeft();
1123*b1cdbd2cSJim Jagielski }
1124*b1cdbd2cSJim Jagielski 
ResetVirtSize()1125*b1cdbd2cSJim Jagielski void SvImpIconView::ResetVirtSize()
1126*b1cdbd2cSJim Jagielski {
1127*b1cdbd2cSJim Jagielski 	StopEditTimer();
1128*b1cdbd2cSJim Jagielski 	aVirtOutputSize.Width() = 0;
1129*b1cdbd2cSJim Jagielski 	aVirtOutputSize.Height() = 0;
1130*b1cdbd2cSJim Jagielski 	sal_Bool bLockedEntryFound = sal_False;
1131*b1cdbd2cSJim Jagielski 	nFlags &= (~F_GRID_INSERT);
1132*b1cdbd2cSJim Jagielski 	SvLBoxEntry* pCur = pModel->FirstChild( pCurParent );
1133*b1cdbd2cSJim Jagielski 	while( pCur )
1134*b1cdbd2cSJim Jagielski 	{
1135*b1cdbd2cSJim Jagielski 		SvIcnVwDataEntry* pViewData = ICNVIEWDATA(pCur);
1136*b1cdbd2cSJim Jagielski 		if( pViewData->IsEntryPosLocked() )
1137*b1cdbd2cSJim Jagielski 		{
1138*b1cdbd2cSJim Jagielski 			// VirtSize u.a. anpassen
1139*b1cdbd2cSJim Jagielski 			if( !IsBoundingRectValid( pViewData->aRect ) )
1140*b1cdbd2cSJim Jagielski 				FindBoundingRect( pCur, pViewData );
1141*b1cdbd2cSJim Jagielski 			else
1142*b1cdbd2cSJim Jagielski 				AdjustVirtSize( pViewData->aRect );
1143*b1cdbd2cSJim Jagielski 			bLockedEntryFound = sal_True;
1144*b1cdbd2cSJim Jagielski 		}
1145*b1cdbd2cSJim Jagielski 		else
1146*b1cdbd2cSJim Jagielski 			InvalidateBoundingRect( pViewData->aRect );
1147*b1cdbd2cSJim Jagielski 
1148*b1cdbd2cSJim Jagielski 		pCur = pModel->NextSibling( pCur );
1149*b1cdbd2cSJim Jagielski 	}
1150*b1cdbd2cSJim Jagielski 	if( !bLockedEntryFound )
1151*b1cdbd2cSJim Jagielski 	{
1152*b1cdbd2cSJim Jagielski 		//XXX
1153*b1cdbd2cSJim Jagielski 		nFlags |= F_GRID_INSERT;
1154*b1cdbd2cSJim Jagielski 	}
1155*b1cdbd2cSJim Jagielski 
1156*b1cdbd2cSJim Jagielski 	SetNextEntryPos( Point( LROFFS_WINBORDER, TBOFFS_WINBORDER ) );
1157*b1cdbd2cSJim Jagielski 	pImpCursor->Clear();
1158*b1cdbd2cSJim Jagielski }
1159*b1cdbd2cSJim Jagielski 
1160*b1cdbd2cSJim Jagielski 
AdjustVirtSize(const Rectangle & rRect)1161*b1cdbd2cSJim Jagielski void SvImpIconView::AdjustVirtSize( const Rectangle& rRect )
1162*b1cdbd2cSJim Jagielski {
1163*b1cdbd2cSJim Jagielski 	long nHeightOffs = 0;
1164*b1cdbd2cSJim Jagielski 	long nWidthOffs = 0;
1165*b1cdbd2cSJim Jagielski 
1166*b1cdbd2cSJim Jagielski 	if( aVirtOutputSize.Width() < (rRect.Right()+LROFFS_WINBORDER) )
1167*b1cdbd2cSJim Jagielski 		nWidthOffs = (rRect.Right()+LROFFS_WINBORDER) - aVirtOutputSize.Width();
1168*b1cdbd2cSJim Jagielski 
1169*b1cdbd2cSJim Jagielski 	if( aVirtOutputSize.Height() < (rRect.Bottom()+TBOFFS_WINBORDER) )
1170*b1cdbd2cSJim Jagielski 		nHeightOffs = (rRect.Bottom()+TBOFFS_WINBORDER) - aVirtOutputSize.Height();
1171*b1cdbd2cSJim Jagielski 
1172*b1cdbd2cSJim Jagielski 	if( nWidthOffs || nHeightOffs )
1173*b1cdbd2cSJim Jagielski 	{
1174*b1cdbd2cSJim Jagielski 		Range aRange;
1175*b1cdbd2cSJim Jagielski 		aVirtOutputSize.Width() += nWidthOffs;
1176*b1cdbd2cSJim Jagielski 		aRange.Max() = aVirtOutputSize.Width();
1177*b1cdbd2cSJim Jagielski 		aHorSBar.SetRange( aRange );
1178*b1cdbd2cSJim Jagielski 
1179*b1cdbd2cSJim Jagielski 		aVirtOutputSize.Height() += nHeightOffs;
1180*b1cdbd2cSJim Jagielski 		aRange.Max() = aVirtOutputSize.Height();
1181*b1cdbd2cSJim Jagielski 		aVerSBar.SetRange( aRange );
1182*b1cdbd2cSJim Jagielski 
1183*b1cdbd2cSJim Jagielski 		pImpCursor->Clear();
1184*b1cdbd2cSJim Jagielski 		AdjustScrollBars();
1185*b1cdbd2cSJim Jagielski 	}
1186*b1cdbd2cSJim Jagielski }
1187*b1cdbd2cSJim Jagielski 
Arrange()1188*b1cdbd2cSJim Jagielski void SvImpIconView::Arrange()
1189*b1cdbd2cSJim Jagielski {
1190*b1cdbd2cSJim Jagielski 	nMaxVirtWidth = aOutputSize.Width();
1191*b1cdbd2cSJim Jagielski 	ImpArrange();
1192*b1cdbd2cSJim Jagielski }
1193*b1cdbd2cSJim Jagielski 
ImpArrange()1194*b1cdbd2cSJim Jagielski void SvImpIconView::ImpArrange()
1195*b1cdbd2cSJim Jagielski {
1196*b1cdbd2cSJim Jagielski 	StopEditTimer();
1197*b1cdbd2cSJim Jagielski 	ShowCursor( sal_False );
1198*b1cdbd2cSJim Jagielski 	ResetVirtSize();
1199*b1cdbd2cSJim Jagielski 	bMustRecalcBoundingRects = sal_False;
1200*b1cdbd2cSJim Jagielski 	MapMode aMapMode( pView->GetMapMode());
1201*b1cdbd2cSJim Jagielski 	aMapMode.SetOrigin( Point() );
1202*b1cdbd2cSJim Jagielski 	pView->SetMapMode( aMapMode );
1203*b1cdbd2cSJim Jagielski 	CheckAllSizes();
1204*b1cdbd2cSJim Jagielski 	RecalcAllBoundingRectsSmart();
1205*b1cdbd2cSJim Jagielski 	pView->Invalidate();
1206*b1cdbd2cSJim Jagielski 	ShowCursor( sal_True );
1207*b1cdbd2cSJim Jagielski }
1208*b1cdbd2cSJim Jagielski 
Paint(const Rectangle & rRect)1209*b1cdbd2cSJim Jagielski void SvImpIconView::Paint( const Rectangle& rRect )
1210*b1cdbd2cSJim Jagielski {
1211*b1cdbd2cSJim Jagielski 	if( !pView->IsUpdateMode() )
1212*b1cdbd2cSJim Jagielski 		return;
1213*b1cdbd2cSJim Jagielski 
1214*b1cdbd2cSJim Jagielski #if defined(DBG_UTIL) && defined(OV_DRAWGRID)
1215*b1cdbd2cSJim Jagielski 	if( nFlags & F_GRIDMODE )
1216*b1cdbd2cSJim Jagielski 	{
1217*b1cdbd2cSJim Jagielski 		Color aOldColor = pView->GetLineColor();
1218*b1cdbd2cSJim Jagielski 		Color aNewColor( COL_BLACK );
1219*b1cdbd2cSJim Jagielski 		pView->SetLineColor( aNewColor );
1220*b1cdbd2cSJim Jagielski 		Point aOffs( pView->GetMapMode().GetOrigin());
1221*b1cdbd2cSJim Jagielski 		Size aXSize( pView->GetOutputSizePixel() );
1222*b1cdbd2cSJim Jagielski 		for( long nDX = nGridDX; nDX <= aXSize.Width(); nDX += nGridDX )
1223*b1cdbd2cSJim Jagielski 		{
1224*b1cdbd2cSJim Jagielski 			Point aStart( nDX+LROFFS_BOUND, 0 );
1225*b1cdbd2cSJim Jagielski 			Point aEnd( nDX+LROFFS_BOUND, aXSize.Height());
1226*b1cdbd2cSJim Jagielski 			aStart -= aOffs;
1227*b1cdbd2cSJim Jagielski 			aEnd -= aOffs;
1228*b1cdbd2cSJim Jagielski 			pView->DrawLine( aStart, aEnd );
1229*b1cdbd2cSJim Jagielski 		}
1230*b1cdbd2cSJim Jagielski 		for( long nDY = nGridDY; nDY <= aXSize.Height(); nDY += nGridDY )
1231*b1cdbd2cSJim Jagielski 		{
1232*b1cdbd2cSJim Jagielski 			Point aStart( 0, nDY+TBOFFS_BOUND );
1233*b1cdbd2cSJim Jagielski 			Point aEnd( aXSize.Width(), nDY+TBOFFS_BOUND );
1234*b1cdbd2cSJim Jagielski 			aStart -= aOffs;
1235*b1cdbd2cSJim Jagielski 			aEnd -= aOffs;
1236*b1cdbd2cSJim Jagielski 			pView->DrawLine( aStart, aEnd );
1237*b1cdbd2cSJim Jagielski 		}
1238*b1cdbd2cSJim Jagielski 		pView->SetLineColor( aOldColor );
1239*b1cdbd2cSJim Jagielski 	}
1240*b1cdbd2cSJim Jagielski #endif
1241*b1cdbd2cSJim Jagielski 	nFlags |= F_PAINTED;
1242*b1cdbd2cSJim Jagielski 
1243*b1cdbd2cSJim Jagielski 	if( !(pModel->HasChilds( pCurParent ) ))
1244*b1cdbd2cSJim Jagielski 		return;
1245*b1cdbd2cSJim Jagielski 	if( !pCursor )
1246*b1cdbd2cSJim Jagielski 		pCursor = pModel->FirstChild( pCurParent );
1247*b1cdbd2cSJim Jagielski 
1248*b1cdbd2cSJim Jagielski 	sal_uInt16 nCount = pZOrderList->Count();
1249*b1cdbd2cSJim Jagielski 	if( !nCount )
1250*b1cdbd2cSJim Jagielski 		return;
1251*b1cdbd2cSJim Jagielski 
1252*b1cdbd2cSJim Jagielski 	SvPtrarr* pNewZOrderList = new SvPtrarr;
1253*b1cdbd2cSJim Jagielski 	SvPtrarr* pPaintedEntries = new SvPtrarr;
1254*b1cdbd2cSJim Jagielski 
1255*b1cdbd2cSJim Jagielski 	sal_uInt16 nPos = 0;
1256*b1cdbd2cSJim Jagielski 	while( nCount )
1257*b1cdbd2cSJim Jagielski 	{
1258*b1cdbd2cSJim Jagielski 		SvLBoxEntry* pEntry = (SvLBoxEntry*)(pZOrderList->GetObject(nPos ));
1259*b1cdbd2cSJim Jagielski 		SvIcnVwDataEntry* pViewData = ICNVIEWDATA(pEntry);
1260*b1cdbd2cSJim Jagielski 		const Rectangle& rBoundRect = GetBoundingRect( pEntry, pViewData );
1261*b1cdbd2cSJim Jagielski 		if( rRect.IsOver( rBoundRect ) )
1262*b1cdbd2cSJim Jagielski 		{
1263*b1cdbd2cSJim Jagielski 			PaintEntry( pEntry, rBoundRect.TopLeft(), pViewData );
1264*b1cdbd2cSJim Jagielski 			// Eintraege, die neu gezeichnet werden, auf Top setzen
1265*b1cdbd2cSJim Jagielski 			pPaintedEntries->Insert( pEntry, pPaintedEntries->Count() );
1266*b1cdbd2cSJim Jagielski 		}
1267*b1cdbd2cSJim Jagielski 		else
1268*b1cdbd2cSJim Jagielski 			pNewZOrderList->Insert( pEntry, pNewZOrderList->Count() );
1269*b1cdbd2cSJim Jagielski 
1270*b1cdbd2cSJim Jagielski 		nCount--;
1271*b1cdbd2cSJim Jagielski 		nPos++;
1272*b1cdbd2cSJim Jagielski 	}
1273*b1cdbd2cSJim Jagielski 	delete pZOrderList;
1274*b1cdbd2cSJim Jagielski 	pZOrderList = pNewZOrderList;
1275*b1cdbd2cSJim Jagielski 	nCount = pPaintedEntries->Count();
1276*b1cdbd2cSJim Jagielski 	if( nCount )
1277*b1cdbd2cSJim Jagielski 	{
1278*b1cdbd2cSJim Jagielski 		for( sal_uInt16 nCur = 0; nCur < nCount; nCur++ )
1279*b1cdbd2cSJim Jagielski 			pZOrderList->Insert( pPaintedEntries->GetObject( nCur ),pZOrderList->Count());
1280*b1cdbd2cSJim Jagielski 	}
1281*b1cdbd2cSJim Jagielski 	delete pPaintedEntries;
1282*b1cdbd2cSJim Jagielski 
1283*b1cdbd2cSJim Jagielski 	Rectangle aRect;
1284*b1cdbd2cSJim Jagielski 	if( GetResizeRect( aRect ))
1285*b1cdbd2cSJim Jagielski 		PaintResizeRect( aRect );
1286*b1cdbd2cSJim Jagielski }
1287*b1cdbd2cSJim Jagielski 
GetResizeRect(Rectangle & rRect)1288*b1cdbd2cSJim Jagielski sal_Bool SvImpIconView::GetResizeRect( Rectangle& rRect )
1289*b1cdbd2cSJim Jagielski {
1290*b1cdbd2cSJim Jagielski 	if( aHorSBar.IsVisible() && aVerSBar.IsVisible() )
1291*b1cdbd2cSJim Jagielski 	{
1292*b1cdbd2cSJim Jagielski 		const MapMode& rMapMode = pView->GetMapMode();
1293*b1cdbd2cSJim Jagielski 		Point aOrigin( rMapMode.GetOrigin());
1294*b1cdbd2cSJim Jagielski 		aOrigin *= -1;
1295*b1cdbd2cSJim Jagielski 		aOrigin.X() += aOutputSize.Width();
1296*b1cdbd2cSJim Jagielski 		aOrigin.Y() += aOutputSize.Height();
1297*b1cdbd2cSJim Jagielski 		rRect.SetPos( aOrigin );
1298*b1cdbd2cSJim Jagielski 		rRect.SetSize( Size( nVerSBarWidth, nHorSBarHeight));
1299*b1cdbd2cSJim Jagielski 		return sal_True;
1300*b1cdbd2cSJim Jagielski 	}
1301*b1cdbd2cSJim Jagielski 	return sal_False;
1302*b1cdbd2cSJim Jagielski }
1303*b1cdbd2cSJim Jagielski 
PaintResizeRect(const Rectangle & rRect)1304*b1cdbd2cSJim Jagielski void SvImpIconView::PaintResizeRect( const Rectangle& rRect )
1305*b1cdbd2cSJim Jagielski {
1306*b1cdbd2cSJim Jagielski 	const StyleSettings& rStyleSettings = pView->GetSettings().GetStyleSettings();
1307*b1cdbd2cSJim Jagielski 	Color aNewColor = rStyleSettings.GetFaceColor();
1308*b1cdbd2cSJim Jagielski 	Color aOldColor = pView->GetFillColor();
1309*b1cdbd2cSJim Jagielski 	pView->SetFillColor( aNewColor );
1310*b1cdbd2cSJim Jagielski 	pView->DrawRect( rRect );
1311*b1cdbd2cSJim Jagielski 	pView->SetFillColor( aOldColor );
1312*b1cdbd2cSJim Jagielski }
1313*b1cdbd2cSJim Jagielski 
RepaintSelectionItems()1314*b1cdbd2cSJim Jagielski void SvImpIconView::RepaintSelectionItems()
1315*b1cdbd2cSJim Jagielski {
1316*b1cdbd2cSJim Jagielski 	DBG_ERROR("RepaintSelectionItems");
1317*b1cdbd2cSJim Jagielski 	pView->Invalidate(); // vorlaeufig
1318*b1cdbd2cSJim Jagielski }
1319*b1cdbd2cSJim Jagielski 
GetItem(SvLBoxEntry * pEntry,const Point & rAbsPos)1320*b1cdbd2cSJim Jagielski SvLBoxItem* SvImpIconView::GetItem( SvLBoxEntry* pEntry,
1321*b1cdbd2cSJim Jagielski 					const Point& rAbsPos )
1322*b1cdbd2cSJim Jagielski {
1323*b1cdbd2cSJim Jagielski 	Rectangle aRect;
1324*b1cdbd2cSJim Jagielski 	SvLBoxString* pStringItem = (SvLBoxString*)(pEntry->GetFirstItem(SV_ITEM_ID_LBOXSTRING));
1325*b1cdbd2cSJim Jagielski 	if( pStringItem )
1326*b1cdbd2cSJim Jagielski 	{
1327*b1cdbd2cSJim Jagielski 		aRect = CalcTextRect( pEntry, pStringItem );
1328*b1cdbd2cSJim Jagielski 		if( aRect.IsInside( rAbsPos ) )
1329*b1cdbd2cSJim Jagielski 			return pStringItem;
1330*b1cdbd2cSJim Jagielski 	}
1331*b1cdbd2cSJim Jagielski 	SvLBoxContextBmp* pBmpItem = (SvLBoxContextBmp*)(pEntry->GetFirstItem(SV_ITEM_ID_LBOXCONTEXTBMP));
1332*b1cdbd2cSJim Jagielski 	if( pBmpItem )
1333*b1cdbd2cSJim Jagielski 	{
1334*b1cdbd2cSJim Jagielski 		aRect = CalcBmpRect( pEntry );
1335*b1cdbd2cSJim Jagielski 		if( aRect.IsInside( rAbsPos ) )
1336*b1cdbd2cSJim Jagielski 			return pBmpItem;
1337*b1cdbd2cSJim Jagielski 	}
1338*b1cdbd2cSJim Jagielski 	return 0;
1339*b1cdbd2cSJim Jagielski }
1340*b1cdbd2cSJim Jagielski 
CalcDocPos(Point & aMaeuschenPos)1341*b1cdbd2cSJim Jagielski void SvImpIconView::CalcDocPos( Point& aMaeuschenPos )
1342*b1cdbd2cSJim Jagielski {
1343*b1cdbd2cSJim Jagielski 	aMaeuschenPos -= pView->GetMapMode().GetOrigin();
1344*b1cdbd2cSJim Jagielski }
1345*b1cdbd2cSJim Jagielski 
MouseButtonDown(const MouseEvent & rMEvt)1346*b1cdbd2cSJim Jagielski void SvImpIconView::MouseButtonDown( const MouseEvent& rMEvt)
1347*b1cdbd2cSJim Jagielski {
1348*b1cdbd2cSJim Jagielski 	StopEditTimer();
1349*b1cdbd2cSJim Jagielski 	pView->GrabFocus();
1350*b1cdbd2cSJim Jagielski 	Point aDocPos( rMEvt.GetPosPixel() );
1351*b1cdbd2cSJim Jagielski 	if(aDocPos.X()>=aOutputSize.Width() || aDocPos.Y()>=aOutputSize.Height())
1352*b1cdbd2cSJim Jagielski 		return;
1353*b1cdbd2cSJim Jagielski 	CalcDocPos( aDocPos );
1354*b1cdbd2cSJim Jagielski 	SvLBoxEntry* pEntry = GetEntry( aDocPos );
1355*b1cdbd2cSJim Jagielski 	if( !pEntry )
1356*b1cdbd2cSJim Jagielski 	{
1357*b1cdbd2cSJim Jagielski 		if( pView->GetSelectionMode() != SINGLE_SELECTION )
1358*b1cdbd2cSJim Jagielski 		{
1359*b1cdbd2cSJim Jagielski 			if( !rMEvt.IsMod1() )  // Ctrl
1360*b1cdbd2cSJim Jagielski 			{
1361*b1cdbd2cSJim Jagielski 				pView->SelectAll( sal_False );
1362*b1cdbd2cSJim Jagielski 				ClearSelectedRectList();
1363*b1cdbd2cSJim Jagielski 			}
1364*b1cdbd2cSJim Jagielski 			else
1365*b1cdbd2cSJim Jagielski 				nFlags |= F_ADD_MODE;
1366*b1cdbd2cSJim Jagielski 			nFlags |= F_RUBBERING;
1367*b1cdbd2cSJim Jagielski 			aCurSelectionRect.SetPos( aDocPos );
1368*b1cdbd2cSJim Jagielski 			pView->CaptureMouse();
1369*b1cdbd2cSJim Jagielski 		}
1370*b1cdbd2cSJim Jagielski 		return;
1371*b1cdbd2cSJim Jagielski 	}
1372*b1cdbd2cSJim Jagielski 
1373*b1cdbd2cSJim Jagielski 	sal_Bool bSelected = pView->IsSelected( pEntry );
1374*b1cdbd2cSJim Jagielski 	sal_Bool bEditingEnabled = pView->IsInplaceEditingEnabled();
1375*b1cdbd2cSJim Jagielski 
1376*b1cdbd2cSJim Jagielski 	if( rMEvt.GetClicks() == 2 )
1377*b1cdbd2cSJim Jagielski 	{
1378*b1cdbd2cSJim Jagielski 		DeselectAllBut( pEntry );
1379*b1cdbd2cSJim Jagielski 		pView->pHdlEntry = pEntry;
1380*b1cdbd2cSJim Jagielski 		pView->DoubleClickHdl();
1381*b1cdbd2cSJim Jagielski 	}
1382*b1cdbd2cSJim Jagielski 	else
1383*b1cdbd2cSJim Jagielski 	{
1384*b1cdbd2cSJim Jagielski 		// Inplace-Editing ?
1385*b1cdbd2cSJim Jagielski 		if( rMEvt.IsMod2() )  // Alt?
1386*b1cdbd2cSJim Jagielski 		{
1387*b1cdbd2cSJim Jagielski 			if( bEditingEnabled )
1388*b1cdbd2cSJim Jagielski 			{
1389*b1cdbd2cSJim Jagielski 				SvLBoxItem* pItem = GetItem(pEntry,aDocPos);
1390*b1cdbd2cSJim Jagielski 				if( pItem )
1391*b1cdbd2cSJim Jagielski 					pView->EditingRequest( pEntry, pItem, aDocPos);
1392*b1cdbd2cSJim Jagielski 			}
1393*b1cdbd2cSJim Jagielski 		}
1394*b1cdbd2cSJim Jagielski 		else if( pView->GetSelectionMode() == SINGLE_SELECTION )
1395*b1cdbd2cSJim Jagielski 		{
1396*b1cdbd2cSJim Jagielski 			DeselectAllBut( pEntry );
1397*b1cdbd2cSJim Jagielski 			SetCursor( pEntry );
1398*b1cdbd2cSJim Jagielski 			pView->Select( pEntry, sal_True );
1399*b1cdbd2cSJim Jagielski 			if( bEditingEnabled && bSelected && !rMEvt.GetModifier() &&
1400*b1cdbd2cSJim Jagielski 				rMEvt.IsLeft() && IsTextHit( pEntry, aDocPos ) )
1401*b1cdbd2cSJim Jagielski 			{
1402*b1cdbd2cSJim Jagielski 				nFlags |= F_START_EDITTIMER_IN_MOUSEUP;
1403*b1cdbd2cSJim Jagielski 			}
1404*b1cdbd2cSJim Jagielski 		}
1405*b1cdbd2cSJim Jagielski 		else
1406*b1cdbd2cSJim Jagielski 		{
1407*b1cdbd2cSJim Jagielski 			if( !rMEvt.GetModifier() )
1408*b1cdbd2cSJim Jagielski 			{
1409*b1cdbd2cSJim Jagielski 				if( !bSelected )
1410*b1cdbd2cSJim Jagielski 				{
1411*b1cdbd2cSJim Jagielski 					DeselectAllBut( pEntry );
1412*b1cdbd2cSJim Jagielski 					SetCursor( pEntry );
1413*b1cdbd2cSJim Jagielski 					pView->Select( pEntry, sal_True );
1414*b1cdbd2cSJim Jagielski 				}
1415*b1cdbd2cSJim Jagielski 				else
1416*b1cdbd2cSJim Jagielski 				{
1417*b1cdbd2cSJim Jagielski 					// erst im Up deselektieren, falls Move per D&D!
1418*b1cdbd2cSJim Jagielski 					nFlags |= F_DOWN_DESELECT;
1419*b1cdbd2cSJim Jagielski 					if( bEditingEnabled && IsTextHit( pEntry, aDocPos ) &&
1420*b1cdbd2cSJim Jagielski 						rMEvt.IsLeft())
1421*b1cdbd2cSJim Jagielski 					{
1422*b1cdbd2cSJim Jagielski 						nFlags |= F_START_EDITTIMER_IN_MOUSEUP;
1423*b1cdbd2cSJim Jagielski 					}
1424*b1cdbd2cSJim Jagielski 				}
1425*b1cdbd2cSJim Jagielski 			}
1426*b1cdbd2cSJim Jagielski 			else if( rMEvt.IsMod1() )
1427*b1cdbd2cSJim Jagielski 				nFlags |= F_DOWN_CTRL;
1428*b1cdbd2cSJim Jagielski 		}
1429*b1cdbd2cSJim Jagielski 	}
1430*b1cdbd2cSJim Jagielski }
1431*b1cdbd2cSJim Jagielski 
MouseButtonUp(const MouseEvent & rMEvt)1432*b1cdbd2cSJim Jagielski void SvImpIconView::MouseButtonUp( const MouseEvent& rMEvt )
1433*b1cdbd2cSJim Jagielski {
1434*b1cdbd2cSJim Jagielski 	aMouseMoveTimer.Stop();
1435*b1cdbd2cSJim Jagielski 	pView->ReleaseMouse();
1436*b1cdbd2cSJim Jagielski 	// HACK, da Einar noch nicht PrepareCommandEvent aufruft
1437*b1cdbd2cSJim Jagielski 	if( rMEvt.IsRight() && (nFlags & (F_DOWN_CTRL | F_DOWN_DESELECT) ))
1438*b1cdbd2cSJim Jagielski 		nFlags &= ~(F_DOWN_CTRL | F_DOWN_DESELECT);
1439*b1cdbd2cSJim Jagielski 
1440*b1cdbd2cSJim Jagielski 	if( nFlags & F_RUBBERING )
1441*b1cdbd2cSJim Jagielski 	{
1442*b1cdbd2cSJim Jagielski 		aMouseMoveTimer.Stop();
1443*b1cdbd2cSJim Jagielski 		AddSelectedRect( aCurSelectionRect );
1444*b1cdbd2cSJim Jagielski 		HideSelectionRect();
1445*b1cdbd2cSJim Jagielski 		nFlags &= ~(F_RUBBERING | F_ADD_MODE);
1446*b1cdbd2cSJim Jagielski 	}
1447*b1cdbd2cSJim Jagielski 
1448*b1cdbd2cSJim Jagielski 	SvLBoxEntry* pEntry = pView->GetEntry( rMEvt.GetPosPixel(), sal_True );
1449*b1cdbd2cSJim Jagielski 	if( pEntry )
1450*b1cdbd2cSJim Jagielski 	{
1451*b1cdbd2cSJim Jagielski 		if( nFlags & F_DOWN_CTRL )
1452*b1cdbd2cSJim Jagielski 		{
1453*b1cdbd2cSJim Jagielski 			// Ctrl & MultiSelection
1454*b1cdbd2cSJim Jagielski 			ToggleSelection( pEntry );
1455*b1cdbd2cSJim Jagielski 			SetCursor( pEntry );
1456*b1cdbd2cSJim Jagielski 		}
1457*b1cdbd2cSJim Jagielski 		else if( nFlags & F_DOWN_DESELECT )
1458*b1cdbd2cSJim Jagielski 		{
1459*b1cdbd2cSJim Jagielski 			DeselectAllBut( pEntry );
1460*b1cdbd2cSJim Jagielski 			SetCursor( pEntry );
1461*b1cdbd2cSJim Jagielski 			pView->Select( pEntry, sal_True );
1462*b1cdbd2cSJim Jagielski 		}
1463*b1cdbd2cSJim Jagielski 	}
1464*b1cdbd2cSJim Jagielski 
1465*b1cdbd2cSJim Jagielski 	nFlags &= ~(F_DOWN_CTRL | F_DOWN_DESELECT);
1466*b1cdbd2cSJim Jagielski 	if( nFlags & F_START_EDITTIMER_IN_MOUSEUP )
1467*b1cdbd2cSJim Jagielski 	{
1468*b1cdbd2cSJim Jagielski 		StartEditTimer();
1469*b1cdbd2cSJim Jagielski 		nFlags &= ~F_START_EDITTIMER_IN_MOUSEUP;
1470*b1cdbd2cSJim Jagielski 	}
1471*b1cdbd2cSJim Jagielski }
1472*b1cdbd2cSJim Jagielski 
MouseMove(const MouseEvent & rMEvt)1473*b1cdbd2cSJim Jagielski void SvImpIconView::MouseMove( const MouseEvent& rMEvt )
1474*b1cdbd2cSJim Jagielski {
1475*b1cdbd2cSJim Jagielski 	if( nFlags & F_RUBBERING )
1476*b1cdbd2cSJim Jagielski 	{
1477*b1cdbd2cSJim Jagielski 		const Point& rPosPixel = rMEvt.GetPosPixel();
1478*b1cdbd2cSJim Jagielski 		if( !aMouseMoveTimer.IsActive() )
1479*b1cdbd2cSJim Jagielski 		{
1480*b1cdbd2cSJim Jagielski 			aMouseMoveEvent = rMEvt;
1481*b1cdbd2cSJim Jagielski 			aMouseMoveTimer.Start();
1482*b1cdbd2cSJim Jagielski 			// ausserhalb des Fensters liegende Move-Events muessen
1483*b1cdbd2cSJim Jagielski 			// vom Timer kommen, damit die Scrollgeschwindigkeit
1484*b1cdbd2cSJim Jagielski 			// unabhaengig von Mausbewegungen ist.
1485*b1cdbd2cSJim Jagielski 			if( rPosPixel.X() < 0 || rPosPixel.Y() < 0 )
1486*b1cdbd2cSJim Jagielski 				return;
1487*b1cdbd2cSJim Jagielski 			const Size& rSize = pView->GetOutputSizePixel();
1488*b1cdbd2cSJim Jagielski 			if( rPosPixel.X() > rSize.Width() || rPosPixel.Y() > rSize.Height())
1489*b1cdbd2cSJim Jagielski 				return;
1490*b1cdbd2cSJim Jagielski 		}
1491*b1cdbd2cSJim Jagielski 
1492*b1cdbd2cSJim Jagielski 		if( &rMEvt != &aMouseMoveEvent )
1493*b1cdbd2cSJim Jagielski 			aMouseMoveEvent = rMEvt;
1494*b1cdbd2cSJim Jagielski 
1495*b1cdbd2cSJim Jagielski 		long nScrollDX, nScrollDY;
1496*b1cdbd2cSJim Jagielski 
1497*b1cdbd2cSJim Jagielski 		CalcScrollOffsets(rMEvt.GetPosPixel(),nScrollDX,nScrollDY,sal_False );
1498*b1cdbd2cSJim Jagielski 		sal_Bool bSelRectHidden = sal_False;
1499*b1cdbd2cSJim Jagielski 		if( nScrollDX || nScrollDY )
1500*b1cdbd2cSJim Jagielski 		{
1501*b1cdbd2cSJim Jagielski 			HideSelectionRect();
1502*b1cdbd2cSJim Jagielski 			bSelRectHidden = sal_True;
1503*b1cdbd2cSJim Jagielski 			pView->Scroll( nScrollDX, nScrollDY );
1504*b1cdbd2cSJim Jagielski 		}
1505*b1cdbd2cSJim Jagielski 		Point aDocPos( rMEvt.GetPosPixel() );
1506*b1cdbd2cSJim Jagielski 		aDocPos = pView->PixelToLogic( aDocPos );
1507*b1cdbd2cSJim Jagielski 		Rectangle aRect( aCurSelectionRect.TopLeft(), aDocPos );
1508*b1cdbd2cSJim Jagielski 		if( aRect != aCurSelectionRect )
1509*b1cdbd2cSJim Jagielski 		{
1510*b1cdbd2cSJim Jagielski 			HideSelectionRect();
1511*b1cdbd2cSJim Jagielski 			bSelRectHidden = sal_True;
1512*b1cdbd2cSJim Jagielski 			sal_Bool bAdd = (nFlags & F_ADD_MODE) ? sal_True : sal_False;
1513*b1cdbd2cSJim Jagielski 			SelectRect( aRect, bAdd, &aSelectedRectList );
1514*b1cdbd2cSJim Jagielski 		}
1515*b1cdbd2cSJim Jagielski 		if( bSelRectHidden )
1516*b1cdbd2cSJim Jagielski 			DrawSelectionRect( aRect );
1517*b1cdbd2cSJim Jagielski 	}
1518*b1cdbd2cSJim Jagielski }
1519*b1cdbd2cSJim Jagielski 
KeyInput(const KeyEvent & rKEvt)1520*b1cdbd2cSJim Jagielski sal_Bool SvImpIconView::KeyInput( const KeyEvent& rKEvt )
1521*b1cdbd2cSJim Jagielski {
1522*b1cdbd2cSJim Jagielski 	StopEditTimer();
1523*b1cdbd2cSJim Jagielski 	sal_Bool bKeyUsed = sal_True;
1524*b1cdbd2cSJim Jagielski 	sal_Bool bMod1 = rKEvt.GetKeyCode().IsMod1();
1525*b1cdbd2cSJim Jagielski 	sal_Bool bInAddMode = (sal_Bool)((nFlags & F_ADD_MODE) != 0);
1526*b1cdbd2cSJim Jagielski 	int bDeselAll = (pView->GetSelectionMode() != SINGLE_SELECTION) &&
1527*b1cdbd2cSJim Jagielski 					!bInAddMode;
1528*b1cdbd2cSJim Jagielski 	SvLBoxEntry* pNewCursor;
1529*b1cdbd2cSJim Jagielski 	sal_uInt16 nCode = rKEvt.GetKeyCode().GetCode();
1530*b1cdbd2cSJim Jagielski 	switch( nCode )
1531*b1cdbd2cSJim Jagielski 	{
1532*b1cdbd2cSJim Jagielski 		case KEY_UP:
1533*b1cdbd2cSJim Jagielski 			if( pCursor )
1534*b1cdbd2cSJim Jagielski 			{
1535*b1cdbd2cSJim Jagielski 				MakeVisible( pCursor );
1536*b1cdbd2cSJim Jagielski 				pNewCursor = pImpCursor->GoUpDown(pCursor,sal_False);
1537*b1cdbd2cSJim Jagielski 				if( pNewCursor )
1538*b1cdbd2cSJim Jagielski 				{
1539*b1cdbd2cSJim Jagielski 					if( bDeselAll )
1540*b1cdbd2cSJim Jagielski 						pView->SelectAll( sal_False );
1541*b1cdbd2cSJim Jagielski 					ShowCursor( sal_False );
1542*b1cdbd2cSJim Jagielski 					MakeVisible( pNewCursor );
1543*b1cdbd2cSJim Jagielski 					SetCursor( pNewCursor );
1544*b1cdbd2cSJim Jagielski 					if( !bInAddMode )
1545*b1cdbd2cSJim Jagielski 						pView->Select( pCursor, sal_True );
1546*b1cdbd2cSJim Jagielski 				}
1547*b1cdbd2cSJim Jagielski 				else
1548*b1cdbd2cSJim Jagielski 				{
1549*b1cdbd2cSJim Jagielski 					Rectangle aRect( GetBoundingRect( pCursor ) );
1550*b1cdbd2cSJim Jagielski 					if( aRect.Top())
1551*b1cdbd2cSJim Jagielski 					{
1552*b1cdbd2cSJim Jagielski 						aRect.Bottom() -= aRect.Top();
1553*b1cdbd2cSJim Jagielski 						aRect.Top() = 0;
1554*b1cdbd2cSJim Jagielski 						MakeVisible( aRect );
1555*b1cdbd2cSJim Jagielski 					}
1556*b1cdbd2cSJim Jagielski 				}
1557*b1cdbd2cSJim Jagielski 			}
1558*b1cdbd2cSJim Jagielski 			break;
1559*b1cdbd2cSJim Jagielski 
1560*b1cdbd2cSJim Jagielski 		case KEY_DOWN:
1561*b1cdbd2cSJim Jagielski 			if( pCursor )
1562*b1cdbd2cSJim Jagielski 			{
1563*b1cdbd2cSJim Jagielski 				pNewCursor=pImpCursor->GoUpDown( pCursor,sal_True );
1564*b1cdbd2cSJim Jagielski 				if( pNewCursor )
1565*b1cdbd2cSJim Jagielski 				{
1566*b1cdbd2cSJim Jagielski 					MakeVisible( pCursor );
1567*b1cdbd2cSJim Jagielski 					if( bDeselAll )
1568*b1cdbd2cSJim Jagielski 						pView->SelectAll( sal_False );
1569*b1cdbd2cSJim Jagielski 					ShowCursor( sal_False );
1570*b1cdbd2cSJim Jagielski 					MakeVisible( pNewCursor );
1571*b1cdbd2cSJim Jagielski 					SetCursor( pNewCursor );
1572*b1cdbd2cSJim Jagielski 					if( !bInAddMode )
1573*b1cdbd2cSJim Jagielski 						pView->Select( pCursor, sal_True );
1574*b1cdbd2cSJim Jagielski 				}
1575*b1cdbd2cSJim Jagielski 			}
1576*b1cdbd2cSJim Jagielski 			break;
1577*b1cdbd2cSJim Jagielski 
1578*b1cdbd2cSJim Jagielski 		case KEY_RIGHT:
1579*b1cdbd2cSJim Jagielski 			if( pCursor )
1580*b1cdbd2cSJim Jagielski 			{
1581*b1cdbd2cSJim Jagielski 				pNewCursor=pImpCursor->GoLeftRight(pCursor,sal_True );
1582*b1cdbd2cSJim Jagielski 				if( pNewCursor )
1583*b1cdbd2cSJim Jagielski 				{
1584*b1cdbd2cSJim Jagielski 					MakeVisible( pCursor );
1585*b1cdbd2cSJim Jagielski 					if( bDeselAll )
1586*b1cdbd2cSJim Jagielski 						pView->SelectAll( sal_False );
1587*b1cdbd2cSJim Jagielski 					ShowCursor( sal_False );
1588*b1cdbd2cSJim Jagielski 					MakeVisible( pNewCursor );
1589*b1cdbd2cSJim Jagielski 					SetCursor( pNewCursor );
1590*b1cdbd2cSJim Jagielski 					if( !bInAddMode )
1591*b1cdbd2cSJim Jagielski 						pView->Select( pCursor, sal_True );
1592*b1cdbd2cSJim Jagielski 				}
1593*b1cdbd2cSJim Jagielski 			}
1594*b1cdbd2cSJim Jagielski 			break;
1595*b1cdbd2cSJim Jagielski 
1596*b1cdbd2cSJim Jagielski 		case KEY_LEFT:
1597*b1cdbd2cSJim Jagielski 			if( pCursor )
1598*b1cdbd2cSJim Jagielski 			{
1599*b1cdbd2cSJim Jagielski 				MakeVisible( pCursor );
1600*b1cdbd2cSJim Jagielski 				pNewCursor = pImpCursor->GoLeftRight(pCursor,sal_False );
1601*b1cdbd2cSJim Jagielski 				if( pNewCursor )
1602*b1cdbd2cSJim Jagielski 				{
1603*b1cdbd2cSJim Jagielski 					if( bDeselAll )
1604*b1cdbd2cSJim Jagielski 						pView->SelectAll( sal_False );
1605*b1cdbd2cSJim Jagielski 					ShowCursor( sal_False );
1606*b1cdbd2cSJim Jagielski 					MakeVisible( pNewCursor );
1607*b1cdbd2cSJim Jagielski 					SetCursor( pNewCursor );
1608*b1cdbd2cSJim Jagielski 					if( !bInAddMode )
1609*b1cdbd2cSJim Jagielski 						pView->Select( pCursor, sal_True );
1610*b1cdbd2cSJim Jagielski 				}
1611*b1cdbd2cSJim Jagielski 				else
1612*b1cdbd2cSJim Jagielski 				{
1613*b1cdbd2cSJim Jagielski 					Rectangle aRect( GetBoundingRect(pCursor));
1614*b1cdbd2cSJim Jagielski 					if( aRect.Left() )
1615*b1cdbd2cSJim Jagielski 					{
1616*b1cdbd2cSJim Jagielski 						aRect.Right() -= aRect.Left();
1617*b1cdbd2cSJim Jagielski 						aRect.Left() = 0;
1618*b1cdbd2cSJim Jagielski 						MakeVisible( aRect );
1619*b1cdbd2cSJim Jagielski 					}
1620*b1cdbd2cSJim Jagielski 				}
1621*b1cdbd2cSJim Jagielski 			}
1622*b1cdbd2cSJim Jagielski 			break;
1623*b1cdbd2cSJim Jagielski 
1624*b1cdbd2cSJim Jagielski 		case KEY_ESCAPE:
1625*b1cdbd2cSJim Jagielski 			if( nFlags & F_RUBBERING )
1626*b1cdbd2cSJim Jagielski 			{
1627*b1cdbd2cSJim Jagielski 				HideSelectionRect();
1628*b1cdbd2cSJim Jagielski 				pView->SelectAll( sal_False );
1629*b1cdbd2cSJim Jagielski 				nFlags &= ~F_RUBBERING;
1630*b1cdbd2cSJim Jagielski 			}
1631*b1cdbd2cSJim Jagielski 			break;
1632*b1cdbd2cSJim Jagielski 
1633*b1cdbd2cSJim Jagielski 		case KEY_F8:
1634*b1cdbd2cSJim Jagielski 			if( rKEvt.GetKeyCode().IsShift() )
1635*b1cdbd2cSJim Jagielski 			{
1636*b1cdbd2cSJim Jagielski 				if( nFlags & F_ADD_MODE )
1637*b1cdbd2cSJim Jagielski 					nFlags &= (~F_ADD_MODE);
1638*b1cdbd2cSJim Jagielski 				else
1639*b1cdbd2cSJim Jagielski 					nFlags |= F_ADD_MODE;
1640*b1cdbd2cSJim Jagielski 			}
1641*b1cdbd2cSJim Jagielski 			break;
1642*b1cdbd2cSJim Jagielski 
1643*b1cdbd2cSJim Jagielski #ifdef OS2
1644*b1cdbd2cSJim Jagielski 		case KEY_F9:
1645*b1cdbd2cSJim Jagielski 			if( rKEvt.GetKeyCode().IsShift() )
1646*b1cdbd2cSJim Jagielski 			{
1647*b1cdbd2cSJim Jagielski 				if( pCursor && pView->IsInplaceEditingEnabled() )
1648*b1cdbd2cSJim Jagielski 					pView->EditEntry( pCursor );
1649*b1cdbd2cSJim Jagielski 			}
1650*b1cdbd2cSJim Jagielski 			break;
1651*b1cdbd2cSJim Jagielski #endif
1652*b1cdbd2cSJim Jagielski 
1653*b1cdbd2cSJim Jagielski 		case KEY_SPACE:
1654*b1cdbd2cSJim Jagielski 			if( pCursor )
1655*b1cdbd2cSJim Jagielski 			{
1656*b1cdbd2cSJim Jagielski 				ToggleSelection( pCursor );
1657*b1cdbd2cSJim Jagielski 			}
1658*b1cdbd2cSJim Jagielski 			break;
1659*b1cdbd2cSJim Jagielski 
1660*b1cdbd2cSJim Jagielski 
1661*b1cdbd2cSJim Jagielski 		case KEY_PAGEDOWN:
1662*b1cdbd2cSJim Jagielski 			break;
1663*b1cdbd2cSJim Jagielski 		case KEY_PAGEUP:
1664*b1cdbd2cSJim Jagielski 			break;
1665*b1cdbd2cSJim Jagielski 
1666*b1cdbd2cSJim Jagielski 		case KEY_ADD:
1667*b1cdbd2cSJim Jagielski 		case KEY_DIVIDE :
1668*b1cdbd2cSJim Jagielski 			if( bMod1 )
1669*b1cdbd2cSJim Jagielski 				pView->SelectAll( sal_True );
1670*b1cdbd2cSJim Jagielski 			break;
1671*b1cdbd2cSJim Jagielski 
1672*b1cdbd2cSJim Jagielski 		case KEY_SUBTRACT:
1673*b1cdbd2cSJim Jagielski 		case KEY_COMMA :
1674*b1cdbd2cSJim Jagielski 			if( bMod1 )
1675*b1cdbd2cSJim Jagielski 				pView->SelectAll( sal_False );
1676*b1cdbd2cSJim Jagielski 			break;
1677*b1cdbd2cSJim Jagielski 
1678*b1cdbd2cSJim Jagielski 		case KEY_RETURN:
1679*b1cdbd2cSJim Jagielski 			if( bMod1 )
1680*b1cdbd2cSJim Jagielski 			{
1681*b1cdbd2cSJim Jagielski 				if( pCursor && pView->IsInplaceEditingEnabled() )
1682*b1cdbd2cSJim Jagielski 					pView->EditEntry( pCursor );
1683*b1cdbd2cSJim Jagielski 			}
1684*b1cdbd2cSJim Jagielski 			break;
1685*b1cdbd2cSJim Jagielski 
1686*b1cdbd2cSJim Jagielski 		default:
1687*b1cdbd2cSJim Jagielski 			bKeyUsed = sal_False;
1688*b1cdbd2cSJim Jagielski 
1689*b1cdbd2cSJim Jagielski 	}
1690*b1cdbd2cSJim Jagielski 	return bKeyUsed;
1691*b1cdbd2cSJim Jagielski }
1692*b1cdbd2cSJim Jagielski 
1693*b1cdbd2cSJim Jagielski 
PositionScrollBars(long nRealWidth,long nRealHeight)1694*b1cdbd2cSJim Jagielski void SvImpIconView::PositionScrollBars( long nRealWidth, long nRealHeight )
1695*b1cdbd2cSJim Jagielski {
1696*b1cdbd2cSJim Jagielski 	// hor scrollbar
1697*b1cdbd2cSJim Jagielski 	Point aPos( 0, nRealHeight );
1698*b1cdbd2cSJim Jagielski 	aPos.Y() -= nHorSBarHeight;
1699*b1cdbd2cSJim Jagielski 
1700*b1cdbd2cSJim Jagielski #ifdef OS2
1701*b1cdbd2cSJim Jagielski 	aPos.Y()++;
1702*b1cdbd2cSJim Jagielski #endif
1703*b1cdbd2cSJim Jagielski 	if( aHorSBar.GetPosPixel() != aPos )
1704*b1cdbd2cSJim Jagielski 		aHorSBar.SetPosPixel( aPos );
1705*b1cdbd2cSJim Jagielski 
1706*b1cdbd2cSJim Jagielski 	// ver scrollbar
1707*b1cdbd2cSJim Jagielski 	aPos.X() = nRealWidth; aPos.Y() = 0;
1708*b1cdbd2cSJim Jagielski 	aPos.X() -= nVerSBarWidth;
1709*b1cdbd2cSJim Jagielski 
1710*b1cdbd2cSJim Jagielski #if defined(WNT)
1711*b1cdbd2cSJim Jagielski 	aPos.X()++;
1712*b1cdbd2cSJim Jagielski 	aPos.Y()--;
1713*b1cdbd2cSJim Jagielski #endif
1714*b1cdbd2cSJim Jagielski 
1715*b1cdbd2cSJim Jagielski #ifdef OS2
1716*b1cdbd2cSJim Jagielski 	aPos.Y()--;
1717*b1cdbd2cSJim Jagielski 	aPos.X()++;
1718*b1cdbd2cSJim Jagielski #endif
1719*b1cdbd2cSJim Jagielski 
1720*b1cdbd2cSJim Jagielski 	if( aVerSBar.GetPosPixel() != aPos )
1721*b1cdbd2cSJim Jagielski 		aVerSBar.SetPosPixel( aPos );
1722*b1cdbd2cSJim Jagielski }
1723*b1cdbd2cSJim Jagielski 
1724*b1cdbd2cSJim Jagielski 
1725*b1cdbd2cSJim Jagielski 
AdjustScrollBars()1726*b1cdbd2cSJim Jagielski void SvImpIconView::AdjustScrollBars()
1727*b1cdbd2cSJim Jagielski {
1728*b1cdbd2cSJim Jagielski 	long nVirtHeight = aVirtOutputSize.Height();
1729*b1cdbd2cSJim Jagielski 	long nVirtWidth = aVirtOutputSize.Width();
1730*b1cdbd2cSJim Jagielski 
1731*b1cdbd2cSJim Jagielski 	Size aOSize( pView->Control::GetOutputSizePixel() );
1732*b1cdbd2cSJim Jagielski 	long nRealHeight = aOSize.Height();
1733*b1cdbd2cSJim Jagielski 	long nRealWidth = aOSize.Width();
1734*b1cdbd2cSJim Jagielski 
1735*b1cdbd2cSJim Jagielski 	PositionScrollBars( nRealWidth, nRealHeight );
1736*b1cdbd2cSJim Jagielski 
1737*b1cdbd2cSJim Jagielski 	const MapMode& rMapMode = pView->GetMapMode();
1738*b1cdbd2cSJim Jagielski 	Point aOrigin( rMapMode.GetOrigin() );
1739*b1cdbd2cSJim Jagielski 
1740*b1cdbd2cSJim Jagielski 	long nVisibleWidth;
1741*b1cdbd2cSJim Jagielski 	if( nRealWidth > nVirtWidth )
1742*b1cdbd2cSJim Jagielski 		nVisibleWidth = nVirtWidth + aOrigin.X();
1743*b1cdbd2cSJim Jagielski 	else
1744*b1cdbd2cSJim Jagielski 		nVisibleWidth = nRealWidth;
1745*b1cdbd2cSJim Jagielski 
1746*b1cdbd2cSJim Jagielski 	long nVisibleHeight;
1747*b1cdbd2cSJim Jagielski 	if( nRealHeight > nVirtHeight )
1748*b1cdbd2cSJim Jagielski 		nVisibleHeight = nVirtHeight + aOrigin.Y();
1749*b1cdbd2cSJim Jagielski 	else
1750*b1cdbd2cSJim Jagielski 		nVisibleHeight = nRealHeight;
1751*b1cdbd2cSJim Jagielski 
1752*b1cdbd2cSJim Jagielski 	bool bVerSBar = (pView->GetStyle() & WB_VSCROLL) ? true : false;
1753*b1cdbd2cSJim Jagielski 	bool bHorSBar = (pView->GetStyle() & WB_HSCROLL) ? true : false;
1754*b1cdbd2cSJim Jagielski 
1755*b1cdbd2cSJim Jagielski 	sal_uInt16 nResult = 0;
1756*b1cdbd2cSJim Jagielski 	if( nVirtHeight )
1757*b1cdbd2cSJim Jagielski 	{
1758*b1cdbd2cSJim Jagielski 		// activate ver scrollbar ?
1759*b1cdbd2cSJim Jagielski 		if( bVerSBar || ( nVirtHeight > nVisibleHeight) )
1760*b1cdbd2cSJim Jagielski 		{
1761*b1cdbd2cSJim Jagielski 			nResult = 0x0001;
1762*b1cdbd2cSJim Jagielski 			nRealWidth -= nVerSBarWidth;
1763*b1cdbd2cSJim Jagielski 
1764*b1cdbd2cSJim Jagielski 			if( nRealWidth > nVirtWidth )
1765*b1cdbd2cSJim Jagielski 				nVisibleWidth = nVirtWidth + aOrigin.X();
1766*b1cdbd2cSJim Jagielski 			else
1767*b1cdbd2cSJim Jagielski 				nVisibleWidth = nRealWidth;
1768*b1cdbd2cSJim Jagielski 
1769*b1cdbd2cSJim Jagielski 			nFlags |= F_HOR_SBARSIZE_WITH_VBAR;
1770*b1cdbd2cSJim Jagielski 		}
1771*b1cdbd2cSJim Jagielski 		// activate hor scrollbar ?
1772*b1cdbd2cSJim Jagielski 		if( bHorSBar || (nVirtWidth > nVisibleWidth) )
1773*b1cdbd2cSJim Jagielski 		{
1774*b1cdbd2cSJim Jagielski 			nResult |= 0x0002;
1775*b1cdbd2cSJim Jagielski 			nRealHeight -= nHorSBarHeight;
1776*b1cdbd2cSJim Jagielski 
1777*b1cdbd2cSJim Jagielski 			if( nRealHeight > nVirtHeight )
1778*b1cdbd2cSJim Jagielski 				nVisibleHeight = nVirtHeight + aOrigin.Y();
1779*b1cdbd2cSJim Jagielski 			else
1780*b1cdbd2cSJim Jagielski 				nVisibleHeight = nRealHeight;
1781*b1cdbd2cSJim Jagielski 
1782*b1cdbd2cSJim Jagielski 			// brauchen wir jetzt doch eine senkrechte Scrollbar ?
1783*b1cdbd2cSJim Jagielski 			if( !(nResult & 0x0001) &&  // nur wenn nicht schon da
1784*b1cdbd2cSJim Jagielski 				( (nVirtHeight > nVisibleHeight) || bVerSBar) )
1785*b1cdbd2cSJim Jagielski 			{
1786*b1cdbd2cSJim Jagielski 				nResult = 3; // both are active
1787*b1cdbd2cSJim Jagielski 				nRealWidth -= nVerSBarWidth;
1788*b1cdbd2cSJim Jagielski 
1789*b1cdbd2cSJim Jagielski 				if( nRealWidth > nVirtWidth )
1790*b1cdbd2cSJim Jagielski 					nVisibleWidth = nVirtWidth + aOrigin.X();
1791*b1cdbd2cSJim Jagielski 				else
1792*b1cdbd2cSJim Jagielski 					nVisibleWidth = nRealWidth;
1793*b1cdbd2cSJim Jagielski 
1794*b1cdbd2cSJim Jagielski 				nFlags |= F_VER_SBARSIZE_WITH_HBAR;
1795*b1cdbd2cSJim Jagielski 			}
1796*b1cdbd2cSJim Jagielski 		}
1797*b1cdbd2cSJim Jagielski 	}
1798*b1cdbd2cSJim Jagielski 
1799*b1cdbd2cSJim Jagielski 	// size ver scrollbar
1800*b1cdbd2cSJim Jagielski 	long nThumb = aVerSBar.GetThumbPos();
1801*b1cdbd2cSJim Jagielski 	Size aSize( nVerSBarWidth, nRealHeight );
1802*b1cdbd2cSJim Jagielski #if defined(WNT)
1803*b1cdbd2cSJim Jagielski 	aSize.Height() += 2;
1804*b1cdbd2cSJim Jagielski #endif
1805*b1cdbd2cSJim Jagielski #ifdef OS2
1806*b1cdbd2cSJim Jagielski 	aSize.Height() += 3;
1807*b1cdbd2cSJim Jagielski #endif
1808*b1cdbd2cSJim Jagielski 	if( aSize != aVerSBar.GetSizePixel() )
1809*b1cdbd2cSJim Jagielski 		aVerSBar.SetSizePixel( aSize );
1810*b1cdbd2cSJim Jagielski 	aVerSBar.SetVisibleSize( nVisibleHeight );
1811*b1cdbd2cSJim Jagielski 	aVerSBar.SetPageSize( (nVisibleHeight*75)/100 );
1812*b1cdbd2cSJim Jagielski 	if( nResult & 0x0001 )
1813*b1cdbd2cSJim Jagielski 	{
1814*b1cdbd2cSJim Jagielski 		aVerSBar.SetThumbPos( nThumb );
1815*b1cdbd2cSJim Jagielski 		aVerSBar.Show();
1816*b1cdbd2cSJim Jagielski 	}
1817*b1cdbd2cSJim Jagielski 	else
1818*b1cdbd2cSJim Jagielski 	{
1819*b1cdbd2cSJim Jagielski 		aVerSBar.SetThumbPos( 0 );
1820*b1cdbd2cSJim Jagielski 		aVerSBar.Hide();
1821*b1cdbd2cSJim Jagielski 	}
1822*b1cdbd2cSJim Jagielski 
1823*b1cdbd2cSJim Jagielski 	// size hor scrollbar
1824*b1cdbd2cSJim Jagielski 	nThumb = aHorSBar.GetThumbPos();
1825*b1cdbd2cSJim Jagielski 	aSize.Width() = nRealWidth;
1826*b1cdbd2cSJim Jagielski 	aSize.Height() = nHorSBarHeight;
1827*b1cdbd2cSJim Jagielski #if defined(WNT)
1828*b1cdbd2cSJim Jagielski 	aSize.Width()++;
1829*b1cdbd2cSJim Jagielski #endif
1830*b1cdbd2cSJim Jagielski #ifdef OS2
1831*b1cdbd2cSJim Jagielski 	aSize.Width() += 3;
1832*b1cdbd2cSJim Jagielski 	if( nResult & 0x0001 ) // vertikale Scrollbar ?
1833*b1cdbd2cSJim Jagielski 		aSize.Width()--;
1834*b1cdbd2cSJim Jagielski #endif
1835*b1cdbd2cSJim Jagielski #if defined(WNT)
1836*b1cdbd2cSJim Jagielski 	if( nResult & 0x0001 ) // vertikale Scrollbar ?
1837*b1cdbd2cSJim Jagielski 	{
1838*b1cdbd2cSJim Jagielski 		aSize.Width()++;
1839*b1cdbd2cSJim Jagielski 		nRealWidth++;
1840*b1cdbd2cSJim Jagielski 	}
1841*b1cdbd2cSJim Jagielski #endif
1842*b1cdbd2cSJim Jagielski 	if( aSize != aHorSBar.GetSizePixel() )
1843*b1cdbd2cSJim Jagielski 		aHorSBar.SetSizePixel( aSize );
1844*b1cdbd2cSJim Jagielski 	aHorSBar.SetVisibleSize( nVisibleWidth ); //nRealWidth );
1845*b1cdbd2cSJim Jagielski 	aHorSBar.SetPageSize( (nVisibleWidth*75)/100 );
1846*b1cdbd2cSJim Jagielski 	if( nResult & 0x0002 )
1847*b1cdbd2cSJim Jagielski 	{
1848*b1cdbd2cSJim Jagielski 		aHorSBar.SetThumbPos( nThumb );
1849*b1cdbd2cSJim Jagielski 		aHorSBar.Show();
1850*b1cdbd2cSJim Jagielski 	}
1851*b1cdbd2cSJim Jagielski 	else
1852*b1cdbd2cSJim Jagielski 	{
1853*b1cdbd2cSJim Jagielski 		aHorSBar.SetThumbPos( 0 );
1854*b1cdbd2cSJim Jagielski 		aHorSBar.Hide();
1855*b1cdbd2cSJim Jagielski 	}
1856*b1cdbd2cSJim Jagielski 
1857*b1cdbd2cSJim Jagielski #ifdef OS2
1858*b1cdbd2cSJim Jagielski 	nRealWidth++;
1859*b1cdbd2cSJim Jagielski #endif
1860*b1cdbd2cSJim Jagielski 	aOutputSize.Width() = nRealWidth;
1861*b1cdbd2cSJim Jagielski #if defined(WNT)
1862*b1cdbd2cSJim Jagielski 	if( nResult & 0x0002 ) // hor scrollbar ?
1863*b1cdbd2cSJim Jagielski 		nRealHeight++; // weil unterer Rand geclippt wird
1864*b1cdbd2cSJim Jagielski #endif
1865*b1cdbd2cSJim Jagielski #ifdef OS2
1866*b1cdbd2cSJim Jagielski 	if( nResult & 0x0002 ) // hor scrollbar ?
1867*b1cdbd2cSJim Jagielski 		nRealHeight++;
1868*b1cdbd2cSJim Jagielski #endif
1869*b1cdbd2cSJim Jagielski 	aOutputSize.Height() = nRealHeight;
1870*b1cdbd2cSJim Jagielski }
1871*b1cdbd2cSJim Jagielski 
Resize()1872*b1cdbd2cSJim Jagielski void __EXPORT SvImpIconView::Resize()
1873*b1cdbd2cSJim Jagielski {
1874*b1cdbd2cSJim Jagielski 	StopEditTimer();
1875*b1cdbd2cSJim Jagielski 	Rectangle aRect;
1876*b1cdbd2cSJim Jagielski 	if( GetResizeRect(aRect) )
1877*b1cdbd2cSJim Jagielski 		pView->Invalidate( aRect );
1878*b1cdbd2cSJim Jagielski 	aOutputSize = pView->GetOutputSizePixel();
1879*b1cdbd2cSJim Jagielski 	pImpCursor->Clear();
1880*b1cdbd2cSJim Jagielski 
1881*b1cdbd2cSJim Jagielski #if 1
1882*b1cdbd2cSJim Jagielski 	const Size& rSize = pView->Control::GetOutputSizePixel();
1883*b1cdbd2cSJim Jagielski 	PositionScrollBars( rSize.Width(), rSize.Height() );
1884*b1cdbd2cSJim Jagielski 	// Die ScrollBars werden asynchron ein/ausgeblendet, damit abgeleitete
1885*b1cdbd2cSJim Jagielski 	// Klassen im Resize ein Arrange durchfuehren koennen, ohne dass
1886*b1cdbd2cSJim Jagielski 	// die ScrollBars aufblitzen (SfxExplorerIconView!)
1887*b1cdbd2cSJim Jagielski 	nCurUserEvent = Application::PostUserEvent(LINK(this,SvImpIconView,UserEventHdl),0);
1888*b1cdbd2cSJim Jagielski #else
1889*b1cdbd2cSJim Jagielski 	AdjustScrollBars();
1890*b1cdbd2cSJim Jagielski 	if( GetResizeRect(aRect) )
1891*b1cdbd2cSJim Jagielski 		PaintResizeRect( aRect );
1892*b1cdbd2cSJim Jagielski #endif
1893*b1cdbd2cSJim Jagielski }
1894*b1cdbd2cSJim Jagielski 
CheckHorScrollBar()1895*b1cdbd2cSJim Jagielski sal_Bool SvImpIconView::CheckHorScrollBar()
1896*b1cdbd2cSJim Jagielski {
1897*b1cdbd2cSJim Jagielski 	if( !pZOrderList || !aHorSBar.IsVisible() )
1898*b1cdbd2cSJim Jagielski 		return sal_False;
1899*b1cdbd2cSJim Jagielski 	const MapMode& rMapMode = pView->GetMapMode();
1900*b1cdbd2cSJim Jagielski 	Point aOrigin( rMapMode.GetOrigin() );
1901*b1cdbd2cSJim Jagielski 	if(!(pView->GetStyle() & WB_HSCROLL) && !aOrigin.X() )
1902*b1cdbd2cSJim Jagielski 	{
1903*b1cdbd2cSJim Jagielski 		long nWidth = aOutputSize.Width();
1904*b1cdbd2cSJim Jagielski 		sal_uInt16 nCount = pZOrderList->Count();
1905*b1cdbd2cSJim Jagielski 		long nMostRight = 0;
1906*b1cdbd2cSJim Jagielski 		for( sal_uInt16 nCur = 0; nCur < nCount; nCur++ )
1907*b1cdbd2cSJim Jagielski 		{
1908*b1cdbd2cSJim Jagielski 			SvLBoxEntry* pEntry = (SvLBoxEntry*)pZOrderList->operator[](nCur);
1909*b1cdbd2cSJim Jagielski 			long nRight = GetBoundingRect(pEntry).Right();
1910*b1cdbd2cSJim Jagielski 			if( nRight > nWidth )
1911*b1cdbd2cSJim Jagielski 				return sal_False;
1912*b1cdbd2cSJim Jagielski 			if( nRight > nMostRight )
1913*b1cdbd2cSJim Jagielski 				nMostRight = nRight;
1914*b1cdbd2cSJim Jagielski 		}
1915*b1cdbd2cSJim Jagielski 		aHorSBar.Hide();
1916*b1cdbd2cSJim Jagielski 		aOutputSize.Height() += nHorSBarHeight;
1917*b1cdbd2cSJim Jagielski 		aVirtOutputSize.Width() = nMostRight;
1918*b1cdbd2cSJim Jagielski 		aHorSBar.SetThumbPos( 0 );
1919*b1cdbd2cSJim Jagielski 		Range aRange;
1920*b1cdbd2cSJim Jagielski 		aRange.Max() = nMostRight - 1;
1921*b1cdbd2cSJim Jagielski 		aHorSBar.SetRange( aRange  );
1922*b1cdbd2cSJim Jagielski 		if( aVerSBar.IsVisible() )
1923*b1cdbd2cSJim Jagielski 		{
1924*b1cdbd2cSJim Jagielski 			Size aSize( aVerSBar.GetSizePixel());
1925*b1cdbd2cSJim Jagielski 			aSize.Height() += nHorSBarHeight;
1926*b1cdbd2cSJim Jagielski 			aVerSBar.SetSizePixel( aSize );
1927*b1cdbd2cSJim Jagielski 		}
1928*b1cdbd2cSJim Jagielski 		return sal_True;
1929*b1cdbd2cSJim Jagielski 	}
1930*b1cdbd2cSJim Jagielski 	return sal_False;
1931*b1cdbd2cSJim Jagielski }
1932*b1cdbd2cSJim Jagielski 
CheckVerScrollBar()1933*b1cdbd2cSJim Jagielski sal_Bool SvImpIconView::CheckVerScrollBar()
1934*b1cdbd2cSJim Jagielski {
1935*b1cdbd2cSJim Jagielski 	if( !pZOrderList || !aVerSBar.IsVisible() )
1936*b1cdbd2cSJim Jagielski 		return sal_False;
1937*b1cdbd2cSJim Jagielski 	const MapMode& rMapMode = pView->GetMapMode();
1938*b1cdbd2cSJim Jagielski 	Point aOrigin( rMapMode.GetOrigin() );
1939*b1cdbd2cSJim Jagielski 	if(!(pView->GetStyle() & WB_VSCROLL) && !aOrigin.Y() )
1940*b1cdbd2cSJim Jagielski 	{
1941*b1cdbd2cSJim Jagielski 		long nDeepest = 0;
1942*b1cdbd2cSJim Jagielski 		long nHeight = aOutputSize.Height();
1943*b1cdbd2cSJim Jagielski 		sal_uInt16 nCount = pZOrderList->Count();
1944*b1cdbd2cSJim Jagielski 		for( sal_uInt16 nCur = 0; nCur < nCount; nCur++ )
1945*b1cdbd2cSJim Jagielski 		{
1946*b1cdbd2cSJim Jagielski 			SvLBoxEntry* pEntry = (SvLBoxEntry*)pZOrderList->operator[](nCur);
1947*b1cdbd2cSJim Jagielski 			long nBottom = GetBoundingRect(pEntry).Bottom();
1948*b1cdbd2cSJim Jagielski 			if( nBottom > nHeight )
1949*b1cdbd2cSJim Jagielski 				return sal_False;
1950*b1cdbd2cSJim Jagielski 			if( nBottom > nDeepest )
1951*b1cdbd2cSJim Jagielski 				nDeepest = nBottom;
1952*b1cdbd2cSJim Jagielski 		}
1953*b1cdbd2cSJim Jagielski 		aVerSBar.Hide();
1954*b1cdbd2cSJim Jagielski 		aOutputSize.Width() += nVerSBarWidth;
1955*b1cdbd2cSJim Jagielski 		aVirtOutputSize.Height() = nDeepest;
1956*b1cdbd2cSJim Jagielski 		aVerSBar.SetThumbPos( 0 );
1957*b1cdbd2cSJim Jagielski 		Range aRange;
1958*b1cdbd2cSJim Jagielski 		aRange.Max() = nDeepest - 1;
1959*b1cdbd2cSJim Jagielski 		aVerSBar.SetRange( aRange  );
1960*b1cdbd2cSJim Jagielski 		if( aHorSBar.IsVisible() )
1961*b1cdbd2cSJim Jagielski 		{
1962*b1cdbd2cSJim Jagielski 			Size aSize( aHorSBar.GetSizePixel());
1963*b1cdbd2cSJim Jagielski 			aSize.Width() += nVerSBarWidth;
1964*b1cdbd2cSJim Jagielski 			aHorSBar.SetSizePixel( aSize );
1965*b1cdbd2cSJim Jagielski 		}
1966*b1cdbd2cSJim Jagielski 		return sal_True;
1967*b1cdbd2cSJim Jagielski 	}
1968*b1cdbd2cSJim Jagielski 	return sal_False;
1969*b1cdbd2cSJim Jagielski }
1970*b1cdbd2cSJim Jagielski 
1971*b1cdbd2cSJim Jagielski 
1972*b1cdbd2cSJim Jagielski // blendet Scrollbars aus, wenn sie nicht mehr benoetigt werden
CheckScrollBars()1973*b1cdbd2cSJim Jagielski void SvImpIconView::CheckScrollBars()
1974*b1cdbd2cSJim Jagielski {
1975*b1cdbd2cSJim Jagielski 	CheckVerScrollBar();
1976*b1cdbd2cSJim Jagielski 	if( CheckHorScrollBar() )
1977*b1cdbd2cSJim Jagielski 		CheckVerScrollBar();
1978*b1cdbd2cSJim Jagielski }
1979*b1cdbd2cSJim Jagielski 
1980*b1cdbd2cSJim Jagielski 
GetFocus()1981*b1cdbd2cSJim Jagielski void __EXPORT SvImpIconView::GetFocus()
1982*b1cdbd2cSJim Jagielski {
1983*b1cdbd2cSJim Jagielski 	if( pCursor )
1984*b1cdbd2cSJim Jagielski 	{
1985*b1cdbd2cSJim Jagielski 		pView->SetEntryFocus( pCursor, sal_True );
1986*b1cdbd2cSJim Jagielski 		ShowCursor( sal_True );
1987*b1cdbd2cSJim Jagielski 	}
1988*b1cdbd2cSJim Jagielski }
1989*b1cdbd2cSJim Jagielski 
LoseFocus()1990*b1cdbd2cSJim Jagielski void __EXPORT SvImpIconView::LoseFocus()
1991*b1cdbd2cSJim Jagielski {
1992*b1cdbd2cSJim Jagielski 	StopEditTimer();
1993*b1cdbd2cSJim Jagielski 	if( pCursor )
1994*b1cdbd2cSJim Jagielski 		pView->SetEntryFocus( pCursor,sal_False );
1995*b1cdbd2cSJim Jagielski 	ShowCursor( sal_False );
1996*b1cdbd2cSJim Jagielski }
1997*b1cdbd2cSJim Jagielski 
UpdateAll()1998*b1cdbd2cSJim Jagielski void SvImpIconView::UpdateAll()
1999*b1cdbd2cSJim Jagielski {
2000*b1cdbd2cSJim Jagielski 	AdjustScrollBars();
2001*b1cdbd2cSJim Jagielski 	pImpCursor->Clear();
2002*b1cdbd2cSJim Jagielski 	pView->Invalidate();
2003*b1cdbd2cSJim Jagielski }
2004*b1cdbd2cSJim Jagielski 
PaintEntry(SvLBoxEntry * pEntry,SvIcnVwDataEntry * pViewData)2005*b1cdbd2cSJim Jagielski void SvImpIconView::PaintEntry( SvLBoxEntry* pEntry, SvIcnVwDataEntry* pViewData )
2006*b1cdbd2cSJim Jagielski {
2007*b1cdbd2cSJim Jagielski 	Point aPos( GetEntryPosition( pEntry ) );
2008*b1cdbd2cSJim Jagielski 	PaintEntry( pEntry, aPos, pViewData );
2009*b1cdbd2cSJim Jagielski }
2010*b1cdbd2cSJim Jagielski 
PaintEmphasis(const Rectangle & rRect,sal_Bool bSelected,sal_Bool bCursored,OutputDevice * pOut)2011*b1cdbd2cSJim Jagielski void SvImpIconView::PaintEmphasis( const Rectangle& rRect, sal_Bool bSelected,
2012*b1cdbd2cSJim Jagielski 								   sal_Bool bCursored, OutputDevice* pOut )
2013*b1cdbd2cSJim Jagielski {
2014*b1cdbd2cSJim Jagielski 	// HACK fuer D&D
2015*b1cdbd2cSJim Jagielski 	if( nFlags & F_NO_EMPHASIS )
2016*b1cdbd2cSJim Jagielski 		return;
2017*b1cdbd2cSJim Jagielski 
2018*b1cdbd2cSJim Jagielski 	if( !pOut )
2019*b1cdbd2cSJim Jagielski 		pOut = pView;
2020*b1cdbd2cSJim Jagielski 
2021*b1cdbd2cSJim Jagielski 	// Selektion painten
2022*b1cdbd2cSJim Jagielski 	Color aOldFillColor =  pOut->GetFillColor();
2023*b1cdbd2cSJim Jagielski 	Color aOldLineColor =  pOut->GetLineColor();
2024*b1cdbd2cSJim Jagielski 	Color aNewColor;
2025*b1cdbd2cSJim Jagielski 	const StyleSettings& rStyleSettings = pOut->GetSettings().GetStyleSettings();
2026*b1cdbd2cSJim Jagielski 	if( bSelected )
2027*b1cdbd2cSJim Jagielski 	{
2028*b1cdbd2cSJim Jagielski 		aNewColor = rStyleSettings.GetHighlightColor();
2029*b1cdbd2cSJim Jagielski 	}
2030*b1cdbd2cSJim Jagielski 	else
2031*b1cdbd2cSJim Jagielski 	{
2032*b1cdbd2cSJim Jagielski #ifndef OS2
2033*b1cdbd2cSJim Jagielski 		aNewColor =rStyleSettings.GetFieldColor();
2034*b1cdbd2cSJim Jagielski #else
2035*b1cdbd2cSJim Jagielski 		aNewColor = pOut->GetBackground().GetColor();
2036*b1cdbd2cSJim Jagielski #endif
2037*b1cdbd2cSJim Jagielski 	}
2038*b1cdbd2cSJim Jagielski 
2039*b1cdbd2cSJim Jagielski 	if( bCursored )
2040*b1cdbd2cSJim Jagielski 	{
2041*b1cdbd2cSJim Jagielski 		pOut->SetLineColor( Color( COL_BLACK ) );
2042*b1cdbd2cSJim Jagielski 	}
2043*b1cdbd2cSJim Jagielski 	pOut->SetFillColor( aNewColor );
2044*b1cdbd2cSJim Jagielski 	pOut->DrawRect( rRect );
2045*b1cdbd2cSJim Jagielski 	pOut->SetFillColor( aOldFillColor );
2046*b1cdbd2cSJim Jagielski 	pOut->SetLineColor( aOldLineColor );
2047*b1cdbd2cSJim Jagielski }
2048*b1cdbd2cSJim Jagielski 
PaintItem(const Rectangle & rRect,SvLBoxItem * pItem,SvLBoxEntry * pEntry,sal_uInt16 nPaintFlags,OutputDevice * pOut)2049*b1cdbd2cSJim Jagielski void SvImpIconView::PaintItem( const Rectangle& rRect,
2050*b1cdbd2cSJim Jagielski 	SvLBoxItem* pItem, SvLBoxEntry* pEntry, sal_uInt16 nPaintFlags,
2051*b1cdbd2cSJim Jagielski 	OutputDevice* pOut )
2052*b1cdbd2cSJim Jagielski {
2053*b1cdbd2cSJim Jagielski 	if( nViewMode == VIEWMODE_ICON && pItem->IsA() == SV_ITEM_ID_LBOXSTRING )
2054*b1cdbd2cSJim Jagielski 	{
2055*b1cdbd2cSJim Jagielski 		const String& rStr = ((SvLBoxString*)pItem)->GetText();
2056*b1cdbd2cSJim Jagielski 		DrawText( pOut, rRect, rStr, DRAWTEXT_FLAGS );
2057*b1cdbd2cSJim Jagielski 	}
2058*b1cdbd2cSJim Jagielski 	else
2059*b1cdbd2cSJim Jagielski 	{
2060*b1cdbd2cSJim Jagielski 		Point aPos( rRect.TopLeft() );
2061*b1cdbd2cSJim Jagielski 		const Size& rSize = GetItemSize( pView, pEntry, pItem );
2062*b1cdbd2cSJim Jagielski 		if( nPaintFlags & PAINTFLAG_HOR_CENTERED )
2063*b1cdbd2cSJim Jagielski 			aPos.X() += (rRect.GetWidth() - rSize.Width() ) / 2;
2064*b1cdbd2cSJim Jagielski 		if( nPaintFlags & PAINTFLAG_VER_CENTERED )
2065*b1cdbd2cSJim Jagielski 			aPos.Y() += (rRect.GetHeight() - rSize.Height() ) / 2;
2066*b1cdbd2cSJim Jagielski 		pItem->Paint( aPos, *(SvLBox*)pOut, 0, pEntry );
2067*b1cdbd2cSJim Jagielski 	}
2068*b1cdbd2cSJim Jagielski }
2069*b1cdbd2cSJim Jagielski 
PaintEntry(SvLBoxEntry * pEntry,const Point & rPos,SvIcnVwDataEntry * pViewData,OutputDevice * pOut)2070*b1cdbd2cSJim Jagielski void SvImpIconView::PaintEntry( SvLBoxEntry* pEntry, const Point& rPos,
2071*b1cdbd2cSJim Jagielski 	SvIcnVwDataEntry* pViewData, OutputDevice* pOut )
2072*b1cdbd2cSJim Jagielski {
2073*b1cdbd2cSJim Jagielski 	if( !pView->IsUpdateMode() )
2074*b1cdbd2cSJim Jagielski 		return;
2075*b1cdbd2cSJim Jagielski 
2076*b1cdbd2cSJim Jagielski 	if( !pOut )
2077*b1cdbd2cSJim Jagielski 		pOut = pView;
2078*b1cdbd2cSJim Jagielski 
2079*b1cdbd2cSJim Jagielski 	SvLBoxContextBmp* pBmpItem;
2080*b1cdbd2cSJim Jagielski 
2081*b1cdbd2cSJim Jagielski 	pView->PreparePaint( pEntry );
2082*b1cdbd2cSJim Jagielski 
2083*b1cdbd2cSJim Jagielski 	if( !pViewData )
2084*b1cdbd2cSJim Jagielski 		pViewData = ICNVIEWDATA(pEntry);
2085*b1cdbd2cSJim Jagielski 
2086*b1cdbd2cSJim Jagielski 	SvLBoxString* pStringItem = (SvLBoxString*)(pEntry->GetFirstItem(SV_ITEM_ID_LBOXSTRING));
2087*b1cdbd2cSJim Jagielski 
2088*b1cdbd2cSJim Jagielski 	sal_Bool bSelected	= pViewData->IsSelected();
2089*b1cdbd2cSJim Jagielski 	sal_Bool bCursored	= pViewData->IsCursored();
2090*b1cdbd2cSJim Jagielski 
2091*b1cdbd2cSJim Jagielski 	Font aTempFont( pOut->GetFont() );
2092*b1cdbd2cSJim Jagielski 	// waehrend D&D nicht die Fontfarbe wechseln, da sonst auch die
2093*b1cdbd2cSJim Jagielski 	// Emphasis gezeichnet werden muss! (weisser Adler auf weissem Grund)
2094*b1cdbd2cSJim Jagielski 	if( bSelected && !(nFlags & F_NO_EMPHASIS) )
2095*b1cdbd2cSJim Jagielski 	{
2096*b1cdbd2cSJim Jagielski 		const StyleSettings& rStyleSettings = pOut->GetSettings().GetStyleSettings();
2097*b1cdbd2cSJim Jagielski 		Font aNewFont( aTempFont );
2098*b1cdbd2cSJim Jagielski 		aNewFont.SetColor( rStyleSettings.GetHighlightTextColor() );
2099*b1cdbd2cSJim Jagielski 		pOut->SetFont( aNewFont );
2100*b1cdbd2cSJim Jagielski 	}
2101*b1cdbd2cSJim Jagielski 	Rectangle aTextRect( CalcTextRect(pEntry,pStringItem,&rPos,sal_False,pViewData));
2102*b1cdbd2cSJim Jagielski 	Rectangle aBmpRect( CalcBmpRect(pEntry, &rPos, pViewData ) );
2103*b1cdbd2cSJim Jagielski 
2104*b1cdbd2cSJim Jagielski 	switch( nViewMode )
2105*b1cdbd2cSJim Jagielski 	{
2106*b1cdbd2cSJim Jagielski 		case VIEWMODE_ICON:
2107*b1cdbd2cSJim Jagielski 			pBmpItem = (SvLBoxContextBmp*)(pEntry->GetFirstItem(SV_ITEM_ID_LBOXCONTEXTBMP));
2108*b1cdbd2cSJim Jagielski 			PaintEmphasis( aBmpRect, bSelected, bCursored, pOut );
2109*b1cdbd2cSJim Jagielski 			PaintItem( aBmpRect, pBmpItem, pEntry,
2110*b1cdbd2cSJim Jagielski 				PAINTFLAG_HOR_CENTERED | PAINTFLAG_VER_CENTERED, pOut );
2111*b1cdbd2cSJim Jagielski 			PaintEmphasis( aTextRect, bSelected, sal_False, pOut );
2112*b1cdbd2cSJim Jagielski 			PaintItem( aTextRect, pStringItem, pEntry, PAINTFLAG_HOR_CENTERED, pOut );
2113*b1cdbd2cSJim Jagielski 			break;
2114*b1cdbd2cSJim Jagielski 
2115*b1cdbd2cSJim Jagielski 		case VIEWMODE_NAME:
2116*b1cdbd2cSJim Jagielski 			pBmpItem = (SvLBoxContextBmp*)(pEntry->GetFirstItem(SV_ITEM_ID_LBOXCONTEXTBMP));
2117*b1cdbd2cSJim Jagielski 			PaintEmphasis( aBmpRect, bSelected, bCursored, pOut );
2118*b1cdbd2cSJim Jagielski 			PaintItem( aBmpRect, pBmpItem, pEntry, PAINTFLAG_VER_CENTERED, pOut );
2119*b1cdbd2cSJim Jagielski 			PaintEmphasis( aTextRect, bSelected, sal_False, pOut );
2120*b1cdbd2cSJim Jagielski 			PaintItem( aTextRect, pStringItem, pEntry,PAINTFLAG_VER_CENTERED, pOut );
2121*b1cdbd2cSJim Jagielski 			break;
2122*b1cdbd2cSJim Jagielski 
2123*b1cdbd2cSJim Jagielski 		case VIEWMODE_TEXT:
2124*b1cdbd2cSJim Jagielski 			PaintEmphasis( aTextRect, bSelected, bCursored, pOut );
2125*b1cdbd2cSJim Jagielski 			PaintItem( aTextRect, pStringItem, pEntry, PAINTFLAG_VER_CENTERED, pOut );
2126*b1cdbd2cSJim Jagielski 			break;
2127*b1cdbd2cSJim Jagielski 	}
2128*b1cdbd2cSJim Jagielski 	pOut->SetFont( aTempFont );
2129*b1cdbd2cSJim Jagielski }
2130*b1cdbd2cSJim Jagielski 
SetEntryPosition(SvLBoxEntry * pEntry,const Point & rPos,sal_Bool bAdjustAtGrid,sal_Bool bCheckScrollBars)2131*b1cdbd2cSJim Jagielski void SvImpIconView::SetEntryPosition( SvLBoxEntry* pEntry, const Point& rPos,
2132*b1cdbd2cSJim Jagielski 	sal_Bool bAdjustAtGrid, sal_Bool bCheckScrollBars )
2133*b1cdbd2cSJim Jagielski {
2134*b1cdbd2cSJim Jagielski 	if( pModel->GetParent(pEntry) == pCurParent )
2135*b1cdbd2cSJim Jagielski 	{
2136*b1cdbd2cSJim Jagielski 		ShowCursor( sal_False );
2137*b1cdbd2cSJim Jagielski 		SvIcnVwDataEntry* pViewData = ICNVIEWDATA(pEntry);
2138*b1cdbd2cSJim Jagielski 		Rectangle aBoundRect( GetBoundingRect( pEntry, pViewData ));
2139*b1cdbd2cSJim Jagielski 		pView->Invalidate( aBoundRect );
2140*b1cdbd2cSJim Jagielski 		ToTop( pEntry );
2141*b1cdbd2cSJim Jagielski 		if( rPos != aBoundRect.TopLeft() )
2142*b1cdbd2cSJim Jagielski 		{
2143*b1cdbd2cSJim Jagielski 			Point aGridOffs = pViewData->aGridRect.TopLeft() -
2144*b1cdbd2cSJim Jagielski 							  pViewData->aRect.TopLeft();
2145*b1cdbd2cSJim Jagielski 			pImpCursor->Clear();
2146*b1cdbd2cSJim Jagielski 			nFlags &= ~F_GRID_INSERT;
2147*b1cdbd2cSJim Jagielski 			aBoundRect.SetPos( rPos );
2148*b1cdbd2cSJim Jagielski 			pViewData->aRect = aBoundRect;
2149*b1cdbd2cSJim Jagielski 			pViewData->aGridRect.SetPos( rPos + aGridOffs );
2150*b1cdbd2cSJim Jagielski 			AdjustVirtSize( aBoundRect );
2151*b1cdbd2cSJim Jagielski 		}
2152*b1cdbd2cSJim Jagielski 		//HACK(Billigloesung, die noch verbessert werden muss)
2153*b1cdbd2cSJim Jagielski 		if( bAdjustAtGrid )
2154*b1cdbd2cSJim Jagielski 		{
2155*b1cdbd2cSJim Jagielski 			AdjustAtGrid( pEntry );
2156*b1cdbd2cSJim Jagielski 			ToTop( pEntry );
2157*b1cdbd2cSJim Jagielski 		}
2158*b1cdbd2cSJim Jagielski 		if( bCheckScrollBars && pView->IsUpdateMode() )
2159*b1cdbd2cSJim Jagielski 			CheckScrollBars();
2160*b1cdbd2cSJim Jagielski 
2161*b1cdbd2cSJim Jagielski 		PaintEntry( pEntry, pViewData );
2162*b1cdbd2cSJim Jagielski 		ShowCursor( sal_True );
2163*b1cdbd2cSJim Jagielski 	}
2164*b1cdbd2cSJim Jagielski }
2165*b1cdbd2cSJim Jagielski 
ViewDataInitialized(SvLBoxEntry *)2166*b1cdbd2cSJim Jagielski void SvImpIconView::ViewDataInitialized( SvLBoxEntry*)
2167*b1cdbd2cSJim Jagielski {
2168*b1cdbd2cSJim Jagielski }
2169*b1cdbd2cSJim Jagielski 
ModelHasEntryInvalidated(SvListEntry * pEntry)2170*b1cdbd2cSJim Jagielski void SvImpIconView::ModelHasEntryInvalidated( SvListEntry* pEntry )
2171*b1cdbd2cSJim Jagielski {
2172*b1cdbd2cSJim Jagielski 	if( pEntry == pCursor )
2173*b1cdbd2cSJim Jagielski 		ShowCursor( sal_False );
2174*b1cdbd2cSJim Jagielski 	SvIcnVwDataEntry* pViewData = ICNVIEWDATA(pEntry);
2175*b1cdbd2cSJim Jagielski 	pView->Invalidate( pViewData->aRect );
2176*b1cdbd2cSJim Jagielski 
2177*b1cdbd2cSJim Jagielski 	if( nFlags & F_GRIDMODE )
2178*b1cdbd2cSJim Jagielski 		Center( (SvLBoxEntry*)pEntry, pViewData );
2179*b1cdbd2cSJim Jagielski 	else
2180*b1cdbd2cSJim Jagielski 		pViewData->aRect.SetSize( CalcBoundingSize(
2181*b1cdbd2cSJim Jagielski 			(SvLBoxEntry*)pEntry, pViewData ) );
2182*b1cdbd2cSJim Jagielski 
2183*b1cdbd2cSJim Jagielski 	ViewDataInitialized( (SvLBoxEntry*)pEntry );
2184*b1cdbd2cSJim Jagielski 	pView->Invalidate( pViewData->aRect );
2185*b1cdbd2cSJim Jagielski 	if( pEntry == pCursor )
2186*b1cdbd2cSJim Jagielski 		ShowCursor( sal_True );
2187*b1cdbd2cSJim Jagielski }
2188*b1cdbd2cSJim Jagielski 
2189*b1cdbd2cSJim Jagielski 
InvalidateEntry(SvLBoxEntry * pEntry)2190*b1cdbd2cSJim Jagielski void SvImpIconView::InvalidateEntry( SvLBoxEntry* pEntry )
2191*b1cdbd2cSJim Jagielski {
2192*b1cdbd2cSJim Jagielski 	const Rectangle& rRect = GetBoundingRect( pEntry );
2193*b1cdbd2cSJim Jagielski 	pView->Invalidate( rRect );
2194*b1cdbd2cSJim Jagielski }
2195*b1cdbd2cSJim Jagielski 
SetNoSelection()2196*b1cdbd2cSJim Jagielski void SvImpIconView::SetNoSelection()
2197*b1cdbd2cSJim Jagielski {
2198*b1cdbd2cSJim Jagielski }
2199*b1cdbd2cSJim Jagielski 
SetDragDropMode(DragDropMode)2200*b1cdbd2cSJim Jagielski void SvImpIconView::SetDragDropMode( DragDropMode )
2201*b1cdbd2cSJim Jagielski {
2202*b1cdbd2cSJim Jagielski }
2203*b1cdbd2cSJim Jagielski 
SetSelectionMode(SelectionMode)2204*b1cdbd2cSJim Jagielski void SvImpIconView::SetSelectionMode( SelectionMode )
2205*b1cdbd2cSJim Jagielski {
2206*b1cdbd2cSJim Jagielski }
2207*b1cdbd2cSJim Jagielski 
IsEntryInView(SvLBoxEntry *)2208*b1cdbd2cSJim Jagielski sal_Bool SvImpIconView::IsEntryInView( SvLBoxEntry* )
2209*b1cdbd2cSJim Jagielski {
2210*b1cdbd2cSJim Jagielski 	return sal_False;
2211*b1cdbd2cSJim Jagielski }
2212*b1cdbd2cSJim Jagielski 
GetDropTarget(const Point & rPos)2213*b1cdbd2cSJim Jagielski SvLBoxEntry* SvImpIconView::GetDropTarget( const Point& rPos )
2214*b1cdbd2cSJim Jagielski {
2215*b1cdbd2cSJim Jagielski 	Point aDocPos( rPos );
2216*b1cdbd2cSJim Jagielski 	CalcDocPos( aDocPos );
2217*b1cdbd2cSJim Jagielski 	SvLBoxEntry* pTarget = GetEntry( aDocPos );
2218*b1cdbd2cSJim Jagielski 	if( !pTarget || !pTarget->HasChilds() )
2219*b1cdbd2cSJim Jagielski 		pTarget = pCurParent;
2220*b1cdbd2cSJim Jagielski 	return pTarget;
2221*b1cdbd2cSJim Jagielski }
2222*b1cdbd2cSJim Jagielski 
GetEntry(const Point & rDocPos)2223*b1cdbd2cSJim Jagielski SvLBoxEntry* SvImpIconView::GetEntry( const Point& rDocPos )
2224*b1cdbd2cSJim Jagielski {
2225*b1cdbd2cSJim Jagielski 	CheckBoundingRects();
2226*b1cdbd2cSJim Jagielski 	SvLBoxEntry* pTarget = 0;
2227*b1cdbd2cSJim Jagielski 	// Z-Order-Liste vom Ende her absuchen
2228*b1cdbd2cSJim Jagielski 	sal_uInt16 nCount = pZOrderList->Count();
2229*b1cdbd2cSJim Jagielski 	while( nCount )
2230*b1cdbd2cSJim Jagielski 	{
2231*b1cdbd2cSJim Jagielski 		nCount--;
2232*b1cdbd2cSJim Jagielski 		SvLBoxEntry* pEntry = (SvLBoxEntry*)(pZOrderList->GetObject(nCount));
2233*b1cdbd2cSJim Jagielski 		SvIcnVwDataEntry* pViewData = ICNVIEWDATA(pEntry);
2234*b1cdbd2cSJim Jagielski 		if( pViewData->aRect.IsInside( rDocPos ) )
2235*b1cdbd2cSJim Jagielski 		{
2236*b1cdbd2cSJim Jagielski 			pTarget = pEntry;
2237*b1cdbd2cSJim Jagielski 			break;
2238*b1cdbd2cSJim Jagielski 		}
2239*b1cdbd2cSJim Jagielski 	}
2240*b1cdbd2cSJim Jagielski 	return pTarget;
2241*b1cdbd2cSJim Jagielski }
2242*b1cdbd2cSJim Jagielski 
GetNextEntry(const Point & rDocPos,SvLBoxEntry * pCurEntry)2243*b1cdbd2cSJim Jagielski SvLBoxEntry* SvImpIconView::GetNextEntry( const Point& rDocPos, SvLBoxEntry* pCurEntry )
2244*b1cdbd2cSJim Jagielski {
2245*b1cdbd2cSJim Jagielski 	CheckBoundingRects();
2246*b1cdbd2cSJim Jagielski 	SvLBoxEntry* pTarget = 0;
2247*b1cdbd2cSJim Jagielski 	sal_uInt16 nStartPos = pZOrderList->GetPos( (void*)pCurEntry );
2248*b1cdbd2cSJim Jagielski 	if( nStartPos != USHRT_MAX )
2249*b1cdbd2cSJim Jagielski 	{
2250*b1cdbd2cSJim Jagielski 		sal_uInt16 nCount = pZOrderList->Count();
2251*b1cdbd2cSJim Jagielski 		for( sal_uInt16 nCur = nStartPos+1; nCur < nCount; nCur++ )
2252*b1cdbd2cSJim Jagielski 		{
2253*b1cdbd2cSJim Jagielski 			SvLBoxEntry* pEntry = (SvLBoxEntry*)(pZOrderList->GetObject(nCur));
2254*b1cdbd2cSJim Jagielski 			SvIcnVwDataEntry* pViewData = ICNVIEWDATA(pEntry);
2255*b1cdbd2cSJim Jagielski 			if( pViewData->aRect.IsInside( rDocPos ) )
2256*b1cdbd2cSJim Jagielski 			{
2257*b1cdbd2cSJim Jagielski 				pTarget = pEntry;
2258*b1cdbd2cSJim Jagielski 				break;
2259*b1cdbd2cSJim Jagielski 			}
2260*b1cdbd2cSJim Jagielski 		}
2261*b1cdbd2cSJim Jagielski 	}
2262*b1cdbd2cSJim Jagielski 	return pTarget;
2263*b1cdbd2cSJim Jagielski }
2264*b1cdbd2cSJim Jagielski 
GetPrevEntry(const Point & rDocPos,SvLBoxEntry * pCurEntry)2265*b1cdbd2cSJim Jagielski SvLBoxEntry* SvImpIconView::GetPrevEntry( const Point& rDocPos, SvLBoxEntry* pCurEntry )
2266*b1cdbd2cSJim Jagielski {
2267*b1cdbd2cSJim Jagielski 	CheckBoundingRects();
2268*b1cdbd2cSJim Jagielski 	SvLBoxEntry* pTarget = 0;
2269*b1cdbd2cSJim Jagielski 	sal_uInt16 nStartPos = pZOrderList->GetPos( (void*)pCurEntry );
2270*b1cdbd2cSJim Jagielski 	if( nStartPos != USHRT_MAX && nStartPos != 0 )
2271*b1cdbd2cSJim Jagielski 	{
2272*b1cdbd2cSJim Jagielski 		nStartPos--;
2273*b1cdbd2cSJim Jagielski 		do
2274*b1cdbd2cSJim Jagielski 		{
2275*b1cdbd2cSJim Jagielski 			SvLBoxEntry* pEntry = (SvLBoxEntry*)(pZOrderList->GetObject(nStartPos));
2276*b1cdbd2cSJim Jagielski 			SvIcnVwDataEntry* pViewData = ICNVIEWDATA(pEntry);
2277*b1cdbd2cSJim Jagielski 			if( pViewData->aRect.IsInside( rDocPos ) )
2278*b1cdbd2cSJim Jagielski 			{
2279*b1cdbd2cSJim Jagielski 				pTarget = pEntry;
2280*b1cdbd2cSJim Jagielski 				break;
2281*b1cdbd2cSJim Jagielski 			}
2282*b1cdbd2cSJim Jagielski 		} while( nStartPos > 0 );
2283*b1cdbd2cSJim Jagielski 	}
2284*b1cdbd2cSJim Jagielski 	return pTarget;
2285*b1cdbd2cSJim Jagielski }
2286*b1cdbd2cSJim Jagielski 
2287*b1cdbd2cSJim Jagielski 
GetEntryPosition(SvLBoxEntry * pEntry)2288*b1cdbd2cSJim Jagielski Point SvImpIconView::GetEntryPosition( SvLBoxEntry* pEntry )
2289*b1cdbd2cSJim Jagielski {
2290*b1cdbd2cSJim Jagielski 	SvIcnVwDataEntry* pViewData = ICNVIEWDATA(pEntry);
2291*b1cdbd2cSJim Jagielski 	DBG_ASSERT(pViewData,"Entry not in model");
2292*b1cdbd2cSJim Jagielski 	return pViewData->aRect.TopLeft();
2293*b1cdbd2cSJim Jagielski }
2294*b1cdbd2cSJim Jagielski 
GetBoundingRect(SvLBoxEntry * pEntry,SvIcnVwDataEntry * pViewData)2295*b1cdbd2cSJim Jagielski const Rectangle& SvImpIconView::GetBoundingRect( SvLBoxEntry* pEntry, SvIcnVwDataEntry* pViewData )
2296*b1cdbd2cSJim Jagielski {
2297*b1cdbd2cSJim Jagielski 	if( !pViewData )
2298*b1cdbd2cSJim Jagielski 		pViewData = ICNVIEWDATA(pEntry);
2299*b1cdbd2cSJim Jagielski 	DBG_ASSERT(pViewData,"Entry not in model");
2300*b1cdbd2cSJim Jagielski 	if( !IsBoundingRectValid( pViewData->aRect ))
2301*b1cdbd2cSJim Jagielski 		FindBoundingRect( pEntry, pViewData );
2302*b1cdbd2cSJim Jagielski 	return pViewData->aRect;
2303*b1cdbd2cSJim Jagielski }
2304*b1cdbd2cSJim Jagielski 
SetSpaceBetweenEntries(long nHor,long nVer)2305*b1cdbd2cSJim Jagielski void SvImpIconView::SetSpaceBetweenEntries( long nHor, long nVer )
2306*b1cdbd2cSJim Jagielski {
2307*b1cdbd2cSJim Jagielski 	nHorDist = nHor;
2308*b1cdbd2cSJim Jagielski 	nVerDist = nVer;
2309*b1cdbd2cSJim Jagielski }
2310*b1cdbd2cSJim Jagielski 
CalcBmpRect(SvLBoxEntry * pEntry,const Point * pPos,SvIcnVwDataEntry * pViewData)2311*b1cdbd2cSJim Jagielski Rectangle SvImpIconView::CalcBmpRect( SvLBoxEntry* pEntry, const Point* pPos,
2312*b1cdbd2cSJim Jagielski 	SvIcnVwDataEntry* pViewData  )
2313*b1cdbd2cSJim Jagielski {
2314*b1cdbd2cSJim Jagielski 	if( !pViewData )
2315*b1cdbd2cSJim Jagielski 		pViewData = ICNVIEWDATA(pEntry);
2316*b1cdbd2cSJim Jagielski 
2317*b1cdbd2cSJim Jagielski 	Rectangle aBound = GetBoundingRect( pEntry, pViewData );
2318*b1cdbd2cSJim Jagielski 	if( pPos )
2319*b1cdbd2cSJim Jagielski 		aBound.SetPos( *pPos );
2320*b1cdbd2cSJim Jagielski 	Point aPos( aBound.TopLeft() );
2321*b1cdbd2cSJim Jagielski 
2322*b1cdbd2cSJim Jagielski 	switch( nViewMode )
2323*b1cdbd2cSJim Jagielski 	{
2324*b1cdbd2cSJim Jagielski 		case VIEWMODE_ICON:
2325*b1cdbd2cSJim Jagielski 		{
2326*b1cdbd2cSJim Jagielski 			aPos.X() += ( aBound.GetWidth() - nMaxBmpWidth ) / 2;
2327*b1cdbd2cSJim Jagielski 			Size aSize( nMaxBmpWidth, nMaxBmpHeight );
2328*b1cdbd2cSJim Jagielski 			// das Bitmap-Rechteck soll nicht das TextRect beruehren
2329*b1cdbd2cSJim Jagielski 			aSize.Height() -= 3;
2330*b1cdbd2cSJim Jagielski 			return Rectangle( aPos, aSize );
2331*b1cdbd2cSJim Jagielski 		}
2332*b1cdbd2cSJim Jagielski 
2333*b1cdbd2cSJim Jagielski 		case VIEWMODE_NAME:
2334*b1cdbd2cSJim Jagielski 			return Rectangle( aPos,
2335*b1cdbd2cSJim Jagielski 				Size( nMaxBmpWidth, aBound.GetHeight() ));
2336*b1cdbd2cSJim Jagielski 
2337*b1cdbd2cSJim Jagielski 		case VIEWMODE_TEXT:
2338*b1cdbd2cSJim Jagielski 			return Rectangle( aPos, aBound.GetSize() );
2339*b1cdbd2cSJim Jagielski 
2340*b1cdbd2cSJim Jagielski 		default:
2341*b1cdbd2cSJim Jagielski 		{
2342*b1cdbd2cSJim Jagielski 			Rectangle aRect;
2343*b1cdbd2cSJim Jagielski 			return aRect;
2344*b1cdbd2cSJim Jagielski 		}
2345*b1cdbd2cSJim Jagielski 	}
2346*b1cdbd2cSJim Jagielski }
2347*b1cdbd2cSJim Jagielski 
CalcTextRect(SvLBoxEntry * pEntry,SvLBoxString * pItem,const Point * pPos,sal_Bool bForInplaceEdit,SvIcnVwDataEntry * pViewData)2348*b1cdbd2cSJim Jagielski Rectangle SvImpIconView::CalcTextRect( SvLBoxEntry* pEntry,
2349*b1cdbd2cSJim Jagielski 	SvLBoxString* pItem, const Point* pPos, sal_Bool bForInplaceEdit,
2350*b1cdbd2cSJim Jagielski 	SvIcnVwDataEntry* pViewData )
2351*b1cdbd2cSJim Jagielski {
2352*b1cdbd2cSJim Jagielski 	long nBmpHeight, nBmpWidth;
2353*b1cdbd2cSJim Jagielski 
2354*b1cdbd2cSJim Jagielski 	if( !pItem )
2355*b1cdbd2cSJim Jagielski 		pItem = (SvLBoxString*)(pEntry->GetFirstItem(SV_ITEM_ID_LBOXSTRING));
2356*b1cdbd2cSJim Jagielski 
2357*b1cdbd2cSJim Jagielski 	if( !pViewData )
2358*b1cdbd2cSJim Jagielski 		pViewData = ICNVIEWDATA(pEntry);
2359*b1cdbd2cSJim Jagielski 
2360*b1cdbd2cSJim Jagielski 	Size aTextSize( GetItemSize( pView, pEntry, pItem, pViewData ));
2361*b1cdbd2cSJim Jagielski 	aTextSize.Width() += 2*LROFFS_TEXT;
2362*b1cdbd2cSJim Jagielski 
2363*b1cdbd2cSJim Jagielski 	Size aContextBmpSize(pEntry->GetFirstItem(SV_ITEM_ID_LBOXCONTEXTBMP)->GetSize(pView,pEntry));
2364*b1cdbd2cSJim Jagielski 	Rectangle aBound = GetBoundingRect( pEntry, pViewData );
2365*b1cdbd2cSJim Jagielski 	if( pPos )
2366*b1cdbd2cSJim Jagielski 		aBound.SetPos( *pPos );
2367*b1cdbd2cSJim Jagielski 	Point aPos( aBound.TopLeft() );
2368*b1cdbd2cSJim Jagielski 
2369*b1cdbd2cSJim Jagielski 	switch( nViewMode )
2370*b1cdbd2cSJim Jagielski 	{
2371*b1cdbd2cSJim Jagielski 		case VIEWMODE_ICON:
2372*b1cdbd2cSJim Jagielski 			nBmpHeight = aContextBmpSize.Height();
2373*b1cdbd2cSJim Jagielski 			if( nBmpHeight < nMaxBmpHeight )
2374*b1cdbd2cSJim Jagielski 				nBmpHeight = nMaxBmpHeight;
2375*b1cdbd2cSJim Jagielski 			aPos.Y() += nBmpHeight;
2376*b1cdbd2cSJim Jagielski 
2377*b1cdbd2cSJim Jagielski 			// beim Inplace-Editieren, spendieren wir ein bisschen mehr Platz
2378*b1cdbd2cSJim Jagielski 			if( bForInplaceEdit )
2379*b1cdbd2cSJim Jagielski 			{
2380*b1cdbd2cSJim Jagielski 				// 20% rauf
2381*b1cdbd2cSJim Jagielski 				long nMinWidth = (( (aContextBmpSize.Width()*10) / 100 ) * 2 ) +
2382*b1cdbd2cSJim Jagielski 								 aContextBmpSize.Width();
2383*b1cdbd2cSJim Jagielski 				if( nMinWidth > aBound.GetWidth() )
2384*b1cdbd2cSJim Jagielski 					nMinWidth = aBound.GetWidth();
2385*b1cdbd2cSJim Jagielski 
2386*b1cdbd2cSJim Jagielski 				if( aTextSize.Width() < nMinWidth )
2387*b1cdbd2cSJim Jagielski 					aTextSize.Width() = nMinWidth;
2388*b1cdbd2cSJim Jagielski 
2389*b1cdbd2cSJim Jagielski 				// beim Inplace-Ed. darfs auch untere Eintraege ueberlappen
2390*b1cdbd2cSJim Jagielski 				Rectangle aMaxGridTextRect = CalcMaxTextRect(pEntry, pViewData);
2391*b1cdbd2cSJim Jagielski 				Size aOptSize = aMaxGridTextRect.GetSize();
2392*b1cdbd2cSJim Jagielski 				if( aOptSize.Height() > aTextSize.Height() )
2393*b1cdbd2cSJim Jagielski 					aTextSize.Height() = aOptSize.Height();
2394*b1cdbd2cSJim Jagielski 			}
2395*b1cdbd2cSJim Jagielski 
2396*b1cdbd2cSJim Jagielski 
2397*b1cdbd2cSJim Jagielski 			aPos.X() += ( aBound.GetWidth() - aTextSize.Width() ) / 2;
2398*b1cdbd2cSJim Jagielski 			break;
2399*b1cdbd2cSJim Jagielski 
2400*b1cdbd2cSJim Jagielski 		case VIEWMODE_NAME:
2401*b1cdbd2cSJim Jagielski 			nBmpWidth = aContextBmpSize.Width();
2402*b1cdbd2cSJim Jagielski 			if( nBmpWidth < nMaxBmpWidth )
2403*b1cdbd2cSJim Jagielski 				nBmpWidth = nMaxBmpWidth;
2404*b1cdbd2cSJim Jagielski 			aPos.X() += nBmpWidth;
2405*b1cdbd2cSJim Jagielski 			// vertikal ausrichten
2406*b1cdbd2cSJim Jagielski 			aPos.Y() += ( nBmpWidth - aTextSize.Height() ) / 2;
2407*b1cdbd2cSJim Jagielski 			break;
2408*b1cdbd2cSJim Jagielski 	}
2409*b1cdbd2cSJim Jagielski 
2410*b1cdbd2cSJim Jagielski 	Rectangle aRect( aPos, aTextSize );
2411*b1cdbd2cSJim Jagielski // KNALLT BEIM D&D, WENN GECLIPPT WIRD (In DrawText von Thomas)
2412*b1cdbd2cSJim Jagielski //	ClipAtVirtOutRect( aRect );
2413*b1cdbd2cSJim Jagielski 	return aRect;
2414*b1cdbd2cSJim Jagielski }
2415*b1cdbd2cSJim Jagielski 
2416*b1cdbd2cSJim Jagielski 
CalcBoundingWidth(SvLBoxEntry * pEntry,const SvIcnVwDataEntry * pViewData) const2417*b1cdbd2cSJim Jagielski long SvImpIconView::CalcBoundingWidth( SvLBoxEntry* pEntry,
2418*b1cdbd2cSJim Jagielski 	const SvIcnVwDataEntry* pViewData ) const
2419*b1cdbd2cSJim Jagielski {
2420*b1cdbd2cSJim Jagielski 	DBG_ASSERT(pEntry->GetFirstItem(SV_ITEM_ID_LBOXCONTEXTBMP),"No Bitmaps");
2421*b1cdbd2cSJim Jagielski 	DBG_ASSERT(pEntry->GetFirstItem(SV_ITEM_ID_LBOXSTRING),"No Text");
2422*b1cdbd2cSJim Jagielski 	long nStringWidth = GetItemSize( pView, pEntry, pEntry->GetFirstItem(SV_ITEM_ID_LBOXSTRING),pViewData).Width();
2423*b1cdbd2cSJim Jagielski 	nStringWidth += 2*LROFFS_TEXT;
2424*b1cdbd2cSJim Jagielski 	long nBmpWidth = pEntry->GetFirstItem(SV_ITEM_ID_LBOXCONTEXTBMP)->GetSize(pView,pEntry).Width();
2425*b1cdbd2cSJim Jagielski 	long nWidth = 0;
2426*b1cdbd2cSJim Jagielski 
2427*b1cdbd2cSJim Jagielski 	switch( nViewMode )
2428*b1cdbd2cSJim Jagielski 	{
2429*b1cdbd2cSJim Jagielski 		case VIEWMODE_ICON:
2430*b1cdbd2cSJim Jagielski 			nWidth = Max( nStringWidth, nBmpWidth );
2431*b1cdbd2cSJim Jagielski 			nWidth = Max( nWidth, nMaxBmpWidth );
2432*b1cdbd2cSJim Jagielski 			break;
2433*b1cdbd2cSJim Jagielski 
2434*b1cdbd2cSJim Jagielski 		case VIEWMODE_NAME:
2435*b1cdbd2cSJim Jagielski 			nWidth = Max( nBmpWidth, nMaxBmpWidth );
2436*b1cdbd2cSJim Jagielski 			nWidth += NAMEVIEW_OFFS_BMP_STRING;  // Abstand Bitmap String
2437*b1cdbd2cSJim Jagielski 			nWidth += nStringWidth;
2438*b1cdbd2cSJim Jagielski 			break;
2439*b1cdbd2cSJim Jagielski 
2440*b1cdbd2cSJim Jagielski 		case VIEWMODE_TEXT:
2441*b1cdbd2cSJim Jagielski 			nWidth = nStringWidth;
2442*b1cdbd2cSJim Jagielski 			break;
2443*b1cdbd2cSJim Jagielski 	}
2444*b1cdbd2cSJim Jagielski 	return nWidth;
2445*b1cdbd2cSJim Jagielski }
2446*b1cdbd2cSJim Jagielski 
CalcBoundingHeight(SvLBoxEntry * pEntry,const SvIcnVwDataEntry * pViewData) const2447*b1cdbd2cSJim Jagielski long SvImpIconView::CalcBoundingHeight( SvLBoxEntry* pEntry,
2448*b1cdbd2cSJim Jagielski 	const SvIcnVwDataEntry* pViewData ) const
2449*b1cdbd2cSJim Jagielski {
2450*b1cdbd2cSJim Jagielski 	DBG_ASSERT(pEntry->GetFirstItem(SV_ITEM_ID_LBOXCONTEXTBMP),"No Bitmaps");
2451*b1cdbd2cSJim Jagielski 	DBG_ASSERT(pEntry->GetFirstItem(SV_ITEM_ID_LBOXSTRING),"No Text");
2452*b1cdbd2cSJim Jagielski 	long nStringHeight = GetItemSize(pView,pEntry,pEntry->GetFirstItem(SV_ITEM_ID_LBOXSTRING),pViewData).Height();
2453*b1cdbd2cSJim Jagielski 	long nBmpHeight = pEntry->GetFirstItem(SV_ITEM_ID_LBOXCONTEXTBMP)->GetSize(pView,pEntry).Height();
2454*b1cdbd2cSJim Jagielski 	long nHeight = 0;
2455*b1cdbd2cSJim Jagielski 
2456*b1cdbd2cSJim Jagielski 	switch( nViewMode )
2457*b1cdbd2cSJim Jagielski 	{
2458*b1cdbd2cSJim Jagielski 		case VIEWMODE_ICON:
2459*b1cdbd2cSJim Jagielski 			nHeight = Max( nBmpHeight, nMaxBmpHeight );
2460*b1cdbd2cSJim Jagielski 			nHeight += ICONVIEW_OFFS_BMP_STRING; // Abstand Bitmap String
2461*b1cdbd2cSJim Jagielski 			nHeight += nStringHeight;
2462*b1cdbd2cSJim Jagielski 			break;
2463*b1cdbd2cSJim Jagielski 
2464*b1cdbd2cSJim Jagielski 		case VIEWMODE_NAME:
2465*b1cdbd2cSJim Jagielski 			nHeight = Max( nBmpHeight, nMaxBmpHeight );
2466*b1cdbd2cSJim Jagielski 			nHeight = Max( nHeight, nStringHeight );
2467*b1cdbd2cSJim Jagielski 			break;
2468*b1cdbd2cSJim Jagielski 
2469*b1cdbd2cSJim Jagielski 		case VIEWMODE_TEXT:
2470*b1cdbd2cSJim Jagielski 			nHeight = nStringHeight;
2471*b1cdbd2cSJim Jagielski 			break;
2472*b1cdbd2cSJim Jagielski 	}
2473*b1cdbd2cSJim Jagielski 	if( nHeight > nMaxBoundHeight )
2474*b1cdbd2cSJim Jagielski 	{
2475*b1cdbd2cSJim Jagielski 		((SvImpIconView*)this)->nMaxBoundHeight = nHeight;
2476*b1cdbd2cSJim Jagielski 		((SvImpIconView*)this)->aHorSBar.SetLineSize( nHeight / 2 );
2477*b1cdbd2cSJim Jagielski 		((SvImpIconView*)this)->aVerSBar.SetLineSize( nHeight / 2 );
2478*b1cdbd2cSJim Jagielski 	}
2479*b1cdbd2cSJim Jagielski 	return nHeight;
2480*b1cdbd2cSJim Jagielski }
2481*b1cdbd2cSJim Jagielski 
CalcBoundingSize(SvLBoxEntry * pEntry,SvIcnVwDataEntry * pViewData) const2482*b1cdbd2cSJim Jagielski Size SvImpIconView::CalcBoundingSize( SvLBoxEntry* pEntry,
2483*b1cdbd2cSJim Jagielski 	SvIcnVwDataEntry* pViewData ) const
2484*b1cdbd2cSJim Jagielski {
2485*b1cdbd2cSJim Jagielski 	if( !pViewData )
2486*b1cdbd2cSJim Jagielski 		pViewData = ICNVIEWDATA(pEntry);
2487*b1cdbd2cSJim Jagielski 	return Size( CalcBoundingWidth(pEntry,pViewData),
2488*b1cdbd2cSJim Jagielski 				 CalcBoundingHeight(pEntry,pViewData) );
2489*b1cdbd2cSJim Jagielski }
2490*b1cdbd2cSJim Jagielski 
RecalcAllBoundingRects()2491*b1cdbd2cSJim Jagielski void SvImpIconView::RecalcAllBoundingRects()
2492*b1cdbd2cSJim Jagielski {
2493*b1cdbd2cSJim Jagielski 	nMaxBoundHeight	= 0;
2494*b1cdbd2cSJim Jagielski 	pZOrderList->Remove(0, pZOrderList->Count() );
2495*b1cdbd2cSJim Jagielski 	SvLBoxEntry* pEntry = pModel->FirstChild( pCurParent );
2496*b1cdbd2cSJim Jagielski 	while( pEntry )
2497*b1cdbd2cSJim Jagielski 	{
2498*b1cdbd2cSJim Jagielski 		FindBoundingRect( pEntry );
2499*b1cdbd2cSJim Jagielski 		pZOrderList->Insert( pEntry, pZOrderList->Count() );
2500*b1cdbd2cSJim Jagielski 		pEntry = pModel->NextSibling( pEntry );
2501*b1cdbd2cSJim Jagielski 	}
2502*b1cdbd2cSJim Jagielski 	bMustRecalcBoundingRects = sal_False;
2503*b1cdbd2cSJim Jagielski 	AdjustScrollBars();
2504*b1cdbd2cSJim Jagielski }
2505*b1cdbd2cSJim Jagielski 
RecalcAllBoundingRectsSmart()2506*b1cdbd2cSJim Jagielski void SvImpIconView::RecalcAllBoundingRectsSmart()
2507*b1cdbd2cSJim Jagielski {
2508*b1cdbd2cSJim Jagielski 	nMaxBoundHeight	= 0;
2509*b1cdbd2cSJim Jagielski 	pZOrderList->Remove(0, pZOrderList->Count() );
2510*b1cdbd2cSJim Jagielski 	SvLBoxEntry* pEntry = pModel->FirstChild( pCurParent );
2511*b1cdbd2cSJim Jagielski 	while( pEntry )
2512*b1cdbd2cSJim Jagielski 	{
2513*b1cdbd2cSJim Jagielski 		SvIcnVwDataEntry* pViewData = ICNVIEWDATA(pEntry);
2514*b1cdbd2cSJim Jagielski 		if( IsBoundingRectValid( pViewData->aRect ))
2515*b1cdbd2cSJim Jagielski 		{
2516*b1cdbd2cSJim Jagielski 			Size aBoundSize( pViewData->aRect.GetSize() );
2517*b1cdbd2cSJim Jagielski 			if( aBoundSize.Height() > nMaxBoundHeight )
2518*b1cdbd2cSJim Jagielski 				nMaxBoundHeight = aBoundSize.Height();
2519*b1cdbd2cSJim Jagielski 			pZOrderList->Insert( pEntry, pZOrderList->Count() );
2520*b1cdbd2cSJim Jagielski 		}
2521*b1cdbd2cSJim Jagielski 		else
2522*b1cdbd2cSJim Jagielski 		{
2523*b1cdbd2cSJim Jagielski 			FindBoundingRect( pEntry, pViewData );
2524*b1cdbd2cSJim Jagielski 		}
2525*b1cdbd2cSJim Jagielski 		pZOrderList->Insert( pEntry, pZOrderList->Count() );
2526*b1cdbd2cSJim Jagielski 		pEntry = pModel->NextSibling( pEntry );
2527*b1cdbd2cSJim Jagielski 	}
2528*b1cdbd2cSJim Jagielski 	AdjustScrollBars();
2529*b1cdbd2cSJim Jagielski }
2530*b1cdbd2cSJim Jagielski 
UpdateBoundingRects()2531*b1cdbd2cSJim Jagielski void SvImpIconView::UpdateBoundingRects()
2532*b1cdbd2cSJim Jagielski {
2533*b1cdbd2cSJim Jagielski 	SvLBoxEntry* pEntry = pModel->FirstChild( pCurParent );
2534*b1cdbd2cSJim Jagielski 	while( pEntry )
2535*b1cdbd2cSJim Jagielski 	{
2536*b1cdbd2cSJim Jagielski 		GetBoundingRect( pEntry );
2537*b1cdbd2cSJim Jagielski 		pEntry = pModel->NextSibling( pEntry );
2538*b1cdbd2cSJim Jagielski 	}
2539*b1cdbd2cSJim Jagielski }
2540*b1cdbd2cSJim Jagielski 
FindBoundingRect(SvLBoxEntry * pEntry,SvIcnVwDataEntry * pViewData)2541*b1cdbd2cSJim Jagielski void SvImpIconView::FindBoundingRect( SvLBoxEntry* pEntry,
2542*b1cdbd2cSJim Jagielski 	SvIcnVwDataEntry* pViewData )
2543*b1cdbd2cSJim Jagielski {
2544*b1cdbd2cSJim Jagielski 	if( !pViewData )
2545*b1cdbd2cSJim Jagielski 		pViewData = ICNVIEWDATA(pEntry);
2546*b1cdbd2cSJim Jagielski 
2547*b1cdbd2cSJim Jagielski 	Size aSize( CalcBoundingSize( pEntry, pViewData ) );
2548*b1cdbd2cSJim Jagielski 	Point aPos;
2549*b1cdbd2cSJim Jagielski 
2550*b1cdbd2cSJim Jagielski 	DBG_ASSERT(!pViewData->IsEntryPosLocked(),"Locked entry pos in FindBoundingRect");
2551*b1cdbd2cSJim Jagielski 	// damits in der IconView nicht drunter & drueber geht
2552*b1cdbd2cSJim Jagielski 	if( pViewData->IsEntryPosLocked() && IsBoundingRectValid(pViewData->aRect) )
2553*b1cdbd2cSJim Jagielski 	{
2554*b1cdbd2cSJim Jagielski 		AdjustVirtSize( pViewData->aRect );
2555*b1cdbd2cSJim Jagielski 		return;
2556*b1cdbd2cSJim Jagielski 	}
2557*b1cdbd2cSJim Jagielski 
2558*b1cdbd2cSJim Jagielski 	aPos = FindNextEntryPos( aSize );
2559*b1cdbd2cSJim Jagielski 
2560*b1cdbd2cSJim Jagielski 	if( nFlags & F_GRIDMODE )
2561*b1cdbd2cSJim Jagielski 	{
2562*b1cdbd2cSJim Jagielski 		Rectangle aGridRect( aPos, Size(nGridDX, nGridDY) );
2563*b1cdbd2cSJim Jagielski 		pViewData->aGridRect = aGridRect;
2564*b1cdbd2cSJim Jagielski 		Center( pEntry, pViewData );
2565*b1cdbd2cSJim Jagielski 		AdjustVirtSize( pViewData->aRect );
2566*b1cdbd2cSJim Jagielski 		pImpCursor->SetGridUsed( pViewData->aRect );
2567*b1cdbd2cSJim Jagielski 	}
2568*b1cdbd2cSJim Jagielski 	else
2569*b1cdbd2cSJim Jagielski 	{
2570*b1cdbd2cSJim Jagielski 		pViewData->aRect = Rectangle( aPos, aSize );
2571*b1cdbd2cSJim Jagielski 		AdjustVirtSize( pViewData->aRect );
2572*b1cdbd2cSJim Jagielski 	}
2573*b1cdbd2cSJim Jagielski }
2574*b1cdbd2cSJim Jagielski 
2575*b1cdbd2cSJim Jagielski 
SetCursor(SvLBoxEntry * pEntry)2576*b1cdbd2cSJim Jagielski void SvImpIconView::SetCursor( SvLBoxEntry* pEntry )
2577*b1cdbd2cSJim Jagielski {
2578*b1cdbd2cSJim Jagielski 	if( pEntry == pCursor )
2579*b1cdbd2cSJim Jagielski 		return;
2580*b1cdbd2cSJim Jagielski 
2581*b1cdbd2cSJim Jagielski 	ShowCursor( sal_False );
2582*b1cdbd2cSJim Jagielski 	if( pCursor )
2583*b1cdbd2cSJim Jagielski 	{
2584*b1cdbd2cSJim Jagielski 		pView->SetEntryFocus( pCursor, sal_False );
2585*b1cdbd2cSJim Jagielski 		if( pView->GetSelectionMode() == SINGLE_SELECTION )
2586*b1cdbd2cSJim Jagielski 			pView->Select( pCursor, sal_False );
2587*b1cdbd2cSJim Jagielski 	}
2588*b1cdbd2cSJim Jagielski 	pCursor = pEntry;
2589*b1cdbd2cSJim Jagielski 	ToTop( pCursor );
2590*b1cdbd2cSJim Jagielski 	if( pCursor )
2591*b1cdbd2cSJim Jagielski 	{
2592*b1cdbd2cSJim Jagielski 		pView->SetEntryFocus(pCursor, sal_True );
2593*b1cdbd2cSJim Jagielski 		if( pView->GetSelectionMode() == SINGLE_SELECTION )
2594*b1cdbd2cSJim Jagielski 			pView->Select( pCursor, sal_True );
2595*b1cdbd2cSJim Jagielski 		ShowCursor( sal_True );
2596*b1cdbd2cSJim Jagielski 	}
2597*b1cdbd2cSJim Jagielski }
2598*b1cdbd2cSJim Jagielski 
2599*b1cdbd2cSJim Jagielski 
ShowCursor(sal_Bool bShow)2600*b1cdbd2cSJim Jagielski void SvImpIconView::ShowCursor( sal_Bool bShow )
2601*b1cdbd2cSJim Jagielski {
2602*b1cdbd2cSJim Jagielski 	if( !pCursor || !bShow || !pView->HasFocus() )
2603*b1cdbd2cSJim Jagielski 	{
2604*b1cdbd2cSJim Jagielski 		pView->HideFocus();
2605*b1cdbd2cSJim Jagielski 		return;
2606*b1cdbd2cSJim Jagielski 	}
2607*b1cdbd2cSJim Jagielski 	Rectangle aRect ( CalcFocusRect( pCursor ) );
2608*b1cdbd2cSJim Jagielski 	pView->ShowFocus( aRect );
2609*b1cdbd2cSJim Jagielski }
2610*b1cdbd2cSJim Jagielski 
2611*b1cdbd2cSJim Jagielski 
HideDDIcon()2612*b1cdbd2cSJim Jagielski void SvImpIconView::HideDDIcon()
2613*b1cdbd2cSJim Jagielski {
2614*b1cdbd2cSJim Jagielski 	pView->Update();
2615*b1cdbd2cSJim Jagielski 	ImpHideDDIcon();
2616*b1cdbd2cSJim Jagielski 	pDDBufDev = pDDDev;
2617*b1cdbd2cSJim Jagielski 	pDDDev = 0;
2618*b1cdbd2cSJim Jagielski }
2619*b1cdbd2cSJim Jagielski 
ImpHideDDIcon()2620*b1cdbd2cSJim Jagielski void SvImpIconView::ImpHideDDIcon()
2621*b1cdbd2cSJim Jagielski {
2622*b1cdbd2cSJim Jagielski 	if( pDDDev )
2623*b1cdbd2cSJim Jagielski 	{
2624*b1cdbd2cSJim Jagielski 		Size aSize( pDDDev->GetOutputSizePixel() );
2625*b1cdbd2cSJim Jagielski 		// pView restaurieren
2626*b1cdbd2cSJim Jagielski 		pView->DrawOutDev( aDDLastRectPos, aSize, Point(), aSize, *pDDDev );
2627*b1cdbd2cSJim Jagielski 	}
2628*b1cdbd2cSJim Jagielski }
2629*b1cdbd2cSJim Jagielski 
2630*b1cdbd2cSJim Jagielski 
ShowDDIcon(SvLBoxEntry * pRefEntry,const Point & rPosPix)2631*b1cdbd2cSJim Jagielski void SvImpIconView::ShowDDIcon( SvLBoxEntry* pRefEntry, const Point& rPosPix )
2632*b1cdbd2cSJim Jagielski {
2633*b1cdbd2cSJim Jagielski 	pView->Update();
2634*b1cdbd2cSJim Jagielski 	if( pRefEntry != pDDRefEntry )
2635*b1cdbd2cSJim Jagielski 	{
2636*b1cdbd2cSJim Jagielski 		DELETEZ(pDDDev);
2637*b1cdbd2cSJim Jagielski 		DELETEZ(pDDBufDev);
2638*b1cdbd2cSJim Jagielski 	}
2639*b1cdbd2cSJim Jagielski 	sal_Bool bSelected = pView->SvListView::Select( pRefEntry, sal_False );
2640*b1cdbd2cSJim Jagielski 	if( !pDDDev )
2641*b1cdbd2cSJim Jagielski 	{
2642*b1cdbd2cSJim Jagielski 		if( pDDBufDev )
2643*b1cdbd2cSJim Jagielski 		{
2644*b1cdbd2cSJim Jagielski 			// nicht bei jedem Move ein Device anlegen, da dies besonders
2645*b1cdbd2cSJim Jagielski 			// auf Remote-Clients zu langsam ist
2646*b1cdbd2cSJim Jagielski 			pDDDev = pDDBufDev;
2647*b1cdbd2cSJim Jagielski 			pDDBufDev = 0;
2648*b1cdbd2cSJim Jagielski 		}
2649*b1cdbd2cSJim Jagielski 		else
2650*b1cdbd2cSJim Jagielski 		{
2651*b1cdbd2cSJim Jagielski 			pDDDev = new VirtualDevice( *pView );
2652*b1cdbd2cSJim Jagielski 			pDDDev->SetFont( pView->GetFont() );
2653*b1cdbd2cSJim Jagielski 		}
2654*b1cdbd2cSJim Jagielski 	}
2655*b1cdbd2cSJim Jagielski 	else
2656*b1cdbd2cSJim Jagielski 	{
2657*b1cdbd2cSJim Jagielski 		ImpHideDDIcon();
2658*b1cdbd2cSJim Jagielski 	}
2659*b1cdbd2cSJim Jagielski 	const Rectangle& rRect = GetBoundingRect( pRefEntry );
2660*b1cdbd2cSJim Jagielski 	pDDDev->SetOutputSizePixel( rRect.GetSize() );
2661*b1cdbd2cSJim Jagielski 
2662*b1cdbd2cSJim Jagielski 	Point aPos( rPosPix );
2663*b1cdbd2cSJim Jagielski 	CalcDocPos( aPos );
2664*b1cdbd2cSJim Jagielski 
2665*b1cdbd2cSJim Jagielski 	Size aSize( pDDDev->GetOutputSizePixel() );
2666*b1cdbd2cSJim Jagielski 	pDDRefEntry = pRefEntry;
2667*b1cdbd2cSJim Jagielski 	aDDLastEntryPos = aPos;
2668*b1cdbd2cSJim Jagielski 	aDDLastRectPos = aPos;
2669*b1cdbd2cSJim Jagielski 
2670*b1cdbd2cSJim Jagielski 	// Hintergrund sichern
2671*b1cdbd2cSJim Jagielski 	pDDDev->DrawOutDev( Point(), aSize, aPos, aSize, *pView );
2672*b1cdbd2cSJim Jagielski 	// Icon in pView malen
2673*b1cdbd2cSJim Jagielski 	nFlags |= F_NO_EMPHASIS;
2674*b1cdbd2cSJim Jagielski 	PaintEntry( pRefEntry, aPos );
2675*b1cdbd2cSJim Jagielski 	nFlags &= ~F_NO_EMPHASIS;
2676*b1cdbd2cSJim Jagielski 	if( bSelected )
2677*b1cdbd2cSJim Jagielski 		pView->SvListView::Select( pRefEntry, sal_True );
2678*b1cdbd2cSJim Jagielski }
2679*b1cdbd2cSJim Jagielski 
HideShowDDIcon(SvLBoxEntry * pRefEntry,const Point & rPosPix)2680*b1cdbd2cSJim Jagielski void SvImpIconView::HideShowDDIcon( SvLBoxEntry* pRefEntry, const Point& rPosPix )
2681*b1cdbd2cSJim Jagielski {
2682*b1cdbd2cSJim Jagielski /*  In Notfaellen folgenden flackernden Code aktivieren:
2683*b1cdbd2cSJim Jagielski 
2684*b1cdbd2cSJim Jagielski 		HideDDIcon();
2685*b1cdbd2cSJim Jagielski 		ShowDDIcon( pRefEntry, rPosPix );
2686*b1cdbd2cSJim Jagielski 		return;
2687*b1cdbd2cSJim Jagielski */
2688*b1cdbd2cSJim Jagielski 	if( !pDDDev )
2689*b1cdbd2cSJim Jagielski 	{
2690*b1cdbd2cSJim Jagielski 		ShowDDIcon( pRefEntry, rPosPix );
2691*b1cdbd2cSJim Jagielski 		return;
2692*b1cdbd2cSJim Jagielski 	}
2693*b1cdbd2cSJim Jagielski 
2694*b1cdbd2cSJim Jagielski 	if( pRefEntry != pDDRefEntry )
2695*b1cdbd2cSJim Jagielski 	{
2696*b1cdbd2cSJim Jagielski 		HideDDIcon();
2697*b1cdbd2cSJim Jagielski 		ShowDDIcon( pRefEntry, rPosPix );
2698*b1cdbd2cSJim Jagielski 		return;
2699*b1cdbd2cSJim Jagielski 	}
2700*b1cdbd2cSJim Jagielski 
2701*b1cdbd2cSJim Jagielski 	Point aEmptyPoint;
2702*b1cdbd2cSJim Jagielski 
2703*b1cdbd2cSJim Jagielski 	Point aCurEntryPos( rPosPix );
2704*b1cdbd2cSJim Jagielski 	CalcDocPos( aCurEntryPos );
2705*b1cdbd2cSJim Jagielski 
2706*b1cdbd2cSJim Jagielski 	const Rectangle& rRect = GetBoundingRect( pRefEntry );
2707*b1cdbd2cSJim Jagielski 	Size aEntrySize( rRect.GetSize() );
2708*b1cdbd2cSJim Jagielski 	Rectangle aPrevEntryRect( aDDLastEntryPos, aEntrySize );
2709*b1cdbd2cSJim Jagielski 	Rectangle aCurEntryRect( aCurEntryPos, aEntrySize );
2710*b1cdbd2cSJim Jagielski 
2711*b1cdbd2cSJim Jagielski 	if( !aPrevEntryRect.IsOver( aCurEntryRect ) )
2712*b1cdbd2cSJim Jagielski 	{
2713*b1cdbd2cSJim Jagielski 		HideDDIcon();
2714*b1cdbd2cSJim Jagielski 		ShowDDIcon( pRefEntry, rPosPix );
2715*b1cdbd2cSJim Jagielski 		return;
2716*b1cdbd2cSJim Jagielski 	}
2717*b1cdbd2cSJim Jagielski 
2718*b1cdbd2cSJim Jagielski 	// Ueberlappung des neuen und alten D&D-Pointers!
2719*b1cdbd2cSJim Jagielski 
2720*b1cdbd2cSJim Jagielski 	Rectangle aFullRect( aPrevEntryRect.Union( aCurEntryRect ) );
2721*b1cdbd2cSJim Jagielski 	if( !pDDTempDev )
2722*b1cdbd2cSJim Jagielski 	{
2723*b1cdbd2cSJim Jagielski 		pDDTempDev = new VirtualDevice( *pView );
2724*b1cdbd2cSJim Jagielski 		pDDTempDev->SetFont( pView->GetFont() );
2725*b1cdbd2cSJim Jagielski 	}
2726*b1cdbd2cSJim Jagielski 
2727*b1cdbd2cSJim Jagielski 	Size aFullSize( aFullRect.GetSize() );
2728*b1cdbd2cSJim Jagielski 	Point aFullPos( aFullRect.TopLeft() );
2729*b1cdbd2cSJim Jagielski 
2730*b1cdbd2cSJim Jagielski 	pDDTempDev->SetOutputSizePixel( aFullSize );
2731*b1cdbd2cSJim Jagielski 
2732*b1cdbd2cSJim Jagielski 	// Hintergrund (mit dem alten D&D-Pointer!) sichern
2733*b1cdbd2cSJim Jagielski 	pDDTempDev->DrawOutDev( aEmptyPoint, aFullSize, aFullPos, aFullSize, *pView );
2734*b1cdbd2cSJim Jagielski 	// den alten Buffer in den neuen Buffer pasten
2735*b1cdbd2cSJim Jagielski 	aDDLastRectPos = aDDLastRectPos - aFullPos;
2736*b1cdbd2cSJim Jagielski 
2737*b1cdbd2cSJim Jagielski 	pDDTempDev->DrawOutDev(
2738*b1cdbd2cSJim Jagielski 		aDDLastRectPos,
2739*b1cdbd2cSJim Jagielski 		pDDDev->GetOutputSizePixel(),
2740*b1cdbd2cSJim Jagielski 		aEmptyPoint,
2741*b1cdbd2cSJim Jagielski 		pDDDev->GetOutputSizePixel(),
2742*b1cdbd2cSJim Jagielski 		*pDDDev );
2743*b1cdbd2cSJim Jagielski 
2744*b1cdbd2cSJim Jagielski 	// Swap
2745*b1cdbd2cSJim Jagielski 	VirtualDevice* pTemp = pDDDev;
2746*b1cdbd2cSJim Jagielski 	pDDDev = pDDTempDev;
2747*b1cdbd2cSJim Jagielski 	pDDTempDev = pTemp;
2748*b1cdbd2cSJim Jagielski 
2749*b1cdbd2cSJim Jagielski 	// in den restaurierten Hintergrund den neuen D&D-Pointer zeichnen
2750*b1cdbd2cSJim Jagielski 	pDDTempDev->SetOutputSizePixel( pDDDev->GetOutputSizePixel() );
2751*b1cdbd2cSJim Jagielski 	pDDTempDev->DrawOutDev(
2752*b1cdbd2cSJim Jagielski 		aEmptyPoint, aFullSize, aEmptyPoint, aFullSize, *pDDDev );
2753*b1cdbd2cSJim Jagielski 	Point aRelPos = aCurEntryPos - aFullPos;
2754*b1cdbd2cSJim Jagielski 	nFlags |= F_NO_EMPHASIS;
2755*b1cdbd2cSJim Jagielski 	PaintEntry( pRefEntry, aRelPos, 0, pDDTempDev );
2756*b1cdbd2cSJim Jagielski 	nFlags &= ~F_NO_EMPHASIS;
2757*b1cdbd2cSJim Jagielski 
2758*b1cdbd2cSJim Jagielski 	aDDLastRectPos = aFullPos;
2759*b1cdbd2cSJim Jagielski 	aDDLastEntryPos = aCurEntryPos;
2760*b1cdbd2cSJim Jagielski 
2761*b1cdbd2cSJim Jagielski 	pView->DrawOutDev(
2762*b1cdbd2cSJim Jagielski 		aDDLastRectPos,
2763*b1cdbd2cSJim Jagielski 		pDDDev->GetOutputSizePixel(),
2764*b1cdbd2cSJim Jagielski 		aEmptyPoint,
2765*b1cdbd2cSJim Jagielski 		pDDDev->GetOutputSizePixel(),
2766*b1cdbd2cSJim Jagielski 		*pDDTempDev );
2767*b1cdbd2cSJim Jagielski 
2768*b1cdbd2cSJim Jagielski 	sal_Bool bSelected = pView->SvListView::Select( pRefEntry, sal_False );
2769*b1cdbd2cSJim Jagielski 	if( bSelected )
2770*b1cdbd2cSJim Jagielski 		pView->SvListView::Select( pRefEntry, sal_True );
2771*b1cdbd2cSJim Jagielski }
2772*b1cdbd2cSJim Jagielski 
ShowTargetEmphasis(SvLBoxEntry * pEntry,sal_Bool)2773*b1cdbd2cSJim Jagielski void SvImpIconView::ShowTargetEmphasis( SvLBoxEntry* pEntry, sal_Bool )
2774*b1cdbd2cSJim Jagielski {
2775*b1cdbd2cSJim Jagielski 	CheckBoundingRects();
2776*b1cdbd2cSJim Jagielski 	Rectangle aRect;
2777*b1cdbd2cSJim Jagielski 	if( pEntry != pCurParent &&
2778*b1cdbd2cSJim Jagielski 		(pEntry->HasChilds() || pEntry->HasChildsOnDemand()) )
2779*b1cdbd2cSJim Jagielski 		aRect = CalcBmpRect( pEntry );
2780*b1cdbd2cSJim Jagielski 	else
2781*b1cdbd2cSJim Jagielski 	{
2782*b1cdbd2cSJim Jagielski 		aRect.SetSize( aOutputSize );
2783*b1cdbd2cSJim Jagielski 		const MapMode& rMapMode = pView->GetMapMode();
2784*b1cdbd2cSJim Jagielski 		Point aOrigin( rMapMode.GetOrigin());
2785*b1cdbd2cSJim Jagielski 		aOrigin *= -1; // in Doc-Koord wandeln
2786*b1cdbd2cSJim Jagielski 		aRect.SetPos( aOrigin );
2787*b1cdbd2cSJim Jagielski 		aRect.Left()++; aRect.Top()++;
2788*b1cdbd2cSJim Jagielski 		aRect.Right()--; aRect.Bottom()--;
2789*b1cdbd2cSJim Jagielski 	}
2790*b1cdbd2cSJim Jagielski 	ImpDrawXORRect( aRect );
2791*b1cdbd2cSJim Jagielski }
2792*b1cdbd2cSJim Jagielski 
NotifyMoving(SvLBoxEntry * pTarget,SvLBoxEntry * pEntry,SvLBoxEntry * & rpNewPar,sal_uLong & rNewChildPos)2793*b1cdbd2cSJim Jagielski sal_Bool SvImpIconView::NotifyMoving( SvLBoxEntry* pTarget, SvLBoxEntry* pEntry,
2794*b1cdbd2cSJim Jagielski 	SvLBoxEntry*& rpNewPar, sal_uLong& rNewChildPos )
2795*b1cdbd2cSJim Jagielski {
2796*b1cdbd2cSJim Jagielski 	if( pTarget == pCurParent && pModel->GetParent(pEntry) == pCurParent )
2797*b1cdbd2cSJim Jagielski 	{
2798*b1cdbd2cSJim Jagielski 		// D&D innerhalb einer Childlist
2799*b1cdbd2cSJim Jagielski 		StopEditTimer();
2800*b1cdbd2cSJim Jagielski 		SvIcnVwDataEntry* pViewData = ICNVIEWDATA(pEntry);
2801*b1cdbd2cSJim Jagielski 		Size aSize( pViewData->aRect.GetSize() );
2802*b1cdbd2cSJim Jagielski 		Point aNewPos = FindNextEntryPos( aSize );
2803*b1cdbd2cSJim Jagielski 		AdjustVirtSize( Rectangle( aNewPos, aSize ) );
2804*b1cdbd2cSJim Jagielski 		SetEntryPosition( pEntry, aNewPos, sal_False, sal_True );
2805*b1cdbd2cSJim Jagielski 		return sal_False;
2806*b1cdbd2cSJim Jagielski 	}
2807*b1cdbd2cSJim Jagielski 	return pView->SvLBox::NotifyMoving(pTarget,pEntry,rpNewPar,rNewChildPos);
2808*b1cdbd2cSJim Jagielski }
2809*b1cdbd2cSJim Jagielski 
NotifyCopying(SvLBoxEntry * pTarget,SvLBoxEntry * pEntry,SvLBoxEntry * & rpNewParent,sal_uLong & rNewChildPos)2810*b1cdbd2cSJim Jagielski sal_Bool SvImpIconView::NotifyCopying( SvLBoxEntry* pTarget, SvLBoxEntry* pEntry,
2811*b1cdbd2cSJim Jagielski 	SvLBoxEntry*& rpNewParent, sal_uLong& rNewChildPos )
2812*b1cdbd2cSJim Jagielski {
2813*b1cdbd2cSJim Jagielski 	return pView->SvLBox::NotifyCopying(pTarget,pEntry,rpNewParent,rNewChildPos);
2814*b1cdbd2cSJim Jagielski }
2815*b1cdbd2cSJim Jagielski 
WriteDragServerInfo(const Point & rPos,SvLBoxDDInfo * pInfo)2816*b1cdbd2cSJim Jagielski void SvImpIconView::WriteDragServerInfo( const Point& rPos, SvLBoxDDInfo* pInfo)
2817*b1cdbd2cSJim Jagielski {
2818*b1cdbd2cSJim Jagielski 	SvLBoxEntry* pCurEntry = GetCurEntry();
2819*b1cdbd2cSJim Jagielski 	Point aEntryPos;
2820*b1cdbd2cSJim Jagielski 	if( pCurEntry )
2821*b1cdbd2cSJim Jagielski 	{
2822*b1cdbd2cSJim Jagielski 		aEntryPos = rPos;
2823*b1cdbd2cSJim Jagielski 		aEntryPos -= GetEntryPosition( pCurEntry );
2824*b1cdbd2cSJim Jagielski 	}
2825*b1cdbd2cSJim Jagielski 	pInfo->nMouseRelX = aEntryPos.X();
2826*b1cdbd2cSJim Jagielski 	pInfo->nMouseRelY = aEntryPos.Y();
2827*b1cdbd2cSJim Jagielski }
2828*b1cdbd2cSJim Jagielski 
ReadDragServerInfo(const Point & rPos,SvLBoxDDInfo * pInfo)2829*b1cdbd2cSJim Jagielski void SvImpIconView::ReadDragServerInfo( const Point& rPos, SvLBoxDDInfo* pInfo )
2830*b1cdbd2cSJim Jagielski {
2831*b1cdbd2cSJim Jagielski 	Point aDropPos( rPos );
2832*b1cdbd2cSJim Jagielski 	aDropPos.X() -= pInfo->nMouseRelX;
2833*b1cdbd2cSJim Jagielski 	aDropPos.Y() -= pInfo->nMouseRelY;
2834*b1cdbd2cSJim Jagielski 	SetNextEntryPos( aDropPos );
2835*b1cdbd2cSJim Jagielski }
2836*b1cdbd2cSJim Jagielski 
InvalidateBoundingRect(SvLBoxEntry * pEntry)2837*b1cdbd2cSJim Jagielski void SvImpIconView::InvalidateBoundingRect( SvLBoxEntry* pEntry )
2838*b1cdbd2cSJim Jagielski {
2839*b1cdbd2cSJim Jagielski 	SvIcnVwDataEntry* pViewData = ICNVIEWDATA(pEntry);
2840*b1cdbd2cSJim Jagielski 	InvalidateBoundingRect( pViewData->aRect );
2841*b1cdbd2cSJim Jagielski }
2842*b1cdbd2cSJim Jagielski 
PrepareCommandEvent(const Point & rPt)2843*b1cdbd2cSJim Jagielski void SvImpIconView::PrepareCommandEvent( const Point& rPt )
2844*b1cdbd2cSJim Jagielski {
2845*b1cdbd2cSJim Jagielski 	aMouseMoveTimer.Stop();
2846*b1cdbd2cSJim Jagielski 	StopEditTimer();
2847*b1cdbd2cSJim Jagielski 	nFlags |= F_CMD_ARRIVED;
2848*b1cdbd2cSJim Jagielski 	SvLBoxEntry* pEntry = pView->GetEntry( rPt, sal_True );
2849*b1cdbd2cSJim Jagielski 	if( (nFlags & F_DOWN_CTRL) && pEntry && !pView->IsSelected(pEntry) )
2850*b1cdbd2cSJim Jagielski 		pView->Select( pEntry, sal_True );
2851*b1cdbd2cSJim Jagielski 	nFlags &= ~(F_DOWN_CTRL | F_DOWN_DESELECT);
2852*b1cdbd2cSJim Jagielski }
2853*b1cdbd2cSJim Jagielski 
SttDrag(const Point & rPos)2854*b1cdbd2cSJim Jagielski void SvImpIconView::SttDrag( const Point& rPos )
2855*b1cdbd2cSJim Jagielski {
2856*b1cdbd2cSJim Jagielski 	PrepareCommandEvent( rPos );
2857*b1cdbd2cSJim Jagielski 
2858*b1cdbd2cSJim Jagielski 	nFlags |= F_DRAG_SOURCE;
2859*b1cdbd2cSJim Jagielski 	ShowCursor( sal_False );
2860*b1cdbd2cSJim Jagielski }
2861*b1cdbd2cSJim Jagielski 
EndDrag()2862*b1cdbd2cSJim Jagielski void SvImpIconView::EndDrag()
2863*b1cdbd2cSJim Jagielski {
2864*b1cdbd2cSJim Jagielski 	ShowCursor( sal_True );
2865*b1cdbd2cSJim Jagielski 	nFlags &= (~F_DRAG_SOURCE);
2866*b1cdbd2cSJim Jagielski }
2867*b1cdbd2cSJim Jagielski 
ToTop(SvLBoxEntry * pEntry)2868*b1cdbd2cSJim Jagielski void SvImpIconView::ToTop( SvLBoxEntry* pEntry )
2869*b1cdbd2cSJim Jagielski {
2870*b1cdbd2cSJim Jagielski 	DBG_ASSERT(pZOrderList->GetPos(pEntry)!=0xffff,"ToTop:ZOrder?");
2871*b1cdbd2cSJim Jagielski 	if( pZOrderList->GetObject( pZOrderList->Count() -1 ) != pEntry )
2872*b1cdbd2cSJim Jagielski 	{
2873*b1cdbd2cSJim Jagielski 		sal_uInt16 nPos = pZOrderList->GetPos( (void*)pEntry );
2874*b1cdbd2cSJim Jagielski 		pZOrderList->Remove( nPos, 1 );
2875*b1cdbd2cSJim Jagielski 		pZOrderList->Insert( pEntry, pZOrderList->Count() );
2876*b1cdbd2cSJim Jagielski 	}
2877*b1cdbd2cSJim Jagielski }
2878*b1cdbd2cSJim Jagielski 
SetCurParent(SvLBoxEntry * pNewParent)2879*b1cdbd2cSJim Jagielski void SvImpIconView::SetCurParent( SvLBoxEntry* pNewParent )
2880*b1cdbd2cSJim Jagielski {
2881*b1cdbd2cSJim Jagielski 	Clear();
2882*b1cdbd2cSJim Jagielski 	pCurParent = pNewParent;
2883*b1cdbd2cSJim Jagielski 	ImpArrange();
2884*b1cdbd2cSJim Jagielski }
2885*b1cdbd2cSJim Jagielski 
ClipAtVirtOutRect(Rectangle & rRect) const2886*b1cdbd2cSJim Jagielski void SvImpIconView::ClipAtVirtOutRect( Rectangle& rRect ) const
2887*b1cdbd2cSJim Jagielski {
2888*b1cdbd2cSJim Jagielski 	if( rRect.Bottom() >= aVirtOutputSize.Height() )
2889*b1cdbd2cSJim Jagielski 		rRect.Bottom() = aVirtOutputSize.Height() - 1;
2890*b1cdbd2cSJim Jagielski 	if( rRect.Right() >= aVirtOutputSize.Width() )
2891*b1cdbd2cSJim Jagielski 		rRect.Right() = aVirtOutputSize.Width() - 1;
2892*b1cdbd2cSJim Jagielski 	if( rRect.Top() < 0 )
2893*b1cdbd2cSJim Jagielski 		rRect.Top() = 0;
2894*b1cdbd2cSJim Jagielski 	if( rRect.Left() < 0 )
2895*b1cdbd2cSJim Jagielski 		rRect.Left() = 0;
2896*b1cdbd2cSJim Jagielski }
2897*b1cdbd2cSJim Jagielski 
2898*b1cdbd2cSJim Jagielski // rRect: Bereich des Dokumentes (in Dokumentkoordinaten), der
2899*b1cdbd2cSJim Jagielski // sichtbar gemacht werden soll.
2900*b1cdbd2cSJim Jagielski // bScrBar == sal_True: Das Rect wurde aufgrund eines ScrollBar-Events berechnet
2901*b1cdbd2cSJim Jagielski 
MakeVisible(const Rectangle & rRect,sal_Bool bScrBar)2902*b1cdbd2cSJim Jagielski void SvImpIconView::MakeVisible( const Rectangle& rRect, sal_Bool bScrBar )
2903*b1cdbd2cSJim Jagielski {
2904*b1cdbd2cSJim Jagielski 	Rectangle aRect( rRect );
2905*b1cdbd2cSJim Jagielski 	ClipAtVirtOutRect( aRect );
2906*b1cdbd2cSJim Jagielski 	MapMode aMapMode( pView->GetMapMode() );
2907*b1cdbd2cSJim Jagielski 	Point aOrigin( aMapMode.GetOrigin() );
2908*b1cdbd2cSJim Jagielski 	// in Dokumentkoordinate umwandeln
2909*b1cdbd2cSJim Jagielski 	aOrigin *= -1;
2910*b1cdbd2cSJim Jagielski 
2911*b1cdbd2cSJim Jagielski 	Rectangle aOutputArea( aOrigin, aOutputSize );
2912*b1cdbd2cSJim Jagielski 	if( aOutputArea.IsInside( aRect ) )
2913*b1cdbd2cSJim Jagielski 		return;	// ist schon sichtbar
2914*b1cdbd2cSJim Jagielski 
2915*b1cdbd2cSJim Jagielski 	long nDy;
2916*b1cdbd2cSJim Jagielski 	if( aRect.Top() < aOutputArea.Top() )
2917*b1cdbd2cSJim Jagielski 	{
2918*b1cdbd2cSJim Jagielski 		// nach oben scrollen (nDy < 0)
2919*b1cdbd2cSJim Jagielski 		nDy = aRect.Top() - aOutputArea.Top();
2920*b1cdbd2cSJim Jagielski 	}
2921*b1cdbd2cSJim Jagielski 	else if( aRect.Bottom() > aOutputArea.Bottom() )
2922*b1cdbd2cSJim Jagielski 	{
2923*b1cdbd2cSJim Jagielski 		// nach unten scrollen (nDy > 0)
2924*b1cdbd2cSJim Jagielski 		nDy = aRect.Bottom() - aOutputArea.Bottom();
2925*b1cdbd2cSJim Jagielski 	}
2926*b1cdbd2cSJim Jagielski 	else
2927*b1cdbd2cSJim Jagielski 		nDy = 0;
2928*b1cdbd2cSJim Jagielski 
2929*b1cdbd2cSJim Jagielski 	long nDx;
2930*b1cdbd2cSJim Jagielski 	if( aRect.Left() < aOutputArea.Left() )
2931*b1cdbd2cSJim Jagielski 	{
2932*b1cdbd2cSJim Jagielski 		// nach links scrollen (nDx < 0)
2933*b1cdbd2cSJim Jagielski 		nDx = aRect.Left() - aOutputArea.Left();
2934*b1cdbd2cSJim Jagielski 	}
2935*b1cdbd2cSJim Jagielski 	else if( aRect.Right() > aOutputArea.Right() )
2936*b1cdbd2cSJim Jagielski 	{
2937*b1cdbd2cSJim Jagielski 		// nach rechts scrollen (nDx > 0)
2938*b1cdbd2cSJim Jagielski 		nDx = aRect.Right() - aOutputArea.Right();
2939*b1cdbd2cSJim Jagielski 	}
2940*b1cdbd2cSJim Jagielski 	else
2941*b1cdbd2cSJim Jagielski 		nDx = 0;
2942*b1cdbd2cSJim Jagielski 
2943*b1cdbd2cSJim Jagielski 	aOrigin.X() += nDx;
2944*b1cdbd2cSJim Jagielski 	aOrigin.Y() += nDy;
2945*b1cdbd2cSJim Jagielski 	aOutputArea.SetPos( aOrigin );
2946*b1cdbd2cSJim Jagielski 
2947*b1cdbd2cSJim Jagielski 	pView->Update();
2948*b1cdbd2cSJim Jagielski 
2949*b1cdbd2cSJim Jagielski 	// Origin fuer SV invertieren (damit wir in
2950*b1cdbd2cSJim Jagielski 	// Dokumentkoordinaten scrollen/painten koennen)
2951*b1cdbd2cSJim Jagielski 	aOrigin *= -1;
2952*b1cdbd2cSJim Jagielski 	aMapMode.SetOrigin( aOrigin );
2953*b1cdbd2cSJim Jagielski 	pView->SetMapMode( aMapMode );
2954*b1cdbd2cSJim Jagielski 
2955*b1cdbd2cSJim Jagielski 	// in umgekehrte Richtung scrollen!
2956*b1cdbd2cSJim Jagielski 	pView->Control::Scroll( -nDx, -nDy, aOutputArea, sal_True );
2957*b1cdbd2cSJim Jagielski 	if( aHorSBar.IsVisible() || aVerSBar.IsVisible() )
2958*b1cdbd2cSJim Jagielski 	{
2959*b1cdbd2cSJim Jagielski 		if( !bScrBar )
2960*b1cdbd2cSJim Jagielski 		{
2961*b1cdbd2cSJim Jagielski 			aOrigin *= -1;
2962*b1cdbd2cSJim Jagielski 			// Thumbs korrigieren
2963*b1cdbd2cSJim Jagielski 			if(aHorSBar.IsVisible() && aHorSBar.GetThumbPos() != aOrigin.X())
2964*b1cdbd2cSJim Jagielski 				aHorSBar.SetThumbPos( aOrigin.X() );
2965*b1cdbd2cSJim Jagielski 			if(aVerSBar.IsVisible() && aVerSBar.GetThumbPos() != aOrigin.Y())
2966*b1cdbd2cSJim Jagielski 				aVerSBar.SetThumbPos( aOrigin.Y() );
2967*b1cdbd2cSJim Jagielski 		}
2968*b1cdbd2cSJim Jagielski 	}
2969*b1cdbd2cSJim Jagielski 	// pruefen, ob ScrollBars noch benoetigt werden
2970*b1cdbd2cSJim Jagielski 	CheckScrollBars();
2971*b1cdbd2cSJim Jagielski 	pView->Update();
2972*b1cdbd2cSJim Jagielski }
2973*b1cdbd2cSJim Jagielski 
2974*b1cdbd2cSJim Jagielski 
GetNewCursor()2975*b1cdbd2cSJim Jagielski SvLBoxEntry* SvImpIconView::GetNewCursor()
2976*b1cdbd2cSJim Jagielski {
2977*b1cdbd2cSJim Jagielski 	SvLBoxEntry* pNewCursor;
2978*b1cdbd2cSJim Jagielski 	if( pCursor )
2979*b1cdbd2cSJim Jagielski 	{
2980*b1cdbd2cSJim Jagielski 		pNewCursor = pImpCursor->GoLeftRight( pCursor, sal_False );
2981*b1cdbd2cSJim Jagielski 		if( !pNewCursor )
2982*b1cdbd2cSJim Jagielski 		{
2983*b1cdbd2cSJim Jagielski 			pNewCursor = pImpCursor->GoLeftRight( pCursor, sal_True );
2984*b1cdbd2cSJim Jagielski 			if( !pNewCursor )
2985*b1cdbd2cSJim Jagielski 			{
2986*b1cdbd2cSJim Jagielski 				pNewCursor = pImpCursor->GoUpDown( pCursor, sal_False );
2987*b1cdbd2cSJim Jagielski 				if( !pNewCursor )
2988*b1cdbd2cSJim Jagielski 					pNewCursor = pImpCursor->GoUpDown( pCursor, sal_True );
2989*b1cdbd2cSJim Jagielski 			}
2990*b1cdbd2cSJim Jagielski 		}
2991*b1cdbd2cSJim Jagielski 	}
2992*b1cdbd2cSJim Jagielski 	else
2993*b1cdbd2cSJim Jagielski 		pNewCursor = pModel->FirstChild( pCurParent );
2994*b1cdbd2cSJim Jagielski 	DBG_ASSERT(!pNewCursor|| (pCursor&&pCursor!=pNewCursor),"GetNewCursor failed");
2995*b1cdbd2cSJim Jagielski 	return pNewCursor;
2996*b1cdbd2cSJim Jagielski }
2997*b1cdbd2cSJim Jagielski 
2998*b1cdbd2cSJim Jagielski 
GetSelectionCount() const2999*b1cdbd2cSJim Jagielski sal_uInt16 SvImpIconView:: GetSelectionCount() const
3000*b1cdbd2cSJim Jagielski {
3001*b1cdbd2cSJim Jagielski 	sal_uInt16 nSelected = 0;
3002*b1cdbd2cSJim Jagielski 	SvLBoxEntry* pEntry = pModel->FirstChild( pCurParent);
3003*b1cdbd2cSJim Jagielski 	while( pEntry )
3004*b1cdbd2cSJim Jagielski 	{
3005*b1cdbd2cSJim Jagielski 		if( pView->IsSelected( pEntry ) )
3006*b1cdbd2cSJim Jagielski 			nSelected++;
3007*b1cdbd2cSJim Jagielski 		pEntry = pModel->NextSibling( pEntry );
3008*b1cdbd2cSJim Jagielski 	}
3009*b1cdbd2cSJim Jagielski 	return nSelected;
3010*b1cdbd2cSJim Jagielski }
3011*b1cdbd2cSJim Jagielski 
3012*b1cdbd2cSJim Jagielski 
ToggleSelection(SvLBoxEntry * pEntry)3013*b1cdbd2cSJim Jagielski void SvImpIconView::ToggleSelection( SvLBoxEntry* pEntry )
3014*b1cdbd2cSJim Jagielski {
3015*b1cdbd2cSJim Jagielski 	sal_Bool bSel;
3016*b1cdbd2cSJim Jagielski 	if( pView->IsSelected( pEntry ) )
3017*b1cdbd2cSJim Jagielski 		bSel = sal_False;
3018*b1cdbd2cSJim Jagielski 	else
3019*b1cdbd2cSJim Jagielski 		bSel = sal_True;
3020*b1cdbd2cSJim Jagielski 	pView->Select( pEntry, bSel );
3021*b1cdbd2cSJim Jagielski }
3022*b1cdbd2cSJim Jagielski 
DeselectAllBut(SvLBoxEntry * pThisEntryNot)3023*b1cdbd2cSJim Jagielski void SvImpIconView::DeselectAllBut( SvLBoxEntry* pThisEntryNot )
3024*b1cdbd2cSJim Jagielski {
3025*b1cdbd2cSJim Jagielski 	ClearSelectedRectList();
3026*b1cdbd2cSJim Jagielski 	SvLBoxEntry* pEntry = pModel->FirstChild( pCurParent );
3027*b1cdbd2cSJim Jagielski 	while( pEntry )
3028*b1cdbd2cSJim Jagielski 	{
3029*b1cdbd2cSJim Jagielski 		if( pEntry != pThisEntryNot && pView->IsSelected( pEntry ))
3030*b1cdbd2cSJim Jagielski 			pView->Select( pEntry, sal_False );
3031*b1cdbd2cSJim Jagielski 		pEntry = pModel->NextSibling( pEntry );
3032*b1cdbd2cSJim Jagielski 	}
3033*b1cdbd2cSJim Jagielski }
3034*b1cdbd2cSJim Jagielski 
3035*b1cdbd2cSJim Jagielski #define ICN_ROWS	50
3036*b1cdbd2cSJim Jagielski #define ICN_COLS	30
3037*b1cdbd2cSJim Jagielski 
ImpIcnCursor(SvImpIconView * pOwner)3038*b1cdbd2cSJim Jagielski ImpIcnCursor::ImpIcnCursor( SvImpIconView* pOwner )
3039*b1cdbd2cSJim Jagielski {
3040*b1cdbd2cSJim Jagielski 	pView 		= pOwner;
3041*b1cdbd2cSJim Jagielski 	pColumns	= 0;
3042*b1cdbd2cSJim Jagielski 	pRows 		= 0;
3043*b1cdbd2cSJim Jagielski 	pCurEntry 	= 0;
3044*b1cdbd2cSJim Jagielski 	nDeltaWidth = 0;
3045*b1cdbd2cSJim Jagielski 	nDeltaHeight= 0;
3046*b1cdbd2cSJim Jagielski 	nCols		= 0;
3047*b1cdbd2cSJim Jagielski 	nRows		= 0;
3048*b1cdbd2cSJim Jagielski 	nGridCols	= 0;
3049*b1cdbd2cSJim Jagielski 	nGridRows	= 0;
3050*b1cdbd2cSJim Jagielski 	pGridMap	= 0;
3051*b1cdbd2cSJim Jagielski }
3052*b1cdbd2cSJim Jagielski 
~ImpIcnCursor()3053*b1cdbd2cSJim Jagielski ImpIcnCursor::~ImpIcnCursor()
3054*b1cdbd2cSJim Jagielski {
3055*b1cdbd2cSJim Jagielski 	delete[] pColumns;
3056*b1cdbd2cSJim Jagielski 	delete[] pRows;
3057*b1cdbd2cSJim Jagielski 	delete pGridMap;
3058*b1cdbd2cSJim Jagielski }
3059*b1cdbd2cSJim Jagielski 
GetSortListPos(SvPtrarr * pList,long nValue,int bVertical)3060*b1cdbd2cSJim Jagielski sal_uInt16 ImpIcnCursor::GetSortListPos( SvPtrarr* pList, long nValue,
3061*b1cdbd2cSJim Jagielski 	int bVertical )
3062*b1cdbd2cSJim Jagielski {
3063*b1cdbd2cSJim Jagielski 	sal_uInt16 nCount = (sal_uInt16)pList->Count();
3064*b1cdbd2cSJim Jagielski 	if( !nCount )
3065*b1cdbd2cSJim Jagielski 		return 0;
3066*b1cdbd2cSJim Jagielski 
3067*b1cdbd2cSJim Jagielski 	sal_uInt16 nCurPos = 0;
3068*b1cdbd2cSJim Jagielski 	long nPrevValue = LONG_MIN;
3069*b1cdbd2cSJim Jagielski 	while( nCount )
3070*b1cdbd2cSJim Jagielski 	{
3071*b1cdbd2cSJim Jagielski 		const Rectangle& rRect=
3072*b1cdbd2cSJim Jagielski 			pView->GetBoundingRect((SvLBoxEntry*)(pList->GetObject(nCurPos)));
3073*b1cdbd2cSJim Jagielski 		long nCurValue;
3074*b1cdbd2cSJim Jagielski 		if( bVertical )
3075*b1cdbd2cSJim Jagielski 			nCurValue = rRect.Top();
3076*b1cdbd2cSJim Jagielski 		else
3077*b1cdbd2cSJim Jagielski 			nCurValue = rRect.Left();
3078*b1cdbd2cSJim Jagielski 		if( nValue >= nPrevValue && nValue <= nCurValue )
3079*b1cdbd2cSJim Jagielski 			return (sal_uInt16)nCurPos;
3080*b1cdbd2cSJim Jagielski 		nPrevValue = nCurValue;
3081*b1cdbd2cSJim Jagielski 		nCount--;
3082*b1cdbd2cSJim Jagielski 		nCurPos++;
3083*b1cdbd2cSJim Jagielski 	}
3084*b1cdbd2cSJim Jagielski 	return pList->Count();
3085*b1cdbd2cSJim Jagielski }
3086*b1cdbd2cSJim Jagielski 
ImplCreate()3087*b1cdbd2cSJim Jagielski void ImpIcnCursor::ImplCreate()
3088*b1cdbd2cSJim Jagielski {
3089*b1cdbd2cSJim Jagielski 	pView->CheckBoundingRects();
3090*b1cdbd2cSJim Jagielski 	DBG_ASSERT(pColumns==0&&pRows==0,"ImplCreate: Not cleared");
3091*b1cdbd2cSJim Jagielski 
3092*b1cdbd2cSJim Jagielski 	SetDeltas();
3093*b1cdbd2cSJim Jagielski 
3094*b1cdbd2cSJim Jagielski 	pColumns = new SvPtrarr[ nCols ];
3095*b1cdbd2cSJim Jagielski 	pRows = new SvPtrarr[ nRows ];
3096*b1cdbd2cSJim Jagielski 
3097*b1cdbd2cSJim Jagielski 	DELETEZ(pGridMap);
3098*b1cdbd2cSJim Jagielski 
3099*b1cdbd2cSJim Jagielski 	SvLBoxTreeList* pModel = pView->pModel;
3100*b1cdbd2cSJim Jagielski 	SvLBoxEntry* pEntry = pModel->FirstChild( pView->pCurParent );
3101*b1cdbd2cSJim Jagielski 	while( pEntry )
3102*b1cdbd2cSJim Jagielski 	{
3103*b1cdbd2cSJim Jagielski 		SvIcnVwDataEntry* pViewData = ICNVIEWDATA2(pEntry);
3104*b1cdbd2cSJim Jagielski 		// const Rectangle& rRect = pView->GetBoundingRect( pEntry );
3105*b1cdbd2cSJim Jagielski 		Rectangle rRect( pView->CalcBmpRect( pEntry,0,pViewData ) );
3106*b1cdbd2cSJim Jagielski 		short nY = (short)( ((rRect.Top()+rRect.Bottom())/2) / nDeltaHeight );
3107*b1cdbd2cSJim Jagielski 		short nX = (short)( ((rRect.Left()+rRect.Right())/2) / nDeltaWidth );
3108*b1cdbd2cSJim Jagielski 
3109*b1cdbd2cSJim Jagielski 		// Rundungsfehler abfangen
3110*b1cdbd2cSJim Jagielski 		if( nY >= nRows )
3111*b1cdbd2cSJim Jagielski 			nY = sal::static_int_cast< short >(nRows - 1);
3112*b1cdbd2cSJim Jagielski 		if( nX >= nCols )
3113*b1cdbd2cSJim Jagielski 			nX = sal::static_int_cast< short >(nCols - 1);
3114*b1cdbd2cSJim Jagielski 
3115*b1cdbd2cSJim Jagielski 		sal_uInt16 nIns = GetSortListPos( &pColumns[nX], rRect.Top(), sal_True );
3116*b1cdbd2cSJim Jagielski 		pColumns[ nX ].Insert( pEntry, nIns );
3117*b1cdbd2cSJim Jagielski 
3118*b1cdbd2cSJim Jagielski 		nIns = GetSortListPos( &pRows[nY], rRect.Left(), sal_False );
3119*b1cdbd2cSJim Jagielski 		pRows[ nY ].Insert( pEntry, nIns );
3120*b1cdbd2cSJim Jagielski 
3121*b1cdbd2cSJim Jagielski 		pViewData->nX = nX;
3122*b1cdbd2cSJim Jagielski 		pViewData->nY = nY;
3123*b1cdbd2cSJim Jagielski 
3124*b1cdbd2cSJim Jagielski 		pEntry = pModel->NextSibling( pEntry );
3125*b1cdbd2cSJim Jagielski 	}
3126*b1cdbd2cSJim Jagielski }
3127*b1cdbd2cSJim Jagielski 
CreateGridMap()3128*b1cdbd2cSJim Jagielski void ImpIcnCursor::CreateGridMap()
3129*b1cdbd2cSJim Jagielski {
3130*b1cdbd2cSJim Jagielski 	if( pGridMap )
3131*b1cdbd2cSJim Jagielski 		return;
3132*b1cdbd2cSJim Jagielski 
3133*b1cdbd2cSJim Jagielski 	const Size& rSize = pView->aVirtOutputSize;
3134*b1cdbd2cSJim Jagielski 	long nWidth = rSize.Width();
3135*b1cdbd2cSJim Jagielski 	if( nWidth < pView->nMaxVirtWidth )
3136*b1cdbd2cSJim Jagielski 		nWidth = pView->nMaxVirtWidth;
3137*b1cdbd2cSJim Jagielski 	nWidth -= 2*LROFFS_WINBORDER;
3138*b1cdbd2cSJim Jagielski 	if( nWidth <= 0 )
3139*b1cdbd2cSJim Jagielski 		nWidth = 1;
3140*b1cdbd2cSJim Jagielski 
3141*b1cdbd2cSJim Jagielski 	nGridDX = pView->nGridDX;
3142*b1cdbd2cSJim Jagielski 	nGridDY = pView->nGridDY;
3143*b1cdbd2cSJim Jagielski 
3144*b1cdbd2cSJim Jagielski 	// Hinweis: Wegen der Abrundung bei Berechnung von nGridCols
3145*b1cdbd2cSJim Jagielski 	// ist es moeglich, dass Eintrage nicht im Grid liegen. Diese
3146*b1cdbd2cSJim Jagielski 	// wurden typischerweise manuell verschoben und gelockt
3147*b1cdbd2cSJim Jagielski 	nGridCols = nWidth / nGridDX;
3148*b1cdbd2cSJim Jagielski 	if( !nGridCols ) nGridCols = 1;
3149*b1cdbd2cSJim Jagielski 
3150*b1cdbd2cSJim Jagielski 	nGridRows = rSize.Height() / nGridDY;
3151*b1cdbd2cSJim Jagielski 	// nRows nicht abrunden, da zur Vermeidung von Ueberlappungen
3152*b1cdbd2cSJim Jagielski 	// das gesamte BoundingRect des Eintrags zur Markierung im Grid
3153*b1cdbd2cSJim Jagielski 	// herangezogen wird.
3154*b1cdbd2cSJim Jagielski 	if( (nGridRows * nGridDY) < rSize.Height() )
3155*b1cdbd2cSJim Jagielski 		nGridRows++;
3156*b1cdbd2cSJim Jagielski 	else if( !nGridRows )
3157*b1cdbd2cSJim Jagielski 		nGridRows = 1;
3158*b1cdbd2cSJim Jagielski 
3159*b1cdbd2cSJim Jagielski 	//XXX
3160*b1cdbd2cSJim Jagielski 	//nGridRows += 50; // in fuenfziger-Schritten
3161*b1cdbd2cSJim Jagielski 
3162*b1cdbd2cSJim Jagielski 	pGridMap = new sal_Bool[ nGridRows*nGridCols];
3163*b1cdbd2cSJim Jagielski 	memset( (void*)pGridMap, 0, nGridRows*nGridCols );
3164*b1cdbd2cSJim Jagielski 
3165*b1cdbd2cSJim Jagielski 	SvLBoxTreeList* pModel = pView->pModel;
3166*b1cdbd2cSJim Jagielski 	SvLBoxEntry* pEntry = pModel->FirstChild( pView->pCurParent );
3167*b1cdbd2cSJim Jagielski 	while( pEntry )
3168*b1cdbd2cSJim Jagielski 	{
3169*b1cdbd2cSJim Jagielski 		SvIcnVwDataEntry* pViewData = ICNVIEWDATA2(pEntry);
3170*b1cdbd2cSJim Jagielski 		const Rectangle& rRect = pViewData->aRect;
3171*b1cdbd2cSJim Jagielski 		// nur, wenn der Entry schon plaziert ist
3172*b1cdbd2cSJim Jagielski 		if( pView->IsBoundingRectValid( rRect ))
3173*b1cdbd2cSJim Jagielski 		{
3174*b1cdbd2cSJim Jagielski 			// Alle vom Eintrag beruehrten Grids kennzeichnen
3175*b1cdbd2cSJim Jagielski 			SetGridUsed( pView->GetBoundingRect( pEntry, pViewData ) );
3176*b1cdbd2cSJim Jagielski 		}
3177*b1cdbd2cSJim Jagielski 		pEntry = pModel->NextSibling( pEntry );
3178*b1cdbd2cSJim Jagielski 	}
3179*b1cdbd2cSJim Jagielski }
3180*b1cdbd2cSJim Jagielski 
GetGrid(const Point & rDocPos,sal_uInt16 & rGridX,sal_uInt16 & rGridY) const3181*b1cdbd2cSJim Jagielski sal_Bool ImpIcnCursor::GetGrid( const Point& rDocPos, sal_uInt16& rGridX, sal_uInt16& rGridY ) const
3182*b1cdbd2cSJim Jagielski {
3183*b1cdbd2cSJim Jagielski 	Point aPos( rDocPos );
3184*b1cdbd2cSJim Jagielski 	aPos.X() -= LROFFS_WINBORDER;
3185*b1cdbd2cSJim Jagielski 	aPos.Y() -= TBOFFS_WINBORDER;
3186*b1cdbd2cSJim Jagielski 	rGridX = (sal_uInt16)(aPos.X() / nGridDX);
3187*b1cdbd2cSJim Jagielski 	rGridY = (sal_uInt16)(aPos.Y() / nGridDY);
3188*b1cdbd2cSJim Jagielski 	sal_Bool bInGrid = sal_True;
3189*b1cdbd2cSJim Jagielski 	if( rGridX >= nGridCols )
3190*b1cdbd2cSJim Jagielski 	{
3191*b1cdbd2cSJim Jagielski 		rGridX = sal::static_int_cast< sal_uInt16 >(nGridCols - 1);
3192*b1cdbd2cSJim Jagielski 		bInGrid = sal_False;
3193*b1cdbd2cSJim Jagielski 	}
3194*b1cdbd2cSJim Jagielski 	if( rGridY >= nGridRows )
3195*b1cdbd2cSJim Jagielski 	{
3196*b1cdbd2cSJim Jagielski 		rGridY = sal::static_int_cast< sal_uInt16 >(nGridRows - 1);
3197*b1cdbd2cSJim Jagielski 		if( !bInGrid )
3198*b1cdbd2cSJim Jagielski 			return sal_False; // beide Koordinaten nicht im Grid
3199*b1cdbd2cSJim Jagielski 	}
3200*b1cdbd2cSJim Jagielski 	return sal_True;
3201*b1cdbd2cSJim Jagielski }
3202*b1cdbd2cSJim Jagielski 
SetGridUsed(const Rectangle & rRect,sal_Bool bUsed)3203*b1cdbd2cSJim Jagielski void ImpIcnCursor::SetGridUsed( const Rectangle& rRect, sal_Bool bUsed  )
3204*b1cdbd2cSJim Jagielski {
3205*b1cdbd2cSJim Jagielski 	CreateGridMap();
3206*b1cdbd2cSJim Jagielski 	sal_uInt16 nTLX, nTLY, nBRX, nBRY;
3207*b1cdbd2cSJim Jagielski 
3208*b1cdbd2cSJim Jagielski 	sal_Bool bTLInGrid = GetGrid( rRect.TopLeft(), nTLX, nTLY );
3209*b1cdbd2cSJim Jagielski 	sal_Bool bBRInGrid = GetGrid( rRect.BottomRight(), nBRX, nBRY );
3210*b1cdbd2cSJim Jagielski 
3211*b1cdbd2cSJim Jagielski 	if( !bTLInGrid && !bBRInGrid )
3212*b1cdbd2cSJim Jagielski 		return;
3213*b1cdbd2cSJim Jagielski 
3214*b1cdbd2cSJim Jagielski 	for( sal_uInt16 nCurY = nTLY; nCurY <= nBRY; nCurY++ )
3215*b1cdbd2cSJim Jagielski 	{
3216*b1cdbd2cSJim Jagielski 		for( sal_uInt16 nCurX = nTLX; nCurX <= nBRX; nCurX++ )
3217*b1cdbd2cSJim Jagielski 		{
3218*b1cdbd2cSJim Jagielski 			SetGridUsed( nCurX, nCurY, bUsed );
3219*b1cdbd2cSJim Jagielski 		}
3220*b1cdbd2cSJim Jagielski 	}
3221*b1cdbd2cSJim Jagielski }
3222*b1cdbd2cSJim Jagielski 
Clear(sal_Bool bGridToo)3223*b1cdbd2cSJim Jagielski void ImpIcnCursor::Clear( sal_Bool bGridToo )
3224*b1cdbd2cSJim Jagielski {
3225*b1cdbd2cSJim Jagielski 	if( pColumns )
3226*b1cdbd2cSJim Jagielski 	{
3227*b1cdbd2cSJim Jagielski 		delete[] pColumns;
3228*b1cdbd2cSJim Jagielski 		delete[] pRows;
3229*b1cdbd2cSJim Jagielski 		pColumns = 0;
3230*b1cdbd2cSJim Jagielski 		pRows = 0;
3231*b1cdbd2cSJim Jagielski 		pCurEntry = 0;
3232*b1cdbd2cSJim Jagielski 		nDeltaWidth = 0;
3233*b1cdbd2cSJim Jagielski 		nDeltaHeight = 0;
3234*b1cdbd2cSJim Jagielski 	}
3235*b1cdbd2cSJim Jagielski 	if( bGridToo && pGridMap )
3236*b1cdbd2cSJim Jagielski 	{
3237*b1cdbd2cSJim Jagielski 		DELETEZ(pGridMap);
3238*b1cdbd2cSJim Jagielski 		nGridRows = 0;
3239*b1cdbd2cSJim Jagielski 		nGridCols = 0;
3240*b1cdbd2cSJim Jagielski 	}
3241*b1cdbd2cSJim Jagielski }
3242*b1cdbd2cSJim Jagielski 
SearchCol(sal_uInt16 nCol,sal_uInt16 nTop,sal_uInt16 nBottom,sal_uInt16,sal_Bool bDown,sal_Bool bSimple)3243*b1cdbd2cSJim Jagielski SvLBoxEntry* ImpIcnCursor::SearchCol(sal_uInt16 nCol,sal_uInt16 nTop,sal_uInt16 nBottom,
3244*b1cdbd2cSJim Jagielski 	sal_uInt16, sal_Bool bDown, sal_Bool bSimple  )
3245*b1cdbd2cSJim Jagielski {
3246*b1cdbd2cSJim Jagielski 	DBG_ASSERT(pCurEntry,"SearchCol: No reference entry");
3247*b1cdbd2cSJim Jagielski 	SvPtrarr* pList = &(pColumns[ nCol ]);
3248*b1cdbd2cSJim Jagielski 	sal_uInt16 nCount = pList->Count();
3249*b1cdbd2cSJim Jagielski 	if( !nCount )
3250*b1cdbd2cSJim Jagielski 		return 0;
3251*b1cdbd2cSJim Jagielski 
3252*b1cdbd2cSJim Jagielski 	const Rectangle& rRefRect = pView->GetBoundingRect(pCurEntry);
3253*b1cdbd2cSJim Jagielski 
3254*b1cdbd2cSJim Jagielski 	if( bSimple )
3255*b1cdbd2cSJim Jagielski 	{
3256*b1cdbd2cSJim Jagielski 		sal_uInt16 nListPos = pList->GetPos( pCurEntry );
3257*b1cdbd2cSJim Jagielski 		DBG_ASSERT(nListPos!=0xffff,"Entry not in Col-List");
3258*b1cdbd2cSJim Jagielski 		if( bDown )
3259*b1cdbd2cSJim Jagielski 		{
3260*b1cdbd2cSJim Jagielski 			while( nListPos < nCount-1 )
3261*b1cdbd2cSJim Jagielski 			{
3262*b1cdbd2cSJim Jagielski 				nListPos++;
3263*b1cdbd2cSJim Jagielski 				SvLBoxEntry* pEntry = (SvLBoxEntry*)pList->GetObject( nListPos );
3264*b1cdbd2cSJim Jagielski 				const Rectangle& rRect = pView->GetBoundingRect( pEntry );
3265*b1cdbd2cSJim Jagielski 				if( rRect.Top() > rRefRect.Top() )
3266*b1cdbd2cSJim Jagielski 					return pEntry;
3267*b1cdbd2cSJim Jagielski 			}
3268*b1cdbd2cSJim Jagielski 			return 0;
3269*b1cdbd2cSJim Jagielski 		}
3270*b1cdbd2cSJim Jagielski 		else
3271*b1cdbd2cSJim Jagielski 		{
3272*b1cdbd2cSJim Jagielski 			while( nListPos )
3273*b1cdbd2cSJim Jagielski 			{
3274*b1cdbd2cSJim Jagielski 				nListPos--;
3275*b1cdbd2cSJim Jagielski 				if( nListPos < nCount )
3276*b1cdbd2cSJim Jagielski 				{
3277*b1cdbd2cSJim Jagielski 					SvLBoxEntry* pEntry = (SvLBoxEntry*)pList->GetObject( nListPos );
3278*b1cdbd2cSJim Jagielski 					const Rectangle& rRect = pView->GetBoundingRect( pEntry );
3279*b1cdbd2cSJim Jagielski 					if( rRect.Top() < rRefRect.Top() )
3280*b1cdbd2cSJim Jagielski 						return pEntry;
3281*b1cdbd2cSJim Jagielski 				}
3282*b1cdbd2cSJim Jagielski 			}
3283*b1cdbd2cSJim Jagielski 			return 0;
3284*b1cdbd2cSJim Jagielski 		}
3285*b1cdbd2cSJim Jagielski 	}
3286*b1cdbd2cSJim Jagielski 
3287*b1cdbd2cSJim Jagielski 	if( nTop > nBottom )
3288*b1cdbd2cSJim Jagielski 	{
3289*b1cdbd2cSJim Jagielski 		sal_uInt16 nTemp = nTop;
3290*b1cdbd2cSJim Jagielski 		nTop = nBottom;
3291*b1cdbd2cSJim Jagielski 		nBottom = nTemp;
3292*b1cdbd2cSJim Jagielski 	}
3293*b1cdbd2cSJim Jagielski 	long nMinDistance = LONG_MAX;
3294*b1cdbd2cSJim Jagielski 	SvLBoxEntry* pResult = 0;
3295*b1cdbd2cSJim Jagielski 	for( sal_uInt16 nCur = 0; nCur < nCount; nCur++ )
3296*b1cdbd2cSJim Jagielski 	{
3297*b1cdbd2cSJim Jagielski 		SvLBoxEntry* pEntry = (SvLBoxEntry*)(pList->GetObject( nCur ));
3298*b1cdbd2cSJim Jagielski 		if( pEntry != pCurEntry )
3299*b1cdbd2cSJim Jagielski 		{
3300*b1cdbd2cSJim Jagielski 			SvIcnVwDataEntry* pViewData = ICNVIEWDATA2(pEntry);
3301*b1cdbd2cSJim Jagielski 			sal_uInt16 nY = pViewData->nY;
3302*b1cdbd2cSJim Jagielski 			if( nY >= nTop && nY <= nBottom )
3303*b1cdbd2cSJim Jagielski 			{
3304*b1cdbd2cSJim Jagielski 				const Rectangle& rRect = pView->GetBoundingRect( pEntry );
3305*b1cdbd2cSJim Jagielski 				long nDistance = rRect.Top() - rRefRect.Top();
3306*b1cdbd2cSJim Jagielski 				if( nDistance < 0 )
3307*b1cdbd2cSJim Jagielski 					nDistance *= -1;
3308*b1cdbd2cSJim Jagielski 				if( nDistance && nDistance < nMinDistance )
3309*b1cdbd2cSJim Jagielski 				{
3310*b1cdbd2cSJim Jagielski 					nMinDistance = nDistance;
3311*b1cdbd2cSJim Jagielski 					pResult = pEntry;
3312*b1cdbd2cSJim Jagielski 				}
3313*b1cdbd2cSJim Jagielski 			}
3314*b1cdbd2cSJim Jagielski 		}
3315*b1cdbd2cSJim Jagielski 	}
3316*b1cdbd2cSJim Jagielski 	return pResult;
3317*b1cdbd2cSJim Jagielski }
3318*b1cdbd2cSJim Jagielski 
SearchRow(sal_uInt16 nRow,sal_uInt16 nLeft,sal_uInt16 nRight,sal_uInt16,sal_Bool bRight,sal_Bool bSimple)3319*b1cdbd2cSJim Jagielski SvLBoxEntry* ImpIcnCursor::SearchRow(sal_uInt16 nRow,sal_uInt16 nLeft,sal_uInt16 nRight,
3320*b1cdbd2cSJim Jagielski 	sal_uInt16, sal_Bool bRight, sal_Bool bSimple )
3321*b1cdbd2cSJim Jagielski {
3322*b1cdbd2cSJim Jagielski 	DBG_ASSERT(pCurEntry,"SearchRow: No reference entry");
3323*b1cdbd2cSJim Jagielski 	SvPtrarr* pList = &(pRows[ nRow ]);
3324*b1cdbd2cSJim Jagielski 	sal_uInt16 nCount = pList->Count();
3325*b1cdbd2cSJim Jagielski 	if( !nCount )
3326*b1cdbd2cSJim Jagielski 		return 0;
3327*b1cdbd2cSJim Jagielski 
3328*b1cdbd2cSJim Jagielski 	const Rectangle& rRefRect = pView->GetBoundingRect(pCurEntry);
3329*b1cdbd2cSJim Jagielski 
3330*b1cdbd2cSJim Jagielski 	if( bSimple )
3331*b1cdbd2cSJim Jagielski 	{
3332*b1cdbd2cSJim Jagielski 		sal_uInt16 nListPos = pList->GetPos( pCurEntry );
3333*b1cdbd2cSJim Jagielski 		DBG_ASSERT(nListPos!=0xffff,"Entry not in Row-List");
3334*b1cdbd2cSJim Jagielski 		if( bRight )
3335*b1cdbd2cSJim Jagielski 		{
3336*b1cdbd2cSJim Jagielski 			while( nListPos < nCount-1 )
3337*b1cdbd2cSJim Jagielski 			{
3338*b1cdbd2cSJim Jagielski 				nListPos++;
3339*b1cdbd2cSJim Jagielski 				SvLBoxEntry* pEntry = (SvLBoxEntry*)pList->GetObject( nListPos );
3340*b1cdbd2cSJim Jagielski 				const Rectangle& rRect = pView->GetBoundingRect( pEntry );
3341*b1cdbd2cSJim Jagielski 				if( rRect.Left() > rRefRect.Left() )
3342*b1cdbd2cSJim Jagielski 					return pEntry;
3343*b1cdbd2cSJim Jagielski 			}
3344*b1cdbd2cSJim Jagielski 			return 0;
3345*b1cdbd2cSJim Jagielski 		}
3346*b1cdbd2cSJim Jagielski 		else
3347*b1cdbd2cSJim Jagielski 		{
3348*b1cdbd2cSJim Jagielski 			while( nListPos )
3349*b1cdbd2cSJim Jagielski 			{
3350*b1cdbd2cSJim Jagielski 				nListPos--;
3351*b1cdbd2cSJim Jagielski 				if( nListPos < nCount )
3352*b1cdbd2cSJim Jagielski 				{
3353*b1cdbd2cSJim Jagielski 					SvLBoxEntry* pEntry = (SvLBoxEntry*)pList->GetObject( nListPos );
3354*b1cdbd2cSJim Jagielski 					const Rectangle& rRect = pView->GetBoundingRect( pEntry );
3355*b1cdbd2cSJim Jagielski 					if( rRect.Left() < rRefRect.Left() )
3356*b1cdbd2cSJim Jagielski 						return pEntry;
3357*b1cdbd2cSJim Jagielski 				}
3358*b1cdbd2cSJim Jagielski 			}
3359*b1cdbd2cSJim Jagielski 			return 0;
3360*b1cdbd2cSJim Jagielski 		}
3361*b1cdbd2cSJim Jagielski 
3362*b1cdbd2cSJim Jagielski 	}
3363*b1cdbd2cSJim Jagielski 	if( nRight < nLeft )
3364*b1cdbd2cSJim Jagielski 	{
3365*b1cdbd2cSJim Jagielski 		sal_uInt16 nTemp = nRight;
3366*b1cdbd2cSJim Jagielski 		nRight = nLeft;
3367*b1cdbd2cSJim Jagielski 		nLeft = nTemp;
3368*b1cdbd2cSJim Jagielski 	}
3369*b1cdbd2cSJim Jagielski 	long nMinDistance = LONG_MAX;
3370*b1cdbd2cSJim Jagielski 	SvLBoxEntry* pResult = 0;
3371*b1cdbd2cSJim Jagielski 	for( sal_uInt16 nCur = 0; nCur < nCount; nCur++ )
3372*b1cdbd2cSJim Jagielski 	{
3373*b1cdbd2cSJim Jagielski 		SvLBoxEntry* pEntry = (SvLBoxEntry*)(pList->GetObject( nCur ));
3374*b1cdbd2cSJim Jagielski 		if( pEntry != pCurEntry )
3375*b1cdbd2cSJim Jagielski 		{
3376*b1cdbd2cSJim Jagielski 			SvIcnVwDataEntry* pViewData = ICNVIEWDATA2(pEntry);
3377*b1cdbd2cSJim Jagielski 			sal_uInt16 nX = pViewData->nX;
3378*b1cdbd2cSJim Jagielski 			if( nX >= nLeft && nX <= nRight )
3379*b1cdbd2cSJim Jagielski 			{
3380*b1cdbd2cSJim Jagielski 				const Rectangle& rRect = pView->GetBoundingRect( pEntry );
3381*b1cdbd2cSJim Jagielski 				long nDistance = rRect.Left() - rRefRect.Left();
3382*b1cdbd2cSJim Jagielski 				if( nDistance < 0 )
3383*b1cdbd2cSJim Jagielski 					nDistance *= -1;
3384*b1cdbd2cSJim Jagielski 				if( nDistance && nDistance < nMinDistance )
3385*b1cdbd2cSJim Jagielski 				{
3386*b1cdbd2cSJim Jagielski 					nMinDistance = nDistance;
3387*b1cdbd2cSJim Jagielski 					pResult = pEntry;
3388*b1cdbd2cSJim Jagielski 				}
3389*b1cdbd2cSJim Jagielski 			}
3390*b1cdbd2cSJim Jagielski 		}
3391*b1cdbd2cSJim Jagielski 	}
3392*b1cdbd2cSJim Jagielski 	return pResult;
3393*b1cdbd2cSJim Jagielski }
3394*b1cdbd2cSJim Jagielski 
3395*b1cdbd2cSJim Jagielski 
3396*b1cdbd2cSJim Jagielski 
3397*b1cdbd2cSJim Jagielski /*
3398*b1cdbd2cSJim Jagielski 	Sucht ab dem uebergebenen Eintrag den naechsten rechts- bzw.
3399*b1cdbd2cSJim Jagielski 	linksstehenden. Suchverfahren am Beispiel bRight = sal_True:
3400*b1cdbd2cSJim Jagielski 
3401*b1cdbd2cSJim Jagielski 				  c
3402*b1cdbd2cSJim Jagielski 				b c
3403*b1cdbd2cSJim Jagielski 			  a b c
3404*b1cdbd2cSJim Jagielski 			S 1 1 1      ====> Suchrichtung
3405*b1cdbd2cSJim Jagielski 			  a b c
3406*b1cdbd2cSJim Jagielski 				b c
3407*b1cdbd2cSJim Jagielski 				  c
3408*b1cdbd2cSJim Jagielski 
3409*b1cdbd2cSJim Jagielski 	S : Startposition
3410*b1cdbd2cSJim Jagielski 	1 : erstes Suchrechteck
3411*b1cdbd2cSJim Jagielski 	a,b,c : 2., 3., 4. Suchrechteck
3412*b1cdbd2cSJim Jagielski */
3413*b1cdbd2cSJim Jagielski 
GoLeftRight(SvLBoxEntry * pIcnEntry,sal_Bool bRight)3414*b1cdbd2cSJim Jagielski SvLBoxEntry* ImpIcnCursor::GoLeftRight( SvLBoxEntry* pIcnEntry, sal_Bool bRight )
3415*b1cdbd2cSJim Jagielski {
3416*b1cdbd2cSJim Jagielski 	SvLBoxEntry* pResult;
3417*b1cdbd2cSJim Jagielski 	pCurEntry = pIcnEntry;
3418*b1cdbd2cSJim Jagielski 	Create();
3419*b1cdbd2cSJim Jagielski 	SvIcnVwDataEntry* pViewData = ICNVIEWDATA2(pIcnEntry);
3420*b1cdbd2cSJim Jagielski 	sal_uInt16 nY = pViewData->nY;
3421*b1cdbd2cSJim Jagielski 	sal_uInt16 nX = pViewData->nX;
3422*b1cdbd2cSJim Jagielski 	DBG_ASSERT(nY< nRows,"GoLeftRight:Bad column");
3423*b1cdbd2cSJim Jagielski 	DBG_ASSERT(nX< nCols,"GoLeftRight:Bad row");
3424*b1cdbd2cSJim Jagielski 	// Nachbar auf gleicher Zeile ?
3425*b1cdbd2cSJim Jagielski 	if( bRight )
3426*b1cdbd2cSJim Jagielski 		pResult = SearchRow(
3427*b1cdbd2cSJim Jagielski             nY, nX, sal::static_int_cast< sal_uInt16 >(nCols-1), nX, sal_True, sal_True );
3428*b1cdbd2cSJim Jagielski 	else
3429*b1cdbd2cSJim Jagielski 		pResult = SearchRow( nY, nX ,0, nX, sal_False, sal_True );
3430*b1cdbd2cSJim Jagielski 	if( pResult )
3431*b1cdbd2cSJim Jagielski 		return pResult;
3432*b1cdbd2cSJim Jagielski 
3433*b1cdbd2cSJim Jagielski 	long nCurCol = nX;
3434*b1cdbd2cSJim Jagielski 
3435*b1cdbd2cSJim Jagielski 	long nColOffs, nLastCol;
3436*b1cdbd2cSJim Jagielski 	if( bRight )
3437*b1cdbd2cSJim Jagielski 	{
3438*b1cdbd2cSJim Jagielski 		nColOffs = 1;
3439*b1cdbd2cSJim Jagielski 		nLastCol = nCols;
3440*b1cdbd2cSJim Jagielski 	}
3441*b1cdbd2cSJim Jagielski 	else
3442*b1cdbd2cSJim Jagielski 	{
3443*b1cdbd2cSJim Jagielski 		nColOffs = -1;
3444*b1cdbd2cSJim Jagielski 		nLastCol = -1;   // 0-1
3445*b1cdbd2cSJim Jagielski 	}
3446*b1cdbd2cSJim Jagielski 
3447*b1cdbd2cSJim Jagielski 	sal_uInt16 nRowMin = nY;
3448*b1cdbd2cSJim Jagielski 	sal_uInt16 nRowMax = nY;
3449*b1cdbd2cSJim Jagielski 	do
3450*b1cdbd2cSJim Jagielski 	{
3451*b1cdbd2cSJim Jagielski 		SvLBoxEntry* pEntry = SearchCol((sal_uInt16)nCurCol,nRowMin,nRowMax,nY,sal_True, sal_False);
3452*b1cdbd2cSJim Jagielski 		if( pEntry )
3453*b1cdbd2cSJim Jagielski 			return pEntry;
3454*b1cdbd2cSJim Jagielski 		if( nRowMin )
3455*b1cdbd2cSJim Jagielski 			nRowMin--;
3456*b1cdbd2cSJim Jagielski 		if( nRowMax < (nRows-1))
3457*b1cdbd2cSJim Jagielski 			nRowMax++;
3458*b1cdbd2cSJim Jagielski 		nCurCol += nColOffs;
3459*b1cdbd2cSJim Jagielski 	} while( nCurCol != nLastCol );
3460*b1cdbd2cSJim Jagielski 	return 0;
3461*b1cdbd2cSJim Jagielski }
3462*b1cdbd2cSJim Jagielski 
GoUpDown(SvLBoxEntry * pIcnEntry,sal_Bool bDown)3463*b1cdbd2cSJim Jagielski SvLBoxEntry* ImpIcnCursor::GoUpDown( SvLBoxEntry* pIcnEntry, sal_Bool bDown)
3464*b1cdbd2cSJim Jagielski {
3465*b1cdbd2cSJim Jagielski 	SvLBoxEntry* pResult;
3466*b1cdbd2cSJim Jagielski 	pCurEntry = pIcnEntry;
3467*b1cdbd2cSJim Jagielski 	Create();
3468*b1cdbd2cSJim Jagielski 	SvIcnVwDataEntry* pViewData = ICNVIEWDATA2(pIcnEntry);
3469*b1cdbd2cSJim Jagielski 	sal_uInt16 nY = pViewData->nY;
3470*b1cdbd2cSJim Jagielski 	sal_uInt16 nX = pViewData->nX;
3471*b1cdbd2cSJim Jagielski 	DBG_ASSERT(nY<nRows,"GoUpDown:Bad column");
3472*b1cdbd2cSJim Jagielski 	DBG_ASSERT(nX<nCols,"GoUpDown:Bad row");
3473*b1cdbd2cSJim Jagielski 
3474*b1cdbd2cSJim Jagielski 	// Nachbar in gleicher Spalte ?
3475*b1cdbd2cSJim Jagielski 	if( bDown )
3476*b1cdbd2cSJim Jagielski 		pResult = SearchCol(
3477*b1cdbd2cSJim Jagielski             nX, nY, sal::static_int_cast< sal_uInt16 >(nRows-1), nY, sal_True, sal_True );
3478*b1cdbd2cSJim Jagielski 	else
3479*b1cdbd2cSJim Jagielski 		pResult = SearchCol( nX, nY ,0, nY, sal_False, sal_True );
3480*b1cdbd2cSJim Jagielski 	if( pResult )
3481*b1cdbd2cSJim Jagielski 		return pResult;
3482*b1cdbd2cSJim Jagielski 
3483*b1cdbd2cSJim Jagielski 	long nCurRow = nY;
3484*b1cdbd2cSJim Jagielski 
3485*b1cdbd2cSJim Jagielski 	long nRowOffs, nLastRow;
3486*b1cdbd2cSJim Jagielski 	if( bDown )
3487*b1cdbd2cSJim Jagielski 	{
3488*b1cdbd2cSJim Jagielski 		nRowOffs = 1;
3489*b1cdbd2cSJim Jagielski 		nLastRow = nRows;
3490*b1cdbd2cSJim Jagielski 	}
3491*b1cdbd2cSJim Jagielski 	else
3492*b1cdbd2cSJim Jagielski 	{
3493*b1cdbd2cSJim Jagielski 		nRowOffs = -1;
3494*b1cdbd2cSJim Jagielski 		nLastRow = -1;   // 0-1
3495*b1cdbd2cSJim Jagielski 	}
3496*b1cdbd2cSJim Jagielski 
3497*b1cdbd2cSJim Jagielski 	sal_uInt16 nColMin = nX;
3498*b1cdbd2cSJim Jagielski 	sal_uInt16 nColMax = nX;
3499*b1cdbd2cSJim Jagielski 	do
3500*b1cdbd2cSJim Jagielski 	{
3501*b1cdbd2cSJim Jagielski 		SvLBoxEntry* pEntry = SearchRow((sal_uInt16)nCurRow,nColMin,nColMax,nX,sal_True, sal_False);
3502*b1cdbd2cSJim Jagielski 		if( pEntry )
3503*b1cdbd2cSJim Jagielski 			return pEntry;
3504*b1cdbd2cSJim Jagielski 		if( nColMin )
3505*b1cdbd2cSJim Jagielski 			nColMin--;
3506*b1cdbd2cSJim Jagielski 		if( nColMax < (nCols-1))
3507*b1cdbd2cSJim Jagielski 			nColMax++;
3508*b1cdbd2cSJim Jagielski 		nCurRow += nRowOffs;
3509*b1cdbd2cSJim Jagielski 	} while( nCurRow != nLastRow );
3510*b1cdbd2cSJim Jagielski 	return 0;
3511*b1cdbd2cSJim Jagielski }
3512*b1cdbd2cSJim Jagielski 
SetDeltas()3513*b1cdbd2cSJim Jagielski void ImpIcnCursor::SetDeltas()
3514*b1cdbd2cSJim Jagielski {
3515*b1cdbd2cSJim Jagielski 	const Size& rSize = pView->aVirtOutputSize;
3516*b1cdbd2cSJim Jagielski 	if( pView->nFlags & F_GRIDMODE )
3517*b1cdbd2cSJim Jagielski 	{
3518*b1cdbd2cSJim Jagielski 		nGridDX = pView->nGridDX;
3519*b1cdbd2cSJim Jagielski 		nGridDY = pView->nGridDY;
3520*b1cdbd2cSJim Jagielski 	}
3521*b1cdbd2cSJim Jagielski 	else
3522*b1cdbd2cSJim Jagielski 	{
3523*b1cdbd2cSJim Jagielski 		nGridDX = 20;
3524*b1cdbd2cSJim Jagielski 		nGridDY = 20;
3525*b1cdbd2cSJim Jagielski 	}
3526*b1cdbd2cSJim Jagielski 	nCols = rSize.Width() / nGridDX;
3527*b1cdbd2cSJim Jagielski 	if( !nCols )
3528*b1cdbd2cSJim Jagielski 		nCols = 1;
3529*b1cdbd2cSJim Jagielski 	nRows = rSize.Height() / nGridDY;
3530*b1cdbd2cSJim Jagielski 	if( (nRows * nGridDY) < rSize.Height() )
3531*b1cdbd2cSJim Jagielski 		nRows++;
3532*b1cdbd2cSJim Jagielski 	if( !nRows )
3533*b1cdbd2cSJim Jagielski 		nRows = 1;
3534*b1cdbd2cSJim Jagielski 
3535*b1cdbd2cSJim Jagielski 	nDeltaWidth = (short)(rSize.Width() / nCols);
3536*b1cdbd2cSJim Jagielski 	nDeltaHeight = (short)(rSize.Height() / nRows);
3537*b1cdbd2cSJim Jagielski 	if( !nDeltaHeight )
3538*b1cdbd2cSJim Jagielski 	{
3539*b1cdbd2cSJim Jagielski 		nDeltaHeight = 1;
3540*b1cdbd2cSJim Jagielski 		DBG_WARNING("SetDeltas:Bad height");
3541*b1cdbd2cSJim Jagielski 	}
3542*b1cdbd2cSJim Jagielski 	if( !nDeltaWidth )
3543*b1cdbd2cSJim Jagielski 	{
3544*b1cdbd2cSJim Jagielski 		nDeltaWidth = 1;
3545*b1cdbd2cSJim Jagielski 		DBG_WARNING("SetDeltas:Bad width");
3546*b1cdbd2cSJim Jagielski 	}
3547*b1cdbd2cSJim Jagielski }
3548*b1cdbd2cSJim Jagielski 
3549*b1cdbd2cSJim Jagielski 
ExpandGrid()3550*b1cdbd2cSJim Jagielski void ImpIcnCursor::ExpandGrid()
3551*b1cdbd2cSJim Jagielski {
3552*b1cdbd2cSJim Jagielski 	if( pGridMap )
3553*b1cdbd2cSJim Jagielski 	{
3554*b1cdbd2cSJim Jagielski 		long nNewGridRows = nGridRows + 20;
3555*b1cdbd2cSJim Jagielski 		unsigned char* pTempMap = new unsigned char[ nNewGridRows * nGridCols ];
3556*b1cdbd2cSJim Jagielski 		memcpy( pTempMap, pGridMap, nGridRows * nGridCols );
3557*b1cdbd2cSJim Jagielski 		delete pGridMap;
3558*b1cdbd2cSJim Jagielski 		pGridMap = pTempMap;
3559*b1cdbd2cSJim Jagielski 		nGridRows = nNewGridRows;
3560*b1cdbd2cSJim Jagielski 	}
3561*b1cdbd2cSJim Jagielski }
3562*b1cdbd2cSJim Jagielski 
FindEmptyGridRect(Rectangle & rRect)3563*b1cdbd2cSJim Jagielski sal_Bool ImpIcnCursor::FindEmptyGridRect( Rectangle& rRect )
3564*b1cdbd2cSJim Jagielski {
3565*b1cdbd2cSJim Jagielski 	CreateGridMap();
3566*b1cdbd2cSJim Jagielski 	sal_uInt16 nCount = (sal_uInt16)(nGridCols * nGridRows);
3567*b1cdbd2cSJim Jagielski 	if( !nCount )
3568*b1cdbd2cSJim Jagielski 		return sal_False;
3569*b1cdbd2cSJim Jagielski 	for( sal_uInt16 nCur = 0; nCur < nCount; nCur++ )
3570*b1cdbd2cSJim Jagielski 	{
3571*b1cdbd2cSJim Jagielski 		if( !pGridMap[ nCur ] )
3572*b1cdbd2cSJim Jagielski 		{
3573*b1cdbd2cSJim Jagielski 			sal_uInt16 nCol = (sal_uInt16)(nCur % nGridCols);
3574*b1cdbd2cSJim Jagielski 			sal_uInt16 nRow = (sal_uInt16)(nCur / nGridCols);
3575*b1cdbd2cSJim Jagielski 			rRect.Top() = nRow * nGridDY + TBOFFS_WINBORDER;
3576*b1cdbd2cSJim Jagielski 			rRect.Bottom() = rRect.Top() + nGridDY;
3577*b1cdbd2cSJim Jagielski 			rRect.Left() = nCol * nGridDX+ LROFFS_WINBORDER;
3578*b1cdbd2cSJim Jagielski 			rRect.Right() = rRect.Left() + nGridDX;
3579*b1cdbd2cSJim Jagielski 			SetGridUsed( nCol, nRow, sal_True );
3580*b1cdbd2cSJim Jagielski 
3581*b1cdbd2cSJim Jagielski 			//XXX
3582*b1cdbd2cSJim Jagielski 			//if( nRow + 5 > nGridRows )
3583*b1cdbd2cSJim Jagielski 			//	ExpandGrid();
3584*b1cdbd2cSJim Jagielski 			DBG_ASSERT(pGridMap[nCur],"SetGridUsed failed");
3585*b1cdbd2cSJim Jagielski 			return sal_True;
3586*b1cdbd2cSJim Jagielski 		}
3587*b1cdbd2cSJim Jagielski 	}
3588*b1cdbd2cSJim Jagielski 	// Gridmap ist voll: Um eine Zeile erweitern
3589*b1cdbd2cSJim Jagielski 	rRect.Top() = nGridRows * nGridDY + TBOFFS_WINBORDER;
3590*b1cdbd2cSJim Jagielski 	rRect.Bottom() = rRect.Top() + nGridDY;
3591*b1cdbd2cSJim Jagielski 	rRect.Left() = LROFFS_WINBORDER;
3592*b1cdbd2cSJim Jagielski 	rRect.Right() = rRect.Left() + nGridDX;
3593*b1cdbd2cSJim Jagielski 	return sal_False;
3594*b1cdbd2cSJim Jagielski 	//XXX
3595*b1cdbd2cSJim Jagielski 	//ExpandGrid();
3596*b1cdbd2cSJim Jagielski 	//return sal_True;
3597*b1cdbd2cSJim Jagielski }
3598*b1cdbd2cSJim Jagielski 
CreateGridAjustData(SvPtrarr & rLists,SvLBoxEntry * pRefEntry)3599*b1cdbd2cSJim Jagielski void ImpIcnCursor::CreateGridAjustData( SvPtrarr& rLists, SvLBoxEntry* pRefEntry)
3600*b1cdbd2cSJim Jagielski {
3601*b1cdbd2cSJim Jagielski 	if( !pRefEntry )
3602*b1cdbd2cSJim Jagielski 	{
3603*b1cdbd2cSJim Jagielski 		sal_uInt16 nAdjustRows = (sal_uInt16)(pView->aVirtOutputSize.Height() / pView->nGridDY);
3604*b1cdbd2cSJim Jagielski 		nAdjustRows++; // wg. Abrundung!
3605*b1cdbd2cSJim Jagielski 
3606*b1cdbd2cSJim Jagielski 		if( !nAdjustRows )
3607*b1cdbd2cSJim Jagielski 			return;
3608*b1cdbd2cSJim Jagielski 		for( sal_uInt16 nCurList = 0; nCurList < nAdjustRows; nCurList++ )
3609*b1cdbd2cSJim Jagielski 		{
3610*b1cdbd2cSJim Jagielski 			SvPtrarr* pRow = new SvPtrarr;
3611*b1cdbd2cSJim Jagielski 			rLists.Insert( (void*)pRow, nCurList );
3612*b1cdbd2cSJim Jagielski 		}
3613*b1cdbd2cSJim Jagielski 		SvLBoxEntry* pEntry = pView->pModel->FirstChild( pView->pCurParent );
3614*b1cdbd2cSJim Jagielski 		while( pEntry )
3615*b1cdbd2cSJim Jagielski 		{
3616*b1cdbd2cSJim Jagielski 			const Rectangle& rRect = pView->GetBoundingRect( pEntry );
3617*b1cdbd2cSJim Jagielski 			short nY = (short)( ((rRect.Top()+rRect.Bottom())/2) / pView->nGridDY );
3618*b1cdbd2cSJim Jagielski 			sal_uInt16 nIns = GetSortListPos((SvPtrarr*)rLists[nY],rRect.Left(),sal_False);
3619*b1cdbd2cSJim Jagielski 			((SvPtrarr*)rLists[ nY ])->Insert( pEntry, nIns );
3620*b1cdbd2cSJim Jagielski 			pEntry = pView->pModel->NextSibling( pEntry );
3621*b1cdbd2cSJim Jagielski 		}
3622*b1cdbd2cSJim Jagielski 	}
3623*b1cdbd2cSJim Jagielski 	else
3624*b1cdbd2cSJim Jagielski 	{
3625*b1cdbd2cSJim Jagielski 		// Aufbau eines hor. "Schlauchs" auf der RefEntry-Zeile
3626*b1cdbd2cSJim Jagielski 
3627*b1cdbd2cSJim Jagielski 		// UEBERLEGEN: BoundingRect nehmen wg. Ueberlappungen???
3628*b1cdbd2cSJim Jagielski 
3629*b1cdbd2cSJim Jagielski 		Rectangle rRefRect( pView->CalcBmpRect( pRefEntry ) );
3630*b1cdbd2cSJim Jagielski 		//const Rectangle& rRefRect = pView->GetBoundingRect( pRefEntry );
3631*b1cdbd2cSJim Jagielski 		short nRefRow = (short)( ((rRefRect.Top()+rRefRect.Bottom())/2) / pView->nGridDY );
3632*b1cdbd2cSJim Jagielski 		SvPtrarr* pRow = new SvPtrarr;
3633*b1cdbd2cSJim Jagielski 		rLists.Insert( (void*)pRow, 0 );
3634*b1cdbd2cSJim Jagielski 		SvLBoxEntry* pEntry = pView->pModel->FirstChild( pView->pCurParent );
3635*b1cdbd2cSJim Jagielski 		while( pEntry )
3636*b1cdbd2cSJim Jagielski 		{
3637*b1cdbd2cSJim Jagielski 			Rectangle rRect( pView->CalcBmpRect(pEntry) );
3638*b1cdbd2cSJim Jagielski 			//const Rectangle& rRect = pView->GetBoundingRect( pEntry );
3639*b1cdbd2cSJim Jagielski 			short nY = (short)( ((rRect.Top()+rRect.Bottom())/2) / pView->nGridDY );
3640*b1cdbd2cSJim Jagielski 			if( nY == nRefRow )
3641*b1cdbd2cSJim Jagielski 			{
3642*b1cdbd2cSJim Jagielski 				sal_uInt16 nIns = GetSortListPos( pRow, rRect.Left(), sal_False );
3643*b1cdbd2cSJim Jagielski 				pRow->Insert( pEntry, nIns );
3644*b1cdbd2cSJim Jagielski 			}
3645*b1cdbd2cSJim Jagielski 			pEntry = pView->pModel->NextSibling( pEntry );
3646*b1cdbd2cSJim Jagielski 		}
3647*b1cdbd2cSJim Jagielski 	}
3648*b1cdbd2cSJim Jagielski }
3649*b1cdbd2cSJim Jagielski 
3650*b1cdbd2cSJim Jagielski //static
DestroyGridAdjustData(SvPtrarr & rLists)3651*b1cdbd2cSJim Jagielski void ImpIcnCursor::DestroyGridAdjustData( SvPtrarr& rLists )
3652*b1cdbd2cSJim Jagielski {
3653*b1cdbd2cSJim Jagielski 	sal_uInt16 nCount = rLists.Count();
3654*b1cdbd2cSJim Jagielski 	for( sal_uInt16 nCur = 0; nCur < nCount; nCur++ )
3655*b1cdbd2cSJim Jagielski 	{
3656*b1cdbd2cSJim Jagielski 		SvPtrarr* pArr = (SvPtrarr*)rLists[ nCur ];
3657*b1cdbd2cSJim Jagielski 		delete pArr;
3658*b1cdbd2cSJim Jagielski 	}
3659*b1cdbd2cSJim Jagielski 	rLists.Remove( 0, rLists.Count() );
3660*b1cdbd2cSJim Jagielski }
3661*b1cdbd2cSJim Jagielski 
SetGrid(long nDX,long nDY)3662*b1cdbd2cSJim Jagielski void SvImpIconView::SetGrid( long nDX, long nDY )
3663*b1cdbd2cSJim Jagielski {
3664*b1cdbd2cSJim Jagielski 	nGridDX = nDX;
3665*b1cdbd2cSJim Jagielski 	nGridDY = nDY;
3666*b1cdbd2cSJim Jagielski 	nFlags |= F_GRIDMODE;
3667*b1cdbd2cSJim Jagielski }
3668*b1cdbd2cSJim Jagielski 
CalcMaxTextRect(const SvLBoxEntry * pEntry,const SvIcnVwDataEntry * pViewData) const3669*b1cdbd2cSJim Jagielski Rectangle SvImpIconView::CalcMaxTextRect( const SvLBoxEntry* pEntry,
3670*b1cdbd2cSJim Jagielski 	const SvIcnVwDataEntry* pViewData ) const
3671*b1cdbd2cSJim Jagielski {
3672*b1cdbd2cSJim Jagielski 	Rectangle aRect = pViewData->aGridRect;
3673*b1cdbd2cSJim Jagielski 	long nBmpHeight = ((SvLBoxEntry*)pEntry)->GetFirstItem(SV_ITEM_ID_LBOXCONTEXTBMP)->GetSize(pView,(SvLBoxEntry*)pEntry).Height();
3674*b1cdbd2cSJim Jagielski 	aRect.Top() += nBmpHeight;
3675*b1cdbd2cSJim Jagielski 	aRect.Top() += ICONVIEW_OFFS_BMP_STRING;
3676*b1cdbd2cSJim Jagielski 	if( aRect.Top() > aRect.Bottom())
3677*b1cdbd2cSJim Jagielski 		aRect.Top() = aRect.Bottom();
3678*b1cdbd2cSJim Jagielski 	aRect.Left() += LROFFS_BOUND;
3679*b1cdbd2cSJim Jagielski 	aRect.Left()++;
3680*b1cdbd2cSJim Jagielski 	aRect.Right() -= LROFFS_BOUND;
3681*b1cdbd2cSJim Jagielski 	aRect.Right()--;
3682*b1cdbd2cSJim Jagielski 	if( aRect.Left() > aRect.Right())
3683*b1cdbd2cSJim Jagielski 		aRect.Left() = aRect.Right();
3684*b1cdbd2cSJim Jagielski 	if( GetTextMode( pEntry, pViewData ) == ShowTextFull )
3685*b1cdbd2cSJim Jagielski 		aRect.Bottom() = LONG_MAX;
3686*b1cdbd2cSJim Jagielski 	return aRect;
3687*b1cdbd2cSJim Jagielski }
3688*b1cdbd2cSJim Jagielski 
Center(SvLBoxEntry * pEntry,SvIcnVwDataEntry * pViewData) const3689*b1cdbd2cSJim Jagielski void SvImpIconView::Center( SvLBoxEntry* pEntry,
3690*b1cdbd2cSJim Jagielski 	SvIcnVwDataEntry* pViewData ) const
3691*b1cdbd2cSJim Jagielski {
3692*b1cdbd2cSJim Jagielski 	SvLBoxString* pStringItem = (SvLBoxString*)(pEntry->GetFirstItem(SV_ITEM_ID_LBOXSTRING));
3693*b1cdbd2cSJim Jagielski 	const String& rEntryText = pStringItem->GetText();
3694*b1cdbd2cSJim Jagielski 
3695*b1cdbd2cSJim Jagielski 	Rectangle aTextRect = CalcMaxTextRect(pEntry,pViewData);
3696*b1cdbd2cSJim Jagielski 	aTextRect = GetTextRect( pView, aTextRect, rEntryText, DRAWTEXT_FLAGS );
3697*b1cdbd2cSJim Jagielski 	pViewData->aTextSize = aTextRect.GetSize();
3698*b1cdbd2cSJim Jagielski 
3699*b1cdbd2cSJim Jagielski 	pViewData->aRect = pViewData->aGridRect;
3700*b1cdbd2cSJim Jagielski 	Size aSize( CalcBoundingSize( pEntry, pViewData ) );
3701*b1cdbd2cSJim Jagielski 	long nBorder = pViewData->aGridRect.GetWidth() - aSize.Width();
3702*b1cdbd2cSJim Jagielski 	pViewData->aRect.Left() += nBorder / 2;
3703*b1cdbd2cSJim Jagielski 	pViewData->aRect.Right() -= nBorder / 2;
3704*b1cdbd2cSJim Jagielski 	pViewData->aRect.Bottom() = pViewData->aRect.Top() + aSize.Height();
3705*b1cdbd2cSJim Jagielski }
3706*b1cdbd2cSJim Jagielski 
3707*b1cdbd2cSJim Jagielski 
3708*b1cdbd2cSJim Jagielski // Die Deltas entsprechen Offsets, um die die View auf dem Doc verschoben wird
3709*b1cdbd2cSJim Jagielski // links, hoch: Offsets < 0
3710*b1cdbd2cSJim Jagielski // rechts, runter: Offsets > 0
Scroll(long nDeltaX,long nDeltaY,sal_Bool bScrollBar)3711*b1cdbd2cSJim Jagielski void SvImpIconView::Scroll( long nDeltaX, long nDeltaY, sal_Bool bScrollBar )
3712*b1cdbd2cSJim Jagielski {
3713*b1cdbd2cSJim Jagielski 	const MapMode& rMapMode = pView->GetMapMode();
3714*b1cdbd2cSJim Jagielski 	Point aOrigin( rMapMode.GetOrigin() );
3715*b1cdbd2cSJim Jagielski 	// in Dokumentkoordinate umwandeln
3716*b1cdbd2cSJim Jagielski 	aOrigin *= -1;
3717*b1cdbd2cSJim Jagielski 	aOrigin.Y() += nDeltaY;
3718*b1cdbd2cSJim Jagielski 	aOrigin.X() += nDeltaX;
3719*b1cdbd2cSJim Jagielski 	Rectangle aRect( aOrigin, aOutputSize );
3720*b1cdbd2cSJim Jagielski 	MakeVisible( aRect, bScrollBar );
3721*b1cdbd2cSJim Jagielski }
3722*b1cdbd2cSJim Jagielski 
3723*b1cdbd2cSJim Jagielski 
GetItemSize(SvIconView * pIconView,SvLBoxEntry * pEntry,SvLBoxItem * pItem,const SvIcnVwDataEntry * pViewData) const3724*b1cdbd2cSJim Jagielski const Size& SvImpIconView::GetItemSize( SvIconView* pIconView,
3725*b1cdbd2cSJim Jagielski 	SvLBoxEntry* pEntry, SvLBoxItem* pItem, const SvIcnVwDataEntry* pViewData) const
3726*b1cdbd2cSJim Jagielski {
3727*b1cdbd2cSJim Jagielski 	if( (nFlags & F_GRIDMODE) && pItem->IsA() == SV_ITEM_ID_LBOXSTRING )
3728*b1cdbd2cSJim Jagielski 	{
3729*b1cdbd2cSJim Jagielski 		if( !pViewData )
3730*b1cdbd2cSJim Jagielski 			pViewData = ICNVIEWDATA(pEntry);
3731*b1cdbd2cSJim Jagielski 		return pViewData->aTextSize;
3732*b1cdbd2cSJim Jagielski 	}
3733*b1cdbd2cSJim Jagielski 	else
3734*b1cdbd2cSJim Jagielski 		return pItem->GetSize( pIconView, pEntry );
3735*b1cdbd2cSJim Jagielski }
3736*b1cdbd2cSJim Jagielski 
CalcFocusRect(SvLBoxEntry * pEntry)3737*b1cdbd2cSJim Jagielski Rectangle SvImpIconView::CalcFocusRect( SvLBoxEntry* pEntry )
3738*b1cdbd2cSJim Jagielski {
3739*b1cdbd2cSJim Jagielski #if !defined(OS2)
3740*b1cdbd2cSJim Jagielski 	SvLBoxString* pStringItem = (SvLBoxString*)(pEntry->GetFirstItem(SV_ITEM_ID_LBOXSTRING));
3741*b1cdbd2cSJim Jagielski 	DBG_ASSERT(pStringItem,"Text not set");
3742*b1cdbd2cSJim Jagielski 	return CalcTextRect( pEntry, pStringItem );
3743*b1cdbd2cSJim Jagielski #else
3744*b1cdbd2cSJim Jagielski 	return CalcBmpRect( pEntry );
3745*b1cdbd2cSJim Jagielski #endif
3746*b1cdbd2cSJim Jagielski }
3747*b1cdbd2cSJim Jagielski 
3748*b1cdbd2cSJim Jagielski 
SelectRect(const Rectangle & rRect,sal_Bool bAdd,SvPtrarr * pOtherRects,short nBorderOffs)3749*b1cdbd2cSJim Jagielski void SvImpIconView::SelectRect( const Rectangle& rRect, sal_Bool bAdd,
3750*b1cdbd2cSJim Jagielski 	SvPtrarr* pOtherRects, short nBorderOffs )
3751*b1cdbd2cSJim Jagielski {
3752*b1cdbd2cSJim Jagielski 	if( !pZOrderList || !pZOrderList->Count() )
3753*b1cdbd2cSJim Jagielski 		return;
3754*b1cdbd2cSJim Jagielski 
3755*b1cdbd2cSJim Jagielski 	CheckBoundingRects();
3756*b1cdbd2cSJim Jagielski 	pView->Update();
3757*b1cdbd2cSJim Jagielski 	sal_uInt16 nCount = pZOrderList->Count();
3758*b1cdbd2cSJim Jagielski 
3759*b1cdbd2cSJim Jagielski 	Rectangle aRect( rRect );
3760*b1cdbd2cSJim Jagielski 	aRect.Justify();
3761*b1cdbd2cSJim Jagielski 	if( nBorderOffs )
3762*b1cdbd2cSJim Jagielski 	{
3763*b1cdbd2cSJim Jagielski 		aRect.Left() -= nBorderOffs;
3764*b1cdbd2cSJim Jagielski 		aRect.Right() += nBorderOffs;
3765*b1cdbd2cSJim Jagielski 		aRect.Top() -= nBorderOffs;
3766*b1cdbd2cSJim Jagielski 		aRect.Bottom() += nBorderOffs;
3767*b1cdbd2cSJim Jagielski 	}
3768*b1cdbd2cSJim Jagielski 	sal_Bool bCalcOverlap = (bAdd && pOtherRects && pOtherRects->Count()) ? sal_True : sal_False;
3769*b1cdbd2cSJim Jagielski 
3770*b1cdbd2cSJim Jagielski 	for( sal_uInt16 nPos = 0; nPos < nCount; nPos++ )
3771*b1cdbd2cSJim Jagielski 	{
3772*b1cdbd2cSJim Jagielski 		SvLBoxEntry* pEntry = (SvLBoxEntry*)(pZOrderList->GetObject(nPos ));
3773*b1cdbd2cSJim Jagielski 
3774*b1cdbd2cSJim Jagielski 		SvIcnVwDataEntry* pViewData = ICNVIEWDATA(pEntry);
3775*b1cdbd2cSJim Jagielski 		DBG_ASSERT(pViewData,"Entry not in model");
3776*b1cdbd2cSJim Jagielski 		if( !IsBoundingRectValid( pViewData->aRect ))
3777*b1cdbd2cSJim Jagielski 			FindBoundingRect( pEntry, pViewData );
3778*b1cdbd2cSJim Jagielski 		const Rectangle& rBoundRect = pViewData->aRect;
3779*b1cdbd2cSJim Jagielski 		sal_Bool bSelected = pViewData->IsSelected();
3780*b1cdbd2cSJim Jagielski 
3781*b1cdbd2cSJim Jagielski 		sal_Bool bOverlaps;
3782*b1cdbd2cSJim Jagielski 		if( bCalcOverlap )
3783*b1cdbd2cSJim Jagielski 			bOverlaps = IsOver( pOtherRects, rBoundRect );
3784*b1cdbd2cSJim Jagielski 		else
3785*b1cdbd2cSJim Jagielski 			bOverlaps = sal_False;
3786*b1cdbd2cSJim Jagielski 		sal_Bool bOver = aRect.IsOver( rBoundRect );
3787*b1cdbd2cSJim Jagielski 
3788*b1cdbd2cSJim Jagielski 		if( bOver && !bOverlaps )
3789*b1cdbd2cSJim Jagielski 		{
3790*b1cdbd2cSJim Jagielski 			// Ist im neuen Selektionsrechteck und in keinem alten
3791*b1cdbd2cSJim Jagielski 			// => selektieren
3792*b1cdbd2cSJim Jagielski 			if( !bSelected )
3793*b1cdbd2cSJim Jagielski 				pView->Select( pEntry, sal_True );
3794*b1cdbd2cSJim Jagielski 		}
3795*b1cdbd2cSJim Jagielski 		else if( !bAdd )
3796*b1cdbd2cSJim Jagielski 		{
3797*b1cdbd2cSJim Jagielski 			// ist ausserhalb des Selektionsrechtecks
3798*b1cdbd2cSJim Jagielski 			// => Selektion entfernen
3799*b1cdbd2cSJim Jagielski 			if( bSelected )
3800*b1cdbd2cSJim Jagielski 				pView->Select( pEntry, sal_False );
3801*b1cdbd2cSJim Jagielski 		}
3802*b1cdbd2cSJim Jagielski 		else if( bAdd && bOverlaps )
3803*b1cdbd2cSJim Jagielski 		{
3804*b1cdbd2cSJim Jagielski 			// Der Eintrag befindet sich in einem alten (=>Aufspannen
3805*b1cdbd2cSJim Jagielski 			// mehrerer Rechtecke mit Ctrl!) Selektionsrechteck
3806*b1cdbd2cSJim Jagielski 
3807*b1cdbd2cSJim Jagielski 			// Hier ist noch ein Bug! Der Selektionsstatus eines Eintrags
3808*b1cdbd2cSJim Jagielski 			// in einem vorherigen Rechteck, muss restauriert werden, wenn
3809*b1cdbd2cSJim Jagielski 			// er vom aktuellen Selektionsrechteck beruehrt wurde, jetzt aber
3810*b1cdbd2cSJim Jagielski 			// nicht mehr in ihm liegt. Ich gehe hier der Einfachheit halber
3811*b1cdbd2cSJim Jagielski 			// pauschal davon aus, dass die Eintraege in den alten Rechtecken
3812*b1cdbd2cSJim Jagielski 			// alle selektiert sind. Ebenso ist es falsch, die Schnittmenge
3813*b1cdbd2cSJim Jagielski 			// nur zu deselektieren.
3814*b1cdbd2cSJim Jagielski 			// Loesungsmoeglichkeit: Snapshot der Selektion vor dem Auf-
3815*b1cdbd2cSJim Jagielski 			// spannen des Rechtecks merken
3816*b1cdbd2cSJim Jagielski 			if( rBoundRect.IsOver( rRect))
3817*b1cdbd2cSJim Jagielski 			{
3818*b1cdbd2cSJim Jagielski 				// Schnittmenge zwischen alten Rects & aktuellem Rect desel.
3819*b1cdbd2cSJim Jagielski 				if( bSelected )
3820*b1cdbd2cSJim Jagielski 					pView->Select( pEntry, sal_False );
3821*b1cdbd2cSJim Jagielski 			}
3822*b1cdbd2cSJim Jagielski 			else
3823*b1cdbd2cSJim Jagielski 			{
3824*b1cdbd2cSJim Jagielski 				// Eintrag eines alten Rects selektieren
3825*b1cdbd2cSJim Jagielski 				if( !bSelected )
3826*b1cdbd2cSJim Jagielski 					pView->Select( pEntry, sal_True );
3827*b1cdbd2cSJim Jagielski 			}
3828*b1cdbd2cSJim Jagielski 		}
3829*b1cdbd2cSJim Jagielski 		else if( !bOver && bSelected )
3830*b1cdbd2cSJim Jagielski 		{
3831*b1cdbd2cSJim Jagielski 			// Der Eintrag liegt voellig ausserhalb und wird deshalb desel.
3832*b1cdbd2cSJim Jagielski 			pView->Select( pEntry, sal_False );
3833*b1cdbd2cSJim Jagielski 		}
3834*b1cdbd2cSJim Jagielski 	}
3835*b1cdbd2cSJim Jagielski 	pView->Update();
3836*b1cdbd2cSJim Jagielski }
3837*b1cdbd2cSJim Jagielski 
IsOver(SvPtrarr * pRectList,const Rectangle & rBoundRect) const3838*b1cdbd2cSJim Jagielski sal_Bool SvImpIconView::IsOver( SvPtrarr* pRectList, const Rectangle& rBoundRect ) const
3839*b1cdbd2cSJim Jagielski {
3840*b1cdbd2cSJim Jagielski 	sal_uInt16 nCount = pRectList->Count();
3841*b1cdbd2cSJim Jagielski 	for( sal_uInt16 nCur = 0; nCur < nCount; nCur++ )
3842*b1cdbd2cSJim Jagielski 	{
3843*b1cdbd2cSJim Jagielski 		Rectangle* pRect = (Rectangle*)pRectList->GetObject( nCur );
3844*b1cdbd2cSJim Jagielski 		if( rBoundRect.IsOver( *pRect ))
3845*b1cdbd2cSJim Jagielski 			return sal_True;
3846*b1cdbd2cSJim Jagielski 	}
3847*b1cdbd2cSJim Jagielski 	return sal_False;
3848*b1cdbd2cSJim Jagielski }
3849*b1cdbd2cSJim Jagielski 
AddSelectedRect(const Rectangle & rRect,short nBorderOffs)3850*b1cdbd2cSJim Jagielski void SvImpIconView::AddSelectedRect( const Rectangle& rRect, short nBorderOffs )
3851*b1cdbd2cSJim Jagielski {
3852*b1cdbd2cSJim Jagielski 	Rectangle* pRect = new Rectangle( rRect );
3853*b1cdbd2cSJim Jagielski 	pRect->Justify();
3854*b1cdbd2cSJim Jagielski 	if( nBorderOffs )
3855*b1cdbd2cSJim Jagielski 	{
3856*b1cdbd2cSJim Jagielski 		pRect->Left() -= nBorderOffs;
3857*b1cdbd2cSJim Jagielski 		pRect->Right() += nBorderOffs;
3858*b1cdbd2cSJim Jagielski 		pRect->Top() -= nBorderOffs;
3859*b1cdbd2cSJim Jagielski 		pRect->Bottom() += nBorderOffs;
3860*b1cdbd2cSJim Jagielski 	}
3861*b1cdbd2cSJim Jagielski 	aSelectedRectList.Insert( (void*)pRect, aSelectedRectList.Count() );
3862*b1cdbd2cSJim Jagielski }
3863*b1cdbd2cSJim Jagielski 
ClearSelectedRectList()3864*b1cdbd2cSJim Jagielski void SvImpIconView::ClearSelectedRectList()
3865*b1cdbd2cSJim Jagielski {
3866*b1cdbd2cSJim Jagielski 	sal_uInt16 nCount = aSelectedRectList.Count();
3867*b1cdbd2cSJim Jagielski 	for( sal_uInt16 nCur = 0; nCur < nCount; nCur++ )
3868*b1cdbd2cSJim Jagielski 	{
3869*b1cdbd2cSJim Jagielski 		Rectangle* pRect = (Rectangle*)aSelectedRectList.GetObject( nCur );
3870*b1cdbd2cSJim Jagielski 		delete pRect;
3871*b1cdbd2cSJim Jagielski 	}
3872*b1cdbd2cSJim Jagielski 	aSelectedRectList.Remove( 0, aSelectedRectList.Count() );
3873*b1cdbd2cSJim Jagielski }
3874*b1cdbd2cSJim Jagielski 
3875*b1cdbd2cSJim Jagielski 
DrawSelectionRect(const Rectangle & rRect)3876*b1cdbd2cSJim Jagielski void SvImpIconView::DrawSelectionRect( const Rectangle& rRect )
3877*b1cdbd2cSJim Jagielski {
3878*b1cdbd2cSJim Jagielski 	pView->HideTracking();
3879*b1cdbd2cSJim Jagielski 	nFlags |= F_SELRECT_VISIBLE;
3880*b1cdbd2cSJim Jagielski 	pView->ShowTracking( rRect, SHOWTRACK_SMALL | SHOWTRACK_WINDOW );
3881*b1cdbd2cSJim Jagielski 	aCurSelectionRect = rRect;
3882*b1cdbd2cSJim Jagielski }
3883*b1cdbd2cSJim Jagielski 
HideSelectionRect()3884*b1cdbd2cSJim Jagielski void SvImpIconView::HideSelectionRect()
3885*b1cdbd2cSJim Jagielski {
3886*b1cdbd2cSJim Jagielski 	if( nFlags & F_SELRECT_VISIBLE )
3887*b1cdbd2cSJim Jagielski 	{
3888*b1cdbd2cSJim Jagielski 		pView->HideTracking();
3889*b1cdbd2cSJim Jagielski 		nFlags &= ~F_SELRECT_VISIBLE;
3890*b1cdbd2cSJim Jagielski 	}
3891*b1cdbd2cSJim Jagielski }
3892*b1cdbd2cSJim Jagielski 
ImpDrawXORRect(const Rectangle & rRect)3893*b1cdbd2cSJim Jagielski void SvImpIconView::ImpDrawXORRect( const Rectangle& rRect )
3894*b1cdbd2cSJim Jagielski {
3895*b1cdbd2cSJim Jagielski 	RasterOp eOldOp = pView->GetRasterOp();
3896*b1cdbd2cSJim Jagielski 	pView->SetRasterOp( ROP_XOR );
3897*b1cdbd2cSJim Jagielski 	Color aOldColor = pView->GetFillColor();
3898*b1cdbd2cSJim Jagielski 	pView->SetFillColor();
3899*b1cdbd2cSJim Jagielski 	pView->DrawRect( rRect );
3900*b1cdbd2cSJim Jagielski 	pView->SetFillColor( aOldColor );
3901*b1cdbd2cSJim Jagielski 	pView->SetRasterOp( eOldOp );
3902*b1cdbd2cSJim Jagielski }
3903*b1cdbd2cSJim Jagielski 
CalcScrollOffsets(const Point & rPosPixel,long & rX,long & rY,sal_Bool bInDragDrop,sal_uInt16 nBorderWidth)3904*b1cdbd2cSJim Jagielski void SvImpIconView::CalcScrollOffsets( const Point& rPosPixel,
3905*b1cdbd2cSJim Jagielski 	long& rX, long& rY, sal_Bool bInDragDrop, sal_uInt16 nBorderWidth)
3906*b1cdbd2cSJim Jagielski {
3907*b1cdbd2cSJim Jagielski 	// Scrolling der View, falls sich der Mauszeiger im Grenzbereich des
3908*b1cdbd2cSJim Jagielski 	// Fensters befindet
3909*b1cdbd2cSJim Jagielski 	long nPixelToScrollX = 0;
3910*b1cdbd2cSJim Jagielski 	long nPixelToScrollY = 0;
3911*b1cdbd2cSJim Jagielski 	Size aWndSize = aOutputSize;
3912*b1cdbd2cSJim Jagielski 
3913*b1cdbd2cSJim Jagielski 	nBorderWidth = (sal_uInt16)(Min( (long)(aWndSize.Height()-1), (long)nBorderWidth ));
3914*b1cdbd2cSJim Jagielski 	nBorderWidth = (sal_uInt16)(Min( (long)(aWndSize.Width()-1), (long)nBorderWidth ));
3915*b1cdbd2cSJim Jagielski 
3916*b1cdbd2cSJim Jagielski 	if ( rPosPixel.X() < nBorderWidth )
3917*b1cdbd2cSJim Jagielski 	{
3918*b1cdbd2cSJim Jagielski 		if( bInDragDrop )
3919*b1cdbd2cSJim Jagielski 			nPixelToScrollX = -DD_SCROLL_PIXEL;
3920*b1cdbd2cSJim Jagielski 		else
3921*b1cdbd2cSJim Jagielski 			nPixelToScrollX = rPosPixel.X()- nBorderWidth;
3922*b1cdbd2cSJim Jagielski 	}
3923*b1cdbd2cSJim Jagielski 	else if ( rPosPixel.X() > aWndSize.Width() - nBorderWidth )
3924*b1cdbd2cSJim Jagielski 	{
3925*b1cdbd2cSJim Jagielski 		if( bInDragDrop )
3926*b1cdbd2cSJim Jagielski 			nPixelToScrollX = DD_SCROLL_PIXEL;
3927*b1cdbd2cSJim Jagielski 		else
3928*b1cdbd2cSJim Jagielski 			nPixelToScrollX = rPosPixel.X() - (aWndSize.Width() - nBorderWidth);
3929*b1cdbd2cSJim Jagielski 	}
3930*b1cdbd2cSJim Jagielski 	if ( rPosPixel.Y() < nBorderWidth )
3931*b1cdbd2cSJim Jagielski 	{
3932*b1cdbd2cSJim Jagielski 		if( bInDragDrop )
3933*b1cdbd2cSJim Jagielski 			nPixelToScrollY = -DD_SCROLL_PIXEL;
3934*b1cdbd2cSJim Jagielski 		else
3935*b1cdbd2cSJim Jagielski 			nPixelToScrollY = rPosPixel.Y() - nBorderWidth;
3936*b1cdbd2cSJim Jagielski 	}
3937*b1cdbd2cSJim Jagielski 	else if ( rPosPixel.Y() > aWndSize.Height() - nBorderWidth )
3938*b1cdbd2cSJim Jagielski 	{
3939*b1cdbd2cSJim Jagielski 		if( bInDragDrop )
3940*b1cdbd2cSJim Jagielski 			nPixelToScrollY = DD_SCROLL_PIXEL;
3941*b1cdbd2cSJim Jagielski 		else
3942*b1cdbd2cSJim Jagielski 			nPixelToScrollY = rPosPixel.Y() - (aWndSize.Height() - nBorderWidth);
3943*b1cdbd2cSJim Jagielski 	}
3944*b1cdbd2cSJim Jagielski 
3945*b1cdbd2cSJim Jagielski 	rX = nPixelToScrollX;
3946*b1cdbd2cSJim Jagielski 	rY = nPixelToScrollY;
3947*b1cdbd2cSJim Jagielski }
3948*b1cdbd2cSJim Jagielski 
IMPL_LINK(SvImpIconView,MouseMoveTimeoutHdl,Timer *,pTimer)3949*b1cdbd2cSJim Jagielski IMPL_LINK(SvImpIconView, MouseMoveTimeoutHdl, Timer*, pTimer )
3950*b1cdbd2cSJim Jagielski {
3951*b1cdbd2cSJim Jagielski 	pTimer->Start();
3952*b1cdbd2cSJim Jagielski 	MouseMove( aMouseMoveEvent );
3953*b1cdbd2cSJim Jagielski 	return 0;
3954*b1cdbd2cSJim Jagielski }
3955*b1cdbd2cSJim Jagielski 
EndTracking()3956*b1cdbd2cSJim Jagielski void SvImpIconView::EndTracking()
3957*b1cdbd2cSJim Jagielski {
3958*b1cdbd2cSJim Jagielski 	pView->ReleaseMouse();
3959*b1cdbd2cSJim Jagielski 	if( nFlags & F_RUBBERING )
3960*b1cdbd2cSJim Jagielski 	{
3961*b1cdbd2cSJim Jagielski 		aMouseMoveTimer.Stop();
3962*b1cdbd2cSJim Jagielski 		nFlags &= ~(F_RUBBERING | F_ADD_MODE);
3963*b1cdbd2cSJim Jagielski 	}
3964*b1cdbd2cSJim Jagielski }
3965*b1cdbd2cSJim Jagielski 
IsTextHit(SvLBoxEntry * pEntry,const Point & rDocPos)3966*b1cdbd2cSJim Jagielski sal_Bool SvImpIconView::IsTextHit( SvLBoxEntry* pEntry, const Point& rDocPos )
3967*b1cdbd2cSJim Jagielski {
3968*b1cdbd2cSJim Jagielski 	SvLBoxString* pItem = (SvLBoxString*)(pEntry->GetFirstItem(SV_ITEM_ID_LBOXSTRING));
3969*b1cdbd2cSJim Jagielski 	if( pItem )
3970*b1cdbd2cSJim Jagielski 	{
3971*b1cdbd2cSJim Jagielski 		Rectangle aRect( CalcTextRect( pEntry, pItem ));
3972*b1cdbd2cSJim Jagielski 		if( aRect.IsInside( rDocPos ) )
3973*b1cdbd2cSJim Jagielski 			return sal_True;
3974*b1cdbd2cSJim Jagielski 	}
3975*b1cdbd2cSJim Jagielski 	return sal_False;
3976*b1cdbd2cSJim Jagielski }
3977*b1cdbd2cSJim Jagielski 
IMPL_LINK(SvImpIconView,EditTimeoutHdl,Timer *,EMPTYARG)3978*b1cdbd2cSJim Jagielski IMPL_LINK(SvImpIconView, EditTimeoutHdl, Timer*, EMPTYARG )
3979*b1cdbd2cSJim Jagielski {
3980*b1cdbd2cSJim Jagielski 	SvLBoxEntry* pEntry = GetCurEntry();
3981*b1cdbd2cSJim Jagielski 	if( pView->IsInplaceEditingEnabled() && pEntry &&
3982*b1cdbd2cSJim Jagielski 		pView->IsSelected( pEntry ))
3983*b1cdbd2cSJim Jagielski 	{
3984*b1cdbd2cSJim Jagielski 		pView->EditEntry( pEntry );
3985*b1cdbd2cSJim Jagielski 	}
3986*b1cdbd2cSJim Jagielski 	return 0;
3987*b1cdbd2cSJim Jagielski }
3988*b1cdbd2cSJim Jagielski 
3989*b1cdbd2cSJim Jagielski 
3990*b1cdbd2cSJim Jagielski //
3991*b1cdbd2cSJim Jagielski // Funktionen zum Ausrichten der Eintraege am Grid
3992*b1cdbd2cSJim Jagielski //
3993*b1cdbd2cSJim Jagielski 
3994*b1cdbd2cSJim Jagielski // pStart == 0: Alle Eintraege werden ausgerichtet
3995*b1cdbd2cSJim Jagielski // sonst: Alle Eintraege der Zeile ab einschliesslich pStart werden ausgerichtet
AdjustAtGrid(SvLBoxEntry * pStart)3996*b1cdbd2cSJim Jagielski void SvImpIconView::AdjustAtGrid( SvLBoxEntry* pStart )
3997*b1cdbd2cSJim Jagielski {
3998*b1cdbd2cSJim Jagielski 	SvPtrarr aLists;
3999*b1cdbd2cSJim Jagielski 	pImpCursor->CreateGridAjustData( aLists, pStart );
4000*b1cdbd2cSJim Jagielski 	sal_uInt16 nCount = aLists.Count();
4001*b1cdbd2cSJim Jagielski 	for( sal_uInt16 nCur = 0; nCur < nCount; nCur++ )
4002*b1cdbd2cSJim Jagielski 	{
4003*b1cdbd2cSJim Jagielski 		AdjustAtGrid( *(SvPtrarr*)aLists[ nCur ], pStart );
4004*b1cdbd2cSJim Jagielski 	}
4005*b1cdbd2cSJim Jagielski 	ImpIcnCursor::DestroyGridAdjustData( aLists );
4006*b1cdbd2cSJim Jagielski 	CheckScrollBars();
4007*b1cdbd2cSJim Jagielski }
4008*b1cdbd2cSJim Jagielski 
4009*b1cdbd2cSJim Jagielski // Richtet eine Zeile aus, erweitert ggf. die Breite; Bricht die Zeile nicht um
AdjustAtGrid(const SvPtrarr & rRow,SvLBoxEntry * pStart)4010*b1cdbd2cSJim Jagielski void SvImpIconView::AdjustAtGrid( const SvPtrarr& rRow, SvLBoxEntry* pStart )
4011*b1cdbd2cSJim Jagielski {
4012*b1cdbd2cSJim Jagielski 	if( !rRow.Count() )
4013*b1cdbd2cSJim Jagielski 		return;
4014*b1cdbd2cSJim Jagielski 
4015*b1cdbd2cSJim Jagielski 	sal_Bool bGo;
4016*b1cdbd2cSJim Jagielski 	if( !pStart )
4017*b1cdbd2cSJim Jagielski 		bGo = sal_True;
4018*b1cdbd2cSJim Jagielski 	else
4019*b1cdbd2cSJim Jagielski 		bGo = sal_False;
4020*b1cdbd2cSJim Jagielski 
4021*b1cdbd2cSJim Jagielski 	long nCurRight = 0;
4022*b1cdbd2cSJim Jagielski 	for( sal_uInt16 nCur = 0; nCur < rRow.Count(); nCur++ )
4023*b1cdbd2cSJim Jagielski 	{
4024*b1cdbd2cSJim Jagielski 		SvLBoxEntry* pCur = (SvLBoxEntry*)rRow[ nCur ];
4025*b1cdbd2cSJim Jagielski 		if( !bGo && pCur == pStart )
4026*b1cdbd2cSJim Jagielski 			bGo = sal_True;
4027*b1cdbd2cSJim Jagielski 
4028*b1cdbd2cSJim Jagielski 		SvIcnVwDataEntry* pViewData = ICNVIEWDATA(pCur);
4029*b1cdbd2cSJim Jagielski 		// Massgebend (fuer das menschliche Auge) ist die Bitmap, da sonst
4030*b1cdbd2cSJim Jagielski 		// durch lange Texte der Eintrag stark springen kann
4031*b1cdbd2cSJim Jagielski 		const Rectangle& rBoundRect = GetBoundingRect( pCur, pViewData );
4032*b1cdbd2cSJim Jagielski 		Rectangle aCenterRect( CalcBmpRect( pCur, 0, pViewData ));
4033*b1cdbd2cSJim Jagielski 		if( bGo && !pViewData->IsEntryPosLocked() )
4034*b1cdbd2cSJim Jagielski 		{
4035*b1cdbd2cSJim Jagielski 			long nWidth = aCenterRect.GetSize().Width();
4036*b1cdbd2cSJim Jagielski 			Point aNewPos( AdjustAtGrid( aCenterRect, rBoundRect ) );
4037*b1cdbd2cSJim Jagielski 			while( aNewPos.X() < nCurRight )
4038*b1cdbd2cSJim Jagielski 				aNewPos.X() += nGridDX;
4039*b1cdbd2cSJim Jagielski 			if( aNewPos != rBoundRect.TopLeft() )
4040*b1cdbd2cSJim Jagielski 				SetEntryPosition( pCur, aNewPos );
4041*b1cdbd2cSJim Jagielski 			nCurRight = aNewPos.X() + nWidth;
4042*b1cdbd2cSJim Jagielski 		}
4043*b1cdbd2cSJim Jagielski 		else
4044*b1cdbd2cSJim Jagielski 		{
4045*b1cdbd2cSJim Jagielski 			nCurRight = rBoundRect.Right();
4046*b1cdbd2cSJim Jagielski 		}
4047*b1cdbd2cSJim Jagielski 	}
4048*b1cdbd2cSJim Jagielski }
4049*b1cdbd2cSJim Jagielski 
4050*b1cdbd2cSJim Jagielski // Richtet Rect am Grid aus, garantiert jedoch nicht, dass die
4051*b1cdbd2cSJim Jagielski // neue Pos. frei ist. Die Pos. kann fuer SetEntryPos verwendet werden.
4052*b1cdbd2cSJim Jagielski // Das CenterRect beschreibt den Teil des BoundRects, der fuer
4053*b1cdbd2cSJim Jagielski // die Berechnung des Ziel-Rechtecks verwendet wird.
AdjustAtGrid(const Rectangle & rCenterRect,const Rectangle & rBoundRect) const4054*b1cdbd2cSJim Jagielski Point SvImpIconView::AdjustAtGrid( const Rectangle& rCenterRect,
4055*b1cdbd2cSJim Jagielski 	const Rectangle& rBoundRect ) const
4056*b1cdbd2cSJim Jagielski {
4057*b1cdbd2cSJim Jagielski 	Point aPos( rCenterRect.TopLeft() );
4058*b1cdbd2cSJim Jagielski 	Size aSize( rCenterRect.GetSize() );
4059*b1cdbd2cSJim Jagielski 
4060*b1cdbd2cSJim Jagielski 	aPos.X() -= LROFFS_WINBORDER;
4061*b1cdbd2cSJim Jagielski 	aPos.Y() -= TBOFFS_WINBORDER;
4062*b1cdbd2cSJim Jagielski 
4063*b1cdbd2cSJim Jagielski 	// align (ref ist mitte des rects)
4064*b1cdbd2cSJim Jagielski 	short nGridX = (short)((aPos.X()+(aSize.Width()/2)) / nGridDX);
4065*b1cdbd2cSJim Jagielski 	short nGridY = (short)((aPos.Y()+(aSize.Height()/2)) / nGridDY);
4066*b1cdbd2cSJim Jagielski 	aPos.X() = nGridX * nGridDX;
4067*b1cdbd2cSJim Jagielski 	aPos.Y() = nGridY * nGridDY;
4068*b1cdbd2cSJim Jagielski 	// hor. center
4069*b1cdbd2cSJim Jagielski 	aPos.X() += (nGridDX - rBoundRect.GetSize().Width() ) / 2;
4070*b1cdbd2cSJim Jagielski 
4071*b1cdbd2cSJim Jagielski 	aPos.X() += LROFFS_WINBORDER;
4072*b1cdbd2cSJim Jagielski 	aPos.Y() += TBOFFS_WINBORDER;
4073*b1cdbd2cSJim Jagielski 
4074*b1cdbd2cSJim Jagielski 	return aPos;
4075*b1cdbd2cSJim Jagielski }
4076*b1cdbd2cSJim Jagielski 
4077*b1cdbd2cSJim Jagielski 
SetTextMode(SvIconViewTextMode eMode,SvLBoxEntry * pEntry)4078*b1cdbd2cSJim Jagielski void SvImpIconView::SetTextMode( SvIconViewTextMode eMode, SvLBoxEntry* pEntry )
4079*b1cdbd2cSJim Jagielski {
4080*b1cdbd2cSJim Jagielski 	if( !pEntry )
4081*b1cdbd2cSJim Jagielski 	{
4082*b1cdbd2cSJim Jagielski 		if( eTextMode != eMode )
4083*b1cdbd2cSJim Jagielski 		{
4084*b1cdbd2cSJim Jagielski 			if( eTextMode == ShowTextDontKnow )
4085*b1cdbd2cSJim Jagielski 				eTextMode = ShowTextShort;
4086*b1cdbd2cSJim Jagielski 			eTextMode = eMode;
4087*b1cdbd2cSJim Jagielski 			pView->Arrange();
4088*b1cdbd2cSJim Jagielski 		}
4089*b1cdbd2cSJim Jagielski 	}
4090*b1cdbd2cSJim Jagielski 	else
4091*b1cdbd2cSJim Jagielski 	{
4092*b1cdbd2cSJim Jagielski 		SvIcnVwDataEntry* pViewData = ICNVIEWDATA(pEntry);
4093*b1cdbd2cSJim Jagielski 		if( pViewData->eTextMode != eMode )
4094*b1cdbd2cSJim Jagielski 		{
4095*b1cdbd2cSJim Jagielski 			pViewData->eTextMode = eMode;
4096*b1cdbd2cSJim Jagielski 			pModel->InvalidateEntry( pEntry );
4097*b1cdbd2cSJim Jagielski 			AdjustVirtSize( pViewData->aRect );
4098*b1cdbd2cSJim Jagielski 		}
4099*b1cdbd2cSJim Jagielski 	}
4100*b1cdbd2cSJim Jagielski }
4101*b1cdbd2cSJim Jagielski 
GetTextMode(const SvLBoxEntry * pEntry,const SvIcnVwDataEntry * pViewData) const4102*b1cdbd2cSJim Jagielski SvIconViewTextMode SvImpIconView::GetTextMode( const SvLBoxEntry* pEntry,
4103*b1cdbd2cSJim Jagielski 	const SvIcnVwDataEntry* pViewData ) const
4104*b1cdbd2cSJim Jagielski {
4105*b1cdbd2cSJim Jagielski 	if( !pEntry )
4106*b1cdbd2cSJim Jagielski 		return eTextMode;
4107*b1cdbd2cSJim Jagielski 	else
4108*b1cdbd2cSJim Jagielski 	{
4109*b1cdbd2cSJim Jagielski 		if( !pViewData )
4110*b1cdbd2cSJim Jagielski 			pViewData = ICNVIEWDATA(((SvLBoxEntry*)pEntry));
4111*b1cdbd2cSJim Jagielski 		return pViewData->GetTextMode();
4112*b1cdbd2cSJim Jagielski 	}
4113*b1cdbd2cSJim Jagielski }
4114*b1cdbd2cSJim Jagielski 
GetEntryTextModeSmart(const SvLBoxEntry * pEntry,const SvIcnVwDataEntry * pViewData) const4115*b1cdbd2cSJim Jagielski SvIconViewTextMode SvImpIconView::GetEntryTextModeSmart( const SvLBoxEntry* pEntry,
4116*b1cdbd2cSJim Jagielski 	const SvIcnVwDataEntry* pViewData ) const
4117*b1cdbd2cSJim Jagielski {
4118*b1cdbd2cSJim Jagielski 	DBG_ASSERT(pEntry,"GetEntryTextModeSmart: Entry not set");
4119*b1cdbd2cSJim Jagielski 	if( !pViewData )
4120*b1cdbd2cSJim Jagielski 		pViewData = ICNVIEWDATA(((SvLBoxEntry*)pEntry));
4121*b1cdbd2cSJim Jagielski 	SvIconViewTextMode eMode = pViewData->GetTextMode();
4122*b1cdbd2cSJim Jagielski 	if( eMode == ShowTextDontKnow )
4123*b1cdbd2cSJim Jagielski 		return eTextMode;
4124*b1cdbd2cSJim Jagielski 	return eMode;
4125*b1cdbd2cSJim Jagielski }
4126*b1cdbd2cSJim Jagielski 
ShowFocusRect(const SvLBoxEntry * pEntry)4127*b1cdbd2cSJim Jagielski void SvImpIconView::ShowFocusRect( const SvLBoxEntry* pEntry )
4128*b1cdbd2cSJim Jagielski {
4129*b1cdbd2cSJim Jagielski 	if( !pEntry )
4130*b1cdbd2cSJim Jagielski 		pView->HideFocus();
4131*b1cdbd2cSJim Jagielski 	else
4132*b1cdbd2cSJim Jagielski 	{
4133*b1cdbd2cSJim Jagielski 		Rectangle aRect ( CalcFocusRect( (SvLBoxEntry*)pEntry ) );
4134*b1cdbd2cSJim Jagielski 		pView->ShowFocus( aRect );
4135*b1cdbd2cSJim Jagielski 	}
4136*b1cdbd2cSJim Jagielski }
4137*b1cdbd2cSJim Jagielski 
IMPL_LINK(SvImpIconView,UserEventHdl,void *,EMPTYARG)4138*b1cdbd2cSJim Jagielski IMPL_LINK(SvImpIconView, UserEventHdl, void*, EMPTYARG )
4139*b1cdbd2cSJim Jagielski {
4140*b1cdbd2cSJim Jagielski 	nCurUserEvent = 0;
4141*b1cdbd2cSJim Jagielski 	AdjustScrollBars();
4142*b1cdbd2cSJim Jagielski 	Rectangle aRect;
4143*b1cdbd2cSJim Jagielski 	if( GetResizeRect(aRect) )
4144*b1cdbd2cSJim Jagielski 		PaintResizeRect( aRect );
4145*b1cdbd2cSJim Jagielski 	return 0;
4146*b1cdbd2cSJim Jagielski }
4147*b1cdbd2cSJim Jagielski 
CancelUserEvent()4148*b1cdbd2cSJim Jagielski void SvImpIconView::CancelUserEvent()
4149*b1cdbd2cSJim Jagielski {
4150*b1cdbd2cSJim Jagielski 	if( nCurUserEvent )
4151*b1cdbd2cSJim Jagielski 	{
4152*b1cdbd2cSJim Jagielski 		Application::RemoveUserEvent( nCurUserEvent );
4153*b1cdbd2cSJim Jagielski 		nCurUserEvent = 0;
4154*b1cdbd2cSJim Jagielski 	}
4155*b1cdbd2cSJim Jagielski }
4156*b1cdbd2cSJim Jagielski 
4157*b1cdbd2cSJim Jagielski 
4158