/* PSPPIRE - a graphical user interface for PSPP.
- Copyright (C) 2017 Free Software Foundation
+ Copyright (C) 2017, 2020 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
{
PROP_0,
PROP_FILE_NAME,
- PROP_ENCODING
+ PROP_ENCODING,
+ PROP_MAXIMUM_LINES,
+ PROP_LINE_COUNT
};
-enum {MAX_LINE_LEN = 16384}; /* Max length of an acceptable line. */
-
static void
read_lines (PsppireTextFile *tf)
{
+ /* Max length of an acceptable line. */
+ static const int MAX_LINE_LEN = 16384;
+
if (tf->file_name && 0 != g_strcmp0 ("unset", tf->encoding))
{
struct line_reader *reader = line_reader_for_file (tf->encoding, tf->file_name, O_RDONLY);
tf->file_name, MAX_LINE_LEN);
line_reader_close (reader);
for (i = 0; i < tf->line_cnt; i++)
- g_free (&tf->lines[i]);
+ g_free (tf->lines[i].string);
tf->line_cnt = 0;
ds_destroy (&input);
return;
= recode_substring_pool ("UTF-8",
line_reader_get_encoding (reader),
input.ss, NULL);
- }
+ }
ds_destroy (&input);
if (tf->line_cnt == 0)
msg (ME, _("`%s' is empty."), tf->file_name);
line_reader_close (reader);
for (i = 0; i < tf->line_cnt; i++)
- g_free (&tf->lines[i]);
+ g_free (tf->lines[i].string);
tf->line_cnt = 0;
goto done;
}
done:
line_reader_close (reader);
}
-
}
static void
switch (prop_id)
{
+ case PROP_MAXIMUM_LINES:
+ tf->maximum_lines = g_value_get_int (value);
+ break;
case PROP_FILE_NAME:
tf->file_name = g_value_dup_string (value);
read_lines (tf);
switch (prop_id)
{
+ case PROP_MAXIMUM_LINES:
+ g_value_set_int (value, text_file->maximum_lines);
+ break;
+ case PROP_LINE_COUNT:
+ g_value_set_int (value, text_file->line_cnt);
+ break;
case PROP_FILE_NAME:
g_value_set_string (value, text_file->file_name);
break;
};
}
-
-static void psppire_text_file_init (PsppireTextFile *text_file);
-static void psppire_text_file_class_init (PsppireTextFileClass *class);
-
static void psppire_text_file_finalize (GObject *object);
static void psppire_text_file_dispose (GObject *object);
static GObjectClass *parent_class = NULL;
-
static gboolean
__tree_get_iter (GtkTreeModel *tree_model,
GtkTreeIter *iter,
static gint
__tree_model_get_n_columns (GtkTreeModel *tree_model)
{
- PsppireTextFile *tf = PSPPIRE_TEXT_FILE (tree_model);
return 2;
}
iface->iter_parent = __iter_parent;
}
-
-GType
-psppire_text_file_get_type (void)
-{
- static GType text_file_type = 0;
-
- if (!text_file_type)
- {
- static const GTypeInfo text_file_info =
- {
- sizeof (PsppireTextFileClass),
- NULL, /* base_init */
- NULL, /* base_finalize */
- (GClassInitFunc) psppire_text_file_class_init,
- NULL, /* class_finalize */
- NULL, /* class_data */
- sizeof (PsppireTextFile),
- 0,
- (GInstanceInitFunc) psppire_text_file_init,
- };
-
- static const GInterfaceInfo tree_model_info = {
- (GInterfaceInitFunc) __tree_model_init,
- NULL,
- NULL
- };
-
- text_file_type = g_type_register_static (G_TYPE_OBJECT,
- "PsppireTextFile",
- &text_file_info, 0);
-
- g_type_add_interface_static (text_file_type, GTK_TYPE_TREE_MODEL,
- &tree_model_info);
- }
-
- return text_file_type;
-}
-
+G_DEFINE_TYPE_WITH_CODE (PsppireTextFile, psppire_text_file, G_TYPE_OBJECT,
+ G_IMPLEMENT_INTERFACE (GTK_TYPE_TREE_MODEL,
+ __tree_model_init))
static void
psppire_text_file_class_init (PsppireTextFileClass *class)
GObjectClass *object_class;
parent_class = g_type_class_peek_parent (class);
- object_class = (GObjectClass*) class;
+ object_class = G_OBJECT_CLASS (class);
+
+ GParamSpec *maximum_lines_spec =
+ g_param_spec_int ("maximum-lines",
+ "Maximum Lines",
+ P_("An upper limit on the number of lines to consider"),
+ 0, G_MAXINT, G_MAXINT,
+ G_PARAM_READWRITE);
+
+ GParamSpec *line_count_spec =
+ g_param_spec_int ("line-count",
+ "Line Count",
+ P_("The number of lines in the file"),
+ 0, G_MAXINT, G_MAXINT,
+ G_PARAM_READABLE);
GParamSpec *file_name_spec =
g_param_spec_string ("file-name",
object_class->set_property = psppire_text_file_set_property;
object_class->get_property = psppire_text_file_get_property;
+ g_object_class_install_property (object_class,
+ PROP_MAXIMUM_LINES,
+ maximum_lines_spec);
+
+ g_object_class_install_property (object_class,
+ PROP_LINE_COUNT,
+ line_count_spec);
+
g_object_class_install_property (object_class,
PROP_FILE_NAME,
file_name_spec);
object_class->dispose = psppire_text_file_dispose;
}
-
static void
psppire_text_file_init (PsppireTextFile *text_file)
{
{
PsppireTextFile *tf = PSPPIRE_TEXT_FILE (object);
+ for (int i = 0; i < tf->line_cnt; i++)
+ g_free (tf->lines[i].string);
+
g_free (tf->encoding);
g_free (tf->file_name);