1
0
mirror of https://github.com/wine-mirror/wine synced 2024-07-08 03:45:57 +00:00
wine/programs/notepad/dialog.c
Rolf Kalbermatter 5eb6c11aba notepad: Improve printing considerably.
Make fonts and the other measurements the correct size in relation to
the actual printer resolution instead of thinking it uses the same
resolution as the display.  Before fixed sized (and for most printer
resolutions way to small) margins where used and the font size was
taken directly from the screen font independent of the actual printer
resolution, resulting in a completely unreadable micro text on most
printouts.
2007-04-10 21:47:25 +02:00

870 lines
25 KiB
C

/*
* Notepad (dialog.c)
*
* Copyright 1998,99 Marcel Baur <mbaur@g26.ethz.ch>
* Copyright 2002 Sylvain Petreolle <spetreolle@yahoo.fr>
* Copyright 2002 Andriy Palamarchuk
* Copyright 2007 Rolf Kalbermatter
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
*/
#define UNICODE
#include <assert.h>
#include <stdio.h>
#include <windows.h>
#include <commdlg.h>
#include <shlwapi.h>
#include "main.h"
#include "dialog.h"
#define SPACES_IN_TAB 8
#define PRINT_LEN_MAX 500
static const WCHAR helpfileW[] = { 'n','o','t','e','p','a','d','.','h','l','p',0 };
static INT_PTR WINAPI DIALOG_PAGESETUP_DlgProc(HWND hDlg, UINT msg, WPARAM wParam, LPARAM lParam);
VOID ShowLastError(void)
{
DWORD error = GetLastError();
if (error != NO_ERROR)
{
LPWSTR lpMsgBuf;
WCHAR szTitle[MAX_STRING_LEN];
LoadString(Globals.hInstance, STRING_ERROR, szTitle, SIZEOF(szTitle));
FormatMessage(
FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM,
NULL, error, 0,
(LPTSTR) &lpMsgBuf, 0, NULL);
MessageBox(NULL, lpMsgBuf, szTitle, MB_OK | MB_ICONERROR);
LocalFree(lpMsgBuf);
}
}
/**
* Sets the caption of the main window according to Globals.szFileTitle:
* Untitled - Notepad if no file is open
* filename - Notepad if a file is given
*/
static void UpdateWindowCaption(void)
{
WCHAR szCaption[MAX_STRING_LEN];
WCHAR szNotepad[MAX_STRING_LEN];
static const WCHAR hyphenW[] = { ' ','-',' ',0 };
if (Globals.szFileTitle[0] != '\0')
lstrcpy(szCaption, Globals.szFileTitle);
else
LoadString(Globals.hInstance, STRING_UNTITLED, szCaption, SIZEOF(szCaption));
LoadString(Globals.hInstance, STRING_NOTEPAD, szNotepad, SIZEOF(szNotepad));
lstrcat(szCaption, hyphenW);
lstrcat(szCaption, szNotepad);
SetWindowText(Globals.hMainWnd, szCaption);
}
int DIALOG_StringMsgBox(HWND hParent, int formatId, LPCWSTR szString, DWORD dwFlags)
{
WCHAR szMessage[MAX_STRING_LEN];
WCHAR szResource[MAX_STRING_LEN];
/* Load and format szMessage */
LoadString(Globals.hInstance, formatId, szResource, SIZEOF(szResource));
wnsprintf(szMessage, SIZEOF(szMessage), szResource, szString);
/* Load szCaption */
if ((dwFlags & MB_ICONMASK) == MB_ICONEXCLAMATION)
LoadString(Globals.hInstance, STRING_ERROR, szResource, SIZEOF(szResource));
else
LoadString(Globals.hInstance, STRING_NOTEPAD, szResource, SIZEOF(szResource));
/* Display Modal Dialog */
if (hParent == NULL)
hParent = Globals.hMainWnd;
return MessageBox(hParent, szMessage, szResource, dwFlags);
}
static void AlertFileNotFound(LPCWSTR szFileName)
{
DIALOG_StringMsgBox(NULL, STRING_NOTFOUND, szFileName, MB_ICONEXCLAMATION|MB_OK);
}
static int AlertFileNotSaved(LPCWSTR szFileName)
{
WCHAR szUntitled[MAX_STRING_LEN];
LoadString(Globals.hInstance, STRING_UNTITLED, szUntitled, SIZEOF(szUntitled));
return DIALOG_StringMsgBox(NULL, STRING_NOTSAVED, szFileName[0] ? szFileName : szUntitled,
MB_ICONQUESTION|MB_YESNOCANCEL);
}
/**
* Returns:
* TRUE - if file exists
* FALSE - if file does not exist
*/
BOOL FileExists(LPCWSTR szFilename)
{
WIN32_FIND_DATA entry;
HANDLE hFile;
hFile = FindFirstFile(szFilename, &entry);
FindClose(hFile);
return (hFile != INVALID_HANDLE_VALUE);
}
static VOID DoSaveFile(VOID)
{
HANDLE hFile;
DWORD dwNumWrite;
LPSTR pTemp;
DWORD size;
hFile = CreateFile(Globals.szFileName, GENERIC_WRITE, FILE_SHARE_WRITE,
NULL, OPEN_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
if(hFile == INVALID_HANDLE_VALUE)
{
ShowLastError();
return;
}
size = GetWindowTextLengthA(Globals.hEdit) + 1;
pTemp = HeapAlloc(GetProcessHeap(), 0, size);
if (!pTemp)
{
CloseHandle(hFile);
ShowLastError();
return;
}
size = GetWindowTextA(Globals.hEdit, pTemp, size);
if (!WriteFile(hFile, pTemp, size, &dwNumWrite, NULL))
ShowLastError();
else
SendMessage(Globals.hEdit, EM_SETMODIFY, FALSE, 0);
SetEndOfFile(hFile);
CloseHandle(hFile);
HeapFree(GetProcessHeap(), 0, pTemp);
}
/**
* Returns:
* TRUE - User agreed to close (both save/don't save)
* FALSE - User cancelled close by selecting "Cancel"
*/
BOOL DoCloseFile(void)
{
int nResult;
static const WCHAR empty_strW[] = { 0 };
if (SendMessage(Globals.hEdit, EM_GETMODIFY, 0, 0))
{
/* prompt user to save changes */
nResult = AlertFileNotSaved(Globals.szFileName);
switch (nResult) {
case IDYES: DIALOG_FileSave();
break;
case IDNO: break;
case IDCANCEL: return(FALSE);
break;
default: return(FALSE);
break;
} /* switch */
} /* if */
SetFileName(empty_strW);
UpdateWindowCaption();
return(TRUE);
}
void DoOpenFile(LPCWSTR szFileName)
{
static const WCHAR dotlog[] = { '.','L','O','G',0 };
HANDLE hFile;
LPSTR pTemp;
DWORD size;
DWORD dwNumRead;
WCHAR log[5];
/* Close any files and prompt to save changes */
if (!DoCloseFile())
return;
hFile = CreateFile(szFileName, GENERIC_READ, FILE_SHARE_READ, NULL,
OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
if(hFile == INVALID_HANDLE_VALUE)
{
ShowLastError();
return;
}
size = GetFileSize(hFile, NULL);
if (size == INVALID_FILE_SIZE)
{
CloseHandle(hFile);
ShowLastError();
return;
}
size++;
pTemp = HeapAlloc(GetProcessHeap(), 0, size);
if (!pTemp)
{
CloseHandle(hFile);
ShowLastError();
return;
}
if (!ReadFile(hFile, pTemp, size, &dwNumRead, NULL))
{
CloseHandle(hFile);
HeapFree(GetProcessHeap(), 0, pTemp);
ShowLastError();
return;
}
CloseHandle(hFile);
pTemp[dwNumRead] = 0;
if (IsTextUnicode(pTemp, dwNumRead, NULL))
{
LPWSTR p = (LPWSTR)pTemp;
/* We need to strip BOM Unicode character, SetWindowTextW won't do it for us. */
if (*p == 0xFEFF || *p == 0xFFFE) p++;
SetWindowTextW(Globals.hEdit, p);
}
else
SetWindowTextA(Globals.hEdit, pTemp);
HeapFree(GetProcessHeap(), 0, pTemp);
SendMessage(Globals.hEdit, EM_SETMODIFY, FALSE, 0);
SendMessage(Globals.hEdit, EM_EMPTYUNDOBUFFER, 0, 0);
SetFocus(Globals.hEdit);
/* If the file starts with .LOG, add a time/date at the end and set cursor after
* See http://support.microsoft.com/?kbid=260563
*/
if (GetWindowTextW(Globals.hEdit, log, sizeof(log)/sizeof(log[0])) && !lstrcmp(log, dotlog))
{
static const WCHAR lfW[] = { '\r','\n',0 };
SendMessage(Globals.hEdit, EM_SETSEL, GetWindowTextLength(Globals.hEdit), -1);
SendMessage(Globals.hEdit, EM_REPLACESEL, TRUE, (LPARAM)lfW);
DIALOG_EditTimeDate();
SendMessage(Globals.hEdit, EM_REPLACESEL, TRUE, (LPARAM)lfW);
}
SetFileName(szFileName);
UpdateWindowCaption();
}
VOID DIALOG_FileNew(VOID)
{
static const WCHAR empty_strW[] = { 0 };
/* Close any files and promt to save changes */
if (DoCloseFile()) {
SetWindowText(Globals.hEdit, empty_strW);
SendMessage(Globals.hEdit, EM_EMPTYUNDOBUFFER, 0, 0);
SetFocus(Globals.hEdit);
}
}
VOID DIALOG_FileOpen(VOID)
{
OPENFILENAME openfilename;
WCHAR szPath[MAX_PATH];
WCHAR szDir[MAX_PATH];
static const WCHAR szDefaultExt[] = { 't','x','t',0 };
static const WCHAR txt_files[] = { '*','.','t','x','t',0 };
ZeroMemory(&openfilename, sizeof(openfilename));
GetCurrentDirectory(SIZEOF(szDir), szDir);
lstrcpy(szPath, txt_files);
openfilename.lStructSize = sizeof(openfilename);
openfilename.hwndOwner = Globals.hMainWnd;
openfilename.hInstance = Globals.hInstance;
openfilename.lpstrFilter = Globals.szFilter;
openfilename.lpstrFile = szPath;
openfilename.nMaxFile = SIZEOF(szPath);
openfilename.lpstrInitialDir = szDir;
openfilename.Flags = OFN_FILEMUSTEXIST | OFN_PATHMUSTEXIST |
OFN_HIDEREADONLY;
openfilename.lpstrDefExt = szDefaultExt;
if (GetOpenFileName(&openfilename)) {
if (FileExists(openfilename.lpstrFile))
DoOpenFile(openfilename.lpstrFile);
else
AlertFileNotFound(openfilename.lpstrFile);
}
}
VOID DIALOG_FileSave(VOID)
{
if (Globals.szFileName[0] == '\0')
DIALOG_FileSaveAs();
else
DoSaveFile();
}
VOID DIALOG_FileSaveAs(VOID)
{
OPENFILENAME saveas;
WCHAR szPath[MAX_PATH];
WCHAR szDir[MAX_PATH];
static const WCHAR szDefaultExt[] = { 't','x','t',0 };
static const WCHAR txt_files[] = { '*','.','t','x','t',0 };
ZeroMemory(&saveas, sizeof(saveas));
GetCurrentDirectory(SIZEOF(szDir), szDir);
lstrcpy(szPath, txt_files);
saveas.lStructSize = sizeof(OPENFILENAME);
saveas.hwndOwner = Globals.hMainWnd;
saveas.hInstance = Globals.hInstance;
saveas.lpstrFilter = Globals.szFilter;
saveas.lpstrFile = szPath;
saveas.nMaxFile = SIZEOF(szPath);
saveas.lpstrInitialDir = szDir;
saveas.Flags = OFN_PATHMUSTEXIST | OFN_OVERWRITEPROMPT |
OFN_HIDEREADONLY;
saveas.lpstrDefExt = szDefaultExt;
if (GetSaveFileName(&saveas)) {
SetFileName(szPath);
UpdateWindowCaption();
DoSaveFile();
}
}
typedef struct {
LPWSTR mptr;
LPWSTR mend;
LPWSTR lptr;
DWORD len;
} TEXTINFO, *LPTEXTINFO;
static int notepad_print_header(HDC hdc, RECT *rc, BOOL dopage, BOOL header, int page, LPWSTR text)
{
SIZE szMetric;
if (*text)
{
/* Write the header or footer */
GetTextExtentPoint32(hdc, text, lstrlen(text), &szMetric);
if (dopage)
ExtTextOut(hdc, (rc->left + rc->right - szMetric.cx) / 2,
header ? rc->top : rc->bottom - szMetric.cy,
ETO_CLIPPED, rc, text, lstrlen(text), NULL);
return 1;
}
return 0;
}
static BOOL notepad_print_page(HDC hdc, RECT *rc, BOOL dopage, int page, LPTEXTINFO tInfo)
{
int b, y;
TEXTMETRIC tm;
SIZE szMetrics;
if (dopage)
{
if (StartPage(hdc) <= 0)
{
static const WCHAR failedW[] = { 'S','t','a','r','t','P','a','g','e',' ','f','a','i','l','e','d',0 };
static const WCHAR errorW[] = { 'P','r','i','n','t',' ','E','r','r','o','r',0 };
MessageBox(Globals.hMainWnd, failedW, errorW, MB_ICONEXCLAMATION);
return FALSE;
}
}
GetTextMetrics(hdc, &tm);
y = rc->top + notepad_print_header(hdc, rc, dopage, TRUE, page, Globals.szFileName) * tm.tmHeight;
b = rc->bottom - 2 * notepad_print_header(hdc, rc, FALSE, FALSE, page, Globals.szFooter) * tm.tmHeight;
do {
INT m, n;
if (!tInfo->len)
{
/* find the end of the line */
while (tInfo->mptr < tInfo->mend && *tInfo->mptr != '\n' && *tInfo->mptr != '\r')
{
if (*tInfo->mptr == '\t')
{
/* replace tabs with spaces */
for (m = 0; m < SPACES_IN_TAB; m++)
{
if (tInfo->len < PRINT_LEN_MAX)
tInfo->lptr[tInfo->len++] = ' ';
else if (Globals.bWrapLongLines)
break;
}
}
else if (tInfo->len < PRINT_LEN_MAX)
tInfo->lptr[tInfo->len++] = *tInfo->mptr;
if (tInfo->len >= PRINT_LEN_MAX && Globals.bWrapLongLines)
break;
tInfo->mptr++;
}
}
/* Find out how much we should print if line wrapping is enabled */
if (Globals.bWrapLongLines)
{
GetTextExtentExPoint(hdc, tInfo->lptr, tInfo->len, rc->right - rc->left, &n, NULL, &szMetrics);
if (n < tInfo->len && tInfo->lptr[n] != ' ')
{
m = n;
/* Don't wrap words unless it's a single word over the entire line */
while (m && tInfo->lptr[m] != ' ') m--;
if (m > 0) n = m + 1;
}
}
else
n = tInfo->len;
if (dopage)
ExtTextOut(hdc, rc->left, y, ETO_CLIPPED, rc, tInfo->lptr, n, NULL);
tInfo->len -= n;
if (tInfo->len)
{
memcpy(tInfo->lptr, tInfo->lptr + n, tInfo->len * sizeof(WCHAR));
y += tm.tmHeight + tm.tmExternalLeading;
}
else
{
/* find the next line */
while (tInfo->mptr < tInfo->mend && y < b && (*tInfo->mptr == '\n' || *tInfo->mptr == '\r'))
{
if (*tInfo->mptr == '\n')
y += tm.tmHeight + tm.tmExternalLeading;
tInfo->mptr++;
}
}
} while (tInfo->mptr < tInfo->mend && y < b);
notepad_print_header(hdc, rc, dopage, FALSE, page, Globals.szFooter);
if (dopage)
{
EndPage(hdc);
}
return TRUE;
}
VOID DIALOG_FilePrint(VOID)
{
DOCINFO di;
PRINTDLG printer;
int page, dopage, copy;
LOGFONT lfFont;
HFONT hTextFont, old_font = 0;
DWORD size;
BOOL ret = FALSE;
RECT rc;
LPWSTR pTemp;
TEXTINFO tInfo;
WCHAR cTemp[PRINT_LEN_MAX];
/* Get Current Settings */
ZeroMemory(&printer, sizeof(printer));
printer.lStructSize = sizeof(printer);
printer.hwndOwner = Globals.hMainWnd;
printer.hDevMode = Globals.hDevMode;
printer.hDevNames = Globals.hDevNames;
printer.hInstance = Globals.hInstance;
/* Set some default flags */
printer.Flags = PD_RETURNDC | PD_NOSELECTION;
printer.nFromPage = 0;
printer.nMinPage = 1;
/* we really need to calculate number of pages to set nMaxPage and nToPage */
printer.nToPage = 0;
printer.nMaxPage = -1;
/* Let commdlg manage copy settings */
printer.nCopies = (WORD)PD_USEDEVMODECOPIES;
if (!PrintDlg(&printer)) return;
Globals.hDevMode = printer.hDevMode;
Globals.hDevNames = printer.hDevNames;
SetMapMode(printer.hDC, MM_TEXT);
/* initialize DOCINFO */
di.cbSize = sizeof(DOCINFO);
di.lpszDocName = Globals.szFileTitle;
di.lpszOutput = NULL;
di.lpszDatatype = NULL;
di.fwType = 0;
/* Get the file text */
size = GetWindowTextLength(Globals.hEdit) + 1;
pTemp = HeapAlloc(GetProcessHeap(), 0, size * sizeof(WCHAR));
if (!pTemp)
{
DeleteDC(printer.hDC);
ShowLastError();
return;
}
size = GetWindowText(Globals.hEdit, pTemp, size);
if (StartDoc(printer.hDC, &di) > 0)
{
/* Get the page margins in pixels. */
rc.top = MulDiv(Globals.iMarginTop, GetDeviceCaps(printer.hDC, LOGPIXELSY), 2540) -
GetDeviceCaps(printer.hDC, PHYSICALOFFSETY);
rc.bottom = GetDeviceCaps(printer.hDC, PHYSICALHEIGHT) -
MulDiv(Globals.iMarginBottom, GetDeviceCaps(printer.hDC, LOGPIXELSY), 2540);
rc.left = MulDiv(Globals.iMarginLeft, GetDeviceCaps(printer.hDC, LOGPIXELSX), 2540) -
GetDeviceCaps(printer.hDC, PHYSICALOFFSETX);
rc.right = GetDeviceCaps(printer.hDC, PHYSICALWIDTH) -
MulDiv(Globals.iMarginRight, GetDeviceCaps(printer.hDC, LOGPIXELSX), 2540);
/* Create a font for the printer resolution */
lfFont = Globals.lfFont;
lfFont.lfHeight = MulDiv(lfFont.lfHeight, GetDeviceCaps(printer.hDC, LOGPIXELSY), get_dpi());
/* Make the font a bit lighter */
lfFont.lfWeight -= 100;
hTextFont = CreateFontIndirect(&lfFont);
old_font = SelectObject(printer.hDC, hTextFont);
for (copy = 1; copy <= printer.nCopies; copy++)
{
page = 1;
tInfo.mptr = pTemp;
tInfo.mend = pTemp + size;
tInfo.lptr = cTemp;
tInfo.len = 0;
do {
if (printer.Flags & PD_PAGENUMS)
{
/* a specific range of pages is selected, so
* skip pages that are not to be printed
*/
if (page > printer.nToPage)
break;
else if (page >= printer.nFromPage)
dopage = 1;
else
dopage = 0;
}
else
dopage = 1;
ret = notepad_print_page(printer.hDC, &rc, dopage, page, &tInfo);
page++;
} while (ret && tInfo.mptr < tInfo.mend);
if (!ret) break;
}
EndDoc(printer.hDC);
SelectObject(printer.hDC, old_font);
DeleteObject(hTextFont);
}
DeleteDC(printer.hDC);
HeapFree(GetProcessHeap(), 0, pTemp);
}
VOID DIALOG_FilePrinterSetup(VOID)
{
PRINTDLG printer;
ZeroMemory(&printer, sizeof(printer));
printer.lStructSize = sizeof(printer);
printer.hwndOwner = Globals.hMainWnd;
printer.hDevMode = Globals.hDevMode;
printer.hDevNames = Globals.hDevNames;
printer.hInstance = Globals.hInstance;
printer.Flags = PD_PRINTSETUP;
printer.nCopies = 1;
PrintDlg(&printer);
Globals.hDevMode = printer.hDevMode;
Globals.hDevNames = printer.hDevNames;
}
VOID DIALOG_FileExit(VOID)
{
PostMessage(Globals.hMainWnd, WM_CLOSE, 0, 0l);
}
VOID DIALOG_EditUndo(VOID)
{
SendMessage(Globals.hEdit, EM_UNDO, 0, 0);
}
VOID DIALOG_EditCut(VOID)
{
SendMessage(Globals.hEdit, WM_CUT, 0, 0);
}
VOID DIALOG_EditCopy(VOID)
{
SendMessage(Globals.hEdit, WM_COPY, 0, 0);
}
VOID DIALOG_EditPaste(VOID)
{
SendMessage(Globals.hEdit, WM_PASTE, 0, 0);
}
VOID DIALOG_EditDelete(VOID)
{
SendMessage(Globals.hEdit, WM_CLEAR, 0, 0);
}
VOID DIALOG_EditSelectAll(VOID)
{
SendMessage(Globals.hEdit, EM_SETSEL, 0, (LPARAM)-1);
}
VOID DIALOG_EditTimeDate(VOID)
{
SYSTEMTIME st;
WCHAR szDate[MAX_STRING_LEN];
static const WCHAR spaceW[] = { ' ',0 };
GetLocalTime(&st);
GetTimeFormat(LOCALE_USER_DEFAULT, 0, &st, NULL, szDate, MAX_STRING_LEN);
SendMessage(Globals.hEdit, EM_REPLACESEL, TRUE, (LPARAM)szDate);
SendMessage(Globals.hEdit, EM_REPLACESEL, TRUE, (LPARAM)spaceW);
GetDateFormat(LOCALE_USER_DEFAULT, DATE_LONGDATE, &st, NULL, szDate, MAX_STRING_LEN);
SendMessage(Globals.hEdit, EM_REPLACESEL, TRUE, (LPARAM)szDate);
}
VOID DIALOG_EditWrap(VOID)
{
BOOL modify = FALSE;
static const WCHAR editW[] = { 'e','d','i','t',0 };
DWORD dwStyle = WS_CHILD | WS_VISIBLE | WS_BORDER | WS_VSCROLL |
ES_AUTOVSCROLL | ES_MULTILINE;
RECT rc;
DWORD size;
LPWSTR pTemp;
size = GetWindowTextLength(Globals.hEdit) + 1;
pTemp = HeapAlloc(GetProcessHeap(), 0, size * sizeof(WCHAR));
if (!pTemp)
{
ShowLastError();
return;
}
GetWindowText(Globals.hEdit, pTemp, size);
modify = SendMessage(Globals.hEdit, EM_GETMODIFY, 0, 0);
DestroyWindow(Globals.hEdit);
GetClientRect(Globals.hMainWnd, &rc);
if( Globals.bWrapLongLines ) dwStyle |= WS_HSCROLL | ES_AUTOHSCROLL;
Globals.hEdit = CreateWindowEx(WS_EX_CLIENTEDGE, editW, NULL, dwStyle,
0, 0, rc.right, rc.bottom, Globals.hMainWnd,
NULL, Globals.hInstance, NULL);
SendMessage(Globals.hEdit, WM_SETFONT, (WPARAM)Globals.hFont, (LPARAM)FALSE);
SetWindowTextW(Globals.hEdit, pTemp);
SendMessage(Globals.hEdit, EM_SETMODIFY, (WPARAM)modify, 0);
SetFocus(Globals.hEdit);
HeapFree(GetProcessHeap(), 0, pTemp);
Globals.bWrapLongLines = !Globals.bWrapLongLines;
CheckMenuItem(GetMenu(Globals.hMainWnd), CMD_WRAP,
MF_BYCOMMAND | (Globals.bWrapLongLines ? MF_CHECKED : MF_UNCHECKED));
}
VOID DIALOG_SelectFont(VOID)
{
CHOOSEFONT cf;
LOGFONT lf=Globals.lfFont;
ZeroMemory( &cf, sizeof(cf) );
cf.lStructSize=sizeof(cf);
cf.hwndOwner=Globals.hMainWnd;
cf.lpLogFont=&lf;
cf.Flags=CF_SCREENFONTS | CF_INITTOLOGFONTSTRUCT;
if( ChooseFont(&cf) )
{
HFONT currfont=Globals.hFont;
Globals.hFont=CreateFontIndirect( &lf );
Globals.lfFont=lf;
SendMessage( Globals.hEdit, WM_SETFONT, (WPARAM)Globals.hFont, (LPARAM)TRUE );
if( currfont!=NULL )
DeleteObject( currfont );
}
}
VOID DIALOG_Search(VOID)
{
ZeroMemory(&Globals.find, sizeof(Globals.find));
Globals.find.lStructSize = sizeof(Globals.find);
Globals.find.hwndOwner = Globals.hMainWnd;
Globals.find.hInstance = Globals.hInstance;
Globals.find.lpstrFindWhat = Globals.szFindText;
Globals.find.wFindWhatLen = SIZEOF(Globals.szFindText);
Globals.find.Flags = FR_DOWN|FR_HIDEWHOLEWORD;
/* We only need to create the modal FindReplace dialog which will */
/* notify us of incoming events using hMainWnd Window Messages */
Globals.hFindReplaceDlg = FindText(&Globals.find);
assert(Globals.hFindReplaceDlg !=0);
}
VOID DIALOG_SearchNext(VOID)
{
if (Globals.lastFind.lpstrFindWhat == NULL)
DIALOG_Search();
else /* use the last find data */
NOTEPAD_DoFind(&Globals.lastFind);
}
VOID DIALOG_HelpContents(VOID)
{
WinHelp(Globals.hMainWnd, helpfileW, HELP_INDEX, 0);
}
VOID DIALOG_HelpSearch(VOID)
{
/* Search Help */
}
VOID DIALOG_HelpHelp(VOID)
{
WinHelp(Globals.hMainWnd, helpfileW, HELP_HELPONHELP, 0);
}
VOID DIALOG_HelpLicense(VOID)
{
TCHAR cap[20], text[1024];
LoadString(Globals.hInstance, IDS_LICENSE, text, 1024);
LoadString(Globals.hInstance, IDS_LICENSE_CAPTION, cap, 20);
MessageBox(Globals.hMainWnd, text, cap, MB_ICONINFORMATION | MB_OK);
}
VOID DIALOG_HelpNoWarranty(VOID)
{
TCHAR cap[20], text[1024];
LoadString(Globals.hInstance, IDS_WARRANTY, text, 1024);
LoadString(Globals.hInstance, IDS_WARRANTY_CAPTION, cap, 20);
MessageBox(Globals.hMainWnd, text, cap, MB_ICONEXCLAMATION | MB_OK);
}
VOID DIALOG_HelpAboutWine(VOID)
{
static const WCHAR notepadW[] = { 'N','o','t','e','p','a','d','\n',0 };
WCHAR szNotepad[MAX_STRING_LEN];
LoadString(Globals.hInstance, STRING_NOTEPAD, szNotepad, SIZEOF(szNotepad));
ShellAbout(Globals.hMainWnd, szNotepad, notepadW, 0);
}
/***********************************************************************
*
* DIALOG_FilePageSetup
*/
VOID DIALOG_FilePageSetup(void)
{
DialogBox(Globals.hInstance, MAKEINTRESOURCE(DIALOG_PAGESETUP),
Globals.hMainWnd, DIALOG_PAGESETUP_DlgProc);
}
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
*
* DIALOG_PAGESETUP_DlgProc
*/
static INT_PTR WINAPI DIALOG_PAGESETUP_DlgProc(HWND hDlg, UINT msg, WPARAM wParam, LPARAM lParam)
{
switch (msg)
{
case WM_COMMAND:
switch (wParam)
{
case IDOK:
/* save user input and close dialog */
GetDlgItemText(hDlg, IDC_PAGESETUP_HEADERVALUE, Globals.szHeader, SIZEOF(Globals.szHeader));
GetDlgItemText(hDlg, IDC_PAGESETUP_FOOTERVALUE, Globals.szFooter, SIZEOF(Globals.szFooter));
Globals.iMarginTop = GetDlgItemInt(hDlg, IDC_PAGESETUP_TOPVALUE, NULL, FALSE) * 100;
Globals.iMarginBottom = GetDlgItemInt(hDlg, IDC_PAGESETUP_BOTTOMVALUE, NULL, FALSE) * 100;
Globals.iMarginLeft = GetDlgItemInt(hDlg, IDC_PAGESETUP_LEFTVALUE, NULL, FALSE) * 100;
Globals.iMarginRight = GetDlgItemInt(hDlg, IDC_PAGESETUP_RIGHTVALUE, NULL, FALSE) * 100;
EndDialog(hDlg, IDOK);
return TRUE;
case IDCANCEL:
/* discard user input and close dialog */
EndDialog(hDlg, IDCANCEL);
return TRUE;
case IDHELP:
{
/* FIXME: Bring this to work */
static const WCHAR sorryW[] = { 'S','o','r','r','y',',',' ','n','o',' ','h','e','l','p',' ','a','v','a','i','l','a','b','l','e',0 };
static const WCHAR helpW[] = { 'H','e','l','p',0 };
MessageBox(Globals.hMainWnd, sorryW, helpW, MB_ICONEXCLAMATION);
return TRUE;
}
default:
break;
}
break;
case WM_INITDIALOG:
/* fetch last user input prior to display dialog */
SetDlgItemText(hDlg, IDC_PAGESETUP_HEADERVALUE, Globals.szHeader);
SetDlgItemText(hDlg, IDC_PAGESETUP_FOOTERVALUE, Globals.szFooter);
SetDlgItemInt(hDlg, IDC_PAGESETUP_TOPVALUE, Globals.iMarginTop / 100, FALSE);
SetDlgItemInt(hDlg, IDC_PAGESETUP_BOTTOMVALUE, Globals.iMarginBottom / 100, FALSE);
SetDlgItemInt(hDlg, IDC_PAGESETUP_LEFTVALUE, Globals.iMarginLeft / 100, FALSE);
SetDlgItemInt(hDlg, IDC_PAGESETUP_RIGHTVALUE, Globals.iMarginRight / 100, FALSE);
break;
}
return FALSE;
}