📄 todo.c
字号:
switch (event->data.ctlSelect.controlID)
{
case DetailsOkButton:
updateCode = DetailsApply (category, &dueDate, categoryEdited);
FrmReturnToForm (ListView);
FrmUpdateForm (ListView, updateCode);
handled = true;
break;
case DetailsCancelButton:
if (categoryEdited)
updateCode = updateCategoryChanged;
else
updateCode = 0;
FrmUpdateForm (ListView, updateCode);
FrmReturnToForm (ListView);
handled = true;
break;
case DetailsDeleteButton:
FrmReturnToForm (ListView);
if ( DetailsDeleteToDo ())
FrmUpdateForm (ListView, updateItemDelete);
else
FrmUpdateForm (ListView, 0);
handled = true;
break;
case DetailsNoteButton:
PendingUpdate = DetailsApply (category, &dueDate, categoryEdited);
FrmCloseAllForms ();
FrmGotoForm (NewNoteView);
handled = true;
break;
case DetailsCategoryTrigger:
categoryEdited = DetailsSelectCategory (&category) || categoryEdited;
handled = true;
break;
}
}
else if (event->eType == popSelectEvent)
{
if (event->data.popSelect.listID == DetailsDueDateList)
{
DetermineDueDate (event->data.popSelect.selection, &dueDate);
DetailsSetDateTrigger (dueDate);
handled = true;
}
}
else if (event->eType == frmOpenEvent)
{
frm = FrmGetActiveForm ();
DetailsInit (&category, &dueDate);
FrmDrawForm (frm);
categoryEdited = false;
handled = true;
}
return (handled);
}
#pragma mark ----------------
/***********************************************************************
*
* FUNCTION: NoteViewDrawTitleAndForm
*
* DESCRIPTION: This routine draws the form and title of the note view.
*
* PARAMETERS: frm, FormPtr to the form to draw
*
* RETURNED: nothing
*
* REVISION HISTORY:
* Name Date Description
* ---- ---- -----------
* art 2/21/95 Initial Revision
* jmp 09/27/99 Square off the NoteView title so that it covers up
* the blank Form title used to trigger the menu on taps
* to the title area. Also, set the NoteView title's color
* to match the standard Form title colors. Eventually, we
* should add a variant to Forms that allows for NoteView
* titles directly. This "fixes" bug #21610.
* jmp 09/29/99 Fix bug #22413: Ensure that we peform the font metrics
* AFTER we have set the font!
* jmp 12/02/99 Fix bug #24377. Don't call WinScreenUnlock() if WinScreenLock()
* fails.
*
***********************************************************************/
static void NoteViewDrawTitleAndForm (FormPtr frm)
{
Coord x;
Coord maxWidth;
Coord formWidth;
RectangleType r;
FontID curFont;
Char* desc;
Char* eolP;
MemHandle recordH;
RectangleType eraseRect, drawRect;
ToDoDBRecordPtr recordP;
Int16 descWidth;
UInt16 descLen;
UInt16 ellipsisWidth;
IndexedColorType curForeColor;
IndexedColorType curBackColor;
IndexedColorType curTextColor;
UInt8 * lockedWinP;
// Get current record and related info.
//
recordH = DmQueryRecord (ToDoDB, CurrentRecord);
ErrNonFatalDisplayIf ((! recordH), "Record not found");
recordP = MemHandleLock (recordH);
desc = &recordP->description;
// "Lock" the screen so that all drawing occurs offscreen to avoid
// the anamolies associated with drawing the Form's title then drawing
// the NoteView title. We REALLY need to make a variant for doing
// this in a more official way!
//
lockedWinP = WinScreenLock(winLockCopy);
FrmDrawForm(frm);
// Perform initial set up.
//
FrmGetFormBounds(frm, &r);
formWidth = r.extent.x;
maxWidth = formWidth - 8;
eolP = StrChr (desc, linefeedChr);
descLen = (eolP == NULL ? StrLen (desc) : eolP - desc);
ellipsisWidth = 0;
RctSetRectangle (&eraseRect, 0, 0, formWidth, FntLineHeight()+4);
RctSetRectangle (&drawRect, 0, 0, formWidth, FntLineHeight()+2);
// Save/Set window colors and font. Do this after FrmDrawForm() is called
// because FrmDrawForm() leaves the fore/back colors in a state that we
// don't want here.
//
curForeColor = WinSetForeColor (UIColorGetTableEntryIndex(UIFormFrame));
curBackColor = WinSetBackColor (UIColorGetTableEntryIndex(UIFormFill));
curTextColor = WinSetTextColor (UIColorGetTableEntryIndex(UIFormFrame));
curFont = FntSetFont (noteTitleFont);
// Erase the Form's title area and draw the NoteView's.
//
WinEraseRectangle (&eraseRect, 0);
WinDrawRectangle (&drawRect, 3);
if (FntWidthToOffset (desc, descLen, maxWidth, NULL, &descWidth) != descLen)
{
ellipsisWidth = FntCharWidth (chrEllipsis);
descLen = FntWidthToOffset (desc, descLen, maxWidth - ellipsisWidth, NULL, &descWidth);
}
x = (formWidth - descWidth - ellipsisWidth + 1) / 2;
WinDrawInvertedChars (desc, descLen, x, 1);
if (ellipsisWidth != 0)
{
Char buf[1];
buf[0] = chrEllipsis;
WinDrawInvertedChars (buf, 1, x + descWidth, 1);
}
// Now that we've drawn everything, blast it all back on the screen at once.
//
if (lockedWinP)
WinScreenUnlock();
// Unlock the record that we locked above.
//
MemHandleUnlock (recordH);
// Restore window colors and font.
//
WinSetForeColor (curForeColor);
WinSetBackColor (curBackColor);
WinSetTextColor (curTextColor);
FntSetFont (curFont);
}
/***********************************************************************
*
* FUNCTION: NoteViewUpdateScrollBar
*
* DESCRIPTION: This routine update the scroll bar.
*
* PARAMETERS: nothing
*
* RETURNED: nothing
*
* REVISION HISTORY:
* Name Date Description
* ---- ---- -----------
* art 07/01/96 Initial Revision
* gap 11/02/96 Fix case where field and scroll bars get out of sync
*
***********************************************************************/
static void NoteViewUpdateScrollBar (void)
{
UInt16 scrollPos;
UInt16 textHeight;
UInt16 fieldHeight;
Int16 maxValue;
FieldPtr fld;
ScrollBarPtr bar;
fld = GetObjectPtr (NoteField);
bar = GetObjectPtr (NoteScrollBar);
FldGetScrollValues (fld, &scrollPos, &textHeight, &fieldHeight);
if (textHeight > fieldHeight)
{
// On occasion, such as after deleting a multi-line selection of text,
// the display might be the last few lines of a field followed by some
// blank lines. To keep the current position in place and allow the user
// to "gracefully" scroll out of the blank area, the number of blank lines
// visible needs to be added to max value. Otherwise the scroll position
// may be greater than maxValue, get pinned to maxvalue in SclSetScrollBar
// resulting in the scroll bar and the display being out of sync.
maxValue = (textHeight - fieldHeight) + FldGetNumberOfBlankLines (fld);
}
else if (scrollPos)
maxValue = scrollPos;
else
maxValue = 0;
SclSetScrollBar (bar, scrollPos, 0, maxValue, fieldHeight-1);
}
/***********************************************************************
*
* FUNCTION: NoteViewLoadRecord
*
* DESCRIPTION: This routine loads a note from a ToDo record into
* the note edit field.
*
* PARAMETERS: frm - pointer to the Note View form
*
* RETURNED: nothing
*
* REVISION HISTORY:
* Name Date Description
* ---- ---- -----------
* art 2/21/95 Initial Revision
* jmp 9/8/99 In the Great Substitution, MemPtr became a local
* variable; changed MemPtr back to ptr.
*
***********************************************************************/
static void NoteViewLoadRecord (void)
{
UInt16 offset;
FieldPtr fld;
MemHandle recordH;
Char * ptr;
ToDoDBRecordPtr recordP;
// Get a pointer to the note field.
fld = GetObjectPtr (NoteField);
// Set the font used in the note field.
FldSetFont (fld, NoteFont);
recordH = DmQueryRecord (ToDoDB, CurrentRecord);
ErrFatalDisplayIf ((! recordH), "Bad record");
// Compute the offset within the do to record of the note string, the
// note string follows the description string.
recordP = MemHandleLock (recordH);
ptr = &recordP->description;
ptr += StrLen (ptr) + 1;
offset = ptr - (Char*)recordP;
FldSetText (fld, recordH, offset, StrLen(ptr)+1);
MemHandleUnlock (recordH);
}
/***********************************************************************
*
* FUNCTION: NoteViewSave
*
* DESCRIPTION: This routine release any unused memory allocated for
* the note and mark the ToDo record dirty.
*
* PARAMETERS: nothing
*
* RETURNED: nothing
*
* REVISION HISTORY:
* Name Date Description
* ---- ---- -----------
* art 2/21/95 Initial Revision
*
***********************************************************************/
static void NoteViewSave (void)
{
FieldPtr fld;
fld = GetObjectPtr (NoteField);
// Was the note string modified by the user.
if (FldDirty (fld))
{
// Release any free space in the note field.
FldCompactText (fld);
// Mark the record dirty.
DirtyRecord (CurrentRecord);
}
// Clear the handle value in the field, otherwise the handle
// will be freed when the form is disposed of, this call also unlocks
// the handle that contains the note string.
FldSetTextHandle (fld, 0);
#if ERROR_CHECK_LEVEL == ERROR_CHECK_FULL
ECToDoDBValidate (ToDoDB);
#endif
}
/***********************************************************************
*
* FUNCTION: NoteViewDeleteNote
*
* DESCRIPTION: This routine deletes a note in a ToDo record.
*
* PARAMETERS: nothing
*
* RETURNED: true if the note was deleted.
*
* REVISION HISTORY:
* Name Date Description
* ---- ---- -----------
* art 2/21/95 Initial Revision
*
***********************************************************************/
static Boolean NoteViewDeleteNote (void)
{
FieldPtr fld;
if (FrmAlert(DeleteNoteAlert) != DeleteNoteYes)
return (false);
// Unlock the handle that contains the text of the note.
fld = GetObjectPtr (NoteField);
ErrFatalDisplayIf ((! fld), "Bad field");
// Clear the handle value in the field, otherwise the handle
// will be freed when the form is disposed of. this call also
// unlocks the MemHandle the contains the note string.
FldSetTextHandle (fld, 0);
ToDoChangeRecord (ToDoDB, &CurrentRecord, toDoNote, "");
// Mark the record dirty.
DirtyRecord (CurrentRecord);
return (true);
}
/***********************************************************************
*
* FUNCTION: NoteViewDoCommand
*
* DESCRIPTION: This routine performs the menu command specified.
*
* PARAMETERS: command - menu item id
*
* RETURNED: nothing
*
* REVISION HISTORY:
* Name Date Description
* ---- ---- -----------
* art 3/29/95 Initial Revision
* jmp 9/17/99 Eliminate old goto top/bottom menu items.
* jmp 11/04/99 To prevent other sublaunch issues, remind ourselves
* that we've sublaunched already into PhoneNumberLookup().
*
***********************************************************************/
static Boolean NoteViewDoCommand (UInt16 command)
{
FieldPtr fld;
Boolean handled = true;
switch (command)
{
case newNoteFontCmd:
NoteFont = SelectFont (NoteFont);
break;
case newNotePhoneLookupCmd:
fld = GetObjectPtr (NoteField);
InPhoneLookup = true;
PhoneNumberLookup (fld);
InPhoneLookup = false;
break;
default:
handled = false;
}
return (handled);
}
/***********************************************************************
*
* FUNCTION: NoteViewScroll
*
* DESCRIPTION: This routine scrolls the Note View by the specified
* number of lines.
*
* PARAMETERS: linesToScroll - the number of lines to scroll,
* positive for winDown,
* negative for winUp
* updateScrollbar - force a scrollbar update?
*
* RETURNED: nothing
*
* REVISION HISTORY:
* Name Date Description
* ---- ---- -----------
* art 7/1/96 Initial Revision
* grant 2/2/99 Use NoteViewUpdateScrollBar()
*
***********************************************************************/
static void NoteViewScroll (Int16 linesToScroll, Boolean updateScrollbar)
{
UInt16 blankLines;
FieldPtr fld;
fld = GetObjectPtr (NoteField);
blankLines = FldGetNumberOfBlankLines (fld);
if (linesToScroll < 0)
FldScrollField (fld, -lines
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -