OSDN Git Service

Issue 74: Add multiple files from commit dialog only adds first two in multi-selection
[tortoisegit/TortoiseGitJp.git] / src / Utils / ACListWnd.cpp
1 // ACWnd.cpp: Implementierungsdatei\r
2 //\r
3 \r
4 #include "stdafx.h"\r
5 #include "ACListWnd.h"\r
6 \r
7 #ifdef _DEBUG\r
8 #define new DEBUG_NEW\r
9 #undef THIS_FILE\r
10 static char THIS_FILE[] = __FILE__;\r
11 #endif\r
12 \r
13 static UINT auIDStatusBar[] = \r
14\r
15         ID_SEPARATOR\r
16 };\r
17 \r
18 #define _MAX_ENTRYS_ 8\r
19 #define _MODE_FIND_ALL_                 (1L << 5)\r
20 \r
21 /////////////////////////////////////////////////////////////////////////////\r
22 // CACListWnd\r
23 \r
24 void DoPaintMessageLoop()\r
25 {\r
26         MSG message1;\r
27         while(::PeekMessage(&message1,NULL,WM_PAINT,WM_PAINT, PM_REMOVE))\r
28         {\r
29                 ::TranslateMessage(&message1);\r
30                 ::DispatchMessage(&message1);\r
31         }\r
32 }\r
33 \r
34 /**********************************************************************/\r
35 \r
36 CACListWnd::CACListWnd()\r
37 {\r
38         m_lTopIndex = 0;\r
39         m_lCount = 0;\r
40         m_ItemHeight = 16;\r
41         m_lSelItem = -1;\r
42         m_VisibleItems = 0;\r
43         m_pEditParent = NULL;\r
44         m_LastSize.SetRectEmpty();\r
45         m_PrefixChar = 0;\r
46         m_lMode = 0;\r
47 }\r
48 \r
49 /**********************************************************************/\r
50 \r
51 CACListWnd::~CACListWnd()\r
52 {\r
53         m_SearchList.RemoveAll();\r
54         m_DisplayList.RemoveAll();\r
55         DestroyWindow();\r
56 }\r
57 \r
58 /*********************************************************************/\r
59 \r
60 void CACListWnd::OnActivateApp(BOOL bActive, DWORD dwThreadID) \r
61 {\r
62 #if (_MSC_VER >= 1300)\r
63         CWnd::OnActivateApp(bActive, dwThreadID);  //vc7    FIX 1.2\r
64 #else\r
65         CWnd::OnActivateApp(bActive, (HTASK)dwThreadID); //vc6        FIX 1.2\r
66 #endif\r
67 \r
68         ShowWindow(false);\r
69 }\r
70 \r
71 \r
72 BEGIN_MESSAGE_MAP(CACListWnd, CWnd)\r
73         //{{AFX_MSG_MAP(CACListWnd)\r
74         ON_WM_PAINT()\r
75         ON_WM_SIZE()\r
76         ON_WM_ERASEBKGND()\r
77         ON_WM_NCPAINT()\r
78         ON_WM_KEYDOWN()\r
79         ON_WM_NCCALCSIZE()\r
80         ON_WM_VSCROLL()\r
81         ON_WM_ACTIVATEAPP()\r
82         ON_WM_NCHITTEST()\r
83         ON_WM_LBUTTONDOWN()\r
84         ON_WM_RBUTTONDOWN()\r
85         ON_WM_SETCURSOR()\r
86         ON_WM_SHOWWINDOW()\r
87         ON_WM_NCLBUTTONDOWN()\r
88         ON_WM_MOUSEMOVE()\r
89         ON_WM_TIMER()\r
90         ON_WM_GETMINMAXINFO()\r
91         //}}AFX_MSG_MAP\r
92 END_MESSAGE_MAP()\r
93 \r
94 \r
95 /////////////////////////////////////////////////////////////////////////////\r
96 // Behandlungsroutinen für Nachrichten CACListWnd \r
97 \r
98 void CACListWnd::DrawItem(CDC* pDC,long m_lItem,long width)\r
99 {\r
100         long y = m_lItem - m_lTopIndex;\r
101         CRect rcLabel(2,y*m_ItemHeight,width,(y+1)*m_ItemHeight);\r
102 \r
103         pDC->SetTextColor(::GetSysColor(COLOR_WINDOWTEXT));\r
104 \r
105         if(m_lItem == m_lSelItem)\r
106         {\r
107                 rcLabel.left = 0;\r
108                 pDC->FillSolidRect(rcLabel,::GetSysColor(COLOR_HIGHLIGHT));\r
109                 pDC->SetTextColor(::GetSysColor(COLOR_HIGHLIGHTTEXT));\r
110                 rcLabel.left = 2;\r
111         }\r
112 \r
113         if(m_PrefixChar)\r
114                 m_DisplayStr = m_PrefixChar + m_DisplayList.GetAt(m_lItem);\r
115         else\r
116                 m_DisplayStr = m_DisplayList.GetAt(m_lItem);\r
117 \r
118         pDC->DrawText(m_DisplayStr, -1, rcLabel, DT_LEFT | DT_SINGLELINE | \r
119                 DT_NOPREFIX | DT_VCENTER | DT_END_ELLIPSIS);\r
120 }\r
121 \r
122 /*********************************************************************/\r
123 \r
124 void CACListWnd::OnPaint() \r
125 {\r
126         CPaintDC dc(this);\r
127         CRect rcWnd,m_rect, rc;\r
128         CDC MemDC,*pDC=NULL;\r
129         CBitmap  m_bitmap, *m_pOldBitmap;\r
130         int i;\r
131 \r
132         GetClientRect(rc);\r
133         rcWnd = m_rect = rc;\r
134 \r
135         rc.left = rc.right-GetSystemMetrics(SM_CXHSCROLL);\r
136         rc.top = rc.bottom-GetSystemMetrics(SM_CYVSCROLL);\r
137 \r
138         m_rect.right -= ScrollBarWidth();\r
139 \r
140         MemDC.CreateCompatibleDC(&dc);\r
141 \r
142         m_bitmap.CreateCompatibleBitmap(&dc, m_rect.Width(), m_rect.Height());\r
143         m_pOldBitmap = MemDC.SelectObject(&m_bitmap);\r
144 \r
145         MemDC.SetWindowOrg(m_rect.left, m_rect.top);\r
146 \r
147         long width = rcWnd.Width() - ScrollBarWidth();\r
148 \r
149         MemDC.FillSolidRect(rcWnd,::GetSysColor(COLOR_WINDOW));\r
150         MemDC.SelectObject(GetStockObject(DEFAULT_GUI_FONT)); \r
151         MemDC.SetBkMode(TRANSPARENT);\r
152 \r
153         for(i = m_lTopIndex; i < m_lCount;i++)\r
154         {\r
155                 DrawItem(&MemDC,i,width);\r
156         }\r
157 \r
158 \r
159         CPen m_Pen1(PS_SOLID, 1, ::GetSysColor(COLOR_WINDOW));\r
160         CPen m_Pen2(PS_SOLID, 1, ::GetSysColor(COLOR_BTNFACE));\r
161         CPen m_Pen3(PS_SOLID, 1, ::GetSysColor(COLOR_3DSHADOW));\r
162 \r
163         pDC = &dc;\r
164 \r
165         if(m_VertBar.IsWindowVisible())\r
166                 dc.FillSolidRect(rc, ::GetSysColor(COLOR_BTNFACE) );\r
167         else\r
168                 pDC = &MemDC;\r
169 \r
170         CPen *pOldPen = (CPen*)pDC->SelectObject(&m_Pen1);\r
171         int a = 1,bottom;\r
172 \r
173         width = GetSystemMetrics(SM_CXHSCROLL);\r
174         bottom = (rcWnd.bottom-GetSystemMetrics(SM_CXHSCROLL))-1;\r
175 \r
176         //gripper\r
177         for( i = 0; i < 20 ;i++,a++)\r
178         {\r
179                 if(a==1)\r
180                         pDC->SelectObject(&m_Pen1);\r
181                 if(a==2)\r
182                         pDC->SelectObject(&m_Pen2);\r
183                 if(a==3)\r
184                         pDC->SelectObject(&m_Pen3);\r
185                 if(a > 3)\r
186                         a = 0;\r
187 \r
188                 pDC->MoveTo(rc.left + i - 1, rcWnd.bottom);\r
189                 pDC->LineTo(rc.left + i + width, bottom);\r
190         }\r
191 \r
192         dc.BitBlt(m_rect.left, m_rect.top, m_rect.Width(), m_rect.Height(),\r
193                 &MemDC, m_rect.left, m_rect.top, SRCCOPY);\r
194 \r
195         pDC->SelectObject( pOldPen );\r
196         MemDC.SelectObject(m_pOldBitmap);\r
197 }\r
198 \r
199 /*********************************************************************/\r
200 \r
201 void CACListWnd::Init(CWnd *pWnd)\r
202 {\r
203         VERIFY(m_VertBar.Create(WS_VISIBLE|SBS_VERT|SBS_LEFTALIGN,\r
204                 CRect(0,0,GetSystemMetrics(SM_CYVSCROLL),100),this,0));\r
205 \r
206         SetScroller();\r
207         m_pEditParent = (CEdit*)pWnd;\r
208 \r
209         m_lCount = m_DisplayList.GetSize();\r
210         m_VertBar.SetScrollPos(0,false);\r
211         SetProp();\r
212 \r
213         CDC *m_pDC;\r
214         m_pDC = GetDC();\r
215         if(m_pDC)\r
216         {\r
217                 m_pDC->SelectObject(GetStockObject(DEFAULT_GUI_FONT));\r
218                 CSize m_Size = m_pDC->GetOutputTextExtent(_T("Hg"));\r
219                 m_ItemHeight = m_Size.cy;\r
220                 ReleaseDC(m_pDC);\r
221         }\r
222 }\r
223 \r
224 /*********************************************************************/\r
225 \r
226 void CACListWnd::SetScroller()\r
227 {\r
228         CRect rcWnd,rcBar;\r
229         GetClientRect(rcWnd);\r
230 \r
231         if(m_VertBar.GetSafeHwnd())\r
232         {\r
233                 rcBar = rcWnd;\r
234                 rcBar.top=-1;\r
235                 rcBar.left = (rcWnd.Width()-GetSystemMetrics(SM_CYVSCROLL));\r
236                 rcBar.bottom-= GetSystemMetrics(SM_CYHSCROLL);\r
237                 m_VertBar.MoveWindow(rcBar);\r
238                 rcBar.top = rcWnd.bottom-20;\r
239                 rcBar.bottom = rcWnd.bottom;\r
240 \r
241                 m_VertBar.SetScrollPos(m_lTopIndex,true);       \r
242         }       \r
243 \r
244 }\r
245 \r
246 /*********************************************************************/\r
247 \r
248 void CACListWnd::OnSize(UINT nType, int cx, int cy) \r
249 {\r
250         CWnd::OnSize(nType, cx, cy);\r
251         SetScroller();\r
252         SetProp();\r
253 \r
254         if(!m_LastSize.IsRectEmpty())\r
255                 GetWindowRect(m_LastSize);\r
256 }\r
257 \r
258 /*********************************************************************/\r
259 \r
260 long CACListWnd::ScrollBarWidth()\r
261 {\r
262         if(m_VertBar.IsWindowVisible())\r
263                 return GetSystemMetrics(SM_CYVSCROLL);\r
264         else\r
265                 return 0;\r
266 }\r
267 \r
268 /*********************************************************************/\r
269 \r
270 void CACListWnd::SetProp()\r
271 {\r
272         CRect rcWnd,rcBar;\r
273 \r
274         if(!m_lCount)\r
275                 return;\r
276 \r
277         CWnd::GetWindowRect(rcWnd);\r
278         ScreenToClient(rcWnd);\r
279 \r
280         SCROLLINFO si;\r
281         si.cbSize = sizeof(SCROLLINFO);\r
282         si.fMask =  SIF_PAGE|SIF_RANGE;\r
283         si.nMin = 0;\r
284         si.nMax =  m_lCount-1;\r
285         m_VisibleItems = si.nPage = rcWnd.Height()/m_ItemHeight;\r
286         si.nTrackPos = 2;\r
287         m_VertBar.SetScrollRange(0,m_lCount-1);\r
288         m_VertBar.SetScrollInfo(&si);\r
289 \r
290         if(m_VisibleItems > m_lCount-1)\r
291                 m_VertBar.ShowWindow(false);\r
292         else\r
293                 m_VertBar.ShowWindow(true);\r
294 \r
295         if(m_lTopIndex+m_VisibleItems > m_lCount)\r
296         {\r
297                 m_lTopIndex = m_lCount-m_VisibleItems;\r
298                 if(m_lTopIndex < 0)\r
299                         m_lTopIndex = 0;\r
300                 m_VertBar.SetScrollPos(m_lTopIndex,true);\r
301         }\r
302 }\r
303 \r
304 /*********************************************************************/\r
305 \r
306 BOOL CACListWnd::OnEraseBkgnd(CDC* /*pDC*/) \r
307 {\r
308         return false;\r
309 }\r
310 \r
311 /*********************************************************************/\r
312 \r
313 void CACListWnd::OnNcPaint() \r
314 {\r
315         CWindowDC dc(this);\r
316         CRect rectClient, rectWindow,rcWnd;\r
317 \r
318         GetClientRect(rectClient);\r
319         GetWindowRect(rectWindow);\r
320         ScreenToClient(rectWindow);\r
321 \r
322         rectClient.OffsetRect(-(rectWindow.left), -(rectWindow.top));\r
323         dc.ExcludeClipRect(rectClient);\r
324 \r
325         rectWindow.OffsetRect(-rectWindow.left, -rectWindow.top);\r
326 \r
327         dc.FillSolidRect(rectWindow,::GetSysColor(COLOR_WINDOWTEXT));\r
328 }\r
329 \r
330 /*********************************************************************/\r
331 \r
332 void CACListWnd::OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags) \r
333 {\r
334         CWnd::OnKeyDown(nChar, nRepCnt, nFlags);\r
335 \r
336         if (nChar == VK_ESCAPE) \r
337                 ShowWindow(false);\r
338 }\r
339 \r
340 /*********************************************************************/\r
341 \r
342 void CACListWnd::OnNcCalcSize(BOOL /*bCalcValidRects*/, NCCALCSIZE_PARAMS FAR* lpncsp) \r
343 {\r
344         ::InflateRect(lpncsp->rgrc,\r
345                 -GetSystemMetrics(SM_CXBORDER), -GetSystemMetrics(SM_CYBORDER));\r
346 }\r
347 \r
348 /*********************************************************************/\r
349 \r
350 int CACListWnd::HitTest(CPoint point)\r
351 {\r
352         CRect rcItem;\r
353         CRect rcWnd;\r
354 \r
355         GetClientRect(rcWnd);\r
356         long width = rcWnd.Width() - ScrollBarWidth();\r
357 \r
358         for(int i = m_lTopIndex; i < m_lCount; i++)\r
359         {\r
360                 long y = i - m_lTopIndex;\r
361                 rcItem.SetRect(2,y*m_ItemHeight,width,(y+1)*m_ItemHeight);\r
362 \r
363                 if(PtInRect(&rcItem, point))\r
364                         return (m_lSelItem = (y+m_lTopIndex));\r
365         }\r
366 \r
367         return -1;\r
368 }\r
369 \r
370 /*********************************************************************/\r
371 \r
372 LRESULT CACListWnd::OnNcHitTest(CPoint point) \r
373 {\r
374         CRect rectClient;\r
375         GetWindowRect(rectClient);\r
376 \r
377         rectClient.left = rectClient.right - GetSystemMetrics(SM_CYVSCROLL);\r
378         rectClient.top = rectClient.bottom - GetSystemMetrics(SM_CXVSCROLL);\r
379 \r
380         if(rectClient.PtInRect(point))\r
381                 return HTBOTTOMRIGHT;\r
382         else\r
383                 return HTCLIENT;\r
384 }\r
385 \r
386 /*********************************************************************/\r
387 \r
388 void CACListWnd::OnLButtonDown(UINT nFlags, CPoint point) \r
389 {\r
390         CWnd::OnLButtonDown(nFlags, point);\r
391         int sel = HitTest(point);\r
392 \r
393         if(sel >= 0)\r
394         {\r
395                 if(!EnsureVisible(sel,true))\r
396                         Invalidate();\r
397                 m_lSelItem = sel;\r
398                 m_pEditParent->SendMessage(ENAC_UPDATE, WM_KEYDOWN, GetDlgCtrlID());\r
399                 DoPaintMessageLoop();\r
400                 Sleep(500);\r
401                 ShowWindow(false);\r
402         }\r
403         else\r
404         {\r
405                 CRect rc;\r
406                 GetClientRect(rc);\r
407                 if(!rc.PtInRect(point))\r
408                         ShowWindow(false);\r
409         }\r
410 }\r
411 \r
412 /*********************************************************************/\r
413 \r
414 void CACListWnd::OnRButtonDown(UINT nFlags, CPoint point) \r
415 {\r
416         CWnd::OnRButtonDown(nFlags, point);\r
417         ShowWindow(false);\r
418 }\r
419 \r
420 /*********************************************************************/\r
421 \r
422 BOOL CACListWnd::OnSetCursor(CWnd* pWnd, UINT nHitTest, UINT message) \r
423 {\r
424         CRect rectClient;\r
425         CPoint ptCursor;\r
426 \r
427         GetWindowRect(rectClient);\r
428         ScreenToClient(&rectClient);\r
429 \r
430         rectClient.left = rectClient.right - GetSystemMetrics(SM_CYVSCROLL);\r
431         rectClient.top = rectClient.bottom - GetSystemMetrics(SM_CXVSCROLL);\r
432 \r
433 \r
434         GetCursorPos(&ptCursor);\r
435         ScreenToClient(&ptCursor);\r
436 \r
437         if(rectClient.PtInRect(ptCursor)) // Vergrößerungs-Cursor\r
438         {\r
439                 return CWnd::OnSetCursor(pWnd, nHitTest, message);\r
440         }\r
441 \r
442         ::SetCursor(AfxGetApp()->LoadStandardCursor(IDC_ARROW));\r
443         return TRUE;            \r
444 }\r
445 \r
446 /*********************************************************************/\r
447 \r
448 void CACListWnd::InvalidateAndScroll()\r
449 {\r
450         m_VertBar.SetScrollPos(m_lTopIndex,true);\r
451         Invalidate();\r
452         DoPaintMessageLoop();\r
453 }\r
454 \r
455 /*********************************************************************/\r
456 \r
457 bool CACListWnd::EnsureVisible(int item, bool m_bWait)\r
458 {\r
459         if(item > m_lTopIndex && item < m_lTopIndex + m_VisibleItems)\r
460                 return false; // ist visible\r
461 \r
462         if(item > m_lTopIndex)  // scroll down\r
463         {\r
464                 long m_len = item;\r
465                 for(int i = m_lTopIndex; i < m_len; i++)\r
466                 {\r
467                         if(i >= m_lCount-m_VisibleItems)\r
468                                 break;\r
469                         if(i >= m_lCount-m_VisibleItems || i + m_VisibleItems > item)\r
470                         {\r
471                                 break;\r
472                         }\r
473 \r
474                         m_lTopIndex++;\r
475 \r
476                         if(m_bWait)\r
477                         {\r
478                                 InvalidateAndScroll();\r
479                                 Sleep(10);\r
480                                 DoPaintMessageLoop();\r
481                         }\r
482                 }\r
483                 InvalidateAndScroll();\r
484                 return true;\r
485         }\r
486 \r
487         if(item < m_lTopIndex)  // scroll up\r
488         {\r
489                 while(item < m_lTopIndex)\r
490                 {\r
491                         if(m_lTopIndex > 0)\r
492                                 m_lTopIndex--;\r
493                         else\r
494                         {\r
495                                 break;\r
496                         }\r
497 \r
498                         if(m_bWait)\r
499                         {\r
500                                 InvalidateAndScroll();\r
501                                 Sleep(10);\r
502                                 DoPaintMessageLoop();\r
503                         }\r
504                 }\r
505 \r
506                 InvalidateAndScroll();\r
507                 return true;\r
508         }\r
509 \r
510         return false;\r
511 }\r
512 \r
513 /*********************************************************************/\r
514 \r
515 bool CACListWnd::SelectItem(int item)\r
516 {\r
517         if(item > m_lCount)\r
518                 return false;\r
519 \r
520         if(item == -1)\r
521         {\r
522                 EnsureVisible(m_lSelItem,false);\r
523                 Invalidate();\r
524                 return false;\r
525         }\r
526 \r
527         m_lSelItem = item;\r
528 \r
529         if(!EnsureVisible(item,true))\r
530                 Invalidate();\r
531 \r
532         return true;\r
533 }\r
534 \r
535 /*********************************************************************/\r
536 \r
537 int CACListWnd::FindStringExact( int nStartAfter, LPCTSTR lpszString )\r
538 {\r
539         if(nStartAfter > m_SearchList.GetSize())\r
540                 return -1;\r
541 \r
542         for(int i = nStartAfter+1; i < m_SearchList.GetSize(); i++)\r
543                 if(m_SearchList.GetAt(i).Compare(lpszString) == 0)\r
544                         return i;\r
545         return -1;\r
546 }\r
547 \r
548 /*********************************************************************/\r
549 /*\r
550 ** Vers. 1.1\r
551 * NEW: m_bDisplayOnly\r
552 */\r
553 int CACListWnd::FindString(int nStartAfter, LPCTSTR lpszString, bool m_bDisplayOnly)\r
554 {\r
555         long m_AktCount = m_DisplayList.GetSize();\r
556 \r
557         if(!m_bDisplayOnly)\r
558         {\r
559                 CString m_Str1,m_Str2 = lpszString;\r
560                 if(!m_pEditParent)\r
561                 {\r
562                         ShowWindow(false);\r
563                         return -1;\r
564                 }\r
565 \r
566                 if(nStartAfter > m_SearchList.GetSize())\r
567                 {\r
568                         ShowWindow(false);\r
569                         return -1;\r
570                 }\r
571 \r
572                 if(m_Str2.IsEmpty())\r
573                 {\r
574                         ShowWindow(false);\r
575                         return -1;\r
576                 }\r
577 \r
578                 m_DisplayList.RemoveAll();\r
579 \r
580                 m_Str2.MakeUpper();\r
581 \r
582                 for(int i = nStartAfter+1; i < m_SearchList.GetSize(); i++)\r
583                 {\r
584                         if(m_PrefixChar)\r
585                                 m_Str1 = m_PrefixChar;\r
586                         else\r
587                                 m_Str1 = _T("");\r
588 \r
589                         m_Str1 += m_SearchList.GetAt(i);\r
590 \r
591                         m_Str1.MakeUpper();\r
592 \r
593                         if(m_lMode & _MODE_FIND_ALL_)\r
594                         {\r
595                                 if(m_Str1.Find(m_Str2) >= 0)\r
596                                 {\r
597                                         m_DisplayList.Add(m_SearchList.GetAt(i));\r
598                                 }\r
599                         }\r
600                         else  // _MODE_FIND_EXACT_\r
601                         {\r
602                                 if(m_Str1.Find(m_Str2) == 0)\r
603                                 {\r
604                                         m_DisplayList.Add(m_SearchList.GetAt(i));\r
605                                 }\r
606                         }\r
607                 }\r
608         }\r
609         m_lCount = m_DisplayList.GetSize();\r
610 \r
611         if(m_lCount)\r
612         {\r
613                 CRect rcWnd;\r
614                 int iHeight,iWight;\r
615 \r
616                 m_pEditParent->GetWindowRect(rcWnd);\r
617 \r
618                 SetScroller();\r
619                 SetProp();\r
620 \r
621                 ShowWindow(true);\r
622                 Invalidate();\r
623 \r
624                 iHeight = m_lCount*m_ItemHeight+(GetSystemMetrics(SM_CYBORDER)*2);\r
625 \r
626                 if(m_lCount > _MAX_ENTRYS_)\r
627                         iHeight = _MAX_ENTRYS_*m_ItemHeight+(GetSystemMetrics(SM_CYBORDER)*2);\r
628 \r
629                 if(!m_LastSize.IsRectEmpty())\r
630                 {\r
631                         iWight = m_LastSize.Width(); \r
632                         iHeight = m_LastSize.Height(); \r
633                         rcWnd.top += rcWnd.Height();\r
634                         rcWnd.right = rcWnd.left+iWight;\r
635                         rcWnd.bottom = rcWnd.top+iHeight;\r
636 \r
637                         SetWindowPos(&CWnd::wndTopMost, rcWnd.left,\r
638                                 rcWnd.top,\r
639                                 rcWnd.Width(), \r
640                                 rcWnd.Height(), 0);\r
641                 }\r
642                 else\r
643                 {\r
644                         SetWindowPos(&CWnd::wndTopMost, rcWnd.left,\r
645                                 rcWnd.top + rcWnd.Height(), \r
646                                 rcWnd.Width(), \r
647                                 iHeight, 0);\r
648                 }\r
649 \r
650                 if(m_AktCount != m_DisplayList.GetSize())\r
651                         m_lSelItem = -1;\r
652 \r
653                 SortList(m_DisplayList);\r
654         }\r
655         else\r
656         {\r
657                 ShowWindow(false);\r
658         }\r
659 \r
660         return 1;       \r
661 }\r
662 \r
663 /*********************************************************************/\r
664 \r
665 int CACListWnd::SelectString(LPCTSTR lpszString )\r
666 {\r
667         int item = FindString(-1, lpszString);\r
668         SelectItem(item);\r
669         return item;\r
670 }\r
671 \r
672 /*********************************************************************/\r
673 \r
674 bool CACListWnd::GetText(int item, CString& m_Text)\r
675 {\r
676         if(item < 0 || item > m_SearchList.GetSize())\r
677                 return false;\r
678         m_Text = m_SearchList.GetAt(item);\r
679         return true;\r
680 }\r
681 \r
682 /*********************************************************************/\r
683 \r
684 void CACListWnd::OnShowWindow(BOOL bShow, UINT nStatus) \r
685 {\r
686         if(bShow)\r
687         {\r
688                 m_nIDTimer =  SetTimer( IDTimerInstall, 200, NULL);\r
689                 m_pEditParent->GetParent()->GetWindowRect(m_ParentRect);\r
690         }\r
691         else\r
692         {\r
693                 if(m_nIDTimer)\r
694                         KillTimer(IDTimerInstall);\r
695                 m_nIDTimer = 0;\r
696                 m_lSelItem = -1;\r
697                 m_lTopIndex = 0;\r
698         }\r
699 \r
700         CWnd::OnShowWindow(bShow, nStatus);\r
701         ::SetCursor(AfxGetApp()->LoadStandardCursor(IDC_ARROW));\r
702 }\r
703 \r
704 /*********************************************************************/\r
705 \r
706 void CACListWnd::OnNcLButtonDown(UINT nHitTest, CPoint point) \r
707 {\r
708 \r
709         if(OnNcHitTest(point) == HTBOTTOMRIGHT)\r
710                 GetWindowRect(m_LastSize);      \r
711         CWnd::OnNcLButtonDown(nHitTest, point);\r
712 }\r
713 \r
714 /*********************************************************************/\r
715 \r
716 CString CACListWnd::GetString()\r
717 {\r
718         int i = m_DisplayList.GetSize();\r
719 \r
720         if(!i)\r
721                 return _T("");\r
722         if(i <= m_lSelItem || m_lSelItem == -1)\r
723                 i = 0;\r
724         else\r
725                 i = m_lSelItem;\r
726 \r
727         return m_DisplayList.GetAt(i);\r
728 }\r
729 \r
730 /*********************************************************************/\r
731 \r
732 void CACListWnd::OnVScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar) \r
733 {\r
734         CWnd::OnVScroll(nSBCode, nPos, pScrollBar);\r
735         long m_oldlTopIndex = m_lTopIndex;\r
736 \r
737         switch(nSBCode)\r
738         {\r
739         case SB_ENDSCROLL:\r
740                 break;\r
741 \r
742         case SB_PAGEUP:\r
743                 m_lTopIndex -= m_VisibleItems;\r
744                 if(m_lTopIndex < 0)\r
745                         m_lTopIndex = 0;\r
746                 break;\r
747 \r
748         case SB_PAGEDOWN:\r
749                 m_lTopIndex += m_VisibleItems;\r
750                 if(m_lTopIndex >= m_lCount-m_VisibleItems)\r
751                         m_lTopIndex = m_lCount-m_VisibleItems;\r
752                 break;\r
753 \r
754         case SB_LINEUP:\r
755                 m_lTopIndex--;\r
756                 if(m_lTopIndex < 0)\r
757                         m_lTopIndex = 0;\r
758                 break;\r
759 \r
760         case SB_LINEDOWN:\r
761                 m_lTopIndex++;\r
762                 if(m_lTopIndex >= m_lCount-m_VisibleItems)\r
763                         m_lTopIndex = m_lCount-m_VisibleItems;\r
764                 break;\r
765 \r
766         case SB_THUMBTRACK:\r
767                 m_lTopIndex = nPos;\r
768                 break;\r
769         }\r
770 \r
771         m_VertBar.SetScrollPos(m_lTopIndex,true);\r
772 \r
773         if(m_oldlTopIndex != m_lTopIndex)\r
774                 Invalidate();\r
775 }\r
776 \r
777 /*********************************************************************/\r
778 \r
779 CString CACListWnd::GetNextString(int nChar)\r
780 {\r
781         switch(nChar)\r
782         {\r
783         case VK_DOWN:\r
784                 m_lSelItem++;\r
785                 break;\r
786 \r
787         case VK_UP:\r
788                 m_lSelItem--;\r
789                 break;\r
790 \r
791         case VK_PRIOR:\r
792                 m_lSelItem -= m_VisibleItems;\r
793                 if(m_lSelItem < 0)\r
794                         m_lSelItem = 0;\r
795                 break;\r
796 \r
797         case VK_NEXT:\r
798                 m_lSelItem += m_VisibleItems;\r
799                 if(m_lSelItem >= m_lCount-1)\r
800                         m_lSelItem = m_lCount-1;\r
801                 break;\r
802 \r
803         case VK_HOME:\r
804                 m_lSelItem = 0;\r
805                 break;\r
806 \r
807         case VK_END:\r
808                 m_lSelItem = m_lCount-1;\r
809                 break;\r
810         }\r
811 \r
812         if(m_lSelItem < 0)\r
813                 m_lSelItem = m_lCount-1;\r
814 \r
815         if(m_lSelItem >= m_lCount)\r
816                 m_lSelItem = 0;\r
817 \r
818         if(EnsureVisible(m_lSelItem,(m_lCount > 50) ? false : true))\r
819                 InvalidateAndScroll();\r
820 \r
821         return GetString();\r
822 }\r
823 \r
824 /*********************************************************************/\r
825 \r
826 void CACListWnd::OnMouseMove(UINT nFlags, CPoint point) \r
827 {\r
828         CWnd::OnMouseMove(nFlags, point);\r
829         int sel = HitTest(point);\r
830         if(sel >= 0)\r
831         {\r
832                 Invalidate();\r
833         }\r
834 }\r
835 \r
836 /*********************************************************************/\r
837 \r
838 void CACListWnd::OnTimer(UINT nIDEvent) \r
839 {\r
840         CWnd::OnTimer(nIDEvent);\r
841 \r
842         CRect m_ParentRect1;\r
843         m_pEditParent->GetParent()->GetWindowRect(m_ParentRect1);\r
844         if(!m_ParentRect1.EqualRect(m_ParentRect))\r
845                 ShowWindow(false);\r
846 }\r
847 \r
848 /*********************************************************************/\r
849 \r
850 void CACListWnd::OnGetMinMaxInfo(MINMAXINFO FAR* lpMMI) \r
851 {\r
852         if(GetSafeHwnd())\r
853         {\r
854                 // Vers. 1.2\r
855                 long m_lMinY1 = GetSystemMetrics(SM_CYHSCROLL)*2 + GetSystemMetrics(SM_CYSIZEFRAME) + GetSystemMetrics(SM_CXHTHUMB),\r
856                         m_lMinY2 = m_lCount * m_ItemHeight + (GetSystemMetrics(SM_CYBORDER)*2);\r
857 \r
858                 if(m_VisibleItems > m_lCount-1 &&  m_lMinY2 < m_lMinY1)\r
859                         lpMMI->ptMinTrackSize.y = m_lMinY2;\r
860                 else\r
861                         lpMMI->ptMinTrackSize.y = m_lMinY1;\r
862                 //---------\r
863 \r
864                 lpMMI->ptMinTrackSize.x = GetSystemMetrics(SM_CXHSCROLL)*4;\r
865 \r
866 \r
867                 // Vers. 1.2\r
868                 if(m_pEditParent != NULL) \r
869                 {\r
870                         RECT rc;\r
871                         m_pEditParent->GetWindowRect (&rc);\r
872                         lpMMI->ptMinTrackSize.x = rc.right - rc.left;\r
873                 }\r
874         }\r
875         else    \r
876                 CWnd::OnGetMinMaxInfo(lpMMI);\r
877 }\r
878 \r
879 /*********************************************************************/\r
880 \r
881 int CACListWnd::CompareString(const void* p1, const void* p2)\r
882 {\r
883         return _stricmp( * ( char** ) p1, * ( char** ) p2 );\r
884 }\r
885 \r
886 /*********************************************************************/\r
887 \r
888 void CACListWnd::SortList(CStringArray& m_List)\r
889 {\r
890         int m_Count = m_List.GetSize();\r
891         int i;\r
892 \r
893         if (m_Count > 1)\r
894         {\r
895                 CStringArray m_Liste1;\r
896                 m_Liste1.Copy(m_List);\r
897 \r
898                 LPCTSTR* ppSortArray = new LPCTSTR[m_Count+1];\r
899 \r
900 \r
901                 for(i=0; i < m_Count; i++)\r
902                 {\r
903                         ppSortArray[i] = (LPCTSTR)m_Liste1.GetAt(i);\r
904                 }\r
905 \r
906                 m_List.RemoveAll();\r
907 \r
908                 qsort(ppSortArray, m_Count, sizeof(LPCTSTR), CompareString);\r
909 \r
910                 for(i=0; i < m_Count; i++)\r
911                 {\r
912                         m_List.Add((LPCTSTR) ppSortArray[i]);\r
913                 }\r
914                 m_Liste1.RemoveAll();\r
915                 delete [] ppSortArray;\r
916         }\r
917 }\r
918 \r
919 /*********************************************************************/\r
920 /*\r
921 ** Vers. 1.1\r
922 ** NEW: CopyList()\r
923 */\r
924 void CACListWnd::CopyList()\r
925 {\r
926         m_DisplayList.Copy(m_SearchList);\r
927         m_lCount = m_DisplayList.GetSize();\r
928         if(m_lCount)\r
929                 FindString(0,_T(""),true);\r
930 }\r
931 \r
932 /*********************************************************************/\r
933 \r