00001 /* 00002 00003 This file is part of Kitlist, a program to maintain a simple list 00004 of items and assign items to one or more categories. 00005 00006 Copyright (C) 2008,2009 Frank Dean 00007 00008 Kitlist is free software: you can redistribute it and/or modify 00009 it under the terms of the GNU General Public License as published by 00010 the Free Software Foundation, either version 3 of the License, or 00011 (at your option) any later version. 00012 00013 Kitlist is distributed in the hope that it will be useful, 00014 but WITHOUT ANY WARRANTY; without even the implied warranty of 00015 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 00016 GNU General Public License for more details. 00017 00018 You should have received a copy of the GNU General Public License 00019 along with Kitlist. If not, see <http://www.gnu.org/licenses/>. 00020 00021 */ 00022 00023 #include "service.hpp" 00024 #include <cassert> 00025 #include <iostream> 00026 00027 using namespace std; 00028 00029 00033 Service::Service(KitListDao& dao) : m_dao(dao), m_model(0) { 00034 m_model = load_model(); 00035 } 00036 00037 00038 Service::~Service() { 00039 if (m_model) 00040 delete m_model; 00041 } 00042 00043 00047 KitModel* Service::load_model() { 00048 return m_dao.get_model(); 00049 } 00050 00051 00059 void Service::open_as_xml(const Glib::ustring& filename) { 00060 #ifdef XML_DAO 00061 delete m_model; 00062 m_model = ((XmlDao&) m_dao).get_model(filename); 00063 #endif 00064 } 00065 00066 00072 void Service::create_default_model() { 00073 delete m_model; 00074 #ifdef XML_DAO 00075 ((XmlDao&) m_dao).set_filename(""); 00076 m_model = m_dao.get_model(); 00077 #else 00078 m_model = new KitModel(); 00079 m_model->reset(); 00080 #endif 00081 } 00082 00083 00087 void Service::save() { 00088 assert(m_model); 00089 m_dao.save_model(m_model); 00090 } 00091 00092 00100 void Service::save_as_xml(const Glib::ustring& filename) { 00101 #ifdef XML_DAO 00102 ((XmlDao&) m_dao).save_model(m_model, filename); 00103 #else 00104 // Only want a new DAO when the current DAO isn't XmlDao 00105 XmlDao xmldao; 00106 xmldao.save_model(m_model, filename); 00107 #endif 00108 } 00109 00110 00114 ModelItem* Service::find_item(long id) { 00115 return m_model->find_item(id); 00116 } 00117 00118 00122 ModelCategory* Service::find_category(long cat_id) { 00123 return m_model->find_category(cat_id); 00124 } 00125 00126 00133 void Service::copy_items(const ModelItemContainer& items, long cat_id) { 00134 assert(m_model); 00135 m_model->set_dirty(true); 00136 m_model->copy_items(items, cat_id); 00137 } 00138 00139 00148 Item* Service::create_item(long cat_id) { 00149 assert(m_model); 00150 m_model->set_dirty(true); 00151 ModelItem* item = new ModelItem; 00152 item->set_id(get_next_item_id()); 00153 item->set_new_flag(true); 00154 item->set_dirty(true); 00155 if (cat_id < 0) 00156 m_model->add_item(item); 00157 else 00158 m_model->add_item(item, cat_id); 00159 return item; 00160 } 00161 00162 00169 bool Service::delete_item(long id) { 00170 bool retval = false; 00171 assert(m_model); 00172 ModelItem* item = m_model->find_item(id); 00173 if (item) { 00174 m_model->set_dirty(true); 00175 item->set_dirty(true); 00176 item->set_deleted(true); 00177 retval = true; 00178 } 00179 return retval; 00180 } 00181 00182 00189 bool Service::delete_category(long cat_id) { 00190 bool retval = false; 00191 assert(m_model); 00192 ModelCategory* category = m_model->find_category(cat_id); 00193 if (category) { 00194 m_model->set_dirty(true); 00195 category->set_dirty(true); 00196 category->set_deleted(true); 00197 retval = true; 00198 } 00199 return retval; 00200 } 00201 00202 00209 Category* Service::create_category() { 00210 assert(m_model); 00211 m_model->set_dirty(true); 00212 ModelCategory* category = new ModelCategory; 00213 category->set_id(get_next_category_id()); 00214 category->set_new_flag(true); 00215 category->set_dirty(true); 00216 m_model->add_category(category); 00217 return category; 00218 } 00219 00220 00227 void Service::select_items(ModelItemContainer* items, bool checked) { 00228 m_model->set_dirty(); 00229 for (ModelItemIter i = items->begin(); i != items->end(); ++i) { 00230 (*i)->set_dirty(); 00231 (*i)->set_checked(checked); 00232 } 00233 } 00234 00235 00241 void Service::toggle_selected_items(ModelItemContainer* items) { 00242 m_model->set_dirty(); 00243 for (ModelItemIter i = items->begin(); i != items->end(); ++i) { 00244 (*i)->set_dirty(); 00245 (*i)->set_checked(!(*i)->get_checked()); 00246 } 00247 } 00248 00249 00253 void Service::set_model_dirty(bool flag) { 00254 assert(m_model); 00255 if (m_model) 00256 m_model->set_dirty(flag); 00257 } 00258 00259 00271 bool Service::update_item(long id, const string description, bool checked) { 00272 bool retval = false; 00273 assert(m_model); 00274 ModelItem* item = m_model->find_item(id); 00275 if (item) { 00276 item->set_description(description); 00277 item->set_checked(checked); 00278 item->set_dirty(true); 00279 retval = true; 00280 } 00281 return retval; 00282 } 00283 00284 00294 ItemContainer* Service::get_items(long cat_id) { 00295 assert(m_model); 00296 ItemContainer* retval = 0; 00297 if (cat_id == -1) { 00298 retval = m_model->get_all_items(); 00299 } else { 00300 ModelCategory* cat = m_model->find_category(cat_id); 00301 if (cat) { 00302 retval = cat->get_items(); 00303 } 00304 } 00305 return retval; 00306 } 00307 00308 00314 CategoryContainer* Service::get_categories() { 00315 assert(m_model); 00316 CategoryContainer* retval = m_model->get_categories(); 00317 return retval; 00318 } 00319 00320 00324 long Service::get_next_item_id() { 00325 return m_dao.get_next_item_id(); 00326 } 00327 00328 00332 long Service::get_next_category_id() { 00333 return m_dao.get_next_category_id(); 00334 }