⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 gvpdlg.c

📁 GSview 4.6 PostScript previewer。Ghostscript在MS-Windows, OS/2 and Unix下的图形化接口
💻 C
📖 第 1 页 / 共 4 页
字号:
/* 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 + -