亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? sugarmemoedit.c

?? 最好用的背單詞軟件, palm 平臺, 如果能移植到別的平臺
?? C
?? 第 1 頁 / 共 3 頁
字號:
#include <PalmOS.h>
#include <PalmUtils.h>

#include "SugarMemo.h"
#include "SugarMemoRsc.h"
#include "SugarMemoDB.h"
#include "SugarMemoBrowse.h"
#include "SugarMemoEdit.h"
#include "SugarMemoTools.h"

#define labelColumnWidth 15
#define LabelLength 10

//typedef char EditLabel[LabelLength];

#define noFieldIndex		0xff

#define labelColumn 	0
#define dataColumn 		1

#define spaceAfterColumn	2

#define FirstFieldIndex	0
#define MaxFieldIndex  	3

#define ColumnsInVowelTable 	6
#define ColumnsInConsonantTable	2

//global
Char 	EditCategoryName[dmCategoryLength];
UInt16	TopVisibleFieldIndex =0;
UInt16	EditRowIDWhichHadFocus =0;
UInt16	EditFieldPosition = 0;

UInt16 	StudyListIndex;

extern TabSelected tabCurrentSelected;
extern Boolean 	SeekNextRecord(UInt16 * indexP, Int16 direction);


//internal
static 	UInt16 CurrentFieldIndex = 0;

const WordFields FieldMap[4] = {WordFieldQuestion, 
										WordFieldPhonetic, 
										WordFieldAnswer, 
										WordFieldNote3};


EditLabel fieldLabel[WordFieldsCount] = {"Q", 
												"P", 
												"A", 
												"WordNet", 
												"MerriamW",	
												"Dict1", 
												"Dict2", 
												"Dict3", 
												"Note1", 
												"Note2", 
												"N"};


//internal functions
static void EditInit( FormPtr frmP, Boolean leaveDataLocked );
static void EditFormLoadControls();
static void EditFormLoadCategory();
static void EditFormLoadTable(FormType* frmP);
static void EditInitTableRow( FormType* frmP, TablePtr table, UInt16 row, UInt16 fieldIndex, 
				Int16 rowHeight, WordRecordType* record);
static UInt16 EditGetFieldHeight (TablePtr table, UInt16 fieldIndex, Int16 columnWidth, Int16 maxHeight, 
	WordRecordType* record);
				
static Err	EditGetRecordField (void * table, Int16 row, Int16 column, Boolean editing, 
				MemHandle * textH, Int16 * textOffset, Int16 * textAllocSize, FieldPtr fld);
static Boolean	EditSaveRecordField (void * table, Int16 row, Int16 column);
static UInt16 EditFormSaveRecord ();
static void	EditDrawRecordField (void * table, Int16 row, Int16 column, RectanglePtr bounds);

static void EditUpdateScrollers (FormPtr frmP, UInt16 bottomFieldIndex, Boolean lastItemClipped);
static void EditFormScroll (WinDirectionType direction);
static void EditFormResizeField (EventType * event);
static UInt16 EditCategorySelection (void);
static void FieldSelection(Int16 row);
static void EditFormNextWord(Boolean next);
static void EditUpdateHorizonScrollers();
//event handler
Boolean EditFormHandleEvent(EventType * event){

	FormType* frmP = FrmGetActiveForm();
	Boolean handled = false;
	TableType* tableP = GetObjectPtr(EditEditTable);
	FieldType * field;
	ControlType * ctl = GetObjectPtr(EditLearnPushButton);
	
	switch (event->eType){
		
		case frmOpenEvent:
			frmP = FrmGetActiveForm ();
			EditInit (frmP, false);
			FrmDrawForm (frmP);
			handled = true;
			break;
		
		case frmUpdateEvent:
			FrmDrawForm(frmP);
			handled = true;
			break;
			
		case fldHeightChangedEvent:
			EditFormResizeField(event);
			handled = true;
			break;		
		
		case tblSelectEvent:
			FieldSelection(event->data.tblSelect.row);
			break;
		
		case ctlSelectEvent:
			switch (event->data.ctlSelect.controlID){
				case EditCategoryPopTrigger:
					EditCategorySelection();
					handled = true;
					break;
					
				case EditDoneButton:
					switch(HeaderRecordIndex){
						case HeaderIndexCounts:
							VisibleRows = 0;
							FrmGotoForm(BrowseForm);
							break;
						
						case LearningRecordIndex:
						case TestingRecordIndex:
							FrmGotoForm(Learn2Form);
							break;
					}
					
					handled = true;
					break;
					
				case EditDeleteButton:
					
					FrmSetFocus(frmP, noFocus);
					WordDBDeleteRecord(false);
					VisibleRows = 0;
					FrmGotoForm(BrowseForm);
					handled = true;
					break;
					
				case EditLearnPushButton:
					if (CtlGetValue(ctl) == 0)	SetQueue(CurrentDB, CurrentRecord, RawQueue);
					else	SetQueue(CurrentDB, CurrentRecord, LearningQueue);
					//do not set handled, let system update display
					break;
									
				default:
					break;
			
			}
			break;
			
		case ctlRepeatEvent:
			switch (event->data.ctlRepeat.controlID)
			{
				case EditScrollUpRepeating:
					EditFormScroll (winUp);
					// leave unhandled so the buttons can repeat
					break;
		
				case EditScrollDownRepeating:
					EditFormScroll (winDown);
					// leave unhandled so the buttons can repeat
					break;
					
				case EditPrevRepeating:
					EditFormNextWord(false);
					break;
					
				case EditNextRepeating:
					EditFormNextWord(true);
					break;
					
				default:
					break;
			}
			break;

		case keyDownEvent:
		
			if (EvtKeydownIsVirtual(event))
			{
				switch (event->data.keyDown.chr)
				{
					case vchrPageUp:
						if (TblGetLastUsableRow(tableP) == 0){
							
							field = TblGetCurrentField(tableP);
				
							if (field != NULL){
								
								if (FldScrollable(field, winUp)){
									EvtEnqueueKey(chrUpArrow, 0, 0);
									FldScrollField(field, 1, winUp);
									handled = true;
									break;
								}
							}
						}
						EditFormScroll (winUp);
						handled = true;
						break;
		
					case vchrPageDown:
						if (TblGetLastUsableRow(tableP) == 0){
							
							field = TblGetCurrentField(tableP);
				
							if (field != NULL){
								
								if (FldScrollable(field, winDown)){
									EvtEnqueueKey(chrDownArrow, 0, 0);
									FldScrollField(field, 1, winDown);
									handled = true;
									break;
								}
							}
						}
						
						EditFormScroll (winDown);
						handled = true;
						break;
				}
			}
			break;
		
		default:
			break;
	}
	
	return handled;
}

void EditFormLoadControls(){
	
	ControlType * ctl;
	HeaderQueue queue;

	//Initialize controls
	if (HeaderRecordIndex == HeaderIndexCounts){
		ShowObject(EditDeleteButton);
		ShowObject(EditPrevRepeating);
		ShowObject(EditNextRepeating);

		if (tabCurrentSelected == StudyListTab)
			HideObject(EditLearnPushButton);
		else {

			queue = GetQueue(CurrentDB, CurrentRecord);

			if (queue == RawQueue || queue == LearningQueue){
				ctl = GetObjectPtr(EditLearnPushButton);
		
				if (queue == RawQueue) CtlSetValue(ctl, 0);
				else CtlSetValue(ctl, 1);

				ShowObject(EditLearnPushButton);
		
			}
			else
			HideObject(EditLearnPushButton);	
		}
		
	}
	else { 
		HideObject(EditDeleteButton);
		HideObject(EditLearnPushButton);
		HideObject(EditPrevRepeating);
		HideObject(EditNextRepeating);
	}

}

void EditFormLoadCategory(){

	UInt16 attr;
	UInt16 category;
	ControlType* ctl;
	
	// Set the label of the category trigger.
	DmRecordInfo (CurrentDB, CurrentRecord, &attr, NULL, NULL);
	category = attr & dmRecAttrCategoryMask;

	ctl = GetObjectPtr(EditCategoryPopTrigger);
	CategoryGetName (CurrentDB, category, EditCategoryName);
	CategorySetTriggerLabel (ctl, EditCategoryName);
	
	CtlDrawControl(ctl);

}

//This routine initialize edit form
void EditInit( FormPtr frmP, Boolean leaveDataLocked ){
	UInt16 row;
	UInt16 rowsInTable;
	UInt16 dataColumnWidth;
	TablePtr table;
	RectangleType bounds;
	
	
	EditFormLoadControls();
	EditFormLoadCategory();
	if (HeaderRecordIndex == HeaderIndexCounts) EditUpdateHorizonScrollers();

		
	// Initialize the edit table.
	table = GetObjectPtr(EditEditTable);
	rowsInTable = TblGetNumberOfRows (table);
	
	for (row = 0; row < rowsInTable; row++)
	{
		// This sets the data column
		TblSetItemStyle (table, row, labelColumn, labelTableItem);
		TblSetRowUsable (table, row, false);
	}

	TblSetColumnUsable (table, labelColumn, true);
	TblSetColumnUsable (table, dataColumn, true);
	TblSetColumnSpacing (table, labelColumn, spaceAfterColumn);

	// Set the callback routines
	TblSetLoadDataProcedure (table, dataColumn, EditGetRecordField);
	TblSetSaveDataProcedure (table, dataColumn, EditSaveRecordField);
	TblSetCustomDrawProcedure (table, dataColumn, EditDrawRecordField);

	// Set the column widths so that the label column contents fit exactly.
	TblGetBounds (table, &bounds);
	dataColumnWidth = bounds.extent.x - spaceAfterColumn - labelColumnWidth; 

	TblSetColumnWidth(table, labelColumn, labelColumnWidth);
	TblSetColumnWidth(table, dataColumn, dataColumnWidth);

	EditFormLoadTable(frmP);
		
}

Err	EditGetRecordField (void * table, Int16 row, Int16 column, 
	Boolean editing, MemHandle * textH, Int16 * textOffset, Int16 * textAllocSize, FieldPtr fld){

	UInt16 fieldNum;
	UInt16  fieldIndex;
	Char * recordP;
	Char * fieldP;
	MemHandle recordH, fieldH;
	UInt16 fieldSize;
	WordRecordType record;
	//FieldType * field;

	FldSetMaxChars(fld, 1024);

	// Get the field number that corresponds to the table item.
	// The field number is stored as the row id.
	fieldIndex = TblGetRowID (table, row);
	fieldNum = FieldMap[fieldIndex];

	GetWordRecord (CurrentDB, CurrentRecord, &record, &recordH);

	if (editing)
	{

		if (record.field[fieldNum])
		{
			fieldSize = StrLen(record.field[fieldNum]) + 1;
			fieldH = MemHandleNew(fieldSize);	// Handle freeing done into PrvEditSaveRecordField() by calling FldFreeMemory() function
			fieldP = MemHandleLock(fieldH);
			MemMove(fieldP, record.field[fieldNum], fieldSize);
			*textAllocSize = fieldSize;
			MemHandleUnlock(fieldH);
		}
		else
		{
			fieldH = 0;
			*textAllocSize = 0;
		}
		MemHandleUnlock (recordH);
		*textOffset = 0;         // only one string
		*textH = fieldH;
		return (0);

	}
	else
	{
		// Calculate the offset from the start of the record.
		recordP = MemHandleLock (recordH);   // record now locked twice

		if (record.field[fieldNum])
		{
			*textOffset = record.field[fieldNum] - recordP;
			*textAllocSize = StrLen (record.field[fieldNum]) + 1;  // one for null terminator
		}
		else
		{
			do
			{
				fieldNum++;
			} while (fieldNum < WordFieldsCount && record.field[fieldNum] == NULL);

			if (fieldNum < WordFieldsCount)
				*textOffset = record.field[fieldNum] - recordP;
			else
				// Place the new field at the end of the text.
				*textOffset = MemHandleSize(recordH);

			*textAllocSize = 0;  // one for null terminator
		}
		
		MemHandleUnlock (recordH);   // unlock the second lock
	}

	MemHandleUnlock (recordH);      // unlock the AddrGetRecord lock

	*textH = recordH;
	return (0);
}

Boolean	EditSaveRecordField (void * table, Int16 row, Int16 column){
	UInt16 fieldNum;
	UInt16 fieldIndex;
	FieldPtr fld;
	WordRecordType record;
	MemHandle recordH;
	MemHandle textH;
	Char * textP;
	WordFieldFlags bit;
	Err err;
	Boolean redraw = false;
	UInt16 numOfRows;
	Int16 newSize;

	fld = TblGetCurrentField (table);
	textH = FldGetTextHandle(fld);

	// Get the field number that corresponds to the table item to save.
	fieldIndex = TblGetRowID (table, row);
	fieldNum = FieldMap[fieldIndex];

	// Save the field last edited.
	EditRowIDWhichHadFocus = fieldIndex;

	// Save the cursor position of the field last edited.
	// Check if the top of the text is scroll off the top of the
	// field, if it is then redraw the field.
	if (FldGetScrollPosition (fld))
	{
		FldSetScrollPosition (fld, 0);
		EditFieldPosition = 0;
	}
	else
		EditFieldPosition = FldGetInsPtPosition (fld);

	// Make sure there any selection is removed since we will free
	// the text memory before the callee can remove the selection.
	FldSetSelection (fld, 0, 0);


	if (FldDirty (fld))
	{
		// Since the field is dirty, mark the record as dirty
		ToolsDirtyRecord (CurrentRecord);

		// Get a pointer to the text of the field.
		if (textH == 0)
			textP = NULL;
		else
		{
			textP = MemHandleLock(textH);
			if (textP[0] == '\0')
				textP = NULL;
		}


		GetWordRecord (CurrentDB, CurrentRecord, &record, &recordH);
		record.field[fieldNum] = textP;


		bit.allBits = (UInt32)1 << fieldNum;
		err = ChangeWordRecord(CurrentDB, &CurrentRecord, &record, bit);

		// The new field has been copied into the new record.  Unlock it.
		if (textP)
			MemPtrUnlock(textP);

		// The change was not made (probably storage out of memory)
		if (err)
		{
			// Because the storage is full the text in the text field differs
			// from the text in the record.  PrvEditGetFieldHeight uses
			// the text in the field (because it's being edited).
			// Make the text in the field the same as the text in the record.
			// Resizing should always be possible.
			MemHandleUnlock(recordH);      // Get original text
			GetWordRecord(CurrentDB, CurrentRecord, &record, &recordH);

			if (record.field[fieldNum] == NULL)
				newSize = 1;
			else
				newSize = StrLen(record.field[fieldNum]) + 1;

			// Have the field stop using the chunk to unlock it.  Otherwise the resize can't
			// move the chunk if more space is needed and no adjacent free space exists.
			FldSetTextHandle (fld, 0);
			if (!MemHandleResize(textH, newSize))
			{
				textP = MemHandleLock(textH);
				if (newSize > 1)
					StrCopy(textP, record.field[fieldNum]);
				else
					textP[0] = '\0';
				MemPtrUnlock(textP);
			}
			else
			{
				ErrNonFatalDisplay("Resize failed.");
			}

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
久久国内精品自在自线400部| 国产精品毛片无遮挡高清| 午夜精品免费在线| 欧美老人xxxx18| 蜜桃一区二区三区在线观看| 精品国产免费一区二区三区四区| 国产一区 二区| 亚洲欧洲精品一区二区三区| 在线视频你懂得一区| 日本亚洲免费观看| 中文字幕av一区二区三区高| 91传媒视频在线播放| 日韩成人一区二区三区在线观看| 久久久噜噜噜久久中文字幕色伊伊| 波多野结衣欧美| 午夜婷婷国产麻豆精品| 久久综合九色欧美综合狠狠| 91在线视频18| 丝袜亚洲另类欧美综合| 久久九九久久九九| 一道本成人在线| 免费看精品久久片| 国产精品久久久久婷婷二区次| 一道本成人在线| 日本一道高清亚洲日美韩| 中文字幕中文字幕一区二区| 欧美日韩mp4| eeuss国产一区二区三区| 日本午夜精品一区二区三区电影| 中文字幕免费一区| 7878成人国产在线观看| 99久久99久久综合| 精品一区中文字幕| 中文字幕综合网| 欧美精品一区二区三区久久久| 色综合网站在线| 国产一本一道久久香蕉| 性久久久久久久久久久久| 国产区在线观看成人精品| 欧美精品欧美精品系列| 成人av在线观| 国产精品综合久久| 日本不卡不码高清免费观看| 亚洲欧美偷拍卡通变态| 国产日韩精品一区二区三区在线| 91精品婷婷国产综合久久竹菊| 成人天堂资源www在线| 久久国产精品一区二区| 婷婷开心激情综合| 一区二区三区日韩欧美| 久久九九久精品国产免费直播| 69成人精品免费视频| 欧美在线观看一区| 99精品久久免费看蜜臀剧情介绍| 国内成人免费视频| 美女脱光内衣内裤视频久久网站| 亚洲影视在线观看| 亚洲色图一区二区| 中文字幕中文字幕一区二区| 中国av一区二区三区| www国产精品av| 欧美sm极限捆绑bd| 精品免费视频.| 精品日韩在线观看| 日韩欧美在线影院| 欧美成人免费网站| 精品国产免费一区二区三区香蕉| 日韩一级免费一区| 欧美成人乱码一区二区三区| 精品欧美久久久| 欧美电影免费观看高清完整版在| 91精品欧美综合在线观看最新| 欧美一a一片一级一片| 欧美伊人久久久久久午夜久久久久| 91麻豆产精品久久久久久| 色综合久久久久网| 欧美无砖专区一中文字| 欧美久久一二三四区| 91麻豆精品久久久久蜜臀 | 欧美日韩一区二区三区高清| 丁香六月综合激情| 福利视频网站一区二区三区| 成人夜色视频网站在线观看| 97久久超碰精品国产| 一本高清dvd不卡在线观看| 色婷婷综合久久久久中文一区二区 | 欧美一区二区三区视频在线 | 成人在线综合网| 成人免费精品视频| 色婷婷亚洲一区二区三区| 在线免费观看一区| 69堂国产成人免费视频| 精品国产青草久久久久福利| 中文字幕二三区不卡| 亚洲精品视频免费看| 日韩电影在线免费观看| 国产精品一品视频| 色欧美88888久久久久久影院| 91国产福利在线| 欧美一区二区在线播放| 国产亚洲一二三区| 亚洲三级免费电影| 日韩高清一区二区| 成人午夜激情在线| 欧美午夜影院一区| 精品国产乱码91久久久久久网站| 国产精品美女久久久久久2018| 一区二区三区小说| 国产一区二区三区在线观看免费视频| 成人免费看黄yyy456| 欧美日韩视频专区在线播放| 久久久精品黄色| 亚洲韩国精品一区| 国产一区二区三区久久久 | 欧美成人精精品一区二区频| 国产精品久久久久久久久晋中| 亚洲va欧美va国产va天堂影院| 黄色成人免费在线| 欧美中文字幕一区| 国产色91在线| 天堂精品中文字幕在线| jvid福利写真一区二区三区| 欧美日韩1234| 亚洲色图.com| 国产一区二区三区免费播放| 欧美午夜影院一区| 中文字幕第一页久久| 美女视频一区二区三区| 91国偷自产一区二区使用方法| 中文字幕在线观看一区二区| 久久福利视频一区二区| 成人黄色在线视频| 日韩欧美你懂的| 一区二区不卡在线播放| 成人永久免费视频| 日韩一区二区三区免费观看| 亚洲精品国产一区二区精华液 | 91精品福利在线| 久久精品人人做人人综合| 日韩精品1区2区3区| 色综合天天综合给合国产| 久久久久久免费| 日韩精品电影在线观看| 色猫猫国产区一区二在线视频| 2020国产精品久久精品美国| 亚洲成av人在线观看| 91日韩精品一区| 国产精品美女一区二区三区| 国产一区二区三区最好精华液| 6080yy午夜一二三区久久| 一区二区三区视频在线看| 99久久婷婷国产精品综合| 欧美国产国产综合| 国产精品1024| 久久免费国产精品 | 成人一区二区视频| 久久免费看少妇高潮| 精品制服美女丁香| 日韩午夜在线影院| 日韩av一二三| 日韩一区二区视频在线观看| 日韩高清中文字幕一区| 91精品国产日韩91久久久久久| 午夜一区二区三区视频| 欧美日本精品一区二区三区| 亚洲午夜三级在线| 在线播放一区二区三区| 偷偷要91色婷婷| 欧美一级xxx| 久久99精品视频| 久久九九久久九九| 成人动漫一区二区三区| 综合激情成人伊人| 在线观看亚洲专区| 天天综合日日夜夜精品| 日韩精品一区二| 国产福利一区二区三区视频在线 | 国产乱码精品一区二区三区av | 中文字幕中文字幕在线一区| 99在线视频精品| 日韩久久一区二区| 欧美日韩午夜在线视频| 蜜臀国产一区二区三区在线播放| 欧美电视剧在线观看完整版| 国产裸体歌舞团一区二区| 国产精品视频一二| 色婷婷狠狠综合| 免费成人结看片| 久久久91精品国产一区二区精品 | 久久精品国产免费| 中文字幕欧美国产| 欧美在线不卡视频| 青青草97国产精品免费观看无弹窗版| 日韩精品一区二区三区在线| 丁香激情综合五月| 亚洲国产精品天堂| 久久久综合精品| 欧洲在线/亚洲| 精品一区二区三区免费观看| 欧美经典一区二区三区|