home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
HyperLib 1997 Winter - Disc 1
/
HYPERLIB-1997-Winter-CD1.ISO.7z
/
HYPERLIB-1997-Winter-CD1.ISO
/
オンラインウェア
/
PRG
/
ListPrint.sit
/
ListPrint
/
Print.c
< prev
next >
Wrap
Text File
|
1994-11-25
|
10KB
|
384 lines
//******************************************************************************
//* *
//* Macintosh プログラム作成の勉強 *
//* This Program is lesson for Macintohs. *
//* *
//* 1994/ 9/23 By SAGAWA KAZUYOSHI *
//* 1994/11/15 By SAGAWA KAZUYOSHI *
//* *
//******************************************************************************
/*
* インクルード
*/
#include "Constants.h"
#include "ListPrint.h"
#define LeftMarginPixel 20 /* 左端からのオフセット */
//**************************************************************************
//*
//* 本モジュールの中だけで使用されている関数プロトタイプ宣言
//*
//**************************************************************************
void TabMoveDrawText (Ptr, int, int);
void TabSpaceDrawText (Ptr, int, int);
int FnameDrawString (Str63, int);
void LineNumberDrawText (int);
void PageNumberDrawText (int, int);
int PrintCancelCheck (void);
/**************************************************************************
*
* FUC 印刷
*
* IN 印刷データHandle ファイル名
* OT true:印刷キャンセル false:印刷実行
* EX fontItemNow sizeItemNow
*
*************************************************************************/
int PrintDoc(Handle hGetData, Str63 fName)
{
int i, length, editLength, lineNumber, lineSpace;
char *ptr, *pw;
char editBuf[256]; /* 編集後印刷データ */
/* @@@@ 後でハンドルにする @@@@@*/
TPPrPort printPort; /* 印刷用グラフポート */
TPrStatus prStatus;
FontInfo info; /* フォント情報 */
int lineHight, lineBase;
int linesPerPage; /* 1ページの行数 */
int line = 0;
int lastLineOnPage = 0;
int leftPosition; /* 左側書き出し位置 */
int pageNumber = 1; /* ページ番号 */
short fontID;
long sizeID;
Str255 fontName, sizeName;
long dtSize; /* データサイズ */
DialogPtr atDialog; /* 印刷中断メッセージ表示処理用 */
GrafPtr savePort; /* */
int printCan = false; /* */
short itemNo, itemType; /* */
Rect box; /* */
Handle hMsg; /* */
Str255 tPrintCanMsg; /* */
/*---------------------------------------------------------------*/
atDialog = GetNewDialog(printCancelDailogID, 0, (WindowPtr)-1L);
GetPort(&savePort);
SetPort((GrafPtr)atDialog);
GetDItem(atDialog, 1, &itemType, &hMsg, &box); /* メッセージを表示させる */
GetIText(hMsg, tPrintCanMsg);
SetIText(hMsg, tPrintCanMsg);
SetPort((GrafPtr)savePort);
/*---------------------------------------------------------------*/
printPort = PrOpenDoc(hPrint, 0L, 0L);
SetPort( (GrafPtr)printPort );
GetItem(GetMHandle(fontMenuID), fontItemNow, fontName);
GetFNum(fontName, &fontID);
TextFont( fontID ); /* フォント */
GetItem(GetMHandle(sizeMenuID), sizeItemNow, sizeName);
StringToNum(sizeName, &sizeID);
TextSize( sizeID ); /* サイズ */
GetFontInfo( &info ); /* フォント情報 */
lineSpace = GetCtlValue(hControl[lineSpaceNormalCntlNumber]);
(lineSpace) ? (lineHight = info.ascent + info.descent + info.leading)
: (lineHight = info.ascent + info.descent);
linesPerPage = ((**hPrint).prInfo.rPage.bottom - (**hPrint).prInfo.rPage.top) / lineHight;
linesPerPage-=3;
lineNumber = GetCtlValue(hControl[lineNumCntlNumber]); /* 行番号の表示の有無 */
/*---------------------------------------------------------------*/
dtSize = GetHandleSize(hGetData);
ptr = pw = (*hGetData); /* 印刷元データのポインタ */
leftPosition = (**hPrint).prInfo.rPage.left + LeftMarginPixel;
do {
PrOpenPage( printPort, 0L );
lastLineOnPage += linesPerPage;
lineBase = FnameDrawString(fName, lineHight); /* ヘッダ印刷 */
do {
MoveTo(leftPosition, (lineBase += lineHight)); /* 1改行 */
while ( (ptr <= (*hGetData) + dtSize) &&
(*ptr != (char)'¥r') && (*ptr != (char)'¥f') ) /* 改行 改頁 */
{
ptr++;
}
ptr++; /* 1行 分のデータ位置 */
if ((length = (int)(ptr - pw) - 1) > 0) {
TabMoveDrawText(pw, length, lineNumber);
// TabSpaceDrawText(pw, length, lineNumber);
}
else if (length == 0) {
if (*(ptr - 1) == (char)'¥r') {
LineNumberDrawText( lineNumber );
}
else {
pw = ptr;
break;
}
}
if (lineNumber != 0) lineNumber++;
pw = ptr;
} while ((++line != lastLineOnPage) && (ptr < (*hGetData) + dtSize));
/*---------------------------------------------------------------*/
// if (line != lastLineOnPage) {
// for (i = 0; i < lastLineOnPage-line; i++)
// MoveTo(leftPosition, (lineBase += lineHight)); /* 1改行 */
// }
PageNumberDrawText(pageNumber, lineBase + lineHight);
pageNumber++;
PrClosePage( printPort );
if ( PrintCancelCheck() ) {
printCan = true; /* Cancel ON */
break;
}
} while (ptr < (*hGetData) + dtSize);
PrCloseDoc ( printPort );
if ( !printCan ) /* キャンセルされていなければ印刷実行 */
PrPicFile(hPrint, 0L, 0L, 0L, &prStatus);
/*---------------------------------------------------------------*/
DisposeDialog(atDialog);
return( printCan );
}
/**************************************************************************
*
* FUC データの編集と印刷
*
* IN 編集データ データサイズ(1行分) 行番号値
* OT 無し
* EX tabsItemNow
*
*************************************************************************/
void TabMoveDrawText(Ptr p, int count, int lineNumber)
{
register char *p1, *p2, nEdit[8];
int i, len, tabWidth;
Point pt;
int leftMargin; /* 文字の書き出し位置 */
if (lineNumber != 0) { /* 行番号有り */
LineNumberDrawText( lineNumber );
}
else { /* 行番号無し */
nEdit[0] = 6;
for (i = 1; i < 8; i++) nEdit[i] = ' ';
DrawString((ConstStr255Param)nEdit);
}
leftMargin = StringWidth("¥p1") * 6 + LeftMarginPixel;
tabWidth = StringWidth("¥p1") * tabsItemNow;
p1 = p; /* データ先頭 */
p2 = p + count; /* データの最後 */
while (p < p2) {
while ( (p1 < p2) && (*p1 != '¥t') ) *p1++;
if ((len = p1 - p) > 0) {
DrawText(p, 0, p1 - p); /* 文字列印刷 */
}
if (*p1 == '¥t') { /* TAB移動 */
GetPen( &pt );
Move( (tabWidth - (pt.h - leftMargin) % tabWidth), 0 );
// Move( tabWidth - pt.h % tabWidth, 0 );
*p1++;
}
p = p1; /* 先頭位置移動 */
}
}
/**************************************************************************
*
* FUC データの編集と印刷(SoloWriter Mode)
*
* IN 編集データ データサイズ(1行分) 行番号値
* OT 無し
* EX tabsItemNow @@@@@未完成@@@@@
*
*************************************************************************/
void TabSpaceDrawText(Ptr p, int count, int lineNumber)
//int PrintDataEdit(long count, Ptr iPtr, Ptr oPtr)
//#define LEFTTAB 7 #define CENTERTAB 8 #define RIGHTTAB 9
{
int i, j;
int TabCount, TabSize, colunm, sp, length;
char eText[256], *eP, nEdit[8];
// Str255 iPtr, oPtr;
if (lineNumber != 0) { /* 行番号有り */
LineNumberDrawText( lineNumber );
}
else { /* 行番号無し */
nEdit[0] = 6;
for (i = 1; i < 8; i++) nEdit[i] = ' ';
DrawString((ConstStr255Param)nEdit);
}
TabSize = 9; //LEFTTAB; CENTERTAB; RIGHTTAB;
TabCount = TabSize;
eP = eText;
length = 0; /* 編集後のデータサイズ */
colunm = 1;
for (i = 0; i < count; i++) {
if (*p == '¥t') { /* TabをSPに変換 */
sp = TabCount - colunm;
if (sp == 0) sp = TabSize - 1;
for (j = 0; j < sp; j++) {
*eP++ = ' ', length++;
}
if (colunm >= TabCount) {
TabCount += TabSize;
TabCount--;
}
colunm += sp;
}
else {
*eP++ = *p;
length++;
if (*p == '¥r') {
TabCount = TabSize;
colunm = 1;
}
else {
if (colunm >= TabCount) {
TabCount += TabSize;
TabCount--;
}
colunm++;
}
}
*p++; /* 次データ */
}
*eP = 0; /* NULL 止め */
// return(length);
DrawText(eText, 0, length);
}
int FnameDrawString(Str63 fName, int lineHight)
{
int lineBase, pHead, len, i, j;
short *p;
Str255 dateString, wSt;
DateTimeRec dt;
fName[++fName[0]] = ' '; /* ファイル名の後に space を入れる */
for (len = 0; len < 63; len ++) { dateString[len] = ' '; }
GetTime( &dt ); /* 年月日時分秒取り込み */
p = (short *) &dt;
for (j = len = 0; j < 3; j++) { /* 年月日 */
NumToString(*p++, wSt);
for (i = 1; i <= wSt[0]; i++) { dateString[len+i] = wSt[i]; }
if (j < 2) dateString[len+i] = '.';
len += (wSt[0]+1);
}
dateString[0] = len;
pHead = (fName[0] + dateString[0] + 4) * 5;
MoveTo( (**hPrint).prInfo.rPage.right - pHead, /* 印刷位置(右上隅) */
(lineBase = (**hPrint).prInfo.rPage.top + lineHight) );
DrawString( (ConstStr255Param)fName );
DrawString( (ConstStr255Param)dateString );
return(lineBase);
}
// long dateTime;
// GetDateTime(&dateTime); /* 現在までの秒数 */
// IUDatePString(dateTime, 1, dateString, 0); /* この関数無い */
void LineNumberDrawText(int lineNumber)
{
char nEdit[8];
if (lineNumber != 0) { /* 行番号 */
nEdit[0] = 6; /* 文字長 */
nEdit[1] = (lineNumber / 10000) + '0';
nEdit[2] = (lineNumber % 10000) / 1000 + '0';
nEdit[3] = (lineNumber % 1000) / 100 + '0';
nEdit[4] = (lineNumber % 100) / 10 + '0';
nEdit[5] = (lineNumber % 10) + '0';
nEdit[6] = ' ';
nEdit[7] = ' ';
DrawString((ConstStr255Param)nEdit);
}
}
void PageNumberDrawText(int pageNumber, int line)
{
char pEdit[8];
/* センタリング */
MoveTo( ((**hPrint).prInfo.rPage.right - (**hPrint).prInfo.rPage.left) / 2, line );
if (pageNumber < 10) { /* ページ番号編集 */
pEdit[0] = 1;
pEdit[1] = pageNumber + '0';
}
else if(pageNumber < 100) {
pEdit[0] = 2;
pEdit[1] = (pageNumber % 100) / 10 + '0';
pEdit[2] = (pageNumber % 10) + '0';
}
else {
pEdit[0] = 3;
pEdit[1] = (pageNumber % 1000) / 100 + '0';
pEdit[2] = (pageNumber % 100) / 10 + '0';
pEdit[3] = (pageNumber % 10) + '0';
}
DrawString( (ConstStr255Param)pEdit ); /* ページ番号印刷 */
}
/**************************************************************************
*
* FUC 印刷中断確認
*
* IN 無し
* OT false:継続 true:キャンセル
* EX 無し
*
*************************************************************************/
int PrintCancelCheck(void)
{
int ret;
EventRecord event;
unsigned char asc;
ret = false;
if (GetNextEvent(everyEvent, &event)) {
switch (event.what) {
case keyDown:
case autoKey:
asc = event.message & charCodeMask;
if ((event.modifiers & cmdKey) && asc == '.')
ret = true;
break;
default:
break;
}
}
return(ret);
}