[gnome-text-editor] propertiesdialog: add document statistics dialog



commit 62bae1daa0d2399b27c71b1c46a84a7d6abca14d
Author: Christian Hergert <chergert redhat com>
Date:   Wed Jan 5 14:52:13 2022 -0800

    propertiesdialog: add document statistics dialog
    
    This adds a simple properties dialog calculating the statistics of the
    document. It is similar to the docinfo plugin of Gedit and in fact shares
    the same calculation code (using Pango rather than GtkText*) as those
    APIs are significantly faster to calculate.
    
    Some slight changes from the design include:
    
     * Add "Lines" row. This is mostly useful if we decide to add support for
       selections like the docinfo plugin supports, but also if line numbers
       are not shown or long files.
     * The Location path is clickable to take you to the file within the
       desktop file manager (such as Nautilus in GNOME).
     * An "Update" button is shown in the titlebar if the document changes
       out from under the dialog so the user can refresh the statistics. Given
       how heavy the calculation can be, this is preferred to realtime updates
       of the statistics.
    
    Fixes #264

 po/POTFILES.in                         |   1 +
 src/editor-properties-dialog-private.h |  37 ++++
 src/editor-properties-dialog.c         | 391 +++++++++++++++++++++++++++++++++
 src/editor-properties-dialog.ui        | 127 +++++++++++
 src/editor-window-actions.c            |  23 ++
 src/editor-window.ui                   |   5 +
 src/meson.build                        |   1 +
 src/org.gnome.TextEditor.gresource.xml |   1 +
 8 files changed, 586 insertions(+)
---
diff --git a/po/POTFILES.in b/po/POTFILES.in
index 035f5f9..26aa67a 100644
--- a/po/POTFILES.in
+++ b/po/POTFILES.in
@@ -18,6 +18,7 @@ src/editor-position-label.ui
 src/editor-preferences-dialog.ui
 src/editor-preferences-font.c
 src/editor-print-operation.c
+src/editor-properties-dialog.c
 src/editor-save-changes-dialog.c
 src/editor-search-bar.ui
 src/editor-search-entry.c
diff --git a/src/editor-properties-dialog-private.h b/src/editor-properties-dialog-private.h
new file mode 100644
index 0000000..2144427
--- /dev/null
+++ b/src/editor-properties-dialog-private.h
@@ -0,0 +1,37 @@
+/* editor-properties-dialog-private.h
+ *
+ * Copyright 2022 Christian Hergert <chergert redhat com>
+ *
+ * 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/>.
+ *
+ * SPDX-License-Identifier: GPL-3.0-or-later
+ */
+
+#pragma once
+
+#include <gtk/gtk.h>
+
+#include "editor-types-private.h"
+
+G_BEGIN_DECLS
+
+#define EDITOR_TYPE_PROPERTIES_DIALOG (editor_properties_dialog_get_type())
+
+G_DECLARE_FINAL_TYPE (EditorPropertiesDialog, editor_properties_dialog, EDITOR, PROPERTIES_DIALOG, GtkWindow)
+
+GtkWidget      *editor_properties_dialog_new          (EditorWindow           *parent_window,
+                                                       EditorDocument         *document);
+EditorDocument *editor_properties_dialog_get_document (EditorPropertiesDialog *self);
+
+G_END_DECLS
diff --git a/src/editor-properties-dialog.c b/src/editor-properties-dialog.c
new file mode 100644
index 0000000..f3bc7cd
--- /dev/null
+++ b/src/editor-properties-dialog.c
@@ -0,0 +1,391 @@
+/* editor-properties-dialog.c
+ *
+ * Copyright 2022 Christian Hergert <chergert redhat com>
+ *
+ * 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/>.
+ *
+ * SPDX-License-Identifier: GPL-3.0-or-later
+ */
+
+#include "config.h"
+
+#include <glib/gi18n.h>
+
+#include "editor-document.h"
+#include "editor-file-manager.h"
+#include "editor-path-private.h"
+#include "editor-properties-dialog-private.h"
+#include "editor-window.h"
+
+struct _EditorPropertiesDialog
+{
+  GtkWindow       parent_instance;
+
+  EditorDocument *document;
+
+  GtkLabel       *all_chars;
+  GtkLabel       *chars;
+  GtkLabel       *lines;
+  GtkLabel       *location;
+  GtkLabel       *name;
+  GtkLabel       *words;
+  GtkButton      *rescan;
+};
+
+G_DEFINE_TYPE (EditorPropertiesDialog, editor_properties_dialog, GTK_TYPE_WINDOW)
+
+enum {
+  PROP_0,
+  PROP_DOCUMENT,
+  N_PROPS
+};
+
+static GParamSpec *properties [N_PROPS];
+
+static gboolean
+file_to_location (GBinding     *binding,
+                  const GValue *from_value,
+                  GValue       *to_value,
+                  gpointer      user_data)
+{
+  g_autoptr(GFile) parent = NULL;
+  g_autofree char *uri = NULL;
+  g_autofree char *title = NULL;
+  g_autofree char *markup = NULL;
+  g_autofree char *title_escape = NULL;
+  GFile *file;
+
+  g_assert (G_IS_BINDING (binding));
+  g_assert (from_value != NULL);
+  g_assert (G_VALUE_HOLDS (from_value, G_TYPE_FILE));
+
+  if (!(file = g_value_get_object (from_value)))
+    {
+      g_value_set_string (to_value, _("Draft"));
+      return TRUE;
+    }
+
+  if (!(parent = g_file_get_parent (file)))
+    return FALSE;
+
+  uri = g_file_get_uri (file);
+
+  if (g_file_is_native (parent))
+    title = _editor_path_collapse (g_file_peek_path (parent));
+  else
+    title = g_file_get_uri (parent);
+
+  title_escape = g_markup_escape_text (title, -1);
+  markup = g_strdup_printf ("<a href='%s'>%s</a>", uri, title_escape);
+
+  g_value_take_string (to_value, g_steal_pointer (&markup));
+
+  return TRUE;
+}
+
+/*
+ * gedit-docinfo-plugin.c (calculate_info)
+ *
+ * Copyright (C) 2002-2005 Paolo Maggi
+ *
+ * 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 2, 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/>.
+ *
+ */
+static void
+calculate_info (GtkTextBuffer     *doc,
+                const GtkTextIter *start,
+                const GtkTextIter *end,
+                int               *chars,
+                int               *words,
+                int               *white_chars)
+{
+  g_autofree char *text = gtk_text_buffer_get_slice (doc, start, end, TRUE);
+
+  *chars = g_utf8_strlen (text, -1);
+
+  if (*chars > 0)
+    {
+      PangoLogAttr *attrs;
+      gint i;
+
+      attrs = g_new0 (PangoLogAttr, *chars + 1);
+
+      pango_get_log_attrs (text,
+                           -1,
+                           0,
+                           pango_language_from_string ("C"),
+                           attrs,
+                           *chars + 1);
+
+      for (i = 0; i < (*chars); i++)
+        {
+          if (attrs[i].is_white)
+            ++(*white_chars);
+
+          if (attrs[i].is_word_start)
+            ++(*words);
+        }
+
+      g_free (attrs);
+    }
+  else
+    {
+      *white_chars = 0;
+      *words = 0;
+    }
+}
+
+static void
+editor_properties_dialog_rescan (EditorPropertiesDialog *self)
+{
+  GtkTextBuffer *buffer;
+  GtkTextIter begin, end;
+  int lines = 0;
+  int words = 0;
+  int chars = 0;
+  int white_chars = 0;
+  char *str;
+
+  g_assert (EDITOR_IS_PROPERTIES_DIALOG (self));
+
+  if (self->document == NULL)
+    return;
+
+  buffer = GTK_TEXT_BUFFER (self->document);
+
+  gtk_text_buffer_get_bounds (buffer, &begin, &end);
+
+  if (gtk_text_iter_equal (&begin, &end))
+    lines = 0;
+  else
+    lines = gtk_text_iter_get_line (&end) - gtk_text_iter_get_line (&begin);
+
+  calculate_info (buffer,
+                  &begin, &end,
+                  &chars, &words, &white_chars);
+
+  str = g_strdup_printf("%'d", lines);
+  gtk_label_set_label (self->lines, str);
+  g_free (str);
+
+  str = g_strdup_printf("%'d", words);
+  gtk_label_set_label (self->words, str);
+  g_free (str);
+
+  str = g_strdup_printf("%'d", chars);
+  gtk_label_set_label (self->all_chars, str);
+  g_free (str);
+
+  str = g_strdup_printf("%'d", chars - white_chars);
+  gtk_label_set_label (self->chars, str);
+  g_free (str);
+
+  gtk_widget_hide (GTK_WIDGET (self->rescan));
+}
+
+static void
+editor_properties_dialog_changed_cb (EditorPropertiesDialog *self,
+                                     EditorDocument         *document)
+{
+  g_assert (EDITOR_IS_PROPERTIES_DIALOG (self));
+  g_assert (EDITOR_IS_DOCUMENT (document));
+
+  gtk_widget_show (GTK_WIDGET (self->rescan));
+}
+
+static void
+editor_properties_dialog_set_document (EditorPropertiesDialog *self,
+                                       EditorDocument         *document)
+{
+  g_assert (EDITOR_IS_PROPERTIES_DIALOG (self));
+  g_assert (EDITOR_IS_DOCUMENT (document));
+
+  if (g_set_object (&self->document, document))
+    {
+      g_object_bind_property (self->document, "title",
+                              self->name, "label",
+                              G_BINDING_SYNC_CREATE);
+      g_object_bind_property_full (self->document, "file",
+                                   self->location, "label",
+                                   G_BINDING_SYNC_CREATE,
+                                   file_to_location, NULL, NULL, NULL);
+      g_signal_connect_object (self->document,
+                               "changed",
+                               G_CALLBACK (editor_properties_dialog_changed_cb),
+                               self,
+                               G_CONNECT_SWAPPED);
+      editor_properties_dialog_rescan (self);
+    }
+}
+
+EditorDocument *
+editor_properties_dialog_get_document (EditorPropertiesDialog *self)
+{
+  g_return_val_if_fail (EDITOR_IS_PROPERTIES_DIALOG (self), NULL);
+
+  return self->document;
+}
+
+GtkWidget *
+editor_properties_dialog_new (EditorWindow   *window,
+                              EditorDocument *document)
+{
+  g_return_val_if_fail (EDITOR_IS_WINDOW (window), NULL);
+  g_return_val_if_fail (EDITOR_IS_DOCUMENT (document), NULL);
+
+  return g_object_new (EDITOR_TYPE_PROPERTIES_DIALOG,
+                       "document", document,
+                       "transient-for", window,
+                       NULL);
+}
+
+static gboolean
+activate_link_cb (EditorPropertiesDialog *self,
+                  const char             *uri,
+                  GtkLabel               *label)
+{
+  g_autoptr(GFile) file = NULL;
+
+  g_assert (EDITOR_IS_PROPERTIES_DIALOG (self));
+  g_assert (uri != NULL);
+  g_assert (GTK_IS_LABEL (label));
+
+  file = g_file_new_for_uri (uri);
+
+  return editor_file_manager_show (file, NULL);
+}
+
+static void
+win_close_cb (GtkWidget  *widget,
+              const char *action_name,
+              GVariant   *param)
+{
+  gtk_window_close (GTK_WINDOW (widget));
+}
+
+static void
+win_rescan_cb (GtkWidget  *widget,
+               const char *action_name,
+               GVariant   *param)
+{
+  EditorPropertiesDialog *self = EDITOR_PROPERTIES_DIALOG (widget);
+
+  g_assert (EDITOR_IS_PROPERTIES_DIALOG (self));
+
+  editor_properties_dialog_rescan (self);
+}
+
+static void
+editor_properties_dialog_dispose (GObject *object)
+{
+  EditorPropertiesDialog *self = (EditorPropertiesDialog *)object;
+
+  g_clear_object (&self->document);
+
+  G_OBJECT_CLASS (editor_properties_dialog_parent_class)->dispose (object);
+}
+
+static void
+editor_properties_dialog_get_property (GObject    *object,
+                                       guint       prop_id,
+                                       GValue     *value,
+                                       GParamSpec *pspec)
+{
+  EditorPropertiesDialog *self = EDITOR_PROPERTIES_DIALOG (object);
+
+  switch (prop_id)
+    {
+    case PROP_DOCUMENT:
+      g_value_set_object (value, editor_properties_dialog_get_document (self));
+      break;
+
+    default:
+      G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
+    }
+}
+
+static void
+editor_properties_dialog_set_property (GObject      *object,
+                                       guint         prop_id,
+                                       const GValue *value,
+                                       GParamSpec   *pspec)
+{
+  EditorPropertiesDialog *self = EDITOR_PROPERTIES_DIALOG (object);
+
+  switch (prop_id)
+    {
+    case PROP_DOCUMENT:
+      editor_properties_dialog_set_document (self, g_value_get_object (value));
+      break;
+
+    default:
+      G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
+    }
+}
+
+static void
+editor_properties_dialog_class_init (EditorPropertiesDialogClass *klass)
+{
+  GObjectClass *object_class = G_OBJECT_CLASS (klass);
+  GtkWidgetClass *widget_class = GTK_WIDGET_CLASS (klass);
+
+  object_class->dispose = editor_properties_dialog_dispose;
+  object_class->get_property = editor_properties_dialog_get_property;
+  object_class->set_property = editor_properties_dialog_set_property;
+
+  properties [PROP_DOCUMENT] =
+    g_param_spec_object ("document",
+                         "Document",
+                         "Document",
+                         EDITOR_TYPE_DOCUMENT,
+                         (G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY | G_PARAM_STATIC_STRINGS));
+
+  g_object_class_install_properties (object_class, N_PROPS, properties);
+
+  gtk_widget_class_set_template_from_resource (widget_class, 
"/org/gnome/TextEditor/ui/editor-properties-dialog.ui");
+  gtk_widget_class_bind_template_child (widget_class, EditorPropertiesDialog, all_chars);
+  gtk_widget_class_bind_template_child (widget_class, EditorPropertiesDialog, chars);
+  gtk_widget_class_bind_template_child (widget_class, EditorPropertiesDialog, lines);
+  gtk_widget_class_bind_template_child (widget_class, EditorPropertiesDialog, location);
+  gtk_widget_class_bind_template_child (widget_class, EditorPropertiesDialog, name);
+  gtk_widget_class_bind_template_child (widget_class, EditorPropertiesDialog, rescan);
+  gtk_widget_class_bind_template_child (widget_class, EditorPropertiesDialog, words);
+  gtk_widget_class_bind_template_callback (widget_class, activate_link_cb);
+
+  gtk_widget_class_install_action (widget_class, "win.close", NULL, win_close_cb);
+  gtk_widget_class_install_action (widget_class, "win.rescan", NULL, win_rescan_cb);
+
+  gtk_widget_class_add_binding_action (widget_class, GDK_KEY_Escape, 0, "win.close", NULL);
+}
+
+static void
+editor_properties_dialog_init (EditorPropertiesDialog *self)
+{
+  gtk_widget_init_template (GTK_WIDGET (self));
+
+#if DEVELOPMENT_BUILD
+  gtk_widget_add_css_class (GTK_WIDGET (self), "devel");
+#endif
+}
diff --git a/src/editor-properties-dialog.ui b/src/editor-properties-dialog.ui
new file mode 100644
index 0000000..e0dd79c
--- /dev/null
+++ b/src/editor-properties-dialog.ui
@@ -0,0 +1,127 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<interface>
+  <requires lib="gtk" version="4.0"/>
+  <template class="EditorPropertiesDialog" parent="GtkWindow">
+    <property name="title" translatable="yes">Properties</property>
+    <style>
+      <class name="org-gnome-TextEditor"/>
+      <class name="properties-dialog"/>
+    </style>
+    <child type="titlebar">
+      <object class="GtkHeaderBar">
+        <child type="start">
+          <object class="GtkButton" id="rescan">
+            <property name="label" translatable="yes">Update</property>
+            <property name="visible">false</property>
+            <property name="action-name">win.rescan</property>
+          </object>
+        </child>
+      </object>
+    </child>
+    <child>
+      <object class="GtkBox">
+        <property name="orientation">vertical</property>
+        <property name="spacing">24</property>
+        <property name="margin-top">24</property>
+        <property name="margin-bottom">24</property>
+        <property name="margin-start">24</property>
+        <property name="margin-end">24</property>
+        <property name="vexpand">true</property>
+        <child>
+          <object class="AdwPreferencesGroup">
+            <property name="title" translatable="yes">File</property>
+            <child>
+              <object class="AdwActionRow">
+                <property name="title" translatable="yes">Name</property>
+                <child type="suffix">
+                  <object class="GtkLabel" id="name">
+                    <property name="xalign">1</property>
+                    <property name="ellipsize">middle</property>
+                  </object>
+                </child>
+              </object>
+            </child>
+            <child>
+              <object class="AdwActionRow">
+                <property name="title" translatable="yes">Location</property>
+                <child type="suffix">
+                  <object class="GtkLabel" id="location">
+                    <property name="xalign">1</property>
+                    <property name="ellipsize">middle</property>
+                    <property name="use-markup">true</property>
+                    <signal name="activate-link" handler="activate_link_cb" swapped="true"/>
+                  </object>
+                </child>
+              </object>
+            </child>
+          </object>
+        </child>
+        <child>
+          <object class="AdwPreferencesGroup">
+            <property name="title" translatable="yes">Statistics</property>
+            <child>
+              <object class="AdwActionRow">
+                <property name="title" translatable="yes">Lines</property>
+                <child type="suffix">
+                  <object class="GtkLabel" id="lines">
+                    <property name="xalign">1</property>
+                    <property name="ellipsize">middle</property>
+                    <property name="label">0</property>
+                    <style>
+                      <class name="numeric"/>
+                    </style>
+                  </object>
+                </child>
+              </object>
+            </child>
+            <child>
+              <object class="AdwActionRow">
+                <property name="title" translatable="yes">Words</property>
+                <child type="suffix">
+                  <object class="GtkLabel" id="words">
+                    <property name="xalign">1</property>
+                    <property name="ellipsize">middle</property>
+                    <property name="label">0</property>
+                    <style>
+                      <class name="numeric"/>
+                    </style>
+                  </object>
+                </child>
+              </object>
+            </child>
+            <child>
+              <object class="AdwActionRow">
+                <property name="title" translatable="yes">Characters, No Spaces</property>
+                <child type="suffix">
+                  <object class="GtkLabel" id="chars">
+                    <property name="xalign">1</property>
+                    <property name="ellipsize">middle</property>
+                    <property name="label">0</property>
+                    <style>
+                      <class name="numeric"/>
+                    </style>
+                  </object>
+                </child>
+              </object>
+            </child>
+            <child>
+              <object class="AdwActionRow">
+                <property name="title" translatable="yes">All Characters</property>
+                <child type="suffix">
+                  <object class="GtkLabel" id="all_chars">
+                    <property name="xalign">1</property>
+                    <property name="ellipsize">middle</property>
+                    <property name="label">0</property>
+                    <style>
+                      <class name="numeric"/>
+                    </style>
+                  </object>
+                </child>
+              </object>
+            </child>
+          </object>
+        </child>
+      </object>
+    </child>
+  </template>
+</interface>
diff --git a/src/editor-window-actions.c b/src/editor-window-actions.c
index 77ef885..ed1e639 100644
--- a/src/editor-window-actions.c
+++ b/src/editor-window-actions.c
@@ -29,6 +29,7 @@
 #include "editor-language-dialog.h"
 #include "editor-page-private.h"
 #include "editor-preferences-dialog-private.h"
+#include "editor-properties-dialog-private.h"
 #include "editor-save-changes-dialog-private.h"
 #include "editor-session-private.h"
 #include "editor-window-private.h"
@@ -594,6 +595,23 @@ editor_window_actions_page_zoom_one_cb (GtkWidget  *widget,
   _editor_page_zoom_one (editor_window_get_visible_page (self));
 }
 
+static void
+editor_window_actions_page_properties_cb (GtkWidget  *widget,
+                                          const char *action_name,
+                                          GVariant   *param)
+{
+  EditorWindow *self = (EditorWindow *)widget;
+  EditorDocument *document;
+  GtkWidget *window;
+
+  g_assert (EDITOR_IS_WINDOW (self));
+
+  document = editor_page_get_document (self->visible_page);
+  window = editor_properties_dialog_new (self, document);
+
+  gtk_window_present (GTK_WINDOW (window));
+}
+
 void
 _editor_window_class_actions_init (EditorWindowClass *klass)
 {
@@ -703,6 +721,10 @@ _editor_window_class_actions_init (EditorWindowClass *klass)
                                    "page.zoom-one",
                                    NULL,
                                    editor_window_actions_page_zoom_one_cb);
+  gtk_widget_class_install_action (widget_class,
+                                   "page.properties",
+                                   NULL,
+                                   editor_window_actions_page_properties_cb);
 }
 
 void
@@ -770,6 +792,7 @@ _editor_window_actions_update (EditorWindow *self,
   gtk_widget_action_set_enabled (GTK_WIDGET (self), "page.change-language", has_page);
   gtk_widget_action_set_enabled (GTK_WIDGET (self), "page.discard-changes", externally_modified || (modified 
&& !draft));
   gtk_widget_action_set_enabled (GTK_WIDGET (self), "page.print", has_page);
+  gtk_widget_action_set_enabled (GTK_WIDGET (self), "page.properties", has_page);
   gtk_widget_action_set_enabled (GTK_WIDGET (self), "page.save", can_save);
   gtk_widget_action_set_enabled (GTK_WIDGET (self), "page.save-as", has_page);
   gtk_widget_action_set_enabled (GTK_WIDGET (self), "page.copy-all", has_page);
diff --git a/src/editor-window.ui b/src/editor-window.ui
index bf14139..f3aefc8 100644
--- a/src/editor-window.ui
+++ b/src/editor-window.ui
@@ -219,6 +219,11 @@ Or, press Ctrl+W to close the window.</property>
         <attribute name="action">page.print</attribute>
         <attribute name="accel">&lt;control&gt;p</attribute>
       </item>
+      <item>
+        <attribute name="id">properties</attribute>
+        <attribute name="label" translatable="yes">Documen_t Properties</attribute>
+        <attribute name="action">page.properties</attribute>
+      </item>
     </section>
     <section>
       <item>
diff --git a/src/meson.build b/src/meson.build
index 5a36af0..2cb9255 100644
--- a/src/meson.build
+++ b/src/meson.build
@@ -26,6 +26,7 @@ editor_sources = [
   'editor-preferences-radio.c',
   'editor-preferences-spin.c',
   'editor-preferences-switch.c',
+  'editor-properties-dialog.c',
   'editor-print-operation.c',
   'editor-recoloring.c',
   'editor-save-changes-dialog.c',
diff --git a/src/org.gnome.TextEditor.gresource.xml b/src/org.gnome.TextEditor.gresource.xml
index 991d2f2..48bdeb6 100644
--- a/src/org.gnome.TextEditor.gresource.xml
+++ b/src/org.gnome.TextEditor.gresource.xml
@@ -8,6 +8,7 @@
     <file preprocess="xml-stripblanks">editor-page.ui</file>
     <file preprocess="xml-stripblanks">editor-position-label.ui</file>
     <file preprocess="xml-stripblanks">editor-preferences-dialog.ui</file>
+    <file preprocess="xml-stripblanks">editor-properties-dialog.ui</file>
     <file preprocess="xml-stripblanks">editor-search-bar.ui</file>
     <file preprocess="xml-stripblanks">editor-search-entry.ui</file>
     <file preprocess="xml-stripblanks">editor-sidebar-row.ui</file>


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]