contacts.c

来自「CD_《Palm OS编程实践》」· C语言 代码 · 共 1,128 行 · 第 1/2 页

C
1,128
字号
					if( dateTime.hour == NO_TIME )
					{
						// CH.6 Set the time to 12 AM
						dateTime.hour = 0;
						dateTime.minute = 0;
						
						// CH.6 Set the controls
						setTimeControls();
					}	
					
					// CH.6 If it is PM
					if( dateTime.hour > 11 )
					{
						// CH.6 Change to AM
						dateTime.hour -= 12;
						
						// CH.6 Set the controls
						setTimeControls();
					}
				}
				break;
				
				// CH.6 PM button
				case EnterTimePMPushButton:
				{
					// CH.6 If no time was set
					if( dateTime.hour == NO_TIME )
					{
						// CH.6 Set the time to 12 PM
						dateTime.hour = 12;
						dateTime.minute = 0;
						
						// CH.6 Set the controls
						setTimeControls();
					}	
					
					// CH.6 If it is AM
					if( dateTime.hour < 12 )
					{
						// CH.6 Change to PM
						dateTime.hour += 12;
						
						// CH.6 Set the controls
						setTimeControls();
					}
				}
				break;
				
				// CH.6 No Time checkbox
				case EnterTimeNoTimeCheckbox:
				{
					// CH.6 If we are unchecking the box
					if( dateTime.hour == NO_TIME )
					{
						// CH.6 Set the time to 12 PM
						dateTime.hour = 12;
						dateTime.minute = 0;
						
						// CH.6 Set the controls
						setTimeControls();

						// CH.6 Set the new selection
						timeSelect = EnterTimeHoursPushButton;
						CtlSetValue( getObject( form, timeSelect ),
								true );
					}
					
					else
					// CH.6 If we are checking the box
						dateTime.hour = NO_TIME;
					
					// CH.6 Set the controls
					setTimeControls();
				}
				break;
				
				// CH.6 Cancel button
				case EnterTimeCancelButton:
				{
					// CH.6 Restore time
					dateTime = oldTime;
					
					// CH.6 Return to calling form
					FrmReturnToForm( 0 );
				}
				// CH.6 Always return true
				return( true );
					
				// CH.6 OK button
				case EnterTimeOKButton:
				{
					VoidPtr	precord;	// CH.6 Points to the record
			
					// CH.6 Lock it down
					precord = MemHandleLock( hrecord );
					
					// CH.6 Write the date time field
					DmWrite( precord, DB_DATE_TIME_START, &dateTime,
							sizeof( DateTimeType ) );
				
					// CH.6 Unlock the record
					MemHandleUnlock( hrecord );
					
					// CH.6 Mark the record dirty
					isDirty = true;
			
					// CH.6 Return to the Contact Details form
					FrmReturnToForm( 0 );

					// CH.6 Update the field
					setTimeTrigger();
				}
				// CH.6 Always return true
				return( true );
			}
		}
		break;
	}
	
	// CH.6 We're done
	return( false );
}
		
// CH.3 Handle menu events
static Boolean menuEventHandler( EventPtr event )
{
	FormPtr		form;		// CH.3 A pointer to our form structure
	Word		index;		// CH.3 A general purpose control index
	FieldPtr	field;		// CH.3 Used for manipulating fields

	// CH.3 Get our form pointer
	form = FrmGetActiveForm();

	// CH.3 Erase the menu status from the display
	MenuEraseStatus( NULL );
			
	// CH.4 Handle options menu
	if( event->data.menu.itemID == OptionsAboutContacts )
	{
		// CH.4 Pop up the About form as a Dialog
		FrmPopupForm( AboutForm );
		return( true );
	}
		
	// CH.3 Handle graffiti help
	if( event->data.menu.itemID == EditGraffitiHelp )
	{
		// CH.3 Pop up the graffiti reference based on
		// the graffiti state
		SysGraffitiReferenceDialog( referenceDefault );
		return( true );
	}

	// CH.3 Get the index of our field
	index = FrmGetFocus( form );
			
	// CH.3 If there is no field selected, we're done
	if( index == noFocus )
		return( false );
			
	// CH.3 Get the pointer of our field
	field = FrmGetObjectPtr( form, index );
			
	// CH.3 Do the edit command
	switch( event->data.menu.itemID )
	{
		// CH.3 Undo
		case EditUndo:
			FldUndo( field );
		break;
		
		// CH.3 Cut
		case EditCut:
			FldCut( field );
		break;
				
		// CH.3 Copy
		case EditCopy:
			FldCopy( field );
		break;
			
		// CH.3 Paste
		case EditPaste:
			FldPaste( field );
		break;
				
		// CH.3 Select All
		case EditSelectAll:
		{
			// CH.3 Get the length of the string in the field
			Word length = FldGetTextLength( field );
				
			// CH.3 Sound an error if appropriate
			if( length == 0 )
			{
				SndPlaySystemSound( sndError );
				return( false );
			}
			
			// CH.3 Select the whole string
			FldSetSelection( field, 0, length );					
		}
		break;
				
		// CH.3 Bring up the keyboard tool
		case EditKeyboard:
			SysKeyboardDialogV10();
		break;
	}
	
	// CH.3 We're done	
	return( true );
}

// CH.5 This function creates and initializes a new record
static void newRecord( void )
{
	VoidPtr		precord;	// CH.5 Pointer to the record
	
	// CH.5 Create the database record and get a handle to it
	hrecord = DmNewRecord( contactsDB, &cursor, DB_RECORD_SIZE );
	
	// CH.5 Lock down the record to modify it
	precord = MemHandleLock( hrecord );
	
	// CH.5 Clear the record
	DmSet( precord, 0, DB_RECORD_SIZE, 0 );
	
	// CH.6 Initialize the date and time
	MemSet( &dateTime, sizeof( dateTime ), 0 );
	dateTime.year = NO_DATE;
	dateTime.hour = NO_TIME;
	DmWrite( precord, DB_DATE_TIME_START, &dateTime,
			sizeof( DateTimeType ) );
	
	// CH.5 Unlock the record
	MemHandleUnlock( hrecord );
	
	// CH.5 Clear the busy bit and set the dirty bit
	DmReleaseRecord( contactsDB, cursor, true );
	
	// CH.5 Increment the total record count
	numRecords++;

	// CH.5 Set the dirty bit
	isDirty = true;
	
	// CH.5 We're done
	return;
}

// CH.5 A time saver: Gets object pointers based on their ID
static VoidPtr getObject( FormPtr form, Word objectID )
{
	Word	index;	// CH.5 The object index
	
	// CH.5 Get the index
	index = FrmGetObjectIndex( form, objectID );
	
	// CH.5 Return the pointer
	return( FrmGetObjectPtr( form, index ) );
}

// CH.5 Gets the current database record and displays it
// in the detail fields
static void setFields( void )
{
	FormPtr		form;		// CH.5 The contact detail form
	CharPtr		precord;	// CH.5 A record pointer
	Word		index;		// CH.5 The object index
	
	// CH.5 Get the contact detail form pointer
	form = FrmGetActiveForm();
		
	// CH.5 Get the current record
	hrecord = DmQueryRecord( contactsDB, cursor );
		
	// CH.6 Initialize the date and time variable
	precord = MemHandleLock( hrecord );
	MemMove( &dateTime, precord + DB_DATE_TIME_START,
			sizeof( dateTime ) );

	// CH.6 Initialize the date control
	setDateTrigger();
		
	// CH.6 Initialize the time control
	setTimeTrigger();
	
	// CH.5 Set the text for the First Name field
	setText( getObject( form, ContactDetailFirstNameField ),
			precord + DB_FIRST_NAME_START );
		
	// CH.5 Set the text for the Last Name field
	setText( getObject( form, ContactDetailLastNameField ),
			precord + DB_LAST_NAME_START );
		
	// CH.5 Set the text for the Phone Number field
	setText( getObject( form, ContactDetailPhoneNumberField ),
			precord + DB_PHONE_NUMBER_START );
	MemHandleUnlock( hrecord );

	// CH.5 If the record is already dirty, it's new, so set focus
	if( isDirty )
	{
  		// CH.3 Get the index of our field
		index = FrmGetObjectIndex( form, ContactDetailFirstNameField );

		// CH.3 Set the focus to the First Name field
		FrmSetFocus( form, index );
		
		// CH.5 Set upper shift on
		GrfSetState( false, false, true );			
	}
	
	// CH.5 We're done
	return;
}

// CH.5 Puts any field changes in the record
void getFields( void )
{
	FormPtr		form;		// CH.5 The contact detail form
	
	// CH.5 Get the contact detail form pointer
	form = FrmGetActiveForm();
		
	// CH.5 Turn off focus
	FrmSetFocus( form, -1 );
			
	// CH.5 If the record has been modified
	if( isDirty )
	{
		CharPtr	precord;	// CH.5 Points to the DB record
	
		// CH.5 Lock the record
		precord = MemHandleLock( hrecord );
		
		// CH.5 Get the text for the First Name field
		getText( getObject( form, ContactDetailFirstNameField ),
				precord, DB_FIRST_NAME_START );
		
		// CH.5 Get the text for the Last Name field
		getText( getObject( form, ContactDetailLastNameField ),
				precord, DB_LAST_NAME_START );
		
		// CH.5 Get the text for the Phone Number field
		getText( getObject( form, ContactDetailPhoneNumberField ),
				precord, DB_PHONE_NUMBER_START );
		
		// CH.5 Unlock the record
		MemHandleUnlock( hrecord );
	}

	// CH.5 Reset the dirty bit
	isDirty = false;
				
	// CH.5 We're done
	return;
}

// CH.5 Set the text in a field
static void setText( FieldPtr field, CharPtr text )
{
	VoidHand	hfield;	// CH.5 Handle of field text
	CharPtr		pfield;	// CH.5 Pointer to field text
	
	// CH.5 Get the current field handle
	hfield = FldGetTextHandle( field );
	
	// CH.5 If we have a handle
	if( hfield != NULL )
	{
		// CH.5 Resize it
		MemHandleResize( hfield, StrLen( text ) + 1 );
	}
	
	else
	// CH.5 Allocate a handle for the string
		hfield = MemHandleNew( StrLen( text ) + 1 );
	
	// CH.5 Lock it
	pfield = MemHandleLock( hfield );
	
	// CH.5 Copy the string
	StrCopy( pfield, text );
	
	// CH.5 Unlock it
	MemHandleUnlock( hfield );
	
	// CH.5 Give it to the field
	FldSetTextHandle( field, hfield );
	
	// CH.5 Draw the field
	FldDrawField( field );
	
	// CH.5 We're done
	return;
}	

// CH.5 Get the text from a field
static void getText( FieldPtr field, VoidPtr precord, Word offset )
{
	CharPtr		pfield;	// CH.5 Pointer to field text

	// CH.5 Get the text pointer
	pfield = FldGetTextPtr( field );
	
	// CH.5 Copy it
	DmWrite( precord, offset, pfield, StrLen( pfield ) );
	
	// CH.5 We're done
	return;
}

// CH.6 Set the Contact Detail date selector trigger
static void setDateTrigger( void )
{
	FormPtr		form;		// CH.5 The contact detail form
	
	// CH.6 Get the contact detail form pointer
	form = FrmGetActiveForm();
	
	// CH.6 If there is no date
	if( dateTime.year == NO_DATE )
	{
		CtlSetLabel( getObject( form, ContactDetailDateSelTrigger ),
				"          " );
	}
	
	else
	// CH.6 If there is a date
	{
		Char dateString[dateStringLength];
		
		// CH.6 Get the date string
		DateToAscii( dateTime.month, dateTime.day, dateTime.year,
				(DateFormatType)PrefGetPreference( prefDateFormat ), dateString );
		
		// CH.6 Set the selector trigger label
		CtlSetLabel( getObject( form, ContactDetailDateSelTrigger ),
				dateString );
	}
	
	// CH.6 We're done
	return;
}

// CH.6 Set the Contact Detail time selector trigger
static void setTimeTrigger( void )
{
	FormPtr		form;		// CH.5 The contact detail form
	
	// CH.6 Get the contact detail form pointer
	form = FrmGetActiveForm();
	
	// CH.6 If there's no time
	if( dateTime.hour == NO_TIME )
	{
		CtlSetLabel( getObject( form, ContactDetailTimeSelTrigger ),
				"          " );
	}
	
	else
	// CH.6 If there is a time
	{
		Char timeString[timeStringLength];
		
		// CH.6 Get the time string
		TimeToAscii( dateTime.hour, dateTime.minute,
				(TimeFormatType)PrefGetPreference( prefTimeFormat ), timeString );
		
		// CH.6 Set the selector trigger label
		CtlSetLabel( getObject( form, ContactDetailTimeSelTrigger ),
				timeString );
				
	}

	// CH.6 We're done
	return;
}

// CH.6 Set the controls in the Enter Time form based on dateTime
static void setTimeControls( void )
{
	FormPtr		form;
	ControlPtr	hourButton;
	ControlPtr	minuteTensButton;
	ControlPtr	minuteOnesButton;
	ControlPtr	amButton;
	ControlPtr	pmButton;
	ControlPtr	noTimeCheckbox;
	Char		labelString[3];
	SWord		hour;
	
	// CH.6 Get the form
	form = FrmGetActiveForm();
	
	// CH.6 Get the control pointers
	hourButton = getObject( form, EnterTimeHoursPushButton );
	minuteTensButton = getObject( form,
			EnterTimeMinuteTensPushButton );
	minuteOnesButton = getObject( form,
			EnterTimeMinuteOnesPushButton );
	amButton = getObject( form, EnterTimeAMPushButton );
	pmButton = getObject( form, EnterTimePMPushButton );
	noTimeCheckbox = getObject( form, EnterTimeNoTimeCheckbox );
	
	// CH.6 If there is a time
	if( dateTime.hour != NO_TIME )
	{
		// CH.6 Update the hour
		hour = dateTime.hour % 12;
		if( hour == 0 )
			hour = 12;
		CtlSetLabel( hourButton,
				StrIToA( labelString, hour ) );

		// CH.6 Update the minute tens
		CtlSetLabel( minuteTensButton,
				StrIToA( labelString, dateTime.minute / 10 ) );
	
		// CH.6 Update the minute ones
		CtlSetLabel( minuteOnesButton,
				StrIToA( labelString, dateTime.minute % 10 ) );
	
		// CH.6 Update AM
		CtlSetValue( amButton, (dateTime.hour < 12) );
				
		// CH.6 Update PM
		CtlSetValue( pmButton, (dateTime.hour > 11) );

		// CH.6 Uncheck the no time checkbox
		CtlSetValue( noTimeCheckbox, false );
	}
	
	else
	// If there is no time
	{
		// CH.6 Update the hour
		CtlSetValue( hourButton, false );
		CtlSetLabel( hourButton, "" );
		
		// CH.6 Update the minute tens
		CtlSetValue( minuteTensButton, false );
		CtlSetLabel( minuteTensButton, "" );
		
		// CH.6 Update the minute ones
		CtlSetValue( minuteOnesButton, false );
		CtlSetLabel( minuteOnesButton, "" );
		
		// CH.6 Update AM
		CtlSetValue( amButton, false );
				
		// CH.6 Update PM
		CtlSetValue( pmButton, false );

		// CH.6 Uncheck the no time checkbox
		CtlSetValue( noTimeCheckbox, true );
	}
	
	// CH.6 We're done
	return;
}

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?