⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 todo.c

📁 uclinux 下写的一个 todo 程序
💻 C
📖 第 1 页 / 共 2 页
字号:
/* *  Copyright (C) 2000 EmSoft Limited (www.emsoftltd.com) * *  <Description of the file> * */#include <stdlib.h>#include <string.h>#include <time.h>#include "emtk.h"#include "glib.h"#include "laf/laf.h"#include "db.h"#include "glist_stable.h"#include "todo.h"#include "todo_record.h"#include "i18n.h"#include "date_chooser.h"#ifdef FONT_TABLE    #include "font_table.h"#else    #define lookupFont(a, b) (FONT1)    #define init_font_table(a)    #define unload_font_table()#endif#ifdef LAUNCHER_SUPPORT    #include "deskmsg.h"#endif#define TABLE_ROW_HEIGHT 20typedef struct {    int cbid;    int pbid;    int eid;    int dbid;} ListWidgets;enum { ACTION_DELETE_ITEM, ACTION_PURGE_ITEM };enum { TABLE_COL_COMPLETED = 0, TABLE_COL_PRIORITY, TABLE_COL_TITLE, TABLE_COL_DUEDATE };enum { DUE_DAY_TODAY = 0, DUE_DAY_TOMORROW, DUE_DAY_ONE_WEEK_LATER, DUE_DAY_NO_DATE, DUE_DAY_CHOOSE_DATE };static int db;static int todo_window, table_id, priority_menu, current_row, t_window, due_date_menu, confirm_dialog, purge_dialog;static int last_priority;enum { SHORTCUT_BUTTON_ENGLISH, SHORTCUT_BUTTON_CHINESE, SHORTCUT_BUTTON_THAI, SHORTCUT_BUTTON_HANDWRITE, SHORTCUT_BUTTON_KEYBOARD };static int ime_state = 0, last_ime = 0;static int ime_english, ime_chinese, ime_thai, ime_handwrite, ime_keyboard;static int toolbar_id;static GList *list, *table_widgets;static Todo *selected;static void ime_message(int code);static void todo_ime_activate (int flag){#ifdef LAUNCHER_SUPPORT    DESKTOP_CHANNEL channel;    MSG msg;    int msgLen;   	msgLen = msg_command_input_control(					        (flag) ?							MSG_COMMAND_INPUT_ACTIVATE :							MSG_COMMAND_INPUT_DEACTIVATE,							&msg);	desktop_channel_connect_specified_channel_name(&channel, "/tmp/ime");	desktop_channel_send(&channel, &msg, msgLen);	desktop_channel_disconnect(&channel);	#endif}		static void entryValChanged(int entry, void *data, void *userData) {    char buffer[100];        if (selected) {        g_free(selected->title);        emtk_entry_get_value(entry, buffer, 100);        selected->title = g_strdup(buffer);                selected->dirty = TRUE;    }        printf("%s\n", __FUNCTION__);    }static gint todoListSortPriority(gconstpointer a, gconstpointer b) {    Todo *todo1, *todo2;    todo1 = TODO(a);    todo2 = TODO(b);        return todo1->priority - todo2->priority;}#define DATE_FORMAT_OVERDUE "%d/%m!"#define DATE_FORMAT         "%d/%m"#define DATE_STR_BUFFER_LEN 7#define DATE_NONDUE_COLOR   "#000000"#define DATE_DUE_COLOR      "#ff0000"static void set_properties(int row, Todo *todo) {    ListWidgets *widgets;    char *priorityStr, *dateStr;    GDate *now, *dueDate;        widgets = (ListWidgets *) g_list_nth_data(table_widgets, row);        now = g_date_new();    dueDate = g_date_new();    g_date_set_time(now, time(NULL));        if (widgets) {        emtk_checkbox_set_state(widgets->cbid, todo->completed);                priorityStr = g_strdup_printf("%d", todo->priority);        emtk_button_set_string(widgets->pbid, priorityStr);        g_free(priorityStr);                emtk_entry_set_value(widgets->eid, todo->title, strlen(todo->title));                if (todo->dueDate > 0) {            g_date_set_time(dueDate, todo->dueDate);                        dateStr = g_new0(char, DATE_STR_BUFFER_LEN);                        if (g_date_compare(now, dueDate) > 0) {                g_date_strftime(dateStr, DATE_STR_BUFFER_LEN, DATE_FORMAT_OVERDUE, dueDate);                emtk_button_set_foreground_color(widgets->dbid, DATE_DUE_COLOR);            } else {                g_date_strftime(dateStr, DATE_STR_BUFFER_LEN, DATE_FORMAT, dueDate);                emtk_button_set_foreground_color(widgets->dbid, DATE_NONDUE_COLOR);            }        } else {            dateStr = g_strdup("--");            emtk_button_set_foreground_color(widgets->dbid, DATE_NONDUE_COLOR);        }                emtk_button_set_string(widgets->dbid, dateStr);                g_free(dateStr);                g_date_free(now);        g_date_free(dueDate);    }}static void update_table() {    int i;    Todo *todo;        for (i = 0; i < g_list_length(list); i++) {                todo = TODO(g_list_nth_data(list, i));        set_properties(i, todo);    }        emtk_window_redraw(t_window);}static void tableSelectionHandler(int tid, void *data, int row) {        selected = TODO(g_list_nth_data(list, row));        current_row = row;    }static void prioritySelectionHandler(int mid, void *data, int row) {        if (selected) {                if (selected->priority != row + 1) {                        selected->priority = row + 1;            selected->dirty = TRUE;                        list = g_list_sort_stable(list, todoListSortPriority);                        update_table();        }    }        emtk_menu_hide(priority_menu);}static void dcHandler(long time) {    selected->dueDate = time;    set_properties(current_row, selected);}static void deleteSelectedItem() {    void *item;    int length;        g_return_if_fail(selected != NULL);    list = g_list_remove(list, selected);        item = g_list_nth_data(table_widgets, current_row);    table_widgets = g_list_remove(table_widgets, item);        todo_record_delete(db, selected);        emtk_table_remove_row(table_id, current_row, TRUE);        g_free(selected->title);    g_free(selected);        length = g_list_length(list);        if (length > 0) {        if (current_row > length - 1)            current_row = length - 1;        selected = TODO(g_list_nth_data(list, current_row));    } else {        current_row = 0;        selected = NULL;    }        emtk_table_set_focus(table_id, current_row);}static void drawDialog(int window, WindowRect *rect) {    emtk_window_add_object(window,         emtk_label_new(window, 20, 30, lookupFont("en_US", MEDIUM_FONT), 						FALSE, _("Delete selected To Do item?")));}static void confirmDialogHandler(int button, int response) {    switch(response) {        case EMTK_DIALOG_OK:            deleteSelectedItem();            break;        case EMTK_DIALOG_CANCEL:            // do nothing            break;    }        emtk_app_close_window(confirm_dialog);}static void deleteBtnHandler(int id, void *data) {    WindowRect rect;   	if (emtk_table_get_num_rows (table_id) <= 0)   			return ;    rect.x = APP_WINDOW_X;    rect.y = APP_WINDOW_Y + (APP_WINDOW_H-DEL_WIN_H) * 5 / 7;    rect.w = APP_WINDOW_W;    rect.h = DEL_WIN_H;        confirm_dialog = emtk_app_dialog_new(_("Delete To Do"), 										lookupFont("en_US", MEDIUM_FONT), 										lookupFont("en_US", SMALL_FONT), 										drawDialog, 								        EMTK_DIALOG_OK | EMTK_DIALOG_CANCEL, 										&rect, confirmDialogHandler, NULL);    }#define DAY 60 * 60 * 24static void dueDateSelectionHandler(int mid, void *data, int row) {    long now;    WindowRect rect;    rect.x = APP_WINDOW_X;    rect.y = APP_WINDOW_Y;    rect.w = DATE_CHOOSER_W;	//APP_WINDOW_W;    rect.h = DATE_CHOOSER_H;	//APP_WINDOW_H;	printf ("**** w %d h %d *****\n", rect.w, rect.h);	    g_return_if_fail(selected != NULL);        now = time(NULL);    emtk_menu_hide(due_date_menu);        switch(row) {        case DUE_DAY_TODAY:            selected->dueDate = now;            break;        case DUE_DAY_TOMORROW:            selected->dueDate = now + DAY;            break;        case DUE_DAY_ONE_WEEK_LATER:            selected->dueDate = now + DAY * 6;            break;        case DUE_DAY_NO_DATE:            selected->dueDate = NO_DUE_DATE;            break;        case DUE_DAY_CHOOSE_DATE:            if (selected->dueDate == NO_DUE_DATE)                selected->dueDate = time(NULL);            date_chooser_new(_("Due Date"), &rect, selected->dueDate, dcHandler);            break;        default:            g_warning("A undefined row from menu is selected\n");    }        selected->dirty = TRUE;        set_properties(current_row, selected);    }static void priorityButtonHandler(int bid, void *data) {    if (selected)        emtk_menu_set_focus(priority_menu, selected->priority - 1);    emtk_menu_show(priority_menu);}static void dueDateBtnHandler(int id, void *data) {    if (selected) {        if (selected->dueDate > 0)            emtk_menu_set_focus(due_date_menu, DUE_DAY_CHOOSE_DATE);        else            emtk_menu_set_focus(due_date_menu, DUE_DAY_NO_DATE);                emtk_menu_show(due_date_menu);    }}static void checkboxHandler(int id, void *data) {        if (selected) {        selected->completed = !selected->completed;        selected->dirty = TRUE;    }}static void closeHandler(int id, void *data) {    GList *item;    Todo *todo;        ime_message(0);        for (item = list; item != NULL; item = g_list_next(item)) {        todo = TODO(item->data);                if (todo && todo->dirty) {            todo_record_save(db, todo);        }                g_free(todo->title);        g_free(todo);    }        g_list_free(list);    g_list_free(table_widgets);#ifdef LAUNCHER_SUPPORT	todo_ime_activate (FALSE);#endif    emtk_app_close();}static int newTableRow() {    ListWidgets *widgets;        widgets = g_new0(ListWidgets, 1);        widgets->cbid = emtk_table_append_checkbox_new(table_id, FONT1, "box_checked.png", "box_blank.png", "", 0, checkboxHandler, NULL, TABLE_COL_COMPLETED);    widgets->pbid = emtk_table_append_button_new(table_id, 20, 18, FONT2, "1", 0, priorityButtonHandler, NULL, TABLE_COL_PRIORITY);    emtk_button_set_border_width(widgets->pbid, 0);    widgets->eid  = emtk_entry_new(t_window, 0, 12, 0, KEY_TYPE_ANY, APP_WINDOW_W - 108, 50, FONT1, FONT1, NULL);	emtk_entry_set_sensitive(widgets->eid, TRUE);    emtk_entry_set_value_change_callback(widgets->eid, entryValChanged, NULL);    emtk_table_append_entry(table_id, widgets->eid, TABLE_COL_TITLE);    //emtk_entry_set_sensitive(widgets->eid, TRUE);    widgets->dbid = emtk_table_append_button_new(table_id, 50, 20, FONT2, "--", 0, dueDateBtnHandler, NULL, TABLE_COL_DUEDATE);    table_widgets = g_list_append(table_widgets, widgets);        return emtk_table_get_num_rows(table_id);

⌨️ 快捷键说明

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