From: Andrea Zagli Date: Mon, 16 Aug 2010 11:45:59 +0000 (+0200) Subject: Gestione orari dell'ufficio. X-Git-Tag: 0.0.3~52 X-Git-Url: https://saetta.ns0.it/gitweb?a=commitdiff_plain;h=806ae670c6e3dc0665c479936017625275253589;p=solipa%2Forganigramma Gestione orari dell'ufficio. --- diff --git a/data/organigramma/form/Makefile.am b/data/organigramma/form/Makefile.am index da0e11a..a97d614 100644 --- a/data/organigramma/form/Makefile.am +++ b/data/organigramma/form/Makefile.am @@ -8,6 +8,7 @@ form_DATA = \ tipo_recapito.form \ ufficio.form \ ufficio_nodo.form \ + ufficio_orario.form \ ufficio_recapito.form EXTRA_DIST = $(form_DATA) diff --git a/data/organigramma/form/ufficio_orario.form b/data/organigramma/form/ufficio_orario.form new file mode 100644 index 0000000..8f53a20 --- /dev/null +++ b/data/organigramma/form/ufficio_orario.form @@ -0,0 +1,63 @@ + + + + ufficio_orari
+ + + + t + t + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 0 + + + +
diff --git a/data/organigramma/gui/organigramma.gui b/data/organigramma/gui/organigramma.gui index a433c15..57bd823 100644 --- a/data/organigramma/gui/organigramma.gui +++ b/data/organigramma/gui/organigramma.gui @@ -512,6 +512,76 @@ + + + + + + + + + + 0 + + + + 1 + Gennaio + + + 2 + Febbraio + + + 3 + Marzo + + + 4 + Aprile + + + 5 + Maggio + + + 6 + Giugno + + + 7 + Luglio + + + 8 + Agosto + + + 9 + Settembre + + + 10 + Ottobre + + + 11 + Novembre + + + 12 + Dicembre + + + + + + + + + + + True center-on-parent @@ -1317,7 +1387,7 @@ True - 6 + 7 2 5 5 @@ -1713,6 +1783,121 @@ 2 + + + True + 0 + + + True + 12 + + + True + 5 + + + True + True + automatic + automatic + etched-in + + + True + True + lstore_ufficio_orari + False + 0 + + + Orario + + + + 1 + + + + + + + + + 0 + + + + + True + 5 + start + + + gtk-new + True + True + True + True + + + False + False + 0 + + + + + gtk-edit + True + True + True + True + + + False + False + 1 + + + + + gtk-delete + True + True + True + True + + + False + False + 2 + + + + + False + 1 + + + + + + + + + True + <b>Orari</b> + True + + + + + 2 + 6 + 7 + + 0 @@ -2869,4 +3054,391 @@ + + Orario dell'ufficio - Gestione organigramma + True + center-on-parent + True + + + True + 5 + vertical + 5 + + + True + 6 + 2 + 5 + 5 + + + True + 0 + 0 + Descrizione + + + GTK_FILL + GTK_FILL + + + + + True + True + automatic + automatic + etched-in + + + True + True + + + + + 1 + 2 + + + + + 0 + lbl_id + + + 5 + 6 + GTK_FILL + GTK_FILL + + + + + lbl_id_uffici + + + 1 + 2 + 5 + 6 + + + + + True + 0 + Giorno della settimana + + + 1 + 2 + GTK_FILL + GTK_FILL + + + + + True + + + True + 0 + Lun + + + 0 + + + + + True + True + False + True + + + 1 + + + + + True + 0 + Mar + + + 2 + + + + + True + True + False + True + + + 3 + + + + + True + 0 + Mer + + + 4 + + + + + True + True + False + True + + + 5 + + + + + True + 0 + Gio + + + 6 + + + + + True + True + False + True + + + 7 + + + + + True + 0 + Ven + + + 8 + + + + + True + True + False + True + + + 9 + + + + + True + 0 + Sab + + + 10 + + + + + True + True + False + True + + + 11 + + + + + True + 0 + Dom + + + 12 + + + + + True + True + False + True + + + 13 + + + + + 1 + 2 + 1 + 2 + GTK_FILL + + + + + True + 0 + Settimana + + + 2 + 3 + GTK_FILL + GTK_FILL + + + + + True + 0 + Giorno del mese + + + 3 + 4 + GTK_FILL + GTK_FILL + + + + + True + 0 + Mese + + + 4 + 5 + GTK_FILL + GTK_FILL + + + + + True + lstore_mesi + + + + 1 + + + + + 1 + 2 + 4 + 5 + GTK_FILL + + + + + True + True + + adj_week + + + 1 + 2 + 2 + 3 + + + + + True + True + + adj_dmon + + + 1 + 2 + 3 + 4 + + + + + 0 + + + + + True + 5 + end + + + gtk-cancel + True + True + True + True + + + False + False + 0 + + + + + gtk-save + True + True + True + True + + + False + False + 1 + + + + + False + 1 + + + + + + + 4 + 1 + 10 + + + 31 + 1 + 10 + diff --git a/docs/organigramma.sql b/docs/organigramma.sql index a21a52b..d9ea10d 100644 --- a/docs/organigramma.sql +++ b/docs/organigramma.sql @@ -2,7 +2,7 @@ -- PostgreSQL database dump -- --- Started on 2010-08-16 12:51:15 +-- Started on 2010-08-16 13:44:54 SET statement_timeout = 0; SET client_encoding = 'UTF8'; @@ -12,7 +12,7 @@ SET client_min_messages = warning; SET escape_string_warning = off; -- --- TOC entry 1843 (class 1262 OID 59278) +-- TOC entry 1851 (class 1262 OID 59278) -- Name: organigramma; Type: DATABASE; Schema: -; Owner: - -- @@ -29,7 +29,7 @@ SET client_min_messages = warning; SET escape_string_warning = off; -- --- TOC entry 326 (class 2612 OID 16386) +-- TOC entry 329 (class 2612 OID 16386) -- Name: plpgsql; Type: PROCEDURAL LANGUAGE; Schema: -; Owner: - -- @@ -43,8 +43,8 @@ SET default_tablespace = ''; SET default_with_oids = false; -- --- TOC entry 1513 (class 1259 OID 59279) --- Dependencies: 1799 1800 1801 3 +-- TOC entry 1516 (class 1259 OID 59279) +-- Dependencies: 1803 1804 1805 3 -- Name: nodi; Type: TABLE; Schema: public; Owner: -; Tablespace: -- @@ -59,8 +59,8 @@ CREATE TABLE nodi ( -- --- TOC entry 1519 (class 1259 OID 59346) --- Dependencies: 1815 1816 1817 3 +-- TOC entry 1522 (class 1259 OID 59346) +-- Dependencies: 1819 1820 1821 3 -- Name: struttura_indirizzi; Type: TABLE; Schema: public; Owner: -; Tablespace: -- @@ -75,8 +75,8 @@ CREATE TABLE struttura_indirizzi ( -- --- TOC entry 1517 (class 1259 OID 59327) --- Dependencies: 1809 1810 1811 1812 1813 3 +-- TOC entry 1520 (class 1259 OID 59327) +-- Dependencies: 1813 1814 1815 1816 1817 3 -- Name: strutture; Type: TABLE; Schema: public; Owner: -; Tablespace: -- @@ -91,8 +91,8 @@ CREATE TABLE strutture ( -- --- TOC entry 1514 (class 1259 OID 59290) --- Dependencies: 1802 1803 3 +-- TOC entry 1517 (class 1259 OID 59290) +-- Dependencies: 1806 1807 3 -- Name: tipi_nodo; Type: TABLE; Schema: public; Owner: -; Tablespace: -- @@ -104,8 +104,8 @@ CREATE TABLE tipi_nodo ( -- --- TOC entry 1515 (class 1259 OID 59297) --- Dependencies: 1804 1805 3 +-- TOC entry 1518 (class 1259 OID 59297) +-- Dependencies: 1808 1809 3 -- Name: tipi_recapito; Type: TABLE; Schema: public; Owner: -; Tablespace: -- @@ -117,8 +117,8 @@ CREATE TABLE tipi_recapito ( -- --- TOC entry 1516 (class 1259 OID 59311) --- Dependencies: 1806 1807 1808 3 +-- TOC entry 1519 (class 1259 OID 59311) +-- Dependencies: 1810 1811 1812 3 -- Name: uffici; Type: TABLE; Schema: public; Owner: -; Tablespace: -- @@ -132,8 +132,8 @@ CREATE TABLE uffici ( -- --- TOC entry 1520 (class 1259 OID 59357) --- Dependencies: 1818 1819 3 +-- TOC entry 1523 (class 1259 OID 59357) +-- Dependencies: 1822 1823 3 -- Name: ufficio_nodi; Type: TABLE; Schema: public; Owner: -; Tablespace: -- @@ -147,8 +147,32 @@ CREATE TABLE ufficio_nodi ( -- --- TOC entry 1521 (class 1259 OID 59367) --- Dependencies: 1820 1821 1822 3 +-- TOC entry 1525 (class 1259 OID 59378) +-- Dependencies: 1827 1828 3 +-- Name: ufficio_orari; Type: TABLE; Schema: public; Owner: -; Tablespace: +-- + +CREATE TABLE ufficio_orari ( + id integer NOT NULL, + id_uffici integer, + descrizione text DEFAULT ''::text, + lunedi boolean, + martedi boolean, + mercoledi boolean, + giovedi boolean, + venerdi boolean, + sabato boolean, + domenica boolean, + settimana integer, + giorno_mese integer, + mese integer, + status character varying(1) DEFAULT ''::character varying +); + + +-- +-- TOC entry 1524 (class 1259 OID 59367) +-- Dependencies: 1824 1825 1826 3 -- Name: ufficio_recapiti; Type: TABLE; Schema: public; Owner: -; Tablespace: -- @@ -163,8 +187,8 @@ CREATE TABLE ufficio_recapiti ( -- --- TOC entry 1518 (class 1259 OID 59340) --- Dependencies: 1814 3 +-- TOC entry 1521 (class 1259 OID 59340) +-- Dependencies: 1818 3 -- Name: vie; Type: TABLE; Schema: public; Owner: -; Tablespace: -- @@ -175,8 +199,8 @@ CREATE TABLE vie ( -- --- TOC entry 1824 (class 2606 OID 59289) --- Dependencies: 1513 1513 +-- TOC entry 1830 (class 2606 OID 59289) +-- Dependencies: 1516 1516 -- Name: nodi_pkey; Type: CONSTRAINT; Schema: public; Owner: -; Tablespace: -- @@ -185,8 +209,8 @@ ALTER TABLE ONLY nodi -- --- TOC entry 1836 (class 2606 OID 59356) --- Dependencies: 1519 1519 +-- TOC entry 1842 (class 2606 OID 59356) +-- Dependencies: 1522 1522 -- Name: struttura_indirizzi_pkey; Type: CONSTRAINT; Schema: public; Owner: -; Tablespace: -- @@ -195,8 +219,8 @@ ALTER TABLE ONLY struttura_indirizzi -- --- TOC entry 1832 (class 2606 OID 59339) --- Dependencies: 1517 1517 +-- TOC entry 1838 (class 2606 OID 59339) +-- Dependencies: 1520 1520 -- Name: strutture_pkey; Type: CONSTRAINT; Schema: public; Owner: -; Tablespace: -- @@ -205,8 +229,8 @@ ALTER TABLE ONLY strutture -- --- TOC entry 1826 (class 2606 OID 59296) --- Dependencies: 1514 1514 +-- TOC entry 1832 (class 2606 OID 59296) +-- Dependencies: 1517 1517 -- Name: tipi_nodo_pkey; Type: CONSTRAINT; Schema: public; Owner: -; Tablespace: -- @@ -215,8 +239,8 @@ ALTER TABLE ONLY tipi_nodo -- --- TOC entry 1828 (class 2606 OID 59303) --- Dependencies: 1515 1515 +-- TOC entry 1834 (class 2606 OID 59303) +-- Dependencies: 1518 1518 -- Name: tipi_recapito_pkey; Type: CONSTRAINT; Schema: public; Owner: -; Tablespace: -- @@ -225,8 +249,8 @@ ALTER TABLE ONLY tipi_recapito -- --- TOC entry 1830 (class 2606 OID 59321) --- Dependencies: 1516 1516 +-- TOC entry 1836 (class 2606 OID 59321) +-- Dependencies: 1519 1519 -- Name: uffici_pkey; Type: CONSTRAINT; Schema: public; Owner: -; Tablespace: -- @@ -235,8 +259,8 @@ ALTER TABLE ONLY uffici -- --- TOC entry 1838 (class 2606 OID 59366) --- Dependencies: 1520 1520 +-- TOC entry 1844 (class 2606 OID 59366) +-- Dependencies: 1523 1523 -- Name: ufficio_nodi_pkey; Type: CONSTRAINT; Schema: public; Owner: -; Tablespace: -- @@ -245,8 +269,18 @@ ALTER TABLE ONLY ufficio_nodi -- --- TOC entry 1840 (class 2606 OID 59377) --- Dependencies: 1521 1521 +-- TOC entry 1848 (class 2606 OID 59387) +-- Dependencies: 1525 1525 +-- Name: ufficio_orari_pkey; Type: CONSTRAINT; Schema: public; Owner: -; Tablespace: +-- + +ALTER TABLE ONLY ufficio_orari + ADD CONSTRAINT ufficio_orari_pkey PRIMARY KEY (id); + + +-- +-- TOC entry 1846 (class 2606 OID 59377) +-- Dependencies: 1524 1524 -- Name: ufficio_recapiti_pkey; Type: CONSTRAINT; Schema: public; Owner: -; Tablespace: -- @@ -255,8 +289,8 @@ ALTER TABLE ONLY ufficio_recapiti -- --- TOC entry 1834 (class 2606 OID 59345) --- Dependencies: 1518 1518 +-- TOC entry 1840 (class 2606 OID 59345) +-- Dependencies: 1521 1521 -- Name: vie_pkey; Type: CONSTRAINT; Schema: public; Owner: -; Tablespace: -- @@ -265,7 +299,7 @@ ALTER TABLE ONLY vie -- --- TOC entry 1845 (class 0 OID 0) +-- TOC entry 1853 (class 0 OID 0) -- Dependencies: 3 -- Name: public; Type: ACL; Schema: -; Owner: - -- @@ -276,7 +310,7 @@ GRANT ALL ON SCHEMA public TO postgres; GRANT ALL ON SCHEMA public TO PUBLIC; --- Completed on 2010-08-16 12:51:15 +-- Completed on 2010-08-16 13:44:55 -- -- PostgreSQL database dump complete diff --git a/src/Makefile.am b/src/Makefile.am index cf75be9..d3e6d91 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -37,6 +37,8 @@ organigramma_SOURCES = \ ufficio.h \ ufficionodo.c \ ufficionodo.h \ + ufficioorario.c \ + ufficioorario.h \ ufficiorecapito.c \ ufficiorecapito.h \ vie.c \ diff --git a/src/ufficio.c b/src/ufficio.c index 56b3e86..423b9f9 100644 --- a/src/ufficio.c +++ b/src/ufficio.c @@ -22,6 +22,7 @@ #include "ufficio.h" #include "strutture.h" #include "ufficionodo.h" +#include "ufficioorario.h" #include "ufficiorecapito.h" static void ufficio_class_init (UfficioClass *klass); @@ -32,9 +33,11 @@ static void ufficio_salva (Ufficio *ufficio); static void ufficio_carica_nodi (Ufficio *ufficio); static void ufficio_carica_recapiti (Ufficio *ufficio); +static void ufficio_carica_orari (Ufficio *ufficio); static void ufficio_nodo_modifica (Ufficio *ufficio); static void ufficio_recapito_modifica (Ufficio *ufficio); +static void ufficio_orario_modifica (Ufficio *ufficio); static gboolean ufficio_conferma_chiusura (Ufficio *ufficio); @@ -49,6 +52,7 @@ static void ufficio_get_property (GObject *object, static void ufficio_on_nodo_aggiornato (gpointer instance, gpointer user_data); static void ufficio_on_recapito_aggiornato (gpointer instance, gpointer user_data); +static void ufficio_on_orario_aggiornato (gpointer instance, gpointer user_data); static void ufficio_on_ufficio_selezionato (gpointer instance, guint id, gpointer user_data); @@ -81,6 +85,17 @@ static void ufficio_on_trv_recapiti_row_activated (GtkTreeView *tree_view, GtkTreeViewColumn *column, gpointer user_data); +static void ufficio_on_btn_orario_nuovo_clicked (GtkButton *button, + gpointer user_data); +static void ufficio_on_btn_orario_modifica_clicked (GtkButton *button, + gpointer user_data); +static void ufficio_on_btn_orario_elimina_clicked (GtkButton *button, + gpointer user_data); +static void ufficio_on_trv_orari_row_activated (GtkTreeView *tree_view, + GtkTreePath *tree_path, + GtkTreeViewColumn *column, + gpointer user_data); + static void ufficio_on_btn_annulla_clicked (GtkButton *button, gpointer user_data); static void ufficio_on_btn_salva_clicked (GtkButton *button, @@ -92,7 +107,8 @@ enum { LBL_ID, LSTORE_NODI, - LSTORE_RECAPITI + LSTORE_RECAPITI, + LSTORE_ORARI }; enum @@ -109,6 +125,13 @@ enum RECAPITI_COL_RECAPITO }; +enum +{ + ORARI_COL_ID, + ORARI_COL_DESCRIZIONE, + ORARI_COL_ORARIO +}; + typedef struct _UfficioPrivate UfficioPrivate; struct _UfficioPrivate { @@ -122,6 +145,7 @@ struct _UfficioPrivate GtkTreeSelection *sel_nodi; GtkTreeSelection *sel_recapiti; + GtkTreeSelection *sel_orari; gint id; }; @@ -180,9 +204,10 @@ Ufficio error = NULL; gtk_builder_add_objects_from_file (priv->commons->gtkbuilder, priv->commons->guifile, - g_strsplit (g_strconcat ("lstore_ufficio_nodi", - "|lstore_ufficio_recapiti", - "|w_ufficio", NULL), "|", -1), + g_strsplit ("lstore_ufficio_nodi" + "|lstore_ufficio_recapiti" + "|lstore_ufficio_orari" + "|w_ufficio", "|", -1), &error); if (error != NULL) { @@ -200,10 +225,12 @@ Ufficio "label23", "lstore_ufficio_nodi", "lstore_ufficio_recapiti", + "lstore_ufficio_orari", NULL); priv->sel_nodi = gtk_tree_view_get_selection (GTK_TREE_VIEW (gtk_builder_get_object (priv->commons->gtkbuilder, "treeview7"))); priv->sel_recapiti = gtk_tree_view_get_selection (GTK_TREE_VIEW (gtk_builder_get_object (priv->commons->gtkbuilder, "treeview6"))); + priv->sel_orari = gtk_tree_view_get_selection (GTK_TREE_VIEW (gtk_builder_get_object (priv->commons->gtkbuilder, "treeview10"))); g_signal_connect (priv->w, "delete-event", G_CALLBACK (ufficio_on_w_ufficio_delete_event), (gpointer *)a); @@ -229,6 +256,15 @@ Ufficio g_signal_connect (G_OBJECT (gtk_builder_get_object (priv->commons->gtkbuilder, "treeview6")), "row-activated", G_CALLBACK (ufficio_on_trv_recapiti_row_activated), (gpointer *)a); + g_signal_connect (G_OBJECT (gtk_builder_get_object (priv->commons->gtkbuilder, "button59")), + "clicked", G_CALLBACK (ufficio_on_btn_orario_nuovo_clicked), (gpointer *)a); + g_signal_connect (G_OBJECT (gtk_builder_get_object (priv->commons->gtkbuilder, "button60")), + "clicked", G_CALLBACK (ufficio_on_btn_orario_modifica_clicked), (gpointer *)a); + g_signal_connect (G_OBJECT (gtk_builder_get_object (priv->commons->gtkbuilder, "button61")), + "clicked", G_CALLBACK (ufficio_on_btn_orario_elimina_clicked), (gpointer *)a); + g_signal_connect (G_OBJECT (gtk_builder_get_object (priv->commons->gtkbuilder, "treeview10")), + "row-activated", G_CALLBACK (ufficio_on_trv_orari_row_activated), (gpointer *)a); + g_signal_connect (gtk_builder_get_object (priv->commons->gtkbuilder, "button29"), "clicked", G_CALLBACK (ufficio_on_btn_annulla_clicked), (gpointer *)a); g_signal_connect (gtk_builder_get_object (priv->commons->gtkbuilder, "button30"), @@ -418,6 +454,43 @@ ufficio_carica_recapiti (Ufficio *ufficio) g_free (sql); } +static void +ufficio_carica_orari (Ufficio *ufficio) +{ + gchar *sql; + GdaDataModel *dm; + guint row; + guint rows; + + UfficioPrivate *priv = UFFICIO_GET_PRIVATE (ufficio); + + gtk_list_store_clear (GTK_LIST_STORE (priv->objects[LSTORE_ORARI])); + + sql = g_strdup_printf ("SELECT *" + " FROM ufficio_orari si" + " WHERE si.id_uffici = %d" + " AND si.status <> 'E'", + priv->id); + dm = gdaex_query (priv->commons->gdaex, sql); + if (dm != NULL) + { + GtkTreeIter iter; + + rows = gda_data_model_get_n_rows (dm); + for (row = 0; row < rows; row++) + { + gtk_list_store_append (GTK_LIST_STORE (priv->objects[LSTORE_ORARI]), &iter); + gtk_list_store_set (GTK_LIST_STORE (priv->objects[LSTORE_ORARI]), &iter, + ORARI_COL_ID, gdaex_data_model_get_field_value_integer_at (dm, row, "id"), + ORARI_COL_DESCRIZIONE, gdaex_data_model_get_field_value_stringify_at (dm, row, "descrizione"), + -1); + } + + g_object_unref (dm); + } + g_free (sql); +} + static void ufficio_nodo_modifica (Ufficio *ufficio) { @@ -494,6 +567,44 @@ ufficio_recapito_modifica (Ufficio *ufficio) } } +static void +ufficio_orario_modifica (Ufficio *ufficio) +{ + GtkTreeIter iter; + GtkWidget *dialog; + + UfficioPrivate *priv = UFFICIO_GET_PRIVATE (ufficio); + + if (gtk_tree_selection_get_selected (priv->sel_orari, NULL, &iter)) + { + guint id; + GtkWidget *w; + + gtk_tree_model_get (GTK_TREE_MODEL (priv->objects[LSTORE_ORARI]), &iter, + ORARI_COL_ID, &id, + -1); + + UfficioOrario *a = ufficio_orario_new (priv->commons, id, 0); + + g_signal_connect (G_OBJECT (a), "aggiornato", + G_CALLBACK (ufficio_on_orario_aggiornato), (gpointer)ufficio); + + w = ufficio_orario_get_widget (a); + gtk_window_set_transient_for (GTK_WINDOW (w), GTK_WINDOW (priv->w)); + gtk_widget_show (w); + } + else + { + dialog = gtk_message_dialog_new (GTK_WINDOW (priv->w), + GTK_DIALOG_DESTROY_WITH_PARENT, + GTK_MESSAGE_WARNING, + GTK_BUTTONS_OK, + "Occorre prima selezionare un orario"); + gtk_dialog_run (GTK_DIALOG (dialog)); + gtk_widget_destroy (dialog); + } +} + static void ufficio_set_property (GObject *object, guint property_id, const GValue *value, GParamSpec *pspec) { @@ -579,6 +690,15 @@ ufficio_on_recapito_aggiornato (gpointer instance, gpointer user_data) ufficio_carica_recapiti (ufficio); } +static void +ufficio_on_orario_aggiornato (gpointer instance, gpointer user_data) +{ + Ufficio *ufficio = (Ufficio *)user_data; + UfficioClass *klass = UFFICIO_GET_CLASS (ufficio); + + ufficio_carica_orari (ufficio); +} + static gboolean ufficio_on_w_ufficio_delete_event (GtkWidget *widget, GdkEvent *event, @@ -781,6 +901,93 @@ ufficio_on_trv_recapiti_row_activated (GtkTreeView *tree_view, ufficio_recapito_modifica ((Ufficio *)user_data); } +static void +ufficio_on_btn_orario_nuovo_clicked (GtkButton *button, + gpointer user_data) +{ + GtkWidget *w; + + Ufficio *ufficio = (Ufficio *)user_data; + + UfficioPrivate *priv = UFFICIO_GET_PRIVATE (ufficio); + + UfficioOrario *a = ufficio_orario_new (priv->commons, 0, priv->id); + + g_signal_connect (G_OBJECT (a), "aggiornato", + G_CALLBACK (ufficio_on_orario_aggiornato), (gpointer)ufficio); + + w = ufficio_orario_get_widget (a); + gtk_window_set_transient_for (GTK_WINDOW (w), GTK_WINDOW (priv->w)); + gtk_widget_show (w); +} + +static void +ufficio_on_btn_orario_modifica_clicked (GtkButton *button, + gpointer user_data) +{ + ufficio_orario_modifica ((Ufficio *)user_data); +} + +static void +ufficio_on_btn_orario_elimina_clicked (GtkButton *button, + gpointer user_data) +{ + GtkTreeIter iter; + GtkWidget *dialog; + guint risp; + + Ufficio *ufficio = (Ufficio *)user_data; + + UfficioClass *klass = UFFICIO_GET_CLASS (ufficio); + UfficioPrivate *priv = UFFICIO_GET_PRIVATE (ufficio); + + if (gtk_tree_selection_get_selected (priv->sel_orari, NULL, &iter)) + { + dialog = gtk_message_dialog_new (GTK_WINDOW (priv->w), + GTK_DIALOG_DESTROY_WITH_PARENT, + GTK_MESSAGE_QUESTION, + GTK_BUTTONS_YES_NO, + "Sicuro di voler eliminare l'orario selezionato?"); + risp = gtk_dialog_run (GTK_DIALOG (dialog)); + if (risp == GTK_RESPONSE_YES) + { + guint id; + + gtk_tree_model_get (GTK_TREE_MODEL (priv->objects[LSTORE_ORARI]), &iter, + ORARI_COL_ID, &id, + -1); + + gdaex_execute (priv->commons->gdaex, + g_strdup_printf ("UPDATE ufficio_orari" + " SET status = 'E'" + " WHERE id = %d", + id)); + + ufficio_carica_orari (ufficio); + } + gtk_widget_destroy (dialog); + } + else + { + dialog = gtk_message_dialog_new (GTK_WINDOW (priv->w), + GTK_DIALOG_DESTROY_WITH_PARENT, + GTK_MESSAGE_WARNING, + GTK_BUTTONS_OK, + "Occorre prima selezionare un orario"); + gtk_dialog_run (GTK_DIALOG (dialog)); + gtk_widget_destroy (dialog); + } +} + +static void +ufficio_on_trv_orari_row_activated (GtkTreeView *tree_view, + GtkTreePath *tree_path, + GtkTreeViewColumn *column, + gpointer user_data) +{ + ufficio_orario_modifica ((Ufficio *)user_data); +} + static void ufficio_on_btn_annulla_clicked (GtkButton *button, gpointer user_data) diff --git a/src/ufficioorario.c b/src/ufficioorario.c new file mode 100644 index 0000000..c2a948f --- /dev/null +++ b/src/ufficioorario.c @@ -0,0 +1,343 @@ +/* + * Copyright (C) 2009 Andrea Zagli + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +#ifdef HAVE_CONFIG_H + #include +#endif + +#include + +#include "ufficioorario.h" + +static void ufficio_orario_class_init (UfficioOrarioClass *klass); +static void ufficio_orario_init (UfficioOrario *ufficio_orario); + +static void ufficio_orario_carica (UfficioOrario *ufficio_orario); +static void ufficio_orario_salva (UfficioOrario *ufficio_orario); + +static gboolean ufficio_orario_conferma_chiusura (UfficioOrario *ufficio_orario); + +static void ufficio_orario_set_property (GObject *object, + guint property_id, + const GValue *value, + GParamSpec *pspec); +static void ufficio_orario_get_property (GObject *object, + guint property_id, + GValue *value, + GParamSpec *pspec); + +static gboolean ufficio_orario_on_w_ufficio_orario_delete_event (GtkWidget *widget, + GdkEvent *event, + gpointer user_data); + +static void ufficio_orario_on_btn_annulla_clicked (GtkButton *button, + gpointer user_data); +static void ufficio_orario_on_btn_salva_clicked (GtkButton *button, + gpointer user_data); + + +#define UFFICIO_ORARIO_GET_PRIVATE(obj) (G_TYPE_INSTANCE_GET_PRIVATE ((obj), TYPE_UFFICIO_ORARIO, UfficioOrarioPrivate)) + +enum +{ + LBL_ID, + LBL_ID_UFFICI +}; + +typedef struct _UfficioOrarioPrivate UfficioOrarioPrivate; +struct _UfficioOrarioPrivate + { + Commons *commons; + + GtkForm *form; + + GtkWidget *w; + + GObject **objects; + + guint id; + }; + +G_DEFINE_TYPE (UfficioOrario, ufficio_orario, G_TYPE_OBJECT) + +static void +ufficio_orario_class_init (UfficioOrarioClass *klass) +{ + GObjectClass *object_class = G_OBJECT_CLASS (klass); + + g_type_class_add_private (object_class, sizeof (UfficioOrarioPrivate)); + + object_class->set_property = ufficio_orario_set_property; + object_class->get_property = ufficio_orario_get_property; + + /** + * UfficioOrario::aggiornato: + * @ufficio_orario: + * + */ + klass->aggiornato_signal_id = g_signal_new ("aggiornato", + G_TYPE_FROM_CLASS (object_class), + G_SIGNAL_RUN_LAST, + 0, + NULL, + NULL, + g_cclosure_marshal_VOID__VOID, + G_TYPE_NONE, + 0); +} + +static void +ufficio_orario_init (UfficioOrario *ufficio_orario) +{ + UfficioOrarioPrivate *priv = UFFICIO_ORARIO_GET_PRIVATE (ufficio_orario); +} + +/** + * ufficio_orario_new: + * @commons: + * @id: + * @id_uffici: + * + * Returns: the newly created #UfficioOrario object. + */ +UfficioOrario +*ufficio_orario_new (Commons *commons, guint id, guint id_uffici) +{ + GError *error; + + UfficioOrario *a = UFFICIO_ORARIO (g_object_new (ufficio_orario_get_type (), NULL)); + + UfficioOrarioPrivate *priv = UFFICIO_ORARIO_GET_PRIVATE (a); + + priv->commons = commons; + + error = NULL; + + gtk_builder_add_objects_from_file (priv->commons->gtkbuilder, priv->commons->guifile, + g_strsplit ("adj_week|adj_dmon|lstore_mesi|w_ufficio_orario", "|", -1), + &error); + if (error != NULL) + { + g_fprintf (stderr, "Errore: %s\n", error->message); + return NULL; + } + + priv->form = gtk_form_new (); + g_object_set (G_OBJECT (priv->form), "gdaex", priv->commons->gdaex, NULL); + gtk_form_load_from_file (priv->form, g_build_filename (priv->commons->formdir, "ufficio_orario.form", NULL), priv->commons->gtkbuilder); + + priv->w = GTK_WIDGET (gtk_builder_get_object (priv->commons->gtkbuilder, "w_ufficio_orario")); + + priv->objects = gtk_form_get_objects_by_name (priv->form, + "label52", + "label53", + NULL); + + g_signal_connect (priv->w, + "delete-event", G_CALLBACK (ufficio_orario_on_w_ufficio_orario_delete_event), (gpointer *)a); + + g_signal_connect (G_OBJECT (gtk_builder_get_object (priv->commons->gtkbuilder, "button57")), + "clicked", G_CALLBACK (ufficio_orario_on_btn_annulla_clicked), (gpointer *)a); + g_signal_connect (G_OBJECT (gtk_builder_get_object (priv->commons->gtkbuilder, "button58")), + "clicked", G_CALLBACK (ufficio_orario_on_btn_salva_clicked), (gpointer *)a); + + priv->id = id; + if (priv->id == 0) + { + gtk_label_set_text (GTK_LABEL (priv->objects[LBL_ID]), ""); + gtk_label_set_text (GTK_LABEL (priv->objects[LBL_ID_UFFICI]), g_strdup_printf ("%d", id_uffici)); + + gtk_form_set_as_origin (priv->form); + } + else + { + gtk_label_set_text (GTK_LABEL (priv->objects[LBL_ID]), g_strdup_printf ("%d", priv->id)); + + ufficio_orario_carica (a); + } + + return a; +} + +/** + * ufficio_orario_get_widget: + * @ufficio_orario: + * + */ +GtkWidget +*ufficio_orario_get_widget (UfficioOrario *ufficio_orario) +{ + UfficioOrarioPrivate *priv = UFFICIO_ORARIO_GET_PRIVATE (ufficio_orario); + + return priv->w; +} + +/* PRIVATE */ +static void +ufficio_orario_carica (UfficioOrario *ufficio_orario) +{ + gchar *sql; + GdaDataModel *dm; + + UfficioOrarioPrivate *priv = UFFICIO_ORARIO_GET_PRIVATE (ufficio_orario); + + if (gtk_form_fill_from_table (priv->form)) + { + } +} + +static void +ufficio_orario_salva (UfficioOrario *ufficio_orario) +{ + gchar *sql; + GtkWidget *dialog; + + UfficioOrarioClass *klass = UFFICIO_ORARIO_GET_CLASS (ufficio_orario); + + UfficioOrarioPrivate *priv = UFFICIO_ORARIO_GET_PRIVATE (ufficio_orario); + + if (!gtk_form_check (priv->form, FALSE, NULL, TRUE, priv->w, TRUE)) + { + return; + } + + if (priv->id == 0) + { + sql = gtk_form_get_sql (priv->form, GTK_FORM_SQL_INSERT); + } + else + { + sql = gtk_form_get_sql (priv->form, GTK_FORM_SQL_UPDATE); + } + + if (gdaex_execute (priv->commons->gdaex, sql) == 1) + { + g_signal_emit (ufficio_orario, klass->aggiornato_signal_id, 0); + + if (priv->id == 0) + { + priv->id = strtol (gtk_label_get_text (GTK_LABEL (priv->objects[LBL_ID])), NULL, 10); + } + + gtk_form_set_as_origin (priv->form); + + dialog = gtk_message_dialog_new (GTK_WINDOW (priv->w), + GTK_DIALOG_DESTROY_WITH_PARENT, + GTK_MESSAGE_INFO, + GTK_BUTTONS_OK, + "Salvataggio eseguito con successo."); + gtk_dialog_run (GTK_DIALOG (dialog)); + gtk_widget_destroy (dialog); + } + else + { + dialog = gtk_message_dialog_new (GTK_WINDOW (priv->w), + GTK_DIALOG_DESTROY_WITH_PARENT, + GTK_MESSAGE_WARNING, + GTK_BUTTONS_OK, + "Errore durante il salvataggio"); + gtk_dialog_run (GTK_DIALOG (dialog)); + gtk_widget_destroy (dialog); + } +} + +static void +ufficio_orario_set_property (GObject *object, guint property_id, const GValue *value, GParamSpec *pspec) +{ + UfficioOrario *ufficio_orario = UFFICIO_ORARIO (object); + + UfficioOrarioPrivate *priv = UFFICIO_ORARIO_GET_PRIVATE (ufficio_orario); + + switch (property_id) + { + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec); + break; + } +} + +static void +ufficio_orario_get_property (GObject *object, guint property_id, GValue *value, GParamSpec *pspec) +{ + UfficioOrario *ufficio_orario = UFFICIO_ORARIO (object); + + UfficioOrarioPrivate *priv = UFFICIO_ORARIO_GET_PRIVATE (ufficio_orario); + + switch (property_id) + { + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec); + break; + } +} + +static gboolean +ufficio_orario_conferma_chiusura (UfficioOrario *ufficio_orario) +{ + GtkWidget *dialog; + + gboolean ret; + + UfficioOrarioPrivate *priv = UFFICIO_ORARIO_GET_PRIVATE (ufficio_orario); + + ret = TRUE; + + if (gtk_form_is_changed (priv->form)) + { + dialog = gtk_message_dialog_new (GTK_WINDOW (priv->w), + GTK_DIALOG_DESTROY_WITH_PARENT, + GTK_MESSAGE_QUESTION, + GTK_BUTTONS_YES_NO, + "Sicuro di voler chiudere senza salvare?"); + if (gtk_dialog_run (GTK_DIALOG (dialog)) == GTK_RESPONSE_NO) + { + ret = FALSE; + } + gtk_widget_destroy (dialog); + } + + return ret; +} + +/* CALLBACK */ +static gboolean +ufficio_orario_on_w_ufficio_orario_delete_event (GtkWidget *widget, + GdkEvent *event, + gpointer user_data) +{ + return !ufficio_orario_conferma_chiusura ((UfficioOrario *)user_data); +} + +static void +ufficio_orario_on_btn_annulla_clicked (GtkButton *button, + gpointer user_data) +{ + UfficioOrario *ufficio_orario = (UfficioOrario *)user_data; + + UfficioOrarioPrivate *priv = UFFICIO_ORARIO_GET_PRIVATE (ufficio_orario); + + if (ufficio_orario_conferma_chiusura (ufficio_orario)) gtk_widget_destroy (priv->w); +} + +static void +ufficio_orario_on_btn_salva_clicked (GtkButton *button, + gpointer user_data) +{ + ufficio_orario_salva ((UfficioOrario *)user_data); +} diff --git a/src/ufficioorario.h b/src/ufficioorario.h new file mode 100644 index 0000000..3554d1f --- /dev/null +++ b/src/ufficioorario.h @@ -0,0 +1,65 @@ +/* + * Copyright (C) 2009 Andrea Zagli + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +#ifndef __UFFICIO_ORARIO_H__ +#define __UFFICIO_ORARIO_H__ + +#include +#include + +#include + +#include "commons.h" + +G_BEGIN_DECLS + + +#define TYPE_UFFICIO_ORARIO (ufficio_orario_get_type ()) +#define UFFICIO_ORARIO(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), TYPE_UFFICIO_ORARIO, UfficioOrario)) +#define UFFICIO_ORARIO_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), TYPE_UFFICIO_ORARIO, UfficioOrarioClass)) +#define IS_UFFICIO_ORARIO(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), TYPE_UFFICIO_ORARIO)) +#define IS_UFFICIO_ORARIO_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), TYPE_UFFICIO_ORARIO)) +#define UFFICIO_ORARIO_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), TYPE_UFFICIO_ORARIO, UfficioOrarioClass)) + + +typedef struct _UfficioOrario UfficioOrario; +typedef struct _UfficioOrarioClass UfficioOrarioClass; + +struct _UfficioOrario + { + GObject parent; + }; + +struct _UfficioOrarioClass + { + GObjectClass parent_class; + + guint aggiornato_signal_id; + }; + +GType ufficio_orario_get_type (void) G_GNUC_CONST; + +UfficioOrario *ufficio_orario_new (Commons *commons, guint id, guint id_uffici); + +GtkWidget *ufficio_orario_get_widget (UfficioOrario *ufficio_orario); + + +G_END_DECLS + +#endif /* __UFFICIO_ORARIO_H__ */