1 // FIXME - need a destructor to clean up the printer queue strings.
2
3 #include <iostream>
4
5 #include <string.h>
6
7 #include <gtk/gtkframe.h>
8 #include <gtk/gtksizegroup.h>
9 #include <gtk/gtklabel.h>
10 #include <gtk/gtkcontainer.h>
11 #include <gtk/gtkdialog.h>
12 #include <gtk/gtkstock.h>
13
14 #include "stpui_widgets/stpui_queue.h"
15 #include "stpui_widgets/stpui_printerselector.h"
16
17 #include "../support/debug.h"
18
19 #include "printoutputselector.h"
20
21 #include "config.h"
22 #include "gettext.h"
23 #define _(x) gettext(x)
24
25 using namespace std;
26
27 enum {
28 CHANGED_SIGNAL,
29 LAST_SIGNAL
30 };
31
32 static guint printoutputselector_signals[LAST_SIGNAL] = { 0 };
33
34 static void printoutputselector_class_init (PrintOutputSelectorClass *klass);
35 static void printoutputselector_init (PrintOutputSelector *stpuicombo);
36
37
printersel_changed(GtkWidget * wid,gpointer * ob)38 static void printersel_changed(GtkWidget *wid,gpointer *ob)
39 {
40 Debug[TRACE] << "In printersel_changed()" << endl;
41 PrintOutputSelector *lo=(PrintOutputSelector *)ob;
42
43 const char *driver=stpui_printerselector_get_driver(STPUI_PRINTERSELECTOR(wid));
44 if(driver)
45 {
46 lo->po->SetString("Driver",driver);
47
48 g_signal_emit(G_OBJECT (ob),printoutputselector_signals[CHANGED_SIGNAL], 0);
49 }
50 }
51
52
printoutputselector_queue_changed(GtkEntry * entry,gpointer * ud)53 static void printoutputselector_queue_changed(GtkEntry *entry,gpointer *ud)
54 {
55 Debug[TRACE] << "In printoutputselectorqueue_changed()" << endl;
56
57 PrintOutputSelector *ob=PRINTOUTPUTSELECTOR(ud);
58 PrintOutput *po=ob->po;
59
60 Debug[TRACE] << "Getting printer queue..." << endl;
61
62 const char *val=po->GetPrinterQueue();
63 if(val && strlen(val))
64 {
65 Debug[TRACE] << "Got printer queue: " << val << endl;
66 char *driver=po->GetPrinterDriver();
67 if(driver)
68 {
69 Debug[TRACE] << "Got driver: " << driver << " from Queue" << endl;
70 po->SetString("Driver",driver);
71 stpui_printerselector_set_driver(STPUI_PRINTERSELECTOR(ob->printersel),driver);
72 free(driver);
73 }
74 g_signal_emit(G_OBJECT (ob),printoutputselector_signals[CHANGED_SIGNAL], 0);
75 }
76 }
77
78
79
printoutputselector_refresh(PrintOutputSelector * ob)80 void printoutputselector_refresh(PrintOutputSelector *ob)
81 {
82 Debug[TRACE] << "In printoutputselectorrefresh()" << endl;
83 PrintOutput *po=ob->po;
84
85 const char *driver=po->FindString("Driver");
86 if(driver)
87 {
88 Debug[TRACE] << "Setting driver to " << driver << endl;
89 stpui_printerselector_set_driver(STPUI_PRINTERSELECTOR(ob->printersel),driver);
90 }
91 const char *command=po->FindString("Command");
92 if(command)
93 {
94 gtk_entry_set_text(GTK_ENTRY(ob->string),command);
95 }
96 }
97
98
99 GtkWidget*
printoutputselector_new(PrintOutput * po)100 printoutputselector_new (PrintOutput *po)
101 {
102 PrintOutputSelector *ob=PRINTOUTPUTSELECTOR(g_object_new (printoutputselector_get_type (), NULL));
103 gtk_box_set_spacing(GTK_BOX(ob),5);
104
105 ob->po=po;
106
107 GtkWidget *label;
108
109 GtkWidget *table=gtk_table_new(2,3,FALSE);
110 gtk_container_set_border_width(GTK_CONTAINER(table),5);
111 gtk_box_pack_start(GTK_BOX(ob),table,FALSE,FALSE,0);
112 gtk_widget_show(table);
113
114 label=gtk_label_new(_("Print Queue:"));
115 gtk_table_attach_defaults(GTK_TABLE(table),label,0,1,0,1);
116 gtk_widget_show(label);
117
118 Debug[TRACE] << "Calling DBToQueues()" << endl;
119
120 po->DBToQueues();
121
122 Debug[TRACE] << "Getting PQInfo" << endl;
123 struct pqinfo *pq=po->GetPQInfo();
124 Debug[TRACE] << "Building stpui_queue" << endl;
125 ob->combo=stpui_queue_new(pq);
126 Debug[TRACE] << "Done" << endl;
127 gtk_table_attach_defaults(GTK_TABLE(table),ob->combo,1,2,0,1);
128 gtk_widget_show(ob->combo);
129
130 g_signal_connect(GTK_WIDGET(ob->combo),"changed",G_CALLBACK(printoutputselector_queue_changed),ob);
131
132
133 label=gtk_label_new(_("Printer Model:"));
134 gtk_table_attach_defaults(GTK_TABLE(table),label,0,1,1,2);
135 gtk_widget_show(label);
136
137 ob->printersel=stpui_printerselector_new();
138 gtk_table_attach_defaults(GTK_TABLE(table),ob->printersel,1,2,1,2);
139 g_signal_connect(G_OBJECT(ob->printersel),"changed",G_CALLBACK(printersel_changed),ob);
140
141 stpui_printerselector_set_driver(STPUI_PRINTERSELECTOR(ob->printersel),po->FindString("Driver"));
142 gtk_widget_show(ob->printersel);
143
144 return(GTK_WIDGET(ob));
145 }
146
147
148 GType
printoutputselector_get_type(void)149 printoutputselector_get_type (void)
150 {
151 static GType stpuic_type = 0;
152
153 if (!stpuic_type)
154 {
155 static const GTypeInfo printoutputselector_info =
156 {
157 sizeof (PrintOutputSelectorClass),
158 NULL, /* base_init */
159 NULL, /* base_finalize */
160 (GClassInitFunc) printoutputselector_class_init,
161 NULL, /* class_finalize */
162 NULL, /* class_data */
163 sizeof (PrintOutputSelector),
164 0,
165 (GInstanceInitFunc) printoutputselector_init,
166 };
167 stpuic_type = g_type_register_static (GTK_TYPE_VBOX, "PrintOutputSelector", &printoutputselector_info, (GTypeFlags)0);
168 }
169 return stpuic_type;
170 }
171
172
173 static void
printoutputselector_class_init(PrintOutputSelectorClass * klass)174 printoutputselector_class_init (PrintOutputSelectorClass *klass)
175 {
176 printoutputselector_signals[CHANGED_SIGNAL] =
177 g_signal_new ("changed",
178 G_TYPE_FROM_CLASS (klass),
179 GSignalFlags(G_SIGNAL_RUN_FIRST | G_SIGNAL_ACTION),
180 G_STRUCT_OFFSET (PrintOutputSelectorClass, changed),
181 NULL, NULL,
182 g_cclosure_marshal_VOID__VOID, G_TYPE_NONE, 0);
183 }
184
185
186 static void
printoutputselector_init(PrintOutputSelector * ob)187 printoutputselector_init (PrintOutputSelector *ob)
188 {
189 ob->po=NULL;
190 }
191
192
printoutput_queue_dialog(PrintOutput * po)193 void printoutput_queue_dialog(PrintOutput *po)
194 {
195 const char *oldqueue=po->FindString("Queue");
196 char *labeltext=g_strdup_printf(_("The printer queue %s\n is not found - please choose another"),oldqueue);
197 GtkWidget *dlg=gtk_dialog_new_with_buttons(_("Printer queue not found"),NULL,
198 GtkDialogFlags(0),GTK_STOCK_OK,GTK_RESPONSE_OK,NULL);
199
200 GtkWidget *vbox=gtk_vbox_new(FALSE,5);
201 gtk_box_pack_start(GTK_BOX(GTK_DIALOG(dlg)->vbox),vbox,TRUE,TRUE,8);
202 gtk_widget_show(vbox);
203
204 GtkWidget *label=gtk_label_new(labeltext);
205 gtk_label_set_justify(GTK_LABEL(label),GTK_JUSTIFY_CENTER);
206 g_free(labeltext);
207 gtk_widget_show(label);
208 gtk_box_pack_start(GTK_BOX(vbox),label,TRUE,TRUE,0);
209
210 Debug[TRACE] << "Getting PQInfo" << endl;
211 struct pqinfo *pq=po->GetPQInfo();
212 Debug[TRACE] << "Building stpui_queue" << endl;
213 GtkWidget *combo=stpui_queue_new(pq);
214 gtk_widget_show(combo);
215 gtk_box_pack_start(GTK_BOX(vbox),combo,FALSE,FALSE,8);
216
217 gint result=gtk_dialog_run(GTK_DIALOG(dlg));
218 switch(result)
219 {
220 case GTK_RESPONSE_OK:
221 po->QueuesToDB();
222 gtk_widget_destroy(dlg);
223 break;
224 }
225 }
226