1 /* PSPPIRE - a graphical user interface for PSPP. 2 Copyright (C) 2012 Free Software Foundation 3 4 This program is free software: you can redistribute it and/or modify 5 it under the terms of the GNU General Public License as published by 6 the Free Software Foundation, either version 3 of the License, or 7 (at your option) any later version. 8 9 This program is distributed in the hope that it will be useful, 10 but WITHOUT ANY WARRANTY; without even the implied warranty of 11 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 12 GNU General Public License for more details. 13 14 You should have received a copy of the GNU General Public License 15 along with this program. If not, see <http://www.gnu.org/licenses/>. */ 16 17 18 #include <config.h> 19 20 #include "psppire-dialog-action-kmeans.h" 21 22 #include "psppire-var-view.h" 23 #include <stdlib.h> 24 #include "psppire-dialog.h" 25 #include "builder-wrapper.h" 26 27 static void psppire_dialog_action_kmeans_init (PsppireDialogActionKmeans *act); 28 static void psppire_dialog_action_kmeans_class_init (PsppireDialogActionKmeansClass *class); 29 30 31 G_DEFINE_TYPE (PsppireDialogActionKmeans, psppire_dialog_action_kmeans, PSPPIRE_TYPE_DIALOG_ACTION); 32 33 static char * 34 generate_syntax (const PsppireDialogAction *act) 35 { 36 PsppireDialogActionKmeans *km = PSPPIRE_DIALOG_ACTION_KMEANS (act); 37 gchar *text; 38 39 GString *string = g_string_new ("QUICK CLUSTER "); 40 41 psppire_var_view_append_names (PSPPIRE_VAR_VIEW (km->variables), 0, string); 42 43 g_string_append_printf (string, "\n\t/CRITERIA=CLUSTERS(%d)", 44 atoi (gtk_entry_get_text (GTK_ENTRY (km->entry)))); 45 46 g_string_append (string, ".\n"); 47 48 text = string->str; 49 50 g_string_free (string, FALSE); 51 52 return text; 53 } 54 55 static gboolean 56 dialog_state_valid (gpointer user_data) 57 { 58 PsppireDialogActionKmeans *fd = user_data; 59 60 GtkTreeModel *liststore = gtk_tree_view_get_model (GTK_TREE_VIEW (fd->variables)); 61 62 if (gtk_tree_model_iter_n_children (liststore, NULL) < 2) 63 return FALSE; 64 65 if (atoi (gtk_entry_get_text (GTK_ENTRY (fd->entry))) < 2) 66 return FALSE; 67 68 return TRUE; 69 } 70 71 static void 72 refresh (PsppireDialogAction *fd_) 73 { 74 PsppireDialogActionKmeans *fd = PSPPIRE_DIALOG_ACTION_KMEANS (fd_); 75 GtkTreeModel *liststore = 76 gtk_tree_view_get_model (GTK_TREE_VIEW (fd->variables)); 77 gtk_list_store_clear (GTK_LIST_STORE (liststore)); 78 79 gtk_entry_set_text (GTK_ENTRY (fd->entry), ""); 80 } 81 82 static GtkBuilder * 83 psppire_dialog_action_kmeans_activate (PsppireDialogAction *a, GVariant *param) 84 { 85 PsppireDialogActionKmeans *act = PSPPIRE_DIALOG_ACTION_KMEANS (a); 86 PsppireDialogAction *pda = PSPPIRE_DIALOG_ACTION (a); 87 88 GtkBuilder *xml = builder_new ("k-means.ui"); 89 90 pda->dialog = get_widget_assert (xml, "k-means-dialog"); 91 pda->source = get_widget_assert (xml, "dict-view"); 92 93 act->entry = get_widget_assert (xml, "entry1"); 94 act->variables = get_widget_assert (xml, "psppire-var-view1"); 95 96 psppire_dialog_action_set_refresh (pda, refresh); 97 psppire_dialog_action_set_valid_predicate (pda, dialog_state_valid); 98 99 return xml; 100 } 101 102 static void 103 psppire_dialog_action_kmeans_class_init (PsppireDialogActionKmeansClass *class) 104 { 105 PSPPIRE_DIALOG_ACTION_CLASS (class)->initial_activate = psppire_dialog_action_kmeans_activate; 106 PSPPIRE_DIALOG_ACTION_CLASS (class)->generate_syntax = generate_syntax; 107 } 108 109 110 static void 111 psppire_dialog_action_kmeans_init (PsppireDialogActionKmeans *act) 112 { 113 } 114 115