int handle_word(char buf[], FILE *files[], struct sc_config const *config) { int ret = -1; char tmp[strlen(buf)]; char inp[MAX_WORD_LENGTH]; trim_word(buf, tmp); if (is_number(tmp)) goto NEXT; if (word_exists(files[FILE_DIC], tmp)) { fprintf(files[FILE_OUT], "%s", buf); } else { printf(CLSCRN); print_header(config->file[FILE_DOC]); print_hr(); print_preview(files[FILE_DOC], buf); print_hr(); printf("word \"%s\" not found in dict\n", tmp); print_progress(files[FILE_DOC]); switch (show_menu()) { case 'a': fprintf(files[FILE_DIC], "%s\n", tmp); fprintf(files[FILE_OUT], "%s", tmp); break; case 's': printf("substitute %s: ", buf); input_line(inp, sizeof(inp)); fprintf(files[FILE_OUT], "%s", inp); break; case 'c': fprintf(files[FILE_OUT], "%s", buf); break; case 'q': goto ERROR; } } NEXT: ret = 0; ERROR: return ret; }
LRESULT CALLBACK preview_proc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam) { switch(msg) { case WM_CREATE: { HWND hMainWnd = GetParent(hWnd); HWND hEditorWnd = GetDlgItem(hMainWnd, IDC_EDITOR); FORMATRANGE fr; GETTEXTLENGTHEX gt = {GTL_DEFAULT, 1200}; HDC hdc = GetDC(hWnd); HDC hdcTarget = make_dc(); fr.rc = preview.rcPage = get_print_rect(hdcTarget); preview.rcPage.bottom += margins.bottom; preview.rcPage.right += margins.right; preview.rcPage.top = preview.rcPage.left = 0; fr.rcPage = preview.rcPage; preview.bmSize.cx = twips_to_pixels(preview.rcPage.right, GetDeviceCaps(hdc, LOGPIXELSX)); preview.bmSize.cy = twips_to_pixels(preview.rcPage.bottom, GetDeviceCaps(hdc, LOGPIXELSY)); preview.textlength = SendMessageW(hEditorWnd, EM_GETTEXTLENGTHEX, (WPARAM)>, 0); fr.hdc = CreateCompatibleDC(hdc); fr.hdcTarget = hdcTarget; fr.chrg.cpMin = 0; fr.chrg.cpMax = preview.textlength; DeleteDC(fr.hdc); DeleteDC(hdcTarget); ReleaseDC(hWnd, hdc); update_preview_sizes(hWnd, TRUE); update_preview(hMainWnd); break; } case WM_PAINT: return print_preview(hWnd); case WM_SIZE: { update_preview_sizes(hWnd, FALSE); InvalidateRect(hWnd, NULL, FALSE); break; } case WM_VSCROLL: case WM_HSCROLL: { SCROLLINFO si; RECT rc; int nBar = (msg == WM_VSCROLL) ? SB_VERT : SB_HORZ; int origPos; GetClientRect(hWnd, &rc); si.cbSize = sizeof(si); si.fMask = SIF_ALL; GetScrollInfo(hWnd, nBar, &si); origPos = si.nPos; switch(LOWORD(wParam)) { case SB_TOP: /* == SB_LEFT */ si.nPos = si.nMin; break; case SB_BOTTOM: /* == SB_RIGHT */ si.nPos = si.nMax; break; case SB_LINEUP: /* == SB_LINELEFT */ si.nPos -= si.nPage / 10; break; case SB_LINEDOWN: /* == SB_LINERIGHT */ si.nPos += si.nPage / 10; break; case SB_PAGEUP: /* == SB_PAGELEFT */ si.nPos -= si.nPage; break; case SB_PAGEDOWN: /* SB_PAGERIGHT */ si.nPos += si.nPage; break; case SB_THUMBTRACK: si.nPos = si.nTrackPos; break; } si.fMask = SIF_POS; SetScrollInfo(hWnd, nBar, &si, TRUE); GetScrollInfo(hWnd, nBar, &si); if (si.nPos != origPos) { int amount = origPos - si.nPos; if (msg == WM_VSCROLL) ScrollWindow(hWnd, 0, amount, NULL, NULL); else ScrollWindow(hWnd, amount, 0, NULL, NULL); } return 0; } case WM_SETCURSOR: { POINT pt; RECT rc; int bHittest = FALSE; DWORD messagePos = GetMessagePos(); pt.x = (short)LOWORD(messagePos); pt.y = (short)HIWORD(messagePos); ScreenToClient(hWnd, &pt); GetClientRect(hWnd, &rc); if (PtInRect(&rc, pt)) { pt.x += GetScrollPos(hWnd, SB_HORZ); pt.y += GetScrollPos(hWnd, SB_VERT); bHittest = preview_page_hittest(pt); } if (bHittest) SetCursor(LoadCursorW(GetModuleHandleW(0), MAKEINTRESOURCEW(IDC_ZOOM))); else SetCursor(LoadCursorW(NULL, (WCHAR*)IDC_ARROW)); return TRUE; } case WM_LBUTTONDOWN: { int page; POINT pt; pt.x = (short)LOWORD(lParam) + GetScrollPos(hWnd, SB_HORZ); pt.y = (short)HIWORD(lParam) + GetScrollPos(hWnd, SB_VERT); if ((page = preview_page_hittest(pt)) > 0) { HWND hMainWnd = GetParent(hWnd); /* Convert point from client coordinate to unzoomed page * coordinate. */ pt.x -= preview.spacing.cx; if (page > 1) pt.x -= preview.bmScaledSize.cx + preview.spacing.cx; pt.y -= preview.spacing.cy; pt.x /= preview.zoomratio; pt.y /= preview.zoomratio; if (preview.zoomlevel == 0) preview.saved_pages_shown = preview.pages_shown; preview.zoomlevel = (preview.zoomlevel + 1) % 3; preview.zoomratio = 0; if (preview.zoomlevel == 0 && preview.saved_pages_shown > 1) { toggle_num_pages(hMainWnd); } else if (preview.pages_shown > 1) { if (page >= 2) preview.page++; toggle_num_pages(hMainWnd); } else { update_preview_sizes(hWnd, TRUE); InvalidateRect(hWnd, NULL, FALSE); update_preview_buttons(hMainWnd); } if (preview.zoomlevel > 0) { SCROLLINFO si; /* Convert the coordinate back to client coordinate. */ pt.x *= preview.zoomratio; pt.y *= preview.zoomratio; pt.x += preview.spacing.cx; pt.y += preview.spacing.cy; /* Scroll to center view at that point on the page */ si.cbSize = sizeof(si); si.fMask = SIF_PAGE; GetScrollInfo(hWnd, SB_HORZ, &si); pt.x -= si.nPage / 2; SetScrollPos(hWnd, SB_HORZ, pt.x, TRUE); GetScrollInfo(hWnd, SB_VERT, &si); pt.y -= si.nPage / 2; SetScrollPos(hWnd, SB_VERT, pt.y, TRUE); } } } default: return DefWindowProcW(hWnd, msg, wParam, lParam); } return 0; }