1 // ACWnd.cpp: Implementierungsdatei
\r
5 #include "ACListWnd.h"
\r
8 #define new DEBUG_NEW
\r
10 static char THIS_FILE[] = __FILE__;
\r
13 static UINT auIDStatusBar[] =
\r
18 #define _MAX_ENTRYS_ 8
\r
19 #define _MODE_FIND_ALL_ (1L << 5)
\r
21 /////////////////////////////////////////////////////////////////////////////
\r
24 void DoPaintMessageLoop()
\r
27 while(::PeekMessage(&message1,NULL,WM_PAINT,WM_PAINT, PM_REMOVE))
\r
29 ::TranslateMessage(&message1);
\r
30 ::DispatchMessage(&message1);
\r
34 /**********************************************************************/
\r
36 CACListWnd::CACListWnd()
\r
43 m_pEditParent = NULL;
\r
44 m_LastSize.SetRectEmpty();
\r
49 /**********************************************************************/
\r
51 CACListWnd::~CACListWnd()
\r
53 m_SearchList.RemoveAll();
\r
54 m_DisplayList.RemoveAll();
\r
58 /*********************************************************************/
\r
60 void CACListWnd::OnActivateApp(BOOL bActive, DWORD dwThreadID)
\r
62 #if (_MSC_VER >= 1300)
\r
63 CWnd::OnActivateApp(bActive, dwThreadID); //vc7 FIX 1.2
\r
65 CWnd::OnActivateApp(bActive, (HTASK)dwThreadID); //vc6 FIX 1.2
\r
72 BEGIN_MESSAGE_MAP(CACListWnd, CWnd)
\r
73 //{{AFX_MSG_MAP(CACListWnd)
\r
87 ON_WM_NCLBUTTONDOWN()
\r
90 ON_WM_GETMINMAXINFO()
\r
95 /////////////////////////////////////////////////////////////////////////////
\r
96 // Behandlungsroutinen für Nachrichten CACListWnd
\r
98 void CACListWnd::DrawItem(CDC* pDC,long m_lItem,long width)
\r
100 long y = m_lItem - m_lTopIndex;
\r
101 CRect rcLabel(2,y*m_ItemHeight,width,(y+1)*m_ItemHeight);
\r
103 pDC->SetTextColor(::GetSysColor(COLOR_WINDOWTEXT));
\r
105 if(m_lItem == m_lSelItem)
\r
108 pDC->FillSolidRect(rcLabel,::GetSysColor(COLOR_HIGHLIGHT));
\r
109 pDC->SetTextColor(::GetSysColor(COLOR_HIGHLIGHTTEXT));
\r
114 m_DisplayStr = m_PrefixChar + m_DisplayList.GetAt(m_lItem);
\r
116 m_DisplayStr = m_DisplayList.GetAt(m_lItem);
\r
118 pDC->DrawText(m_DisplayStr, -1, rcLabel, DT_LEFT | DT_SINGLELINE |
\r
119 DT_NOPREFIX | DT_VCENTER | DT_END_ELLIPSIS);
\r
122 /*********************************************************************/
\r
124 void CACListWnd::OnPaint()
\r
127 CRect rcWnd,m_rect, rc;
\r
128 CDC MemDC,*pDC=NULL;
\r
129 CBitmap m_bitmap, *m_pOldBitmap;
\r
133 rcWnd = m_rect = rc;
\r
135 rc.left = rc.right-GetSystemMetrics(SM_CXHSCROLL);
\r
136 rc.top = rc.bottom-GetSystemMetrics(SM_CYVSCROLL);
\r
138 m_rect.right -= ScrollBarWidth();
\r
140 MemDC.CreateCompatibleDC(&dc);
\r
142 m_bitmap.CreateCompatibleBitmap(&dc, m_rect.Width(), m_rect.Height());
\r
143 m_pOldBitmap = MemDC.SelectObject(&m_bitmap);
\r
145 MemDC.SetWindowOrg(m_rect.left, m_rect.top);
\r
147 long width = rcWnd.Width() - ScrollBarWidth();
\r
149 MemDC.FillSolidRect(rcWnd,::GetSysColor(COLOR_WINDOW));
\r
150 MemDC.SelectObject(GetStockObject(DEFAULT_GUI_FONT));
\r
151 MemDC.SetBkMode(TRANSPARENT);
\r
153 for(i = m_lTopIndex; i < m_lCount;i++)
\r
155 DrawItem(&MemDC,i,width);
\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
165 if(m_VertBar.IsWindowVisible())
\r
166 dc.FillSolidRect(rc, ::GetSysColor(COLOR_BTNFACE) );
\r
170 CPen *pOldPen = (CPen*)pDC->SelectObject(&m_Pen1);
\r
173 width = GetSystemMetrics(SM_CXHSCROLL);
\r
174 bottom = (rcWnd.bottom-GetSystemMetrics(SM_CXHSCROLL))-1;
\r
177 for( i = 0; i < 20 ;i++,a++)
\r
180 pDC->SelectObject(&m_Pen1);
\r
182 pDC->SelectObject(&m_Pen2);
\r
184 pDC->SelectObject(&m_Pen3);
\r
188 pDC->MoveTo(rc.left + i - 1, rcWnd.bottom);
\r
189 pDC->LineTo(rc.left + i + width, bottom);
\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
195 pDC->SelectObject( pOldPen );
\r
196 MemDC.SelectObject(m_pOldBitmap);
\r
199 /*********************************************************************/
\r
201 void CACListWnd::Init(CWnd *pWnd)
\r
203 VERIFY(m_VertBar.Create(WS_VISIBLE|SBS_VERT|SBS_LEFTALIGN,
\r
204 CRect(0,0,GetSystemMetrics(SM_CYVSCROLL),100),this,0));
\r
207 m_pEditParent = (CEdit*)pWnd;
\r
209 m_lCount = m_DisplayList.GetSize();
\r
210 m_VertBar.SetScrollPos(0,false);
\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
224 /*********************************************************************/
\r
226 void CACListWnd::SetScroller()
\r
229 GetClientRect(rcWnd);
\r
231 if(m_VertBar.GetSafeHwnd())
\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
241 m_VertBar.SetScrollPos(m_lTopIndex,true);
\r
246 /*********************************************************************/
\r
248 void CACListWnd::OnSize(UINT nType, int cx, int cy)
\r
250 CWnd::OnSize(nType, cx, cy);
\r
254 if(!m_LastSize.IsRectEmpty())
\r
255 GetWindowRect(m_LastSize);
\r
258 /*********************************************************************/
\r
260 long CACListWnd::ScrollBarWidth()
\r
262 if(m_VertBar.IsWindowVisible())
\r
263 return GetSystemMetrics(SM_CYVSCROLL);
\r
268 /*********************************************************************/
\r
270 void CACListWnd::SetProp()
\r
277 CWnd::GetWindowRect(rcWnd);
\r
278 ScreenToClient(rcWnd);
\r
281 si.cbSize = sizeof(SCROLLINFO);
\r
282 si.fMask = SIF_PAGE|SIF_RANGE;
\r
284 si.nMax = m_lCount-1;
\r
285 m_VisibleItems = si.nPage = rcWnd.Height()/m_ItemHeight;
\r
287 m_VertBar.SetScrollRange(0,m_lCount-1);
\r
288 m_VertBar.SetScrollInfo(&si);
\r
290 if(m_VisibleItems > m_lCount-1)
\r
291 m_VertBar.ShowWindow(false);
\r
293 m_VertBar.ShowWindow(true);
\r
295 if(m_lTopIndex+m_VisibleItems > m_lCount)
\r
297 m_lTopIndex = m_lCount-m_VisibleItems;
\r
298 if(m_lTopIndex < 0)
\r
300 m_VertBar.SetScrollPos(m_lTopIndex,true);
\r
304 /*********************************************************************/
\r
306 BOOL CACListWnd::OnEraseBkgnd(CDC* /*pDC*/)
\r
311 /*********************************************************************/
\r
313 void CACListWnd::OnNcPaint()
\r
315 CWindowDC dc(this);
\r
316 CRect rectClient, rectWindow,rcWnd;
\r
318 GetClientRect(rectClient);
\r
319 GetWindowRect(rectWindow);
\r
320 ScreenToClient(rectWindow);
\r
322 rectClient.OffsetRect(-(rectWindow.left), -(rectWindow.top));
\r
323 dc.ExcludeClipRect(rectClient);
\r
325 rectWindow.OffsetRect(-rectWindow.left, -rectWindow.top);
\r
327 dc.FillSolidRect(rectWindow,::GetSysColor(COLOR_WINDOWTEXT));
\r
330 /*********************************************************************/
\r
332 void CACListWnd::OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags)
\r
334 CWnd::OnKeyDown(nChar, nRepCnt, nFlags);
\r
336 if (nChar == VK_ESCAPE)
\r
340 /*********************************************************************/
\r
342 void CACListWnd::OnNcCalcSize(BOOL /*bCalcValidRects*/, NCCALCSIZE_PARAMS FAR* lpncsp)
\r
344 ::InflateRect(lpncsp->rgrc,
\r
345 -GetSystemMetrics(SM_CXBORDER), -GetSystemMetrics(SM_CYBORDER));
\r
348 /*********************************************************************/
\r
350 int CACListWnd::HitTest(CPoint point)
\r
355 GetClientRect(rcWnd);
\r
356 long width = rcWnd.Width() - ScrollBarWidth();
\r
358 for(int i = m_lTopIndex; i < m_lCount; i++)
\r
360 long y = i - m_lTopIndex;
\r
361 rcItem.SetRect(2,y*m_ItemHeight,width,(y+1)*m_ItemHeight);
\r
363 if(PtInRect(&rcItem, point))
\r
364 return (m_lSelItem = (y+m_lTopIndex));
\r
370 /*********************************************************************/
\r
372 LRESULT CACListWnd::OnNcHitTest(CPoint point)
\r
375 GetWindowRect(rectClient);
\r
377 rectClient.left = rectClient.right - GetSystemMetrics(SM_CYVSCROLL);
\r
378 rectClient.top = rectClient.bottom - GetSystemMetrics(SM_CXVSCROLL);
\r
380 if(rectClient.PtInRect(point))
\r
381 return HTBOTTOMRIGHT;
\r
386 /*********************************************************************/
\r
388 void CACListWnd::OnLButtonDown(UINT nFlags, CPoint point)
\r
390 CWnd::OnLButtonDown(nFlags, point);
\r
391 int sel = HitTest(point);
\r
395 if(!EnsureVisible(sel,true))
\r
398 m_pEditParent->SendMessage(ENAC_UPDATE, WM_KEYDOWN, GetDlgCtrlID());
\r
399 DoPaintMessageLoop();
\r
407 if(!rc.PtInRect(point))
\r
412 /*********************************************************************/
\r
414 void CACListWnd::OnRButtonDown(UINT nFlags, CPoint point)
\r
416 CWnd::OnRButtonDown(nFlags, point);
\r
420 /*********************************************************************/
\r
422 BOOL CACListWnd::OnSetCursor(CWnd* pWnd, UINT nHitTest, UINT message)
\r
427 GetWindowRect(rectClient);
\r
428 ScreenToClient(&rectClient);
\r
430 rectClient.left = rectClient.right - GetSystemMetrics(SM_CYVSCROLL);
\r
431 rectClient.top = rectClient.bottom - GetSystemMetrics(SM_CXVSCROLL);
\r
434 GetCursorPos(&ptCursor);
\r
435 ScreenToClient(&ptCursor);
\r
437 if(rectClient.PtInRect(ptCursor)) // Vergrößerungs-Cursor
\r
439 return CWnd::OnSetCursor(pWnd, nHitTest, message);
\r
442 ::SetCursor(AfxGetApp()->LoadStandardCursor(IDC_ARROW));
\r
446 /*********************************************************************/
\r
448 void CACListWnd::InvalidateAndScroll()
\r
450 m_VertBar.SetScrollPos(m_lTopIndex,true);
\r
452 DoPaintMessageLoop();
\r
455 /*********************************************************************/
\r
457 bool CACListWnd::EnsureVisible(int item, bool m_bWait)
\r
459 if(item > m_lTopIndex && item < m_lTopIndex + m_VisibleItems)
\r
460 return false; // ist visible
\r
462 if(item > m_lTopIndex) // scroll down
\r
465 for(int i = m_lTopIndex; i < m_len; i++)
\r
467 if(i >= m_lCount-m_VisibleItems)
\r
469 if(i >= m_lCount-m_VisibleItems || i + m_VisibleItems > item)
\r
478 InvalidateAndScroll();
\r
480 DoPaintMessageLoop();
\r
483 InvalidateAndScroll();
\r
487 if(item < m_lTopIndex) // scroll up
\r
489 while(item < m_lTopIndex)
\r
491 if(m_lTopIndex > 0)
\r
500 InvalidateAndScroll();
\r
502 DoPaintMessageLoop();
\r
506 InvalidateAndScroll();
\r
513 /*********************************************************************/
\r
515 bool CACListWnd::SelectItem(int item)
\r
517 if(item > m_lCount)
\r
522 EnsureVisible(m_lSelItem,false);
\r
529 if(!EnsureVisible(item,true))
\r
535 /*********************************************************************/
\r
537 int CACListWnd::FindStringExact( int nStartAfter, LPCTSTR lpszString )
\r
539 if(nStartAfter > m_SearchList.GetSize())
\r
542 for(int i = nStartAfter+1; i < m_SearchList.GetSize(); i++)
\r
543 if(m_SearchList.GetAt(i).Compare(lpszString) == 0)
\r
548 /*********************************************************************/
\r
551 * NEW: m_bDisplayOnly
\r
553 int CACListWnd::FindString(int nStartAfter, LPCTSTR lpszString, bool m_bDisplayOnly)
\r
555 long m_AktCount = m_DisplayList.GetSize();
\r
557 if(!m_bDisplayOnly)
\r
559 CString m_Str1,m_Str2 = lpszString;
\r
566 if(nStartAfter > m_SearchList.GetSize())
\r
572 if(m_Str2.IsEmpty())
\r
578 m_DisplayList.RemoveAll();
\r
580 m_Str2.MakeUpper();
\r
582 for(int i = nStartAfter+1; i < m_SearchList.GetSize(); i++)
\r
585 m_Str1 = m_PrefixChar;
\r
589 m_Str1 += m_SearchList.GetAt(i);
\r
591 m_Str1.MakeUpper();
\r
593 if(m_lMode & _MODE_FIND_ALL_)
\r
595 if(m_Str1.Find(m_Str2) >= 0)
\r
597 m_DisplayList.Add(m_SearchList.GetAt(i));
\r
600 else // _MODE_FIND_EXACT_
\r
602 if(m_Str1.Find(m_Str2) == 0)
\r
604 m_DisplayList.Add(m_SearchList.GetAt(i));
\r
609 m_lCount = m_DisplayList.GetSize();
\r
614 int iHeight,iWight;
\r
616 m_pEditParent->GetWindowRect(rcWnd);
\r
624 iHeight = m_lCount*m_ItemHeight+(GetSystemMetrics(SM_CYBORDER)*2);
\r
626 if(m_lCount > _MAX_ENTRYS_)
\r
627 iHeight = _MAX_ENTRYS_*m_ItemHeight+(GetSystemMetrics(SM_CYBORDER)*2);
\r
629 if(!m_LastSize.IsRectEmpty())
\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
637 SetWindowPos(&CWnd::wndTopMost, rcWnd.left,
\r
640 rcWnd.Height(), 0);
\r
644 SetWindowPos(&CWnd::wndTopMost, rcWnd.left,
\r
645 rcWnd.top + rcWnd.Height(),
\r
650 if(m_AktCount != m_DisplayList.GetSize())
\r
653 SortList(m_DisplayList);
\r
663 /*********************************************************************/
\r
665 int CACListWnd::SelectString(LPCTSTR lpszString )
\r
667 int item = FindString(-1, lpszString);
\r
672 /*********************************************************************/
\r
674 bool CACListWnd::GetText(int item, CString& m_Text)
\r
676 if(item < 0 || item > m_SearchList.GetSize())
\r
678 m_Text = m_SearchList.GetAt(item);
\r
682 /*********************************************************************/
\r
684 void CACListWnd::OnShowWindow(BOOL bShow, UINT nStatus)
\r
688 m_nIDTimer = SetTimer( IDTimerInstall, 200, NULL);
\r
689 m_pEditParent->GetParent()->GetWindowRect(m_ParentRect);
\r
694 KillTimer(IDTimerInstall);
\r
700 CWnd::OnShowWindow(bShow, nStatus);
\r
701 ::SetCursor(AfxGetApp()->LoadStandardCursor(IDC_ARROW));
\r
704 /*********************************************************************/
\r
706 void CACListWnd::OnNcLButtonDown(UINT nHitTest, CPoint point)
\r
709 if(OnNcHitTest(point) == HTBOTTOMRIGHT)
\r
710 GetWindowRect(m_LastSize);
\r
711 CWnd::OnNcLButtonDown(nHitTest, point);
\r
714 /*********************************************************************/
\r
716 CString CACListWnd::GetString()
\r
718 int i = m_DisplayList.GetSize();
\r
722 if(i <= m_lSelItem || m_lSelItem == -1)
\r
727 return m_DisplayList.GetAt(i);
\r
730 /*********************************************************************/
\r
732 void CACListWnd::OnVScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar)
\r
734 CWnd::OnVScroll(nSBCode, nPos, pScrollBar);
\r
735 long m_oldlTopIndex = m_lTopIndex;
\r
743 m_lTopIndex -= m_VisibleItems;
\r
744 if(m_lTopIndex < 0)
\r
749 m_lTopIndex += m_VisibleItems;
\r
750 if(m_lTopIndex >= m_lCount-m_VisibleItems)
\r
751 m_lTopIndex = m_lCount-m_VisibleItems;
\r
756 if(m_lTopIndex < 0)
\r
762 if(m_lTopIndex >= m_lCount-m_VisibleItems)
\r
763 m_lTopIndex = m_lCount-m_VisibleItems;
\r
766 case SB_THUMBTRACK:
\r
767 m_lTopIndex = nPos;
\r
771 m_VertBar.SetScrollPos(m_lTopIndex,true);
\r
773 if(m_oldlTopIndex != m_lTopIndex)
\r
777 /*********************************************************************/
\r
779 CString CACListWnd::GetNextString(int nChar)
\r
792 m_lSelItem -= m_VisibleItems;
\r
798 m_lSelItem += m_VisibleItems;
\r
799 if(m_lSelItem >= m_lCount-1)
\r
800 m_lSelItem = m_lCount-1;
\r
808 m_lSelItem = m_lCount-1;
\r
813 m_lSelItem = m_lCount-1;
\r
815 if(m_lSelItem >= m_lCount)
\r
818 if(EnsureVisible(m_lSelItem,(m_lCount > 50) ? false : true))
\r
819 InvalidateAndScroll();
\r
821 return GetString();
\r
824 /*********************************************************************/
\r
826 void CACListWnd::OnMouseMove(UINT nFlags, CPoint point)
\r
828 CWnd::OnMouseMove(nFlags, point);
\r
829 int sel = HitTest(point);
\r
836 /*********************************************************************/
\r
838 void CACListWnd::OnTimer(UINT nIDEvent)
\r
840 CWnd::OnTimer(nIDEvent);
\r
842 CRect m_ParentRect1;
\r
843 m_pEditParent->GetParent()->GetWindowRect(m_ParentRect1);
\r
844 if(!m_ParentRect1.EqualRect(m_ParentRect))
\r
848 /*********************************************************************/
\r
850 void CACListWnd::OnGetMinMaxInfo(MINMAXINFO FAR* lpMMI)
\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
858 if(m_VisibleItems > m_lCount-1 && m_lMinY2 < m_lMinY1)
\r
859 lpMMI->ptMinTrackSize.y = m_lMinY2;
\r
861 lpMMI->ptMinTrackSize.y = m_lMinY1;
\r
864 lpMMI->ptMinTrackSize.x = GetSystemMetrics(SM_CXHSCROLL)*4;
\r
868 if(m_pEditParent != NULL)
\r
871 m_pEditParent->GetWindowRect (&rc);
\r
872 lpMMI->ptMinTrackSize.x = rc.right - rc.left;
\r
876 CWnd::OnGetMinMaxInfo(lpMMI);
\r
879 /*********************************************************************/
\r
881 int CACListWnd::CompareString(const void* p1, const void* p2)
\r
883 return _stricmp( * ( char** ) p1, * ( char** ) p2 );
\r
886 /*********************************************************************/
\r
888 void CACListWnd::SortList(CStringArray& m_List)
\r
890 int m_Count = m_List.GetSize();
\r
895 CStringArray m_Liste1;
\r
896 m_Liste1.Copy(m_List);
\r
898 LPCTSTR* ppSortArray = new LPCTSTR[m_Count+1];
\r
901 for(i=0; i < m_Count; i++)
\r
903 ppSortArray[i] = (LPCTSTR)m_Liste1.GetAt(i);
\r
906 m_List.RemoveAll();
\r
908 qsort(ppSortArray, m_Count, sizeof(LPCTSTR), CompareString);
\r
910 for(i=0; i < m_Count; i++)
\r
912 m_List.Add((LPCTSTR) ppSortArray[i]);
\r
914 m_Liste1.RemoveAll();
\r
915 delete [] ppSortArray;
\r
919 /*********************************************************************/
\r
924 void CACListWnd::CopyList()
\r
926 m_DisplayList.Copy(m_SearchList);
\r
927 m_lCount = m_DisplayList.GetSize();
\r
929 FindString(0,_T(""),true);
\r
932 /*********************************************************************/
\r