]> saetta.ns0.it Git - bcity/be/commitdiff
Started tables "segnalazioni" and "segnalazione_allegati".
authorAndrea Zagli <azagli@libero.it>
Sun, 21 Feb 2016 11:23:51 +0000 (12:23 +0100)
committerAndrea Zagli <azagli@libero.it>
Sun, 21 Feb 2016 11:23:51 +0000 (12:23 +0100)
17 files changed:
data/bcity_be/form/Makefile.am
data/bcity_be/form/segnalazione.form [new file with mode: 0644]
data/bcity_be/form/segnalazioneallegato.form [new file with mode: 0644]
data/bcity_be/gui/bcity_be.ui
data/bcity_be/query_editor/Makefile.am
data/bcity_be/query_editor/segnalazioni.xml [new file with mode: 0644]
doc/bcity_be/db/bcity.sql
src/Makefile.am
src/main.c
src/segnalazione.c [new file with mode: 0644]
src/segnalazione.h [new file with mode: 0644]
src/segnalazioneallegato.c [new file with mode: 0644]
src/segnalazioneallegato.h [new file with mode: 0644]
src/segnalazioni.c [new file with mode: 0644]
src/segnalazioni.h [new file with mode: 0644]
src/segnalazioniqe.c [new file with mode: 0644]
src/segnalazioniqe.h [new file with mode: 0644]

index edac7ab96804c05e04465c0730ca3064eb79e360..79ceade53dbac6f6ddcc2b4b766806e8984d0445 100644 (file)
@@ -1,6 +1,8 @@
 formdir = $(datadir)/$(PACKAGE)/form
 
 form_DATA = \
-            categoria.form
+            categoria.form \
+            segnalazione.form \
+            segnalazioneallegato.form
 
 EXTRA_DIST = $(form_DATA)
diff --git a/data/bcity_be/form/segnalazione.form b/data/bcity_be/form/segnalazione.form
new file mode 100644 (file)
index 0000000..770b17d
--- /dev/null
@@ -0,0 +1,39 @@
+<?xml version="1.0"?>
+<zakform>
+
+       <element type="zak_form_gtk_form_element_label">
+         <name>id</name>
+         <type>integer</type>
+         <is-key>TRUE</is-key>
+         <widget>label53</widget>
+         <label>label52</label>
+       </element>
+
+       <element type="zak_form_gtk_form_element_decoder">
+         <name>id_categorie</name>
+         <type>integer</type>
+         <widget>zakgtkdecoder5</widget>
+         <label>label56</label>
+         <format thousands_separator=""></format>
+         <filter type="zak_form_element_filter_trim"></filter>
+         <validator type="zak_form_element_validator_notempty">0</validator>
+       </element>
+
+       <element type="zak_form_gtk_form_element_entry">
+         <name>descrizione</name>
+         <type>string</type>
+         <widget>entry16</widget>
+         <label>label54</label>
+         <filter type="zak_form_element_filter_trim"></filter>
+         <validator type="zak_form_element_validator_notempty"></validator>
+       </element>
+
+       <element type="zak_form_gtk_form_element_textview">
+         <name>note</name>
+         <type>string</type>
+         <widget>textview5</widget>
+         <label>label63</label>
+         <filter type="zak_form_element_filter_trim"></filter>
+       </element>
+
+</zakform>
diff --git a/data/bcity_be/form/segnalazioneallegato.form b/data/bcity_be/form/segnalazioneallegato.form
new file mode 100644 (file)
index 0000000..ee7bd68
--- /dev/null
@@ -0,0 +1,51 @@
+<?xml version="1.0"?>
+<zakform>
+
+       <element type="zak_form_gtk_form_element_label">
+         <name>id</name>
+         <type>integer</type>
+         <is-key>TRUE</is-key>
+         <widget>label65</widget>
+         <format thousands_separator=""></format>
+       </element>
+
+       <element type="zak_form_gtk_form_element_label">
+         <name>id_articoli</name>
+         <type>integer</type>
+         <widget>label70</widget>
+         <format thousands_separator=""></format>
+       </element>
+
+       <element type="zak_form_gtk_form_element_entry">
+         <name>titolo</name>
+         <type>string</type>
+         <widget>entry21</widget>
+         <label>label71</label>
+         <validator type="zak_form_element_validator_notempty"></validator>
+       </element>
+
+       <element type="zak_form_gtk_form_element_entry">
+         <name>descrizione</name>
+         <type>string</type>
+         <widget>entry19</widget>
+         <label>label66</label>
+       </element>
+
+       <element type="zak_form_gtk_form_element_entry">
+         <name>data_documento</name>
+         <type>date</type>
+         <widget>entry20</widget>
+         <label>label72</label>
+         <format>%d/%m/%Y</format>
+         <validator type="zak_form_element_validator_date">%d/%m/%Y</validator>
+       </element>
+
+       <element type="zak_form_gtk_form_element_textview">
+         <name>note</name>
+         <type>string</type>
+         <widget>textview6</widget>
+         <label>label73</label>
+         <filter type="zak_form_element_filter_trim"></filter>
+       </element>
+
+</zakform>
index 32c2de3d1c177f8e2ae67af44c6a48b2dfbd4b29..6cf8f1d17d068f1f392dc8eb0731f894f52847e9 100644 (file)
                         <property name="can_focus">False</property>
                         <property name="label" translatable="yes">_Segnalazioni</property>
                         <property name="use_underline">True</property>
-                        <signal name="activate" handler="on_mnu_view_ordini_activate" swapped="no"/>
+                        <signal name="activate" handler="on_mnu_view_segnalazioni_activate" swapped="no"/>
                       </object>
                     </child>
                   </object>
       </object>
     </child>
   </object>
+  <object class="GtkWindow" id="w_segnalazione">
+    <property name="can_focus">False</property>
+    <property name="title" translatable="yes">Segnalazione - B-City</property>
+    <property name="modal">True</property>
+    <property name="window_position">center-on-parent</property>
+    <property name="default_width">550</property>
+    <property name="destroy_with_parent">True</property>
+    <child>
+      <object class="GtkBox" id="vbox13">
+        <property name="visible">True</property>
+        <property name="can_focus">False</property>
+        <property name="border_width">5</property>
+        <property name="orientation">vertical</property>
+        <property name="spacing">5</property>
+        <child>
+          <object class="GtkGrid" id="table8">
+            <property name="visible">True</property>
+            <property name="can_focus">False</property>
+            <property name="hexpand">True</property>
+            <property name="vexpand">True</property>
+            <property name="row_spacing">5</property>
+            <property name="column_spacing">5</property>
+            <child>
+              <object class="GtkLabel" id="label52">
+                <property name="visible">True</property>
+                <property name="can_focus">False</property>
+                <property name="label" translatable="yes">ID</property>
+                <property name="xalign">0</property>
+              </object>
+              <packing>
+                <property name="left_attach">0</property>
+                <property name="top_attach">0</property>
+              </packing>
+            </child>
+            <child>
+              <object class="GtkLabel" id="label53">
+                <property name="visible">True</property>
+                <property name="can_focus">False</property>
+                <property name="hexpand">True</property>
+                <property name="label" translatable="yes">lbl_id</property>
+                <property name="xalign">0</property>
+              </object>
+              <packing>
+                <property name="left_attach">1</property>
+                <property name="top_attach">0</property>
+              </packing>
+            </child>
+            <child>
+              <object class="ZakGtkDecoder" id="zakgtkdecoder5">
+                <property name="visible">True</property>
+                <property name="can_focus">False</property>
+              </object>
+              <packing>
+                <property name="left_attach">1</property>
+                <property name="top_attach">1</property>
+              </packing>
+            </child>
+            <child>
+              <object class="GtkLabel" id="label56">
+                <property name="visible">True</property>
+                <property name="can_focus">False</property>
+                <property name="label" translatable="yes">Categoria</property>
+                <property name="xalign">0</property>
+              </object>
+              <packing>
+                <property name="left_attach">0</property>
+                <property name="top_attach">1</property>
+              </packing>
+            </child>
+            <child>
+              <object class="GtkLabel" id="label54">
+                <property name="visible">True</property>
+                <property name="can_focus">False</property>
+                <property name="label" translatable="yes">Descrizione</property>
+                <property name="xalign">0</property>
+              </object>
+              <packing>
+                <property name="left_attach">0</property>
+                <property name="top_attach">2</property>
+              </packing>
+            </child>
+            <child>
+              <object class="GtkEntry" id="entry16">
+                <property name="visible">True</property>
+                <property name="can_focus">True</property>
+                <property name="hexpand">True</property>
+                <property name="max_length">100</property>
+                <property name="invisible_char">•</property>
+                <property name="primary_icon_activatable">False</property>
+                <property name="secondary_icon_activatable">False</property>
+              </object>
+              <packing>
+                <property name="left_attach">1</property>
+                <property name="top_attach">2</property>
+              </packing>
+            </child>
+            <child>
+              <object class="GtkNotebook" id="notebook2">
+                <property name="visible">True</property>
+                <property name="can_focus">True</property>
+                <property name="hexpand">True</property>
+                <property name="vexpand">True</property>
+                <child>
+                  <object class="GtkScrolledWindow" id="scrolledwindow15">
+                    <property name="visible">True</property>
+                    <property name="can_focus">True</property>
+                    <property name="margin_top">5</property>
+                    <property name="margin_bottom">5</property>
+                    <property name="shadow_type">etched-in</property>
+                    <child>
+                      <object class="GtkTextView" id="textview5">
+                        <property name="visible">True</property>
+                        <property name="can_focus">True</property>
+                      </object>
+                    </child>
+                  </object>
+                </child>
+                <child type="tab">
+                  <object class="GtkLabel" id="label63">
+                    <property name="visible">True</property>
+                    <property name="can_focus">False</property>
+                    <property name="label" translatable="yes">Note</property>
+                  </object>
+                  <packing>
+                    <property name="tab_fill">False</property>
+                  </packing>
+                </child>
+                <child>
+                  <object class="GtkBox" id="hbox6">
+                    <property name="visible">True</property>
+                    <property name="can_focus">False</property>
+                    <property name="margin_top">5</property>
+                    <property name="margin_bottom">5</property>
+                    <property name="spacing">5</property>
+                    <child>
+                      <object class="GtkScrolledWindow" id="scrolledwindow18">
+                        <property name="visible">True</property>
+                        <property name="can_focus">True</property>
+                        <property name="shadow_type">etched-in</property>
+                        <child>
+                          <placeholder/>
+                        </child>
+                      </object>
+                      <packing>
+                        <property name="expand">True</property>
+                        <property name="fill">True</property>
+                        <property name="position">0</property>
+                      </packing>
+                    </child>
+                    <child>
+                      <object class="GtkButtonBox" id="vbuttonbox6">
+                        <property name="visible">True</property>
+                        <property name="can_focus">False</property>
+                        <property name="orientation">vertical</property>
+                        <property name="spacing">5</property>
+                        <property name="layout_style">start</property>
+                        <child>
+                          <object class="GtkButton" id="button94">
+                            <property name="label">gtk-new</property>
+                            <property name="use_action_appearance">False</property>
+                            <property name="visible">True</property>
+                            <property name="can_focus">True</property>
+                            <property name="receives_default">True</property>
+                            <property name="use_stock">True</property>
+                          </object>
+                          <packing>
+                            <property name="expand">False</property>
+                            <property name="fill">False</property>
+                            <property name="position">0</property>
+                          </packing>
+                        </child>
+                        <child>
+                          <object class="GtkButton" id="button95">
+                            <property name="label">gtk-edit</property>
+                            <property name="use_action_appearance">False</property>
+                            <property name="visible">True</property>
+                            <property name="can_focus">True</property>
+                            <property name="receives_default">True</property>
+                            <property name="use_stock">True</property>
+                          </object>
+                          <packing>
+                            <property name="expand">False</property>
+                            <property name="fill">False</property>
+                            <property name="position">1</property>
+                          </packing>
+                        </child>
+                        <child>
+                          <object class="GtkButton" id="button96">
+                            <property name="label">gtk-delete</property>
+                            <property name="use_action_appearance">False</property>
+                            <property name="visible">True</property>
+                            <property name="can_focus">True</property>
+                            <property name="receives_default">True</property>
+                            <property name="use_stock">True</property>
+                          </object>
+                          <packing>
+                            <property name="expand">False</property>
+                            <property name="fill">False</property>
+                            <property name="position">2</property>
+                          </packing>
+                        </child>
+                        <child>
+                          <object class="GtkButton" id="button97">
+                            <property name="label">gtk-open</property>
+                            <property name="visible">True</property>
+                            <property name="can_focus">True</property>
+                            <property name="receives_default">True</property>
+                            <property name="use_stock">True</property>
+                          </object>
+                          <packing>
+                            <property name="expand">True</property>
+                            <property name="fill">True</property>
+                            <property name="position">3</property>
+                          </packing>
+                        </child>
+                      </object>
+                      <packing>
+                        <property name="expand">False</property>
+                        <property name="fill">True</property>
+                        <property name="position">1</property>
+                      </packing>
+                    </child>
+                  </object>
+                  <packing>
+                    <property name="position">1</property>
+                  </packing>
+                </child>
+                <child type="tab">
+                  <object class="GtkLabel" id="label62">
+                    <property name="visible">True</property>
+                    <property name="can_focus">False</property>
+                    <property name="label" translatable="yes">Allegati</property>
+                  </object>
+                  <packing>
+                    <property name="position">1</property>
+                    <property name="tab_fill">False</property>
+                  </packing>
+                </child>
+              </object>
+              <packing>
+                <property name="left_attach">0</property>
+                <property name="top_attach">8</property>
+                <property name="width">2</property>
+              </packing>
+            </child>
+            <child>
+              <placeholder/>
+            </child>
+            <child>
+              <placeholder/>
+            </child>
+            <child>
+              <placeholder/>
+            </child>
+            <child>
+              <placeholder/>
+            </child>
+            <child>
+              <placeholder/>
+            </child>
+            <child>
+              <placeholder/>
+            </child>
+            <child>
+              <placeholder/>
+            </child>
+            <child>
+              <placeholder/>
+            </child>
+            <child>
+              <placeholder/>
+            </child>
+            <child>
+              <placeholder/>
+            </child>
+          </object>
+          <packing>
+            <property name="expand">True</property>
+            <property name="fill">True</property>
+            <property name="position">0</property>
+          </packing>
+        </child>
+        <child>
+          <object class="GtkButtonBox" id="hbuttonbox18">
+            <property name="visible">True</property>
+            <property name="can_focus">False</property>
+            <property name="hexpand">True</property>
+            <property name="spacing">5</property>
+            <property name="layout_style">end</property>
+            <child>
+              <object class="GtkButton" id="button80">
+                <property name="label">gtk-cancel</property>
+                <property name="visible">True</property>
+                <property name="can_focus">True</property>
+                <property name="receives_default">True</property>
+                <property name="use_stock">True</property>
+              </object>
+              <packing>
+                <property name="expand">False</property>
+                <property name="fill">False</property>
+                <property name="position">0</property>
+              </packing>
+            </child>
+            <child>
+              <object class="GtkButton" id="button81">
+                <property name="label">gtk-save</property>
+                <property name="visible">True</property>
+                <property name="can_focus">True</property>
+                <property name="receives_default">True</property>
+                <property name="use_stock">True</property>
+              </object>
+              <packing>
+                <property name="expand">False</property>
+                <property name="fill">False</property>
+                <property name="position">1</property>
+              </packing>
+            </child>
+            <child>
+              <object class="GtkButton" id="button82">
+                <property name="label" translatable="yes">Salva e _chiudi</property>
+                <property name="visible">True</property>
+                <property name="can_focus">True</property>
+                <property name="receives_default">True</property>
+                <property name="use_underline">True</property>
+              </object>
+              <packing>
+                <property name="expand">False</property>
+                <property name="fill">False</property>
+                <property name="position">2</property>
+              </packing>
+            </child>
+          </object>
+          <packing>
+            <property name="expand">False</property>
+            <property name="fill">True</property>
+            <property name="position">1</property>
+          </packing>
+        </child>
+      </object>
+    </child>
+  </object>
+  <object class="GtkWindow" id="w_segnalazione_allegato">
+    <property name="can_focus">False</property>
+    <property name="title" translatable="yes">Allegato della segnalazione - B-City</property>
+    <property name="modal">True</property>
+    <property name="default_width">500</property>
+    <property name="default_height">300</property>
+    <property name="destroy_with_parent">True</property>
+    <child>
+      <object class="GtkBox" id="vbox15">
+        <property name="visible">True</property>
+        <property name="can_focus">False</property>
+        <property name="border_width">5</property>
+        <property name="orientation">vertical</property>
+        <property name="spacing">5</property>
+        <child>
+          <object class="GtkGrid" id="table9">
+            <property name="visible">True</property>
+            <property name="can_focus">False</property>
+            <property name="hexpand">True</property>
+            <property name="vexpand">True</property>
+            <property name="row_spacing">5</property>
+            <property name="column_spacing">5</property>
+            <child>
+              <object class="GtkLabel" id="label65">
+                <property name="can_focus">False</property>
+                <property name="no_show_all">True</property>
+                <property name="label" translatable="yes">lbl_id</property>
+              </object>
+              <packing>
+                <property name="left_attach">0</property>
+                <property name="top_attach">5</property>
+              </packing>
+            </child>
+            <child>
+              <object class="GtkLabel" id="label66">
+                <property name="visible">True</property>
+                <property name="can_focus">False</property>
+                <property name="label" translatable="yes">Descrizione</property>
+                <property name="xalign">0</property>
+              </object>
+              <packing>
+                <property name="left_attach">0</property>
+                <property name="top_attach">1</property>
+              </packing>
+            </child>
+            <child>
+              <object class="GtkEntry" id="entry19">
+                <property name="visible">True</property>
+                <property name="can_focus">True</property>
+                <property name="hexpand">True</property>
+                <property name="max_length">255</property>
+                <property name="invisible_char">•</property>
+                <property name="activates_default">True</property>
+                <property name="primary_icon_activatable">False</property>
+                <property name="secondary_icon_activatable">False</property>
+              </object>
+              <packing>
+                <property name="left_attach">1</property>
+                <property name="top_attach">1</property>
+              </packing>
+            </child>
+            <child>
+              <object class="GtkScrolledWindow" id="scrolledwindow17">
+                <property name="visible">True</property>
+                <property name="can_focus">True</property>
+                <property name="hexpand">True</property>
+                <property name="vexpand">True</property>
+                <property name="shadow_type">etched-in</property>
+                <child>
+                  <object class="GtkTextView" id="textview6">
+                    <property name="visible">True</property>
+                    <property name="can_focus">True</property>
+                  </object>
+                </child>
+              </object>
+              <packing>
+                <property name="left_attach">1</property>
+                <property name="top_attach">3</property>
+              </packing>
+            </child>
+            <child>
+              <object class="GtkEntry" id="entry20">
+                <property name="visible">True</property>
+                <property name="can_focus">True</property>
+                <property name="hexpand">True</property>
+                <property name="max_length">10</property>
+                <property name="invisible_char">•</property>
+                <property name="activates_default">True</property>
+                <property name="primary_icon_activatable">False</property>
+                <property name="secondary_icon_activatable">False</property>
+              </object>
+              <packing>
+                <property name="left_attach">1</property>
+                <property name="top_attach">2</property>
+              </packing>
+            </child>
+            <child>
+              <object class="GtkEntry" id="entry21">
+                <property name="visible">True</property>
+                <property name="can_focus">True</property>
+                <property name="hexpand">True</property>
+                <property name="max_length">255</property>
+                <property name="invisible_char">•</property>
+                <property name="activates_default">True</property>
+                <property name="primary_icon_activatable">False</property>
+                <property name="secondary_icon_activatable">False</property>
+              </object>
+              <packing>
+                <property name="left_attach">1</property>
+                <property name="top_attach">0</property>
+              </packing>
+            </child>
+            <child>
+              <object class="GtkFrame" id="frame1">
+                <property name="visible">True</property>
+                <property name="can_focus">False</property>
+                <property name="hexpand">True</property>
+                <property name="label_xalign">0</property>
+                <child>
+                  <object class="GtkAlignment" id="alignment1">
+                    <property name="visible">True</property>
+                    <property name="can_focus">False</property>
+                    <property name="hexpand">True</property>
+                    <property name="top_padding">5</property>
+                    <property name="bottom_padding">5</property>
+                    <property name="left_padding">5</property>
+                    <property name="right_padding">5</property>
+                    <child>
+                      <placeholder/>
+                    </child>
+                  </object>
+                </child>
+                <child type="label">
+                  <object class="GtkLabel" id="label69">
+                    <property name="visible">True</property>
+                    <property name="can_focus">False</property>
+                    <property name="label" translatable="yes">&lt;b&gt;File&lt;/b&gt;</property>
+                    <property name="use_markup">True</property>
+                  </object>
+                </child>
+              </object>
+              <packing>
+                <property name="left_attach">0</property>
+                <property name="top_attach">4</property>
+                <property name="width">2</property>
+              </packing>
+            </child>
+            <child>
+              <object class="GtkLabel" id="label70">
+                <property name="can_focus">False</property>
+                <property name="no_show_all">True</property>
+                <property name="hexpand">True</property>
+                <property name="label" translatable="yes">lbl_id_segnalazioni</property>
+              </object>
+              <packing>
+                <property name="left_attach">1</property>
+                <property name="top_attach">5</property>
+              </packing>
+            </child>
+            <child>
+              <object class="GtkLabel" id="label71">
+                <property name="visible">True</property>
+                <property name="can_focus">False</property>
+                <property name="label" translatable="yes">Titolo</property>
+                <property name="xalign">0</property>
+              </object>
+              <packing>
+                <property name="left_attach">0</property>
+                <property name="top_attach">0</property>
+              </packing>
+            </child>
+            <child>
+              <object class="GtkLabel" id="label72">
+                <property name="visible">True</property>
+                <property name="can_focus">False</property>
+                <property name="label" translatable="yes">Data documento</property>
+                <property name="xalign">0</property>
+              </object>
+              <packing>
+                <property name="left_attach">0</property>
+                <property name="top_attach">2</property>
+              </packing>
+            </child>
+            <child>
+              <object class="GtkLabel" id="label73">
+                <property name="visible">True</property>
+                <property name="can_focus">False</property>
+                <property name="label" translatable="yes">Note</property>
+                <property name="xalign">0</property>
+                <property name="yalign">0</property>
+              </object>
+              <packing>
+                <property name="left_attach">0</property>
+                <property name="top_attach">3</property>
+              </packing>
+            </child>
+          </object>
+          <packing>
+            <property name="expand">True</property>
+            <property name="fill">True</property>
+            <property name="position">0</property>
+          </packing>
+        </child>
+        <child>
+          <object class="GtkButtonBox" id="hbuttonbox21">
+            <property name="visible">True</property>
+            <property name="can_focus">False</property>
+            <property name="hexpand">True</property>
+            <property name="spacing">5</property>
+            <property name="layout_style">end</property>
+            <child>
+              <object class="GtkButton" id="button91">
+                <property name="label">gtk-cancel</property>
+                <property name="visible">True</property>
+                <property name="can_focus">True</property>
+                <property name="receives_default">True</property>
+                <property name="use_stock">True</property>
+              </object>
+              <packing>
+                <property name="expand">False</property>
+                <property name="fill">False</property>
+                <property name="position">0</property>
+              </packing>
+            </child>
+            <child>
+              <object class="GtkButton" id="button92">
+                <property name="label">gtk-save</property>
+                <property name="visible">True</property>
+                <property name="can_focus">True</property>
+                <property name="can_default">True</property>
+                <property name="has_default">True</property>
+                <property name="receives_default">True</property>
+                <property name="use_stock">True</property>
+              </object>
+              <packing>
+                <property name="expand">False</property>
+                <property name="fill">False</property>
+                <property name="position">1</property>
+              </packing>
+            </child>
+            <child>
+              <object class="GtkButton" id="button93">
+                <property name="label" translatable="yes">Salva e _chiudi</property>
+                <property name="visible">True</property>
+                <property name="can_focus">True</property>
+                <property name="receives_default">True</property>
+                <property name="use_underline">True</property>
+              </object>
+              <packing>
+                <property name="expand">True</property>
+                <property name="fill">True</property>
+                <property name="position">2</property>
+              </packing>
+            </child>
+          </object>
+          <packing>
+            <property name="expand">False</property>
+            <property name="fill">True</property>
+            <property name="position">1</property>
+          </packing>
+        </child>
+      </object>
+    </child>
+  </object>
+  <object class="GtkWindow" id="w_segnalazioni">
+    <property name="can_focus">False</property>
+    <property name="title" translatable="yes">Segnalazioni - B-City</property>
+    <property name="modal">True</property>
+    <property name="window_position">center-on-parent</property>
+    <property name="default_width">550</property>
+    <property name="default_height">400</property>
+    <property name="destroy_with_parent">True</property>
+    <child>
+      <object class="GtkBox" id="vbx_segnalazioni">
+        <property name="visible">True</property>
+        <property name="can_focus">False</property>
+        <property name="border_width">5</property>
+        <property name="orientation">vertical</property>
+        <property name="spacing">5</property>
+        <child>
+          <object class="GtkLabel" id="label68">
+            <property name="visible">True</property>
+            <property name="can_focus">False</property>
+            <property name="label" translatable="yes">&lt;b&gt;Segnalazioni&lt;/b&gt;</property>
+            <property name="use_markup">True</property>
+          </object>
+          <packing>
+            <property name="expand">False</property>
+            <property name="fill">True</property>
+            <property name="position">0</property>
+          </packing>
+        </child>
+        <child>
+          <object class="GtkScrolledWindow" id="scrolledwindow16">
+            <property name="visible">True</property>
+            <property name="can_focus">True</property>
+            <property name="shadow_type">etched-in</property>
+            <child>
+              <placeholder/>
+            </child>
+          </object>
+          <packing>
+            <property name="expand">True</property>
+            <property name="fill">True</property>
+            <property name="position">1</property>
+          </packing>
+        </child>
+        <child>
+          <object class="GtkButtonBox" id="hbuttonbox19">
+            <property name="visible">True</property>
+            <property name="can_focus">False</property>
+            <property name="spacing">5</property>
+            <property name="layout_style">end</property>
+            <child>
+              <object class="GtkButton" id="button83">
+                <property name="label">gtk-new</property>
+                <property name="visible">True</property>
+                <property name="can_focus">True</property>
+                <property name="receives_default">True</property>
+                <property name="use_stock">True</property>
+              </object>
+              <packing>
+                <property name="expand">False</property>
+                <property name="fill">False</property>
+                <property name="position">0</property>
+              </packing>
+            </child>
+            <child>
+              <object class="GtkButton" id="button84">
+                <property name="label">gtk-edit</property>
+                <property name="visible">True</property>
+                <property name="can_focus">True</property>
+                <property name="receives_default">True</property>
+                <property name="use_stock">True</property>
+              </object>
+              <packing>
+                <property name="expand">False</property>
+                <property name="fill">False</property>
+                <property name="position">1</property>
+              </packing>
+            </child>
+            <child>
+              <object class="GtkButton" id="button85">
+                <property name="label">gtk-delete</property>
+                <property name="visible">True</property>
+                <property name="can_focus">True</property>
+                <property name="receives_default">True</property>
+                <property name="use_stock">True</property>
+              </object>
+              <packing>
+                <property name="expand">False</property>
+                <property name="fill">False</property>
+                <property name="position">2</property>
+              </packing>
+            </child>
+            <child>
+              <object class="GtkButton" id="button86">
+                <property name="label">gtk-find</property>
+                <property name="visible">True</property>
+                <property name="can_focus">True</property>
+                <property name="receives_default">True</property>
+                <property name="use_stock">True</property>
+              </object>
+              <packing>
+                <property name="expand">True</property>
+                <property name="fill">True</property>
+                <property name="position">3</property>
+              </packing>
+            </child>
+            <child>
+              <object class="GtkButton" id="button87">
+                <property name="label">gtk-cancel</property>
+                <property name="visible">True</property>
+                <property name="can_focus">True</property>
+                <property name="receives_default">True</property>
+                <property name="use_stock">True</property>
+              </object>
+              <packing>
+                <property name="expand">False</property>
+                <property name="fill">False</property>
+                <property name="position">4</property>
+              </packing>
+            </child>
+            <child>
+              <object class="GtkButton" id="button88">
+                <property name="label">gtk-ok</property>
+                <property name="visible">True</property>
+                <property name="can_focus">True</property>
+                <property name="receives_default">True</property>
+                <property name="use_stock">True</property>
+              </object>
+              <packing>
+                <property name="expand">False</property>
+                <property name="fill">False</property>
+                <property name="position">5</property>
+              </packing>
+            </child>
+          </object>
+          <packing>
+            <property name="expand">False</property>
+            <property name="fill">True</property>
+            <property name="position">2</property>
+          </packing>
+        </child>
+      </object>
+    </child>
+  </object>
+  <object class="GtkWindow" id="w_segnalazioni_qe">
+    <property name="can_focus">False</property>
+    <property name="title" translatable="yes">Ricerca segnalazioni - B-City</property>
+    <property name="modal">True</property>
+    <property name="window_position">center-on-parent</property>
+    <property name="default_width">550</property>
+    <property name="destroy_with_parent">True</property>
+    <child>
+      <object class="GtkBox" id="vbox14">
+        <property name="visible">True</property>
+        <property name="can_focus">False</property>
+        <property name="border_width">5</property>
+        <property name="orientation">vertical</property>
+        <property name="spacing">5</property>
+        <child>
+          <placeholder/>
+        </child>
+        <child>
+          <object class="GtkSeparator" id="separator6">
+            <property name="visible">True</property>
+            <property name="can_focus">False</property>
+          </object>
+          <packing>
+            <property name="expand">False</property>
+            <property name="fill">True</property>
+            <property name="position">1</property>
+          </packing>
+        </child>
+        <child>
+          <object class="GtkButtonBox" id="hbuttonbox20">
+            <property name="visible">True</property>
+            <property name="can_focus">False</property>
+            <property name="hexpand">True</property>
+            <property name="spacing">5</property>
+            <property name="layout_style">end</property>
+            <child>
+              <object class="GtkButton" id="button89">
+                <property name="label">gtk-cancel</property>
+                <property name="visible">True</property>
+                <property name="can_focus">True</property>
+                <property name="receives_default">True</property>
+                <property name="use_stock">True</property>
+              </object>
+              <packing>
+                <property name="expand">False</property>
+                <property name="fill">False</property>
+                <property name="position">0</property>
+              </packing>
+            </child>
+            <child>
+              <object class="GtkButton" id="button90">
+                <property name="label">gtk-ok</property>
+                <property name="visible">True</property>
+                <property name="can_focus">True</property>
+                <property name="receives_default">True</property>
+                <property name="use_stock">True</property>
+              </object>
+              <packing>
+                <property name="expand">False</property>
+                <property name="fill">False</property>
+                <property name="position">1</property>
+              </packing>
+            </child>
+          </object>
+          <packing>
+            <property name="expand">False</property>
+            <property name="fill">True</property>
+            <property name="position">2</property>
+          </packing>
+        </child>
+      </object>
+    </child>
+  </object>
 </interface>
index 095c2f23176f2ac83a3d83808e41588fef66b211..45f79afd6716672679d6a45a9f43a33ae5f52080 100644 (file)
@@ -1,5 +1,6 @@
 queryeditordir = $(datadir)/$(PACKAGE)/queryeditor
 
-queryeditor_DATA =
+queryeditor_DATA = \
+                   segnalazioni.xml
 
 EXTRA_DIST = $(queryeditor_DATA)
diff --git a/data/bcity_be/query_editor/segnalazioni.xml b/data/bcity_be/query_editor/segnalazioni.xml
new file mode 100644 (file)
index 0000000..e0720ad
--- /dev/null
@@ -0,0 +1,41 @@
+<gdaex_query_editor>
+
+       <tables>
+               <table>
+                       <name>segnalazioni</name>
+                       <name_visible>Segnalazioni</name_visible>
+               </table>
+       </tables>
+
+       <fields table="segnalazioni">
+               <field>
+                       <name>id</name>
+                       <name_visible>ID</name_visible>
+                       <type>integer</type>
+                       <always_showed>true</always_showed>
+                       <available_where_type>equal</available_where_type>
+               </field>
+               <field>
+                       <name>id_categorie</name>
+                       <name_visible>Categoria</name_visible>
+                       <type>integer</type>
+                       <always_showed>true</always_showed>
+                       <available_where_type>equal</available_where_type>
+                       <widget type="zak_gtk_decoder_gdaex_qe"></widget>
+               </field>
+               <field>
+                       <name>descrizione</name>
+                       <name_visible>Descrizione</name_visible>
+                       <type>text</type>
+                       <always_showed>true</always_showed>
+                       <available_where_type>string</available_where_type>
+               </field>
+               <field>
+                       <name>note</name>
+                       <name_visible>Note</name_visible>
+                       <type>text</type>
+                       <available_where_type>string</available_where_type>
+               </field>
+       </fields>
+
+</gdaex_query_editor>
index 3d69a4914d41e62ffde11927aa86f8dd33f80f4f..9d4efc7ae66d5c1acfa272eb7baba1e48d91c260 100644 (file)
@@ -40,6 +40,25 @@ CREATE TABLE configurazioni (
 );
 
 
+--
+-- Name: segnalazione_allegati; Type: TABLE; Schema: public; Owner: -
+--
+
+CREATE TABLE segnalazione_allegati (
+    id integer NOT NULL,
+    id_segnalazioni integer,
+    titolo character varying(255) DEFAULT ''::character varying,
+    descrizione character varying DEFAULT ''::bpchar,
+    data_documento date,
+    note text DEFAULT ''::text,
+    percorso character varying(255) DEFAULT ''::character varying,
+    contenuto oid,
+    data_file timestamp without time zone,
+    dimensione_file bigint,
+    status character varying(1) DEFAULT ''::character varying
+);
+
+
 --
 -- Name: segnalazioni; Type: TABLE; Schema: public; Owner: -
 --
@@ -50,7 +69,9 @@ CREATE TABLE segnalazioni (
     latitudine double precision,
     longitudine double precision,
     id_categorie integer DEFAULT 0,
-    status character varying(1) DEFAULT ''::character varying
+    status character varying(1) DEFAULT ''::character varying,
+    descrizione character varying(255) DEFAULT ''::character varying,
+    note text DEFAULT ''::text
 );
 
 
@@ -82,6 +103,14 @@ ALTER TABLE ONLY configurazioni
     ADD CONSTRAINT configurazioni_pkey PRIMARY KEY (id);
 
 
+--
+-- Name: segnalazione_allegati_pkey; Type: CONSTRAINT; Schema: public; Owner: -
+--
+
+ALTER TABLE ONLY segnalazione_allegati
+    ADD CONSTRAINT segnalazione_allegati_pkey PRIMARY KEY (id);
+
+
 --
 -- Name: segnalazioni_pkey; Type: CONSTRAINT; Schema: public; Owner: -
 --
index 1ebbf91f11a7462a5feee967a51286d40d27bcd4..94821198f4cc214bbd869e10544b122c25f406c1 100644 (file)
@@ -28,7 +28,15 @@ bcity_be_SOURCES = \
                    categorie.c \
                    categorie.h \
                    commons.h \
-                   main.c
+                   main.c \
+                   segnalazione.c \
+                   segnalazione.h \
+                   segnalazioneallegato.c \
+                   segnalazioneallegato.h \
+                   segnalazioni.c \
+                   segnalazioni.h \
+                   segnalazioniqe.c \
+                   segnalazioniqe.h
 
 if PLATFORM_WIN32
 EXTRALDFLAGS=-mconsole -mwindows
index 6cebf23358b802d8f2fa532a5658e4e9aac12482..aafe958bf976faa1b87cc048b4cb969ecc8fcee7 100644 (file)
@@ -37,6 +37,7 @@
 
 #include "commons.h"
 #include "categorie.h"
+#include "segnalazioni.h"
 
 static BCityBECommons *commons;
 
@@ -129,18 +130,18 @@ on_mnu_tabelle_categorie_activate (GtkMenuItem *menuitem,
        main_set_vbx_body_child (G_OBJECT (a), vbx);
 }
 
-/* G_MODULE_EXPORT void */
-/* on_mnu_view_ordini_activate (GtkMenuItem *menuitem, */
-/*                             gpointer user_data) */
-/* { */
-/*     GtkWidget *vbx; */
+G_MODULE_EXPORT void
+on_mnu_view_segnalazioni_activate (GtkMenuItem *menuitem,
+                            gpointer user_data)
+{
+       GtkWidget *vbx;
 
-/*     Ordini *a = ordini_new (commons, FALSE); */
+       Segnalazioni *a = segnalazioni_new (commons, FALSE);
 
-/*     vbx = ordini_get_widget (a); */
+       vbx = segnalazioni_get_widget (a);
 
-/*     main_set_vbx_body_child (G_OBJECT (a), vbx); */
-/* } */
+       main_set_vbx_body_child (G_OBJECT (a), vbx);
+}
 
 G_MODULE_EXPORT void
 on_mnu_help_about_activate (GtkMenuItem *menuitem,
diff --git a/src/segnalazione.c b/src/segnalazione.c
new file mode 100644 (file)
index 0000000..16b452d
--- /dev/null
@@ -0,0 +1,733 @@
+/*
+ * Copyright (C) 2016 Andrea Zagli <azagli@libero.it>
+ *
+ * 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 <config.h>
+#endif
+
+#include <gdk/gdk.h>
+
+#include <libgdaexgrid/libgdaexgrid.h>
+#include <libzakgtkdecoder/libzakgtkdecoder.h>
+#include <libzakform/libzakform.h>
+#include <libzakformgtk/libzakformgtk.h>
+#include <libzakformgdaex/libzakformgdaex.h>
+#include <libzakformgtkdecoder/libzakformgtkdecoder.h>
+#include <libsolipa/libsolipa.h>
+
+#include "categoria.h"
+#include "categorie.h"
+#include "segnalazione.h"
+#include "segnalazioneallegato.h"
+
+static void segnalazione_class_init (SegnalazioneClass *klass);
+static void segnalazione_init (Segnalazione *segnalazione);
+
+static void segnalazione_gestione_permessi (Segnalazione *segnalazione);
+
+static void segnalazione_carica (Segnalazione *segnalazione);
+static void segnalazione_salva (Segnalazione *segnalazione, gboolean chiudi);
+
+static void segnalazione_carica_allegati (Segnalazione *segnalazione);
+
+static void segnalazione_allegati_modifica (Segnalazione *segnalazione);
+
+static gboolean segnalazione_conferma_chiusura (Segnalazione *segnalazione);
+
+static void segnalazione_on_categoria_selezionato (gpointer instance, guint id, gpointer user_data);
+static gchar *segnalazione_on_categoria_decode (gpointer instance, gchar *key, gpointer user_data);
+
+static void segnalazione_set_property (GObject *object,
+                                     guint property_id,
+                                     const GValue *value,
+                                     GParamSpec *pspec);
+static void segnalazione_get_property (GObject *object,
+                                     guint property_id,
+                                     GValue *value,
+                                     GParamSpec *pspec);
+
+static void segnalazione_on_allegati_aggiornato (gpointer instance, gpointer user_data);
+
+static gboolean segnalazione_on_key_release_event (GtkWidget *widget,
+                            GdkEventKey *event,
+                            gpointer user_data);
+static gboolean segnalazione_on_w_segnalazione_delete_event (GtkWidget *widget,
+                               GdkEvent *event,
+                               gpointer user_data);
+
+static void segnalazione_on_btn_categoria_browse_clicked (GtkButton *button,
+                                    gpointer user_data);
+
+static void segnalazione_on_btn_allegati_nuovo_clicked (GtkButton *button,
+                      gpointer user_data);
+static void segnalazione_on_btn_allegati_modifica_clicked (GtkButton *button,
+                      gpointer user_data);
+static void segnalazione_on_btn_allegati_elimina_clicked (GtkButton *button,
+                        gpointer user_data);
+static void segnalazione_on_btn_allegati_apri_clicked (GtkButton *button,
+                        gpointer user_data);
+static void segnalazione_on_trv_allegati_row_activated (GtkTreeView *tree_view,
+                                                            GtkTreePath *tree_path,
+                                                            GtkTreeViewColumn *column,
+                                                            gpointer user_data);
+
+static void segnalazione_on_btn_annulla_clicked (GtkButton *button,
+                                    gpointer user_data);
+static void segnalazione_on_btn_salva_clicked (GtkButton *button,
+                                  gpointer user_data);
+static void segnalazione_on_btn_salvachiudi_clicked (GtkButton *button,
+                                  gpointer user_data);
+
+#define SEGNALAZIONE_GET_PRIVATE(obj) (G_TYPE_INSTANCE_GET_PRIVATE ((obj), TYPE_SEGNALAZIONE, SegnalazionePrivate))
+
+typedef struct _SegnalazionePrivate SegnalazionePrivate;
+struct _SegnalazionePrivate
+       {
+               BCityBECommons *commons;
+
+               ZakFormGtkForm *form;
+               ZakFormGdaexProvider *form_provider;
+
+               GtkWidget *w;
+
+               GObject *lbl_id;
+
+               GdaExGrid *grid_allegati;
+               GtkWidget *wgrid_allegati;
+               GtkTreeSelection *selection_allegati;
+               GtkTreeStore *tstore_allegati;
+
+               gint id;
+       };
+
+G_DEFINE_TYPE (Segnalazione, segnalazione, G_TYPE_OBJECT)
+
+static void
+segnalazione_class_init (SegnalazioneClass *klass)
+{
+       GObjectClass *object_class = G_OBJECT_CLASS (klass);
+
+       g_type_class_add_private (object_class, sizeof (SegnalazionePrivate));
+
+       object_class->set_property = segnalazione_set_property;
+       object_class->get_property = segnalazione_get_property;
+
+       /**
+        * Segnalazione::aggiornato:
+        * @iva:
+        *
+        */
+       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
+segnalazione_init (Segnalazione *segnalazione)
+{
+       SegnalazionePrivate *priv = SEGNALAZIONE_GET_PRIVATE (segnalazione);
+}
+
+/**
+ * segnalazione_new:
+ * @commons:
+ * @id:
+ *
+ * Returns: the newly created #Segnalazione object.
+ */
+Segnalazione
+*segnalazione_new (BCityBECommons *commons, gint id)
+{
+       GError *error;
+
+       GdaExGridColumn *gcol;
+
+       Segnalazione *a = SEGNALAZIONE (g_object_new (segnalazione_get_type (), NULL));
+
+       SegnalazionePrivate *priv = SEGNALAZIONE_GET_PRIVATE (a);
+
+       priv->commons = commons;
+
+       error = NULL;
+       gtk_builder_add_objects_from_file (priv->commons->gtkbuilder, priv->commons->guifile,
+                                          g_strsplit ("w_segnalazione", "|", -1),
+                                          &error);
+       if (error != NULL)
+               {
+                       g_warning ("Errore: %s.", error->message);
+                       return NULL;
+               }
+
+       priv->form = zak_form_gtk_form_new ();
+       zak_form_gtk_form_set_gtkbuilder (priv->form, priv->commons->gtkbuilder);
+       zak_form_form_load_from_file (ZAK_FORM_FORM (priv->form), g_build_filename (priv->commons->formdir, "segnalazione.form", NULL));
+
+       priv->form_provider = zak_form_gdaex_provider_new (priv->commons->gdaex, "segnalazioni");
+
+       priv->w = GTK_WIDGET (gtk_builder_get_object (priv->commons->gtkbuilder, "w_segnalazione"));
+
+       priv->lbl_id = gtk_builder_get_object (priv->commons->gtkbuilder,
+                                                                                  "label53");
+
+       /* creo la gdaexgrid degli allegati */
+       priv->grid_allegati = gdaex_grid_new ();
+       gdaex_grid_set_solipa (priv->grid_allegati, priv->commons->solipa);
+       gdaex_grid_set_title (priv->grid_allegati, "Allegati");
+
+       gcol = gdaex_grid_column_new ("ID", "id", G_TYPE_INT, FALSE, TRUE, TRUE, TRUE, 0);
+       gdaex_grid_add_column (priv->grid_allegati, gcol);
+
+       gcol = gdaex_grid_column_new_defaults ("Titolo", "titolo", G_TYPE_STRING);
+       gdaex_grid_add_column (priv->grid_allegati, gcol);
+
+       gcol = gdaex_grid_column_new_defaults ("Descrizione", "descrizione", G_TYPE_STRING);
+       gdaex_grid_add_column (priv->grid_allegati, gcol);
+
+       priv->wgrid_allegati = gdaex_grid_get_widget (priv->grid_allegati);
+       gtk_container_add (GTK_CONTAINER (gtk_builder_get_object (priv->commons->gtkbuilder, "scrolledwindow18")), priv->wgrid_allegati);
+       gtk_widget_show (priv->wgrid_allegati);
+
+       priv->selection_allegati = gtk_tree_view_get_selection (GTK_TREE_VIEW (priv->wgrid_allegati));
+       priv->tstore_allegati = GTK_TREE_STORE (gtk_tree_view_get_model (GTK_TREE_VIEW (priv->wgrid_allegati)));
+
+       g_signal_connect (priv->wgrid_allegati,
+                         "row-activated", G_CALLBACK (segnalazione_on_trv_allegati_row_activated), (gpointer)a);
+
+       g_signal_connect (G_OBJECT (gtk_builder_get_object (priv->commons->gtkbuilder, "button94")),
+                         "clicked", G_CALLBACK (segnalazione_on_btn_allegati_nuovo_clicked), (gpointer)a);
+       g_signal_connect (G_OBJECT (gtk_builder_get_object (priv->commons->gtkbuilder, "button95")),
+                         "clicked", G_CALLBACK (segnalazione_on_btn_allegati_modifica_clicked), (gpointer)a);
+       g_signal_connect (G_OBJECT (gtk_builder_get_object (priv->commons->gtkbuilder, "button96")),
+                         "clicked", G_CALLBACK (segnalazione_on_btn_allegati_elimina_clicked), (gpointer)a);
+       g_signal_connect (G_OBJECT (gtk_builder_get_object (priv->commons->gtkbuilder, "button97")),
+                         "clicked", G_CALLBACK (segnalazione_on_btn_allegati_apri_clicked), (gpointer)a);
+
+       g_signal_connect (priv->w,
+                         "key-release-event", G_CALLBACK (segnalazione_on_key_release_event), (gpointer)a);
+       g_signal_connect (priv->w,
+                         "delete-event", G_CALLBACK (segnalazione_on_w_segnalazione_delete_event), (gpointer)a);
+
+       g_signal_connect (gtk_builder_get_object (priv->commons->gtkbuilder, "zakgtkdecoder5"),
+                         "btn-browse-clicked", G_CALLBACK (segnalazione_on_btn_categoria_browse_clicked), (gpointer)a);
+       g_signal_connect (gtk_builder_get_object (priv->commons->gtkbuilder, "zakgtkdecoder5"),
+                         "decode", G_CALLBACK (segnalazione_on_categoria_decode), (gpointer)a);
+
+       g_signal_connect (gtk_builder_get_object (priv->commons->gtkbuilder, "button80"),
+                         "clicked", G_CALLBACK (segnalazione_on_btn_annulla_clicked), (gpointer)a);
+       g_signal_connect (gtk_builder_get_object (priv->commons->gtkbuilder, "button81"),
+                         "clicked", G_CALLBACK (segnalazione_on_btn_salva_clicked), (gpointer)a);
+       g_signal_connect (gtk_builder_get_object (priv->commons->gtkbuilder, "button82"),
+                         "clicked", G_CALLBACK (segnalazione_on_btn_salvachiudi_clicked), (gpointer)a);
+
+       zak_form_form_clear (ZAK_FORM_FORM (priv->form));
+
+       priv->id = id;
+
+       if (priv->id == 0)
+               {
+                       gtk_label_set_text (GTK_LABEL (priv->lbl_id), "");
+
+                       zak_form_form_set_as_original (ZAK_FORM_FORM (priv->form));
+
+                       gtk_widget_set_sensitive (GTK_WIDGET (gtk_builder_get_object (priv->commons->gtkbuilder, "hbox6")), FALSE);
+               }
+       else
+               {
+                       gtk_label_set_text (GTK_LABEL (priv->lbl_id), g_strdup_printf ("%d", priv->id));
+                       segnalazione_carica (a);
+               }
+
+       segnalazione_gestione_permessi (a);
+
+       return a;
+}
+
+/**
+ * segnalazione_get_widget:
+ * @iva:
+ *
+ */
+GtkWidget
+*segnalazione_get_widget (Segnalazione *segnalazione)
+{
+       SegnalazionePrivate *priv = SEGNALAZIONE_GET_PRIVATE (segnalazione);
+
+       return priv->w;
+}
+
+/**
+ * segnalazione_show:
+ * @segnalazione:
+ * @parent:
+ */
+GtkWidget
+*segnalazione_show (Segnalazione *segnalazione, GtkWindow *parent)
+{
+       GtkWidget *w;
+
+       SegnalazionePrivate *priv = SEGNALAZIONE_GET_PRIVATE (segnalazione);
+
+       w = segnalazione_get_widget (segnalazione);
+       if (parent != NULL)
+               {
+                       gtk_window_set_transient_for (GTK_WINDOW (w), parent);
+               }
+       gtk_widget_show_all (w);
+
+       return w;
+}
+
+/* PRIVATE */
+static void
+segnalazione_gestione_permessi (Segnalazione *segnalazione)
+{
+       SegnalazionePrivate *priv = SEGNALAZIONE_GET_PRIVATE (segnalazione);
+
+       ZakAuthoIResource *ires1;
+
+       ires1 = zak_autho_get_resource_from_id (priv->commons->autoz, "BCityBE_rw");
+       if (!zak_autho_is_allowed (priv->commons->autoz, priv->commons->role_utente, ires1, FALSE))
+               {
+                       zak_form_form_set_editable (ZAK_FORM_FORM (priv->form), FALSE);
+                       gtk_widget_set_sensitive (GTK_WIDGET (gtk_builder_get_object (priv->commons->gtkbuilder, "button81")), FALSE);
+                       gtk_widget_set_sensitive (GTK_WIDGET (gtk_builder_get_object (priv->commons->gtkbuilder, "button82")), FALSE);
+                       gtk_widget_set_sensitive (GTK_WIDGET (gtk_builder_get_object (priv->commons->gtkbuilder, "button94")), FALSE);
+                       gtk_widget_set_sensitive (GTK_WIDGET (gtk_builder_get_object (priv->commons->gtkbuilder, "button96")), FALSE);
+               }
+}
+
+static void
+segnalazione_carica (Segnalazione *segnalazione)
+{
+       SegnalazionePrivate *priv = SEGNALAZIONE_GET_PRIVATE (segnalazione);
+
+       if (zak_form_form_load (ZAK_FORM_FORM (priv->form), ZAK_FORM_IPROVIDER (priv->form_provider)))
+               {
+                       segnalazione_carica_allegati (segnalazione);
+               }
+}
+
+static void
+segnalazione_carica_allegati (Segnalazione *segnalazione)
+{
+       SegnalazionePrivate *priv = SEGNALAZIONE_GET_PRIVATE (segnalazione);
+
+       gchar *sql;
+
+       gtk_tree_store_clear (priv->tstore_allegati);
+
+       sql = g_strdup_printf ("SELECT c.id, c.titolo, c.descrizione"
+                                                  " FROM segnalazione_allegati AS c"
+                                                  " WHERE c.status <> 'E'"
+                                                  " AND c.id_segnalazioni = %d"
+                                                  " ORDER BY c.titolo, c.descrizione",
+                                                  priv->id);
+
+       gdaex_grid_fill_from_sql (priv->grid_allegati,
+                                                         priv->commons->gdaex,
+                                                         sql,
+                                                         NULL);
+
+       g_free (sql);
+}
+
+static void
+segnalazione_salva (Segnalazione *segnalazione, gboolean chiudi)
+{
+       gboolean ret;
+
+       SegnalazioneClass *klass = SEGNALAZIONE_GET_CLASS (segnalazione);
+       SegnalazionePrivate *priv = SEGNALAZIONE_GET_PRIVATE (segnalazione);
+
+       if (!zak_form_gtk_form_is_valid (priv->form, priv->w))
+               {
+                       return;
+               }
+
+       if (priv->id == 0)
+               {
+                       guint new_id;
+
+                       new_id = gdaex_get_new_id (priv->commons->gdaex,
+                                                                          "segnalazioni",
+                                                                          "id",
+                                                                          NULL);
+
+                       gtk_label_set_text (GTK_LABEL (priv->lbl_id), g_strdup_printf ("%d", new_id));
+
+                       ret = zak_form_form_insert (ZAK_FORM_FORM (priv->form), ZAK_FORM_IPROVIDER (priv->form_provider));
+               }
+       else
+               {
+                       ret = zak_form_form_update (ZAK_FORM_FORM (priv->form), ZAK_FORM_IPROVIDER (priv->form_provider));
+               }
+
+       if (ret)
+               {
+                       g_signal_emit (segnalazione, klass->aggiornato_signal_id, 0);
+
+                       zak_form_form_set_as_original (ZAK_FORM_FORM (priv->form));
+
+                       if (priv->id == 0)
+                               {
+                                       priv->id = strtol (gtk_label_get_text (GTK_LABEL (priv->lbl_id)), NULL, 10);
+                               }
+
+                       solipa_message_dialog (priv->w,
+                                              GTK_MESSAGE_INFO,
+                                              GTK_BUTTONS_OK,
+                                              "Salvataggio eseguito con successo.");
+
+                       gtk_widget_set_sensitive (GTK_WIDGET (gtk_builder_get_object (priv->commons->gtkbuilder, "hbox6")), TRUE);
+
+                       if (chiudi)
+                               {
+                                       gtk_widget_destroy (priv->w);
+                                       g_object_unref (segnalazione);
+                               }
+               }
+       else
+               {
+                       if (priv->id == 0)
+                               {
+                                       gtk_label_set_text (GTK_LABEL (priv->lbl_id), "");
+                               }
+
+                       solipa_message_dialog (priv->w,
+                                              GTK_MESSAGE_WARNING,
+                                              GTK_BUTTONS_OK,
+                                              "Errore durante il salvataggio.");
+               }
+}
+
+static void
+segnalazione_set_property (GObject *object, guint property_id, const GValue *value, GParamSpec *pspec)
+{
+       Segnalazione *segnalazione = SEGNALAZIONE (object);
+       SegnalazionePrivate *priv = SEGNALAZIONE_GET_PRIVATE (segnalazione);
+
+       switch (property_id)
+               {
+                       default:
+                               G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
+                               break;
+               }
+}
+
+static void
+segnalazione_get_property (GObject *object, guint property_id, GValue *value, GParamSpec *pspec)
+{
+       Segnalazione *segnalazione = SEGNALAZIONE (object);
+       SegnalazionePrivate *priv = SEGNALAZIONE_GET_PRIVATE (segnalazione);
+
+       switch (property_id)
+               {
+                       default:
+                               G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
+                               break;
+               }
+}
+
+static void
+segnalazione_allegati_modifica (Segnalazione *segnalazione)
+{
+       GtkTreeIter iter;
+
+       SegnalazionePrivate *priv = SEGNALAZIONE_GET_PRIVATE (segnalazione);
+
+       if (gtk_tree_selection_get_selected (priv->selection_allegati, NULL, &iter))
+               {
+                       gchar *id;
+
+                       gtk_tree_model_get (GTK_TREE_MODEL (priv->tstore_allegati), &iter,
+                                           0, &id,
+                                           -1);
+
+                       SegnalazioneAllegato *a = segnalazione_allegato_new (priv->commons, strtol (id, NULL, 10), 0);
+
+                       g_signal_connect (G_OBJECT (a), "aggiornato",
+                                         G_CALLBACK (segnalazione_on_allegati_aggiornato), (gpointer)segnalazione);
+
+                       segnalazione_allegato_show (a, GTK_WINDOW (priv->w));
+               }
+       else
+               {
+                       solipa_message_dialog (priv->w,
+                                              GTK_MESSAGE_WARNING,
+                                              GTK_BUTTONS_OK,
+                                              "Occorre prima selezionare un allegato.");
+               }
+}
+
+static gboolean
+segnalazione_conferma_chiusura (Segnalazione *segnalazione)
+{
+       gboolean ret;
+
+       SegnalazionePrivate *priv = SEGNALAZIONE_GET_PRIVATE (segnalazione);
+
+       ret = TRUE;
+       if (zak_form_form_is_changed (ZAK_FORM_FORM (priv->form)))
+               {
+                       if (solipa_message_dialog (priv->w,
+                                                  GTK_MESSAGE_QUESTION,
+                                                  GTK_BUTTONS_YES_NO,
+                                                  "Sicuro di voler chiudere senza salvare?") == GTK_RESPONSE_NO)
+                               {
+                                       ret = FALSE;
+                               }
+               }
+
+       return ret;
+}
+
+/* CALLBACK */
+static void
+segnalazione_on_allegati_aggiornato (gpointer instance, gpointer user_data)
+{
+       Segnalazione *segnalazione = (Segnalazione *)user_data;
+       SegnalazioneClass *klass = SEGNALAZIONE_GET_CLASS (segnalazione);
+
+       segnalazione_carica_allegati (segnalazione);
+}
+
+static gboolean
+segnalazione_on_key_release_event (GtkWidget *widget,
+                            GdkEventKey *event,
+                            gpointer user_data)
+{
+       switch (event->keyval)
+               {
+                       case GDK_KEY_Escape:
+                               {
+                                       SegnalazionePrivate *priv = SEGNALAZIONE_GET_PRIVATE ((Segnalazione *)user_data);
+
+                                       gtk_button_clicked (GTK_BUTTON (gtk_builder_get_object (priv->commons->gtkbuilder, "button80")));
+                                       return TRUE;
+                               }
+               }
+
+       return FALSE;
+}
+
+static gboolean
+segnalazione_on_w_segnalazione_delete_event (GtkWidget *widget,
+                               GdkEvent *event,
+                               gpointer user_data)
+{
+       return !segnalazione_conferma_chiusura ((Segnalazione *)user_data);
+}
+
+static void
+segnalazione_on_categoria_selezionato (gpointer instance, guint id, gpointer user_data)
+{
+       Segnalazione *f = (Segnalazione *)user_data;
+       SegnalazionePrivate *priv = SEGNALAZIONE_GET_PRIVATE (f);
+
+       zak_gtk_decoder_set_key (ZAK_GTK_DECODER (gtk_builder_get_object (priv->commons->gtkbuilder, "zakgtkdecoder5")),
+                                            g_strdup_printf ("%d", id));
+}
+
+static gchar
+*segnalazione_on_categoria_decode (gpointer instance, gchar *key, gpointer user_data)
+{
+       gchar *ret;
+
+       Segnalazione *f = (Segnalazione *)user_data;
+       SegnalazionePrivate *priv = SEGNALAZIONE_GET_PRIVATE (f);
+
+       if (strtol (key, NULL, 10) > 0)
+               {
+                       ret = categoria_get_descrizione_with_parent (priv->commons, strtol (key, NULL, 10));
+               }
+       else
+               {
+                       ret = g_strdup ("");
+               }
+
+       return ret;
+}
+
+static void
+segnalazione_on_btn_categoria_browse_clicked (GtkButton *button,
+                                    gpointer user_data)
+{
+       GtkWidget *w;
+
+       Segnalazione *segnalazione = (Segnalazione *)user_data;
+       SegnalazionePrivate *priv = SEGNALAZIONE_GET_PRIVATE (segnalazione);
+
+       Categorie *c = categorie_new (priv->commons, TRUE);
+
+       g_signal_connect (G_OBJECT (c), "selezionato",
+                         G_CALLBACK (segnalazione_on_categoria_selezionato), user_data);
+
+       w = categorie_get_widget (c);
+       gtk_window_set_transient_for (GTK_WINDOW (w), GTK_WINDOW (priv->w));
+       gtk_widget_show (w);
+}
+
+static void
+segnalazione_on_btn_allegati_nuovo_clicked (GtkButton *button,
+                                    gpointer user_data)
+{
+       Segnalazione *segnalazione = (Segnalazione *)user_data;
+
+       SegnalazionePrivate *priv = SEGNALAZIONE_GET_PRIVATE (segnalazione);
+
+       SegnalazioneAllegato *a = segnalazione_allegato_new (priv->commons, 0, priv->id);
+
+       g_signal_connect (G_OBJECT (a), "aggiornato",
+                         G_CALLBACK (segnalazione_on_allegati_aggiornato), (gpointer)segnalazione);
+
+       segnalazione_allegato_show (a, GTK_WINDOW (priv->w));
+}
+
+static void
+segnalazione_on_btn_allegati_modifica_clicked (GtkButton *button,
+                                    gpointer user_data)
+{
+       segnalazione_allegati_modifica ((Segnalazione *)user_data);
+}
+
+static void
+segnalazione_on_btn_allegati_elimina_clicked (GtkButton *button,
+                                    gpointer user_data)
+{
+       GtkTreeIter iter;
+
+       Segnalazione *segnalazione = (Segnalazione *)user_data;
+
+       SegnalazioneClass *klass = SEGNALAZIONE_GET_CLASS (segnalazione);
+       SegnalazionePrivate *priv = SEGNALAZIONE_GET_PRIVATE (segnalazione);
+
+       if (gtk_tree_selection_get_selected (priv->selection_allegati, NULL, &iter))
+               {
+                       if (solipa_message_dialog (priv->w,
+                                                  GTK_MESSAGE_QUESTION,
+                                                  GTK_BUTTONS_YES_NO,
+                                                  "Sicuro di voler eliminare l'allegato selezionato?") == GTK_RESPONSE_YES)
+                               {
+                                       gchar *id;
+
+                                       gtk_tree_model_get (GTK_TREE_MODEL (priv->tstore_allegati), &iter,
+                                                           0, &id,
+                                                           -1);
+
+                                       gdaex_execute (priv->commons->gdaex,
+                                                      g_strdup_printf ("UPDATE segnalazione_allegati"
+                                                                       " SET status = 'E'"
+                                                                       " WHERE id = %d",
+                                                                       strtol (id, NULL, 10)));
+
+                                       segnalazione_carica_allegati (segnalazione);
+                               }
+               }
+       else
+               {
+                       solipa_message_dialog (priv->w,
+                                              GTK_MESSAGE_WARNING,
+                                              GTK_BUTTONS_OK,
+                                              "Occorre prima selezionare un allegato.");
+               }
+}
+
+static void
+segnalazione_on_btn_allegati_apri_clicked (GtkButton *button,
+                                    gpointer user_data)
+{
+       GtkTreeIter iter;
+
+       Segnalazione *segnalazione = (Segnalazione *)user_data;
+
+       SegnalazioneClass *klass = SEGNALAZIONE_GET_CLASS (segnalazione);
+       SegnalazionePrivate *priv = SEGNALAZIONE_GET_PRIVATE (segnalazione);
+
+       if (gtk_tree_selection_get_selected (priv->selection_allegati, NULL, &iter))
+               {
+                       gchar *id;
+                       gchar *sql;
+                       const gchar *filename;
+
+                       gtk_tree_model_get (GTK_TREE_MODEL (priv->tstore_allegati), &iter,
+                                                               0, &id,
+                                                               -1);
+
+                       sql = g_strdup_printf ("SELECT percorso, contenuto FROM segnalazione_allegati WHERE id = %s", id);
+                       filename = gdaex_get_blob (priv->commons->gdaex, sql, "percorso", "contenuto");
+                       if (filename == NULL)
+                               {
+                                       solipa_message_dialog (priv->w,
+                                                                                  GTK_MESSAGE_WARNING,
+                                                                                  GTK_BUTTONS_OK,
+                                                                                  "Impossibile aprire l'allegato selezionato.");
+                               }
+                       else
+                               {
+                                       solipa_allegato_apri_allegato (GTK_WINDOW (priv->w), filename);
+                               }
+                       g_free (sql);
+               }
+       else
+               {
+                       solipa_message_dialog (priv->w,
+                                              GTK_MESSAGE_WARNING,
+                                              GTK_BUTTONS_OK,
+                                              "Occorre prima selezionare un allegato.");
+               }
+}
+
+static void
+segnalazione_on_trv_allegati_row_activated (GtkTreeView *tree_view,
+                                             GtkTreePath *tree_path,
+                                             GtkTreeViewColumn *column,
+                                             gpointer user_data)
+{
+       segnalazione_allegati_modifica ((Segnalazione *)user_data);
+}
+
+static void
+segnalazione_on_btn_annulla_clicked (GtkButton *button,
+                        gpointer user_data)
+{
+       Segnalazione *segnalazione = (Segnalazione *)user_data;
+       SegnalazionePrivate *priv = SEGNALAZIONE_GET_PRIVATE (segnalazione);
+
+       if (segnalazione_conferma_chiusura (segnalazione)) gtk_widget_destroy (priv->w);
+}
+
+static void
+segnalazione_on_btn_salva_clicked (GtkButton *button,
+                      gpointer user_data)
+{
+       segnalazione_salva ((Segnalazione *)user_data, FALSE);
+}
+
+static void
+segnalazione_on_btn_salvachiudi_clicked (GtkButton *button,
+                      gpointer user_data)
+{
+       segnalazione_salva ((Segnalazione *)user_data, TRUE);
+}
diff --git a/src/segnalazione.h b/src/segnalazione.h
new file mode 100644 (file)
index 0000000..e2811fb
--- /dev/null
@@ -0,0 +1,66 @@
+/*
+ * Copyright (C) 2016 Andrea Zagli <azagli@libero.it>
+ *
+ * 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 __SEGNALAZIONE_H__
+#define __SEGNALAZIONE_H__
+
+#include <glib.h>
+#include <glib-object.h>
+
+#include <gtk/gtk.h>
+
+#include "commons.h"
+
+G_BEGIN_DECLS
+
+
+#define TYPE_SEGNALAZIONE                 (segnalazione_get_type ())
+#define SEGNALAZIONE(obj)                 (G_TYPE_CHECK_INSTANCE_CAST ((obj), TYPE_SEGNALAZIONE, Segnalazione))
+#define SEGNALAZIONE_CLASS(klass)         (G_TYPE_CHECK_CLASS_CAST ((klass), TYPE_SEGNALAZIONE, SegnalazioneClass))
+#define IS_SEGNALAZIONE(obj)              (G_TYPE_CHECK_INSTANCE_TYPE ((obj), TYPE_SEGNALAZIONE))
+#define IS_SEGNALAZIONE_CLASS(klass)      (G_TYPE_CHECK_CLASS_TYPE ((klass), TYPE_SEGNALAZIONE))
+#define SEGNALAZIONE_GET_CLASS(obj)       (G_TYPE_INSTANCE_GET_CLASS ((obj), TYPE_SEGNALAZIONE, SegnalazioneClass))
+
+
+typedef struct _Segnalazione Segnalazione;
+typedef struct _SegnalazioneClass SegnalazioneClass;
+
+struct _Segnalazione
+       {
+               GObject parent;
+       };
+
+struct _SegnalazioneClass
+       {
+               GObjectClass parent_class;
+
+               guint aggiornato_signal_id;
+       };
+
+GType segnalazione_get_type (void) G_GNUC_CONST;
+
+Segnalazione *segnalazione_new (BCityBECommons *commons, gint id);
+
+GtkWidget *segnalazione_get_widget (Segnalazione *iva);
+GtkWidget *segnalazione_show (Segnalazione *segnalazione, GtkWindow *parent);
+
+
+G_END_DECLS
+
+#endif /* __SEGNALAZIONE_H__ */
diff --git a/src/segnalazioneallegato.c b/src/segnalazioneallegato.c
new file mode 100644 (file)
index 0000000..39a86d5
--- /dev/null
@@ -0,0 +1,466 @@
+/*
+ * Copyright (C) 2016 Andrea Zagli <azagli@libero.it>
+ *
+ * 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 <config.h>
+#endif
+
+#include <gdk/gdk.h>
+
+#include <libzakform/libzakform.h>
+#include <libzakformgtk/libzakformgtk.h>
+#include <libzakformgdaex/libzakformgdaex.h>
+#include <libsolipa/libsolipa.h>
+
+#include "segnalazioneallegato.h"
+
+static void segnalazione_allegato_class_init (SegnalazioneAllegatoClass *klass);
+static void segnalazione_allegato_init (SegnalazioneAllegato *segnalazione_allegato);
+
+static void segnalazione_allegato_gestione_permessi (SegnalazioneAllegato *segnalazione_allegato);
+
+static void segnalazione_allegato_carica (SegnalazioneAllegato *segnalazione_allegato);
+static void segnalazione_allegato_salva (SegnalazioneAllegato *segnalazione_allegato, gboolean chiudi);
+
+static gboolean segnalazione_allegato_conferma_chiusura (SegnalazioneAllegato *segnalazione_allegato);
+
+static void segnalazione_allegato_set_property (GObject *object,
+                                     guint property_id,
+                                     const GValue *value,
+                                     GParamSpec *pspec);
+static void segnalazione_allegato_get_property (GObject *object,
+                                     guint property_id,
+                                     GValue *value,
+                                     GParamSpec *pspec);
+
+static gboolean segnalazione_allegato_on_key_release_event (GtkWidget *widget,
+                            GdkEventKey *event,
+                            gpointer user_data);
+static gboolean segnalazione_allegato_on_w_segnalazione_allegato_delete_event (GtkWidget *widget,
+                               GdkEvent *event,
+                               gpointer user_data);
+
+static void segnalazione_allegato_on_btn_annulla_clicked (GtkButton *button,
+                                    gpointer user_data);
+static void segnalazione_allegato_on_btn_salva_clicked (GtkButton *button,
+                                  gpointer user_data);
+static void segnalazione_allegato_on_btn_salvachiudi_clicked (GtkButton *button,
+                                  gpointer user_data);
+
+#define SEGNALAZIONE_ALLEGATO_GET_PRIVATE(obj) (G_TYPE_INSTANCE_GET_PRIVATE ((obj), TYPE_SEGNALAZIONE_ALLEGATO, SegnalazioneAllegatoPrivate))
+
+typedef struct _SegnalazioneAllegatoPrivate SegnalazioneAllegatoPrivate;
+struct _SegnalazioneAllegatoPrivate
+       {
+               BCityBECommons *commons;
+
+               ZakFormGtkForm *form;
+               ZakFormGdaexProvider *form_provider;
+
+               GtkWidget *w;
+
+               GObject *lbl_id;
+               GObject *lbl_id_articoli;
+
+               SolipaAllegato *sallegato;
+
+               gint id;
+       };
+
+G_DEFINE_TYPE (SegnalazioneAllegato, segnalazione_allegato, G_TYPE_OBJECT)
+
+static void
+segnalazione_allegato_class_init (SegnalazioneAllegatoClass *klass)
+{
+       GObjectClass *object_class = G_OBJECT_CLASS (klass);
+
+       g_type_class_add_private (object_class, sizeof (SegnalazioneAllegatoPrivate));
+
+       object_class->set_property = segnalazione_allegato_set_property;
+       object_class->get_property = segnalazione_allegato_get_property;
+
+       /**
+        * SegnalazioneAllegato::aggiornato:
+        * @segnalazione_allegato:
+        *
+        */
+       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
+segnalazione_allegato_init (SegnalazioneAllegato *segnalazione_allegato)
+{
+       SegnalazioneAllegatoPrivate *priv = SEGNALAZIONE_ALLEGATO_GET_PRIVATE (segnalazione_allegato);
+}
+
+/**
+ * segnalazione_allegato_new:
+ * @commons:
+ * @id:
+ * @id_fornitori:
+ *
+ * Returns: the newly created #SegnalazioneAllegato object.
+ */
+SegnalazioneAllegato
+*segnalazione_allegato_new (BCityBECommons *commons, gint id, gint id_fornitori)
+{
+       GError *error;
+
+       SegnalazioneAllegato *a = SEGNALAZIONE_ALLEGATO (g_object_new (segnalazione_allegato_get_type (), NULL));
+
+       SegnalazioneAllegatoPrivate *priv = SEGNALAZIONE_ALLEGATO_GET_PRIVATE (a);
+
+       priv->commons = commons;
+
+       error = NULL;
+       gtk_builder_add_objects_from_file (priv->commons->gtkbuilder, priv->commons->guifile,
+                                          g_strsplit ("w_segnalazione_allegato", "|", -1),
+                                          &error);
+       if (error != NULL)
+               {
+                       g_warning ("Errore: %s.", error->message);
+                       return NULL;
+               }
+
+       priv->form = zak_form_gtk_form_new ();
+       zak_form_gtk_form_set_gtkbuilder (priv->form, priv->commons->gtkbuilder);
+       zak_form_form_load_from_file (ZAK_FORM_FORM (priv->form), g_build_filename (priv->commons->formdir, "segnalazioneallegato.form", NULL));
+
+       priv->form_provider = zak_form_gdaex_provider_new (priv->commons->gdaex, "segnalazione_allegati");
+
+       priv->w = GTK_WIDGET (gtk_builder_get_object (priv->commons->gtkbuilder, "w_segnalazione_allegato"));
+
+       priv->lbl_id = gtk_builder_get_object (priv->commons->gtkbuilder,
+                                                                                  "label65");
+       priv->lbl_id_articoli = gtk_builder_get_object (priv->commons->gtkbuilder,
+                                                                                  "label70");
+
+       g_signal_connect (priv->w,
+                         "key-release-event", G_CALLBACK (segnalazione_allegato_on_key_release_event), (gpointer)a);
+       g_signal_connect (priv->w,
+                         "delete-event", G_CALLBACK (segnalazione_allegato_on_w_segnalazione_allegato_delete_event), (gpointer)a);
+
+       priv->sallegato = solipa_allegato_new (commons->solipa);
+       if (priv->sallegato != NULL)
+               {
+                       solipa_allegato_add_to_zakformgtk (priv->sallegato, priv->form,
+                                                                                          "percorso", "data_file", "dimensione_file");
+                       gtk_container_add (GTK_CONTAINER (gtk_builder_get_object (priv->commons->gtkbuilder, "alignment1")),
+                                          solipa_allegato_get_widget (priv->sallegato));
+                       solipa_allegato_con_salva_in_db (priv->sallegato, FALSE);
+               }
+
+       g_signal_connect (gtk_builder_get_object (priv->commons->gtkbuilder, "button91"),
+                         "clicked", G_CALLBACK (segnalazione_allegato_on_btn_annulla_clicked), (gpointer)a);
+       g_signal_connect (gtk_builder_get_object (priv->commons->gtkbuilder, "button92"),
+                         "clicked", G_CALLBACK (segnalazione_allegato_on_btn_salva_clicked), (gpointer)a);
+       g_signal_connect (gtk_builder_get_object (priv->commons->gtkbuilder, "button93"),
+                         "clicked", G_CALLBACK (segnalazione_allegato_on_btn_salvachiudi_clicked), (gpointer)a);
+
+       zak_form_form_clear (ZAK_FORM_FORM (priv->form));
+
+       priv->id = id;
+
+       if (priv->id == 0)
+               {
+                       gtk_label_set_text (GTK_LABEL (priv->lbl_id), "");
+                       gtk_label_set_text (GTK_LABEL (priv->lbl_id_articoli), g_strdup_printf ("%d", id_fornitori));
+
+                       zak_form_form_set_as_original (ZAK_FORM_FORM (priv->form));
+               }
+       else
+               {
+                       gtk_label_set_text (GTK_LABEL (priv->lbl_id), g_strdup_printf ("%d", priv->id));
+                       segnalazione_allegato_carica (a);
+               }
+
+       segnalazione_allegato_gestione_permessi (a);
+
+       return a;
+}
+
+/**
+ * segnalazione_allegato_get_widget:
+ * @segnalazione_allegato:
+ *
+ */
+GtkWidget
+*segnalazione_allegato_get_widget (SegnalazioneAllegato *segnalazione_allegato)
+{
+       SegnalazioneAllegatoPrivate *priv = SEGNALAZIONE_ALLEGATO_GET_PRIVATE (segnalazione_allegato);
+
+       return priv->w;
+}
+
+/**
+ * segnalazione_allegato_show:
+ * @segnalazione_allegato:
+ * @parent:
+ */
+GtkWidget
+*segnalazione_allegato_show (SegnalazioneAllegato *segnalazione_allegato, GtkWindow *parent)
+{
+       GtkWidget *w;
+
+       SegnalazioneAllegatoPrivate *priv = SEGNALAZIONE_ALLEGATO_GET_PRIVATE (segnalazione_allegato);
+
+       w = segnalazione_allegato_get_widget (segnalazione_allegato);
+       if (parent != NULL)
+               {
+                       gtk_window_set_transient_for (GTK_WINDOW (w), parent);
+               }
+       gtk_widget_show_all (w);
+
+       return w;
+}
+
+/* PRIVATE */
+static void
+segnalazione_allegato_gestione_permessi (SegnalazioneAllegato *segnalazione_allegato)
+{
+       SegnalazioneAllegatoPrivate *priv = SEGNALAZIONE_ALLEGATO_GET_PRIVATE (segnalazione_allegato);
+
+       ZakAuthoIResource *ires1;
+
+       ires1 = zak_autho_get_resource_from_id (priv->commons->autoz, "BCityBE_rw");
+       if (!zak_autho_is_allowed (priv->commons->autoz, priv->commons->role_utente, ires1, FALSE))
+               {
+                       zak_form_form_set_editable (ZAK_FORM_FORM (priv->form), FALSE);
+                       gtk_widget_set_sensitive (GTK_WIDGET (gtk_builder_get_object (priv->commons->gtkbuilder, "button92")), FALSE);
+                       gtk_widget_set_sensitive (GTK_WIDGET (gtk_builder_get_object (priv->commons->gtkbuilder, "button93")), FALSE);
+               }
+}
+
+static void
+segnalazione_allegato_carica (SegnalazioneAllegato *segnalazione_allegato)
+{
+       SegnalazioneAllegatoPrivate *priv = SEGNALAZIONE_ALLEGATO_GET_PRIVATE (segnalazione_allegato);
+
+       if (zak_form_form_load (ZAK_FORM_FORM (priv->form), ZAK_FORM_IPROVIDER (priv->form_provider)))
+               {
+               }
+}
+
+static void
+segnalazione_allegato_salva (SegnalazioneAllegato *segnalazione_allegato, gboolean chiudi)
+{
+       gboolean ret;
+
+       guint new_id;
+       const gchar *percorso;
+       gchar *sql;
+
+       SegnalazioneAllegatoClass *klass = SEGNALAZIONE_ALLEGATO_GET_CLASS (segnalazione_allegato);
+       SegnalazioneAllegatoPrivate *priv = SEGNALAZIONE_ALLEGATO_GET_PRIVATE (segnalazione_allegato);
+
+       if (!zak_form_gtk_form_is_valid (priv->form, priv->w))
+               {
+                       return;
+               }
+
+       if (priv->id == 0)
+               {
+                       new_id = gdaex_get_new_id (priv->commons->gdaex,
+                                                                          "segnalazione_allegati",
+                                                                          "id",
+                                                                          NULL);
+
+                       gtk_label_set_text (GTK_LABEL (priv->lbl_id), g_strdup_printf ("%d", new_id));
+
+                       ret = zak_form_form_insert (ZAK_FORM_FORM (priv->form), ZAK_FORM_IPROVIDER (priv->form_provider));
+               }
+       else
+               {
+                       ret = zak_form_form_update (ZAK_FORM_FORM (priv->form), ZAK_FORM_IPROVIDER (priv->form_provider));
+               }
+
+       if (ret)
+               {
+                       if (priv->id == 0)
+                               {
+                                       priv->id = strtol (gtk_label_get_text (GTK_LABEL (priv->lbl_id)), NULL, 10);
+                               }
+
+                       /* salvo il file nel db */
+                       percorso = solipa_allegato_get_percorso (priv->sallegato);
+
+                       sql = g_strdup_printf ("UPDATE segnalazione_allegati"
+                                                                  " SET contenuto = ##/*name:'contenuto' type:'GdaBlob'*/"
+                                                                  " WHERE id = %d",
+                                                                  priv->id);
+                       if (!gdaex_save_file_in_blob (priv->commons->gdaex,
+                                                                                 sql,
+                                                                                 "contenuto",
+                                                                                 percorso))
+                               {
+                                       if (priv->id == 0)
+                                               {
+                                                       gtk_label_set_text (GTK_LABEL (priv->lbl_id), "");
+                                               }
+
+                                       solipa_message_dialog (priv->w,
+                                                                                  GTK_MESSAGE_WARNING,
+                                                                                  GTK_BUTTONS_OK,
+                                                                                  "Errore durante il salvataggio dell'allegato nel db.");
+
+                                       g_free (sql);
+                               }
+                       else
+                               {
+                                       g_signal_emit (segnalazione_allegato, klass->aggiornato_signal_id, 0);
+
+                                       zak_form_form_set_as_original (ZAK_FORM_FORM (priv->form));
+
+                                       solipa_message_dialog (priv->w,
+                                                                                  GTK_MESSAGE_INFO,
+                                                                                  GTK_BUTTONS_OK,
+                                                                                  "Salvataggio eseguito con successo.");
+
+                                       if (chiudi)
+                                               {
+                                                       gtk_widget_destroy (priv->w);
+                                                       g_object_unref (segnalazione_allegato);
+                                               }
+
+                                       g_free (sql);
+                               }
+               }
+       else
+               {
+                       if (priv->id == 0)
+                               {
+                                       gtk_label_set_text (GTK_LABEL (priv->lbl_id), "");
+                               }
+
+                       solipa_message_dialog (priv->w,
+                                              GTK_MESSAGE_WARNING,
+                                              GTK_BUTTONS_OK,
+                                              "Errore durante il salvataggio.");
+               }
+}
+
+static void
+segnalazione_allegato_set_property (GObject *object, guint property_id, const GValue *value, GParamSpec *pspec)
+{
+       SegnalazioneAllegato *segnalazione_allegato = SEGNALAZIONE_ALLEGATO (object);
+       SegnalazioneAllegatoPrivate *priv = SEGNALAZIONE_ALLEGATO_GET_PRIVATE (segnalazione_allegato);
+
+       switch (property_id)
+               {
+                       default:
+                               G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
+                               break;
+               }
+}
+
+static void
+segnalazione_allegato_get_property (GObject *object, guint property_id, GValue *value, GParamSpec *pspec)
+{
+       SegnalazioneAllegato *segnalazione_allegato = SEGNALAZIONE_ALLEGATO (object);
+       SegnalazioneAllegatoPrivate *priv = SEGNALAZIONE_ALLEGATO_GET_PRIVATE (segnalazione_allegato);
+
+       switch (property_id)
+               {
+                       default:
+                               G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
+                               break;
+               }
+}
+
+static gboolean
+segnalazione_allegato_conferma_chiusura (SegnalazioneAllegato *segnalazione_allegato)
+{
+       gboolean ret;
+
+       SegnalazioneAllegatoPrivate *priv = SEGNALAZIONE_ALLEGATO_GET_PRIVATE (segnalazione_allegato);
+
+       ret = TRUE;
+       if (zak_form_form_is_changed (ZAK_FORM_FORM (priv->form)))
+               {
+                       if (solipa_message_dialog (priv->w,
+                                                  GTK_MESSAGE_QUESTION,
+                                                  GTK_BUTTONS_YES_NO,
+                                                  "Sicuro di voler chiudere senza salvare?") == GTK_RESPONSE_NO)
+                               {
+                                       ret = FALSE;
+                               }
+               }
+
+       return ret;
+}
+
+/* CALLBACK */
+static gboolean
+segnalazione_allegato_on_key_release_event (GtkWidget *widget,
+                            GdkEventKey *event,
+                            gpointer user_data)
+{
+       switch (event->keyval)
+               {
+                       case GDK_KEY_Escape:
+                               {
+                                       SegnalazioneAllegatoPrivate *priv = SEGNALAZIONE_ALLEGATO_GET_PRIVATE ((SegnalazioneAllegato *)user_data);
+
+                                       gtk_button_clicked (GTK_BUTTON (gtk_builder_get_object (priv->commons->gtkbuilder, "button91")));
+                                       return TRUE;
+                               }
+               }
+
+       return FALSE;
+}
+
+static gboolean
+segnalazione_allegato_on_w_segnalazione_allegato_delete_event (GtkWidget *widget,
+                               GdkEvent *event,
+                               gpointer user_data)
+{
+       return !segnalazione_allegato_conferma_chiusura ((SegnalazioneAllegato *)user_data);
+}
+
+static void
+segnalazione_allegato_on_btn_annulla_clicked (GtkButton *button,
+                        gpointer user_data)
+{
+       SegnalazioneAllegato *segnalazione_allegato = (SegnalazioneAllegato *)user_data;
+       SegnalazioneAllegatoPrivate *priv = SEGNALAZIONE_ALLEGATO_GET_PRIVATE (segnalazione_allegato);
+
+       if (segnalazione_allegato_conferma_chiusura (segnalazione_allegato)) gtk_widget_destroy (priv->w);
+}
+
+static void
+segnalazione_allegato_on_btn_salva_clicked (GtkButton *button,
+                      gpointer user_data)
+{
+       segnalazione_allegato_salva ((SegnalazioneAllegato *)user_data, FALSE);
+}
+
+static void
+segnalazione_allegato_on_btn_salvachiudi_clicked (GtkButton *button,
+                      gpointer user_data)
+{
+       segnalazione_allegato_salva ((SegnalazioneAllegato *)user_data, TRUE);
+}
diff --git a/src/segnalazioneallegato.h b/src/segnalazioneallegato.h
new file mode 100644 (file)
index 0000000..cd7bca5
--- /dev/null
@@ -0,0 +1,66 @@
+/*
+ * Copyright (C) 2016 Andrea Zagli <azagli@libero.it>
+ *
+ * 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 __SEGNALAZIONE_ALLEGATO_H__
+#define __SEGNALAZIONE_ALLEGATO_H__
+
+#include <glib.h>
+#include <glib-object.h>
+
+#include <gtk/gtk.h>
+
+#include "commons.h"
+
+G_BEGIN_DECLS
+
+
+#define TYPE_SEGNALAZIONE_ALLEGATO                 (segnalazione_allegato_get_type ())
+#define SEGNALAZIONE_ALLEGATO(obj)                 (G_TYPE_CHECK_INSTANCE_CAST ((obj), TYPE_SEGNALAZIONE_ALLEGATO, SegnalazioneAllegato))
+#define SEGNALAZIONE_ALLEGATO_CLASS(klass)         (G_TYPE_CHECK_CLASS_CAST ((klass), TYPE_SEGNALAZIONE_ALLEGATO, SegnalazioneAllegatoClass))
+#define IS_SEGNALAZIONE_ALLEGATO(obj)              (G_TYPE_CHECK_INSTANCE_TYPE ((obj), TYPE_SEGNALAZIONE_ALLEGATO))
+#define IS_SEGNALAZIONE_ALLEGATO_CLASS(klass)      (G_TYPE_CHECK_CLASS_TYPE ((klass), TYPE_SEGNALAZIONE_ALLEGATO))
+#define SEGNALAZIONE_ALLEGATO_GET_CLASS(obj)       (G_TYPE_INSTANCE_GET_CLASS ((obj), TYPE_SEGNALAZIONE_ALLEGATO, SegnalazioneAllegatoClass))
+
+
+typedef struct _SegnalazioneAllegato SegnalazioneAllegato;
+typedef struct _SegnalazioneAllegatoClass SegnalazioneAllegatoClass;
+
+struct _SegnalazioneAllegato
+       {
+               GObject parent;
+       };
+
+struct _SegnalazioneAllegatoClass
+       {
+               GObjectClass parent_class;
+
+               guint aggiornato_signal_id;
+       };
+
+GType segnalazione_allegato_get_type (void) G_GNUC_CONST;
+
+SegnalazioneAllegato *segnalazione_allegato_new (BCityBECommons *commons, gint id, gint id_uffici);
+
+GtkWidget *segnalazione_allegato_get_widget (SegnalazioneAllegato *segnalazione_allegato);
+GtkWidget *segnalazione_allegato_show (SegnalazioneAllegato *segnalazione_allegato, GtkWindow *parent);
+
+
+G_END_DECLS
+
+#endif /* __SEGNALAZIONE_ALLEGATO_H__ */
diff --git a/src/segnalazioni.c b/src/segnalazioni.c
new file mode 100644 (file)
index 0000000..fd31271
--- /dev/null
@@ -0,0 +1,614 @@
+/*
+ * Copyright (C) 2016 Andrea Zagli <azagli@libero.it>
+ *
+ * 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 <config.h>
+#endif
+
+#include <gdk/gdk.h>
+
+#include <libsolipa/libsolipa.h>
+#include <libgdaexgrid/libgdaexgrid.h>
+
+#include "segnalazioni.h"
+#include "segnalazione.h"
+#include "segnalazioniqe.h"
+#include "categoria.h"
+
+static void segnalazioni_class_init (SegnalazioniClass *klass);
+static void segnalazioni_init (Segnalazioni *segnalazioni);
+
+static void segnalazioni_gestione_permessi (Segnalazioni *segnalazioni);
+
+static void segnalazioni_carica (Segnalazioni *segnalazioni);
+static void segnalazioni_modifica (Segnalazioni *segnalazioni);
+
+static void segnalazioni_selezionato (Segnalazioni *segnalazioni);
+static void segnalazioni_on_segnalazione_aggiornato (gpointer instance, gpointer user_data);
+static void segnalazioni_on_segnalazioni_qe_selezionato (gpointer instance, gpointer parametri, gpointer user_data);
+
+static void segnalazioni_set_property (GObject *object,
+                                     guint property_id,
+                                     const GValue *value,
+                                     GParamSpec *pspec);
+static void segnalazioni_get_property (GObject *object,
+                                     guint property_id,
+                                     GValue *value,
+                                     GParamSpec *pspec);
+
+static void segnalazioni_on_wgrid_map (GtkWidget *widget,
+                                                                  gpointer user_data);
+
+static gboolean segnalazioni_on_key_release_event (GtkWidget *widget,
+                            GdkEventKey *event,
+                            gpointer user_data);
+
+static void segnalazioni_on_btn_nuovo_clicked (GtkButton *button,
+                      gpointer user_data);
+static void segnalazioni_on_btn_modifica_clicked (GtkButton *button,
+                      gpointer user_data);
+static void segnalazioni_on_btn_elimina_clicked (GtkButton *button,
+                        gpointer user_data);
+static void segnalazioni_on_trv_segnalazioni_row_activated (GtkTreeView *tree_view,
+                                                            GtkTreePath *tree_path,
+                                                            GtkTreeViewColumn *column,
+                                                            gpointer user_data);
+
+static void segnalazioni_on_btn_trova_clicked (GtkButton *button,
+                        gpointer user_data);
+static void segnalazioni_on_btn_annulla_clicked (GtkButton *button,
+                                    gpointer user_data);
+static void segnalazioni_on_btn_seleziona_clicked (GtkButton *button,
+                                  gpointer user_data);
+
+#define SEGNALAZIONI_GET_PRIVATE(obj) (G_TYPE_INSTANCE_GET_PRIVATE ((obj), TYPE_SEGNALAZIONI, SegnalazioniPrivate))
+
+enum
+{
+       COL_ID
+};
+
+typedef struct _SegnalazioniPrivate SegnalazioniPrivate;
+struct _SegnalazioniPrivate
+       {
+               BCityBECommons *commons;
+
+               GtkWidget *transient;
+               GtkWidget *widget;
+               GdaExGrid *grid;
+               GtkWidget *wgrid;
+               GtkTreeSelection *selection;
+               GtkTreeStore *tstore_segnalazioni;
+
+               gboolean selezione;
+
+               GdaExQueryEditor *qe;
+       };
+
+G_DEFINE_TYPE (Segnalazioni, segnalazioni, G_TYPE_OBJECT)
+
+static void
+segnalazioni_class_init (SegnalazioniClass *klass)
+{
+       GObjectClass *object_class = G_OBJECT_CLASS (klass);
+
+       g_type_class_add_private (object_class, sizeof (SegnalazioniPrivate));
+
+       object_class->set_property = segnalazioni_set_property;
+       object_class->get_property = segnalazioni_get_property;
+
+       /**
+        * Segnalazioni::selezionato:
+        * @segnalazioni:
+        *
+        */
+       klass->selezionato_signal_id = g_signal_new ("selezionato",
+                                                      G_TYPE_FROM_CLASS (object_class),
+                                                      G_SIGNAL_RUN_LAST,
+                                                      0,
+                                                      NULL,
+                                                      NULL,
+                                                      g_cclosure_marshal_VOID__UINT,
+                                                      G_TYPE_NONE,
+                                                      1, G_TYPE_UINT);
+}
+
+static void
+segnalazioni_init (Segnalazioni *segnalazioni)
+{
+       SegnalazioniPrivate *priv = SEGNALAZIONI_GET_PRIVATE (segnalazioni);
+
+       priv->qe = NULL;
+}
+
+/**
+ * segnalazioni_new:
+ * @commons:
+ * @selezione:
+ *
+ * Returns: the newly created #Segnalazioni object.
+ */
+Segnalazioni
+*segnalazioni_new (BCityBECommons *commons, gboolean selezione)
+{
+       GError *error;
+
+       GdaExGridColumn *gcol;
+
+       Segnalazioni *a = SEGNALAZIONI (g_object_new (segnalazioni_get_type (), NULL));
+
+       SegnalazioniPrivate *priv = SEGNALAZIONI_GET_PRIVATE (a);
+
+       priv->commons = commons;
+       priv->selezione = selezione;
+
+       error = NULL;
+       gtk_builder_add_objects_from_file (priv->commons->gtkbuilder, priv->commons->guifile,
+                                          g_strsplit ((selezione ? "w_segnalazioni" : "vbx_segnalazioni"),
+                                                                                                  "|", -1),
+                                          &error);
+       if (error != NULL)
+               {
+                       g_warning ("Errore: %s.", error->message);
+                       return NULL;
+               }
+
+       priv->widget = GTK_WIDGET (gtk_builder_get_object (priv->commons->gtkbuilder, (priv->selezione ? "w_segnalazioni" : "vbx_segnalazioni")));
+
+       if (priv->selezione)
+               {
+                       priv->transient = GTK_WIDGET (priv->widget);
+               }
+       else
+               {
+                       priv->transient = GTK_WIDGET (gtk_builder_get_object (priv->commons->gtkbuilder, "w_main"));
+               }
+
+       /* creo la gdaexgrid */
+       priv->grid = gdaex_grid_new ();
+       gdaex_grid_set_solipa (priv->grid, priv->commons->solipa);
+       gdaex_grid_set_title (priv->grid, gtk_label_get_text (GTK_LABEL (gtk_builder_get_object (priv->commons->gtkbuilder, "label68"))));
+
+       gcol = gdaex_grid_column_new_defaults ("ID", "id", G_TYPE_INT);
+       gdaex_grid_add_column (priv->grid, gcol);
+
+       gcol = gdaex_grid_column_new ("ID Categoria", "id_categorie", G_TYPE_INT, FALSE, TRUE, TRUE, TRUE, -1);
+       gdaex_grid_add_column (priv->grid, gcol);
+
+       gcol = gdaex_grid_column_new_defaults ("Categoria", "categoria", G_TYPE_STRING);
+       gdaex_grid_add_column (priv->grid, gcol);
+
+       gcol = gdaex_grid_column_new_defaults ("Descrizione", "descrizione", G_TYPE_STRING);
+       gdaex_grid_add_column (priv->grid, gcol);
+
+       priv->wgrid = gdaex_grid_get_widget (priv->grid);
+       g_signal_connect (priv->wgrid,
+                         "map", G_CALLBACK (segnalazioni_on_wgrid_map), (gpointer)a);
+       gtk_tree_view_set_search_column (GTK_TREE_VIEW (priv->wgrid), 3);
+       gtk_container_add (GTK_CONTAINER (gtk_builder_get_object (priv->commons->gtkbuilder, "scrolledwindow16")), priv->wgrid);
+       gtk_widget_show (priv->wgrid);
+
+       priv->selection = gtk_tree_view_get_selection (GTK_TREE_VIEW (priv->wgrid));
+       priv->tstore_segnalazioni = GTK_TREE_STORE (gtk_tree_view_get_model (GTK_TREE_VIEW (priv->wgrid)));
+
+       g_signal_connect (priv->wgrid,
+                         "row-activated", G_CALLBACK (segnalazioni_on_trv_segnalazioni_row_activated), (gpointer)a);
+
+       g_signal_connect (priv->widget,
+                         "key-release-event", G_CALLBACK (segnalazioni_on_key_release_event), (gpointer)a);
+
+       g_signal_connect (gtk_builder_get_object (priv->commons->gtkbuilder, "button83"),
+                         "clicked", G_CALLBACK (segnalazioni_on_btn_nuovo_clicked), (gpointer)a);
+       g_signal_connect (gtk_builder_get_object (priv->commons->gtkbuilder, "button84"),
+                         "clicked", G_CALLBACK (segnalazioni_on_btn_modifica_clicked), (gpointer)a);
+       g_signal_connect (gtk_builder_get_object (priv->commons->gtkbuilder, "button85"),
+                         "clicked", G_CALLBACK (segnalazioni_on_btn_elimina_clicked), (gpointer)a);
+       g_signal_connect (gtk_builder_get_object (priv->commons->gtkbuilder, "button86"),
+                         "clicked", G_CALLBACK (segnalazioni_on_btn_trova_clicked), (gpointer)a);
+
+       if (priv->selezione)
+               {
+                       gtk_widget_hide (GTK_WIDGET (gtk_builder_get_object (priv->commons->gtkbuilder, "label68")));
+                       g_signal_connect (gtk_builder_get_object (priv->commons->gtkbuilder, "button87"),
+                                         "clicked", G_CALLBACK (segnalazioni_on_btn_annulla_clicked), (gpointer)a);
+                       g_signal_connect (gtk_builder_get_object (priv->commons->gtkbuilder, "button88"),
+                                         "clicked", G_CALLBACK (segnalazioni_on_btn_seleziona_clicked), (gpointer)a);
+               }
+       else
+               {
+                       gtk_widget_hide (GTK_WIDGET (gtk_builder_get_object (priv->commons->gtkbuilder, "button87")));
+                       gtk_widget_hide (GTK_WIDGET (gtk_builder_get_object (priv->commons->gtkbuilder, "button88")));
+               }
+
+       segnalazioni_gestione_permessi (a);
+
+       segnalazioni_carica (a);
+
+       return a;
+}
+
+/**
+ * segnalazioni_get_widget:
+ * @segnalazioni:
+ *
+ */
+GtkWidget
+*segnalazioni_get_widget (Segnalazioni *segnalazioni)
+{
+       SegnalazioniPrivate *priv = SEGNALAZIONI_GET_PRIVATE (segnalazioni);
+
+       return priv->widget;
+}
+
+/**
+ * segnalazioni_show:
+ * @segnalazioni:
+ * @parent:
+ */
+GtkWidget
+*segnalazioni_show (Segnalazioni *segnalazioni, GtkWindow *parent)
+{
+       GtkWidget *w;
+
+       SegnalazioniPrivate *priv = SEGNALAZIONI_GET_PRIVATE (segnalazioni);
+
+       w = segnalazioni_get_widget (segnalazioni);
+       if (parent != NULL)
+               {
+                       gtk_window_set_transient_for (GTK_WINDOW (w), parent);
+               }
+       gtk_widget_show_all (w);
+
+       return w;
+}
+
+/* PRIVATE */
+static void
+segnalazioni_gestione_permessi (Segnalazioni *segnalazioni)
+{
+       SegnalazioniPrivate *priv = SEGNALAZIONI_GET_PRIVATE (segnalazioni);
+
+       ZakAuthoIResource *ires1;
+
+       ires1 = zak_autho_get_resource_from_id (priv->commons->autoz, "cancelleria_rw");
+       if (!zak_autho_is_allowed (priv->commons->autoz, priv->commons->role_utente, ires1, FALSE))
+               {
+                       gtk_widget_set_sensitive (GTK_WIDGET (gtk_builder_get_object (priv->commons->gtkbuilder, "button83")), FALSE);
+                       gtk_widget_set_sensitive (GTK_WIDGET (gtk_builder_get_object (priv->commons->gtkbuilder, "button85")), FALSE);
+               }
+}
+
+static void
+missing_func (GtkTreeStore *tstore, GtkTreeIter *iter, gpointer user_data)
+{
+       GString *ret;
+       guint key;
+
+       Segnalazioni *f = (Segnalazioni *)user_data;
+       SegnalazioniPrivate *priv = SEGNALAZIONI_GET_PRIVATE (f);
+
+       ret = g_string_new ("");
+
+       gtk_tree_model_get (GTK_TREE_MODEL (tstore), iter,
+                                               1, &key,
+                                               -1);
+
+       if (key > 0)
+               {
+                       g_string_append (ret,
+                                                        categoria_get_descrizione_with_parent (priv->commons, key));
+               }
+
+       gtk_tree_store_set (tstore, iter,
+                                               2, ret->str,
+                                               -1);
+}
+
+static void
+segnalazioni_carica (Segnalazioni *segnalazioni)
+{
+       gchar *sql;
+
+       SegnalazioniPrivate *priv = SEGNALAZIONI_GET_PRIVATE (segnalazioni);
+
+       gtk_tree_store_clear (priv->tstore_segnalazioni);
+
+       if (!GDAEX_IS_QUERY_EDITOR (priv->qe)
+               || gdaex_query_editor_get_sql_where (priv->qe) == NULL
+               || g_strcmp0 (gdaex_query_editor_get_sql_where (priv->qe), "") == 0)
+               {
+                       sql = g_strdup_printf ("SELECT c.id, c.id_categorie, c.descrizione"
+                                                                  " FROM segnalazioni AS c"
+                                                                  " WHERE c.status <> 'E'"
+                                                                  " ORDER BY c.descrizione");
+               }
+       else
+               {
+                       sql = g_strconcat ("SELECT ",
+                                                          gdaex_query_editor_get_sql_select (priv->qe),
+                                                          " FROM ",
+                                                          gdaex_query_editor_get_sql_from (priv->qe),
+                                                          " WHERE ",
+                                                          gdaex_query_editor_get_sql_where (priv->qe),
+                                                          " AND segnalazioni.status <> 'E'"
+                                                          " ORDER BY segnalazioni.descrizione",
+                                                          NULL);
+               }
+
+       gdaex_grid_fill_from_sql_with_missing_func (priv->grid, priv->commons->gdaex,
+                                                                                               sql,
+                                                                                               missing_func,
+                                                                                               (gpointer)segnalazioni,
+                                                                                               NULL);
+
+       g_free (sql);
+}
+
+static void
+segnalazioni_modifica (Segnalazioni *segnalazioni)
+{
+       GtkTreeIter iter;
+       gchar *id;
+
+       SegnalazioniPrivate *priv = SEGNALAZIONI_GET_PRIVATE (segnalazioni);
+
+       if (gtk_tree_selection_get_selected (priv->selection, NULL, &iter))
+               {
+                       GtkWidget *w;
+
+                       gtk_tree_model_get (GTK_TREE_MODEL (priv->tstore_segnalazioni), &iter,
+                                           COL_ID, &id,
+                                           -1);
+
+                       Segnalazione *c = segnalazione_new (priv->commons, strtol (id, NULL, 10));
+
+                       g_signal_connect (G_OBJECT (c), "aggiornato",
+                                         G_CALLBACK (segnalazioni_on_segnalazione_aggiornato), (gpointer)segnalazioni);
+
+                       w = segnalazione_get_widget (c);
+                       gtk_window_set_transient_for (GTK_WINDOW (w), GTK_WINDOW (priv->transient));
+                       gtk_widget_show (w);
+               }
+       else
+               {
+                       solipa_message_dialog (priv->transient,
+                                              GTK_MESSAGE_WARNING,
+                                              GTK_BUTTONS_OK,
+                                              "Occorre prima selezionare una segnalazione.");
+               }
+}
+
+static void
+segnalazioni_selezionato (Segnalazioni *segnalazioni)
+{
+       GtkTreeIter iter;
+       gchar *id;
+
+       SegnalazioniClass *klass = SEGNALAZIONI_GET_CLASS (segnalazioni);
+       SegnalazioniPrivate *priv = SEGNALAZIONI_GET_PRIVATE (segnalazioni);
+
+       if (gtk_tree_selection_get_selected (priv->selection, NULL, &iter))
+               {
+                       gtk_tree_model_get (GTK_TREE_MODEL (priv->tstore_segnalazioni), &iter,
+                                           COL_ID, &id,
+                                           -1);
+
+                       g_signal_emit (G_OBJECT (segnalazioni), klass->selezionato_signal_id, 0, strtol (id, NULL, 10));
+
+                       gtk_widget_destroy (priv->widget);
+                       g_object_unref (G_OBJECT (segnalazioni));
+               }
+       else
+               {
+                       solipa_message_dialog (priv->transient,
+                                              GTK_MESSAGE_WARNING,
+                                              GTK_BUTTONS_OK,
+                                              "Occorre prima selezionare un segnalazione.");
+               }
+}
+
+static void
+segnalazioni_on_segnalazione_aggiornato (gpointer instance, gpointer user_data)
+{
+       segnalazioni_carica ((Segnalazioni *)user_data);
+}
+
+static void
+segnalazioni_on_segnalazioni_qe_selezionato (gpointer instance, gpointer parametri, gpointer user_data)
+{
+       Segnalazioni *segnalazioni = SEGNALAZIONI (user_data);
+       SegnalazioniPrivate *priv = SEGNALAZIONI_GET_PRIVATE (segnalazioni);
+
+       priv->qe = (GdaExQueryEditor *)parametri;
+       segnalazioni_carica (segnalazioni);
+}
+
+static void
+segnalazioni_set_property (GObject *object, guint property_id, const GValue *value, GParamSpec *pspec)
+{
+       Segnalazioni *segnalazioni = SEGNALAZIONI (object);
+       SegnalazioniPrivate *priv = SEGNALAZIONI_GET_PRIVATE (segnalazioni);
+
+       switch (property_id)
+               {
+                       default:
+                               G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
+                               break;
+               }
+}
+
+static void
+segnalazioni_get_property (GObject *object, guint property_id, GValue *value, GParamSpec *pspec)
+{
+       Segnalazioni *segnalazioni = SEGNALAZIONI (object);
+       SegnalazioniPrivate *priv = SEGNALAZIONI_GET_PRIVATE (segnalazioni);
+
+       switch (property_id)
+               {
+                       default:
+                               G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
+                               break;
+               }
+}
+
+/* CALLBACK */
+static void
+segnalazioni_on_wgrid_map (GtkWidget *widget,
+                                          gpointer user_data)
+{
+       gtk_widget_grab_focus (widget);
+}
+
+static gboolean
+segnalazioni_on_key_release_event (GtkWidget *widget,
+                            GdkEventKey *event,
+                            gpointer user_data)
+{
+       switch (event->keyval)
+               {
+                       case GDK_KEY_F2:
+                               {
+                                       SegnalazioniPrivate *priv = SEGNALAZIONI_GET_PRIVATE ((Segnalazioni *)user_data);
+
+                                       gtk_button_clicked (GTK_BUTTON (gtk_builder_get_object (priv->commons->gtkbuilder, "button86")));
+                                       return TRUE;
+                               }
+
+                       case GDK_KEY_Escape:
+                               {
+                                       SegnalazioniPrivate *priv = SEGNALAZIONI_GET_PRIVATE ((Segnalazioni *)user_data);
+
+                                       gtk_button_clicked (GTK_BUTTON (gtk_builder_get_object (priv->commons->gtkbuilder, "button87")));
+                                       return TRUE;
+                               }
+               }
+
+       return FALSE;
+}
+
+static void
+segnalazioni_on_btn_nuovo_clicked (GtkButton *button,
+                      gpointer user_data)
+{
+       GtkWidget *w;
+
+       Segnalazioni *segnalazioni = (Segnalazioni *)user_data;
+       SegnalazioniPrivate *priv = SEGNALAZIONI_GET_PRIVATE (segnalazioni);
+
+       Segnalazione *c = segnalazione_new (priv->commons, 0);
+
+       g_signal_connect (G_OBJECT (c), "aggiornato",
+                         G_CALLBACK (segnalazioni_on_segnalazione_aggiornato), user_data);
+
+       w = segnalazione_get_widget (c);
+       gtk_window_set_transient_for (GTK_WINDOW (w), GTK_WINDOW (priv->transient));
+       gtk_widget_show (w);
+}
+
+static void
+segnalazioni_on_btn_modifica_clicked (GtkButton *button,
+                      gpointer user_data)
+{
+       segnalazioni_modifica ((Segnalazioni *)user_data);
+}
+
+static void
+segnalazioni_on_btn_elimina_clicked (GtkButton *button,
+                        gpointer user_data)
+{
+       GtkTreeIter iter;
+       gchar *id;
+
+       Segnalazioni *segnalazioni = (Segnalazioni *)user_data;
+       SegnalazioniPrivate *priv = SEGNALAZIONI_GET_PRIVATE (segnalazioni);
+
+       if (gtk_tree_selection_get_selected (priv->selection, NULL, &iter))
+               {
+                       if (solipa_message_dialog (priv->transient,
+                                                  GTK_MESSAGE_QUESTION,
+                                                  GTK_BUTTONS_YES_NO,
+                                                  "Sicuro di voler eliminare la segnalazione selezionata?") == GTK_RESPONSE_YES)
+                               {
+                                       gtk_tree_model_get (GTK_TREE_MODEL (priv->tstore_segnalazioni), &iter,
+                                                           COL_ID, &id,
+                                                           -1);
+
+                                       gdaex_execute (priv->commons->gdaex,
+                                                      g_strdup_printf ("UPDATE segnalazioni SET status = 'E' WHERE id = %d", strtol (id, NULL, 10)));
+
+                                       segnalazioni_carica (segnalazioni);
+                               }
+               }
+       else
+               {
+                       solipa_message_dialog (priv->transient,
+                                              GTK_MESSAGE_WARNING,
+                                              GTK_BUTTONS_OK,
+                                              "Occorre prima selezionare una segnalazione.");
+               }
+}
+
+static void
+segnalazioni_on_trv_segnalazioni_row_activated (GtkTreeView *tree_view,
+                                                GtkTreePath *tree_path,
+                                                GtkTreeViewColumn *column,
+                                                gpointer user_data)
+{
+       SegnalazioniPrivate *priv = SEGNALAZIONI_GET_PRIVATE ((Segnalazioni *)user_data);
+
+       if (priv->selezione)
+               {
+                       segnalazioni_selezionato ((Segnalazioni *)user_data);
+               }
+       else
+               {
+                       segnalazioni_modifica ((Segnalazioni *)user_data);
+               }
+}
+
+static void
+segnalazioni_on_btn_trova_clicked (GtkButton *button,
+                        gpointer user_data)
+{
+       SegnalazioniPrivate *priv = SEGNALAZIONI_GET_PRIVATE ((Segnalazioni *)user_data);
+
+       SegnalazioniQe *c = segnalazioni_qe_new (priv->commons, priv->qe);
+
+       g_signal_connect (G_OBJECT (c), "selezionato",
+                         G_CALLBACK (segnalazioni_on_segnalazioni_qe_selezionato), user_data);
+
+       segnalazioni_qe_show (c, GTK_WINDOW (priv->transient));
+}
+
+static void
+segnalazioni_on_btn_annulla_clicked (GtkButton *button,
+                        gpointer user_data)
+{
+       SegnalazioniPrivate *priv = SEGNALAZIONI_GET_PRIVATE ((Segnalazioni *)user_data);
+
+       gtk_widget_destroy (priv->widget);
+       g_object_unref (G_OBJECT (user_data));
+}
+
+static void
+segnalazioni_on_btn_seleziona_clicked (GtkButton *button,
+                        gpointer user_data)
+{
+       segnalazioni_selezionato ((Segnalazioni *)user_data);
+}
diff --git a/src/segnalazioni.h b/src/segnalazioni.h
new file mode 100644 (file)
index 0000000..fa1814b
--- /dev/null
@@ -0,0 +1,66 @@
+/*
+ * Copyright (C) 2016 Andrea Zagli <azagli@libero.it>
+ *
+ * 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 __SEGNALAZIONI_H__
+#define __SEGNALAZIONI_H__
+
+#include <glib.h>
+#include <glib-object.h>
+
+#include <gtk/gtk.h>
+
+#include "commons.h"
+
+G_BEGIN_DECLS
+
+
+#define TYPE_SEGNALAZIONI                 (segnalazioni_get_type ())
+#define SEGNALAZIONI(obj)                 (G_TYPE_CHECK_INSTANCE_CAST ((obj), TYPE_SEGNALAZIONI, Segnalazioni))
+#define SEGNALAZIONI_CLASS(klass)         (G_TYPE_CHECK_CLASS_CAST ((klass), TYPE_SEGNALAZIONI, SegnalazioniClass))
+#define IS_SEGNALAZIONI(obj)              (G_TYPE_CHECK_INSTANCE_TYPE ((obj), TYPE_SEGNALAZIONI))
+#define IS_SEGNALAZIONI_CLASS(klass)      (G_TYPE_CHECK_CLASS_TYPE ((klass), TYPE_SEGNALAZIONI))
+#define SEGNALAZIONI_GET_CLASS(obj)       (G_TYPE_INSTANCE_GET_CLASS ((obj), TYPE_SEGNALAZIONI, SegnalazioniClass))
+
+
+typedef struct _Segnalazioni Segnalazioni;
+typedef struct _SegnalazioniClass SegnalazioniClass;
+
+struct _Segnalazioni
+       {
+               GObject parent;
+       };
+
+struct _SegnalazioniClass
+       {
+               GObjectClass parent_class;
+
+               guint selezionato_signal_id;
+       };
+
+GType segnalazioni_get_type (void) G_GNUC_CONST;
+
+Segnalazioni *segnalazioni_new (BCityBECommons *commons, gboolean selezione);
+
+GtkWidget *segnalazioni_get_widget (Segnalazioni *segnalazioni);
+GtkWidget *segnalazioni_show (Segnalazioni *segnalazioni, GtkWindow *parent);
+
+
+G_END_DECLS
+
+#endif /* __SEGNALAZIONI_H__ */
diff --git a/src/segnalazioniqe.c b/src/segnalazioniqe.c
new file mode 100644 (file)
index 0000000..2239ab7
--- /dev/null
@@ -0,0 +1,368 @@
+/*
+ * Copyright (C) 2016 Andrea Zagli <azagli@libero.it>
+ *
+ * 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 <config.h>
+#endif
+
+#include <gdk/gdk.h>
+
+#include <libsolipa/libsolipa.h>
+
+#include <libzakgtkdecoder/libzakgtkdecoder.h>
+#include <libzakgtkdecodergdaexqe/libzakgtkdecodergdaexqe.h>
+
+#include "segnalazioniqe.h"
+#include "categoria.h"
+#include "categorie.h"
+
+static void segnalazioni_qe_class_init (SegnalazioniQeClass *klass);
+static void segnalazioni_qe_init (SegnalazioniQe *segnalazioni_qe);
+
+static void segnalazioni_qe_selezionato (SegnalazioniQe *segnalazioni_qe);
+
+static void segnalazioni_qe_set_property (GObject *object,
+                                     guint property_id,
+                                     const GValue *value,
+                                     GParamSpec *pspec);
+static void segnalazioni_qe_get_property (GObject *object,
+                                     guint property_id,
+                                     GValue *value,
+                                     GParamSpec *pspec);
+
+static void segnalazioni_qe_on_btn_categoria_browse_clicked (GtkButton *button, gpointer user_data);
+static void segnalazioni_qe_on_categoria_selezionato (gpointer instance, guint id, gpointer user_data);
+static gchar *segnalazioni_qe_on_categoria_decode (gpointer instance, gchar *key, gpointer user_data);
+
+static void segnalazioni_qe_on_iwidget_init (gpointer instance,
+                                                                                GdaExQueryEditorIWidget *iwidget,
+                                                                                gchar *table_name, gchar *field_name,
+                                                                                gboolean from,
+                                                                                gpointer user_data);
+
+static gboolean segnalazioni_qe_on_key_release_event (GtkWidget *widget,
+                            GdkEventKey *event,
+                            gpointer user_data);
+
+static void segnalazioni_qe_on_btn_annulla_clicked (GtkButton *button,
+                                    gpointer user_data);
+static void segnalazioni_qe_on_btn_seleziona_clicked (GtkButton *button,
+                                  gpointer user_data);
+
+#define SEGNALAZIONI_QE_GET_PRIVATE(obj) (G_TYPE_INSTANCE_GET_PRIVATE ((obj), TYPE_SEGNALAZIONI_QE, SegnalazioniQePrivate))
+
+typedef struct _SegnalazioniQePrivate SegnalazioniQePrivate;
+struct _SegnalazioniQePrivate
+       {
+               BCityBECommons *commons;
+
+               GtkWidget *widget;
+
+               GdaExQueryEditor *qe;
+               GtkWidget *wqe;
+
+               GtkWidget *iwidget_categoria;
+       };
+
+G_DEFINE_TYPE (SegnalazioniQe, segnalazioni_qe, G_TYPE_OBJECT)
+
+static void
+segnalazioni_qe_class_init (SegnalazioniQeClass *klass)
+{
+       GObjectClass *object_class = G_OBJECT_CLASS (klass);
+
+       g_type_class_add_private (object_class, sizeof (SegnalazioniQePrivate));
+
+       object_class->set_property = segnalazioni_qe_set_property;
+       object_class->get_property = segnalazioni_qe_get_property;
+
+       /**
+        * SegnalazioniQe::selezionato:
+        * @segnalazioni_qe:
+        *
+        */
+       klass->selezionato_signal_id = g_signal_new ("selezionato",
+                                                      G_TYPE_FROM_CLASS (object_class),
+                                                      G_SIGNAL_RUN_LAST,
+                                                      0,
+                                                      NULL,
+                                                      NULL,
+                                                      g_cclosure_marshal_VOID__UINT,
+                                                      G_TYPE_NONE,
+                                                      1, G_TYPE_UINT);
+}
+
+static void
+segnalazioni_qe_init (SegnalazioniQe *segnalazioni_qe)
+{
+       SegnalazioniQePrivate *priv = SEGNALAZIONI_QE_GET_PRIVATE (segnalazioni_qe);
+}
+
+/**
+ * segnalazioni_qe_new:
+ * @commons:
+ * @qe:
+ *
+ * Returns: the newly created #SegnalazioniQe object.
+ */
+SegnalazioniQe
+*segnalazioni_qe_new (BCityBECommons *commons, GdaExQueryEditor *qe)
+{
+       GError *error;
+
+       SegnalazioniQe *a = SEGNALAZIONI_QE (g_object_new (segnalazioni_qe_get_type (), NULL));
+
+       SegnalazioniQePrivate *priv = SEGNALAZIONI_QE_GET_PRIVATE (a);
+
+       priv->commons = commons;
+
+       error = NULL;
+       gtk_builder_add_objects_from_file (priv->commons->gtkbuilder, priv->commons->guifile,
+                                          g_strsplit ("w_segnalazioni_qe",
+                                                                                                  "|", -1),
+                                          &error);
+       if (error != NULL)
+               {
+                       g_warning ("Errore: %s.", error->message);
+                       return NULL;
+               }
+
+       priv->widget = GTK_WIDGET (gtk_builder_get_object (priv->commons->gtkbuilder, "w_segnalazioni_qe"));
+
+       g_signal_connect (priv->widget,
+                         "key-release-event", G_CALLBACK (segnalazioni_qe_on_key_release_event), (gpointer)a);
+
+       g_signal_connect (gtk_builder_get_object (priv->commons->gtkbuilder, "button89"),
+                                         "clicked", G_CALLBACK (segnalazioni_qe_on_btn_annulla_clicked), (gpointer)a);
+       g_signal_connect (gtk_builder_get_object (priv->commons->gtkbuilder, "button90"),
+                                         "clicked", G_CALLBACK (segnalazioni_qe_on_btn_seleziona_clicked), (gpointer)a);
+
+       if (!GDAEX_IS_QUERY_EDITOR (qe))
+               {
+                       priv->qe = gdaex_query_editor_new (priv->commons->gdaex);
+
+                       g_signal_connect (G_OBJECT (priv->qe), "iwidget-init",
+                                                         G_CALLBACK (segnalazioni_qe_on_iwidget_init), (gpointer)a);
+
+                       gdaex_query_editor_load_tables_from_file (priv->qe, g_build_filename (commons->queryeditordir, "segnalazioni.xml", NULL), TRUE);
+                       gdaex_query_editor_set_show_visible (priv->qe, FALSE);
+                       gdaex_query_editor_set_order_visible (priv->qe, FALSE);
+               }
+       else
+               {
+                       priv->qe = qe;
+               }
+
+       priv->wqe = gdaex_query_editor_get_widget (priv->qe);
+       gtk_box_pack_start (GTK_BOX (gtk_builder_get_object (priv->commons->gtkbuilder, "vbox14")),
+                                               priv->wqe,
+                                               TRUE, TRUE, 0);
+       gtk_box_reorder_child (GTK_BOX (gtk_builder_get_object (priv->commons->gtkbuilder, "vbox14")),
+                                                  priv->wqe,
+                                                  0);
+
+       return a;
+}
+
+/**
+ * segnalazioni_qe_get_widget:
+ * @segnalazioni_qe:
+ *
+ */
+GtkWidget
+*segnalazioni_qe_get_widget (SegnalazioniQe *segnalazioni_qe)
+{
+       SegnalazioniQePrivate *priv = SEGNALAZIONI_QE_GET_PRIVATE (segnalazioni_qe);
+
+       return priv->widget;
+}
+
+/**
+ * segnalazioni_qe_show:
+ * @segnalazioni_qe:
+ * @parent:
+ */
+GtkWidget
+*segnalazioni_qe_show (SegnalazioniQe *segnalazioni_qe, GtkWindow *parent)
+{
+       GtkWidget *w;
+
+       SegnalazioniQePrivate *priv = SEGNALAZIONI_QE_GET_PRIVATE (segnalazioni_qe);
+
+       w = segnalazioni_qe_get_widget (segnalazioni_qe);
+       if (parent != NULL)
+               {
+                       gtk_window_set_transient_for (GTK_WINDOW (w), parent);
+               }
+       gtk_widget_show_all (w);
+
+       return w;
+}
+
+/* PRIVATE */
+static void
+segnalazioni_qe_selezionato (SegnalazioniQe *segnalazioni_qe)
+{
+       SegnalazioniQeClass *klass = SEGNALAZIONI_QE_GET_CLASS (segnalazioni_qe);
+       SegnalazioniQePrivate *priv = SEGNALAZIONI_QE_GET_PRIVATE (segnalazioni_qe);
+
+       g_signal_emit (G_OBJECT (segnalazioni_qe), klass->selezionato_signal_id, 0, (gpointer)priv->qe);
+
+       gtk_container_remove (GTK_CONTAINER (gtk_builder_get_object (priv->commons->gtkbuilder, "vbox14")),
+                                                 priv->wqe);
+
+       gtk_widget_destroy (priv->widget);
+       g_object_unref (G_OBJECT (segnalazioni_qe));
+}
+
+static void
+segnalazioni_qe_set_property (GObject *object, guint property_id, const GValue *value, GParamSpec *pspec)
+{
+       SegnalazioniQe *segnalazioni_qe = SEGNALAZIONI_QE (object);
+       SegnalazioniQePrivate *priv = SEGNALAZIONI_QE_GET_PRIVATE (segnalazioni_qe);
+
+       switch (property_id)
+               {
+                       default:
+                               G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
+                               break;
+               }
+}
+
+static void
+segnalazioni_qe_get_property (GObject *object, guint property_id, GValue *value, GParamSpec *pspec)
+{
+       SegnalazioniQe *segnalazioni_qe = SEGNALAZIONI_QE (object);
+       SegnalazioniQePrivate *priv = SEGNALAZIONI_QE_GET_PRIVATE (segnalazioni_qe);
+
+       switch (property_id)
+               {
+                       default:
+                               G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
+                               break;
+               }
+}
+
+/* CALLBACK */
+static void
+segnalazioni_qe_on_btn_categoria_browse_clicked (GtkButton *button,
+                                    gpointer user_data)
+{
+       SegnalazioniQe *iva = (SegnalazioniQe *)user_data;
+       SegnalazioniQePrivate *priv = SEGNALAZIONI_QE_GET_PRIVATE (iva);
+
+       Categorie *c = categorie_new (priv->commons, TRUE);
+
+       g_signal_connect (G_OBJECT (c), "selezionato",
+                         G_CALLBACK (segnalazioni_qe_on_categoria_selezionato), user_data);
+
+       categorie_show (c, GTK_WINDOW (priv->widget));
+}
+
+static void
+segnalazioni_qe_on_categoria_selezionato (gpointer instance, guint id, gpointer user_data)
+{
+       SegnalazioniQe *f = (SegnalazioniQe *)user_data;
+       SegnalazioniQePrivate *priv = SEGNALAZIONI_QE_GET_PRIVATE (f);
+
+       zak_gtk_decoder_set_key (ZAK_GTK_DECODER (priv->iwidget_categoria),
+                                                        g_strdup_printf ("%d", id));
+}
+
+static gchar
+*segnalazioni_qe_on_categoria_decode (gpointer instance, gchar *key, gpointer user_data)
+{
+       GString *ret;
+       gchar *sql;
+       GdaDataModel *dm;
+
+       SegnalazioniQe *f = (SegnalazioniQe *)user_data;
+       SegnalazioniQePrivate *priv = SEGNALAZIONI_QE_GET_PRIVATE (f);
+
+       ret = g_string_new ("");
+
+       g_string_append (ret, categoria_get_descrizione_with_parent (priv->commons, strtol (key, NULL, 10)));
+
+       return ret->str;
+}
+
+static void
+segnalazioni_qe_on_iwidget_init (gpointer instance,
+                                                        GdaExQueryEditorIWidget *iwidget,
+                                                        gchar *table_name,
+                                                        gchar *field_name,
+                                                        gboolean from,
+                                                        gpointer user_data)
+{
+       SegnalazioniQe *f = (SegnalazioniQe *)user_data;
+       SegnalazioniQePrivate *priv = SEGNALAZIONI_QE_GET_PRIVATE (f);
+
+       if (from
+               && g_strcmp0 (table_name, "segnalazioni") == 0)
+               {
+                       if (g_strcmp0 (field_name, "id_categorie") == 0)
+                               {
+                                       priv->iwidget_categoria = GTK_WIDGET (iwidget);
+
+                                       g_signal_connect (G_OBJECT (iwidget), "btn-browse-clicked",
+                                                                         G_CALLBACK (segnalazioni_qe_on_btn_categoria_browse_clicked), user_data);
+                                       g_signal_connect (G_OBJECT (iwidget), "decode",
+                                                                         G_CALLBACK (segnalazioni_qe_on_categoria_decode), user_data);
+                               }
+               }
+}
+
+static gboolean
+segnalazioni_qe_on_key_release_event (GtkWidget *widget,
+                            GdkEventKey *event,
+                            gpointer user_data)
+{
+       switch (event->keyval)
+               {
+                       case GDK_KEY_Escape:
+                               {
+                                       SegnalazioniQePrivate *priv = SEGNALAZIONI_QE_GET_PRIVATE ((SegnalazioniQe *)user_data);
+
+                                       gtk_button_clicked (GTK_BUTTON (gtk_builder_get_object (priv->commons->gtkbuilder, "button89")));
+                                       return TRUE;
+                               }
+               }
+
+       return FALSE;
+}
+
+static void
+segnalazioni_qe_on_btn_annulla_clicked (GtkButton *button,
+                        gpointer user_data)
+{
+       SegnalazioniQePrivate *priv = SEGNALAZIONI_QE_GET_PRIVATE ((SegnalazioniQe *)user_data);
+
+       gtk_container_remove (GTK_CONTAINER (gtk_builder_get_object (priv->commons->gtkbuilder, "vbox14")),
+                                                 priv->wqe);
+
+       gtk_widget_destroy (priv->widget);
+       g_object_unref (G_OBJECT (user_data));
+}
+
+static void
+segnalazioni_qe_on_btn_seleziona_clicked (GtkButton *button,
+                        gpointer user_data)
+{
+       segnalazioni_qe_selezionato ((SegnalazioniQe *)user_data);
+}
diff --git a/src/segnalazioniqe.h b/src/segnalazioniqe.h
new file mode 100644 (file)
index 0000000..7466ab7
--- /dev/null
@@ -0,0 +1,66 @@
+/*
+ * Copyright (C) 2016 Andrea Zagli <azagli@libero.it>
+ *
+ * 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 __SEGNALAZIONI_QE_H__
+#define __SEGNALAZIONI_QE_H__
+
+#include <glib.h>
+#include <glib-object.h>
+
+#include <gtk/gtk.h>
+
+#include "commons.h"
+
+G_BEGIN_DECLS
+
+
+#define TYPE_SEGNALAZIONI_QE                 (segnalazioni_qe_get_type ())
+#define SEGNALAZIONI_QE(obj)                 (G_TYPE_CHECK_INSTANCE_CAST ((obj), TYPE_SEGNALAZIONI_QE, SegnalazioniQe))
+#define SEGNALAZIONI_QE_CLASS(klass)         (G_TYPE_CHECK_CLASS_CAST ((klass), TYPE_SEGNALAZIONI_QE, SegnalazioniQeClass))
+#define IS_SEGNALAZIONI_QE(obj)              (G_TYPE_CHECK_INSTANCE_TYPE ((obj), TYPE_SEGNALAZIONI_QE))
+#define IS_SEGNALAZIONI_QE_CLASS(klass)      (G_TYPE_CHECK_CLASS_TYPE ((klass), TYPE_SEGNALAZIONI_QE))
+#define SEGNALAZIONI_QE_GET_CLASS(obj)       (G_TYPE_INSTANCE_GET_CLASS ((obj), TYPE_SEGNALAZIONI_QE, SegnalazioniQeClass))
+
+
+typedef struct _SegnalazioniQe SegnalazioniQe;
+typedef struct _SegnalazioniQeClass SegnalazioniQeClass;
+
+struct _SegnalazioniQe
+       {
+               GObject parent;
+       };
+
+struct _SegnalazioniQeClass
+       {
+               GObjectClass parent_class;
+
+               guint selezionato_signal_id;
+       };
+
+GType segnalazioni_qe_get_type (void) G_GNUC_CONST;
+
+SegnalazioniQe *segnalazioni_qe_new (BCityBECommons *commons, GdaExQueryEditor *qe);
+
+GtkWidget *segnalazioni_qe_get_widget (SegnalazioniQe *segnalazioni_qe);
+GtkWidget *segnalazioni_qe_show (SegnalazioniQe *segnalazioni_qe, GtkWindow *parent);
+
+
+G_END_DECLS
+
+#endif /* __SEGNALAZIONI_QE_H__ */