27 #include <glib/gi18n.h> 29 #include "dialog-utils.h" 30 #include "gnc-amount-edit.h" 31 #include "gnc-component-manager.h" 33 #include "gnc-gui-query.h" 35 #include "dialog-search.h" 36 #include "search-param.h" 42 #include "business-gnome-utils.h" 43 #include "dialog-job.h" 44 #include "dialog-invoice.h" 45 #include "dialog-payment.h" 47 #define DIALOG_NEW_JOB_CM_CLASS "dialog-new-job" 48 #define DIALOG_EDIT_JOB_CM_CLASS "dialog-edit-job" 50 #define GNC_PREFS_GROUP_SEARCH "dialogs.business.job-search" 52 void gnc_job_window_ok_cb (GtkWidget *widget, gpointer data);
53 void gnc_job_window_cancel_cb (GtkWidget *widget, gpointer data);
54 void gnc_job_window_help_cb (GtkWidget *widget, gpointer data);
55 void gnc_job_window_destroy_cb (GtkWidget *widget, gpointer data);
56 void gnc_job_name_changed_cb (GtkWidget *widget, gpointer data);
76 GtkWidget * cust_edit;
77 GtkWidget * name_entry;
78 GtkWidget * desc_entry;
79 GtkWidget * rate_entry;
80 GtkWidget * active_check;
82 JobDialogType dialog_type;
93 jw_get_job (JobWindow *jw)
98 return gncJobLookup (jw->book, &jw->job_guid);
101 static void gnc_ui_to_job (JobWindow *jw, GncJob *job)
103 gnc_suspend_gui_refresh ();
104 gncJobBeginEdit (job);
108 gncJobSetID (job, gtk_entry_get_text (GTK_ENTRY (jw->id_entry)));
109 gncJobSetName (job, gtk_entry_get_text (GTK_ENTRY (jw->name_entry)));
110 gncJobSetReference (job, gtk_entry_get_text (GTK_ENTRY (jw->desc_entry)));
111 gncJobSetRate (job, gnc_amount_edit_get_amount
112 (GNC_AMOUNT_EDIT (jw->rate_entry)));
113 gncJobSetActive (job, gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON
114 (jw->active_check)));
116 GncOwner * old = gncJobGetOwner (job);
117 gnc_owner_get_owner (jw->cust_edit, &(jw->owner));
119 gncJobSetOwner (job, &(jw->owner));
122 gncJobCommitEdit (job);
123 gnc_resume_gui_refresh ();
127 gnc_job_verify_ok (JobWindow *jw)
133 res = gtk_entry_get_text (GTK_ENTRY (jw->name_entry));
134 if (g_strcmp0 (res,
"") == 0)
136 const char *message = _(
"The Job must be given a name.");
137 gnc_error_dialog (GTK_WINDOW (jw->dialog),
"%s", message);
142 gnc_owner_get_owner (jw->cust_edit, &(jw->owner));
143 res = gncOwnerGetName (&(jw->owner));
144 if (res == NULL || g_strcmp0 (res,
"") == 0)
146 const char *message = _(
"You must choose an owner for this job.");
147 gnc_error_dialog (GTK_WINDOW (jw->dialog),
"%s", message);
152 if (!gnc_amount_edit_evaluate (GNC_AMOUNT_EDIT(jw->rate_entry), NULL))
154 const char *message = _(
"The rate amount must be valid or you must leave it blank.");
155 gnc_error_dialog (GTK_WINDOW (jw->dialog),
"%s", message);
160 res = gtk_entry_get_text (GTK_ENTRY (jw->id_entry));
161 if (g_strcmp0 (res,
"") == 0)
163 string = gncJobNextID(jw->book);
164 gtk_entry_set_text (GTK_ENTRY (jw->id_entry),
string);
170 GncJob *job = jw_get_job (jw);
173 gnc_ui_to_job (jw, job);
178 jw->dialog_type = EDIT_JOB;
184 gnc_job_window_ok_cb (GtkWidget *widget, gpointer data)
186 JobWindow *jw = data;
189 if (!gnc_job_verify_ok (jw))
193 jw->created_job = jw_get_job (jw);
196 gnc_close_gui_component (jw->component_id);
200 gnc_job_window_cancel_cb (GtkWidget *widget, gpointer data)
202 JobWindow *jw = data;
204 gnc_close_gui_component (jw->component_id);
208 gnc_job_window_help_cb (GtkWidget *widget, gpointer data)
210 JobWindow *jw = data;
216 gnc_job_window_destroy_cb (GtkWidget *widget, gpointer data)
218 JobWindow *jw = data;
219 GncJob *job = jw_get_job (jw);
221 gnc_suspend_gui_refresh ();
223 if (jw->dialog_type == NEW_JOB && job != NULL)
225 gncJobBeginEdit (job);
230 gnc_unregister_gui_component (jw->component_id);
231 gnc_resume_gui_refresh ();
237 gnc_job_name_changed_cb (GtkWidget *widget, gpointer data)
239 JobWindow *jw = data;
243 gnc_owner_window_set_title (GTK_WINDOW (jw->dialog),
244 (jw->dialog_type == EDIT_JOB) ?
245 _(
"Edit Job") : _(
"New Job"),
246 jw->name_entry, jw->id_entry);
250 gnc_job_window_close_handler (gpointer user_data)
252 JobWindow *jw = user_data;
254 gtk_widget_destroy (jw->dialog);
260 gnc_job_window_refresh_handler (GHashTable *changes, gpointer user_data)
262 JobWindow *jw = user_data;
264 GncJob *job = jw_get_job (jw);
269 gnc_close_gui_component (jw->component_id);
276 info = gnc_gui_get_entity_events (changes, &jw->job_guid);
277 if (info && (info->event_mask & QOF_EVENT_DESTROY))
279 gnc_close_gui_component (jw->component_id);
286 find_handler (gpointer
find_data, gpointer user_data)
289 JobWindow *jw = user_data;
291 return(jw &&
guid_equal(&jw->job_guid, job_guid));
295 gnc_job_new_window (GtkWindow *parent, QofBook *bookp,
GncOwner *owner, GncJob *job)
299 GtkWidget *owner_box, *owner_label, *edit, *hbox;
309 job_guid = *gncJobGetGUID (job);
310 jw = gnc_find_first_gui_component (DIALOG_EDIT_JOB_CM_CLASS,
311 find_handler, &job_guid);
314 gtk_window_set_transient_for (GTK_WINDOW(jw->dialog), parent);
315 gtk_window_present (GTK_WINDOW(jw->dialog));
323 jw = g_new0 (JobWindow, 1);
325 gncOwnerCopy (owner, &(jw->owner));
328 builder = gtk_builder_new();
329 gnc_builder_add_from_file (builder,
"dialog-job.glade",
"job_dialog");
332 jw->dialog = GTK_WIDGET(gtk_builder_get_object (builder,
"job_dialog"));
333 gtk_window_set_transient_for (GTK_WINDOW(jw->dialog), parent);
336 gtk_widget_set_name (GTK_WIDGET(jw->dialog),
"gnc-id-job");
337 gnc_widget_style_context_add_class (GTK_WIDGET(jw->dialog),
"gnc-class-jobs");
340 jw->id_entry = GTK_WIDGET(gtk_builder_get_object (builder,
"id_entry"));
341 jw->name_entry = GTK_WIDGET(gtk_builder_get_object (builder,
"name_entry"));
342 jw->desc_entry = GTK_WIDGET(gtk_builder_get_object (builder,
"desc_entry"));
343 jw->active_check = GTK_WIDGET(gtk_builder_get_object (builder,
"active_check"));
345 owner_box = GTK_WIDGET(gtk_builder_get_object (builder,
"customer_hbox"));
346 owner_label = GTK_WIDGET(gtk_builder_get_object (builder,
"owner_label"));
348 edit = gnc_amount_edit_new();
349 gnc_amount_edit_set_evaluate_on_enter (GNC_AMOUNT_EDIT (edit), TRUE);
351 jw->rate_entry = edit;
352 gtk_widget_show (edit);
354 hbox = GTK_WIDGET(gtk_builder_get_object (builder,
"rate_entry"));
355 gtk_box_pack_start (GTK_BOX (hbox), edit, TRUE, TRUE, 0);
358 gtk_builder_connect_signals_full (builder, gnc_builder_connect_full_func, jw);
364 jw->job_guid = *gncJobGetGUID (job);
366 jw->dialog_type = EDIT_JOB;
367 jw->cust_edit = gnc_owner_edit_create (owner_label, owner_box,
370 gtk_entry_set_text (GTK_ENTRY (jw->id_entry), gncJobGetID (job));
371 gtk_entry_set_text (GTK_ENTRY (jw->name_entry), gncJobGetName (job));
372 gtk_entry_set_text (GTK_ENTRY (jw->desc_entry), gncJobGetReference (job));
373 gnc_amount_edit_set_amount (GNC_AMOUNT_EDIT (jw->rate_entry),
374 gncJobGetRate (job));
375 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (jw->active_check),
376 gncJobGetActive (job));
378 jw->component_id = gnc_register_gui_component (DIALOG_EDIT_JOB_CM_CLASS,
379 gnc_job_window_refresh_handler,
380 gnc_job_window_close_handler,
385 job = gncJobCreate (bookp);
386 gncJobSetOwner (job, owner);
387 jw->job_guid = *gncJobGetGUID (job);
389 jw->dialog_type = NEW_JOB;
392 if (owner->owner.undefined)
394 jw->cust_edit = gnc_owner_edit_create (owner_label, owner_box,
399 jw->cust_edit = gnc_owner_select_create (owner_label, owner_box,
403 jw->component_id = gnc_register_gui_component (DIALOG_NEW_JOB_CM_CLASS,
404 gnc_job_window_refresh_handler,
405 gnc_job_window_close_handler,
409 gnc_job_name_changed_cb (NULL, jw);
410 gnc_gui_component_watch_entity_type (jw->component_id,
412 QOF_EVENT_MODIFY | QOF_EVENT_DESTROY);
414 gtk_widget_show_all (jw->dialog);
417 gtk_widget_grab_focus(jw->name_entry);
424 g_object_unref(G_OBJECT(builder));
430 gnc_ui_job_new (GtkWindow *parent,
GncOwner *ownerp, QofBook *bookp)
436 if (!bookp)
return NULL;
440 g_return_val_if_fail ((
gncOwnerGetType (ownerp) == GNC_OWNER_CUSTOMER) ||
443 gncOwnerCopy (ownerp, &owner);
446 gncOwnerInitCustomer (&owner, NULL);
448 jw = gnc_job_new_window (parent, bookp, &owner, NULL);
453 gnc_ui_job_edit (GtkWindow *parent, GncJob *job)
457 if (!job)
return NULL;
459 jw = gnc_job_new_window (parent,
gncJobGetBook(job), gncJobGetOwner(job), job);
466 edit_job_cb (GtkWindow *dialog, gpointer *job_p, gpointer user_data)
470 g_return_if_fail (job_p && user_data);
477 gnc_ui_job_edit (dialog, job);
481 invoice_job_cb (GtkWindow *dialog, gpointer *job_p, gpointer user_data)
487 g_return_if_fail (job_p && user_data);
493 gncOwnerInitJob (&owner, job);
494 gnc_invoice_search (dialog, NULL, &owner, sw->book);
498 payment_job_cb (GtkWindow *dialog, gpointer *job_p, gpointer user_data)
504 g_return_if_fail (job_p && user_data);
511 gncOwnerInitJob (&owner, job);
512 gnc_ui_payment_new (dialog, &owner, sw->book);
517 new_job_cb (GtkWindow *dialog, gpointer user_data)
522 g_return_val_if_fail (user_data, NULL);
524 jw = gnc_ui_job_new (dialog, sw->owner, sw->book);
525 return jw_get_job (jw);
529 free_userdata_cb (gpointer user_data)
533 g_return_if_fail (sw);
540 gnc_job_search (GtkWindow *parent, GncJob *start,
GncOwner *owner, QofBook *book)
545 static GList *params = NULL;
546 static GList *columns = NULL;
549 { N_(
"View/Edit Job"), edit_job_cb, NULL, TRUE},
550 { N_(
"View Invoices"), invoice_job_cb, NULL, TRUE},
551 { N_(
"Process Payment"), payment_job_cb, NULL, FALSE},
555 g_return_val_if_fail (book, NULL);
560 params = gnc_search_param_prepend (params, _(
"Owner's Name"), NULL, type,
561 JOB_OWNER, OWNER_NAME, NULL);
562 params = gnc_search_param_prepend (params, _(
"Only Active?"), NULL, type,
564 params = gnc_search_param_prepend (params, _(
"Billing ID"), NULL, type,
565 JOB_REFERENCE, NULL);
566 params = gnc_search_param_prepend (params, _(
"Rate"), NULL, type,
568 params = gnc_search_param_prepend (params, _(
"Job Number"), NULL, type,
570 params = gnc_search_param_prepend (params, _(
"Job Name"), NULL, type,
577 columns = gnc_search_param_prepend (columns, _(
"Billing ID"), NULL, type,
578 JOB_REFERENCE, NULL);
579 columns = gnc_search_param_prepend (columns, _(
"Rate"), NULL, type,
581 columns = gnc_search_param_prepend (columns, _(
"Company"), NULL, type,
582 JOB_OWNER, OWNER_NAME, NULL);
583 columns = gnc_search_param_prepend (columns, _(
"Job Name"), NULL, type,
585 columns = gnc_search_param_prepend (columns, _(
"ID #"), NULL, type,
590 q = qof_query_create_for (type);
597 owner = gncJobGetOwner (start);
605 (g_slist_prepend (NULL, QOF_PARAM_GUID),
619 gncJobGetGUID (start), QOF_QUERY_AND);
628 gncOwnerCopy (owner, &(sw->owner_def));
629 sw->owner = &(sw->owner_def);
634 return gnc_search_dialog_create (parent, type, _(
"Find Job"),
635 params, columns, q, q2, buttons, NULL,
636 new_job_cb, sw, free_userdata_cb,
637 GNC_PREFS_GROUP_SEARCH, NULL,
644 gnc_job_search_select (GtkWindow *parent, gpointer start, gpointer book)
649 if (!book)
return NULL;
653 ownerp = gncJobGetOwner (j);
654 gncOwnerCopy (ownerp, &owner);
657 gncOwnerInitCustomer (&owner, NULL);
659 return gnc_job_search (parent, start, &owner, book);
663 gnc_job_search_edit (GtkWindow *parent, gpointer start, gpointer book)
666 gnc_ui_job_edit (parent, start);
const GncGUID * gncOwnerGetGUID(const GncOwner *owner)
Get the GncGUID of the immediate owner.
gboolean gncOwnerEqual(const GncOwner *a, const GncOwner *b)
Assess equality by checking.
QofQuery * qof_query_copy(QofQuery *q)
Make a copy of the indicated query.
const gchar * QofIdType
QofIdType declaration.
void qof_query_destroy(QofQuery *query)
Frees the resources associate with a Query object.
void gnc_gnome_help(GtkWindow *parent, const char *file_name, const char *anchor)
Launch the systems default help browser, gnome's yelp for linux, and open to a given link within a gi...
gboolean guid_equal(const GncGUID *guid_1, const GncGUID *guid_2)
Given two GUIDs, return TRUE if they are non-NULL and equal.
void qof_query_set_book(QofQuery *query, QofBook *book)
Set the book to be searched.
– Business Helper Functions
void qof_query_add_guid_match(QofQuery *q, QofQueryParamList *param_list, const GncGUID *guid, QofQueryOp op)
DOCUMENT ME !!
GncOwnerType gncOwnerGetType(const GncOwner *owner)
Returns the GncOwnerType of this owner.
#define gncJobGetBook(x)
deprecated functions
const GncGUID * guid_null(void)
Returns a GncGUID which is guaranteed to never reference any entity.
void qof_event_gen(QofInstance *entity, QofEventId event_id, gpointer event_data)
Invoke all registered event handlers using the given arguments.
The type used to store guids in C.