Update editorconfig
[TortoiseGit.git] / src / Utils / ACListWnd.cpp
blob5791eee4623f6805180511d8564faf47eba8039b
1 // TortoiseGit - a Windows shell extension for easy version control
3 // Copyright (c) 2003 by Andreas Kapust <info@akinstaller.de>; <http://www.codeproject.com/Articles/2607/AutoComplete-without-IAutoComplete>
4 // Copyright (C) 2009, 2012-2013, 2015-2016 - TortoiseGit
6 // Licensed under: The Code Project Open License (CPOL); <http://www.codeproject.com/info/cpol10.aspx>
8 // ACWnd.cpp: Implementierungsdatei
9 //
11 #include "stdafx.h"
12 #include "ACListWnd.h"
14 #ifdef _DEBUG
15 #define new DEBUG_NEW
16 #undef THIS_FILE
17 static char THIS_FILE[] = __FILE__;
18 #endif
20 static UINT auIDStatusBar[] =
22 ID_SEPARATOR
25 #define _MAX_ENTRYS_ 8
26 #define _MODE_FIND_ALL_ (1L << 5)
28 /////////////////////////////////////////////////////////////////////////////
29 // CACListWnd
31 void DoPaintMessageLoop()
33 MSG message1;
34 while (::PeekMessage(&message1, nullptr, WM_PAINT, WM_PAINT, PM_REMOVE))
36 ::TranslateMessage(&message1);
37 ::DispatchMessage(&message1);
41 /**********************************************************************/
43 CACListWnd::CACListWnd()
45 m_lTopIndex = 0;
46 m_lCount = 0;
47 m_ItemHeight = 16;
48 m_lSelItem = -1;
49 m_VisibleItems = 0;
50 m_pEditParent = nullptr;
51 m_LastSize.SetRectEmpty();
52 m_PrefixChar = 0;
53 m_lMode = 0;
54 pFontDC = nullptr;
55 m_nIDTimer = 0;
56 SecureZeroMemory(&logfont, sizeof(LOGFONT));
59 /**********************************************************************/
61 CACListWnd::~CACListWnd()
63 m_SearchList.RemoveAll();
64 m_DisplayList.RemoveAll();
65 DestroyWindow();
68 /*********************************************************************/
70 void CACListWnd::OnActivateApp(BOOL bActive, DWORD dwThreadID)
72 #if (_MSC_VER >= 1300)
73 CWnd::OnActivateApp(bActive, dwThreadID); //vc7 FIX 1.2
74 #else
75 CWnd::OnActivateApp(bActive, (HTASK)dwThreadID); //vc6 FIX 1.2
76 #endif
78 ShowWindow(false);
82 BEGIN_MESSAGE_MAP(CACListWnd, CWnd)
83 //{{AFX_MSG_MAP(CACListWnd)
84 ON_WM_PAINT()
85 ON_WM_SIZE()
86 ON_WM_ERASEBKGND()
87 ON_WM_NCPAINT()
88 ON_WM_KEYDOWN()
89 ON_WM_NCCALCSIZE()
90 ON_WM_VSCROLL()
91 ON_WM_ACTIVATEAPP()
92 ON_WM_NCHITTEST()
93 ON_WM_LBUTTONDOWN()
94 ON_WM_RBUTTONDOWN()
95 ON_WM_SETCURSOR()
96 ON_WM_SHOWWINDOW()
97 ON_WM_NCLBUTTONDOWN()
98 ON_WM_MOUSEMOVE()
99 ON_WM_TIMER()
100 ON_WM_GETMINMAXINFO()
101 //}}AFX_MSG_MAP
102 END_MESSAGE_MAP()
105 /////////////////////////////////////////////////////////////////////////////
106 // Behandlungsroutinen für Nachrichten CACListWnd
108 void CACListWnd::DrawItem(CDC* pDC,long m_lItem,long width)
110 long y = m_lItem - m_lTopIndex;
111 CRect rcLabel(2,y*m_ItemHeight,width,(y+1)*m_ItemHeight);
113 pDC->SetTextColor(::GetSysColor(COLOR_WINDOWTEXT));
115 if(m_lItem == m_lSelItem)
117 rcLabel.left = 0;
118 pDC->FillSolidRect(rcLabel,::GetSysColor(COLOR_HIGHLIGHT));
119 pDC->SetTextColor(::GetSysColor(COLOR_HIGHLIGHTTEXT));
120 rcLabel.left = 2;
123 if(m_PrefixChar)
124 m_DisplayStr = m_PrefixChar + m_DisplayList.GetAt(m_lItem);
125 else
126 m_DisplayStr = m_DisplayList.GetAt(m_lItem);
128 pDC->DrawText(m_DisplayStr, -1, rcLabel, DT_LEFT | DT_SINGLELINE |
129 DT_NOPREFIX | DT_VCENTER | DT_END_ELLIPSIS);
132 /*********************************************************************/
134 void CACListWnd::OnPaint()
136 CPaintDC dc(this);
137 CRect rcWnd,m_rect, rc;
138 CDC MemDC, *pDC = nullptr;
139 CBitmap m_bitmap, *m_pOldBitmap;
140 int i;
142 GetClientRect(rc);
143 rcWnd = m_rect = rc;
145 rc.left = rc.right-GetSystemMetrics(SM_CXHSCROLL);
146 rc.top = rc.bottom-GetSystemMetrics(SM_CYVSCROLL);
148 m_rect.right -= ScrollBarWidth();
150 MemDC.CreateCompatibleDC(&dc);
152 m_bitmap.CreateCompatibleBitmap(&dc, m_rect.Width(), m_rect.Height());
153 m_pOldBitmap = MemDC.SelectObject(&m_bitmap);
155 MemDC.SetWindowOrg(m_rect.left, m_rect.top);
157 long width = rcWnd.Width() - ScrollBarWidth();
159 MemDC.FillSolidRect(rcWnd,::GetSysColor(COLOR_WINDOW));
160 MemDC.SelectObject(GetStockObject(DEFAULT_GUI_FONT));
161 MemDC.SetBkMode(TRANSPARENT);
163 for(i = m_lTopIndex; i < m_lCount;i++)
165 DrawItem(&MemDC,i,width);
169 CPen m_Pen1(PS_SOLID, 1, ::GetSysColor(COLOR_WINDOW));
170 CPen m_Pen2(PS_SOLID, 1, ::GetSysColor(COLOR_BTNFACE));
171 CPen m_Pen3(PS_SOLID, 1, ::GetSysColor(COLOR_3DSHADOW));
173 pDC = &dc;
175 if(m_VertBar.IsWindowVisible())
176 dc.FillSolidRect(rc, ::GetSysColor(COLOR_BTNFACE) );
177 else
178 pDC = &MemDC;
180 CPen *pOldPen = (CPen*)pDC->SelectObject(&m_Pen1);
181 int a = 1,bottom;
183 width = GetSystemMetrics(SM_CXHSCROLL);
184 bottom = (rcWnd.bottom-GetSystemMetrics(SM_CXHSCROLL))-1;
186 //gripper
187 for( i = 0; i < 20 ;i++,a++)
189 if(a==1)
190 pDC->SelectObject(&m_Pen1);
191 if(a==2)
192 pDC->SelectObject(&m_Pen2);
193 if(a==3)
194 pDC->SelectObject(&m_Pen3);
195 if(a > 3)
196 a = 0;
198 pDC->MoveTo(rc.left + i - 1, rcWnd.bottom);
199 pDC->LineTo(rc.left + i + width, bottom);
202 dc.BitBlt(m_rect.left, m_rect.top, m_rect.Width(), m_rect.Height(),
203 &MemDC, m_rect.left, m_rect.top, SRCCOPY);
205 pDC->SelectObject( pOldPen );
206 MemDC.SelectObject(m_pOldBitmap);
209 /*********************************************************************/
211 void CACListWnd::Init(CWnd *pWnd)
213 VERIFY(m_VertBar.Create(WS_VISIBLE|SBS_VERT|SBS_LEFTALIGN,
214 CRect(0,0,GetSystemMetrics(SM_CYVSCROLL),100),this,0));
216 SetScroller();
217 m_pEditParent = (CEdit*)pWnd;
219 m_lCount = (long)m_DisplayList.GetSize();
220 m_VertBar.SetScrollPos(0,false);
221 SetProp();
223 CDC *m_pDC;
224 m_pDC = GetDC();
225 if(m_pDC)
227 m_pDC->SelectObject(GetStockObject(DEFAULT_GUI_FONT));
228 CSize m_Size = m_pDC->GetOutputTextExtent(_T("Hg"));
229 m_ItemHeight = m_Size.cy;
230 ReleaseDC(m_pDC);
234 /*********************************************************************/
236 void CACListWnd::SetScroller()
238 CRect rcWnd,rcBar;
239 GetClientRect(rcWnd);
241 if(m_VertBar.GetSafeHwnd())
243 rcBar = rcWnd;
244 rcBar.top=-1;
245 rcBar.left = (rcWnd.Width()-GetSystemMetrics(SM_CYVSCROLL));
246 rcBar.bottom-= GetSystemMetrics(SM_CYHSCROLL);
247 m_VertBar.MoveWindow(rcBar);
248 rcBar.top = rcWnd.bottom-20;
249 rcBar.bottom = rcWnd.bottom;
251 m_VertBar.SetScrollPos(m_lTopIndex,true);
255 /*********************************************************************/
257 void CACListWnd::OnSize(UINT nType, int cx, int cy)
259 CWnd::OnSize(nType, cx, cy);
260 SetScroller();
261 SetProp();
263 if(!m_LastSize.IsRectEmpty())
264 GetWindowRect(m_LastSize);
267 /*********************************************************************/
269 long CACListWnd::ScrollBarWidth()
271 if(m_VertBar.IsWindowVisible())
272 return GetSystemMetrics(SM_CYVSCROLL);
273 else
274 return 0;
277 /*********************************************************************/
279 void CACListWnd::SetProp()
281 CRect rcWnd,rcBar;
283 if(!m_lCount)
284 return;
286 CWnd::GetWindowRect(rcWnd);
287 ScreenToClient(rcWnd);
289 SCROLLINFO si;
290 si.cbSize = sizeof(SCROLLINFO);
291 si.fMask = SIF_PAGE|SIF_RANGE;
292 si.nMin = 0;
293 si.nMax = m_lCount-1;
294 m_VisibleItems = si.nPage = rcWnd.Height()/m_ItemHeight;
295 si.nTrackPos = 2;
296 m_VertBar.SetScrollRange(0,m_lCount-1);
297 m_VertBar.SetScrollInfo(&si);
299 if(m_VisibleItems > m_lCount-1)
300 m_VertBar.ShowWindow(false);
301 else
302 m_VertBar.ShowWindow(true);
304 if(m_lTopIndex+m_VisibleItems > m_lCount)
306 m_lTopIndex = m_lCount-m_VisibleItems;
307 if(m_lTopIndex < 0)
308 m_lTopIndex = 0;
309 m_VertBar.SetScrollPos(m_lTopIndex,true);
313 /*********************************************************************/
315 BOOL CACListWnd::OnEraseBkgnd(CDC* /*pDC*/)
317 return false;
320 /*********************************************************************/
322 void CACListWnd::OnNcPaint()
324 CWindowDC dc(this);
325 CRect rectClient, rectWindow,rcWnd;
327 GetClientRect(rectClient);
328 GetWindowRect(rectWindow);
329 ScreenToClient(rectWindow);
331 rectClient.OffsetRect(-(rectWindow.left), -(rectWindow.top));
332 dc.ExcludeClipRect(rectClient);
334 rectWindow.OffsetRect(-rectWindow.left, -rectWindow.top);
336 dc.FillSolidRect(rectWindow,::GetSysColor(COLOR_WINDOWTEXT));
339 /*********************************************************************/
341 void CACListWnd::OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags)
343 CWnd::OnKeyDown(nChar, nRepCnt, nFlags);
345 if (nChar == VK_ESCAPE)
346 ShowWindow(false);
349 /*********************************************************************/
351 void CACListWnd::OnNcCalcSize(BOOL /*bCalcValidRects*/, NCCALCSIZE_PARAMS FAR* lpncsp)
353 ::InflateRect(lpncsp->rgrc,
354 -GetSystemMetrics(SM_CXBORDER), -GetSystemMetrics(SM_CYBORDER));
357 /*********************************************************************/
359 int CACListWnd::HitTest(CPoint point)
361 CRect rcItem;
362 CRect rcWnd;
364 GetClientRect(rcWnd);
365 long width = rcWnd.Width() - ScrollBarWidth();
367 for(int i = m_lTopIndex; i < m_lCount; i++)
369 long y = i - m_lTopIndex;
370 rcItem.SetRect(2,y*m_ItemHeight,width,(y+1)*m_ItemHeight);
372 if(PtInRect(&rcItem, point))
373 return (m_lSelItem = (y+m_lTopIndex));
376 return -1;
379 /*********************************************************************/
381 LRESULT CACListWnd::OnNcHitTest(CPoint point)
383 CRect rectClient;
384 GetWindowRect(rectClient);
386 rectClient.left = rectClient.right - GetSystemMetrics(SM_CYVSCROLL);
387 rectClient.top = rectClient.bottom - GetSystemMetrics(SM_CXVSCROLL);
389 if(rectClient.PtInRect(point))
390 return HTBOTTOMRIGHT;
391 else
392 return HTCLIENT;
395 /*********************************************************************/
397 void CACListWnd::OnLButtonDown(UINT nFlags, CPoint point)
399 CWnd::OnLButtonDown(nFlags, point);
400 int sel = HitTest(point);
402 if(sel >= 0)
404 if(!EnsureVisible(sel,true))
405 Invalidate();
406 m_lSelItem = sel;
407 m_pEditParent->SendMessage(ENAC_UPDATE, WM_KEYDOWN, GetDlgCtrlID());
408 DoPaintMessageLoop();
409 Sleep(500);
410 ShowWindow(false);
412 else
414 CRect rc;
415 GetClientRect(rc);
416 if(!rc.PtInRect(point))
417 ShowWindow(false);
421 /*********************************************************************/
423 void CACListWnd::OnRButtonDown(UINT nFlags, CPoint point)
425 CWnd::OnRButtonDown(nFlags, point);
426 ShowWindow(false);
429 /*********************************************************************/
431 BOOL CACListWnd::OnSetCursor(CWnd* pWnd, UINT nHitTest, UINT message)
433 CRect rectClient;
434 CPoint ptCursor;
436 GetWindowRect(rectClient);
437 ScreenToClient(&rectClient);
439 rectClient.left = rectClient.right - GetSystemMetrics(SM_CYVSCROLL);
440 rectClient.top = rectClient.bottom - GetSystemMetrics(SM_CXVSCROLL);
443 GetCursorPos(&ptCursor);
444 ScreenToClient(&ptCursor);
446 if(rectClient.PtInRect(ptCursor)) // Vergrößerungs-Cursor
448 return CWnd::OnSetCursor(pWnd, nHitTest, message);
451 ::SetCursor(AfxGetApp()->LoadStandardCursor(IDC_ARROW));
452 return TRUE;
455 /*********************************************************************/
457 void CACListWnd::InvalidateAndScroll()
459 m_VertBar.SetScrollPos(m_lTopIndex,true);
460 Invalidate();
461 DoPaintMessageLoop();
464 /*********************************************************************/
466 bool CACListWnd::EnsureVisible(int item, bool m_bWait)
468 if(item > m_lTopIndex && item < m_lTopIndex + m_VisibleItems)
469 return false; // ist visible
471 if(item > m_lTopIndex) // scroll down
473 long m_len = item;
474 for(int i = m_lTopIndex; i < m_len; i++)
476 if(i >= m_lCount-m_VisibleItems)
477 break;
478 if(i >= m_lCount-m_VisibleItems || i + m_VisibleItems > item)
480 break;
483 m_lTopIndex++;
485 if(m_bWait)
487 InvalidateAndScroll();
488 Sleep(10);
489 DoPaintMessageLoop();
492 InvalidateAndScroll();
493 return true;
496 if(item < m_lTopIndex) // scroll up
498 while(item < m_lTopIndex)
500 if(m_lTopIndex > 0)
501 m_lTopIndex--;
502 else
504 break;
507 if(m_bWait)
509 InvalidateAndScroll();
510 Sleep(10);
511 DoPaintMessageLoop();
515 InvalidateAndScroll();
516 return true;
519 return false;
522 /*********************************************************************/
524 bool CACListWnd::SelectItem(int item)
526 if(item > m_lCount)
527 return false;
529 if(item == -1)
531 EnsureVisible(m_lSelItem,false);
532 Invalidate();
533 return false;
536 m_lSelItem = item;
538 if(!EnsureVisible(item,true))
539 Invalidate();
541 return true;
544 /*********************************************************************/
546 int CACListWnd::FindStringExact( int nStartAfter, LPCTSTR lpszString )
548 if(nStartAfter > m_SearchList.GetSize())
549 return -1;
551 for(int i = nStartAfter+1; i < m_SearchList.GetSize(); i++)
552 if(m_SearchList.GetAt(i).Compare(lpszString) == 0)
553 return i;
554 return -1;
557 /*********************************************************************/
559 ** Vers. 1.1
560 * NEW: m_bDisplayOnly
562 int CACListWnd::FindString(int nStartAfter, LPCTSTR lpszString, bool m_bDisplayOnly)
564 long m_AktCount = (long)m_DisplayList.GetSize();
566 if(!m_bDisplayOnly)
568 CString m_Str1,m_Str2 = lpszString;
569 if(!m_pEditParent)
571 ShowWindow(false);
572 return -1;
575 if(nStartAfter > m_SearchList.GetSize())
577 ShowWindow(false);
578 return -1;
581 if(m_Str2.IsEmpty())
583 ShowWindow(false);
584 return -1;
587 m_DisplayList.RemoveAll();
589 m_Str2.MakeUpper();
591 for(int i = nStartAfter+1; i < m_SearchList.GetSize(); i++)
593 if(m_PrefixChar)
594 m_Str1 = m_PrefixChar;
595 else
596 m_Str1.Empty();
598 m_Str1 += m_SearchList.GetAt(i);
600 m_Str1.MakeUpper();
602 if(m_lMode & _MODE_FIND_ALL_)
604 if(m_Str1.Find(m_Str2) >= 0)
606 m_DisplayList.Add(m_SearchList.GetAt(i));
609 else // _MODE_FIND_EXACT_
611 if(m_Str1.Find(m_Str2) == 0)
613 m_DisplayList.Add(m_SearchList.GetAt(i));
618 m_lCount = (long)m_DisplayList.GetSize();
620 if(m_lCount)
622 CRect rcWnd;
623 int iHeight,iWight;
625 m_pEditParent->GetWindowRect(rcWnd);
627 SetScroller();
628 SetProp();
630 ShowWindow(true);
631 Invalidate();
633 iHeight = m_lCount*m_ItemHeight+(GetSystemMetrics(SM_CYBORDER)*2);
635 if(m_lCount > _MAX_ENTRYS_)
636 iHeight = _MAX_ENTRYS_*m_ItemHeight+(GetSystemMetrics(SM_CYBORDER)*2);
638 if(!m_LastSize.IsRectEmpty())
640 iWight = m_LastSize.Width();
641 iHeight = m_LastSize.Height();
642 rcWnd.top += rcWnd.Height();
643 rcWnd.right = rcWnd.left+iWight;
644 rcWnd.bottom = rcWnd.top+iHeight;
646 SetWindowPos(&CWnd::wndTopMost, rcWnd.left,
647 rcWnd.top,
648 rcWnd.Width(),
649 rcWnd.Height(), 0);
651 else
653 SetWindowPos(&CWnd::wndTopMost, rcWnd.left,
654 rcWnd.top + rcWnd.Height(),
655 rcWnd.Width(),
656 iHeight, 0);
659 if(m_AktCount != m_DisplayList.GetSize())
660 m_lSelItem = -1;
662 SortList(m_DisplayList);
664 else
666 ShowWindow(false);
669 return 1;
672 /*********************************************************************/
674 int CACListWnd::SelectString(LPCTSTR lpszString )
676 int item = FindString(-1, lpszString);
677 SelectItem(item);
678 return item;
681 /*********************************************************************/
683 bool CACListWnd::GetText(int item, CString& m_Text)
685 if(item < 0 || item > m_SearchList.GetSize())
686 return false;
687 m_Text = m_SearchList.GetAt(item);
688 return true;
691 /*********************************************************************/
693 void CACListWnd::OnShowWindow(BOOL bShow, UINT nStatus)
695 if(bShow)
697 m_nIDTimer = (long)SetTimer(IDTimerInstall, 200, nullptr);
698 m_pEditParent->GetParent()->GetWindowRect(m_ParentRect);
700 else
702 if(m_nIDTimer)
703 KillTimer(IDTimerInstall);
704 m_nIDTimer = 0;
705 m_lSelItem = -1;
706 m_lTopIndex = 0;
709 CWnd::OnShowWindow(bShow, nStatus);
710 ::SetCursor(AfxGetApp()->LoadStandardCursor(IDC_ARROW));
713 /*********************************************************************/
715 void CACListWnd::OnNcLButtonDown(UINT nHitTest, CPoint point)
717 if(OnNcHitTest(point) == HTBOTTOMRIGHT)
718 GetWindowRect(m_LastSize);
719 CWnd::OnNcLButtonDown(nHitTest, point);
722 /*********************************************************************/
724 CString CACListWnd::GetString()
726 int i = (int)m_DisplayList.GetSize();
728 if(!i)
729 return _T("");
730 if(i <= m_lSelItem || m_lSelItem == -1)
731 i = 0;
732 else
733 i = m_lSelItem;
735 return m_DisplayList.GetAt(i);
738 /*********************************************************************/
740 void CACListWnd::OnVScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar)
742 CWnd::OnVScroll(nSBCode, nPos, pScrollBar);
743 long m_oldlTopIndex = m_lTopIndex;
745 switch(nSBCode)
747 case SB_ENDSCROLL:
748 break;
750 case SB_PAGEUP:
751 m_lTopIndex -= m_VisibleItems;
752 if(m_lTopIndex < 0)
753 m_lTopIndex = 0;
754 break;
756 case SB_PAGEDOWN:
757 m_lTopIndex += m_VisibleItems;
758 if(m_lTopIndex >= m_lCount-m_VisibleItems)
759 m_lTopIndex = m_lCount-m_VisibleItems;
760 break;
762 case SB_LINEUP:
763 m_lTopIndex--;
764 if(m_lTopIndex < 0)
765 m_lTopIndex = 0;
766 break;
768 case SB_LINEDOWN:
769 m_lTopIndex++;
770 if(m_lTopIndex >= m_lCount-m_VisibleItems)
771 m_lTopIndex = m_lCount-m_VisibleItems;
772 break;
774 case SB_THUMBTRACK:
775 m_lTopIndex = nPos;
776 break;
779 m_VertBar.SetScrollPos(m_lTopIndex,true);
781 if(m_oldlTopIndex != m_lTopIndex)
782 Invalidate();
785 /*********************************************************************/
787 CString CACListWnd::GetNextString(int nChar)
789 switch(nChar)
791 case VK_DOWN:
792 m_lSelItem++;
793 break;
795 case VK_UP:
796 m_lSelItem--;
797 break;
799 case VK_PRIOR:
800 m_lSelItem -= m_VisibleItems;
801 if(m_lSelItem < 0)
802 m_lSelItem = 0;
803 break;
805 case VK_NEXT:
806 m_lSelItem += m_VisibleItems;
807 if(m_lSelItem >= m_lCount-1)
808 m_lSelItem = m_lCount-1;
809 break;
811 case VK_HOME:
812 m_lSelItem = 0;
813 break;
815 case VK_END:
816 m_lSelItem = m_lCount-1;
817 break;
820 if(m_lSelItem < 0)
821 m_lSelItem = m_lCount-1;
823 if(m_lSelItem >= m_lCount)
824 m_lSelItem = 0;
826 if(EnsureVisible(m_lSelItem,(m_lCount > 50) ? false : true))
827 InvalidateAndScroll();
829 return GetString();
832 /*********************************************************************/
834 void CACListWnd::OnMouseMove(UINT nFlags, CPoint point)
836 CWnd::OnMouseMove(nFlags, point);
837 int sel = HitTest(point);
838 if(sel >= 0)
840 Invalidate();
844 /*********************************************************************/
846 void CACListWnd::OnTimer(UINT_PTR nIDEvent)
848 CWnd::OnTimer(nIDEvent);
850 CRect m_ParentRect1;
851 m_pEditParent->GetParent()->GetWindowRect(m_ParentRect1);
852 if(!m_ParentRect1.EqualRect(m_ParentRect))
853 ShowWindow(false);
856 /*********************************************************************/
858 void CACListWnd::OnGetMinMaxInfo(MINMAXINFO FAR* lpMMI)
860 if(GetSafeHwnd())
862 // Vers. 1.2
863 long m_lMinY1 = GetSystemMetrics(SM_CYHSCROLL)*2 + GetSystemMetrics(SM_CYSIZEFRAME) + GetSystemMetrics(SM_CXHTHUMB),
864 m_lMinY2 = m_lCount * m_ItemHeight + (GetSystemMetrics(SM_CYBORDER)*2);
866 if(m_VisibleItems > m_lCount-1 && m_lMinY2 < m_lMinY1)
867 lpMMI->ptMinTrackSize.y = m_lMinY2;
868 else
869 lpMMI->ptMinTrackSize.y = m_lMinY1;
870 //---------
872 lpMMI->ptMinTrackSize.x = GetSystemMetrics(SM_CXHSCROLL)*4;
875 // Vers. 1.2
876 if (m_pEditParent)
878 RECT rc;
879 m_pEditParent->GetWindowRect (&rc);
880 lpMMI->ptMinTrackSize.x = rc.right - rc.left;
883 else
884 CWnd::OnGetMinMaxInfo(lpMMI);
887 /*********************************************************************/
889 int CACListWnd::CompareString(const void* p1, const void* p2)
891 return _stricmp( * ( char** ) p1, * ( char** ) p2 );
894 /*********************************************************************/
896 void CACListWnd::SortList(CStringArray& list)
898 int m_Count = (int)list.GetSize();
899 int i;
901 if (m_Count > 1)
903 CStringArray m_Liste1;
904 m_Liste1.Copy(list);
906 LPCTSTR* ppSortArray = new LPCTSTR[m_Count+1];
909 for(i=0; i < m_Count; i++)
911 ppSortArray[i] = (LPCTSTR)m_Liste1.GetAt(i);
914 list.RemoveAll();
916 qsort(ppSortArray, m_Count, sizeof(LPCTSTR), CompareString);
918 for(i=0; i < m_Count; i++)
920 list.Add((LPCTSTR) ppSortArray[i]);
922 m_Liste1.RemoveAll();
923 delete [] ppSortArray;
927 /*********************************************************************/
929 ** Vers. 1.1
930 ** NEW: CopyList()
932 void CACListWnd::CopyList()
934 m_DisplayList.Copy(m_SearchList);
935 m_lCount = (long)m_DisplayList.GetSize();
936 if(m_lCount)
937 FindString(0,_T(""),true);
940 /*********************************************************************/