CPatch: New memory management
[TortoiseGit.git] / src / Utils / ACListWnd.cpp
blob1276b7fb45c268a03aa2b21bd26f0e3ebff8be15
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, 2018 - 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"
13 #include "StringUtils.h"
15 #ifdef _DEBUG
16 #define new DEBUG_NEW
17 #undef THIS_FILE
18 static char THIS_FILE[] = __FILE__;
19 #endif
21 static UINT auIDStatusBar[] =
23 ID_SEPARATOR
26 #define _MAX_ENTRYS_ 8
27 #define _MODE_FIND_ALL_ (1L << 5)
29 /////////////////////////////////////////////////////////////////////////////
30 // CACListWnd
32 void DoPaintMessageLoop()
34 MSG message1;
35 while (::PeekMessage(&message1, nullptr, WM_PAINT, WM_PAINT, PM_REMOVE))
37 ::TranslateMessage(&message1);
38 ::DispatchMessage(&message1);
42 /**********************************************************************/
44 CACListWnd::CACListWnd()
46 m_lTopIndex = 0;
47 m_lCount = 0;
48 m_ItemHeight = 16;
49 m_lSelItem = -1;
50 m_VisibleItems = 0;
51 m_pEditParent = nullptr;
52 m_LastSize.SetRectEmpty();
53 m_PrefixChar = 0;
54 m_lMode = 0;
55 pFontDC = nullptr;
56 m_nIDTimer = 0;
57 SecureZeroMemory(&logfont, sizeof(LOGFONT));
59 NONCLIENTMETRICS metrics = { 0 };
60 metrics.cbSize = sizeof(NONCLIENTMETRICS);
61 SystemParametersInfo(SPI_GETNONCLIENTMETRICS, 0, &metrics, FALSE);
62 m_uiFont.CreateFontIndirect(&metrics.lfMessageFont);
65 /**********************************************************************/
67 CACListWnd::~CACListWnd()
69 m_SearchList.RemoveAll();
70 m_DisplayList.RemoveAll();
71 DestroyWindow();
74 /*********************************************************************/
76 void CACListWnd::OnActivateApp(BOOL bActive, DWORD dwThreadID)
78 #if (_MSC_VER >= 1300)
79 CWnd::OnActivateApp(bActive, dwThreadID); //vc7 FIX 1.2
80 #else
81 CWnd::OnActivateApp(bActive, (HTASK)dwThreadID); //vc6 FIX 1.2
82 #endif
84 ShowWindow(false);
88 BEGIN_MESSAGE_MAP(CACListWnd, CWnd)
89 //{{AFX_MSG_MAP(CACListWnd)
90 ON_WM_PAINT()
91 ON_WM_SIZE()
92 ON_WM_ERASEBKGND()
93 ON_WM_NCPAINT()
94 ON_WM_KEYDOWN()
95 ON_WM_NCCALCSIZE()
96 ON_WM_VSCROLL()
97 ON_WM_ACTIVATEAPP()
98 ON_WM_NCHITTEST()
99 ON_WM_LBUTTONDOWN()
100 ON_WM_RBUTTONDOWN()
101 ON_WM_SETCURSOR()
102 ON_WM_SHOWWINDOW()
103 ON_WM_NCLBUTTONDOWN()
104 ON_WM_MOUSEMOVE()
105 ON_WM_TIMER()
106 ON_WM_GETMINMAXINFO()
107 //}}AFX_MSG_MAP
108 END_MESSAGE_MAP()
111 /////////////////////////////////////////////////////////////////////////////
112 // Behandlungsroutinen für Nachrichten CACListWnd
114 void CACListWnd::DrawItem(CDC* pDC,long m_lItem,long width)
116 long y = m_lItem - m_lTopIndex;
117 CRect rcLabel(2,y*m_ItemHeight,width,(y+1)*m_ItemHeight);
119 pDC->SetTextColor(::GetSysColor(COLOR_WINDOWTEXT));
121 if(m_lItem == m_lSelItem)
123 rcLabel.left = 0;
124 pDC->FillSolidRect(rcLabel,::GetSysColor(COLOR_HIGHLIGHT));
125 pDC->SetTextColor(::GetSysColor(COLOR_HIGHLIGHTTEXT));
126 rcLabel.left = 2;
129 if(m_PrefixChar)
130 m_DisplayStr = m_PrefixChar + m_DisplayList.GetAt(m_lItem);
131 else
132 m_DisplayStr = m_DisplayList.GetAt(m_lItem);
134 pDC->DrawText(m_DisplayStr, -1, rcLabel, DT_LEFT | DT_SINGLELINE |
135 DT_NOPREFIX | DT_VCENTER | DT_END_ELLIPSIS);
138 /*********************************************************************/
140 void CACListWnd::OnPaint()
142 CPaintDC dc(this);
143 CRect rcWnd,m_rect, rc;
144 CDC MemDC, *pDC = nullptr;
145 CBitmap m_bitmap, *m_pOldBitmap;
146 int i;
148 GetClientRect(rc);
149 rcWnd = m_rect = rc;
151 rc.left = rc.right-GetSystemMetrics(SM_CXHSCROLL);
152 rc.top = rc.bottom-GetSystemMetrics(SM_CYVSCROLL);
154 m_rect.right -= ScrollBarWidth();
156 MemDC.CreateCompatibleDC(&dc);
158 m_bitmap.CreateCompatibleBitmap(&dc, m_rect.Width(), m_rect.Height());
159 m_pOldBitmap = MemDC.SelectObject(&m_bitmap);
161 MemDC.SetWindowOrg(m_rect.left, m_rect.top);
163 long width = rcWnd.Width() - ScrollBarWidth();
165 MemDC.FillSolidRect(rcWnd,::GetSysColor(COLOR_WINDOW));
166 MemDC.SelectObject(m_uiFont);
167 MemDC.SetBkMode(TRANSPARENT);
169 for(i = m_lTopIndex; i < m_lCount;i++)
171 DrawItem(&MemDC,i,width);
175 CPen m_Pen1(PS_SOLID, 1, ::GetSysColor(COLOR_WINDOW));
176 CPen m_Pen2(PS_SOLID, 1, ::GetSysColor(COLOR_BTNFACE));
177 CPen m_Pen3(PS_SOLID, 1, ::GetSysColor(COLOR_3DSHADOW));
179 pDC = &dc;
181 if(m_VertBar.IsWindowVisible())
182 dc.FillSolidRect(rc, ::GetSysColor(COLOR_BTNFACE) );
183 else
184 pDC = &MemDC;
186 CPen *pOldPen = (CPen*)pDC->SelectObject(&m_Pen1);
187 int a = 1,bottom;
189 width = GetSystemMetrics(SM_CXHSCROLL);
190 bottom = (rcWnd.bottom-GetSystemMetrics(SM_CXHSCROLL))-1;
192 //gripper
193 for( i = 0; i < 20 ;i++,a++)
195 if(a==1)
196 pDC->SelectObject(&m_Pen1);
197 if(a==2)
198 pDC->SelectObject(&m_Pen2);
199 if(a==3)
200 pDC->SelectObject(&m_Pen3);
201 if(a > 3)
202 a = 0;
204 pDC->MoveTo(rc.left + i - 1, rcWnd.bottom);
205 pDC->LineTo(rc.left + i + width, bottom);
208 dc.BitBlt(m_rect.left, m_rect.top, m_rect.Width(), m_rect.Height(),
209 &MemDC, m_rect.left, m_rect.top, SRCCOPY);
211 pDC->SelectObject( pOldPen );
212 MemDC.SelectObject(m_pOldBitmap);
215 /*********************************************************************/
217 void CACListWnd::Init(CWnd *pWnd)
219 VERIFY(m_VertBar.Create(WS_VISIBLE|SBS_VERT|SBS_LEFTALIGN,
220 CRect(0,0,GetSystemMetrics(SM_CYVSCROLL),100),this,0));
222 SetScroller();
223 m_pEditParent = (CEdit*)pWnd;
225 m_lCount = (long)m_DisplayList.GetSize();
226 m_VertBar.SetScrollPos(0,false);
227 SetProp();
229 CDC *m_pDC;
230 m_pDC = GetDC();
231 if(m_pDC)
233 m_pDC->SelectObject(GetStockObject(DEFAULT_GUI_FONT));
234 CSize m_Size = m_pDC->GetOutputTextExtent(L"Hg");
235 m_ItemHeight = m_Size.cy;
236 ReleaseDC(m_pDC);
240 /*********************************************************************/
242 void CACListWnd::SetScroller()
244 CRect rcWnd,rcBar;
245 GetClientRect(rcWnd);
247 if(m_VertBar.GetSafeHwnd())
249 rcBar = rcWnd;
250 rcBar.top=-1;
251 rcBar.left = (rcWnd.Width()-GetSystemMetrics(SM_CYVSCROLL));
252 rcBar.bottom-= GetSystemMetrics(SM_CYHSCROLL);
253 m_VertBar.MoveWindow(rcBar);
254 rcBar.top = rcWnd.bottom-20;
255 rcBar.bottom = rcWnd.bottom;
257 m_VertBar.SetScrollPos(m_lTopIndex,true);
261 /*********************************************************************/
263 void CACListWnd::OnSize(UINT nType, int cx, int cy)
265 CWnd::OnSize(nType, cx, cy);
266 SetScroller();
267 SetProp();
269 if(!m_LastSize.IsRectEmpty())
270 GetWindowRect(m_LastSize);
273 /*********************************************************************/
275 long CACListWnd::ScrollBarWidth()
277 if(m_VertBar.IsWindowVisible())
278 return GetSystemMetrics(SM_CYVSCROLL);
279 else
280 return 0;
283 /*********************************************************************/
285 void CACListWnd::SetProp()
287 CRect rcWnd,rcBar;
289 if(!m_lCount)
290 return;
292 CWnd::GetWindowRect(rcWnd);
293 ScreenToClient(rcWnd);
295 SCROLLINFO si;
296 si.cbSize = sizeof(SCROLLINFO);
297 si.fMask = SIF_PAGE|SIF_RANGE;
298 si.nMin = 0;
299 si.nMax = m_lCount-1;
300 m_VisibleItems = si.nPage = rcWnd.Height()/m_ItemHeight;
301 si.nTrackPos = 2;
302 m_VertBar.SetScrollRange(0,m_lCount-1);
303 m_VertBar.SetScrollInfo(&si);
305 if(m_VisibleItems > m_lCount-1)
306 m_VertBar.ShowWindow(false);
307 else
308 m_VertBar.ShowWindow(true);
310 if(m_lTopIndex+m_VisibleItems > m_lCount)
312 m_lTopIndex = m_lCount-m_VisibleItems;
313 if(m_lTopIndex < 0)
314 m_lTopIndex = 0;
315 m_VertBar.SetScrollPos(m_lTopIndex,true);
319 /*********************************************************************/
321 BOOL CACListWnd::OnEraseBkgnd(CDC* /*pDC*/)
323 return false;
326 /*********************************************************************/
328 void CACListWnd::OnNcPaint()
330 CWindowDC dc(this);
331 CRect rectClient, rectWindow,rcWnd;
333 GetClientRect(rectClient);
334 GetWindowRect(rectWindow);
335 ScreenToClient(rectWindow);
337 rectClient.OffsetRect(-(rectWindow.left), -(rectWindow.top));
338 dc.ExcludeClipRect(rectClient);
340 rectWindow.OffsetRect(-rectWindow.left, -rectWindow.top);
342 dc.FillSolidRect(rectWindow,::GetSysColor(COLOR_WINDOWTEXT));
345 /*********************************************************************/
347 void CACListWnd::OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags)
349 CWnd::OnKeyDown(nChar, nRepCnt, nFlags);
351 if (nChar == VK_ESCAPE)
352 ShowWindow(false);
355 /*********************************************************************/
357 void CACListWnd::OnNcCalcSize(BOOL /*bCalcValidRects*/, NCCALCSIZE_PARAMS FAR* lpncsp)
359 ::InflateRect(lpncsp->rgrc,
360 -GetSystemMetrics(SM_CXBORDER), -GetSystemMetrics(SM_CYBORDER));
363 /*********************************************************************/
365 int CACListWnd::HitTest(CPoint point)
367 CRect rcItem;
368 CRect rcWnd;
370 GetClientRect(rcWnd);
371 long width = rcWnd.Width() - ScrollBarWidth();
373 for(int i = m_lTopIndex; i < m_lCount; i++)
375 long y = i - m_lTopIndex;
376 rcItem.SetRect(2,y*m_ItemHeight,width,(y+1)*m_ItemHeight);
378 if(PtInRect(&rcItem, point))
379 return (m_lSelItem = (y+m_lTopIndex));
382 return -1;
385 /*********************************************************************/
387 LRESULT CACListWnd::OnNcHitTest(CPoint point)
389 CRect rectClient;
390 GetWindowRect(rectClient);
392 rectClient.left = rectClient.right - GetSystemMetrics(SM_CYVSCROLL);
393 rectClient.top = rectClient.bottom - GetSystemMetrics(SM_CXVSCROLL);
395 if(rectClient.PtInRect(point))
396 return HTBOTTOMRIGHT;
397 else
398 return HTCLIENT;
401 /*********************************************************************/
403 void CACListWnd::OnLButtonDown(UINT nFlags, CPoint point)
405 CWnd::OnLButtonDown(nFlags, point);
406 int sel = HitTest(point);
408 if(sel >= 0)
410 if(!EnsureVisible(sel,true))
411 Invalidate();
412 m_lSelItem = sel;
413 m_pEditParent->SendMessage(ENAC_UPDATE, WM_KEYDOWN, GetDlgCtrlID());
414 DoPaintMessageLoop();
415 Sleep(500);
416 ShowWindow(false);
418 else
420 CRect rc;
421 GetClientRect(rc);
422 if(!rc.PtInRect(point))
423 ShowWindow(false);
427 /*********************************************************************/
429 void CACListWnd::OnRButtonDown(UINT nFlags, CPoint point)
431 CWnd::OnRButtonDown(nFlags, point);
432 ShowWindow(false);
435 /*********************************************************************/
437 BOOL CACListWnd::OnSetCursor(CWnd* pWnd, UINT nHitTest, UINT message)
439 CRect rectClient;
440 CPoint ptCursor;
442 GetWindowRect(rectClient);
443 ScreenToClient(&rectClient);
445 rectClient.left = rectClient.right - GetSystemMetrics(SM_CYVSCROLL);
446 rectClient.top = rectClient.bottom - GetSystemMetrics(SM_CXVSCROLL);
449 GetCursorPos(&ptCursor);
450 ScreenToClient(&ptCursor);
452 if(rectClient.PtInRect(ptCursor)) // Vergrößerungs-Cursor
454 return CWnd::OnSetCursor(pWnd, nHitTest, message);
457 ::SetCursor(AfxGetApp()->LoadStandardCursor(IDC_ARROW));
458 return TRUE;
461 /*********************************************************************/
463 void CACListWnd::InvalidateAndScroll()
465 m_VertBar.SetScrollPos(m_lTopIndex,true);
466 Invalidate();
467 DoPaintMessageLoop();
470 /*********************************************************************/
472 bool CACListWnd::EnsureVisible(int item, bool m_bWait)
474 if(item > m_lTopIndex && item < m_lTopIndex + m_VisibleItems)
475 return false; // ist visible
477 if(item > m_lTopIndex) // scroll down
479 long m_len = item;
480 for(int i = m_lTopIndex; i < m_len; i++)
482 if(i >= m_lCount-m_VisibleItems)
483 break;
484 if(i >= m_lCount-m_VisibleItems || i + m_VisibleItems > item)
486 break;
489 m_lTopIndex++;
491 if(m_bWait)
493 InvalidateAndScroll();
494 Sleep(10);
495 DoPaintMessageLoop();
498 InvalidateAndScroll();
499 return true;
502 if(item < m_lTopIndex) // scroll up
504 while(item < m_lTopIndex)
506 if(m_lTopIndex > 0)
507 m_lTopIndex--;
508 else
510 break;
513 if(m_bWait)
515 InvalidateAndScroll();
516 Sleep(10);
517 DoPaintMessageLoop();
521 InvalidateAndScroll();
522 return true;
525 return false;
528 /*********************************************************************/
530 bool CACListWnd::SelectItem(int item)
532 if(item > m_lCount)
533 return false;
535 if(item == -1)
537 EnsureVisible(m_lSelItem,false);
538 Invalidate();
539 return false;
542 m_lSelItem = item;
544 if(!EnsureVisible(item,true))
545 Invalidate();
547 return true;
550 /*********************************************************************/
552 int CACListWnd::FindStringExact( int nStartAfter, LPCTSTR lpszString )
554 if(nStartAfter > m_SearchList.GetSize())
555 return -1;
557 for(int i = nStartAfter+1; i < m_SearchList.GetSize(); i++)
558 if(m_SearchList.GetAt(i).Compare(lpszString) == 0)
559 return i;
560 return -1;
563 /*********************************************************************/
565 ** Vers. 1.1
566 * NEW: m_bDisplayOnly
568 int CACListWnd::FindString(int nStartAfter, LPCTSTR lpszString, bool m_bDisplayOnly)
570 long m_AktCount = (long)m_DisplayList.GetSize();
572 if(!m_bDisplayOnly)
574 CString m_Str1,m_Str2 = lpszString;
575 if(!m_pEditParent)
577 ShowWindow(false);
578 return -1;
581 if(nStartAfter > m_SearchList.GetSize())
583 ShowWindow(false);
584 return -1;
587 if(m_Str2.IsEmpty())
589 ShowWindow(false);
590 return -1;
593 m_DisplayList.RemoveAll();
595 m_Str2.MakeUpper();
597 for(int i = nStartAfter+1; i < m_SearchList.GetSize(); i++)
599 if(m_PrefixChar)
600 m_Str1 = m_PrefixChar;
601 else
602 m_Str1.Empty();
604 m_Str1 += m_SearchList.GetAt(i);
606 m_Str1.MakeUpper();
608 if(m_lMode & _MODE_FIND_ALL_)
610 if(m_Str1.Find(m_Str2) >= 0)
612 m_DisplayList.Add(m_SearchList.GetAt(i));
615 else // _MODE_FIND_EXACT_
617 if (CStringUtils::StartsWith(m_Str1, m_Str2))
619 m_DisplayList.Add(m_SearchList.GetAt(i));
624 m_lCount = (long)m_DisplayList.GetSize();
626 if(m_lCount)
628 CRect rcWnd;
629 int iHeight,iWight;
631 m_pEditParent->GetWindowRect(rcWnd);
633 SetScroller();
634 SetProp();
636 ShowWindow(true);
637 Invalidate();
639 iHeight = m_lCount*m_ItemHeight+(GetSystemMetrics(SM_CYBORDER)*2);
641 if(m_lCount > _MAX_ENTRYS_)
642 iHeight = _MAX_ENTRYS_*m_ItemHeight+(GetSystemMetrics(SM_CYBORDER)*2);
644 if(!m_LastSize.IsRectEmpty())
646 iWight = m_LastSize.Width();
647 iHeight = m_LastSize.Height();
648 rcWnd.top += rcWnd.Height();
649 rcWnd.right = rcWnd.left+iWight;
650 rcWnd.bottom = rcWnd.top+iHeight;
652 SetWindowPos(&CWnd::wndTopMost, rcWnd.left,
653 rcWnd.top,
654 rcWnd.Width(),
655 rcWnd.Height(), 0);
657 else
659 SetWindowPos(&CWnd::wndTopMost, rcWnd.left,
660 rcWnd.top + rcWnd.Height(),
661 rcWnd.Width(),
662 iHeight, 0);
665 if(m_AktCount != m_DisplayList.GetSize())
666 m_lSelItem = -1;
668 SortList(m_DisplayList);
670 else
672 ShowWindow(false);
675 return 1;
678 /*********************************************************************/
680 int CACListWnd::SelectString(LPCTSTR lpszString )
682 int item = FindString(-1, lpszString);
683 SelectItem(item);
684 return item;
687 /*********************************************************************/
689 bool CACListWnd::GetText(int item, CString& m_Text)
691 if(item < 0 || item > m_SearchList.GetSize())
692 return false;
693 m_Text = m_SearchList.GetAt(item);
694 return true;
697 /*********************************************************************/
699 void CACListWnd::OnShowWindow(BOOL bShow, UINT nStatus)
701 if(bShow)
703 m_nIDTimer = (long)SetTimer(IDTimerInstall, 200, nullptr);
704 m_pEditParent->GetParent()->GetWindowRect(m_ParentRect);
706 else
708 if(m_nIDTimer)
709 KillTimer(IDTimerInstall);
710 m_nIDTimer = 0;
711 m_lSelItem = -1;
712 m_lTopIndex = 0;
715 CWnd::OnShowWindow(bShow, nStatus);
716 ::SetCursor(AfxGetApp()->LoadStandardCursor(IDC_ARROW));
719 /*********************************************************************/
721 void CACListWnd::OnNcLButtonDown(UINT nHitTest, CPoint point)
723 if(OnNcHitTest(point) == HTBOTTOMRIGHT)
724 GetWindowRect(m_LastSize);
725 CWnd::OnNcLButtonDown(nHitTest, point);
728 /*********************************************************************/
730 CString CACListWnd::GetString()
732 int i = (int)m_DisplayList.GetSize();
734 if(!i)
735 return L"";
736 if(i <= m_lSelItem || m_lSelItem == -1)
737 i = 0;
738 else
739 i = m_lSelItem;
741 return m_DisplayList.GetAt(i);
744 /*********************************************************************/
746 void CACListWnd::OnVScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar)
748 CWnd::OnVScroll(nSBCode, nPos, pScrollBar);
749 long m_oldlTopIndex = m_lTopIndex;
751 switch(nSBCode)
753 case SB_ENDSCROLL:
754 break;
756 case SB_PAGEUP:
757 m_lTopIndex -= m_VisibleItems;
758 if(m_lTopIndex < 0)
759 m_lTopIndex = 0;
760 break;
762 case SB_PAGEDOWN:
763 m_lTopIndex += m_VisibleItems;
764 if(m_lTopIndex >= m_lCount-m_VisibleItems)
765 m_lTopIndex = m_lCount-m_VisibleItems;
766 break;
768 case SB_LINEUP:
769 m_lTopIndex--;
770 if(m_lTopIndex < 0)
771 m_lTopIndex = 0;
772 break;
774 case SB_LINEDOWN:
775 m_lTopIndex++;
776 if(m_lTopIndex >= m_lCount-m_VisibleItems)
777 m_lTopIndex = m_lCount-m_VisibleItems;
778 break;
780 case SB_THUMBTRACK:
781 m_lTopIndex = nPos;
782 break;
785 m_VertBar.SetScrollPos(m_lTopIndex,true);
787 if(m_oldlTopIndex != m_lTopIndex)
788 Invalidate();
791 /*********************************************************************/
793 CString CACListWnd::GetNextString(int nChar)
795 switch(nChar)
797 case VK_DOWN:
798 m_lSelItem++;
799 break;
801 case VK_UP:
802 m_lSelItem--;
803 break;
805 case VK_PRIOR:
806 m_lSelItem -= m_VisibleItems;
807 if(m_lSelItem < 0)
808 m_lSelItem = 0;
809 break;
811 case VK_NEXT:
812 m_lSelItem += m_VisibleItems;
813 if(m_lSelItem >= m_lCount-1)
814 m_lSelItem = m_lCount-1;
815 break;
817 case VK_HOME:
818 m_lSelItem = 0;
819 break;
821 case VK_END:
822 m_lSelItem = m_lCount-1;
823 break;
826 if(m_lSelItem < 0)
827 m_lSelItem = m_lCount-1;
829 if(m_lSelItem >= m_lCount)
830 m_lSelItem = 0;
832 if(EnsureVisible(m_lSelItem,(m_lCount > 50) ? false : true))
833 InvalidateAndScroll();
835 return GetString();
838 /*********************************************************************/
840 void CACListWnd::OnMouseMove(UINT nFlags, CPoint point)
842 CWnd::OnMouseMove(nFlags, point);
843 int sel = HitTest(point);
844 if(sel >= 0)
846 Invalidate();
850 /*********************************************************************/
852 void CACListWnd::OnTimer(UINT_PTR nIDEvent)
854 CWnd::OnTimer(nIDEvent);
856 CRect m_ParentRect1;
857 m_pEditParent->GetParent()->GetWindowRect(m_ParentRect1);
858 if(!m_ParentRect1.EqualRect(m_ParentRect))
859 ShowWindow(false);
862 /*********************************************************************/
864 void CACListWnd::OnGetMinMaxInfo(MINMAXINFO FAR* lpMMI)
866 if(GetSafeHwnd())
868 // Vers. 1.2
869 long m_lMinY1 = GetSystemMetrics(SM_CYHSCROLL)*2 + GetSystemMetrics(SM_CYSIZEFRAME) + GetSystemMetrics(SM_CXHTHUMB),
870 m_lMinY2 = m_lCount * m_ItemHeight + (GetSystemMetrics(SM_CYBORDER)*2);
872 if(m_VisibleItems > m_lCount-1 && m_lMinY2 < m_lMinY1)
873 lpMMI->ptMinTrackSize.y = m_lMinY2;
874 else
875 lpMMI->ptMinTrackSize.y = m_lMinY1;
876 //---------
878 lpMMI->ptMinTrackSize.x = GetSystemMetrics(SM_CXHSCROLL)*4;
881 // Vers. 1.2
882 if (m_pEditParent)
884 RECT rc;
885 m_pEditParent->GetWindowRect (&rc);
886 lpMMI->ptMinTrackSize.x = rc.right - rc.left;
889 else
890 CWnd::OnGetMinMaxInfo(lpMMI);
893 /*********************************************************************/
895 int CACListWnd::CompareString(const void* p1, const void* p2)
897 return _stricmp( * ( char** ) p1, * ( char** ) p2 );
900 /*********************************************************************/
902 void CACListWnd::SortList(CStringArray& list)
904 int m_Count = (int)list.GetSize();
905 int i;
907 if (m_Count > 1)
909 CStringArray m_Liste1;
910 m_Liste1.Copy(list);
912 LPCTSTR* ppSortArray = new LPCTSTR[m_Count+1];
915 for(i=0; i < m_Count; i++)
917 ppSortArray[i] = (LPCTSTR)m_Liste1.GetAt(i);
920 list.RemoveAll();
922 qsort(ppSortArray, m_Count, sizeof(LPCTSTR), CompareString);
924 for(i=0; i < m_Count; i++)
926 list.Add((LPCTSTR) ppSortArray[i]);
928 m_Liste1.RemoveAll();
929 delete [] ppSortArray;
933 /*********************************************************************/
935 ** Vers. 1.1
936 ** NEW: CopyList()
938 void CACListWnd::CopyList()
940 m_DisplayList.Copy(m_SearchList);
941 m_lCount = (long)m_DisplayList.GetSize();
942 if(m_lCount)
943 FindString(0, L"", true);
946 /*********************************************************************/