2
* Copyright (C) 2007 Michael Lamothe
4
* This program is free software; you can redistribute it and/or modify
5
* it under the terms of the GNU General Public License as published by
6
* the Free Software Foundation; either version 2 of the License, or
7
* (at your option) any later version.
9
* This program is distributed in the hope that it will be useful,
10
* but WITHOUT ANY WARRANTY; without even the implied warranty of
11
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12
* GNU Library General Public License for more details.
14
* You should have received a copy of the GNU General Public License
15
* along with this program; if not, write to the Free Software
16
* Foundation, Inc., 51 Franklin Street, Fifth Floor Boston, MA 02110-1301, USA
19
#include "scheduled_recordings_dialog.h"
20
#include "application.h"
21
#include "exception_handler.h"
22
#include "recording_manager.h"
25
#define EVENT_DESCRIPTION_LINE_LENGTH 60
27
#define COLUMN_CHANNEL_NAME 0
29
#define COLUMN_START_TIME 2
30
#define COLUMN_DURATION 3
31
#define COLUMN_DESCRIPTION 4
33
ScheduledRecordingsTreeViewIterator::ScheduledRecordingsTreeViewIterator(GtkTreeModel* model, GtkTreeIter* parent_iter)
36
has_row = gtk_tree_model_iter_children(model, &iter, parent_iter);
39
void ScheduledRecordingsTreeViewIterator::next()
41
has_row = gtk_tree_model_iter_next(model, &iter);
44
GtkTreeIter& ScheduledRecordingsTreeViewIterator::get_current_row()
49
bool ScheduledRecordingsTreeViewIterator::get_has_row() const
54
ScheduledRecordingsTreeViewRowCollection::ScheduledRecordingsTreeViewRowCollection(GtkTreeModel* model, GtkTreeIter* parent_iter)
56
this->parent_iter = parent_iter;
60
void ScheduledRecordingsTreeViewRowCollection::add_row(ScheduledRecordingsTreeViewRow& row)
62
gtk_tree_store_append(GTK_TREE_STORE(model), &iter, parent_iter);
63
row.attach(model, &iter);
67
ScheduledRecordingsDialog::ScheduledRecordingsDialog()
69
Glade& glade = Application::get_current().get_glade();
70
scheduled_recordings_dialog = glade.get_widget("scheduled_recordings_dialog");
71
tree_view = new ScheduledRecordingsTreeView(GTK_TREE_VIEW(glade.get_widget("treeview_scheduled_recordings")));
73
g_signal_connect( G_OBJECT ( glade.get_widget("button_scheduled_recordings_add") ), "clicked", G_CALLBACK ( on_button_scheduled_recordings_add_clicked ), this );
76
void ScheduledRecordingsDialog::on_button_scheduled_recordings_add_clicked(GtkButton* button, ScheduledRecordingsDialog* scheduled_recordings_dialog)
78
Application::get_current().show_scheduled_recording_dialog();
79
scheduled_recordings_dialog->tree_view->load();
82
void ScheduledRecordingsDialog::show()
86
gtk_dialog_run(GTK_DIALOG(scheduled_recordings_dialog));
87
gtk_widget_hide(scheduled_recordings_dialog);
90
ScheduledRecordingsTreeViewRow::ScheduledRecordingsTreeViewRow()
96
Glib::ustring ScheduledRecordingsTreeViewRow::get_tree_view_column_text(gchar* s)
98
Glib::ustring result = (s == NULL) ? "" : s;
103
void ScheduledRecordingsTreeViewRow::attach(GtkTreeModel* model, GtkTreeIter* iter)
109
void ScheduledRecordingsTreeViewRow::update()
113
throw Exception("Row was not attached to a table");
116
Glib::ustring type = scheduled_recording.get_type_text();
117
Glib::ustring start_time = scheduled_recording.get_start_time_text();
118
Glib::ustring duration = scheduled_recording.get_duration_text();
120
gtk_tree_store_set (GTK_TREE_STORE(model), &iter,
121
COLUMN_CHANNEL_NAME, scheduled_recording.channel_name.c_str(),
122
COLUMN_TYPE, type.c_str(),
123
COLUMN_START_TIME, start_time.c_str(),
124
COLUMN_DURATION, duration.c_str(),
125
COLUMN_DESCRIPTION, scheduled_recording.description.c_str(),
129
ScheduledRecordingsTreeView::ScheduledRecordingsTreeView(GtkTreeView* tree_view_epg) : tree_view(tree_view_epg)
131
GtkTreeStore* tree_store = gtk_tree_store_new(5,
132
G_TYPE_STRING, // COLUMN_CHANNEL_NAME
133
G_TYPE_STRING, // COLUMN_TYPE
134
G_TYPE_STRING, // COLUMN_START_TIME
135
G_TYPE_STRING, // COLUMN_DURATION
136
G_TYPE_STRING // COLUMN_DESCRIPTION
139
gtk_tree_view_set_model(tree_view_epg, GTK_TREE_MODEL(tree_store));
140
GtkTreeSelection* selection = gtk_tree_view_get_selection(tree_view_epg);
141
gtk_tree_selection_set_mode (selection, GTK_SELECTION_SINGLE);
143
GtkCellRenderer* text_renderer = gtk_cell_renderer_text_new();
144
GtkTreeViewColumn* column_channel = gtk_tree_view_column_new_with_attributes (N_("Channel"), text_renderer, "text", COLUMN_CHANNEL_NAME, NULL);
145
GtkTreeViewColumn* column_type = gtk_tree_view_column_new_with_attributes (N_("Type"), text_renderer, "text", COLUMN_TYPE, NULL);
146
GtkTreeViewColumn* column_start_time = gtk_tree_view_column_new_with_attributes (N_("Start Time"), text_renderer, "text", COLUMN_START_TIME, NULL);
147
GtkTreeViewColumn* column_duration = gtk_tree_view_column_new_with_attributes (N_("Duration"), text_renderer, "text", COLUMN_DURATION, NULL);
148
GtkTreeViewColumn* column_description = gtk_tree_view_column_new_with_attributes (N_("Description"), text_renderer, "text", COLUMN_DESCRIPTION, NULL);
150
gtk_tree_view_column_set_resizable(column_description, true);
151
gtk_tree_view_column_set_max_width(column_description, 1000);
153
gtk_tree_view_append_column(tree_view_epg, column_channel);
154
gtk_tree_view_append_column(tree_view_epg, column_type);
155
gtk_tree_view_append_column(tree_view_epg, column_start_time);
156
gtk_tree_view_append_column(tree_view_epg, column_duration);
157
gtk_tree_view_append_column(tree_view_epg, column_description);
159
g_signal_connect ( G_OBJECT ( tree_view ), "row-activated", G_CALLBACK ( on_tree_view_row_activated ), this );
161
gtk_tree_view_set_search_column(tree_view, COLUMN_DESCRIPTION);
164
gboolean ScheduledRecordingsTreeView::get_selected(GtkTreeModel** tree_model, GtkTreeIter* iter)
166
gboolean result = false;
167
GtkTreeSelection* selection = gtk_tree_view_get_selection(tree_view);
168
if (selection != NULL)
170
if (gtk_tree_selection_get_selected(selection, tree_model, iter) > 0)
179
void ScheduledRecordingsTreeView::expand(ScheduledRecordingsTreeViewRow& row)
181
GtkTreePath* path = gtk_tree_model_get_path(row.get_model(), row.get_iter());
182
gtk_tree_view_expand_row(tree_view, path, FALSE);
185
void ScheduledRecordingsTreeView::clear()
187
GtkTreeModel* tree_model = gtk_tree_view_get_model(tree_view);
188
gtk_tree_store_clear(GTK_TREE_STORE(tree_model));
191
void ScheduledRecordingsTreeView::load()
193
RecordingManager& recording_manager = Application::get_current().get_recording_manager();
194
XPathResult scheduled_recordings(recording_manager.get_scheduled_recordings());
196
int count = scheduled_recordings.get_count();
197
for (int i = 0; i < count; i++)
199
ScheduledRecordingsTreeViewRow row;
200
row.scheduled_recording.load(scheduled_recordings.get_result(i));
205
void ScheduledRecordingsTreeView::add_row(ScheduledRecordingsTreeViewRow& row)
207
ScheduledRecordingsTreeViewRowCollection rows = get_rows();
208
return rows.add_row(row);
211
void ScheduledRecordingsTreeView::on_tree_view_row_activated(
212
GtkTreeView* tree_view,
214
GtkTreeViewColumn *column,
215
ScheduledRecordingsTreeView* scheduled_recordings_tree_view)
218
GtkTreeModel* model = gtk_tree_view_get_model(tree_view);
219
gtk_tree_model_get_iter(model, &iter, path);
221
const gchar* description = NULL;
223
gtk_tree_model_get(model, &iter, COLUMN_DESCRIPTION, &description, -1);
225
Application::get_current().show_scheduled_recording_dialog(description);
226
scheduled_recordings_tree_view->load();
229
ScheduledRecordingsTreeViewRowCollection ScheduledRecordingsTreeView::get_rows()
231
return ScheduledRecordingsTreeViewRowCollection(gtk_tree_view_get_model(tree_view));
234
ScheduledRecordingsTreeViewIterator ScheduledRecordingsTreeView::get_iterator()
236
ScheduledRecordingsTreeViewRowCollection rows = get_rows();
237
return rows.get_iterator();