void OnMenuFindNext(WindowInfo *win) { if (!win->IsDocLoaded() || !NeedsFindUI(win)) return; if (SendMessage(win->hwndToolbar, TB_ISBUTTONENABLED, IDM_FIND_NEXT, 0)) FindTextOnThread(win, FIND_FORWARD); }
void OnMenuFind(WindowInfo *win) { if (win->IsChm()) { win->dm->AsChmEngine()->FindInCurrentPage(); return; } if (!win->IsDocLoaded() || !NeedsFindUI(win)) return; // copy any selected text to the find bar, if it's still empty if (win->dm->textSelection->result.len > 0 && Edit_GetTextLength(win->hwndFindBox) == 0) { ScopedMem<WCHAR> selection(win->dm->textSelection->ExtractText(L" ")); str::NormalizeWS(selection); if (!str::IsEmpty(selection.Get())) { win::SetText(win->hwndFindBox, selection); Edit_SetModify(win->hwndFindBox, TRUE); } } // Don't show a dialog if we don't have to - use the Toolbar instead if (gGlobalPrefs->toolbarVisible && !win->fullScreen && !win->presentation) { if (GetFocus() == win->hwndFindBox) SendMessage(win->hwndFindBox, WM_SETFOCUS, 0, 0); else SetFocus(win->hwndFindBox); return; } ScopedMem<WCHAR> previousFind(win::GetText(win->hwndFindBox)); WORD state = (WORD)SendMessage(win->hwndToolbar, TB_GETSTATE, IDM_FIND_MATCH, 0); bool matchCase = (state & TBSTATE_CHECKED) != 0; ScopedMem<WCHAR> findString(Dialog_Find(win->hwndFrame, previousFind, &matchCase)); if (!findString) return; win::SetText(win->hwndFindBox, findString); Edit_SetModify(win->hwndFindBox, TRUE); bool matchCaseChanged = matchCase != (0 != (state & TBSTATE_CHECKED)); if (matchCaseChanged) { if (matchCase) state |= TBSTATE_CHECKED; else state &= ~TBSTATE_CHECKED; SendMessage(win->hwndToolbar, TB_SETSTATE, IDM_FIND_MATCH, state); win->dm->textSearch->SetSensitive(matchCase); } FindTextOnThread(win); }
bool StressTest::GoToNextPage() { double pageRenderTime = currPageRenderTime.GetTimeInMs(); ScopedMem<TCHAR> s(str::Format(_T("Page %d rendered in %d milliseconds"), currPage, (int)pageRenderTime)); ShowNotification(win, s, true, false, NG_STRESS_TEST_BENCHMARK); ++currPage; while (!IsInRange(pageRanges, currPage) && currPage <= win->dm->PageCount()) { currPage++; } if (currPage > win->dm->PageCount()) { if (GoToNextFile()) return true; Finished(true); return false; } win->dm->GoToPage(currPage, 0); currPageRenderTime.Start(); // start text search when we're in the middle of the document, so that // search thread touches both pages that were already rendered and not yet // rendered // TODO: it would be nice to also randomize search starting page but the // current API doesn't make it easy if (currPage == pageForSearchStart) { // use text that is unlikely to be found, so that we search all pages win::SetText(win->hwndFindBox, _T("!z_yt")); FindTextOnThread(win); } if (1 == rand() % 3) { ClientRect rect(win->hwndFrame); int deltaX = (rand() % 40) - 23; rect.dx += deltaX; if (rect.dx < 300) rect.dx += (abs(deltaX) * 3); int deltaY = (rand() % 40) - 23; rect.dy += deltaY; if (rect.dy < 300) rect.dy += (abs(deltaY) * 3); SendMessage(win->hwndFrame, WM_SIZE, 0, MAKELONG(rect.dx, rect.dy)); } return true; }
void OnMenuFindSel(WindowInfo *win, TextSearchDirection direction) { if (!win->IsDocLoaded() || !NeedsFindUI(win) || win->IsChm()) return; if (!win->selectionOnPage || 0 == win->dm->textSelection->result.len) return; ScopedMem<WCHAR> selection(win->dm->textSelection->ExtractText(L" ")); str::NormalizeWS(selection); if (str::IsEmpty(selection.Get())) return; win::SetText(win->hwndFindBox, selection); AbortFinding(win); // cancel FAYT Edit_SetModify(win->hwndFindBox, FALSE); win->dm->textSearch->SetLastResult(win->dm->textSelection); FindTextOnThread(win, direction); }
bool StressTest::OpenFile(const TCHAR *fileName) { bool reuse = rand() % 3 != 1; _tprintf(_T("%s\n"), fileName); fflush(stdout); LoadArgs args(fileName, NULL, true /* show */, reuse); WindowInfo *w = LoadDocument(args); if (!w) return false; if (w == win) { // WindowInfo reused if (!win->dm) return false; } else if (!w->dm) { // new WindowInfo CloseWindow(w, false, true); return false; } // transfer ownership of stressTest object to a new window and close the // current one assert(this == win->stressTest); if (w != win) { if (win->IsDocLoaded()) { // try to provoke a crash in RenderCache cleanup code ClientRect rect(win->hwndFrame); rect.Inflate(rand() % 10, rand() % 10); SendMessage(win->hwndFrame, WM_SIZE, 0, MAKELONG(rect.dx, rect.dy)); win->RenderPage(1); win->RepaintAsync(); } WindowInfo *toClose = win; w->stressTest = win->stressTest; win->stressTest = NULL; win = w; CloseWindow(toClose, false, false); } if (!win->dm) return false; win->dm->ChangeDisplayMode(DM_CONTINUOUS); win->dm->ZoomTo(ZOOM_FIT_PAGE); win->dm->GoToFirstPage(); if (win->tocVisible || gGlobalPrefs.favVisible) SetSidebarVisibility(win, win->tocVisible, gGlobalPrefs.favVisible); currPage = pageRanges.At(0).start; win->dm->GoToPage(currPage, 0); currPageRenderTime.Start(); ++filesCount; pageForSearchStart = (rand() % win->dm->PageCount()) + 1; // search immediately in single page documents if (1 == pageForSearchStart) { // use text that is unlikely to be found, so that we search all pages win::SetText(win->hwndFindBox, _T("!z_yt")); FindTextOnThread(win); } int secs = SecsSinceSystemTime(stressStartTime); ScopedMem<TCHAR> tm(FormatTime(secs)); ScopedMem<TCHAR> s(str::Format(_T("File %d: %s, time: %s"), filesCount, fileName, tm)); ShowNotification(win, s, false, false, NG_STRESS_TEST_SUMMARY); return true; }
bool StressTest::OpenFile(const WCHAR* fileName) { wprintf(L"%s\n", fileName); fflush(stdout); LoadArgs args(fileName); args.forceReuse = rand() % 3 != 1; WindowInfo* w = LoadDocument(args); if (!w) return false; if (w == win) { // WindowInfo reused if (!win->IsDocLoaded()) return false; } else if (!w->IsDocLoaded()) { // new WindowInfo CloseWindow(w, false); return false; } // transfer ownership of stressTest object to a new window and close the // current one AssertCrash(this == win->stressTest); if (w != win) { if (win->IsDocLoaded()) { // try to provoke a crash in RenderCache cleanup code ClientRect rect(win->hwndFrame); rect.Inflate(rand() % 10, rand() % 10); SendMessage(win->hwndFrame, WM_SIZE, 0, MAKELONG(rect.dx, rect.dy)); if (win->AsFixed()) win->cbHandler->RequestRendering(1); win->RepaintAsync(); } WindowInfo* toClose = win; w->stressTest = win->stressTest; win->stressTest = nullptr; win = w; CloseWindow(toClose, false); } if (!win->IsDocLoaded()) return false; win->ctrl->SetDisplayMode(DM_CONTINUOUS); win->ctrl->SetZoomVirtual(ZOOM_FIT_PAGE, nullptr); win->ctrl->GoToFirstPage(); if (win->tocVisible || gGlobalPrefs->showFavorites) SetSidebarVisibility(win, win->tocVisible, gGlobalPrefs->showFavorites); currPage = pageRanges.at(0).start; win->ctrl->GoToPage(currPage, false); currPageRenderTime.Start(); ++filesCount; pageForSearchStart = (rand() % win->ctrl->PageCount()) + 1; // search immediately in single page documents if (1 == pageForSearchStart) { // use text that is unlikely to be found, so that we search all pages win::SetText(win->hwndFindBox, L"!z_yt"); FindTextOnThread(win, TextSearchDirection::Forward, true); } int secs = SecsSinceSystemTime(stressStartTime); AutoFreeW tm(FormatTime(secs)); AutoFreeW s(str::Format(L"File %d: %s, time: %s", filesCount, fileName, tm)); win->ShowNotification(s, NOS_PERSIST, NG_STRESS_TEST_SUMMARY); return true; }