1
/* -*- Mode: C; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 8 -*-
3
* Copyright 2012 Red Hat, Inc,
5
* This program is free software; you can redistribute it and/or modify
6
* it under the terms of the GNU General Public License as published by
7
* the Free Software Foundation; either version 2 of the License, or
8
* (at your option) any later version.
10
* This program is distributed in the hope that it will be useful,
11
* but WITHOUT ANY WARRANTY; without even the implied warranty of
12
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13
* GNU General Public License for more details.
15
* You should have received a copy of the GNU General Public License
16
* along with this program; if not, write to the Free Software
17
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
19
* Author: Marek Kasik <mkasik@redhat.com>
26
#include <sys/types.h>
30
#include <glib/gi18n.h>
31
#include <glib/gstdio.h>
34
#include <cups/cups.h>
37
#include "pp-ppd-selection-dialog.h"
39
static void pp_ppd_selection_dialog_hide (PpPPDSelectionDialog *dialog);
44
PPD_DISPLAY_NAMES_COLUMN
49
PPD_MANUFACTURERS_NAMES_COLUMN = 0,
50
PPD_MANUFACTURERS_DISPLAY_NAMES_COLUMN
54
struct _PpPPDSelectionDialog {
59
UserResponseCallback user_callback;
63
GtkResponseType response;
70
manufacturer_selection_changed_cb (GtkTreeSelection *selection,
73
PpPPDSelectionDialog *dialog = (PpPPDSelectionDialog *) user_data;
77
GtkTreeView *models_treeview;
78
gchar *manufacturer_name = NULL;
81
if (gtk_tree_selection_get_selected (selection, &model, &iter))
83
gtk_tree_model_get (model, &iter,
84
PPD_MANUFACTURERS_NAMES_COLUMN, &manufacturer_name,
88
if (manufacturer_name)
91
for (i = 0; i < dialog->list->num_of_manufacturers; i++)
93
if (g_strcmp0 (manufacturer_name,
94
dialog->list->manufacturers[i]->manufacturer_name) == 0)
103
models_treeview = (GtkTreeView*)
104
gtk_builder_get_object (dialog->builder, "ppd-selection-models-treeview");
106
store = gtk_list_store_new (2, G_TYPE_STRING, G_TYPE_STRING);
108
for (i = 0; i < dialog->list->manufacturers[index]->num_of_ppds; i++)
110
gtk_list_store_append (store, &iter);
111
gtk_list_store_set (store, &iter,
112
PPD_NAMES_COLUMN, dialog->list->manufacturers[index]->ppds[i]->ppd_name,
113
PPD_DISPLAY_NAMES_COLUMN, dialog->list->manufacturers[index]->ppds[i]->ppd_display_name,
117
gtk_tree_view_set_model (models_treeview, GTK_TREE_MODEL (store));
118
g_object_unref (store);
121
g_free (manufacturer_name);
126
model_selection_changed_cb (GtkTreeSelection *selection,
129
PpPPDSelectionDialog *dialog = (PpPPDSelectionDialog *) user_data;
133
gchar *model_name = NULL;
135
if (gtk_tree_selection_get_selected (selection, &model, &iter))
137
gtk_tree_model_get (model, &iter,
138
PPD_NAMES_COLUMN, &model_name,
142
widget = (GtkWidget*)
143
gtk_builder_get_object (dialog->builder, "ppd-selection-select-button");
147
gtk_widget_set_sensitive (widget, TRUE);
152
gtk_widget_set_sensitive (widget, FALSE);
157
fill_ppds_list (PpPPDSelectionDialog *dialog)
159
GtkTreeSelection *selection;
162
GtkTreeView *treeview;
164
GtkTreeIter *preselect_iter = NULL;
168
widget = (GtkWidget*)
169
gtk_builder_get_object (dialog->builder, "ppd-spinner");
170
gtk_widget_hide (widget);
171
gtk_spinner_stop (GTK_SPINNER (widget));
173
widget = (GtkWidget*)
174
gtk_builder_get_object (dialog->builder, "progress-label");
175
gtk_widget_hide (widget);
177
treeview = (GtkTreeView*)
178
gtk_builder_get_object (dialog->builder, "ppd-selection-manufacturers-treeview");
182
store = gtk_list_store_new (2, G_TYPE_STRING, G_TYPE_STRING);
184
for (i = 0; i < dialog->list->num_of_manufacturers; i++)
186
gtk_list_store_append (store, &iter);
187
gtk_list_store_set (store, &iter,
188
PPD_MANUFACTURERS_NAMES_COLUMN, dialog->list->manufacturers[i]->manufacturer_name,
189
PPD_MANUFACTURERS_DISPLAY_NAMES_COLUMN, dialog->list->manufacturers[i]->manufacturer_display_name,
192
if (g_strcmp0 (dialog->manufacturer,
193
dialog->list->manufacturers[i]->manufacturer_display_name) == 0)
195
preselect_iter = gtk_tree_iter_copy (&iter);
199
gtk_tree_view_set_model (treeview, GTK_TREE_MODEL (store));
201
if (preselect_iter &&
202
(selection = gtk_tree_view_get_selection (treeview)) != NULL)
204
gtk_tree_selection_select_iter (selection, preselect_iter);
205
path = gtk_tree_model_get_path (GTK_TREE_MODEL (store), preselect_iter);
206
gtk_tree_view_scroll_to_cell (treeview, path, NULL, TRUE, 0.5, 0.0);
207
gtk_tree_path_free (path);
208
gtk_tree_iter_free (preselect_iter);
211
g_object_unref (store);
216
populate_dialog (PpPPDSelectionDialog *dialog)
218
GtkTreeViewColumn *column;
219
GtkCellRenderer *renderer;
220
GtkTreeView *manufacturers_treeview;
221
GtkTreeView *models_treeview;
224
manufacturers_treeview = (GtkTreeView*)
225
gtk_builder_get_object (dialog->builder, "ppd-selection-manufacturers-treeview");
227
renderer = gtk_cell_renderer_text_new ();
229
/* Translators: Name of column showing printer manufacturers */
230
column = gtk_tree_view_column_new_with_attributes (_("Manufacturers"), renderer,
231
"text", PPD_MANUFACTURERS_DISPLAY_NAMES_COLUMN, NULL);
232
gtk_tree_view_column_set_expand (column, TRUE);
233
gtk_tree_view_append_column (manufacturers_treeview, column);
236
models_treeview = (GtkTreeView*)
237
gtk_builder_get_object (dialog->builder, "ppd-selection-models-treeview");
239
renderer = gtk_cell_renderer_text_new ();
241
/* Translators: Name of column showing printer drivers */
242
column = gtk_tree_view_column_new_with_attributes (_("Drivers"), renderer,
243
"text", PPD_DISPLAY_NAMES_COLUMN, NULL);
244
gtk_tree_view_column_set_expand (column, TRUE);
245
gtk_tree_view_append_column (models_treeview, column);
248
g_signal_connect (gtk_tree_view_get_selection (models_treeview),
249
"changed", G_CALLBACK (model_selection_changed_cb), dialog);
251
g_signal_connect (gtk_tree_view_get_selection (manufacturers_treeview),
252
"changed", G_CALLBACK (manufacturer_selection_changed_cb), dialog);
254
gtk_widget_show_all (dialog->dialog);
258
widget = (GtkWidget*)
259
gtk_builder_get_object (dialog->builder, "ppd-spinner");
260
gtk_widget_show (widget);
261
gtk_spinner_start (GTK_SPINNER (widget));
263
widget = (GtkWidget*)
264
gtk_builder_get_object (dialog->builder, "progress-label");
265
gtk_widget_show (widget);
269
fill_ppds_list (dialog);
274
ppd_selection_dialog_response_cb (GtkDialog *dialog,
278
PpPPDSelectionDialog *ppd_selection_dialog = (PpPPDSelectionDialog*) user_data;
279
GtkTreeSelection *selection;
281
GtkTreeView *models_treeview;
284
pp_ppd_selection_dialog_hide (ppd_selection_dialog);
286
ppd_selection_dialog->response = response_id;
287
if (response_id == GTK_RESPONSE_OK)
289
models_treeview = (GtkTreeView*)
290
gtk_builder_get_object (ppd_selection_dialog->builder, "ppd-selection-models-treeview");
294
selection = gtk_tree_view_get_selection (models_treeview);
298
if (gtk_tree_selection_get_selected (selection, &model, &iter))
300
gtk_tree_model_get (model, &iter,
301
PPD_NAMES_COLUMN, &ppd_selection_dialog->ppd_name,
308
ppd_selection_dialog->user_callback (GTK_DIALOG (ppd_selection_dialog->dialog),
310
ppd_selection_dialog->user_data);
314
update_alignment_padding (GtkWidget *widget,
315
GtkAllocation *allocation,
318
PpPPDSelectionDialog *dialog = (PpPPDSelectionDialog*) user_data;
319
GtkAllocation allocation2;
320
GtkWidget *action_area;
321
gint offset_left, offset_right;
322
guint padding_left, padding_right,
323
padding_top, padding_bottom;
325
action_area = (GtkWidget*)
326
gtk_builder_get_object (dialog->builder, "dialog-action-area1");
327
gtk_widget_get_allocation (action_area, &allocation2);
329
offset_left = allocation2.x - allocation->x;
330
offset_right = (allocation->x + allocation->width) -
331
(allocation2.x + allocation2.width);
333
gtk_alignment_get_padding (GTK_ALIGNMENT (widget),
334
&padding_top, &padding_bottom,
335
&padding_left, &padding_right);
336
if (allocation->x >= 0 && allocation2.x >= 0)
338
if (offset_left > 0 && offset_left != padding_left)
339
gtk_alignment_set_padding (GTK_ALIGNMENT (widget),
340
padding_top, padding_bottom,
341
offset_left, padding_right);
343
gtk_alignment_get_padding (GTK_ALIGNMENT (widget),
344
&padding_top, &padding_bottom,
345
&padding_left, &padding_right);
346
if (offset_right > 0 && offset_right != padding_right)
347
gtk_alignment_set_padding (GTK_ALIGNMENT (widget),
348
padding_top, padding_bottom,
349
padding_left, offset_right);
353
PpPPDSelectionDialog *
354
pp_ppd_selection_dialog_new (GtkWindow *parent,
357
UserResponseCallback user_callback,
360
PpPPDSelectionDialog *dialog;
362
GError *error = NULL;
363
gchar *objects[] = { "ppd-selection-dialog", NULL };
364
guint builder_result;
366
dialog = g_new0 (PpPPDSelectionDialog, 1);
368
dialog->builder = gtk_builder_new ();
369
dialog->parent = GTK_WIDGET (parent);
371
builder_result = gtk_builder_add_objects_from_file (dialog->builder,
372
DATADIR"/ppd-selection-dialog.ui",
375
if (builder_result == 0)
377
g_warning ("Could not load ui: %s", error->message);
378
g_error_free (error);
382
dialog->dialog = (GtkWidget *) gtk_builder_get_object (dialog->builder, "ppd-selection-dialog");
383
dialog->user_callback = user_callback;
384
dialog->user_data = user_data;
386
dialog->response = GTK_RESPONSE_NONE;
387
dialog->list = ppd_list_copy (ppd_list);
389
dialog->manufacturer = get_standard_manufacturers_name (manufacturer);
391
/* connect signals */
392
g_signal_connect (dialog->dialog, "delete-event", G_CALLBACK (gtk_widget_hide_on_delete), NULL);
393
g_signal_connect (dialog->dialog, "response", G_CALLBACK (ppd_selection_dialog_response_cb), dialog);
395
widget = (GtkWidget*)
396
gtk_builder_get_object (dialog->builder, "content-alignment");
397
g_signal_connect (widget, "size-allocate", G_CALLBACK (update_alignment_padding), dialog);
399
widget = (GtkWidget*)
400
gtk_builder_get_object (dialog->builder, "ppd-spinner");
401
gtk_spinner_start (GTK_SPINNER (widget));
403
populate_dialog (dialog);
405
gtk_window_set_transient_for (GTK_WINDOW (dialog->dialog), GTK_WINDOW (parent));
406
gtk_window_present (GTK_WINDOW (dialog->dialog));
407
gtk_widget_show_all (GTK_WIDGET (dialog->dialog));
413
pp_ppd_selection_dialog_free (PpPPDSelectionDialog *dialog)
415
gtk_widget_destroy (GTK_WIDGET (dialog->dialog));
417
g_object_unref (dialog->builder);
419
g_free (dialog->ppd_name);
421
g_free (dialog->manufacturer);
427
pp_ppd_selection_dialog_get_ppd_name (PpPPDSelectionDialog *dialog)
429
return g_strdup (dialog->ppd_name);
433
pp_ppd_selection_dialog_set_ppd_list (PpPPDSelectionDialog *dialog,
437
fill_ppds_list (dialog);
441
pp_ppd_selection_dialog_hide (PpPPDSelectionDialog *dialog)
443
gtk_widget_hide (GTK_WIDGET (dialog->dialog));