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