/*************************************************************************** * Copyright (C) 2005 by Jeff Ferr * * root@sat * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with this program; if not, write to the * * Free Software Foundation, Inc., * * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * ***************************************************************************/ #include "agenda.h" #include "jmessagedialogbox.h" #include "jyesnodialogbox.h" #include "jkeyboard.h" #include "jcalendardialogbox.h" #include "jxmlparser.h" #include "jsystem.h" namespace magenda { Agenda::Agenda(): jgui::Frame("Tarefas", (1920-600)/2, 300, 0, 0) { started = true; db = new AgendaDB("./config/agenda.xml"); db->Load(); // _list = new jgui::ListBox(_insets.left, _insets.top, 600); _list = new jgui::ListBox(0, 0, 600); _list->AddTextItem("Verificar compromissos"); _list->AddTextItem("Adicionar compromisso"); _list->AddTextItem("Limpar todos os registros"); _list->AddTextItem("Estado da mem\xf3ria"); _list->RegisterSelectListener(this); _list->SetSize(_list->GetPreferredSize()); Add(_list); _list->RequestFocus(); Pack(); } Agenda::~Agenda() { jthread::AutoLock lock(&agenda_mutex); if (db != NULL) { delete db; db = NULL; } if (_list != NULL) { delete _list; _list = NULL; } } void Agenda::ItemSelected(jgui::SelectEvent *event) { jthread::AutoLock lock(&agenda_mutex); Hide(); if (event->GetIndex() == 0) { if (db->IsEmpty() == false) { ViewMessages view(db); view.Show(); } else { jgui::MessageDialogBox dialog("Aviso", "Nao existem compromissos cadastrados !", (1920-1000)/2, 400); dialog.Show(); } } else if (event->GetIndex() == 1) { if (db->IsFull() == false) { AddMessage add(db, -1); add.Show(); } else { jgui::MessageDialogBox dialog("Aviso", "A agenda está cheia !", (1920-1000)/2, 400); dialog.Show(); } } else if (event->GetIndex() == 2) { jgui::YesNoDialogBox dialog("Aviso", "Remover todos os registros ?", (1920-1000)/2, 400); dialog.Show(); if (dialog.GetResponse() == jgui::JDR_YES) { db->RemoveAll(); } } else if (event->GetIndex() == 3) { char tmp[255]; sprintf(tmp, "Contatos usados : %d/%d", db->GetSize(), db->GetCapacity()); jgui::MessageDialogBox dialog("Estado da mem\xf3ria", tmp, (1920-1000)/2, 400); dialog.Show(); } Show(false); } static bool agenda_compare(const AgendaDB::agenda_t &a, const AgendaDB::agenda_t &b) { if (a.year < b.year) { return true; } else if (a.year > b.year) { return false; } else { if (a.month < b.month) { return true; } else if (a.month > b.month) { return false; } else { if (a.day < b.day) { return true; } else if (a.day > b.day) { return false; } else { if (a.hour < b.hour) { return true; } else if (a.hour > b.hour) { return false; } else { if (a.minute < b.minute) { return true; } else { return false; } } } } } return false; } AgendaDB::AgendaDB(std::string file) { _file = file; } AgendaDB::~AgendaDB() { } bool AgendaDB::Load() { jcommon::XmlDocument doc(_file.c_str()); if (!doc.LoadFile()) { return false; } jcommon::XmlElement *root; jcommon::XmlElement *psg; // parser server node root = doc.RootElement()->FirstChildElement("notes"); if (root != NULL) { if (strcmp(root->Value(), "notes") == 0) { std::string event; int dia = -1, mes = -1, ano = -1, hora = -1, minuto = -1; psg = root->FirstChildElement("event"); do { if (psg == NULL || strcmp(psg->Value(), "event") != 0) { break; } if (psg->Attribute("day") != NULL) { dia = atoi(psg->Attribute("day")); } if (psg->Attribute("month") != NULL) { mes = atoi(psg->Attribute("month")); } if (psg->Attribute("year") != NULL) { ano = atoi(psg->Attribute("year")); } if (psg->Attribute("hour") != NULL) { hora = atoi(psg->Attribute("hour")); } if (psg->Attribute("minute") != NULL) { minuto = atoi(psg->Attribute("minute")); } if (psg->GetText() != "") { event = psg->GetText(); } if (dia != -1 && mes != -1 && ano != -1 && hora != -1 && minuto != -1 && event != "") { struct agenda_t t; t.day = dia; t.month = mes; t.year = ano; t.hour = hora; t.minute = minuto; t.event = event; events.push_back(t); } } while ((psg = psg->NextSiblingElement("event")) != NULL); } } std::sort(events.begin(), events.end(), agenda_compare); return true; } int AgendaDB::GetCapacity() { return 150; } int AgendaDB::GetSize() { return events.size(); } struct AgendaDB::agenda_t * AgendaDB::Get(int i) { if (i < 0 || i >= GetSize()) { return NULL; } return &events[i]; } void AgendaDB::Remove(int i) { if (i < 0 || i >= GetSize()) { return; } events.erase(events.begin()+i); std::sort(events.begin(), events.end(), agenda_compare); } bool AgendaDB::IsFull() { return (GetSize() >= GetCapacity()); } bool AgendaDB::IsEmpty() { return (GetSize() == 0); } bool AgendaDB::Add(int dia, int mes, int ano, int hora, int minuto, std::string event) { if (IsFull() == true) { return false; } struct agenda_t t; t.day = dia; t.month = mes; t.year = ano; t.hour = hora; t.minute = minuto; t.event = event; events.push_back(t); std::sort(events.begin(), events.end(), agenda_compare); return true; } bool AgendaDB::Update(int i, int dia, int mes, int ano, int hora, int minuto, std::string event) { if (i < 0 || i >= GetSize()) { return false; } struct agenda_t t = events[i]; events[i].day = dia; events[i].month = mes; events[i].year = ano; events[i].hour = hora; events[i].minute = minuto; events[i].event = event; std::sort(events.begin(), events.end(), agenda_compare); return false; } int AgendaDB::Find(int dia, int mes, int ano, int hora, int minuto, std::string event) { for (int i=0; i<(int)events.size(); i++) { struct agenda_t t = events[i]; if (t.day == dia && t.month == mes && t.year == ano && t.hour == hora && t.minute == minuto && t.event == event) { return i; } } return -1; } bool AgendaDB::Save() { std::ostringstream o; o << "" << std::endl; o << "" << std::endl; for (int i=0; i<(int)events.size(); i++) { struct agenda_t t = events[i]; o << "" << std::endl; o << t.event << std::endl; o << "" << std::endl; } o << "" << std::endl; o << "" << std::endl; jcommon::XmlDocument doc; doc.Parse(o.str().c_str()); if (doc.Error()) { return false; } doc.SaveFile(_file.c_str()); return true; } void AgendaDB::RemoveAll() { events.clear(); } AddMessage::AddMessage(AgendaDB *base, int index): jgui::Frame("Adicionar Compromisso", (1920-600)/2, 200, 600, 800) { int height = DEFAULT_COMPONENT_HEIGHT+4; _index = index; label1 = NULL; label2 = NULL; label3 = NULL; date = NULL; db = base; label1 = new jgui::Label("Hora", _insets.left, _insets.top+0*height, 350); label3 = new jgui::Label("Data", _insets.left, _insets.top+1*height, 350); hour = new jgui::TextField(label1->GetX()+label1->GetWidth()+10, _insets.top+0*height, 80); label2 = new jgui::Label(":", hour->GetX()+hour->GetWidth(), _insets.top+0*height, 20); minute = new jgui::TextField(label2->GetX()+label2->GetWidth(), _insets.top+0*height, 80); date = new jgui::TextField(label3->GetX()+label3->GetWidth()+10, _insets.top+1*height, 180); label4 = new jgui::Label("Mensagem", _insets.left, _insets.top+2*height, minute->GetX()+minute->GetWidth()-_insets.left); message = new jgui::TextArea(_insets.left, _insets.top+3*height, minute->GetX()+minute->GetWidth()-_insets.left, 400); label2->SetBackgroundVisible(false); label2->SetBorder(jgui::JCB_EMPTY); hour->Insert("12"); hour->SetCaretType(jgui::JCT_NONE); hour->SetTextSize(2); hour->SetHorizontalAlign(jgui::JHA_CENTER); minute->Insert("00"); minute->SetCaretType(jgui::JCT_NONE); minute->SetTextSize(2); minute->SetHorizontalAlign(jgui::JHA_CENTER); date->SetCaretType(jgui::JCT_NONE); date->SetHorizontalAlign(jgui::JHA_CENTER); if (_index < 0) { _state = 0; jcommon::Date d; _day = d.GetDayOfMonth(); _month = d.GetMonth(); _year = d.GetYear(); _hour = d.GetHour(); _minute = d.GetMinute(); } else { _state = 1; _day = db->Get(_index)->day; _month = db->Get(_index)->month; _year = db->Get(_index)->year; _hour = db->Get(_index)->hour; _minute = db->Get(_index)->minute; message->Insert(db->Get(_index)->event); } char tmp[255]; sprintf(tmp, "%02d", _hour); hour->Insert(tmp); sprintf(tmp, "%02d", _minute); minute->Insert(tmp); sprintf(tmp, "%02d/%02d/%04d", _day, _month, _year); date->Insert(tmp); Add(label1); Add(label2); Add(label3); Add(label4); Add(hour); Add(minute); Add(date); Add(message); hour->RequestFocus(); AddSubtitle(jcommon::System::GetResourceDirectory() + "/images/blue_icon.png", "Adicionar"); AddSubtitle(jcommon::System::GetResourceDirectory() + "/images/vertical_arrows.png", "Selecionar"); Pack(); } AddMessage::~AddMessage() { jthread::AutoLock lock(&add_mutex); delete label1; delete label2; delete label3; delete hour; delete minute; delete date; } void AddMessage::KeyboardPressed(jgui::KeyEvent *event) { jgui::Component *owner = GetFocusOwner(); if (owner == date || owner == message) { owner->ProcessEvent(event); } else { if (owner == hour || owner == minute) { int code = event->GetKeyCode(); if (code >= '0' && code <= '9') { if (owner == hour) { int h = atoi(hour->GetText().c_str()); char tmp[255]; hour->SetText(""); if (h == 0) { sprintf(tmp, "0%d", code); } else if (h == 1) { sprintf(tmp, "1%d", code); } else if (h == 2) { if (code <= 3) { sprintf(tmp, "2%d", code); } else { sprintf(tmp, "0%d", code); } } else { sprintf(tmp, "0%d", code); } hour->Insert(tmp); _hour = atoi(tmp); } else if (owner == minute) { int h = atoi(minute->GetText().c_str()); char tmp[255]; minute->SetText(""); if (h == 0) { sprintf(tmp, "0%d", code); } else if (h <= 5) { sprintf(tmp, "%d%d", h, code); } else { sprintf(tmp, "0%d", code); } minute->Insert(tmp); _minute = atoi(tmp); } } } } } bool AddMessage::ProcessEvent(jgui::KeyEvent *event) { jthread::AutoLock lock(&add_mutex); if (event->GetType() != jgui::JKT_PRESSED) { return false; } if ((event->GetSymbol() == jgui::JKS_1) | (event->GetSymbol() == jgui::JKS_2) | (event->GetSymbol() == jgui::JKS_3) | (event->GetSymbol() == jgui::JKS_4) | (event->GetSymbol() == jgui::JKS_5) | (event->GetSymbol() == jgui::JKS_6) | (event->GetSymbol() == jgui::JKS_7) | (event->GetSymbol() == jgui::JKS_8) | (event->GetSymbol() == jgui::JKS_9) | (event->GetSymbol() == jgui::JKS_0)) { std::string num; if (event->GetSymbol() == jgui::JKS_1) { num = "1"; } else if (event->GetSymbol() == jgui::JKS_2) { num = "2"; } else if (event->GetSymbol() == jgui::JKS_3) { num = "3"; } else if (event->GetSymbol() == jgui::JKS_4) { num = "4"; } else if (event->GetSymbol() == jgui::JKS_5) { num = "5"; } else if (event->GetSymbol() == jgui::JKS_6) { num = "6"; } else if (event->GetSymbol() == jgui::JKS_7) { num = "7"; } else if (event->GetSymbol() == jgui::JKS_8) { num = "8"; } else if (event->GetSymbol() == jgui::JKS_9) { num = "9"; } else if (event->GetSymbol() == jgui::JKS_0) { num = "0"; } if (GetFocusOwner() == hour) { int h = atoi(hour->GetText().c_str()), delta = atoi(num.c_str()); char tmp[255]; hour->SetText(""); if (h == 0) { sprintf(tmp, "0%d", delta); } else if (h == 1) { sprintf(tmp, "1%d", delta); } else if (h == 2) { if (delta <= 3) { sprintf(tmp, "2%d", delta); } else { sprintf(tmp, "0%d", delta); } } else { sprintf(tmp, "0%d", delta); } hour->Insert(tmp); _hour = atoi(tmp); } else if (GetFocusOwner() == minute) { int h = atoi(minute->GetText().c_str()), delta = atoi(num.c_str()); char tmp[255]; minute->SetText(""); if (h == 0) { sprintf(tmp, "0%d", delta); } else if (h <= 5) { sprintf(tmp, "%d%d", h, delta); } else { sprintf(tmp, "0%d", delta); } minute->Insert(tmp); _minute = atoi(tmp); } } else if (event->GetSymbol() == jgui::JKS_ENTER) { std::string tmp; if (GetFocusOwner() == hour) { tmp = hour->GetText(); jgui::Keyboard keyboard(GetX()+GetWidth()+20, GetY(), jgui::JKB_PHONE, false); keyboard.SetTextSize(20); keyboard.SetText(hour->GetText()); keyboard.RegisterKeyboardListener(this); keyboard.Show(); if (keyboard.GetLastKeyCode() != jgui::JKS_BLUE && keyboard.GetLastKeyCode() != jgui::JKS_F4) { hour->SetText(""); hour->Insert(tmp); } } else if (GetFocusOwner() == minute) { tmp = minute->GetText(); jgui::Keyboard keyboard(GetX()+GetWidth()+20, GetY(), jgui::JKB_PHONE, false); keyboard.SetTextSize(20); keyboard.SetText(minute->GetText()); keyboard.RegisterKeyboardListener(this); keyboard.Show(); if (keyboard.GetLastKeyCode() != jgui::JKS_BLUE && keyboard.GetLastKeyCode() != jgui::JKS_F4) { minute->SetText(""); minute->Insert(tmp); } } else if (GetFocusOwner() == date) { tmp = date->GetText(); jgui::CalendarDialogBox calendar(GetX()+GetWidth()+20, GetY()); for (int i=0; iGetSize(); i++) { AgendaDB::agenda_t *t = db->Get(i); calendar.AddWarnning(t->day, t->month, t->year); } calendar.Show(); if (calendar.GetLastKeyCode() == jgui::JKS_BLUE || calendar.GetLastKeyCode() == jgui::JKS_F4) { char tmp[255]; sprintf(tmp, "%02d/%02d/%04d", calendar.GetDay(), calendar.GetMonth(), calendar.GetYear()); date->SetText(""); date->Insert(tmp); _day = calendar.GetDay(); _month = calendar.GetMonth(); _year = calendar.GetYear(); } else { date->SetText(""); date->Insert(tmp); } /* } else if (GetFocusOwner() == message) { tmp = message->GetText(); jgui::Keyboard keyboard(GetX()+GetWidth()+20, GetY(), jgui::JKB_ALPHA_NUMERIC, false); keyboard.SetTextSize(20); keyboard.SetText(message->GetText()); keyboard.RegisterKeyboardListener(this); keyboard.Show(); if (keyboard.GetLastKeyCode() != jgui::JKS_BLUE && keyboard.GetLastKeyCode() != jgui::JKS_F4) { message->SetText(""); message->Insert(tmp); } */ } } else if (event->GetSymbol() == jgui::JKS_F4 || event->GetSymbol() == jgui::JKS_BLUE) { if (_state == 0) { db->Add(_day, _month, _year, _hour, _minute, message->GetText()); } else if (_state == 1) { db->Update(_index, _day, _month, _year, _hour, _minute, message->GetText()); } Release(); } return true; } ViewMessages::ViewMessages(AgendaDB *base): jgui::Frame("Compromissos", (1920-600)/2, 200, 600, 800) { int max_width = GetWidth()-_insets.left-_insets.right, dheight = 40, sheight = 50; _index = 0; label_date = NULL; label_hour = NULL; message = NULL; db = base; struct AgendaDB::agenda_t *t = db->Get(_index); char tmp[255]; sprintf(tmp, "[ %02d/%02d/%04d ]", t->day, t->month, t->year); label_date = new jgui::Label(tmp, _insets.left, _insets.top, 400, dheight); sprintf(tmp, "%02d:%02d", t->hour, t->minute); label_hour = new jgui::Label(tmp, _insets.left+400+10, _insets.top, GetWidth()-400-10-_insets.left-_insets.right, dheight); message = new jgui::Label(t->event, _insets.left, _insets.top+sheight, max_width, GetHeight()-240); message->SetHorizontalAlign(jgui::JHA_LEFT); message->SetVerticalAlign(jgui::JVA_TOP); Add(label_date); Add(label_hour); Add(message); AddSubtitle(jcommon::System::GetResourceDirectory() + "/images/blue_icon.png", "Apagar"); AddSubtitle(jcommon::System::GetResourceDirectory() + "/images/yellow_icon.png", "Editar"); AddSubtitle(jcommon::System::GetResourceDirectory() + "/images/horizontal_arrows.png", "Listar"); Pack(); } ViewMessages::~ViewMessages() { jthread::AutoLock lock(&view_mutex); delete label_date; delete label_hour; delete message; } void ViewMessages::Update() { if (db->IsEmpty() == true) { label_date->SetText("Sem Compromissos"); if (label_hour != NULL) { label_hour->SetText("00:00"); } if (message != NULL) { message->SetText(""); } } else { struct AgendaDB::agenda_t *t = db->Get(_index); char tmp[255]; sprintf(tmp, "[ %02d/%02d/%04d ]", t->day, t->month, t->year); label_date->SetText(tmp); sprintf(tmp, "%02d:%02d", t->hour, t->minute); label_hour->SetText(tmp); message->SetText(t->event); } } bool ViewMessages::ProcessEvent(jgui::KeyEvent *event) { jthread::AutoLock lock(&view_mutex); if (event->GetSymbol() == jgui::JKS_CURSOR_LEFT) { _index--; if (_index <= 0) { _index = 0; } Update(); } else if (event->GetSymbol() == jgui::JKS_CURSOR_RIGHT) { _index++; if (_index >= db->GetSize()) { _index = db->GetSize()-1; } Update(); } else if (event->GetSymbol() == jgui::JKS_F4 || event->GetSymbol() == jgui::JKS_BLUE) { if (db->GetSize() > 0) { jgui::YesNoDialogBox dialog("Aviso", "Remover o compromisso atual ?", (1920-1080)/2, 400); dialog.Show(); if (dialog.GetResponse() == jgui::JDR_YES) { db->Remove(_index); _index--; if (_index <= 0) { _index = 0; } Update(); } } } else if (event->GetSymbol() == jgui::JKS_F3 || event->GetSymbol() == jgui::JKS_YELLOW) { if (db->GetSize() > 0) { Hide(); AddMessage update(db, _index); update.Show(); Update(); Show(false); } } return true; } } int main() { magenda::Agenda app; app.Show(); return 0; }