248 lines
9.1 KiB
C
248 lines
9.1 KiB
C
|
/*
|
||
|
* Windows Calendar
|
||
|
* Copyright (c) 1985 by Microsoft Corporation, all rights reserved.
|
||
|
* Written by Mark L. Chamberlin, consultant to Microsoft.
|
||
|
*
|
||
|
*/
|
||
|
|
||
|
/*
|
||
|
*****
|
||
|
***** caldata.c
|
||
|
*****
|
||
|
*/
|
||
|
|
||
|
#include "cal.h"
|
||
|
|
||
|
// While processing command line options, there may be errors
|
||
|
// (e.g. can't open file) which need to be put up using AlertBox(). Once
|
||
|
// alert box completes, the focus is set to the parent window which results
|
||
|
// in WM_ACTIVATE. If WM_ACTIVATE is processed before a file is loaded
|
||
|
// it results in GP Faults.
|
||
|
// Prevent processing WM_ACTIVATE when initialization is not yet complete
|
||
|
// Set after CalInit() completes.
|
||
|
BYTE fInitComplete = FALSE;
|
||
|
|
||
|
BYTE vrgcDaysMonth [12] =
|
||
|
{31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
|
||
|
|
||
|
BOOL vfDayMode = FALSE; /* TRUE if in day mode, FALSE if in month mode.
|
||
|
Note - it's important that be initialize to
|
||
|
FALSE so the first call to DayMode () sets
|
||
|
everything up.
|
||
|
*/
|
||
|
|
||
|
HINSTANCE vhInstance; /* Current instance handle. */
|
||
|
|
||
|
HBRUSH vhbrBorder = 0; /* Brush to use for borders - this uses the system
|
||
|
window borders color.
|
||
|
*/
|
||
|
HBRUSH vhbrBackMain = 0; /* Background brush for the main window - this
|
||
|
uses a fixed color defined by Tandy.
|
||
|
*/
|
||
|
HBRUSH vhbrBackSub = 0; /* Background brush for all sub windows - this uses
|
||
|
the system window background color.
|
||
|
*/
|
||
|
|
||
|
HCURSOR vhcsrArrow;
|
||
|
HCURSOR vhcsrIbeam;
|
||
|
HCURSOR vhcsrWait;
|
||
|
|
||
|
INT vcxFont; /* Width of fixed font. */
|
||
|
INT vcxFontMax; /* Maximum font width */
|
||
|
INT vcyFont; /* Height of fixed font. */
|
||
|
INT vcyDescent; /* The descent of the fixed font. */
|
||
|
INT vcyExtLead; /* External leading of fixed font. Pronounced
|
||
|
as in the metal lead, this is the blank space
|
||
|
separating two lines of text. This space "belongs"
|
||
|
to the first of two lines (i.e., it follows the
|
||
|
text rather than preceding it).
|
||
|
*/
|
||
|
INT vcyLineToLine; /* Base line to base line of fixed font
|
||
|
(Same as vcyFont + vcyExtLead).
|
||
|
*/
|
||
|
|
||
|
INT vcxBorder;
|
||
|
INT vcxVScrollBar;
|
||
|
INT vcyBorder;
|
||
|
INT vcxHScrollBar;
|
||
|
INT vcyHScrollBar;
|
||
|
|
||
|
/* Window heights. Note that all heights are of client areas except for
|
||
|
vcyWnd1, which includes the top and bottom borders.
|
||
|
*/
|
||
|
INT vcyWnd1;
|
||
|
INT vcyWnd2A;
|
||
|
INT vcyWnd2BTop;
|
||
|
INT vcyWnd2BBot;
|
||
|
INT vcyWnd2B;
|
||
|
|
||
|
/* Window widths. Note that all widths are of client areas except for
|
||
|
vcxWnd1, which includes the left and right borders.
|
||
|
*/
|
||
|
INT vcxWnd1;
|
||
|
INT vcxWnd2A;
|
||
|
INT vcxWnd2B;
|
||
|
|
||
|
INT vxcoBell; /* Where alarm bell bitmap starts. */
|
||
|
INT vcxBell; /* Width of the alarm bell bitmap. */
|
||
|
INT vcyBell; /* Height of the alarm bell bitmap. */
|
||
|
INT vxcoApptTime; /* Where the appointment time starts. */
|
||
|
INT vxcoAmPm; /* Where the am or pm string starts. */
|
||
|
|
||
|
/* The limits of the appointment description portion of wnd2B. */
|
||
|
INT vxcoQdFirst;
|
||
|
INT vxcoQdMax;
|
||
|
INT vycoQdFirst;
|
||
|
INT vycoQdMax;
|
||
|
|
||
|
INT vxcoDate; /* Where the date begins in wnd2A. */
|
||
|
|
||
|
/* The bottom box of the calendar encloses the notes edit control, but the
|
||
|
edit control does not take up the entire box. We draw a double line
|
||
|
above the notes. The upper line is in wnd2B, the lower is drawn
|
||
|
in wnd1 at vycoNotesBox.
|
||
|
*/
|
||
|
INT vycoNotesBox;
|
||
|
|
||
|
/* Coordinates of the notes edit control within wnd1. */
|
||
|
INT vxcoWnd2C;
|
||
|
INT vycoWnd2C;
|
||
|
|
||
|
INT vcln; /*** ln - a line in the appointments window (0 through
|
||
|
vcln - 1).
|
||
|
*/
|
||
|
INT vlnLast; /* The highest line number. */
|
||
|
|
||
|
LD vtld [25]; /* The table of line descriptors. */
|
||
|
/* Window handles. */
|
||
|
HWND vhwnd0;
|
||
|
HWND vhwnd1;
|
||
|
HWND vhwnd2A;
|
||
|
HWND vhwnd2B;
|
||
|
HWND vhwnd2C;
|
||
|
HWND vhwnd3;
|
||
|
HWND hEditHide;
|
||
|
#ifndef BUG_8560
|
||
|
HWND vhScrollWnd; /* Window handle of the scrollbar handle */
|
||
|
#endif
|
||
|
|
||
|
D3 vd3Cur; /* Date when we last called ReadClock. */
|
||
|
FT vftCur; /* Date and time when we last called
|
||
|
ReadClock.
|
||
|
*/
|
||
|
|
||
|
UINT vcMinEarlyRing; /* Alarm early ring period. */
|
||
|
BOOL vfSound; /* TRUE if the audio alarm is enabled. */
|
||
|
BOOL vfHour24; /* TRUE for 24 hour format, FALSE for
|
||
|
12 hour format.
|
||
|
*/
|
||
|
INT vmdInterval; /* Interval between appointments:
|
||
|
MDINTERVAL15, MDINTERVAL30, or
|
||
|
MDINTERVAL60.
|
||
|
*/
|
||
|
|
||
|
INT viMarkSymbol = 0;
|
||
|
BOOL vfOpenFileReadOnly = FALSE;
|
||
|
|
||
|
INT vcMinInterval; /* Interval stored in minutes. */
|
||
|
TM vtmStart; /* Starting time of day mode. */
|
||
|
|
||
|
DLGPROC vrglpfnDialog [CIDD] =
|
||
|
{
|
||
|
0, /* FnSaveAs, removed by L.Raman 12/12/90 (common dlg. support) */
|
||
|
FnPrint,
|
||
|
FnRemove,
|
||
|
FnDate,
|
||
|
FnControls,
|
||
|
FnSpecialTime,
|
||
|
FnDaySettings,
|
||
|
0, // FnAbout, removed by TG 12/17/90 (ShellAbout support)
|
||
|
FnAckAlarms,
|
||
|
FnPageSetup
|
||
|
};
|
||
|
|
||
|
INT vlnCur; /* The current ln. */
|
||
|
|
||
|
FT vftAlarmNext; /* The next alarm to go off. vftAlarmNext.dt
|
||
|
== DTNIL means there is no next alarm.
|
||
|
*/
|
||
|
FT vftAlarmFirst; /* The first unacknowledged alarm.
|
||
|
vftAlarmFirst.dt == DTNIL means there are
|
||
|
no unacknowledged alarms.
|
||
|
*/
|
||
|
BOOL vfFlashing = FALSE; /* If TRUE, we are flashing the window (title
|
||
|
bar or icon to tell the user to make us
|
||
|
the active window.
|
||
|
*/
|
||
|
INT vcAlarmBeeps = 0; /* The number of beeps remaining for the
|
||
|
alarm.
|
||
|
*/
|
||
|
|
||
|
BOOL vfInsert; /* Only valid during a special time command.
|
||
|
FALSE means Delete, TRUE means insert.
|
||
|
*/
|
||
|
TM vtmSpecial; /* Only valid during a special time command.
|
||
|
The tm to delete or insert.
|
||
|
*/
|
||
|
|
||
|
BOOL vfNoGrabFocus; /* If Calendar is brought up iconic this flag
|
||
|
gets set by CalInit in order to prevent the
|
||
|
focus from being grabbed. Instead of calling
|
||
|
SetFocus directly, all routines call
|
||
|
CalSetFocus, which only calls SetFocus
|
||
|
if vfNoGrabFocus is FALSE.
|
||
|
*/
|
||
|
|
||
|
HANDLE vhAccel; /* Handle to the accelerator table. */
|
||
|
INT viAMorPM = IDCN_AM;
|
||
|
|
||
|
/* AlertBox needs to know what window is the parent of the message box.
|
||
|
If there is a dialog in progress, the parent is the dialog box.
|
||
|
Otherwise, the parent window is Calendar's tiled window.
|
||
|
In order to avoid having to pass down the parent window handle
|
||
|
through numerous levels of calls, we simply remember the window
|
||
|
handle of the active dialog in vhwndDialog. It is initially set
|
||
|
to (HWND)NULL and gets reset to this at the end of FDoDialog.
|
||
|
Each dialog stores it's window handle into vhwndDialog when it
|
||
|
handles the WM_INITDIALOG. Note that there are no cases of nested
|
||
|
dialogs, so having a single global works.
|
||
|
(As an example of where the parent window handle would have to be
|
||
|
passed down numerous levels, consider the FSaveFile case. It can
|
||
|
be called while the SaveAs dialog is up, or from Save (in which
|
||
|
case there is no dialog. It in turn goes several layers deep
|
||
|
and gets into routines like FWriteFile which can call AlertBox to
|
||
|
report a Disk Full error. So using a global makes a lot of sense.)
|
||
|
*/
|
||
|
HWND vhwndDialog = (HWND)NULL;
|
||
|
|
||
|
/* If the system clock is set back by one or more minutes, or it is
|
||
|
set ahead by 1440 (the number of minutes in a day) or more minutes,
|
||
|
this flag gets set so we know we have to resynchronize the next alarm.
|
||
|
*/
|
||
|
BOOL vfMustSyncAlarm = FALSE;
|
||
|
|
||
|
/* globals for file page setup and file print */
|
||
|
|
||
|
CHAR chPageText[6][PT_LEN];
|
||
|
CHAR szDec[5];
|
||
|
CHAR szPrinter[128];
|
||
|
BOOL bPrinterSetupDone=FALSE;
|
||
|
|
||
|
INT viLeftMarginLen; /* page left margin length */
|
||
|
INT viRightMarginLen; /* page right margin length */
|
||
|
INT viTopMarginLen; /* page top margin length */
|
||
|
INT viBotMarginLen; /* page bottom margin length */
|
||
|
|
||
|
INT viCurrentPage = 0; /* current page being printed */
|
||
|
|
||
|
OPENFILENAME vOFN; /* struct. for the common
|
||
|
* file open and saveas dialogs
|
||
|
*/
|
||
|
INT vFilterIndex = 1; /* default filter index in File/Open
|
||
|
* dialog
|
||
|
*/
|
||
|
PRINTDLG vPD; /* struct. passed into PrintDlg */
|
||
|
INT vHlpMsg; /* message nummer to invoke Help appl. from
|
||
|
* common dialogs
|
||
|
*/
|