📄 todo.c
字号:
/* * 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 + -