Commit 3355be3e authored by Dylan Smith's avatar Dylan Smith Committed by Alexandre Julliard

wordpad: Number of preview pages to show when unzoomed is persistent.

Either one or two pages may be shown in print preview when zoomed out. This value is stored in the registry in native wordpad, and preserved while opening and closing the print preview. Zooming in will only show one page, but the pages shown value must be saved because it will return to the preview pages shown value after unzooming completely. If two pages should be shown when there is only one page of text, then a second blank page is shown.
parent adc2c954
...@@ -28,6 +28,7 @@ typedef struct _previewinfo ...@@ -28,6 +28,7 @@ typedef struct _previewinfo
{ {
int page; int page;
int pages_shown; int pages_shown;
int saved_pages_shown;
int *pageEnds, pageCapacity; int *pageEnds, pageCapacity;
int textlength; int textlength;
HDC hdc; HDC hdc;
...@@ -53,6 +54,7 @@ static previewinfo preview; ...@@ -53,6 +54,7 @@ static previewinfo preview;
extern const WCHAR wszPreviewWndClass[]; extern const WCHAR wszPreviewWndClass[];
static const WCHAR var_pagemargin[] = {'P','a','g','e','M','a','r','g','i','n',0}; static const WCHAR var_pagemargin[] = {'P','a','g','e','M','a','r','g','i','n',0};
static const WCHAR var_previewpages[] = {'P','r','e','v','i','e','w','P','a','g','e','s',0};
static LPWSTR get_print_file_filter(HWND hMainWnd) static LPWSTR get_print_file_filter(HWND hMainWnd)
{ {
...@@ -95,6 +97,28 @@ void registry_read_pagemargins(HKEY hKey) ...@@ -95,6 +97,28 @@ void registry_read_pagemargins(HKEY hKey)
} }
} }
void registry_set_previewpages(HKEY hKey)
{
RegSetValueExW(hKey, var_previewpages, 0, REG_DWORD,
(LPBYTE)&preview.pages_shown, sizeof(DWORD));
}
void registry_read_previewpages(HKEY hKey)
{
DWORD size = sizeof(DWORD);
if(!hKey ||
RegQueryValueExW(hKey, var_previewpages, 0, NULL,
(LPBYTE)&preview.pages_shown, &size) != ERROR_SUCCESS ||
size != sizeof(DWORD))
{
preview.pages_shown = 1;
} else {
if (preview.pages_shown < 1) preview.pages_shown = 1;
else if (preview.pages_shown > 2) preview.pages_shown = 2;
}
}
static void AddTextButton(HWND hRebarWnd, UINT string, UINT command, UINT id) static void AddTextButton(HWND hRebarWnd, UINT string, UINT command, UINT id)
{ {
REBARBANDINFOW rb; REBARBANDINFOW rb;
...@@ -576,11 +600,13 @@ static void preview_bar_show(HWND hMainWnd, BOOL show) ...@@ -576,11 +600,13 @@ static void preview_bar_show(HWND hMainWnd, BOOL show)
{ {
REBARBANDINFOW rb; REBARBANDINFOW rb;
HWND hStatic; HWND hStatic;
UINT num_pages_string = preview.pages_shown > 1 ? STRING_PREVIEW_ONEPAGE :
STRING_PREVIEW_TWOPAGES;
AddTextButton(hReBar, STRING_PREVIEW_PRINT, ID_PRINT, BANDID_PREVIEW_BTN1); AddTextButton(hReBar, STRING_PREVIEW_PRINT, ID_PRINT, BANDID_PREVIEW_BTN1);
AddTextButton(hReBar, STRING_PREVIEW_NEXTPAGE, ID_PREVIEW_NEXTPAGE, BANDID_PREVIEW_BTN2); AddTextButton(hReBar, STRING_PREVIEW_NEXTPAGE, ID_PREVIEW_NEXTPAGE, BANDID_PREVIEW_BTN2);
AddTextButton(hReBar, STRING_PREVIEW_PREVPAGE, ID_PREVIEW_PREVPAGE, BANDID_PREVIEW_BTN3); AddTextButton(hReBar, STRING_PREVIEW_PREVPAGE, ID_PREVIEW_PREVPAGE, BANDID_PREVIEW_BTN3);
AddTextButton(hReBar, STRING_PREVIEW_TWOPAGES, ID_PREVIEW_NUMPAGES, BANDID_PREVIEW_BTN4); AddTextButton(hReBar, num_pages_string, ID_PREVIEW_NUMPAGES, BANDID_PREVIEW_BTN4);
AddTextButton(hReBar, STRING_PREVIEW_ZOOMIN, ID_PREVIEW_ZOOMIN, BANDID_PREVIEW_BTN5); AddTextButton(hReBar, STRING_PREVIEW_ZOOMIN, ID_PREVIEW_ZOOMIN, BANDID_PREVIEW_BTN5);
AddTextButton(hReBar, STRING_PREVIEW_ZOOMOUT, ID_PREVIEW_ZOOMOUT, BANDID_PREVIEW_BTN6); AddTextButton(hReBar, STRING_PREVIEW_ZOOMOUT, ID_PREVIEW_ZOOMOUT, BANDID_PREVIEW_BTN6);
AddTextButton(hReBar, STRING_PREVIEW_CLOSE, ID_FILE_EXIT, BANDID_PREVIEW_BTN7); AddTextButton(hReBar, STRING_PREVIEW_CLOSE, ID_FILE_EXIT, BANDID_PREVIEW_BTN7);
...@@ -681,7 +707,7 @@ static void update_preview_sizes(HWND hwndPreview, BOOL zoomLevelUpdated) ...@@ -681,7 +707,7 @@ static void update_preview_sizes(HWND hwndPreview, BOOL zoomLevelUpdated)
update_preview_scrollbars(hwndPreview, &window); update_preview_scrollbars(hwndPreview, &window);
} }
static void draw_preview_page(HDC hdc, HDC* hdcSized, FORMATRANGE* lpFr, float ratio, int bmNewWidth, int bmNewHeight, int bmWidth, int bmHeight) static void draw_preview_page(HDC hdc, HDC* hdcSized, FORMATRANGE* lpFr, float ratio, int bmNewWidth, int bmNewHeight, int bmWidth, int bmHeight, BOOL draw_margins)
{ {
HBITMAP hBitmapScaled = CreateCompatibleBitmap(hdc, bmNewWidth, bmNewHeight); HBITMAP hBitmapScaled = CreateCompatibleBitmap(hdc, bmNewWidth, bmNewHeight);
HBITMAP oldbm; HBITMAP oldbm;
...@@ -701,6 +727,8 @@ static void draw_preview_page(HDC hdc, HDC* hdcSized, FORMATRANGE* lpFr, float r ...@@ -701,6 +727,8 @@ static void draw_preview_page(HDC hdc, HDC* hdcSized, FORMATRANGE* lpFr, float r
StretchBlt(*hdcSized, 0, 0, bmNewWidth, bmNewHeight, hdc, 0, 0, bmWidth, bmHeight, SRCCOPY); StretchBlt(*hdcSized, 0, 0, bmNewWidth, bmNewHeight, hdc, 0, 0, bmWidth, bmHeight, SRCCOPY);
if (!draw_margins) return;
/* Draw margin lines */ /* Draw margin lines */
hPen = CreatePen(PS_DOT, 1, RGB(0,0,0)); hPen = CreatePen(PS_DOT, 1, RGB(0,0,0));
oldPen = SelectObject(*hdcSized, hPen); oldPen = SelectObject(*hdcSized, hPen);
...@@ -719,6 +747,11 @@ static void draw_preview_page(HDC hdc, HDC* hdcSized, FORMATRANGE* lpFr, float r ...@@ -719,6 +747,11 @@ static void draw_preview_page(HDC hdc, HDC* hdcSized, FORMATRANGE* lpFr, float r
DeleteObject(hPen); DeleteObject(hPen);
} }
static BOOL is_last_preview_page(int page)
{
return preview.pageEnds[page - 1] >= preview.textlength;
}
/* Update for zoom ratio changes with same page. */ /* Update for zoom ratio changes with same page. */
static void update_scaled_preview(HWND hMainWnd) static void update_scaled_preview(HWND hMainWnd)
{ {
...@@ -740,13 +773,14 @@ static void update_scaled_preview(HWND hMainWnd) ...@@ -740,13 +773,14 @@ static void update_scaled_preview(HWND hMainWnd)
draw_preview_page(preview.hdc, &preview.hdcSized, &fr, preview.zoomratio, draw_preview_page(preview.hdc, &preview.hdcSized, &fr, preview.zoomratio,
preview.bmScaledSize.cx, preview.bmScaledSize.cy, preview.bmScaledSize.cx, preview.bmScaledSize.cy,
preview.bmSize.cx, preview.bmSize.cy); preview.bmSize.cx, preview.bmSize.cy, TRUE);
if(preview.pages_shown > 1) if(preview.pages_shown > 1)
{ {
draw_preview_page(preview.hdc2, &preview.hdcSized2, &fr, preview.zoomratio, draw_preview_page(preview.hdc2, &preview.hdcSized2, &fr, preview.zoomratio,
preview.bmScaledSize.cx, preview.bmScaledSize.cy, preview.bmScaledSize.cx, preview.bmScaledSize.cy,
preview.bmSize.cx, preview.bmSize.cy); preview.bmSize.cx, preview.bmSize.cy,
!is_last_preview_page(preview.page));
} }
InvalidateRect(hwndPreview, NULL, TRUE); InvalidateRect(hwndPreview, NULL, TRUE);
...@@ -764,7 +798,6 @@ void init_preview(HWND hMainWnd, LPWSTR wszFileName) ...@@ -764,7 +798,6 @@ void init_preview(HWND hMainWnd, LPWSTR wszFileName)
preview.zoomratio = 0; preview.zoomratio = 0;
preview.zoomlevel = 0; preview.zoomlevel = 0;
preview_bar_show(hMainWnd, TRUE); preview_bar_show(hMainWnd, TRUE);
if (preview.pages_shown < 1) preview.pages_shown = 1;
hwndPreview = CreateWindowExW(0, wszPreviewWndClass, NULL, hwndPreview = CreateWindowExW(0, wszPreviewWndClass, NULL,
WS_VISIBLE | WS_CHILD | WS_VSCROLL | WS_HSCROLL, WS_VISIBLE | WS_CHILD | WS_VSCROLL | WS_HSCROLL,
...@@ -780,6 +813,8 @@ void close_preview(HWND hMainWnd) ...@@ -780,6 +813,8 @@ void close_preview(HWND hMainWnd)
HeapFree(GetProcessHeap(), 0, preview.pageEnds); HeapFree(GetProcessHeap(), 0, preview.pageEnds);
preview.pageEnds = NULL; preview.pageEnds = NULL;
preview.pageCapacity = 0; preview.pageCapacity = 0;
if (preview.zoomlevel > 0)
preview.pages_shown = preview.saved_pages_shown;
if(preview.hdc) { if(preview.hdc) {
HBITMAP oldbm = GetCurrentObject(preview.hdc, OBJ_BITMAP); HBITMAP oldbm = GetCurrentObject(preview.hdc, OBJ_BITMAP);
DeleteDC(preview.hdc); DeleteDC(preview.hdc);
...@@ -833,8 +868,9 @@ static void draw_preview(HWND hEditorWnd, FORMATRANGE* lpFr, RECT* paper, int pa ...@@ -833,8 +868,9 @@ static void draw_preview(HWND hEditorWnd, FORMATRANGE* lpFr, RECT* paper, int pa
preview.pageEnds = new_buffer; preview.pageEnds = new_buffer;
} }
lpFr->chrg.cpMin = page <= 1 ? 0 : preview.pageEnds[page-2];
FillRect(lpFr->hdc, paper, GetStockObject(WHITE_BRUSH)); FillRect(lpFr->hdc, paper, GetStockObject(WHITE_BRUSH));
if (page > 1 && is_last_preview_page(page - 1)) return;
lpFr->chrg.cpMin = page <= 1 ? 0 : preview.pageEnds[page-2];
bottom = lpFr->rc.bottom; bottom = lpFr->rc.bottom;
preview.pageEnds[page-1] = SendMessageW(hEditorWnd, EM_FORMATRANGE, TRUE, (LPARAM)lpFr); preview.pageEnds[page-1] = SendMessageW(hEditorWnd, EM_FORMATRANGE, TRUE, (LPARAM)lpFr);
...@@ -844,19 +880,16 @@ static void draw_preview(HWND hEditorWnd, FORMATRANGE* lpFr, RECT* paper, int pa ...@@ -844,19 +880,16 @@ static void draw_preview(HWND hEditorWnd, FORMATRANGE* lpFr, RECT* paper, int pa
SendMessageW(hEditorWnd, EM_FORMATRANGE, FALSE, 0); SendMessageW(hEditorWnd, EM_FORMATRANGE, FALSE, 0);
} }
static BOOL is_last_preview_page(int page)
{
return preview.pageEnds[page - 1] >= preview.textlength;
}
static void update_preview_buttons(HWND hMainWnd) static void update_preview_buttons(HWND hMainWnd)
{ {
HWND hReBar = GetDlgItem(hMainWnd, IDC_REBAR); HWND hReBar = GetDlgItem(hMainWnd, IDC_REBAR);
EnableWindow(GetDlgItem(hReBar, ID_PREVIEW_PREVPAGE), preview.page > 1); EnableWindow(GetDlgItem(hReBar, ID_PREVIEW_PREVPAGE), preview.page > 1);
EnableWindow(GetDlgItem(hReBar, ID_PREVIEW_NEXTPAGE), EnableWindow(GetDlgItem(hReBar, ID_PREVIEW_NEXTPAGE),
!is_last_preview_page(preview.page) &&
!is_last_preview_page(preview.page + preview.pages_shown - 1)); !is_last_preview_page(preview.page + preview.pages_shown - 1));
EnableWindow(GetDlgItem(hReBar, ID_PREVIEW_NUMPAGES), EnableWindow(GetDlgItem(hReBar, ID_PREVIEW_NUMPAGES),
!is_last_preview_page(1) && preview.zoomlevel == 0); preview.pages_shown > 1 ||
(!is_last_preview_page(1) && preview.zoomlevel == 0));
EnableWindow(GetDlgItem(hReBar, ID_PREVIEW_ZOOMIN), preview.zoomlevel < 2); EnableWindow(GetDlgItem(hReBar, ID_PREVIEW_ZOOMIN), preview.zoomlevel < 2);
EnableWindow(GetDlgItem(hReBar, ID_PREVIEW_ZOOMOUT), preview.zoomlevel > 0); EnableWindow(GetDlgItem(hReBar, ID_PREVIEW_ZOOMOUT), preview.zoomlevel > 0);
} }
...@@ -969,18 +1002,15 @@ static void toggle_num_pages(HWND hMainWnd) ...@@ -969,18 +1002,15 @@ static void toggle_num_pages(HWND hMainWnd)
HWND hReBar = GetDlgItem(hMainWnd, IDC_REBAR); HWND hReBar = GetDlgItem(hMainWnd, IDC_REBAR);
WCHAR name[MAX_STRING_LEN]; WCHAR name[MAX_STRING_LEN];
HINSTANCE hInst = GetModuleHandleW(0); HINSTANCE hInst = GetModuleHandleW(0);
int nPreviewPages;
if(preview.pages_shown > 1) preview.pages_shown = preview.pages_shown > 1 ? 1 : 2;
{
preview.pages_shown = 1;
} else {
if(is_last_preview_page(preview.page))
preview.page--;
preview.pages_shown = 2;
}
LoadStringW(hInst, preview.pages_shown > 1 ? STRING_PREVIEW_ONEPAGE : nPreviewPages = preview.zoomlevel > 0 ? preview.saved_pages_shown :
STRING_PREVIEW_TWOPAGES, preview.pages_shown;
LoadStringW(hInst, nPreviewPages > 1 ? STRING_PREVIEW_ONEPAGE :
STRING_PREVIEW_TWOPAGES,
name, MAX_STRING_LEN); name, MAX_STRING_LEN);
SetWindowTextW(GetDlgItem(hReBar, ID_PREVIEW_NUMPAGES), name); SetWindowTextW(GetDlgItem(hReBar, ID_PREVIEW_NUMPAGES), name);
...@@ -1006,7 +1036,7 @@ int preview_page_hittest(POINT pt) ...@@ -1006,7 +1036,7 @@ int preview_page_hittest(POINT pt)
rc.left += preview.bmScaledSize.cx + preview.spacing.cx; rc.left += preview.bmScaledSize.cx + preview.spacing.cx;
rc.right += preview.bmScaledSize.cx + preview.spacing.cx; rc.right += preview.bmScaledSize.cx + preview.spacing.cx;
if (PtInRect(&rc, pt)) if (PtInRect(&rc, pt))
return 2; return is_last_preview_page(preview.page) ? 1 : 2;
return 0; return 0;
} }
...@@ -1155,10 +1185,14 @@ LRESULT CALLBACK preview_proc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam) ...@@ -1155,10 +1185,14 @@ LRESULT CALLBACK preview_proc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam)
pt.x /= preview.zoomratio; pt.x /= preview.zoomratio;
pt.y /= preview.zoomratio; pt.y /= preview.zoomratio;
if (preview.zoomlevel == 0)
preview.saved_pages_shown = preview.pages_shown;
preview.zoomlevel = (preview.zoomlevel + 1) % 3; preview.zoomlevel = (preview.zoomlevel + 1) % 3;
preview.zoomratio = 0; preview.zoomratio = 0;
if (preview.pages_shown > 1) if (preview.zoomlevel == 0 && preview.saved_pages_shown > 1)
{ {
toggle_num_pages(hMainWnd);
} else if (preview.pages_shown > 1) {
if (page >= 2) preview.page++; if (page >= 2) preview.page++;
toggle_num_pages(hMainWnd); toggle_num_pages(hMainWnd);
} else { } else {
...@@ -1221,6 +1255,8 @@ LRESULT preview_command(HWND hWnd, WPARAM wParam) ...@@ -1221,6 +1255,8 @@ LRESULT preview_command(HWND hWnd, WPARAM wParam)
case ID_PREVIEW_ZOOMIN: case ID_PREVIEW_ZOOMIN:
if (preview.zoomlevel < 2) if (preview.zoomlevel < 2)
{ {
if (preview.zoomlevel == 0)
preview.saved_pages_shown = preview.pages_shown;
preview.zoomlevel++; preview.zoomlevel++;
preview.zoomratio = 0; preview.zoomratio = 0;
if (preview.pages_shown > 1) if (preview.pages_shown > 1)
...@@ -1242,9 +1278,13 @@ LRESULT preview_command(HWND hWnd, WPARAM wParam) ...@@ -1242,9 +1278,13 @@ LRESULT preview_command(HWND hWnd, WPARAM wParam)
HWND hwndPreview = GetDlgItem(hWnd, IDC_PREVIEW); HWND hwndPreview = GetDlgItem(hWnd, IDC_PREVIEW);
preview.zoomlevel--; preview.zoomlevel--;
preview.zoomratio = 0; preview.zoomratio = 0;
update_preview_sizes(hwndPreview, TRUE); if (preview.zoomlevel == 0 && preview.saved_pages_shown > 1) {
update_scaled_preview(hWnd); toggle_num_pages(hWnd);
update_preview_buttons(hWnd); } else {
update_preview_sizes(hwndPreview, TRUE);
update_scaled_preview(hWnd);
update_preview_buttons(hWnd);
}
} }
break; break;
......
...@@ -27,6 +27,7 @@ ...@@ -27,6 +27,7 @@
static const WCHAR key_recentfiles[] = {'R','e','c','e','n','t',' ','f','i','l','e', static const WCHAR key_recentfiles[] = {'R','e','c','e','n','t',' ','f','i','l','e',
' ','l','i','s','t',0}; ' ','l','i','s','t',0};
static const WCHAR key_options[] = {'O','p','t','i','o','n','s',0}; static const WCHAR key_options[] = {'O','p','t','i','o','n','s',0};
static const WCHAR key_settings[] = {'S','e','t','t','i','n','g','s',0};
static const WCHAR key_rtf[] = {'R','T','F',0}; static const WCHAR key_rtf[] = {'R','T','F',0};
static const WCHAR key_text[] = {'T','e','x','t',0}; static const WCHAR key_text[] = {'T','e','x','t',0};
...@@ -94,9 +95,14 @@ void registry_set_options(HWND hMainWnd) ...@@ -94,9 +95,14 @@ void registry_set_options(HWND hMainWnd)
RegSetValueExW(hKey, var_maximized, 0, REG_DWORD, (LPBYTE)&isMaximized, sizeof(DWORD)); RegSetValueExW(hKey, var_maximized, 0, REG_DWORD, (LPBYTE)&isMaximized, sizeof(DWORD));
registry_set_pagemargins(hKey); registry_set_pagemargins(hKey);
RegCloseKey(hKey);
} }
RegCloseKey(hKey); if(registry_get_handle(&hKey, &action, key_settings) == ERROR_SUCCESS)
{
registry_set_previewpages(hKey);
RegCloseKey(hKey);
}
} }
void registry_read_winrect(RECT* rc) void registry_read_winrect(RECT* rc)
...@@ -339,6 +345,13 @@ void registry_read_options(void) ...@@ -339,6 +345,13 @@ void registry_read_options(void)
registry_read_pagemargins(hKey); registry_read_pagemargins(hKey);
RegCloseKey(hKey); RegCloseKey(hKey);
} }
if(registry_get_handle(&hKey, 0, key_settings) != ERROR_SUCCESS) {
registry_read_previewpages(NULL);
} else {
registry_read_previewpages(hKey);
RegCloseKey(hKey);
}
} }
static void registry_read_formatopts(int index, LPCWSTR key, DWORD barState[], DWORD wordWrap[]) static void registry_read_formatopts(int index, LPCWSTR key, DWORD barState[], DWORD wordWrap[])
......
...@@ -249,6 +249,8 @@ LRESULT print_preview(HWND); ...@@ -249,6 +249,8 @@ LRESULT print_preview(HWND);
void get_default_printer_opts(void); void get_default_printer_opts(void);
void registry_set_pagemargins(HKEY); void registry_set_pagemargins(HKEY);
void registry_read_pagemargins(HKEY); void registry_read_pagemargins(HKEY);
void registry_set_previewpages(HKEY hKey);
void registry_read_previewpages(HKEY hKey);
LRESULT CALLBACK ruler_proc(HWND, UINT, WPARAM, LPARAM); LRESULT CALLBACK ruler_proc(HWND, UINT, WPARAM, LPARAM);
void redraw_ruler(HWND); void redraw_ruler(HWND);
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment