Comments dialog: convert to PsppireDialogAction
authorJohn Darrington <john@darrington.wattle.id.au>
Tue, 29 Dec 2015 11:31:46 +0000 (12:31 +0100)
committerJohn Darrington <john@darrington.wattle.id.au>
Tue, 29 Dec 2015 11:31:46 +0000 (12:31 +0100)
src/ui/gui/automake.mk
src/ui/gui/comments-dialog.c [deleted file]
src/ui/gui/comments-dialog.h [deleted file]
src/ui/gui/data-editor.ui
src/ui/gui/psppire-data-window.c
src/ui/gui/psppire-dialog-action-comments.c [new file with mode: 0644]
src/ui/gui/psppire-dialog-action-comments.h [new file with mode: 0644]
src/ui/gui/psppire-dialog-action.c
src/ui/gui/widgets.c

index c2577cb8459f618854ab923a1a4f95d42a883f9a..9903fd229b09f63eb78b3bf697a0c5297050a1e4 100644 (file)
@@ -151,8 +151,6 @@ src_ui_gui_psppire_SOURCES = \
        src/ui/gui/psppire-import-assistant.h \
        src/ui/gui/builder-wrapper.c \
        src/ui/gui/builder-wrapper.h \
-       src/ui/gui/comments-dialog.c \
-       src/ui/gui/comments-dialog.h \
        src/ui/gui/dialog-common.c \
        src/ui/gui/dialog-common.h \
        src/ui/gui/dict-display.h \
@@ -205,6 +203,8 @@ src_ui_gui_psppire_SOURCES = \
        src/ui/gui/psppire-dialog-action-chisquare.h \
        src/ui/gui/psppire-dialog-action-compute.c \
        src/ui/gui/psppire-dialog-action-compute.h \
+       src/ui/gui/psppire-dialog-action-comments.c \
+       src/ui/gui/psppire-dialog-action-comments.h \
        src/ui/gui/psppire-dialog-action-count.c \
        src/ui/gui/psppire-dialog-action-count.h \
        src/ui/gui/psppire-dialog-action-correlation.c \
diff --git a/src/ui/gui/comments-dialog.c b/src/ui/gui/comments-dialog.c
deleted file mode 100644 (file)
index 58cf7e7..0000000
+++ /dev/null
@@ -1,247 +0,0 @@
-/* PSPPIRE - a graphical user interface for PSPP.
-   Copyright (C) 2007, 2010, 2011, 2012, 2013  Free Software Foundation
-
-   This program is free software: you can redistribute it and/or modify
-   it under the terms of the GNU General Public License as published by
-   the Free Software Foundation, either version 3 of the License, or
-   (at your option) any later version.
-
-   This program 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 General Public License for more details.
-
-   You should have received a copy of the GNU General Public License
-   along with this program.  If not, see <http://www.gnu.org/licenses/>. */
-
-#include <config.h>
-
-#include "psppire-dialog.h"
-#include "builder-wrapper.h"
-#include "psppire-data-window.h"
-#include "psppire-data-editor.h"
-#include "executor.h"
-#include "helper.h"
-#include <ui/syntax-gen.h>
-
-#include "comments-dialog.h"
-
-#include "dialog-common.h"
-
-#include <gtk/gtk.h>
-
-#include <gettext.h>
-
-#define _(msgid) gettext (msgid)
-#define N_(msgid) msgid
-
-
-struct comment_dialog
-{
-  GtkBuilder *xml;
-  PsppireDict *dict;
-};
-
-static void refresh (PsppireDialog *dialog, const struct comment_dialog *);
-static char *generate_syntax (const struct comment_dialog *);
-
-static void
-set_column_number (GtkTextBuffer *textbuffer,
-     GtkTextIter   *iter,
-     GtkTextMark   *mark,
-     gpointer       data)
-{
-  GtkLabel *label = data;
-  gchar *text ;
-
-  text = g_strdup_printf ( _("Column Number: %d"),
-                          1 + gtk_text_iter_get_line_offset (iter));
-
-  gtk_label_set_text (label, text);
-
-  g_free (text);
-}
-
-static void
-wrap_line (GtkTextBuffer *buffer,
-     GtkTextIter   *iter,
-     gchar         *text,
-     gint           count,
-     gpointer       data)
-{
-  gint chars = gtk_text_iter_get_chars_in_line (iter);
-
-  if ( chars > DOC_LINE_LENGTH )
-    {
-      GtkTextIter line_fold = *iter;
-
-      gtk_text_iter_set_line_offset (&line_fold, DOC_LINE_LENGTH);
-
-      gtk_text_buffer_insert (buffer, &line_fold, "\r\n", 2);
-    }
-
-}
-
-
-void
-comments_dialog (PsppireDataWindow *de)
-{
-  GtkTextIter iter;
-  gint response ;
-  struct comment_dialog cd;
-
-  GtkBuilder *xml = builder_new ("comments.ui");
-
-  GtkWidget *dialog = get_widget_assert (xml, "comments-dialog");
-  GtkWidget *textview = get_widget_assert (xml, "comments-textview1");
-  GtkWidget *label = get_widget_assert (xml, "column-number-label");
-  GtkTextBuffer *buffer = gtk_text_view_get_buffer (GTK_TEXT_VIEW (textview));
-
-
-  gtk_window_set_transient_for (GTK_WINDOW (dialog), GTK_WINDOW (de));
-
-  {
-    PangoContext * context ;
-    PangoLayout *  layout ;
-    PangoRectangle rect;
-
-    /* Since we're going to truncate lines to 80 chars,
-       we need a monospaced font otherwise it'll look silly */
-    PangoFontDescription *font_desc =
-      pango_font_description_from_string ("monospace");
-
-    gtk_widget_override_font (textview, font_desc);
-
-    /* and let's just make sure that a complete line fits into the
-       widget's width */
-    context = gtk_widget_create_pango_context (textview);
-    layout = pango_layout_new (context);
-
-    pango_layout_set_text (layout, "M", 1);
-
-    pango_layout_set_font_description (layout, font_desc);
-
-    pango_layout_get_extents (layout, NULL, &rect);
-
-    g_object_set (textview, "width-request",
-                 PANGO_PIXELS (rect.width) * DOC_LINE_LENGTH + 20, NULL);
-
-    g_object_unref (G_OBJECT (layout));
-    g_object_unref (G_OBJECT (context));
-
-    pango_font_description_free (font_desc);
-  }
-
-  cd.xml = xml;
-  g_object_get (de->data_editor, "dictionary", &cd.dict, NULL);
-
-  g_signal_connect (buffer, "mark-set",
-                   G_CALLBACK (set_column_number), label);
-
-  g_signal_connect_after (buffer, "insert-text",
-                         G_CALLBACK (wrap_line), NULL);
-
-  gtk_text_buffer_get_iter_at_offset (buffer, &iter, 0);
-  gtk_text_buffer_place_cursor (buffer, &iter);
-
-
-  g_signal_connect (dialog, "refresh", G_CALLBACK (refresh),  &cd);
-
-
-  response = psppire_dialog_run (PSPPIRE_DIALOG (dialog));
-
-  switch (response)
-    {
-    case GTK_RESPONSE_OK:
-      g_free (execute_syntax_string (de, generate_syntax (&cd)));
-      break;
-    case PSPPIRE_RESPONSE_PASTE:
-      g_free (paste_syntax_to_window (generate_syntax (&cd)));
-      break;
-    default:
-      break;
-    }
-
-
-  g_object_unref (xml);
-}
-
-
-static void
-add_line_to_buffer (GtkTextBuffer *buffer, const char *line)
-{
-  gtk_text_buffer_insert_at_cursor (buffer, line, -1);
-
-  gtk_text_buffer_insert_at_cursor (buffer, "\n", 1);
-}
-
-static void
-refresh (PsppireDialog *dialog, const struct comment_dialog *cd)
-{
-  gint i;
-  GtkWidget *tv = get_widget_assert (cd->xml, "comments-textview1");
-  GtkTextBuffer *buffer = gtk_text_view_get_buffer (GTK_TEXT_VIEW (tv));
-
-  gtk_text_buffer_set_text (buffer, "", 0);
-
-  for ( i = 0 ; i < dict_get_document_line_cnt (cd->dict->dict); ++i )
-    add_line_to_buffer (buffer, dict_get_document_line (cd->dict->dict, i));
-}
-
-
-
-static char *
-generate_syntax (const struct comment_dialog *cd)
-{
-  gint i;
-
-  GString *str;
-  gchar *text;
-  GtkWidget *tv = get_widget_assert (cd->xml, "comments-textview1");
-  GtkWidget *check = get_widget_assert (cd->xml, "comments-checkbutton1");
-  GtkTextBuffer *buffer = gtk_text_view_get_buffer (GTK_TEXT_VIEW (tv));
-
-  str = g_string_new ("\n* Data File Comments.\n\n");
-
-  if (dict_get_documents (cd->dict->dict) != NULL)
-    g_string_append (str, "DROP DOCUMENTS.\n");
-
-  g_string_append (str, "ADD DOCUMENT\n");
-
-  for (i = 0 ; i < gtk_text_buffer_get_line_count (buffer) ; ++i )
-    {
-      struct string tmp;
-      GtkTextIter start;
-      char *line;
-
-      gtk_text_buffer_get_iter_at_line (buffer, &start, i);
-      if (gtk_text_iter_ends_line (&start))
-       line = g_strdup ("");
-      else
-        {
-          GtkTextIter end = start;
-          gtk_text_iter_forward_to_line_end (&end);
-          line = gtk_text_buffer_get_text (buffer, &start, &end, FALSE);
-        }
-
-      ds_init_empty (&tmp);
-      syntax_gen_string (&tmp, ss_cstr (line));
-      g_free (line);
-
-      g_string_append_printf (str, " %s\n", ds_cstr (&tmp));
-
-      ds_destroy (&tmp);
-    }
-  g_string_append (str, " .\n");
-
-
-
-  if ( gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (check)))
-    g_string_append (str, "DISPLAY DOCUMENTS.\n");
-
-  text = str->str;
-
-  g_string_free (str, FALSE);
-
-  return text;
-}
diff --git a/src/ui/gui/comments-dialog.h b/src/ui/gui/comments-dialog.h
deleted file mode 100644 (file)
index 9295d4c..0000000
+++ /dev/null
@@ -1,25 +0,0 @@
-/* PSPPIRE - a graphical user interface for PSPP.
-   Copyright (C) 2007 Free Software Foundation, Inc.
-
-   This program is free software: you can redistribute it and/or modify
-   it under the terms of the GNU General Public License as published by
-   the Free Software Foundation, either version 3 of the License, or
-   (at your option) any later version.
-
-   This program 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 General Public License for more details.
-
-   You should have received a copy of the GNU General Public License
-   along with this program.  If not, see <http://www.gnu.org/licenses/>. */
-
-
-#ifndef COMMENTS_DIALOG_H
-#define COMMENTS_DIALOG_H
-
-#include "psppire-data-window.h"
-
-void comments_dialog (PsppireDataWindow * data);
-
-#endif /*  COMMENTS_DIALOG_H */
index edca09d89cd1575bbde3a0af32a9b926f812bbea..8b0a29f9a0520290148fe8e2bd3bfecdf5e5f06f 100644 (file)
           </object>
         </child>
         <child>
-          <object class="GtkAction" id="utilities_comments">
+          <object class="PsppireDialogActionComments" id="utilities_comments">
+            <property name="manager">uimanager1</property>
             <property name="name">utilities_comments</property>
             <property name="label" translatable="yes">Data File _Comments...</property>
             <property name="stock-id">utilities-data-file-comments</property>
index 118387f97e32ad2779463e06e8179457121623b8..edf87831286f4a49b56cf093ee81958e0c8fc337 100644 (file)
@@ -25,7 +25,6 @@
 #include "libpspp/message.h"
 #include "libpspp/str.h"
 #include "ui/gui/builder-wrapper.h"
-#include "ui/gui/comments-dialog.h"
 #include "ui/gui/entry-dialog.h"
 #include "ui/gui/executor.h"
 #include "ui/gui/help-menu.h"
@@ -1046,7 +1045,6 @@ psppire_data_window_finish_init (PsppireDataWindow *de,
 
   connect_action (de, "data_select-cases", G_CALLBACK (select_cases_dialog));
   connect_action (de, "data_split-file", G_CALLBACK (split_file_dialog));
-  connect_action (de, "utilities_comments", G_CALLBACK (comments_dialog));
   connect_action (de, "transform_recode-same", G_CALLBACK (recode_same_dialog));
   connect_action (de, "transform_recode-different", G_CALLBACK (recode_different_dialog));
 
diff --git a/src/ui/gui/psppire-dialog-action-comments.c b/src/ui/gui/psppire-dialog-action-comments.c
new file mode 100644 (file)
index 0000000..4aad2a6
--- /dev/null
@@ -0,0 +1,254 @@
+/* PSPPIRE - a graphical user interface for PSPP.
+   Copyright (C)  2007, 2010, 2011, 2012, 2013, 2015  Free Software Foundation
+
+   This program is free software: you can redistribute it and/or modify
+   it under the terms of the GNU General Public License as published by
+   the Free Software Foundation, either version 3 of the License, or
+   (at your option) any later version.
+
+   This program 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 General Public License for more details.
+
+   You should have received a copy of the GNU General Public License
+   along with this program.  If not, see <http://www.gnu.org/licenses/>. */
+
+
+#include <config.h>
+
+#include "psppire-dialog-action-comments.h"
+#include "psppire-selector.h"
+#include "psppire-var-view.h"
+#include "dict-display.h"
+
+#include "psppire-dialog.h"
+#include "builder-wrapper.h"
+#include <ui/syntax-gen.h>
+
+#include <gettext.h>
+#define _(msgid) gettext (msgid)
+#define N_(msgid) msgid
+
+static void psppire_dialog_action_comments_init            (PsppireDialogActionComments      *act);
+static void psppire_dialog_action_comments_class_init      (PsppireDialogActionCommentsClass *class);
+
+G_DEFINE_TYPE (PsppireDialogActionComments, psppire_dialog_action_comments, PSPPIRE_TYPE_DIALOG_ACTION);
+
+static char *
+generate_syntax (PsppireDialogAction *pda)
+{
+  PsppireDialogActionComments *cd = PSPPIRE_DIALOG_ACTION_COMMENTS (pda);
+  gint i;
+
+  GString *str;
+  gchar *text;
+  GtkTextBuffer *buffer = gtk_text_view_get_buffer (GTK_TEXT_VIEW (cd->textview));
+
+  str = g_string_new ("\n* Data File Comments.\n\n");
+
+  if (dict_get_documents (pda->dict->dict) != NULL)
+    g_string_append (str, "DROP DOCUMENTS.\n");
+
+  g_string_append (str, "ADD DOCUMENT\n");
+
+  for (i = 0 ; i < gtk_text_buffer_get_line_count (buffer) ; ++i )
+    {
+      struct string tmp;
+      GtkTextIter start;
+      char *line;
+
+      gtk_text_buffer_get_iter_at_line (buffer, &start, i);
+      if (gtk_text_iter_ends_line (&start))
+       line = g_strdup ("");
+      else
+        {
+          GtkTextIter end = start;
+          gtk_text_iter_forward_to_line_end (&end);
+          line = gtk_text_buffer_get_text (buffer, &start, &end, FALSE);
+        }
+
+      ds_init_empty (&tmp);
+      syntax_gen_string (&tmp, ss_cstr (line));
+      g_free (line);
+
+      g_string_append_printf (str, " %s\n", ds_cstr (&tmp));
+
+      ds_destroy (&tmp);
+    }
+  g_string_append (str, " .\n");
+
+
+  if ( gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (cd->check)))
+    g_string_append (str, "DISPLAY DOCUMENTS.\n");
+
+  text = str->str;
+
+  g_string_free (str, FALSE);
+
+  return text;
+}
+
+
+static gboolean
+dialog_state_valid (gpointer data)
+{
+  return TRUE;
+}
+
+static void
+add_line_to_buffer (GtkTextBuffer *buffer, const char *line)
+{
+  gtk_text_buffer_insert_at_cursor (buffer, line, -1);
+
+  gtk_text_buffer_insert_at_cursor (buffer, "\n", 1);
+}
+
+static void
+retrieve_comments (PsppireDialogAction *pda)
+{
+  PsppireDialogActionComments *wcd = PSPPIRE_DIALOG_ACTION_COMMENTS (pda);
+  gint i;
+
+  GtkTextBuffer *buffer = gtk_text_view_get_buffer (GTK_TEXT_VIEW (wcd->textview));
+
+  gtk_text_buffer_set_text (buffer, "", 0);
+
+  for ( i = 0 ; i < dict_get_document_line_cnt (pda->dict->dict); ++i )
+    add_line_to_buffer (buffer, dict_get_document_line (pda->dict->dict, i));
+}
+
+
+static void
+refresh (PsppireDialogAction *pda)
+{
+  PsppireDialogActionComments *act = PSPPIRE_DIALOG_ACTION_COMMENTS (pda);
+
+  retrieve_comments (pda);
+
+  gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (act->check), FALSE);
+}
+
+
+static void
+set_column_number (GtkTextBuffer *textbuffer,
+     GtkTextIter   *iter,
+     GtkTextMark   *mark,
+     gpointer       data)
+{
+  GtkLabel *label = data;
+  gchar *text ;
+
+  text = g_strdup_printf ( _("Column Number: %d"),
+                          1 + gtk_text_iter_get_line_offset (iter));
+
+  gtk_label_set_text (label, text);
+
+  g_free (text);
+}
+
+static void
+wrap_line (GtkTextBuffer *buffer,
+     GtkTextIter   *iter,
+     gchar         *text,
+     gint           count,
+     gpointer       data)
+{
+  gint chars = gtk_text_iter_get_chars_in_line (iter);
+
+  if ( chars > DOC_LINE_LENGTH )
+    {
+      GtkTextIter line_fold = *iter;
+
+      gtk_text_iter_set_line_offset (&line_fold, DOC_LINE_LENGTH);
+
+      gtk_text_buffer_insert (buffer, &line_fold, "\r\n", 2);
+    }
+}
+
+
+static void
+psppire_dialog_action_comments_activate (PsppireDialogAction *pda)
+{
+  PsppireDialogActionComments *act = PSPPIRE_DIALOG_ACTION_COMMENTS (pda);
+
+  GHashTable *thing = psppire_dialog_action_get_hash_table (pda);
+  GtkBuilder *xml = g_hash_table_lookup (thing, pda);
+  if (!xml)
+    {
+      GtkTextIter iter;
+
+      xml = builder_new ("comments.ui");
+      g_hash_table_insert (thing, pda, xml);
+
+      pda->dialog = get_widget_assert (xml, "comments-dialog");
+      act->textview = get_widget_assert (xml, "comments-textview1");
+      GtkWidget *label = get_widget_assert (xml, "column-number-label");
+      GtkTextBuffer *buffer = gtk_text_view_get_buffer (GTK_TEXT_VIEW (act->textview));
+      act->check = get_widget_assert (xml, "comments-checkbutton1");
+
+      g_signal_connect_swapped (pda->dialog, "show", G_CALLBACK (retrieve_comments), pda);
+      
+      {
+       PangoContext * context ;
+       PangoLayout *  layout ;
+       PangoRectangle rect;
+
+       /* Since we're going to truncate lines to 80 chars,
+          we need a monospaced font otherwise it'll look silly */
+       PangoFontDescription *font_desc =
+         pango_font_description_from_string ("monospace");
+
+       gtk_widget_override_font (act->textview, font_desc);
+
+       /* and let's just make sure that a complete line fits into the
+          widget's width */
+       context = gtk_widget_create_pango_context (act->textview);
+       layout = pango_layout_new (context);
+
+       pango_layout_set_text (layout, "M", 1);
+
+       pango_layout_set_font_description (layout, font_desc);
+
+       pango_layout_get_extents (layout, NULL, &rect);
+
+       g_object_set (act->textview, "width-request",
+                     PANGO_PIXELS (rect.width) * DOC_LINE_LENGTH + 20, NULL);
+
+       g_object_unref (G_OBJECT (layout));
+       g_object_unref (G_OBJECT (context));
+
+       pango_font_description_free (font_desc);
+      }
+      
+      g_signal_connect (buffer, "mark-set",
+                       G_CALLBACK (set_column_number), label);
+
+      g_signal_connect_after (buffer, "insert-text",
+                             G_CALLBACK (wrap_line), NULL);
+
+      gtk_text_buffer_get_iter_at_offset (buffer, &iter, 0);
+      gtk_text_buffer_place_cursor (buffer, &iter);
+    }
+  
+  psppire_dialog_action_set_valid_predicate (pda, dialog_state_valid);
+  psppire_dialog_action_set_refresh (pda, refresh);
+
+
+
+  if (PSPPIRE_DIALOG_ACTION_CLASS (psppire_dialog_action_comments_parent_class)->activate)
+    PSPPIRE_DIALOG_ACTION_CLASS (psppire_dialog_action_comments_parent_class)->activate (pda);
+}
+
+static void
+psppire_dialog_action_comments_class_init (PsppireDialogActionCommentsClass *class)
+{
+  psppire_dialog_action_set_activation (class, psppire_dialog_action_comments_activate);
+  PSPPIRE_DIALOG_ACTION_CLASS (class)->generate_syntax = generate_syntax;
+}
+
+static void
+psppire_dialog_action_comments_init (PsppireDialogActionComments *act)
+{
+}
+
diff --git a/src/ui/gui/psppire-dialog-action-comments.h b/src/ui/gui/psppire-dialog-action-comments.h
new file mode 100644 (file)
index 0000000..541b859
--- /dev/null
@@ -0,0 +1,75 @@
+/* PSPPIRE - a graphical user interface for PSPP.
+   Copyright (C) 2015  Free Software Foundation
+
+   This program is free software: you can redistribute it and/or modify
+   it under the terms of the GNU General Public License as published by
+   the Free Software Foundation, either version 3 of the License, or
+   (at your option) any later version.
+
+   This program 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 General Public License for more details.
+
+   You should have received a copy of the GNU General Public License
+   along with this program.  If not, see <http://www.gnu.org/licenses/>. */
+
+
+#include <glib-object.h>
+#include <glib.h>
+
+#include "psppire-dialog-action.h"
+
+#ifndef __PSPPIRE_DIALOG_ACTION_COMMENTS_H__
+#define __PSPPIRE_DIALOG_ACTION_COMMENTS_H__
+
+G_BEGIN_DECLS
+
+
+#define PSPPIRE_TYPE_DIALOG_ACTION_COMMENTS (psppire_dialog_action_comments_get_type ())
+
+#define PSPPIRE_DIALOG_ACTION_COMMENTS(obj)    \
+                     (G_TYPE_CHECK_INSTANCE_CAST ((obj), \
+                                                 PSPPIRE_TYPE_DIALOG_ACTION_COMMENTS, PsppireDialogActionComments))
+
+#define PSPPIRE_DIALOG_ACTION_COMMENTS_CLASS(klass) \
+                     (G_TYPE_CHECK_CLASS_CAST ((klass), \
+                                PSPPIRE_TYPE_DIALOG_ACTION_COMMENTS, \
+                                 PsppireDialogActionCommentsClass))
+
+
+#define PSPPIRE_IS_DIALOG_ACTION_COMMENTS(obj) \
+                    (G_TYPE_CHECK_INSTANCE_TYPE ((obj), PSPPIRE_TYPE_DIALOG_ACTION_COMMENTS))
+
+#define PSPPIRE_IS_DIALOG_ACTION_COMMENTS_CLASS(klass) \
+                     (G_TYPE_CHECK_CLASS_TYPE ((klass), PSPPIRE_TYPE_DIALOG_ACTION_COMMENTS))
+
+
+#define PSPPIRE_DIALOG_ACTION_COMMENTS_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), \
+                                  PSPPIRE_TYPE_DIALOG_ACTION_COMMENTS, \
+                                  PsppireDialogActionCommentsClass))
+
+typedef struct _PsppireDialogActionComments       PsppireDialogActionComments;
+typedef struct _PsppireDialogActionCommentsClass  PsppireDialogActionCommentsClass;
+
+
+struct _PsppireDialogActionComments
+{
+  PsppireDialogAction parent;
+
+  GtkWidget *textview;
+  GtkWidget *check;
+};
+
+
+struct _PsppireDialogActionCommentsClass
+{
+  PsppireDialogActionClass parent_class;
+};
+
+
+GType psppire_dialog_action_comments_get_type (void) ;
+
+G_END_DECLS
+
+#endif /* __PSPPIRE_DIALOG_ACTION_COMMENTS_H__ */
index 70b89ea2867c2d2b8378bfde2a7f8a83ad394c84..6bd1645460c876d9251b75648de54198fbf84c0e 100644 (file)
@@ -143,8 +143,8 @@ psppire_dialog_action_activate (PsppireDialogAction *act)
   set_toplevel (act);
 
   act->dict = PSPPIRE_DATA_WINDOW(act->toplevel)->dict;
-  
-  g_object_set (act->source, "model", act->dict, NULL);
+  if (act->source)
+    g_object_set (act->source, "model", act->dict, NULL);
 
   GSList *wl = g_object_get_data (G_OBJECT (act->toplevel), "widget-list");
   wl = g_slist_prepend (wl, act->dialog);
@@ -155,7 +155,8 @@ psppire_dialog_action_activate (PsppireDialogAction *act)
   if (GTK_ACTION_CLASS (psppire_dialog_action_parent_class)->activate)
     GTK_ACTION_CLASS (psppire_dialog_action_parent_class)->activate ( GTK_ACTION (act));
 
-  gtk_widget_grab_focus (act->source);
+  if (act->source)
+    gtk_widget_grab_focus (act->source);
 
   if (first_time)
     psppire_dialog_reload (PSPPIRE_DIALOG (act->dialog));
index 7161a0d1134bb9014f8876a6a38a6f77dfb4e10c..82e90ed88ec393f2102ee96e07d96585f93d58a4 100644 (file)
@@ -22,6 +22,7 @@
 #include "psppire-dialog-action-binomial.h"
 #include "psppire-dialog-action-chisquare.h"
 #include "psppire-dialog-action-compute.h"
+#include "psppire-dialog-action-comments.h"
 #include "psppire-dialog-action-correlation.h"
 #include "psppire-dialog-action-count.h"
 #include "psppire-dialog-action-crosstabs.h"
@@ -80,6 +81,7 @@ preregister_widgets (void)
   psppire_dialog_action_binomial_get_type ();
   psppire_dialog_action_barchart_get_type ();
   psppire_dialog_action_chisquare_get_type ();
+  psppire_dialog_action_comments_get_type ();
   psppire_dialog_action_compute_get_type ();
   psppire_dialog_action_correlation_get_type ();
   psppire_dialog_action_count_get_type ();