📄 gvpdlg.c
字号:
/* Copyright (C) 1993-1998, Ghostgum Software Pty Ltd. All rights reserved.G
This file is part of GSview.
This program is distributed with NO WARRANTY OF ANY KIND. No author
or distributor accepts any responsibility for the consequences of using it,
or for whether it serves any particular purpose or works at all, unless he
or she says so in writing. Refer to the GSview Free Public Licence
(the "Licence") for full details.
Every copy of GSview must include a copy of the Licence, normally in a
plain ASCII text file named LICENCE. The Licence grants you the right
to copy, modify and redistribute GSview, but only under certain conditions
described in the Licence. Among other things, the Licence requires that
the copyright notice and this notice be preserved on all copies.
*/
/* gvpdlg.c */
/* Dialog boxes for PM GSview */
#include "gvpm.h"
BOOL get_string_busy;
char get_string_prompt[MAXSTR];
char get_string_answer[MAXSTR];
void listbox_getpath(HWND hwnd, char *path, int listbox);
void listbox_directory(HWND hwnd, char *path, int listbox, int stext);
MRESULT EXPENTRY
InputDlgProc(HWND hwnd, ULONG mess, MPARAM mp1, MPARAM mp2)
{
switch(mess) {
case WM_INITDLG:
WinSendMsg( WinWindowFromID(hwnd, ID_ANSWER),
EM_SETTEXTLIMIT, MPFROM2SHORT(MAXSTR, 0), MPFROMLONG(0) );
WinSetWindowText( WinWindowFromID(hwnd, ID_ANSWER),
(PBYTE)get_string_answer );
WinSetWindowText( WinWindowFromID(hwnd, ID_PROMPT),
(PBYTE)get_string_prompt );
WinSendMsg( WinWindowFromID(hwnd, ID_ANSWER),
EM_SETSEL, MPFROM2SHORT(0, strlen(get_string_answer)), MPFROMLONG(0) );
WinSetFocus(HWND_DESKTOP, WinWindowFromID(hwnd, ID_ANSWER));
break;
case WM_COMMAND:
switch(SHORT1FROMMP(mp1)) {
case DID_OK:
WinEnableWindow(WinWindowFromID(hwnd, DID_OK), FALSE);
WinQueryWindowText(WinWindowFromID(hwnd, ID_ANSWER),
MAXSTR, (PBYTE)get_string_answer);
WinDismissDlg(hwnd, DID_OK);
return (MRESULT)TRUE;
case ID_HELP:
get_help();
return (MRESULT)TRUE;
}
break;
}
return WinDefDlgProc(hwnd, mess, mp1, mp2);
}
BOOL
query_string(const char *prompt, char *answer)
{
if (get_string_busy) {
message_box("get_string is busy",0);
return FALSE;
}
get_string_busy = TRUE;
strncpy(get_string_prompt, prompt, MAXSTR);
strncpy(get_string_answer, answer, MAXSTR);
if (WinDlgBox(HWND_DESKTOP, hwnd_frame, InputDlgProc, hlanguage, IDD_INPUT, NULL)
== DID_OK) {
strncpy(answer, get_string_answer, MAXSTR);
get_string_busy = FALSE;
return TRUE;
}
get_string_busy = FALSE;
return FALSE;
}
MRESULT EXPENTRY
SubFileDlgProc(HWND hwnd, ULONG mess, MPARAM mp1, MPARAM mp2)
{
static char filter[80];
static char filename[MAXSTR];
static BOOL is_wild;
char *p;
int i;
switch(mess) {
case WM_INITDLG:
is_wild = FALSE;
filename[0] = '\0';
filter[0] = '\0';
strcpy(filter, (char *)((PFILEDLG)WinQueryWindowULong(hwnd, QWL_USER))->pszIType);
for (p=filter; *p; p++) {
if (*p == ';')
*p = '\0';
}
p++;
*p = '\0'; /* double trailing NULL */
break;
case WM_CONTROL:
if (mp1 == MPFROM2SHORT(DID_FILENAME_ED, EN_CHANGE)) {
WinQueryWindowText(WinWindowFromID(hwnd, DID_FILENAME_ED),
sizeof(filename), (PBYTE)filename);
is_wild = (strchr(filename, '*') || strchr(filename, '?'));
}
if (mp1 == MPFROM2SHORT(DID_FILTER_CB, CBN_LBSELECT)) {
i = (int)WinSendMsg(WinWindowFromID(hwnd, DID_FILTER_CB), LM_QUERYSELECTION, (MPARAM)0, (MPARAM)0);
if (i == LIT_NONE)
return FALSE;
WinSendMsg(WinWindowFromID(hwnd, DID_FILTER_CB), LM_QUERYITEMTEXT, MPFROM2SHORT(i, sizeof(filter)), MPFROMP(filter));
if (filter[0] == '<')
strcpy(filter, "*.*");
for (p=filter; *p; p++) {
if (*p == ';')
*p = '\0';
}
p++;
*p = '\0'; /* double trailing NULL */
}
break;
case FDM_VALIDATE:
if ( (((PFILEDLG)WinQueryWindowULong(hwnd, QWL_USER))->fl) &
FDS_OPEN_DIALOG ) {
/* check that file exists */
FILE *f;
if ( (f=fopen((char *)mp1, "rb")) != (FILE *)NULL ) {
fclose(f);
return (MRESULT)TRUE;
}
play_sound(SOUND_ERROR);
return (MRESULT)FALSE;
}
/* return FALSE if Open dialog box and file doesn't exist */
return (MRESULT)TRUE; /* dismiss dialog */
case FDM_FILTER:
if (is_wild) {
if (wildmatch(filename, (char *)mp1))
return (MRESULT)TRUE; /* add to list box */
}
else {
p = filter;
while (*p) {
if (wildmatch(p, (char *)mp1))
return (MRESULT)TRUE; /* add to list box */
p += strlen(p) + 1;
}
}
return (MRESULT)FALSE; /* ignore file */
}
return WinDefFileDlgProc(hwnd, mess, mp1, mp2);
}
#define MAXFILTER 10
char *file_filter[MAXFILTER+1];
char file_filter_buffer[1024];
BOOL
get_filename(char *filename, BOOL save, int filter, int title, int help)
{
FILEDLG FileDlg;
FILE *f;
char szTitle[MAXSTR];
char *p;
int i;
memset(&FileDlg, 0, sizeof(FILEDLG));
FileDlg.cbSize = sizeof(FILEDLG);
if (save)
FileDlg.fl = FDS_CENTER | FDS_SAVEAS_DIALOG;
else
FileDlg.fl = FDS_CENTER | FDS_OPEN_DIALOG;
if (help) {
nHelpTopic = help;
FileDlg.fl |= FDS_HELPBUTTON;
}
if (title) {
load_string(title, szTitle, sizeof(szTitle));
FileDlg.pszTitle = (PBYTE)szTitle;
}
if (*filename) {
strcpy(FileDlg.szFullFile, filename);
}
else {
gs_getcwd(FileDlg.szFullFile, sizeof(FileDlg.szFullFile));
for (p=FileDlg.szFullFile; *p; p++) {
if (*p == '/')
*p = '\\';
}
i = strlen(FileDlg.szFullFile);
if (i && FileDlg.szFullFile[i-1]!='\\') {
strcat(FileDlg.szFullFile, "\\");
i++;
}
}
load_string(IDS_FILTER_BASE+filter, file_filter_buffer, sizeof(file_filter_buffer));
i = 0;
p=strtok(file_filter_buffer,"|");
FileDlg.pszIType = (PBYTE)p; /* default is first */
while (p && (i<MAXFILTER)) {
p = strtok(NULL, "|");
file_filter[i] = p;
i++;
}
FileDlg.papszITypeList = (PAPSZ)file_filter;
/* sub class window to alter "List files of Type" behaviour */
FileDlg.pfnDlgProc = SubFileDlgProc;
WinFileDlg(HWND_DESKTOP, hwnd_frame, &FileDlg);
if (FileDlg.lReturn == DID_OK) {
f = (FILE *)NULL;
if ( !save && ((f = fopen(FileDlg.szFullFile, "rb")) == (FILE *)NULL) ) {
gserror(IDS_FILENOTFOUND, NULL, MB_ICONEXCLAMATION, SOUND_ERROR);
return FALSE;
}
if (f)
fclose(f);
strncpy(filename, FileDlg.szFullFile, MAXSTR);
p = strrchr(FileDlg.szFullFile, '\\');
if (p) {
*p = '\0';
gs_chdir(FileDlg.szFullFile);
}
return TRUE;
}
return FALSE;
}
/* information about document dialog box */
MRESULT EXPENTRY
InfoDlgProc(HWND hwnd, ULONG mess, MPARAM mp1, MPARAM mp2)
{
switch(mess) {
case WM_INITDLG:
info_init(hwnd);
break;
case WM_COMMAND:
switch(SHORT1FROMMP(mp1)) {
case DID_OK:
WinEnableWindow(WinWindowFromID(hwnd, DID_OK), FALSE);
WinQueryWindowText(WinWindowFromID(hwnd, ID_ANSWER),
MAXSTR, (PBYTE)get_string_answer);
WinDismissDlg(hwnd, DID_OK);
return (MRESULT)TRUE;
}
break;
}
return WinDefDlgProc(hwnd, mess, mp1, mp2);
}
/* show info about ps file */
void
show_info()
{
WinDlgBox(HWND_DESKTOP, hwnd_frame, InfoDlgProc, hlanguage, IDD_INFO, NULL);
}
/* About Dialog Box */
MRESULT EXPENTRY AboutDlgProc(HWND hwnd, ULONG msg, MPARAM mp1, MPARAM mp2)
{
switch(msg) {
case WM_INITDLG:
/*
WinSetWindowText( WinWindowFromID(hwnd, ABOUT_VERSION),
GSVIEW_DOT_VERSION );
*/
WinSetWindowText( WinWindowFromID(hwnd, NAG_NAME),
(PBYTE)registration_name );
if (registration_receipt != 0) {
char buf[16];
sprintf(buf, "%u", registration_receipt);
WinSetWindowText( WinWindowFromID(hwnd, NAG_RECEIPT),
(PBYTE)buf );
}
break;
case WM_BUTTON1DBLCLK:
{POINTL pt;
RECTL rect;
HPS hps;
HBITMAP hbm;
rect.xLeft = 8; rect.xRight = rect.xLeft+216;
rect.yBottom = 28 /* 28 */; rect.yTop = rect.yBottom + 10;
pt.x = SHORT1FROMMP(mp1); pt.y = SHORT2FROMMP(mp1);
WinMapDlgPoints(hwnd, &pt, 1, FALSE);
if (WinPtInRect(hab, &rect, &pt)) {
hps = WinGetPS(hwnd);
hbm = GpiLoadBitmap(hps, NULLHANDLE, IDM_MISC, 64, 64);
pt.x = 250; pt.y = 12;
WinMapDlgPoints(hwnd, &pt, 1, TRUE);
WinDrawBitmap(hps, hbm, NULL, &pt, CLR_BLACK, CLR_WHITE, DBM_NORMAL);
GpiDeleteBitmap(hbm);
WinReleasePS(hps);
}
}
break;
case WM_COMMAND:
switch(SHORT1FROMMP(mp1)) {
case DID_OK:
WinDismissDlg(hwnd, TRUE);
return (MRESULT)TRUE;
}
break;
}
return WinDefDlgProc(hwnd, msg, mp1, mp2);
}
void
show_about()
{
WinDlgBox(HWND_DESKTOP, hwnd_frame, AboutDlgProc, hlanguage, IDD_ABOUT, 0);
}
/* Return TRUE if a contiguous block of pages (>2) is found */
/* Store start and end of this range in first and last */
/* If not contiguous, store entire page range in first and last */
BOOL
contiguous_range(HWND hwnd, int *first, int *last)
{
int i;
BOOL gap = FALSE; /* TRUE is gap found after block */
BOOL contiguous = TRUE;
int block = 0; /* number of pages set in a contiguous block */
BOOL selected;
for (i=0; i<(int)psfile.dsc->page_count; i++) {
selected = (i == (int)WinSendMsg(WinWindowFromID(hwnd, PAGE_LIST),
LM_QUERYSELECTION, MPFROMSHORT(i-1), (MPARAM)0));
if (selected && contiguous) {
if (gap)
contiguous = FALSE;
else {
if (block == 0)
*first = i;
else
*last = i+1;
block++;
}
}
else if (!selected && block)
gap = TRUE;
}
if (block < 2)
contiguous = FALSE;
if (!contiguous) {
*first = 0;
*last = psfile.dsc->page_count;
}
return contiguous;
}
MRESULT EXPENTRY PageDlgProc(HWND hwnd, ULONG msg, MPARAM mp1, MPARAM mp2)
{
int i;
int notify_message;
static BOOL ecdisable;
switch(msg) {
case WM_INITDLG:
{char buf[MAXSTR];
for (i=0; i<(int)psfile.dsc->page_count; i++) {
page_ordlabel(buf, i);
WinSendMsg( WinWindowFromID(hwnd, PAGE_LIST),
LM_INSERTITEM, MPFROMLONG(LIT_END),
MPFROMP(buf) );
}
WinSendMsg( WinWindowFromID(hwnd, PAGE_LIST),
LM_SELECTITEM, MPFROMLONG(psfile.page_list.current), MPFROMLONG(TRUE) );
/*
if (psfile.page_list.current > 5)
WinSendMsg( WinWindowFromID(hwnd, PAGE_LIST),
LM_SETTOPINDEX, MPFROMLONG(psfile.page_list.current - 5), (MPARAM)0 );
*/
WinSendMsg( WinWindowFromID(hwnd, PAGE_LIST), LM_QUERYITEMTEXT,
MPFROM2SHORT(psfile.page_list.current, sizeof(buf)),
MPFROMP(buf) );
ecdisable = TRUE;
WinSetWindowText( WinWindowFromID(hwnd, PAGE_EDIT), (PBYTE)buf);
ecdisable = FALSE;
WinSendMsg( WinWindowFromID(hwnd, PAGE_EDIT), EM_SETSEL,
MPFROM2SHORT(0, 255), (MPARAM)0);
}
break;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -