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
453 LRESULT CACEdit::OnUpdateFromList(WPARAM lParam, LPARAM /*wParam*/)
\r
457 if(lParam == WM_KEYDOWN)
\r
459 HandleKey(VK_DOWN,true);
\r
464 /*********************************************************************/
\r
466 void CACEdit::OnCloseList()
\r
468 m_Liste.ShowWindow(false);
\r
471 /*********************************************************************/
\r
473 BOOL CACEdit::PreTranslateMessage(MSG* pMsg)
\r
475 if(pMsg->message == WM_KEYDOWN)
\r
477 if(m_Liste.IsWindowVisible())
\r
479 if(m_iType == _COMBOBOX_)
\r
481 if(pMsg->wParam == VK_DOWN || pMsg->wParam == VK_UP)
\r
482 if(HandleKey(pMsg->wParam,false))
\r
486 if(pMsg->wParam == VK_ESCAPE || pMsg->wParam == VK_RETURN)
\r
487 if(HandleKey(pMsg->wParam,false))
\r
491 return CWnd::PreTranslateMessage(pMsg);
\r
494 /*********************************************************************/
\r
496 void CACEdit::ReadDirectory(CString m_Dir)
\r
498 CFileFind FoundFiles;
\r
502 // Wenn mittem im Pfad,
\r
503 // vorheriges Verzeichnis einlesen.
\r
504 if (m_Dir.Right(1) != _T('\\'))
\r
506 _tsplitpath(m_Dir, m_szDrive, m_szDir, m_szFname, m_szExt);
\r
507 m_Dir.Format(_T("%s%s"),m_szDrive, m_szDir);
\r
511 ch = (TCHAR)towupper(m_Dir.GetAt(0));
\r
514 CString m_Name,m_File,m_Dir1 = m_Dir;
\r
515 if (m_Dir.Right(1) != _T('\\'))
\r
518 if(m_LastDirectory.CompareNoCase(m_Dir) == 0 && m_Liste.m_SearchList.GetSize())
\r
521 m_LastDirectory = m_Dir;
\r
522 m_Dir += _T("*.*");
\r
524 BOOL bContinue = FoundFiles.FindFile(m_Dir);
\r
528 while (bContinue == TRUE)
\r
530 bContinue = FoundFiles.FindNextFile();
\r
531 m_File = FoundFiles.GetFileName();
\r
533 if(FoundFiles.IsHidden() || FoundFiles.IsSystem())
\r
535 if(FoundFiles.IsDirectory())
\r
537 if(m_iMode & _MODE_ONLY_FILES)
\r
539 if(FoundFiles.IsDots())
\r
542 if (m_File.Right(1) != _T('\\'))
\r
543 m_File += _T("\\");
\r
546 if(!FoundFiles.IsDirectory())
\r
547 if(m_iMode & _MODE_ONLY_DIRS)
\r
550 if(m_iMode & _MODE_FS_START_DIR_)
\r
557 if (m_Name.Right(1) != _T('\\'))
\r
558 m_Name += _T("\\");
\r
563 AddSearchString(m_Name);
\r
565 FoundFiles.Close();
\r
570 /*********************************************************************/
\r
572 void CACEdit::SetStartDirectory(LPCTSTR lpszString)
\r
574 if(m_iType == -1) {ASSERT(0); return;}
\r
576 if(m_iMode & _MODE_FS_START_DIR_)
\r
577 ReadDirectory(lpszString);
\r
580 /*********************************************************************
\r
583 *********************************************************************/
\r
585 int CACEdit::AddString( LPCTSTR lpszString )
\r
587 if(m_iType == _COMBOBOX_)
\r
589 return ((CComboBox *)this)->AddString(lpszString);
\r
594 /*********************************************************************/
\r
596 int CACEdit::SetDroppedWidth( UINT nWidth )
\r
598 if(m_iType == _COMBOBOX_)
\r
600 return ((CComboBox *)this)->SetDroppedWidth(nWidth);
\r
605 /*********************************************************************/
\r
607 int CACEdit::FindString( int nStartAfter, LPCTSTR lpszString )
\r
609 if(m_iType == _COMBOBOX_)
\r
611 return ((CComboBox *)this)->FindString(nStartAfter,lpszString);
\r
616 /*********************************************************************/
\r
618 int CACEdit::SelectString( int nStartAfter, LPCTSTR lpszString )
\r
620 if(m_iType == _COMBOBOX_)
\r
622 return ((CComboBox *)this)->SelectString(nStartAfter,lpszString);
\r
627 /*********************************************************************/
\r
629 void CACEdit::ShowDropDown(BOOL bShowIt)
\r
631 if(m_iType == _COMBOBOX_)
\r
633 ((CComboBox *)this)->ShowDropDown(bShowIt);
\r
637 /*********************************************************************/
\r
639 void CACEdit::ResetContent()
\r
641 if(m_iType == _COMBOBOX_)
\r
643 ((CComboBox *)this)->ResetContent();
\r
647 /*********************************************************************/
\r
649 int CACEdit::GetCurSel()
\r
651 if(m_iType == _COMBOBOX_)
\r
653 return ((CComboBox *)this)->GetCurSel();
\r
658 /*********************************************************************/
\r
660 int CACEdit::GetLBText( int nIndex, LPTSTR lpszText )
\r
662 if(m_iType == _COMBOBOX_)
\r
664 return ((CComboBox *)this)->GetLBText(nIndex,lpszText);
\r
669 /*********************************************************************/
\r
671 void CACEdit::GetLBText( int nIndex, CString& rString )
\r
673 if(m_iType == _COMBOBOX_)
\r
675 ((CComboBox *)this)->GetLBText(nIndex,rString);
\r
679 /*********************************************************************/
\r