bool CFulEditCtrl::LastSeen(tstring & nick){ FINDTEXTEX ft; CHARRANGE sel; int result; bool found = false; tstring search = _T("<") + nick + _T(">"); ft.chrg.cpMin = 0; ft.chrg.cpMax = -1; ft.lpstrText = search.c_str(); //bah only EM_FINDTEXT is able to search up while(-1 != (result = (int)::SendMessage(m_hWnd, EM_FINDTEXTEX, FR_DOWN | FR_WHOLEWORD, (LPARAM)&ft))){ found = true; ft.chrg.cpMin = result+1; sel = ft.chrgText; } if(!found) return false; SetSel(sel); ScrollCaret(); return true; }
void CFulEditCtrl::ScrollToEnd() { SetRedraw(FALSE); SetSel(0, 0); ScrollCaret(); int l = GetTextLength(); SetSel(l, l); SendMessage(EM_SCROLLCARET, 0, 0); SetRedraw(TRUE); Invalidate(); }
void CFulEditCtrl::AddInternalLine(const tstring & aLine) { int length = GetTextLengthEx(GTL_NUMCHARS)+1; AppendText(_T("\r")); AppendText(aLine.c_str()); CHARRANGE cr; GetSel(cr); //HideSelection(TRUE, FALSE); Colorize(aLine, length); CheckUrls(aLine, length); SetSel(GetTextLengthEx(GTL_NUMCHARS), GetTextLengthEx(GTL_NUMCHARS)); ScrollCaret(); SetSel(cr); //HideSelection(FALSE, FALSE); skipLog = false; }
LRESULT CFulEditCtrl::onFind(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM lParam, BOOL& /*bHandled*/) { LPFINDREPLACE fr = reinterpret_cast<LPFINDREPLACE>(lParam); if(fr->Flags & FR_DIALOGTERM){ WinUtil::findDialog = NULL; } else if(fr->Flags & FR_FINDNEXT){ //prepare the flags used to search int flags = 0; if(fr->Flags & FR_WHOLEWORD) flags = FR_WHOLEWORD; if(fr->Flags & FR_MATCHCASE) flags |= FR_MATCHCASE; if(fr->Flags & FR_DOWN) flags |= FR_DOWN; //initiate the structure, cpMax -1 means the whole document is searched FINDTEXTEX ft; ft.chrg.cpMax = -1; ft.chrg.cpMin = curFindPos; ft.lpstrText = fr->lpstrFindWhat; //if we find the end of the document, notify the user and return int result = (int)SendMessage(EM_FINDTEXT, (WPARAM)flags, (LPARAM)&ft); if(-1 == result){ MessageBox(CTSTRING(FINISHED_SEARCHING), _T(FULDC) _T(" ") _T(FULVERSIONSTRING), MB_OK | MB_ICONINFORMATION); curFindPos = 0; return 0; } //select the result and scroll it into view curFindPos = result +1 ; SetFocus(); SetSel(result, result + _tcslen(ft.lpstrText)); ScrollCaret(); } return 0; }
/*---------------------------------------------------------------------------------------------- This processes Windows messages on the window. In general, it normally calls the appropriate method on the edit class. ----------------------------------------------------------------------------------------------*/ bool TssEdit::FWndProc(uint wm, WPARAM wp, LPARAM lp, long & lnRet) { bool fRet; switch (wm) { case WM_GETDLGCODE: // This is essential when embedded in a dialog to tell the dialog manager that it // wants to get key strokes. (We could try DLGC_WANTALLKEYS but I think we would then // get the Tab and Return keys...we may get them anyway with this combination...) // The last value tells Windows that when tabbing to this control we should use // EM_SETSEL to select all the text. lnRet = DLGC_WANTCHARS | DLGC_WANTARROWS | DLGC_HASSETSEL; return true; case EM_GETLINE: // Use FW_EM_GETLINE. case EM_REPLACESEL: // Use FW_EM_REPLACESEL. // We don't support these methods. Use the replacement TsString versions instead. Assert(false); lnRet = LB_ERR; return true; // NOTE: DO NOT send this message to a TssEdit if you want the actual text. Send the // FW_EM_GETTEXT message instead. This method is required for TssEdit controls on a // dialog because Windows will send the message to the control anytime the user hits a // key. case WM_GETTEXT: { ITsStringPtr qtss; GetText(&qtss); const wchar * pwrgch; int cch; HRESULT hr; IgnoreHr(hr = qtss->LockText(&pwrgch, &cch)); if (FAILED(hr)) return true; StrApp str(pwrgch, cch); qtss->UnlockText(pwrgch); lnRet = Min(cch + 1, (int)wp); achar * psz = reinterpret_cast<achar *>(lp); StrCpyN(psz, str.Chars(), lnRet); } return true; // NOTE: You should be sending an FW_EM_SETTEXT message instead of this. case WM_SETTEXT: { achar * psz = reinterpret_cast<achar *>(lp); StrUni stu(psz); ITsStrFactoryPtr qtsf; qtsf.CreateInstance(CLSID_TsStrFactory); ITsStringPtr qtss; CheckHr(qtsf->MakeStringRgch(stu.Chars(), stu.Length(), m_wsBase, &qtss)); SetText(qtss); } return true; case EM_CANUNDO: case EM_CHARFROMPOS: case EM_EMPTYUNDOBUFFER: case EM_FMTLINES: case EM_GETFIRSTVISIBLELINE: case EM_GETHANDLE: case EM_GETMODIFY: case EM_GETPASSWORDCHAR: case EM_GETRECT: case EM_GETTHUMB: case EM_GETWORDBREAKPROC: case EM_POSFROMCHAR: case EM_SETHANDLE: case EM_SETMODIFY: case EM_SETPASSWORDCHAR: case EM_SETRECT: case EM_SETRECTNP: case EM_SETTABSTOPS: case EM_SETWORDBREAKPROC: case EM_UNDO: case WM_GETFONT: case WM_SETFONT: // We don't support these methods. Assert(false); lnRet = LB_ERR; return true; case EM_GETLIMITTEXT: lnRet = GetLimitText(); return true; case FW_EM_GETLINE: lnRet = GetLine(wp, (ITsString **)lp); return true; case EM_GETLINECOUNT: lnRet = GetLineCount(); return true; case EM_GETMARGINS: lnRet = GetMargins(); return true; case FW_EM_GETSTYLE: GetStyle((StrUni *)lp, (COLORREF *)wp); return true; case EM_GETSEL: lnRet = GetSel((int *)wp, (int *)lp); return true; case EM_LINEFROMCHAR: lnRet = LineFromChar(wp); return true; case EM_LINEINDEX: lnRet = LineIndex(wp); return true; case EM_LINELENGTH: lnRet = LineLength(wp); return true; case EM_LINESCROLL: LineScroll(lp, wp); return true; case FW_EM_REPLACESEL: ReplaceSel((ITsString *)lp); return true; case EM_SCROLL: lnRet = ::SendMessage(m_hwnd, WM_VSCROLL, LOWORD(wp), 0); return true; case EM_SCROLLCARET: ScrollCaret(); return true; case EM_SETLIMITTEXT: SetLimitText(wp); return true; case EM_SETMARGINS: SetMargins(wp, LOWORD(lp), HIWORD(lp)); return true; case EM_SETREADONLY: SetReadOnly(wp); return true; case EM_SETSEL: SetSel(wp, lp); return true; case FW_EM_SETSTYLE: SetStyle((StrUni *)lp, (COLORREF)wp); return true; case WM_GETTEXTLENGTH: lnRet = GetTextLength(); return true; case FW_EM_GETTEXT: GetText((ITsString **)lp); return true; case FW_EM_SETTEXT: SetText((ITsString *)lp); return true; case WM_COPY: Copy(); return true; case WM_CUT: Cut(); return true; case WM_PASTE: Paste(); return true; case WM_HSCROLL: if (!OnHScroll(LOWORD(wp), HIWORD(wp), (HWND)lp)) { ::SendMessage(::GetParent(m_hwnd), WM_COMMAND, MAKEWPARAM(::GetDlgCtrlID(m_hwnd), EN_HSCROLL), (LPARAM)m_hwnd); } return true; case WM_VSCROLL: if (!OnVScroll(LOWORD(wp), HIWORD(wp), (HWND)lp)) { ::SendMessage(::GetParent(m_hwnd), WM_COMMAND, MAKEWPARAM(::GetDlgCtrlID(m_hwnd), EN_VSCROLL), (LPARAM)m_hwnd); } return true; case WM_KILLFOCUS: if (!OnKillFocus((HWND)wp)) { ::SendMessage(::GetParent(m_hwnd), WM_COMMAND, MAKEWPARAM(::GetDlgCtrlID(m_hwnd), EN_KILLFOCUS), (LPARAM)m_hwnd); } return true; case WM_SETFOCUS: if (!OnSetFocus((HWND)wp)) { ::SendMessage(::GetParent(m_hwnd), WM_COMMAND, MAKEWPARAM(::GetDlgCtrlID(m_hwnd), EN_SETFOCUS), (LPARAM)m_hwnd); } return true; // Calling SuperClass here causes two OnSetFocus calls for each OnKillFocus. //return SuperClass::FWndProc(wm, wp, lp, lnRet); case WM_CHAR: fRet = false; if (wp == VK_TAB) // '\t' { fRet = OnCharTab(); } else if (wp == VK_RETURN) // '\r' { fRet = OnCharEnter(); } else if (wp == VK_ESCAPE) // '\33' { fRet = OnCharEscape(); } if (fRet) return fRet; else return SuperClass::FWndProc(wm, wp, lp, lnRet); case WM_LBUTTONDOWN: case WM_LBUTTONUP: case WM_MBUTTONDOWN: case WM_MBUTTONUP: case WM_RBUTTONDOWN: case WM_RBUTTONUP: case WM_MOUSEMOVE: if (HasToolTip()) { // Notify the tooltip belonging to the parent toolbar of the mouse message. Assert(m_hwndToolTip); MSG msg; msg.hwnd = m_hwnd; // ::GetParent(m_hwnd); msg.message = wm; msg.wParam = wp; msg.lParam = lp; ::SendMessage(m_hwndToolTip, TTM_RELAYEVENT, 0, (LPARAM)&msg); } break; default: break; } return SuperClass::FWndProc(wm, wp, lp, lnRet); }
bool CFulEditCtrl::AddLine(const tstring & line, bool aTimeStamps) { bool noScroll = false; matchedTab = false; timeStamps = aTimeStamps; tstring aLine = Util::replace(line, _T("\r\n"), _T("\r")); if(GetWindowTextLength() > SETTING(CHATBUFFERSIZE)) { SetRedraw(FALSE); int ch = LineIndex(LineFromChar(2000)); SetSel(0, ch); ReplaceSel(_T("")); UpdateUrlRanges(ch); SetSel(GetTextLengthEx(GTL_NUMCHARS), GetTextLengthEx(GTL_NUMCHARS)); ScrollCaret(); SetRedraw(TRUE); } if(Util::strnicmp(_T("<") + nick + _T(">"), aLine, nick.length() + 2) == 0) skipLog = true; if(isSet(STRIP_ISP) && aLine[0] == _T('<')) { tstring::size_type end = aLine.find(_T(">")); if( end != tstring::npos ) { tstring::size_type pos = aLine.rfind(_T("]"), end); if( end > 0 && (end-1) == pos ) pos = aLine.rfind(_T("]"), pos-1); if(pos != string::npos) aLine = _T("<") + aLine.substr(pos+1); } } tstring::size_type pos = aLine.find(_T("> /me ")); if( pos != tstring::npos) aLine = _T("** ") + aLine.substr(1, pos-1) + aLine.substr(pos+5, aLine.length()); if(timeStamps) aLine = _T("[") + Util::getShortTimeString() + _T("] ") + aLine; SetRedraw(FALSE); //Get the pos of the last char POINT pt = PosFromChar(GetTextLengthEx(GTL_NUMCHARS)); CRect rc; GetClientRect(&rc); int l = -1; //check if the last char is visible, if not then save the //scrollbar position if(rc.PtInRect(pt)){ noScroll = false; } else { noScroll = true; l = GetFirstVisibleLine(); } AddInternalLine(aLine); //restore the scrollbar position if(noScroll) { LineScroll(l - GetFirstVisibleLine()); } SetRedraw(); Invalidate(); UpdateWindow(); return matchedTab; }