1 // ACEdit.cpp: Implementierungsdatei
\r
10 #define new DEBUG_NEW
\r
12 static char THIS_FILE[] = __FILE__;
\r
16 #define _COMBOBOX_ 2
\r
18 /////////////////////////////////////////////////////////////////////////////
\r
23 m_iMode = _MODE_STANDARD_;
\r
26 m_CursorMode = false;
\r
30 /*********************************************************************/
\r
37 /*********************************************************************/
\r
39 BEGIN_MESSAGE_MAP(CACEdit, CWnd)
\r
40 //{{AFX_MSG_MAP(CACEdit)
\r
41 ON_CONTROL_REFLECT(EN_KILLFOCUS, OnKillfocus)
\r
42 ON_CONTROL_REFLECT(CBN_KILLFOCUS, OnKillfocus)
\r
44 ON_CONTROL_REFLECT(EN_CHANGE, OnChange)
\r
45 ON_CONTROL_REFLECT(CBN_EDITCHANGE, OnChange)
\r
46 ON_CONTROL_REFLECT(CBN_DROPDOWN, OnCloseList)
\r
48 ON_MESSAGE(ENAC_UPDATE,OnUpdateFromList)
\r
51 /*********************************************************************/
\r
53 void CACEdit::SetMode(int iMode)
\r
62 ** NEW: _MODE_CURSOR_O_LIST_
\r
64 if(iMode == _MODE_CURSOR_O_LIST_)
\r
65 m_iMode |= _MODE_STANDARD_;
\r
67 if(iMode & _MODE_FILESYSTEM_)
\r
68 m_SeparationStr = _T("\\");
\r
71 if(iMode & _MODE_FIND_ALL_)
\r
73 m_Liste.m_lMode |= _MODE_FIND_ALL_;
\r
77 /*********************************************************************/
\r
79 void CACEdit::Init()
\r
81 CString szClassName = AfxRegisterWndClass(CS_CLASSDC|CS_SAVEBITS|CS_HREDRAW|CS_VREDRAW,
\r
82 0,(HBRUSH) (COLOR_WINDOW), 0);
\r
84 GetWindowRect(rcWnd);
\r
86 VERIFY(m_Liste.CreateEx(WS_EX_TOOLWINDOW,
\r
88 WS_THICKFRAME | WS_CHILD | WS_BORDER |
\r
89 WS_CLIPSIBLINGS | WS_OVERLAPPED,
\r
90 CRect(rcWnd.left, rcWnd.top +20, rcWnd.left+ 200, rcWnd.top+200),
\r
91 GetDesktopWindow(),
\r
94 CString m_ClassName;
\r
95 ::GetClassName(GetSafeHwnd(), m_ClassName.GetBuffer(32), 32);
\r
96 m_ClassName.ReleaseBuffer();
\r
98 if (m_ClassName.Compare(_T("Edit")) == 0)
\r
104 if (m_ClassName.Compare(_T("ComboBox")) == 0)
\r
106 m_iType = _COMBOBOX_;
\r
108 m_pEdit = (CEdit*)GetWindow(GW_CHILD);
\r
110 ::GetClassName(m_pEdit->GetSafeHwnd(), m_ClassName.GetBuffer(32), 32);
\r
111 m_ClassName.ReleaseBuffer();
\r
112 VERIFY(m_ClassName.Compare(_T("Edit")) == 0);
\r
122 m_Liste.Init(this);
\r
125 /*********************************************************************/
\r
127 void CACEdit::AddSearchStrings(LPCTSTR Strings[])
\r
131 if(m_iType == -1) {ASSERT(0); return;}
\r
133 m_Liste.RemoveAll();
\r
140 m_Liste.AddSearchString(str);
\r
147 m_Liste.SortSearchList();
\r
150 /*********************************************************************/
\r
152 void CACEdit::AddSearchString(LPCTSTR lpszString)
\r
154 if(m_iType == -1) {ASSERT(0); return;}
\r
156 m_Liste.AddSearchString(lpszString);
\r
159 /*********************************************************************/
\r
161 void CACEdit::RemoveSearchAll()
\r
163 if(m_iType == -1) {ASSERT(0); return;}
\r
165 m_Liste.RemoveAll();
\r
168 /*********************************************************************/
\r
170 void CACEdit::OnKillfocus()
\r
172 if(m_Liste.GetSafeHwnd()) // fix Vers 1.1
\r
173 m_Liste.ShowWindow(false);
\r
176 /*********************************************************************/
\r
178 void CACEdit::OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags)
\r
180 if(!HandleKey(nChar,false))
\r
181 CWnd::OnKeyDown(nChar, nRepCnt, nFlags);
\r
184 /*********************************************************************/
\r
186 bool CACEdit::HandleKey(UINT nChar, bool m_bFromChild)
\r
188 if (nChar == VK_ESCAPE ||nChar == VK_RETURN)
\r
190 m_Liste.ShowWindow(false);
\r
194 if (nChar == VK_DOWN || nChar == VK_UP
\r
195 || nChar == VK_PRIOR || nChar == VK_NEXT
\r
196 || nChar == VK_HOME || nChar == VK_END)
\r
200 ** NEW: _MODE_CURSOR_O_LIST_
\r
202 if(!m_Liste.IsWindowVisible() && (m_iMode & _MODE_CURSOR_O_LIST_))
\r
204 GetWindowText(m_EditText);
\r
205 if(m_EditText.IsEmpty())
\r
207 m_Liste.CopyList();
\r
212 if(m_Liste.IsWindowVisible())
\r
217 if(m_iMode & _MODE_STANDARD_
\r
218 || m_iMode & _MODE_FILESYSTEM_
\r
219 || m_iMode & _MODE_FS_START_DIR_)
\r
221 m_CursorMode = true;
\r
224 m_EditText = m_Liste.GetNextString(nChar);
\r
226 m_EditText = m_Liste.GetString();
\r
228 if(m_iMode & _MODE_FILESYSTEM_)
\r
230 if (m_EditText.Right(1) == _T('\\'))
\r
231 m_EditText = m_EditText.Mid(0,m_EditText.GetLength()-1);
\r
234 m_Liste.SelectItem(-1);
\r
235 SetWindowText(m_EditText);
\r
236 pos = m_EditText.GetLength();
\r
238 if(m_iType == _COMBOBOX_)
\r
240 m_pEdit->SetSel(pos,pos,true);
\r
241 m_pEdit->SetModify(true);
\r
244 if(m_iType == _EDIT_)
\r
246 ((CEdit*)this)->SetSel(pos,pos,true);
\r
247 ((CEdit*)this)->SetModify(true);
\r
250 GetParent()->SendMessage(ENAC_UPDATE, WM_KEYDOWN, GetDlgCtrlID());
\r
251 m_CursorMode = false;
\r
255 if(m_iMode & _MODE_SEPARATION_)
\r
257 CString m_Text,m_Left,m_Right;
\r
258 int left,right,pos=0,len;
\r
260 m_CursorMode = true;
\r
262 GetWindowText(m_EditText);
\r
264 if(m_iType == _EDIT_)
\r
265 pos = LOWORD(((CEdit*)this)->CharFromPos(GetCaretPos()));
\r
267 if(m_iType == _COMBOBOX_)
\r
268 pos = m_pEdit->CharFromPos(m_pEdit->GetCaretPos());
\r
270 left = FindSepLeftPos(pos-1,true);
\r
271 right = FindSepRightPos(pos);
\r
273 m_Text = m_EditText.Left(left);
\r
276 m_Text += m_Liste.GetNextString(nChar);
\r
278 m_Text += m_Liste.GetString();
\r
280 m_Liste.SelectItem(-1);
\r
281 m_Text += m_EditText.Mid(right);
\r
282 len = m_Liste.GetString().GetLength();
\r
284 m_Text += this->m_SeparationStr;
\r
286 SetWindowText(m_Text);
\r
287 GetParent()->SendMessage(ENAC_UPDATE, WM_KEYDOWN, GetDlgCtrlID());
\r
289 right = FindSepLeftPos2(pos-1);
\r
293 left+=m_SeparationStr.GetLength();
\r
295 if(m_iType == _EDIT_)
\r
297 ((CEdit*)this)->SetModify(true);
\r
298 ((CEdit*)this)->SetSel(left+len,left+len,false);
\r
301 if(m_iType == _COMBOBOX_)
\r
303 m_pEdit->SetModify(true);
\r
304 m_pEdit->SetSel(left,left+len,true);
\r
307 m_CursorMode = false;
\r
315 /*********************************************************************/
\r
317 void CACEdit::OnChange()
\r
323 {ASSERT(0); return;}
\r
325 GetWindowText(m_EditText);
\r
326 len = m_EditText.GetLength();
\r
327 //----------------------------------------------
\r
328 if(m_iMode & _MODE_FILESYSTEM_ || m_iMode & _MODE_FS_START_DIR_)
\r
332 if(m_iType == _EDIT_)
\r
333 pos = LOWORD(((CEdit*)this)->CharFromPos(GetCaretPos()));
\r
335 if(m_iType == _COMBOBOX_)
\r
336 pos = m_pEdit->CharFromPos(m_pEdit->GetCaretPos());
\r
338 if(m_iMode & _MODE_FS_START_DIR_)
\r
341 m_Liste.FindString(-1,m_EditText);
\r
343 m_Liste.ShowWindow(false);
\r
347 if(len > 2 && pos == len)
\r
349 if(_taccess(m_EditText,0) == 0)
\r
351 ReadDirectory(m_EditText);
\r
353 m_Liste.FindString(-1,m_EditText);
\r
356 m_Liste.ShowWindow(false);
\r
360 //----------------------------------------------
\r
361 if(m_iMode & _MODE_SEPARATION_)
\r
365 if(m_iType == _EDIT_)
\r
366 pos = LOWORD(((CEdit*)this)->CharFromPos(GetCaretPos()));
\r
368 if(m_iType == _COMBOBOX_)
\r
369 pos = m_pEdit->CharFromPos(m_pEdit->GetCaretPos());
\r
372 left = FindSepLeftPos(pos-1);
\r
373 right = FindSepRightPos(pos);
\r
374 m_Text = m_EditText.Mid(left,right-left);
\r
375 m_Liste.FindString(-1,m_Text);
\r
378 //----------------------------------------------
\r
379 if(m_iMode & _MODE_STANDARD_)
\r
382 m_Liste.FindString(-1,m_EditText);
\r
384 //----------------------------------------------
\r
385 GetParent()->SendMessage(ENAC_UPDATE, EN_UPDATE, GetDlgCtrlID());
\r
388 /*********************************************************************/
\r
390 int CACEdit::FindSepLeftPos(int pos,bool m_bIncludePrefix)
\r
392 int len = m_EditText.GetLength();
\r
396 if(pos >= len && len != 1)
\r
399 for(i = pos; i >= 0 ; i--)
\r
401 ch = m_EditText.GetAt(i);
\r
402 if(m_PrefixChar == ch)
\r
403 return i + (m_bIncludePrefix ? 1 : 0);
\r
404 if(m_SeparationStr.Find(ch) != -1)
\r
411 /*********************************************************************/
\r
413 int CACEdit::FindSepLeftPos2(int pos)
\r
415 int len = m_EditText.GetLength();
\r
418 if(pos >= len && len != 1)
\r
424 for(int i = pos; i >= 0 ; i--)
\r
426 ch = m_EditText.GetAt(i);
\r
427 if(m_PrefixChar == ch)
\r
434 /*********************************************************************/
\r
436 int CACEdit::FindSepRightPos(int pos)
\r
438 int len = m_EditText.GetLength();
\r
442 for(i = pos; i < len ; i++)
\r
444 ch = m_EditText.GetAt(i);
\r
445 if(m_SeparationStr.Find(ch) != -1)
\r
452 /*********************************************************************/
\r
454 LONG CACEdit::OnUpdateFromList(UINT lParam, LONG /*wParam*/)
\r
458 if(lParam == WM_KEYDOWN)
\r
460 HandleKey(VK_DOWN,true);
\r
465 /*********************************************************************/
\r
467 void CACEdit::OnCloseList()
\r
469 m_Liste.ShowWindow(false);
\r
472 /*********************************************************************/
\r
474 BOOL CACEdit::PreTranslateMessage(MSG* pMsg)
\r
476 if(pMsg->message == WM_KEYDOWN)
\r
478 if(m_Liste.IsWindowVisible())
\r
480 if(m_iType == _COMBOBOX_)
\r
482 if(pMsg->wParam == VK_DOWN || pMsg->wParam == VK_UP)
\r
483 if(HandleKey(pMsg->wParam,false))
\r
487 if(pMsg->wParam == VK_ESCAPE || pMsg->wParam == VK_RETURN)
\r
488 if(HandleKey(pMsg->wParam,false))
\r
492 return CWnd::PreTranslateMessage(pMsg);
\r
495 /*********************************************************************/
\r
497 void CACEdit::ReadDirectory(CString m_Dir)
\r
499 CFileFind FoundFiles;
\r
503 // Wenn mittem im Pfad,
\r
504 // vorheriges Verzeichnis einlesen.
\r
505 if (m_Dir.Right(1) != _T('\\'))
\r
507 _tsplitpath(m_Dir, m_szDrive, m_szDir, m_szFname, m_szExt);
\r
508 m_Dir.Format(_T("%s%s"),m_szDrive, m_szDir);
\r
512 ch = (TCHAR)towupper(m_Dir.GetAt(0));
\r
515 CString m_Name,m_File,m_Dir1 = m_Dir;
\r
516 if (m_Dir.Right(1) != _T('\\'))
\r
519 if(m_LastDirectory.CompareNoCase(m_Dir) == 0 && m_Liste.m_SearchList.GetSize())
\r
522 m_LastDirectory = m_Dir;
\r
523 m_Dir += _T("*.*");
\r
525 BOOL bContinue = FoundFiles.FindFile(m_Dir);
\r
529 while (bContinue == TRUE)
\r
531 bContinue = FoundFiles.FindNextFile();
\r
532 m_File = FoundFiles.GetFileName();
\r
534 if(FoundFiles.IsHidden() || FoundFiles.IsSystem())
\r
536 if(FoundFiles.IsDirectory())
\r
538 if(m_iMode & _MODE_ONLY_FILES)
\r
540 if(FoundFiles.IsDots())
\r
543 if (m_File.Right(1) != _T('\\'))
\r
544 m_File += _T("\\");
\r
547 if(!FoundFiles.IsDirectory())
\r
548 if(m_iMode & _MODE_ONLY_DIRS)
\r
551 if(m_iMode & _MODE_FS_START_DIR_)
\r
558 if (m_Name.Right(1) != _T('\\'))
\r
559 m_Name += _T("\\");
\r
564 AddSearchString(m_Name);
\r
566 FoundFiles.Close();
\r
571 /*********************************************************************/
\r
573 void CACEdit::SetStartDirectory(LPCTSTR lpszString)
\r
575 if(m_iType == -1) {ASSERT(0); return;}
\r
577 if(m_iMode & _MODE_FS_START_DIR_)
\r
578 ReadDirectory(lpszString);
\r
581 /*********************************************************************
\r
584 *********************************************************************/
\r
586 int CACEdit::AddString( LPCTSTR lpszString )
\r
588 if(m_iType == _COMBOBOX_)
\r
590 return ((CComboBox *)this)->AddString(lpszString);
\r
595 /*********************************************************************/
\r
597 int CACEdit::SetDroppedWidth( UINT nWidth )
\r
599 if(m_iType == _COMBOBOX_)
\r
601 return ((CComboBox *)this)->SetDroppedWidth(nWidth);
\r
606 /*********************************************************************/
\r
608 int CACEdit::FindString( int nStartAfter, LPCTSTR lpszString )
\r
610 if(m_iType == _COMBOBOX_)
\r
612 return ((CComboBox *)this)->FindString(nStartAfter,lpszString);
\r
617 /*********************************************************************/
\r
619 int CACEdit::SelectString( int nStartAfter, LPCTSTR lpszString )
\r
621 if(m_iType == _COMBOBOX_)
\r
623 return ((CComboBox *)this)->SelectString(nStartAfter,lpszString);
\r
628 /*********************************************************************/
\r
630 void CACEdit::ShowDropDown(BOOL bShowIt)
\r
632 if(m_iType == _COMBOBOX_)
\r
634 ((CComboBox *)this)->ShowDropDown(bShowIt);
\r
638 /*********************************************************************/
\r
640 void CACEdit::ResetContent()
\r
642 if(m_iType == _COMBOBOX_)
\r
644 ((CComboBox *)this)->ResetContent();
\r
648 /*********************************************************************/
\r
650 int CACEdit::GetCurSel()
\r
652 if(m_iType == _COMBOBOX_)
\r
654 return ((CComboBox *)this)->GetCurSel();
\r
659 /*********************************************************************/
\r
661 int CACEdit::GetLBText( int nIndex, LPTSTR lpszText )
\r
663 if(m_iType == _COMBOBOX_)
\r
665 return ((CComboBox *)this)->GetLBText(nIndex,lpszText);
\r
670 /*********************************************************************/
\r
672 void CACEdit::GetLBText( int nIndex, CString& rString )
\r
674 if(m_iType == _COMBOBOX_)
\r
676 ((CComboBox *)this)->GetLBText(nIndex,rString);
\r
680 /*********************************************************************/
\r