pspp-cvs
[Top][All Lists]
Advanced

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

[Pspp-cvs] pspp glade/ChangeLog glade/automake.mk glade/ps...


From: John Darrington
Subject: [Pspp-cvs] pspp glade/ChangeLog glade/automake.mk glade/ps...
Date: Wed, 04 Apr 2007 11:02:32 +0000

CVSROOT:        /sources/pspp
Module name:    pspp
Changes by:     John Darrington <jmd>   07/04/04 11:02:32

Modified files:
        glade          : ChangeLog automake.mk psppire.xml 
        src/ui/gui     : ChangeLog about.h automake.mk data-editor.c 
                         data-editor.glade data-editor.h 
                         glade-register.c helper.c psppire-buttonbox.c 
                         psppire-buttonbox.h psppire-dialog.h 
                         psppire-keypad.c psppire-keypad.h 
                         psppire-selector.c psppire.glade 
                         sort-cases-dialog.c sort-cases-dialog.h 
                         window-manager.h 
Added files:
        glade/icons/16x16: psppire-hbuttonbox.png psppire-vbuttonbox.png 
        glade/icons/22x22: psppire-hbuttonbox.png psppire-vbuttonbox.png 
        src/ui/gui     : compute-dialog.c compute-dialog.h 
                         psppire-hbuttonbox.c psppire-hbuttonbox.h 
                         psppire-vbuttonbox.c psppire-vbuttonbox.h 
Removed files:
        glade/icons/16x16: psppire-buttonbox.png 
        glade/icons/22x22: psppire-buttonbox.png 

Log message:
        Added the Compute dialog box.

CVSWeb URLs:
http://cvs.savannah.gnu.org/viewcvs/pspp/glade/ChangeLog?cvsroot=pspp&r1=1.1&r2=1.2
http://cvs.savannah.gnu.org/viewcvs/pspp/glade/automake.mk?cvsroot=pspp&r1=1.3&r2=1.4
http://cvs.savannah.gnu.org/viewcvs/pspp/glade/psppire.xml?cvsroot=pspp&r1=1.4&r2=1.5
http://cvs.savannah.gnu.org/viewcvs/pspp/glade/icons/16x16/psppire-hbuttonbox.png?cvsroot=pspp&rev=1.1
http://cvs.savannah.gnu.org/viewcvs/pspp/glade/icons/16x16/psppire-vbuttonbox.png?cvsroot=pspp&rev=1.1
http://cvs.savannah.gnu.org/viewcvs/pspp/glade/icons/16x16/psppire-buttonbox.png?cvsroot=pspp&r1=1.1&r2=0
http://cvs.savannah.gnu.org/viewcvs/pspp/glade/icons/22x22/psppire-hbuttonbox.png?cvsroot=pspp&rev=1.1
http://cvs.savannah.gnu.org/viewcvs/pspp/glade/icons/22x22/psppire-vbuttonbox.png?cvsroot=pspp&rev=1.1
http://cvs.savannah.gnu.org/viewcvs/pspp/glade/icons/22x22/psppire-buttonbox.png?cvsroot=pspp&r1=1.1&r2=0
http://cvs.savannah.gnu.org/viewcvs/pspp/src/ui/gui/ChangeLog?cvsroot=pspp&r1=1.49&r2=1.50
http://cvs.savannah.gnu.org/viewcvs/pspp/src/ui/gui/about.h?cvsroot=pspp&r1=1.1&r2=1.2
http://cvs.savannah.gnu.org/viewcvs/pspp/src/ui/gui/automake.mk?cvsroot=pspp&r1=1.24&r2=1.25
http://cvs.savannah.gnu.org/viewcvs/pspp/src/ui/gui/data-editor.c?cvsroot=pspp&r1=1.23&r2=1.24
http://cvs.savannah.gnu.org/viewcvs/pspp/src/ui/gui/data-editor.glade?cvsroot=pspp&r1=1.16&r2=1.17
http://cvs.savannah.gnu.org/viewcvs/pspp/src/ui/gui/data-editor.h?cvsroot=pspp&r1=1.8&r2=1.9
http://cvs.savannah.gnu.org/viewcvs/pspp/src/ui/gui/glade-register.c?cvsroot=pspp&r1=1.4&r2=1.5
http://cvs.savannah.gnu.org/viewcvs/pspp/src/ui/gui/helper.c?cvsroot=pspp&r1=1.16&r2=1.17
http://cvs.savannah.gnu.org/viewcvs/pspp/src/ui/gui/psppire-buttonbox.c?cvsroot=pspp&r1=1.4&r2=1.5
http://cvs.savannah.gnu.org/viewcvs/pspp/src/ui/gui/psppire-buttonbox.h?cvsroot=pspp&r1=1.2&r2=1.3
http://cvs.savannah.gnu.org/viewcvs/pspp/src/ui/gui/psppire-dialog.h?cvsroot=pspp&r1=1.3&r2=1.4
http://cvs.savannah.gnu.org/viewcvs/pspp/src/ui/gui/psppire-keypad.c?cvsroot=pspp&r1=1.1&r2=1.2
http://cvs.savannah.gnu.org/viewcvs/pspp/src/ui/gui/psppire-keypad.h?cvsroot=pspp&r1=1.1&r2=1.2
http://cvs.savannah.gnu.org/viewcvs/pspp/src/ui/gui/psppire-selector.c?cvsroot=pspp&r1=1.5&r2=1.6
http://cvs.savannah.gnu.org/viewcvs/pspp/src/ui/gui/psppire.glade?cvsroot=pspp&r1=1.16&r2=1.17
http://cvs.savannah.gnu.org/viewcvs/pspp/src/ui/gui/sort-cases-dialog.c?cvsroot=pspp&r1=1.7&r2=1.8
http://cvs.savannah.gnu.org/viewcvs/pspp/src/ui/gui/sort-cases-dialog.h?cvsroot=pspp&r1=1.5&r2=1.6
http://cvs.savannah.gnu.org/viewcvs/pspp/src/ui/gui/window-manager.h?cvsroot=pspp&r1=1.4&r2=1.5
http://cvs.savannah.gnu.org/viewcvs/pspp/src/ui/gui/compute-dialog.c?cvsroot=pspp&rev=1.1
http://cvs.savannah.gnu.org/viewcvs/pspp/src/ui/gui/compute-dialog.h?cvsroot=pspp&rev=1.1
http://cvs.savannah.gnu.org/viewcvs/pspp/src/ui/gui/psppire-hbuttonbox.c?cvsroot=pspp&rev=1.1
http://cvs.savannah.gnu.org/viewcvs/pspp/src/ui/gui/psppire-hbuttonbox.h?cvsroot=pspp&rev=1.1
http://cvs.savannah.gnu.org/viewcvs/pspp/src/ui/gui/psppire-vbuttonbox.c?cvsroot=pspp&rev=1.1
http://cvs.savannah.gnu.org/viewcvs/pspp/src/ui/gui/psppire-vbuttonbox.h?cvsroot=pspp&rev=1.1

Patches:
Index: glade/ChangeLog
===================================================================
RCS file: /sources/pspp/pspp/glade/ChangeLog,v
retrieving revision 1.1
retrieving revision 1.2
diff -u -b -r1.1 -r1.2
--- glade/ChangeLog     30 Mar 2007 23:39:32 -0000      1.1
+++ glade/ChangeLog     4 Apr 2007 11:02:31 -0000       1.2
@@ -1,3 +1,7 @@
+4/4/2007 John Darrington <address@hidden>
+
+  * Seperated psppire-buttonbox into psppire-vbuttonbox and psppire-buttonbox
+
 Sat Mar 31 07:09:33 WST 2007 John Darrington <address@hidden>
        
   * Added icons directory and its contents.

Index: glade/automake.mk
===================================================================
RCS file: /sources/pspp/pspp/glade/automake.mk,v
retrieving revision 1.3
retrieving revision 1.4
diff -u -b -r1.3 -r1.4
--- glade/automake.mk   30 Mar 2007 23:39:32 -0000      1.3
+++ glade/automake.mk   4 Apr 2007 11:02:31 -0000       1.4
@@ -14,6 +14,8 @@
        glade/bbox.c \
        glade/selector.c \
        src/ui/gui/psppire-buttonbox.c \
+       src/ui/gui/psppire-hbuttonbox.c \
+       src/ui/gui/psppire-vbuttonbox.c \
        src/ui/gui/psppire-dialog.c \
        src/ui/gui/psppire-keypad.c \
        src/ui/gui/psppire-selector.c
@@ -22,16 +24,18 @@
        glade/psppire.xml
 
 nodist_small_pixmap_DATA = \
-       glade/icons/16x16/psppire-buttonbox.png \
+       glade/icons/16x16/psppire-hbuttonbox.png \
+       glade/icons/16x16/psppire-vbuttonbox.png \
        glade/icons/16x16/psppire-dialog.png \
        glade/icons/16x16/psppire-keypad.png \
        glade/icons/16x16/psppire-selector.png 
 
 nodist_large_pixmap_DATA = \
-       glade/icons/22x22/psppire-buttonbox.png \
+       glade/icons/22x22/psppire-hbuttonbox.png \
+       glade/icons/22x22/psppire-vbuttonbox.png \
        glade/icons/22x22/psppire-dialog.png \
        glade/icons/22x22/psppire-keypad.png \
-       glade/icons/16x16/psppire-selector.png 
+       glade/icons/22x22/psppire-selector.png 
 
 
 libglade_psppire_la_CFLAGS = $(GLADE_UI_CFLAGS) $(GLADE_CFLAGS) \

Index: glade/psppire.xml
===================================================================
RCS file: /sources/pspp/pspp/glade/psppire.xml,v
retrieving revision 1.4
retrieving revision 1.5
diff -u -b -r1.4 -r1.5
--- glade/psppire.xml   31 Mar 2007 11:44:45 -0000      1.4
+++ glade/psppire.xml   4 Apr 2007 11:02:31 -0000       1.5
@@ -50,13 +50,12 @@
 
        <property id="modal" ignore="True" default="True" />
        <property id="visible" ignore="True" default="False" />
-       
     </properties>
 
     </glade-widget-class>
 
 
-    <glade-widget-class name="PsppireButtonBox" 
generic-name="psppire-buttonbox" title="Psppire Button Box">
+    <glade-widget-class name="PsppireVButtonBox" 
generic-name="psppire-vbuttonbox" title="Vertical Button Box">
 
       
<post-create-function>glade_psppire_button_box_post_create</post-create-function>
       
<get-children-function>glade_psppire_button_box_get_children</get-children-function>
@@ -65,6 +64,7 @@
 
     <properties>
       <property id="child"                disabled="True" />
+      <property id="visible" ignore="True" default="True" />
     </properties>
 
     <packing-defaults>
@@ -77,6 +77,30 @@
 
     </glade-widget-class>
 
+    <glade-widget-class name="PsppireHButtonBox" 
generic-name="psppire-hbuttonbox" title="Horizontal Button Box">
+
+      
<post-create-function>glade_psppire_button_box_post_create</post-create-function>
+      
<get-children-function>glade_psppire_button_box_get_children</get-children-function>
+
+      
<get-internal-child-function>glade_psppire_button_box_get_internal_child</get-internal-child-function>
+
+    <properties>
+      <property id="child"                disabled="True" />
+
+      <property id="visible" ignore="True" default="True" />
+    </properties>
+
+
+    <packing-defaults>
+      <parent-class name="GtkVBox">
+       <child-property id="expand" default="False"/>
+       <child-property id="fill" default="False"/>
+       <child-property id="pack-type" default="GTK_PACK_END"/>
+      </parent-class>
+    </packing-defaults>
+
+    </glade-widget-class>
+
 
 
     <glade-widget-class name="PsppireKeypad" 
@@ -96,6 +120,8 @@
        <property id="visible-window" disabled="True"/>
        <property id="resize-mode"    disabled="True"/>
        <property id="border-width"   disabled="True"/>
+
+       <property id="visible" ignore="True" default="True" />
      </properties>
   
     </glade-widget-class>
@@ -136,6 +162,8 @@
          </displayable-values>
        </property>
 
+
+       <property id="visible" ignore="True" default="True" />
      </properties>
 
     </glade-widget-class>
@@ -147,7 +175,8 @@
 
  <glade-widget-group name="psppire" title="Psppire">
   <glade-widget-class-ref name="PsppireDialog"/>
-  <glade-widget-class-ref name="PsppireButtonBox"/>
+  <glade-widget-class-ref name="PsppireHButtonBox"/>
+  <glade-widget-class-ref name="PsppireVButtonBox"/>
   <glade-widget-class-ref name="PsppireKeypad"/>
   <glade-widget-class-ref name="PsppireSelector"/>
  </glade-widget-group>

Index: src/ui/gui/ChangeLog
===================================================================
RCS file: /sources/pspp/pspp/src/ui/gui/ChangeLog,v
retrieving revision 1.49
retrieving revision 1.50
diff -u -b -r1.49 -r1.50
--- src/ui/gui/ChangeLog        4 Apr 2007 04:27:04 -0000       1.49
+++ src/ui/gui/ChangeLog        4 Apr 2007 11:02:31 -0000       1.50
@@ -1,3 +1,21 @@
+2007-04-04   John Darrington <address@hidden>
+
+       * compute-dialog.c compute-dialog.h: New files
+
+       * data-editor.c data-editor.h data-editor.glade : Added Transform 
+       menu, and support for Compute dialog
+
+       * glade-register.c psppire-buttonbox.c psppire-buttonbox.h 
+         psppire-vbottonbox.c psppire-vbuttonbox.h psppire-hbuttonbox.c 
+         psppire-vbuttonbox.h : Made buttonbox an abstract base class 
+         and separated it into vbuttonbox and hbuttonbox.
+
+       * psppire-selector.c : Allowed GtkTextView to be the destination 
+       widget.
+
+       * psppire-keypad.c: Added an "erase" signal.  Fixed other 
+        minor problems.
+
 2007-04-03  Ben Pfaff  <address@hidden>
            John McCabe-Dansted <address@hidden>
 

Index: src/ui/gui/about.h
===================================================================
RCS file: /sources/pspp/pspp/src/ui/gui/about.h,v
retrieving revision 1.1
retrieving revision 1.2
diff -u -b -r1.1 -r1.2
--- src/ui/gui/about.h  23 Dec 2006 09:03:45 -0000      1.1
+++ src/ui/gui/about.h  4 Apr 2007 11:02:31 -0000       1.2
@@ -1,3 +1,23 @@
+/*
+    PSPPIRE --- A Graphical User Interface for PSPP
+    Copyright (C) 2007  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 2 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, write to the Free Software
+    Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
+    02110-1301, USA. */
+
+
 
 
 void about_new (GtkMenuItem *m, GtkWindow *parent);

Index: src/ui/gui/automake.mk
===================================================================
RCS file: /sources/pspp/pspp/src/ui/gui/automake.mk,v
retrieving revision 1.24
retrieving revision 1.25
diff -u -b -r1.24 -r1.25
--- src/ui/gui/automake.mk      31 Mar 2007 11:44:45 -0000      1.24
+++ src/ui/gui/automake.mk      4 Apr 2007 11:02:31 -0000       1.25
@@ -65,6 +65,8 @@
 src_ui_gui_psppire_SOURCES = \
        src/ui/gui/about.c \
        src/ui/gui/about.h \
+       src/ui/gui/compute-dialog.c \
+       src/ui/gui/compute-dialog.h \
        src/ui/gui/customentry.c \
        src/ui/gui/customentry.h \
        src/ui/gui/data-sheet.c \
@@ -86,6 +88,10 @@
        src/ui/gui/missing-val-dialog.h \
        src/ui/gui/psppire-buttonbox.c \
        src/ui/gui/psppire-buttonbox.h \
+       src/ui/gui/psppire-hbuttonbox.c \
+       src/ui/gui/psppire-hbuttonbox.h \
+       src/ui/gui/psppire-vbuttonbox.c \
+       src/ui/gui/psppire-vbuttonbox.h \
        src/ui/gui/psppire-case-file.c \
        src/ui/gui/psppire-case-file.h \
        src/ui/gui/psppire-data-store.c \

Index: src/ui/gui/data-editor.c
===================================================================
RCS file: /sources/pspp/pspp/src/ui/gui/data-editor.c,v
retrieving revision 1.23
retrieving revision 1.24
diff -u -b -r1.23 -r1.24
--- src/ui/gui/data-editor.c    3 Apr 2007 10:08:59 -0000       1.23
+++ src/ui/gui/data-editor.c    4 Apr 2007 11:02:31 -0000       1.24
@@ -35,6 +35,7 @@
 #include "split-file-dialog.h"
 #include "transpose-dialog.h"
 #include "sort-cases-dialog.h"
+#include "compute-dialog.h"
 #include "dict-display.h"
 
 #define _(msgid) gettext (msgid)
@@ -250,6 +251,16 @@
                    G_CALLBACK (sort_cases_dialog), de);
 
 
+  de->invoke_compute_dialog =
+    gtk_action_new ("compute-dialog",
+                   _("Compute"),
+                   _("Compute new values for a variable"),
+                   "pspp-compute");
+
+  g_signal_connect (de->invoke_compute_dialog, "activate",
+                   G_CALLBACK (compute_dialog), de);
+
+
   e->window = GTK_WINDOW (get_widget_assert (de->xml, "data_editor"));
 
   g_signal_connect_swapped (get_widget_assert (de->xml,"file_new_data"),
@@ -349,6 +360,10 @@
                            get_widget_assert (de->xml, "data_sort-cases")
                            );
 
+  gtk_action_connect_proxy (de->invoke_compute_dialog,
+                           get_widget_assert (de->xml, "transform_compute")
+                           );
+
 
   g_signal_connect (get_widget_assert (de->xml,"help_about"),
                    "activate",

Index: src/ui/gui/data-editor.glade
===================================================================
RCS file: /sources/pspp/pspp/src/ui/gui/data-editor.glade,v
retrieving revision 1.16
retrieving revision 1.17
diff -u -b -r1.16 -r1.17
--- src/ui/gui/data-editor.glade        3 Apr 2007 10:08:59 -0000       1.16
+++ src/ui/gui/data-editor.glade        4 Apr 2007 11:02:31 -0000       1.17
@@ -373,6 +373,37 @@
               </widget>
             </child>
             <child>
+              <widget class="GtkMenuItem" id="transform">
+                <property name="visible">True</property>
+                <property name="events">GDK_POINTER_MOTION_MASK | 
GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | 
GDK_BUTTON_RELEASE_MASK</property>
+                <property name="label" translatable="yes">_Transform</property>
+                <property name="use_underline">True</property>
+                <child>
+                  <widget class="GtkMenu" id="menu2">
+                    <property name="visible">True</property>
+                    <property name="events">GDK_POINTER_MOTION_MASK | 
GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | 
GDK_BUTTON_RELEASE_MASK</property>
+                    <child>
+                      <widget class="GtkMenuItem" id="transform_compute">
+                        <property name="visible">True</property>
+                        <property name="events">GDK_POINTER_MOTION_MASK | 
GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | 
GDK_BUTTON_RELEASE_MASK</property>
+                        <property name="label" 
translatable="yes">_Compute</property>
+                        <property name="use_underline">True</property>
+                      </widget>
+                    </child>
+                    <child>
+                      <widget class="GtkMenuItem" id="transform_rank">
+                        <property name="visible">True</property>
+                        <property name="sensitive">False</property>
+                        <property name="events">GDK_POINTER_MOTION_MASK | 
GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | 
GDK_BUTTON_RELEASE_MASK</property>
+                        <property name="label" translatable="yes">Ran_k 
Cases</property>
+                        <property name="use_underline">True</property>
+                      </widget>
+                    </child>
+                  </widget>
+                </child>
+              </widget>
+            </child>
+            <child>
               <widget class="GtkMenuItem" id="windows">
                 <property name="visible">True</property>
                 <property name="label" translatable="yes">_Windows</property>
@@ -464,7 +495,7 @@
                     <property name="visible">True</property>
                     <property name="sensitive">False</property>
                     <property name="tooltip" 
translatable="yes">Recall</property>
-                    <property name="stock_id">gtk-missing-image</property>
+                    <property name="stock_id">pspp-recent-dialogs</property>
                   </widget>
                   <packing>
                     <property name="expand">False</property>

Index: src/ui/gui/data-editor.h
===================================================================
RCS file: /sources/pspp/pspp/src/ui/gui/data-editor.h,v
retrieving revision 1.8
retrieving revision 1.9
diff -u -b -r1.8 -r1.9
--- src/ui/gui/data-editor.h    31 Mar 2007 11:44:45 -0000      1.8
+++ src/ui/gui/data-editor.h    4 Apr 2007 11:02:31 -0000       1.9
@@ -37,8 +37,8 @@
   GtkAction *invoke_weight_cases_dialog;
   GtkAction *invoke_transpose_dialog;
   GtkAction *invoke_split_file_dialog;
-
   GtkAction *invoke_sort_cases_dialog;
+  GtkAction *invoke_compute_dialog;
 
   GladeXML *xml;
 

Index: src/ui/gui/glade-register.c
===================================================================
RCS file: /sources/pspp/pspp/src/ui/gui/glade-register.c,v
retrieving revision 1.4
retrieving revision 1.5
diff -u -b -r1.4 -r1.5
--- src/ui/gui/glade-register.c 12 Feb 2007 02:10:54 -0000      1.4
+++ src/ui/gui/glade-register.c 4 Apr 2007 11:02:31 -0000       1.5
@@ -1,11 +1,33 @@
+/*
+    PSPPIRE --- A Graphical User Interface for PSPP
+    Copyright (C) 2007  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 2 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, write to the Free Software
+    Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
+    02110-1301, USA. */
+
+
 #include <config.h>
 
 #include <string.h>
 
 #include <glade/glade-build.h>
 #include "psppire-dialog.h"
-#include "psppire-buttonbox.h"
 #include "psppire-selector.h"
+#include "psppire-keypad.h"
+#include "psppire-hbuttonbox.h"
+#include "psppire-vbuttonbox.h"
 
 GLADE_MODULE_CHECK_INIT
 
@@ -30,13 +52,22 @@
                         dialog_find_internal_child);
 
 
-  glade_register_widget (PSPPIRE_BUTTONBOX_TYPE, NULL,
+  glade_register_widget (PSPPIRE_VBUTTON_BOX_TYPE, NULL,
+                        glade_standard_build_children,
+                        NULL);
+
+  glade_register_widget (PSPPIRE_HBUTTON_BOX_TYPE, NULL,
                         glade_standard_build_children,
                         NULL);
 
   glade_register_widget (PSPPIRE_SELECTOR_TYPE, NULL,
                         glade_standard_build_children,
                         NULL);
+
+  glade_register_widget (PSPPIRE_KEYPAD_TYPE, NULL,
+                        glade_standard_build_children,
+                        NULL);
+
 }
 
 

Index: src/ui/gui/helper.c
===================================================================
RCS file: /sources/pspp/pspp/src/ui/gui/helper.c,v
retrieving revision 1.16
retrieving revision 1.17
diff -u -b -r1.16 -r1.17
--- src/ui/gui/helper.c 26 Jan 2007 07:35:04 -0000      1.16
+++ src/ui/gui/helper.c 4 Apr 2007 11:02:31 -0000       1.17
@@ -1,3 +1,23 @@
+/*
+    PSPPIRE --- A Graphical User Interface for PSPP
+    Copyright (C) 2007  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 2 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, write to the Free Software
+    Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
+    02110-1301, USA. */
+
+
 /* This file is a rubbish bin where stuff gets put when it doesn't seem to
    belong anywhere else.
 */

Index: src/ui/gui/psppire-buttonbox.c
===================================================================
RCS file: /sources/pspp/pspp/src/ui/gui/psppire-buttonbox.c,v
retrieving revision 1.4
retrieving revision 1.5
diff -u -b -r1.4 -r1.5
--- src/ui/gui/psppire-buttonbox.c      31 Mar 2007 11:44:45 -0000      1.4
+++ src/ui/gui/psppire-buttonbox.c      4 Apr 2007 11:02:31 -0000       1.5
@@ -32,39 +32,39 @@
 #define N_(msgid) msgid
 
 
-static void psppire_buttonbox_class_init          (PsppireButtonBoxClass *);
-static void psppire_buttonbox_init                (PsppireButtonBox      *);
+static void psppire_button_box_class_init          (PsppireButtonBoxClass *);
+static void psppire_button_box_init                (PsppireButtonBox      *);
 
 
 GType
 psppire_button_box_get_type (void)
 {
-  static GType buttonbox_type = 0;
+  static GType button_box_type = 0;
 
-  if (!buttonbox_type)
+  if (!button_box_type)
     {
-      static const GTypeInfo buttonbox_info =
+      static const GTypeInfo button_box_info =
       {
        sizeof (PsppireButtonBoxClass),
        NULL, /* base_init */
         NULL, /* base_finalize */
-       (GClassInitFunc) psppire_buttonbox_class_init,
+       (GClassInitFunc) psppire_button_box_class_init,
         NULL, /* class_finalize */
        NULL, /* class_data */
         sizeof (PsppireButtonBox),
        0,
-       (GInstanceInitFunc) psppire_buttonbox_init,
+       (GInstanceInitFunc) psppire_button_box_init,
       };
 
-      buttonbox_type = g_type_register_static (GTK_TYPE_VBUTTON_BOX,
-                                           "PsppireButtonBox", 
&buttonbox_info, 0);
+      button_box_type = g_type_register_static (GTK_TYPE_BUTTON_BOX,
+                                           "PsppireButtonBox", 
&button_box_info, 0);
     }
 
-  return buttonbox_type;
+  return button_box_type;
 }
 
 static void
-psppire_buttonbox_class_init (PsppireButtonBoxClass *class)
+psppire_button_box_class_init (PsppireButtonBoxClass *class)
 {
 }
 
@@ -118,46 +118,120 @@
 
 
 static void
-psppire_buttonbox_init (PsppireButtonBox *buttonbox)
+psppire_button_box_init (PsppireButtonBox *button_box)
 {
   GtkWidget *button ;
 
   button = gtk_button_new_from_stock (GTK_STOCK_OK);
-  gtk_box_pack_start_defaults (GTK_BOX (buttonbox), button);
+  gtk_box_pack_start_defaults (GTK_BOX (button_box), button);
   g_signal_connect (button, "clicked", G_CALLBACK (ok_button_clicked), NULL);
   gtk_widget_show (button);
 
   button = gtk_button_new_with_mnemonic (_("_Paste"));
   g_signal_connect (button, "clicked", G_CALLBACK (paste_button_clicked),
                    NULL);
-  gtk_box_pack_start_defaults (GTK_BOX (buttonbox), button);
+  gtk_box_pack_start_defaults (GTK_BOX (button_box), button);
   gtk_widget_show (button);
 
   button = gtk_button_new_from_stock (GTK_STOCK_CANCEL);
   g_signal_connect (button, "clicked", G_CALLBACK (close_dialog), NULL);
-  gtk_box_pack_start_defaults (GTK_BOX (buttonbox), button);
+  gtk_box_pack_start_defaults (GTK_BOX (button_box), button);
   gtk_widget_show (button);
 
   button = gtk_button_new_from_stock (GTK_STOCK_REFRESH);
   g_signal_connect (button, "clicked", G_CALLBACK (refresh_clicked), NULL);
-  gtk_box_pack_start_defaults (GTK_BOX (buttonbox), button);
+  gtk_box_pack_start_defaults (GTK_BOX (button_box), button);
   gtk_widget_show (button);
 
   button = gtk_button_new_from_stock (GTK_STOCK_HELP);
-  gtk_box_pack_start_defaults (GTK_BOX (buttonbox), button);
+  gtk_box_pack_start_defaults (GTK_BOX (button_box), button);
   gtk_widget_show (button);
 
-  gtk_widget_show (GTK_WIDGET (buttonbox));
 }
 
 
-GtkWidget*
-psppire_buttonbox_new (void)
-{
-  PsppireButtonBox *buttonbox ;
+/* This function is lifted verbatim from the Gtk2.10.6 library */
 
-  buttonbox = g_object_new (psppire_button_box_get_type (), NULL);
+void
+_psppire_button_box_child_requisition (GtkWidget *widget,
+                                      int       *nvis_children,
+                                      int       *nvis_secondaries,
+                                      int       *width,
+                                      int       *height)
+{
+  GtkButtonBox *bbox;
+  GtkBoxChild *child;
+  GList *children;
+  gint nchildren;
+  gint nsecondaries;
+  gint needed_width;
+  gint needed_height;
+  GtkRequisition child_requisition;
+  gint ipad_w;
+  gint ipad_h;
+  gint width_default;
+  gint height_default;
+  gint ipad_x_default;
+  gint ipad_y_default;
+
+  gint child_min_width;
+  gint child_min_height;
+  gint ipad_x;
+  gint ipad_y;
+
+  g_return_if_fail (GTK_IS_BUTTON_BOX (widget));
+
+  bbox = GTK_BUTTON_BOX (widget);
+
+  gtk_widget_style_get (widget,
+                        "child-min-width", &width_default,
+                        "child-min-height", &height_default,
+                        "child-internal-pad-x", &ipad_x_default,
+                        "child-internal-pad-y", &ipad_y_default,
+                       NULL);
 
-  return GTK_WIDGET (buttonbox) ;
-}
+  child_min_width = bbox->child_min_width   != GTK_BUTTONBOX_DEFAULT
+    ? bbox->child_min_width : width_default;
+  child_min_height = bbox->child_min_height !=GTK_BUTTONBOX_DEFAULT
+    ? bbox->child_min_height : height_default;
+  ipad_x = bbox->child_ipad_x != GTK_BUTTONBOX_DEFAULT
+    ? bbox->child_ipad_x : ipad_x_default;
+  ipad_y = bbox->child_ipad_y != GTK_BUTTONBOX_DEFAULT
+    ? bbox->child_ipad_y : ipad_y_default;
+
+  nchildren = 0;
+  nsecondaries = 0;
+  children = GTK_BOX(bbox)->children;
+  needed_width = child_min_width;
+  needed_height = child_min_height;
+  ipad_w = ipad_x * 2;
+  ipad_h = ipad_y * 2;
 
+  while (children)
+    {
+      child = children->data;
+      children = children->next;
+
+      if (GTK_WIDGET_VISIBLE (child->widget))
+       {
+         nchildren += 1;
+         gtk_widget_size_request (child->widget, &child_requisition);
+
+         if (child_requisition.width + ipad_w > needed_width)
+           needed_width = child_requisition.width + ipad_w;
+         if (child_requisition.height + ipad_h > needed_height)
+           needed_height = child_requisition.height + ipad_h;
+         if (child->is_secondary)
+           nsecondaries++;
+       }
+    }
+
+  if (nvis_children)
+    *nvis_children = nchildren;
+  if (nvis_secondaries)
+    *nvis_secondaries = nsecondaries;
+  if (width)
+    *width = needed_width;
+  if (height)
+    *height = needed_height;
+}

Index: src/ui/gui/psppire-buttonbox.h
===================================================================
RCS file: /sources/pspp/pspp/src/ui/gui/psppire-buttonbox.h,v
retrieving revision 1.2
retrieving revision 1.3
diff -u -b -r1.2 -r1.3
--- src/ui/gui/psppire-buttonbox.h      20 Jan 2007 00:02:13 -0000      1.2
+++ src/ui/gui/psppire-buttonbox.h      4 Apr 2007 11:02:31 -0000       1.3
@@ -1,10 +1,30 @@
+/*
+    PSPPIRE --- A Graphical User Interface for PSPP
+    Copyright (C) 2007  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 2 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, write to the Free Software
+    Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
+    02110-1301, USA. */
+
+
 #ifndef __PSPPIRE_BUTTONBOX_H__
 #define __PSPPIRE_BUTTONBOX_H__
 
 
 #include <glib.h>
 #include <glib-object.h>
-#include <gtk/gtkvbbox.h>
+#include <gtk/gtkbbox.h>
 
 G_BEGIN_DECLS
 
@@ -20,16 +40,24 @@
 
 struct _PsppireButtonBox
 {
-  GtkVButtonBox parent;
+  GtkButtonBox parent;
 };
 
 struct _PsppireButtonBoxClass
 {
-  GtkVButtonBoxClass parent_class;
+  GtkButtonBoxClass parent_class;
 };
 
 GType          psppire_button_box_get_type        (void);
-GtkWidget*     psppire_buttonbox_new             (void);
+
+
+/* Internal function.  Do not use */
+void
+_psppire_button_box_child_requisition (GtkWidget *widget,
+                                      int       *nvis_children,
+                                      int       *nvis_secondaries,
+                                      int       *width,
+                                      int       *height);
 
 G_END_DECLS
 

Index: src/ui/gui/psppire-dialog.h
===================================================================
RCS file: /sources/pspp/pspp/src/ui/gui/psppire-dialog.h,v
retrieving revision 1.3
retrieving revision 1.4
diff -u -b -r1.3 -r1.4
--- src/ui/gui/psppire-dialog.h 31 Mar 2007 11:44:45 -0000      1.3
+++ src/ui/gui/psppire-dialog.h 4 Apr 2007 11:02:31 -0000       1.4
@@ -1,3 +1,23 @@
+/*
+    PSPPIRE --- A Graphical User Interface for PSPP
+    Copyright (C) 2007  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 2 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, write to the Free Software
+    Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
+    02110-1301, USA. */
+
+
 #ifndef __PSPPIRE_DIALOG_H__
 #define __PSPPIRE_DIALOG_H__
 

Index: src/ui/gui/psppire-keypad.c
===================================================================
RCS file: /sources/pspp/pspp/src/ui/gui/psppire-keypad.c,v
retrieving revision 1.1
retrieving revision 1.2
diff -u -b -r1.1 -r1.2
--- src/ui/gui/psppire-keypad.c 30 Mar 2007 23:39:33 -0000      1.1
+++ src/ui/gui/psppire-keypad.c 4 Apr 2007 11:02:31 -0000       1.2
@@ -25,6 +25,7 @@
 
 enum {
   INSERT_SYNTAX,
+  ERASE,
   n_SIGNALS
 };
 
@@ -106,6 +107,16 @@
                                         g_cclosure_marshal_VOID__STRING,
                                          G_TYPE_NONE, 1,
                                         G_TYPE_STRING);
+
+  keypad_signals[ERASE] = g_signal_new ("erase",
+                                        G_TYPE_FROM_CLASS (klass),
+                                        G_SIGNAL_RUN_FIRST | G_SIGNAL_ACTION,
+                                        G_STRUCT_OFFSET (PsppireKeypadClass,
+                                                         keypad),
+                                         NULL,
+                                         NULL,
+                                        g_cclosure_marshal_VOID__VOID,
+                                         G_TYPE_NONE, 0);
 }
 
 
@@ -118,7 +129,7 @@
 static const char *keypad_insert_text[] = {
   "0",  "1",  "2", "3", "4", "5", "6", "7", "8", "9",
   ".", "+", "-", "*", "**", "/", "=", "<>", "<", "<=",
-  ">", ">=", "&", "|", "~", "(", ")"
+  ">", ">=", "&", "|", "~", "()", NULL
 };
 
 
@@ -131,7 +142,11 @@
 {
   const gchar *s = g_hash_table_lookup (kp->frag_table, b);
 
+
+  if ( s )
   g_signal_emit (kp, keypad_signals [INSERT_SYNTAX], 0, s);
+  else
+    g_signal_emit (kp, keypad_signals [ERASE], 0);
 }
 
 static const gint cols = 6;
@@ -369,12 +384,15 @@
       g_markup_printf_escaped ("<span style=\"italic\">x<sup>y</sup></span>");
 
     label = gtk_label_new ("**");
+
     gtk_label_set_markup (GTK_LABEL (label), markup);
     g_free (markup);
 
     kp->star_star = gtk_button_new ();
     gtk_container_add (GTK_CONTAINER (kp->star_star), label);
 
+    gtk_widget_show (label);
+
     add_button (kp, &kp->star_star,
                0, 1,
                4, 5);

Index: src/ui/gui/psppire-keypad.h
===================================================================
RCS file: /sources/pspp/pspp/src/ui/gui/psppire-keypad.h,v
retrieving revision 1.1
retrieving revision 1.2
diff -u -b -r1.1 -r1.2
--- src/ui/gui/psppire-keypad.h 30 Mar 2007 23:39:33 -0000      1.1
+++ src/ui/gui/psppire-keypad.h 4 Apr 2007 11:02:31 -0000       1.2
@@ -52,6 +52,7 @@
 #include <glib.h>
 #include <glib-object.h>
 #include <gtk/gtkeventbox.h>
+#include <gtk/gtktable.h>
 
 
 G_BEGIN_DECLS

Index: src/ui/gui/psppire-selector.c
===================================================================
RCS file: /sources/pspp/pspp/src/ui/gui/psppire-selector.c,v
retrieving revision 1.5
retrieving revision 1.6
diff -u -b -r1.5 -r1.6
--- src/ui/gui/psppire-selector.c       4 Apr 2007 04:27:04 -0000       1.5
+++ src/ui/gui/psppire-selector.c       4 Apr 2007 11:02:31 -0000       1.6
@@ -68,6 +68,7 @@
 
 #include <gtk/gtktreeview.h>
 #include <gtk/gtktreeselection.h>
+#include <gtk/gtktextview.h>
 #include <gtk/gtkwidget.h>
 
 static void psppire_selector_base_finalize (PsppireSelectorClass *, gpointer);
@@ -561,7 +562,7 @@
     {
       PsppireSelector *selector = list->data;
 
-      if ( selector->filter (childmodel, iter, selector))
+      if ( selector->filter && selector->filter (childmodel, iter, selector))
          return FALSE;
 
       list = list->next;
@@ -745,6 +746,11 @@
   else if ( GTK_IS_ENTRY (dest))
     set_entry_dest (selector, GTK_ENTRY (dest));
 
+  else if (GTK_IS_TEXT_VIEW (dest))
+    {
+      /* Nothing to be done */
+    }
+
   else
     g_error ("Unsupported destination widget: %s", G_OBJECT_TYPE_NAME (dest));
 

Index: src/ui/gui/psppire.glade
===================================================================
RCS file: /sources/pspp/pspp/src/ui/gui/psppire.glade,v
retrieving revision 1.16
retrieving revision 1.17
diff -u -b -r1.16 -r1.17
--- src/ui/gui/psppire.glade    31 Mar 2007 11:44:45 -0000      1.16
+++ src/ui/gui/psppire.glade    4 Apr 2007 11:02:31 -0000       1.17
@@ -191,7 +191,8 @@
           </packing>
         </child>
         <child>
-          <widget class="PsppireButtonBox" id="psppire-buttonbox1">
+          <widget class="PsppireVButtonBox" id="psppire-buttonbox1">
+            <property name="visible">True</property>
             <property name="border_width">5</property>
           </widget>
           <packing>
@@ -364,7 +365,8 @@
           </packing>
         </child>
         <child>
-          <widget class="PsppireButtonBox" id="psppire-buttonbox2">
+          <widget class="PsppireVButtonBox" id="psppire-buttonbox2">
+            <property name="visible">True</property>
             <property name="border_width">5</property>
           </widget>
           <packing>
@@ -655,7 +657,7 @@
           </widget>
         </child>
         <child>
-          <widget class="PsppireButtonBox" id="psppire-buttonbox3">
+          <widget class="PsppireVButtonBox" id="psppire-buttonbox3">
             <property name="visible">True</property>
             <property name="events">GDK_POINTER_MOTION_MASK | 
GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | 
GDK_BUTTON_RELEASE_MASK</property>
             <property name="border_width">5</property>
@@ -682,18 +684,13 @@
             <property name="events">GDK_POINTER_MOTION_MASK | 
GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | 
GDK_BUTTON_RELEASE_MASK</property>
             <property name="spacing">5</property>
             <child>
-              <widget class="GtkFrame" id="frame7">
-                <property name="visible">True</property>
-                <property name="events">GDK_POINTER_MOTION_MASK | 
GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | 
GDK_BUTTON_RELEASE_MASK</property>
-                <property name="label_xalign">0</property>
-                <property name="shadow_type">GTK_SHADOW_IN</property>
-                <child>
                   <widget class="GtkScrolledWindow" id="scrolledwindow5">
                     <property name="visible">True</property>
                     <property name="can_focus">True</property>
                     <property name="events">GDK_POINTER_MOTION_MASK | 
GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | 
GDK_BUTTON_RELEASE_MASK</property>
                     <property 
name="hscrollbar_policy">GTK_POLICY_AUTOMATIC</property>
                     <property 
name="vscrollbar_policy">GTK_POLICY_AUTOMATIC</property>
+                <property name="shadow_type">GTK_SHADOW_IN</property>
                     <child>
                       <widget class="GtkTreeView" id="treeview1">
                         <property name="visible">True</property>
@@ -706,14 +703,6 @@
                   </widget>
                 </child>
                 <child>
-                  <placeholder/>
-                  <packing>
-                    <property name="type">label_item</property>
-                  </packing>
-                </child>
-              </widget>
-            </child>
-            <child>
               <widget class="GtkVBox" id="vbox10">
                 <property name="visible">True</property>
                 <property name="events">GDK_POINTER_MOTION_MASK | 
GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | 
GDK_BUTTON_RELEASE_MASK</property>
@@ -741,6 +730,10 @@
                                 <property name="active">True</property>
                                 <property name="draw_indicator">True</property>
                               </widget>
+                              <packing>
+                                <property name="expand">False</property>
+                                <property name="fill">False</property>
+                              </packing>
                             </child>
                             <child>
                               <widget class="GtkRadioButton" id="radiobutton3">
@@ -1091,27 +1084,16 @@
           </packing>
         </child>
         <child>
-          <widget class="GtkHButtonBox" id="hbuttonbox2">
+          <widget class="PsppireHButtonBox" id="psppire-hbuttonbox1">
             <property name="visible">True</property>
             <property name="events">GDK_POINTER_MOTION_MASK | 
GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | 
GDK_BUTTON_RELEASE_MASK</property>
+            <property name="border_width">5</property>
             <property name="layout_style">GTK_BUTTONBOX_SPREAD</property>
-            <child>
-              <placeholder/>
-            </child>
-            <child>
-              <placeholder/>
-            </child>
-            <child>
-              <placeholder/>
-            </child>
-            <child>
-              <placeholder/>
-            </child>
-            <child>
-              <placeholder/>
-            </child>
           </widget>
           <packing>
+            <property name="expand">False</property>
+            <property name="fill">False</property>
+            <property name="pack_type">GTK_PACK_END</property>
             <property name="position">2</property>
           </packing>
         </child>
@@ -1284,15 +1266,328 @@
           </widget>
         </child>
         <child>
-          <widget class="PsppireButtonBox" id="psppire-buttonbox4">
+          <widget class="PsppireVButtonBox" id="psppire-buttonbox4">
+            <property name="visible">True</property>
+            <property name="events">GDK_POINTER_MOTION_MASK | 
GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | 
GDK_BUTTON_RELEASE_MASK</property>
+            <property name="border_width">5</property>
+          </widget>
+          <packing>
+            <property name="expand">False</property>
+            <property name="fill">False</property>
+            <property name="pack_type">GTK_PACK_END</property>
+            <property name="position">1</property>
+          </packing>
+        </child>
+      </widget>
+    </child>
+  </widget>
+  <widget class="PsppireDialog" id="compute-variable-dialog">
+    <property name="events">GDK_POINTER_MOTION_MASK | 
GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | 
GDK_BUTTON_RELEASE_MASK</property>
+    <property name="title">Compute Variable</property>
+    <property name="modal">True</property>
+    <child internal-child="hbox">
+      <widget class="GtkHBox" id="dialog-hbox5">
+        <property name="visible">True</property>
+        <property name="events">GDK_POINTER_MOTION_MASK | 
GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | 
GDK_BUTTON_RELEASE_MASK</property>
+        <property name="spacing">2</property>
+        <child>
+          <widget class="GtkAlignment" id="alignment8">
+            <property name="visible">True</property>
+            <property name="events">GDK_POINTER_MOTION_MASK | 
GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | 
GDK_BUTTON_RELEASE_MASK</property>
+            <property name="bottom_padding">5</property>
+            <property name="left_padding">5</property>
+            <child>
+              <widget class="GtkHBox" id="hbox15">
+                <property name="visible">True</property>
+                <property name="events">GDK_POINTER_MOTION_MASK | 
GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | 
GDK_BUTTON_RELEASE_MASK</property>
+                <child>
+                  <widget class="GtkVBox" id="vbox19">
+                    <property name="visible">True</property>
+                    <property name="events">GDK_POINTER_MOTION_MASK | 
GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | 
GDK_BUTTON_RELEASE_MASK</property>
+                    <property name="spacing">5</property>
+                    <child>
+                      <widget class="GtkVBox" id="vbox20">
+                        <property name="visible">True</property>
+                        <property name="events">GDK_POINTER_MOTION_MASK | 
GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | 
GDK_BUTTON_RELEASE_MASK</property>
+                        <child>
+                          <widget class="GtkLabel" id="label20">
+                            <property name="visible">True</property>
+                            <property name="events">GDK_POINTER_MOTION_MASK | 
GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | 
GDK_BUTTON_RELEASE_MASK</property>
+                            <property name="xalign">0</property>
+                            <property name="label" translatable="yes">Target 
Variable:</property>
+                          </widget>
+                          <packing>
+                            <property name="expand">False</property>
+                            <property name="fill">False</property>
+                          </packing>
+                        </child>
+                        <child>
+                          <widget class="GtkEntry" id="compute-entry1">
+                            <property name="visible">True</property>
+                            <property name="can_focus">True</property>
+                            <property name="events">GDK_POINTER_MOTION_MASK | 
GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | 
GDK_BUTTON_RELEASE_MASK</property>
+                          </widget>
+                          <packing>
+                            <property name="expand">False</property>
+                            <property name="fill">False</property>
+                            <property name="position">1</property>
+                          </packing>
+                        </child>
+                      </widget>
+                      <packing>
+                        <property name="expand">False</property>
+                        <property name="fill">False</property>
+                      </packing>
+                    </child>
+                    <child>
+                      <widget class="GtkButton" id="compute-button1">
+                        <property name="visible">True</property>
+                        <property name="can_focus">True</property>
+                        <property name="receives_default">True</property>
+                        <property name="events">GDK_POINTER_MOTION_MASK | 
GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | 
GDK_BUTTON_RELEASE_MASK</property>
+                        <property name="label" translatable="yes">Type &amp; 
Label</property>
+                      </widget>
+                      <packing>
+                        <property name="expand">False</property>
+                        <property name="fill">False</property>
+                        <property name="position">1</property>
+                      </packing>
+                    </child>
+                    <child>
+                      <widget class="GtkScrolledWindow" id="scrolledwindow9">
+                        <property name="visible">True</property>
+                        <property name="can_focus">True</property>
+                        <property name="events">GDK_POINTER_MOTION_MASK | 
GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | 
GDK_BUTTON_RELEASE_MASK</property>
+                        <property 
name="hscrollbar_policy">GTK_POLICY_AUTOMATIC</property>
+                        <property 
name="vscrollbar_policy">GTK_POLICY_AUTOMATIC</property>
+                        <property name="shadow_type">GTK_SHADOW_IN</property>
+                        <child>
+                          <widget class="GtkTreeView" id="compute-treeview1">
+                            <property name="visible">True</property>
+                            <property name="can_focus">True</property>
+                            <property name="events">GDK_POINTER_MOTION_MASK | 
GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | 
GDK_BUTTON_RELEASE_MASK</property>
+                            <property name="headers_visible">False</property>
+                          </widget>
+                        </child>
+                      </widget>
+                      <packing>
+                        <property name="position">2</property>
+                      </packing>
+                    </child>
+                  </widget>
+                </child>
+                <child>
+                  <widget class="GtkVBox" id="vbox21">
+                    <property name="visible">True</property>
+                    <property name="events">GDK_POINTER_MOTION_MASK | 
GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | 
GDK_BUTTON_RELEASE_MASK</property>
+                    <child>
+                      <widget class="GtkLabel" id="label21">
+                        <property name="visible">True</property>
+                        <property name="events">GDK_POINTER_MOTION_MASK | 
GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | 
GDK_BUTTON_RELEASE_MASK</property>
+                        <property name="label" translatable="yes">=</property>
+                      </widget>
+                      <packing>
+                        <property name="expand">False</property>
+                        <property name="fill">False</property>
+                      </packing>
+                    </child>
+                    <child>
+                      <widget class="PsppireSelector" id="compute-selector1">
+                        <property name="visible">True</property>
+                        <property name="can_focus">True</property>
+                        <property name="receives_default">True</property>
+                        <property name="events">GDK_POINTER_MOTION_MASK | 
GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | 
GDK_BUTTON_RELEASE_MASK</property>
+                        <property name="border_width">5</property>
+                      </widget>
+                      <packing>
+                        <property name="expand">False</property>
+                        <property name="fill">False</property>
+                        <property name="position">1</property>
+                      </packing>
+                    </child>
+                  </widget>
+                  <packing>
+                    <property name="expand">False</property>
+                    <property name="fill">False</property>
+                    <property name="position">1</property>
+                  </packing>
+                </child>
+              </widget>
+            </child>
+          </widget>
+        </child>
+        <child>
+          <widget class="GtkVBox" id="vbox17">
+            <property name="visible">True</property>
+            <property name="events">GDK_POINTER_MOTION_MASK | 
GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | 
GDK_BUTTON_RELEASE_MASK</property>
+            <property name="spacing">5</property>
+            <child>
+              <widget class="GtkVBox" id="vbox18">
+                <property name="visible">True</property>
+                <property name="events">GDK_POINTER_MOTION_MASK | 
GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | 
GDK_BUTTON_RELEASE_MASK</property>
+                <child>
+                  <widget class="GtkLabel" id="label19">
+                    <property name="visible">True</property>
+                    <property name="events">GDK_POINTER_MOTION_MASK | 
GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | 
GDK_BUTTON_RELEASE_MASK</property>
+                    <property name="xalign">0</property>
+                    <property name="label" translatable="yes">Numeric 
Expressions:</property>
+                  </widget>
+                  <packing>
+                    <property name="expand">False</property>
+                    <property name="fill">False</property>
+                  </packing>
+                </child>
+                <child>
+                  <widget class="GtkScrolledWindow" id="scrolledwindow8">
+                    <property name="visible">True</property>
+                    <property name="can_focus">True</property>
+                    <property name="events">GDK_POINTER_MOTION_MASK | 
GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | 
GDK_BUTTON_RELEASE_MASK</property>
+                    <property 
name="hscrollbar_policy">GTK_POLICY_AUTOMATIC</property>
+                    <property 
name="vscrollbar_policy">GTK_POLICY_AUTOMATIC</property>
+                    <property name="shadow_type">GTK_SHADOW_IN</property>
+                    <child>
+                      <widget class="GtkTextView" id="compute-textview1">
+                        <property name="visible">True</property>
+                        <property name="can_focus">True</property>
+                        <property name="events">GDK_POINTER_MOTION_MASK | 
GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | 
GDK_BUTTON_RELEASE_MASK</property>
+                      </widget>
+                    </child>
+                  </widget>
+                  <packing>
+                    <property name="position">1</property>
+                  </packing>
+                </child>
+              </widget>
+            </child>
+            <child>
+              <widget class="GtkHBox" id="hbox16">
             <property name="visible">True</property>
             <property name="events">GDK_POINTER_MOTION_MASK | 
GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | 
GDK_BUTTON_RELEASE_MASK</property>
+                <property name="spacing">5</property>
+                <child>
+                  <widget class="PsppireKeypad" id="psppire-keypad1">
+                    <property name="visible">True</property>
+                    <property name="can_focus">True</property>
+                    <property name="events">GDK_POINTER_MOTION_MASK | 
GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK 
| GDK_KEY_RELEASE_MASK | GDK_ENTER_NOTIFY_MASK | GDK_LEAVE_NOTIFY_MASK | 
GDK_FOCUS_CHANGE_MASK</property>
+                  </widget>
+                </child>
+                <child>
+                  <widget class="GtkVBox" id="vbox22">
+                    <property name="visible">True</property>
+                    <property name="events">GDK_POINTER_MOTION_MASK | 
GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | 
GDK_BUTTON_RELEASE_MASK</property>
+                    <child>
+                      <widget class="GtkHBox" id="hbox17">
+                        <property name="visible">True</property>
+                        <property name="events">GDK_POINTER_MOTION_MASK | 
GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | 
GDK_BUTTON_RELEASE_MASK</property>
+                        <child>
+                          <widget class="GtkLabel" id="label22">
+                            <property name="visible">True</property>
+                            <property name="events">GDK_POINTER_MOTION_MASK | 
GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | 
GDK_BUTTON_RELEASE_MASK</property>
+                            <property name="xalign">0</property>
+                            <property name="label" 
translatable="yes">Functions:</property>
+                          </widget>
+                        </child>
+                        <child>
+                          <widget class="PsppireSelector" 
id="compute-selector2">
+                            <property name="visible">True</property>
+                            <property name="can_focus">True</property>
+                            <property name="receives_default">True</property>
+                            <property name="events">GDK_POINTER_MOTION_MASK | 
GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | 
GDK_BUTTON_RELEASE_MASK</property>
             <property name="border_width">5</property>
+                            <property 
name="orientation">PSPPIRE_SELECT_SOURCE_BELOW_DEST</property>
+                          </widget>
+                          <packing>
+                            <property name="fill">False</property>
+                            <property name="position">1</property>
+                          </packing>
+                        </child>
+                      </widget>
+                      <packing>
+                        <property name="expand">False</property>
+                        <property name="fill">False</property>
+                      </packing>
+                    </child>
+                    <child>
+                      <widget class="GtkScrolledWindow" id="scrolledwindow10">
+                        <property name="visible">True</property>
+                        <property name="can_focus">True</property>
+                        <property name="events">GDK_POINTER_MOTION_MASK | 
GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | 
GDK_BUTTON_RELEASE_MASK</property>
+                        <property 
name="hscrollbar_policy">GTK_POLICY_NEVER</property>
+                        <property name="shadow_type">GTK_SHADOW_IN</property>
+                        <child>
+                          <widget class="GtkTreeView" id="compute-treeview2">
+                            <property name="visible">True</property>
+                            <property name="can_focus">True</property>
+                            <property name="events">GDK_POINTER_MOTION_MASK | 
GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | 
GDK_BUTTON_RELEASE_MASK</property>
+                            <property name="headers_visible">False</property>
+                          </widget>
+                        </child>
+                      </widget>
+                      <packing>
+                        <property name="position">1</property>
+                      </packing>
+                    </child>
+                  </widget>
+                  <packing>
+                    <property name="position">1</property>
+                  </packing>
+                </child>
+              </widget>
+              <packing>
+                <property name="position">1</property>
+              </packing>
+            </child>
+            <child>
+              <widget class="GtkHBox" id="hbox18">
+                <property name="visible">True</property>
+                <property name="events">GDK_POINTER_MOTION_MASK | 
GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | 
GDK_BUTTON_RELEASE_MASK</property>
+                <child>
+                  <widget class="GtkButton" id="button4">
+                    <property name="visible">True</property>
+                    <property name="sensitive">False</property>
+                    <property name="can_focus">True</property>
+                    <property name="receives_default">True</property>
+                    <property name="events">GDK_POINTER_MOTION_MASK | 
GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | 
GDK_BUTTON_RELEASE_MASK</property>
+                    <property name="label" translatable="yes">If...</property>
+                  </widget>
+                  <packing>
+                    <property name="expand">False</property>
+                    <property name="fill">False</property>
+                  </packing>
+                </child>
+                <child>
+                  <widget class="GtkLabel" id="label23">
+                    <property name="visible">True</property>
+                    <property name="events">GDK_POINTER_MOTION_MASK | 
GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | 
GDK_BUTTON_RELEASE_MASK</property>
+                  </widget>
+                  <packing>
+                    <property name="position">1</property>
+                  </packing>
+                </child>
+              </widget>
+              <packing>
+                <property name="expand">False</property>
+                <property name="fill">False</property>
+                <property name="position">2</property>
+              </packing>
+            </child>
+            <child>
+              <widget class="PsppireHButtonBox" id="psppire-hbuttonbox2">
+                <property name="visible">True</property>
+                <property name="events">GDK_POINTER_MOTION_MASK | 
GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | 
GDK_BUTTON_RELEASE_MASK</property>
+                <property name="border_width">5</property>
+                <property name="layout_style">GTK_BUTTONBOX_SPREAD</property>
           </widget>
           <packing>
             <property name="expand">False</property>
             <property name="fill">False</property>
             <property name="pack_type">GTK_PACK_END</property>
+                <property name="position">3</property>
+              </packing>
+            </child>
+          </widget>
+          <packing>
+            <property name="padding">5</property>
             <property name="position">1</property>
           </packing>
         </child>

Index: src/ui/gui/sort-cases-dialog.c
===================================================================
RCS file: /sources/pspp/pspp/src/ui/gui/sort-cases-dialog.c,v
retrieving revision 1.7
retrieving revision 1.8
diff -u -b -r1.7 -r1.8
--- src/ui/gui/sort-cases-dialog.c      31 Mar 2007 11:44:45 -0000      1.7
+++ src/ui/gui/sort-cases-dialog.c      4 Apr 2007 11:02:31 -0000       1.8
@@ -1,3 +1,23 @@
+/*
+    PSPPIRE --- A Graphical User Interface for PSPP
+    Copyright (C) 2007  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 2 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, write to the Free Software
+    Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
+    02110-1301, USA. */
+
+
 #include <gtk/gtk.h>
 #include "sort-cases-dialog.h"
 #include "helper.h"

Index: src/ui/gui/sort-cases-dialog.h
===================================================================
RCS file: /sources/pspp/pspp/src/ui/gui/sort-cases-dialog.h,v
retrieving revision 1.5
retrieving revision 1.6
diff -u -b -r1.5 -r1.6
--- src/ui/gui/sort-cases-dialog.h      31 Mar 2007 11:44:45 -0000      1.5
+++ src/ui/gui/sort-cases-dialog.h      4 Apr 2007 11:02:31 -0000       1.6
@@ -1,6 +1,6 @@
 /*
     PSPPIRE --- A Graphical User Interface for PSPP
-    Copyright (C) 2006  Free Software Foundation
+    Copyright (C) 2007  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

Index: src/ui/gui/window-manager.h
===================================================================
RCS file: /sources/pspp/pspp/src/ui/gui/window-manager.h,v
retrieving revision 1.4
retrieving revision 1.5
diff -u -b -r1.4 -r1.5
--- src/ui/gui/window-manager.h 25 Jan 2007 08:18:57 -0000      1.4
+++ src/ui/gui/window-manager.h 4 Apr 2007 11:02:31 -0000       1.5
@@ -1,3 +1,23 @@
+/*
+    PSPPIRE --- A Graphical User Interface for PSPP
+    Copyright (C) 2007  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 2 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, write to the Free Software
+    Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
+    02110-1301, USA. */
+
+
 #ifndef WINDOW_MANAGER_H
 #define WINDOW_MANAGER_H
 

Index: glade/icons/16x16/psppire-hbuttonbox.png
===================================================================
RCS file: glade/icons/16x16/psppire-hbuttonbox.png
diff -N glade/icons/16x16/psppire-hbuttonbox.png
Binary files /dev/null and /tmp/cvsLIyzjj differ

Index: glade/icons/16x16/psppire-vbuttonbox.png
===================================================================
RCS file: glade/icons/16x16/psppire-vbuttonbox.png
diff -N glade/icons/16x16/psppire-vbuttonbox.png
Binary files /dev/null and /tmp/cvsONZwLj differ

Index: glade/icons/22x22/psppire-hbuttonbox.png
===================================================================
RCS file: glade/icons/22x22/psppire-hbuttonbox.png
diff -N glade/icons/22x22/psppire-hbuttonbox.png
Binary files /dev/null and /tmp/cvsJW34Jm differ

Index: glade/icons/22x22/psppire-vbuttonbox.png
===================================================================
RCS file: glade/icons/22x22/psppire-vbuttonbox.png
diff -N glade/icons/22x22/psppire-vbuttonbox.png
Binary files /dev/null and /tmp/cvsCwHHcn differ

Index: src/ui/gui/compute-dialog.c
===================================================================
RCS file: src/ui/gui/compute-dialog.c
diff -N src/ui/gui/compute-dialog.c
--- /dev/null   1 Jan 1970 00:00:00 -0000
+++ src/ui/gui/compute-dialog.c 4 Apr 2007 11:02:31 -0000       1.1
@@ -0,0 +1,466 @@
+/*
+    PSPPIRE --- A Graphical User Interface for PSPP
+    Copyright (C) 2007  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 2 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, write to the Free Software
+    Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
+    02110-1301, USA. */
+
+
+#include <gtk/gtk.h>
+#include "compute-dialog.h"
+#include "helper.h"
+#include "psppire-dialog.h"
+#include "psppire-keypad.h"
+#include "data-editor.h"
+#include <gtksheet/gtksheet.h>
+#include "psppire-var-store.h"
+#include "dialog-common.h"
+#include "dict-display.h"
+
+#include <language/syntax-string-source.h>
+#include "syntax-editor.h"
+
+
+#include <language/expressions/private.h>
+#include "c-ctype.h"
+
+static void function_list_populate (GtkTreeView *tv);
+
+static void insert_function_into_syntax_area (GtkTreeIter iter,
+                                             GtkWidget *text_view,
+                                             GtkTreeModel *model
+                                             );
+
+static void insert_source_row_into_text_view (GtkTreeIter iter,
+                                             GtkWidget *dest,
+                                             GtkTreeModel *model
+                                             );
+
+
+
+struct compute_dialog
+{
+  GladeXML *xml;  /* The xml that generated the widgets */
+};
+
+
+static void
+on_target_change (GObject *obj, const struct compute_dialog *cd)
+{
+  GtkWidget *target = get_widget_assert (cd->xml, "compute-entry1");
+  GtkWidget *type_and_label = get_widget_assert (cd->xml, "compute-button1");
+
+  const gchar *var_name = gtk_entry_get_text (GTK_ENTRY (target));
+  gboolean valid = var_name && strcmp ("", var_name);
+
+  gtk_widget_set_sensitive (type_and_label, valid);
+}
+
+static void
+refresh (GObject *obj, const struct compute_dialog *cd)
+{
+  GtkTextIter start, end;
+  GtkWidget *target = get_widget_assert (cd->xml, "compute-entry1");
+  GtkWidget *syntax_area = get_widget_assert (cd->xml, "compute-textview1");
+  GtkWidget *varlist = get_widget_assert (cd->xml, "compute-treeview1");
+  GtkWidget *funclist = get_widget_assert (cd->xml, "compute-treeview2");
+
+  GtkTextBuffer *buffer =
+    gtk_text_view_get_buffer (GTK_TEXT_VIEW (syntax_area));
+
+  GtkTreeSelection *selection;
+
+
+  /* Clear the target variable entry box */
+  gtk_entry_set_text (GTK_ENTRY (target), "");
+  g_signal_emit_by_name (target, "changed");
+
+
+  /* Clear the syntax area textbuffer */
+  gtk_text_buffer_get_start_iter (buffer, &start);
+  gtk_text_buffer_get_end_iter (buffer, &end);
+  gtk_text_buffer_delete (buffer, &start, &end);
+
+
+  /* Unselect all items in the treeview */
+  selection = gtk_tree_view_get_selection (GTK_TREE_VIEW (varlist));
+  gtk_tree_selection_unselect_all (selection);
+
+  /* And the other one */
+  selection = gtk_tree_view_get_selection (GTK_TREE_VIEW (funclist));
+  gtk_tree_selection_unselect_all (selection);
+}
+
+
+static void
+erase_selection (GtkTextBuffer *buffer)
+{
+  GtkTextIter start, end;
+
+  gtk_text_buffer_get_selection_bounds (buffer, &start, &end);
+
+  gtk_text_buffer_delete (buffer, &start, &end);
+}
+
+
+
+static void
+on_keypad_button (PsppireKeypad *kp, const gchar *syntax, gpointer data)
+{
+  GladeXML *xml = data;
+
+  GtkWidget *rhs = get_widget_assert (xml, "compute-textview1");
+
+  GtkTextBuffer *buffer = gtk_text_view_get_buffer (GTK_TEXT_VIEW (rhs));
+
+  erase_selection (buffer);
+
+  gtk_text_buffer_insert_at_cursor (buffer, syntax, strlen (syntax));
+
+  if (0 == strcmp (syntax, "()"))
+    {
+      GtkTextIter iter;
+      GtkTextMark *cursor = gtk_text_buffer_get_insert (buffer);
+      gtk_text_buffer_get_iter_at_mark (buffer, &iter, cursor);
+      gtk_text_iter_backward_cursor_position (&iter);
+      gtk_text_buffer_move_mark (buffer, cursor, &iter);
+    }
+
+}
+
+static void
+erase (PsppireKeypad *kp, gpointer data)
+{
+  GladeXML *xml = data;
+
+  GtkWidget *rhs = get_widget_assert (xml, "compute-textview1");
+
+  GtkTextBuffer *buffer = gtk_text_view_get_buffer (GTK_TEXT_VIEW (rhs));
+
+  erase_selection (buffer);
+}
+
+static char *
+generate_syntax (const struct compute_dialog *cd)
+{
+  gchar *text;
+  GString *string ;
+  GtkTextIter start, end;
+  GtkWidget *target =    get_widget_assert   (cd->xml, "compute-entry1");
+  GtkWidget *syntax_area = get_widget_assert (cd->xml, "compute-textview1");
+
+  GtkTextBuffer *buffer =
+    gtk_text_view_get_buffer (GTK_TEXT_VIEW (syntax_area));
+
+  gtk_text_buffer_get_start_iter (buffer, &start);
+  gtk_text_buffer_get_end_iter (buffer, &end);
+
+
+  string = g_string_new ("COMPUTE ");
+
+  g_string_append (string, gtk_entry_get_text (GTK_ENTRY (target)));
+
+  g_string_append (string, " = ");
+
+  g_string_append (string,
+                  gtk_text_buffer_get_text (buffer, &start, &end, FALSE));
+
+  g_string_append (string, ".");
+
+  text = string->str;
+
+  g_string_free (string, FALSE);
+
+  return text;
+}
+
+
+/* Pops up the Compute dialog box */
+void
+compute_dialog (GObject *o, gpointer data)
+{
+  gint response;
+  struct data_editor *de = data;
+
+  PsppireVarStore *vs;
+  struct compute_dialog scd;
+
+  GladeXML *xml = XML_NEW ("psppire.glade");
+
+  GtkWidget *dialog = get_widget_assert   (xml, "compute-variable-dialog");
+
+  GtkWidget *dict_view = get_widget_assert   (xml, "compute-treeview1");
+  GtkWidget *functions = get_widget_assert   (xml, "compute-treeview2");
+  GtkWidget *keypad =    get_widget_assert   (xml, "psppire-keypad1");
+  GtkWidget *target =    get_widget_assert   (xml, "compute-entry1");
+  GtkWidget *syntax_area = get_widget_assert (xml, "compute-textview1");
+  GtkWidget *var_selector = get_widget_assert (xml, "compute-selector1");
+  GtkWidget *func_selector = get_widget_assert (xml, "compute-selector2");
+
+  GtkSheet *var_sheet =
+    GTK_SHEET (get_widget_assert (de->xml, "variable_sheet"));
+
+  vs = PSPPIRE_VAR_STORE (gtk_sheet_get_model (var_sheet));
+
+
+  gtk_window_set_transient_for (GTK_WINDOW (dialog), de->parent.window);
+
+
+  attach_dictionary_to_treeview (GTK_TREE_VIEW (dict_view),
+                                vs->dict,
+                                GTK_SELECTION_SINGLE, NULL);
+
+
+  psppire_selector_set_subjects (PSPPIRE_SELECTOR (var_selector),
+                                dict_view, syntax_area,
+                                insert_source_row_into_text_view,
+                                NULL);
+
+
+  function_list_populate (GTK_TREE_VIEW (functions));
+
+  psppire_selector_set_subjects (PSPPIRE_SELECTOR (func_selector),
+                                functions, syntax_area,
+                                insert_function_into_syntax_area,
+                                NULL);
+
+
+  scd.xml = xml;
+
+  g_signal_connect (target, "changed", G_CALLBACK (on_target_change), &scd);
+
+  g_signal_connect (dialog, "refresh", G_CALLBACK (refresh),  &scd);
+
+  g_signal_connect (keypad, "insert-syntax",
+                   G_CALLBACK (on_keypad_button),  xml);
+
+  g_signal_connect (keypad, "erase",
+                   G_CALLBACK (erase),  xml);
+
+
+  response = psppire_dialog_run (PSPPIRE_DIALOG (dialog));
+
+
+  switch (response)
+    {
+    case GTK_RESPONSE_OK:
+      {
+       gchar *syntax = generate_syntax (&scd);
+       struct getl_interface *sss = create_syntax_string_source (syntax);
+       execute_syntax (sss);
+
+       g_free (syntax);
+      }
+      break;
+    case PSPPIRE_RESPONSE_PASTE:
+      {
+       gchar *syntax = generate_syntax (&scd);
+
+       struct syntax_editor *se =
+         (struct syntax_editor *) window_create (WINDOW_SYNTAX, NULL);
+
+       gtk_text_buffer_insert_at_cursor (se->buffer, syntax, -1);
+
+       g_free (syntax);
+      }
+      break;
+    default:
+      break;
+    }
+
+  g_object_unref (xml);
+}
+
+
+enum {
+  COL_NAME,
+  COL_USAGE,
+  COL_ARITY
+};
+
+
+static const struct operation fs[] =
+  {
+#include <language/expressions/parse.inc>
+  };
+
+
+static void
+function_list_populate (GtkTreeView *tv)
+{
+  GtkListStore *liststore;
+  GtkTreeIter iter;
+  gint i;
+
+  const gint n_funcs = sizeof (fs) / sizeof fs[0] ;
+
+  liststore = gtk_list_store_new (3, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_INT);
+
+  for (i = 0 ; i < n_funcs ; ++i)
+    {
+      if ( fs[i].prototype == NULL)
+       continue;
+
+      /* All the real ones seem to begin with an upper case letter */
+      if ( !c_isupper(*fs[i].prototype))
+       continue;
+
+      gtk_list_store_append (liststore, &iter);
+
+      gtk_list_store_set (liststore, &iter,
+                         COL_NAME, fs[i].name,
+                         COL_USAGE,fs[i].prototype,
+                         COL_ARITY, fs[i].arg_cnt,
+                         -1);
+    }
+
+
+
+  /* Set the cell rendering */
+
+  {
+    GtkTreeViewColumn *col;
+    GtkCellRenderer *renderer;
+
+
+    col = gtk_tree_view_column_new ();
+
+    gtk_tree_view_append_column (tv, col);
+
+    renderer = gtk_cell_renderer_text_new ();
+
+    gtk_tree_view_column_pack_start (col, renderer, TRUE);
+
+    gtk_tree_view_column_add_attribute (col, renderer, "text", COL_USAGE);
+  }
+
+  gtk_tree_view_set_model (tv, GTK_TREE_MODEL (liststore));
+}
+
+
+
+
+static void
+insert_function_into_syntax_area (GtkTreeIter iter,
+                                 GtkWidget *text_view,
+                                 GtkTreeModel *model
+                                 )
+{
+  GString *string;
+  GValue name_value = {0};
+  GValue arity_value = {0};
+  gint arity;
+  gint i;
+
+  GtkTextBuffer *buffer ;
+
+  g_return_if_fail (GTK_IS_TEXT_VIEW (text_view));
+
+  buffer = gtk_text_view_get_buffer (GTK_TEXT_VIEW (text_view));
+
+  gtk_tree_model_get_value (model, &iter, COL_NAME, &name_value);
+  gtk_tree_model_get_value (model, &iter, COL_ARITY, &arity_value);
+
+  arity = g_value_get_int (&arity_value);
+
+  string = g_string_new (g_value_get_string (&name_value));
+
+  g_string_append (string, "(");
+  for ( i = 0 ; i < arity -1 ; ++i )
+    {
+      g_string_append (string, "?,");
+    }
+  g_string_append (string, "?)");
+
+
+  erase_selection (buffer);
+
+  gtk_text_buffer_insert_at_cursor (buffer, string->str, string->len);
+
+  g_value_unset (&name_value);
+  g_value_unset (&arity_value);
+  g_string_free (string, TRUE);
+
+  /* Now position the cursor over the first '?' */
+  {
+    GtkTextIter insert;
+    GtkTextIter selectbound;
+    GtkTextMark *cursor = gtk_text_buffer_get_insert (buffer);
+    gtk_text_buffer_get_iter_at_mark (buffer, &insert, cursor);
+    for ( i = 0 ; i < arity ; ++i )
+      {
+       gtk_text_iter_backward_cursor_position (&insert);
+       gtk_text_iter_backward_cursor_position (&insert);
+      }
+    selectbound = insert;
+    gtk_text_iter_forward_cursor_position (&selectbound);
+
+    gtk_text_buffer_select_range (buffer, &insert, &selectbound);
+  }
+
+}
+
+/* Inserts the name of the selected variable into the destination widget.
+   The destination widget must be a GtkTextView
+ */
+static void
+insert_source_row_into_text_view (GtkTreeIter iter,
+                                 GtkWidget *dest,
+                                 GtkTreeModel *model
+                                 )
+{
+  GtkTreePath *path;
+  PsppireDict *dict;
+  gint *idx;
+  struct variable *var;
+  GtkTreeIter dict_iter;
+  gchar *name;
+  GtkTextBuffer *buffer;
+
+  g_return_if_fail (GTK_IS_TEXT_VIEW (dest));
+
+  if ( GTK_IS_TREE_MODEL_FILTER (model))
+    {
+      dict = PSPPIRE_DICT (gtk_tree_model_filter_get_model
+                          (GTK_TREE_MODEL_FILTER(model)));
+
+      gtk_tree_model_filter_convert_iter_to_child_iter (GTK_TREE_MODEL_FILTER
+                                                       (model),
+                                                       &dict_iter, &iter);
+    }
+  else
+    {
+      dict = PSPPIRE_DICT (model);
+      dict_iter = iter;
+    }
+
+  path = gtk_tree_model_get_path (GTK_TREE_MODEL (dict), &dict_iter);
+
+  idx = gtk_tree_path_get_indices (path);
+
+  var =  psppire_dict_get_variable (dict, *idx);
+
+  gtk_tree_path_free (path);
+
+  name = pspp_locale_to_utf8 (var_get_name (var), -1, NULL);
+
+  buffer = gtk_text_view_get_buffer (GTK_TEXT_VIEW (dest));
+
+  erase_selection (buffer);
+
+  gtk_text_buffer_insert_at_cursor (buffer, name, -1);
+
+  g_free (name);
+}

Index: src/ui/gui/compute-dialog.h
===================================================================
RCS file: src/ui/gui/compute-dialog.h
diff -N src/ui/gui/compute-dialog.h
--- /dev/null   1 Jan 1970 00:00:00 -0000
+++ src/ui/gui/compute-dialog.h 4 Apr 2007 11:02:31 -0000       1.1
@@ -0,0 +1,30 @@
+/*
+    PSPPIRE --- A Graphical User Interface for PSPP
+    Copyright (C) 2007  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 2 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, write to the Free Software
+    Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
+    02110-1301, USA. */
+
+#ifndef __COMPUTE_DIALOG_H
+#define __COMPUTE_DIALOG_H
+
+
+#include <gtk/gtk.h>
+#include <glade/glade.h>
+
+
+void compute_dialog (GObject *o, gpointer data);
+
+#endif

Index: src/ui/gui/psppire-hbuttonbox.c
===================================================================
RCS file: src/ui/gui/psppire-hbuttonbox.c
diff -N src/ui/gui/psppire-hbuttonbox.c
--- /dev/null   1 Jan 1970 00:00:00 -0000
+++ src/ui/gui/psppire-hbuttonbox.c     4 Apr 2007 11:02:31 -0000       1.1
@@ -0,0 +1,275 @@
+/*
+    PSPPIRE --- A Graphical User Interface for PSPP
+    Copyright (C) 2007  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 2 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, write to the Free Software
+    Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
+    02110-1301, USA. */
+
+
+#include <config.h>
+
+#include <glib.h>
+#include <gtk/gtk.h>
+#include <gtk/gtksignal.h>
+#include "psppire-hbuttonbox.h"
+#include "psppire-dialog.h"
+
+#include <gtk/gtkbbox.h>
+
+#include <gettext.h>
+
+#define _(msgid) gettext (msgid)
+#define N_(msgid) msgid
+
+
+static void psppire_hbuttonbox_class_init          (PsppireHButtonBoxClass *);
+static void psppire_hbuttonbox_init                (PsppireHButtonBox      *);
+
+static void gtk_hbutton_box_size_request  (GtkWidget      *widget,
+                                          GtkRequisition *requisition);
+static void gtk_hbutton_box_size_allocate (GtkWidget      *widget,
+                                          GtkAllocation  *allocation);
+
+
+static GtkButtonBoxStyle default_layout_style = GTK_BUTTONBOX_EDGE;
+
+GType
+psppire_hbutton_box_get_type (void)
+{
+  static GType hbuttonbox_type = 0;
+
+  if (!hbuttonbox_type)
+    {
+      static const GTypeInfo hbuttonbox_info =
+      {
+       sizeof (PsppireHButtonBoxClass),
+       NULL, /* base_init */
+        NULL, /* base_finalize */
+       (GClassInitFunc) psppire_hbuttonbox_class_init,
+        NULL, /* class_finalize */
+       NULL, /* class_data */
+        sizeof (PsppireHButtonBox),
+       0,
+       (GInstanceInitFunc) psppire_hbuttonbox_init,
+      };
+
+      hbuttonbox_type = g_type_register_static (PSPPIRE_BUTTONBOX_TYPE,
+                                           "PsppireHButtonBox", 
&hbuttonbox_info, 0);
+    }
+
+  return hbuttonbox_type;
+}
+
+static void
+psppire_hbuttonbox_class_init (PsppireHButtonBoxClass *class)
+{
+  GtkWidgetClass *widget_class;
+
+  widget_class = (GtkWidgetClass*) class;
+
+  widget_class->size_request = gtk_hbutton_box_size_request;
+  widget_class->size_allocate = gtk_hbutton_box_size_allocate;
+}
+
+
+static void
+psppire_hbuttonbox_init (PsppireHButtonBox *hbuttonbox)
+{
+}
+
+
+GtkWidget*
+psppire_hbuttonbox_new (void)
+{
+  PsppireHButtonBox *hbuttonbox ;
+
+  hbuttonbox = g_object_new (psppire_hbutton_box_get_type (), NULL);
+
+  return GTK_WIDGET (hbuttonbox) ;
+}
+
+
+
+/* The following two functions are lifted verbatim from
+   the Gtk2.10.6 library */
+
+static void
+gtk_hbutton_box_size_request (GtkWidget      *widget,
+                             GtkRequisition *requisition)
+{
+  GtkBox *box;
+  GtkButtonBox *bbox;
+  gint nvis_children;
+  gint child_width;
+  gint child_height;
+  gint spacing;
+  GtkButtonBoxStyle layout;
+
+  box = GTK_BOX (widget);
+  bbox = GTK_BUTTON_BOX (widget);
+
+  spacing = box->spacing;
+  layout = bbox->layout_style != GTK_BUTTONBOX_DEFAULT_STYLE
+         ? bbox->layout_style : default_layout_style;
+
+  _psppire_button_box_child_requisition (widget,
+                                     &nvis_children,
+                                    NULL,
+                                     &child_width,
+                                     &child_height);
+
+  if (nvis_children == 0)
+  {
+    requisition->width = 0;
+    requisition->height = 0;
+  }
+  else
+  {
+    switch (layout)
+    {
+    case GTK_BUTTONBOX_SPREAD:
+      requisition->width =
+             nvis_children*child_width + ((nvis_children+1)*spacing);
+      break;
+    case GTK_BUTTONBOX_EDGE:
+    case GTK_BUTTONBOX_START:
+    case GTK_BUTTONBOX_END:
+      requisition->width = nvis_children*child_width + 
((nvis_children-1)*spacing);
+      break;
+    default:
+      g_assert_not_reached();
+      break;
+    }
+
+    requisition->height = child_height;
+  }
+
+  requisition->width += GTK_CONTAINER (box)->border_width * 2;
+  requisition->height += GTK_CONTAINER (box)->border_width * 2;
+}
+
+
+
+static void
+gtk_hbutton_box_size_allocate (GtkWidget     *widget,
+                              GtkAllocation *allocation)
+{
+  GtkBox *base_box;
+  GtkButtonBox *box;
+  GtkBoxChild *child;
+  GList *children;
+  GtkAllocation child_allocation;
+  gint nvis_children;
+  gint n_secondaries;
+  gint child_width;
+  gint child_height;
+  gint x = 0;
+  gint secondary_x = 0;
+  gint y = 0;
+  gint width;
+  gint childspace;
+  gint childspacing = 0;
+  GtkButtonBoxStyle layout;
+  gint spacing;
+
+  base_box = GTK_BOX (widget);
+  box = GTK_BUTTON_BOX (widget);
+  spacing = base_box->spacing;
+  layout = box->layout_style != GTK_BUTTONBOX_DEFAULT_STYLE
+         ? box->layout_style : default_layout_style;
+  _psppire_button_box_child_requisition (widget,
+                                     &nvis_children,
+                                    &n_secondaries,
+                                     &child_width,
+                                     &child_height);
+  widget->allocation = *allocation;
+  width = allocation->width - GTK_CONTAINER (box)->border_width*2;
+  switch (layout)
+  {
+  case GTK_BUTTONBOX_SPREAD:
+    childspacing = (width - (nvis_children * child_width)) / (nvis_children + 
1);
+    x = allocation->x + GTK_CONTAINER (box)->border_width + childspacing;
+    secondary_x = x + ((nvis_children - n_secondaries) * (child_width + 
childspacing));
+    break;
+  case GTK_BUTTONBOX_EDGE:
+    if (nvis_children >= 2)
+      {
+       childspacing = (width - (nvis_children * child_width)) / (nvis_children 
- 1);
+       x = allocation->x + GTK_CONTAINER (box)->border_width;
+       secondary_x = x + ((nvis_children - n_secondaries) * (child_width + 
childspacing));
+      }
+    else
+      {
+       /* one or zero children, just center */
+        childspacing = width;
+       x = secondary_x = allocation->x + (allocation->width - child_width) / 2;
+      }
+    break;
+  case GTK_BUTTONBOX_START:
+    childspacing = spacing;
+    x = allocation->x + GTK_CONTAINER (box)->border_width;
+    secondary_x = allocation->x + allocation->width
+      - child_width * n_secondaries
+      - spacing * (n_secondaries - 1)
+      - GTK_CONTAINER (box)->border_width;
+    break;
+  case GTK_BUTTONBOX_END:
+    childspacing = spacing;
+    x = allocation->x + allocation->width
+      - child_width * (nvis_children - n_secondaries)
+      - spacing * (nvis_children - n_secondaries - 1)
+      - GTK_CONTAINER (box)->border_width;
+    secondary_x = allocation->x + GTK_CONTAINER (box)->border_width;
+    break;
+  default:
+    g_assert_not_reached();
+    break;
+  }
+
+
+  y = allocation->y + (allocation->height - child_height) / 2;
+  childspace = child_width + childspacing;
+
+  children = GTK_BOX (box)->children;
+
+  while (children)
+    {
+      child = children->data;
+      children = children->next;
+
+      if (GTK_WIDGET_VISIBLE (child->widget))
+       {
+         child_allocation.width = child_width;
+         child_allocation.height = child_height;
+         child_allocation.y = y;
+
+         if (child->is_secondary)
+           {
+             child_allocation.x = secondary_x;
+             secondary_x += childspace;
+           }
+         else
+           {
+             child_allocation.x = x;
+             x += childspace;
+           }
+
+         if (gtk_widget_get_direction (widget) == GTK_TEXT_DIR_RTL)
+           child_allocation.x = (allocation->x + allocation->width) - 
(child_allocation.x + child_width - allocation->x);
+
+         gtk_widget_size_allocate (child->widget, &child_allocation);
+       }
+    }
+}

Index: src/ui/gui/psppire-hbuttonbox.h
===================================================================
RCS file: src/ui/gui/psppire-hbuttonbox.h
diff -N src/ui/gui/psppire-hbuttonbox.h
--- /dev/null   1 Jan 1970 00:00:00 -0000
+++ src/ui/gui/psppire-hbuttonbox.h     4 Apr 2007 11:02:31 -0000       1.1
@@ -0,0 +1,57 @@
+/*
+    PSPPIRE --- A Graphical User Interface for PSPP
+    Copyright (C) 2007  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 2 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, write to the Free Software
+    Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
+    02110-1301, USA. */
+
+
+#ifndef __PSPPIRE_HBBOX_H__
+#define __PSPPIRE_HBBOX_H__
+
+
+#include <glib.h>
+#include <glib-object.h>
+#include "psppire-buttonbox.h"
+
+G_BEGIN_DECLS
+
+#define PSPPIRE_HBUTTON_BOX_TYPE            (psppire_hbutton_box_get_type ())
+#define PSPPIRE_HBUTTON_BOX(obj)            (G_TYPE_CHECK_INSTANCE_CAST 
((obj), PSPPIRE_HBUTTON_BOX_TYPE, PsppireHButtonBox))
+#define PSPPIRE_HBUTTON_BOX_CLASS(klass)    (G_TYPE_CHECK_CLASS_CAST ((klass), 
PSPPIRE_HBUTTON_BOX_TYPE, PsppireHButtonBoxClass))
+#define PSPPIRE_IS_HBUTTON_BOX(obj)         (G_TYPE_CHECK_INSTANCE_TYPE 
((obj), PSPPIRE_HBUTTON_BOX_TYPE))
+#define PSPPIRE_IS_HBUTTON_BOX_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), 
PSPPIRE_HBUTTON_BOX_TYPE))
+
+
+typedef struct _PsppireHButtonBox       PsppireHButtonBox;
+typedef struct _PsppireHButtonBoxClass  PsppireHButtonBoxClass;
+
+struct _PsppireHButtonBox
+{
+  PsppireButtonBox parent;
+};
+
+struct _PsppireHButtonBoxClass
+{
+  PsppireButtonBoxClass parent_class;
+};
+
+GType          psppire_hbutton_box_get_type        (void);
+GtkWidget*     psppire_hbutton_box_new             (void);
+
+G_END_DECLS
+
+#endif /* __PSPPIRE_HBBOX_H__ */
+

Index: src/ui/gui/psppire-vbuttonbox.c
===================================================================
RCS file: src/ui/gui/psppire-vbuttonbox.c
diff -N src/ui/gui/psppire-vbuttonbox.c
--- /dev/null   1 Jan 1970 00:00:00 -0000
+++ src/ui/gui/psppire-vbuttonbox.c     4 Apr 2007 11:02:31 -0000       1.1
@@ -0,0 +1,272 @@
+/*
+    PSPPIRE --- A Graphical User Interface for PSPP
+    Copyright (C) 2007  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 2 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, write to the Free Software
+    Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
+    02110-1301, USA. */
+
+
+#include <config.h>
+
+#include <glib.h>
+#include <gtk/gtk.h>
+#include <gtk/gtksignal.h>
+#include "psppire-vbuttonbox.h"
+#include "psppire-dialog.h"
+
+#include <gtk/gtkbbox.h>
+
+#include <gettext.h>
+
+#define _(msgid) gettext (msgid)
+#define N_(msgid) msgid
+
+
+static void psppire_vbuttonbox_class_init          (PsppireVButtonBoxClass *);
+static void psppire_vbuttonbox_init                (PsppireVButtonBox      *);
+
+static void gtk_vbutton_box_size_request  (GtkWidget      *widget,
+                                          GtkRequisition *requisition);
+static void gtk_vbutton_box_size_allocate (GtkWidget      *widget,
+                                          GtkAllocation  *allocation);
+
+
+static GtkButtonBoxStyle default_layout_style = GTK_BUTTONBOX_EDGE;
+
+GType
+psppire_vbutton_box_get_type (void)
+{
+  static GType vbuttonbox_type = 0;
+
+  if (!vbuttonbox_type)
+    {
+      static const GTypeInfo vbuttonbox_info =
+      {
+       sizeof (PsppireVButtonBoxClass),
+       NULL, /* base_init */
+        NULL, /* base_finalize */
+       (GClassInitFunc) psppire_vbuttonbox_class_init,
+        NULL, /* class_finalize */
+       NULL, /* class_data */
+        sizeof (PsppireVButtonBox),
+       0,
+       (GInstanceInitFunc) psppire_vbuttonbox_init,
+      };
+
+      vbuttonbox_type = g_type_register_static (PSPPIRE_BUTTONBOX_TYPE,
+                                           "PsppireVButtonBox", 
&vbuttonbox_info, 0);
+    }
+
+  return vbuttonbox_type;
+}
+
+static void
+psppire_vbuttonbox_class_init (PsppireVButtonBoxClass *class)
+{
+  GtkWidgetClass *widget_class;
+
+  widget_class = (GtkWidgetClass*) class;
+
+  widget_class->size_request = gtk_vbutton_box_size_request;
+  widget_class->size_allocate = gtk_vbutton_box_size_allocate;
+}
+
+
+static void
+psppire_vbuttonbox_init (PsppireVButtonBox *vbuttonbox)
+{
+}
+
+
+GtkWidget*
+psppire_vbuttonbox_new (void)
+{
+  PsppireVButtonBox *vbuttonbox ;
+
+  vbuttonbox = g_object_new (psppire_vbutton_box_get_type (), NULL);
+
+  return GTK_WIDGET (vbuttonbox) ;
+}
+
+
+
+/* The following two functions are lifted verbatim from
+   the Gtk2.10.6 library */
+
+static void
+gtk_vbutton_box_size_request (GtkWidget      *widget,
+                             GtkRequisition *requisition)
+{
+  GtkBox *box;
+  GtkButtonBox *bbox;
+  gint nvis_children;
+  gint child_width;
+  gint child_height;
+  gint spacing;
+  GtkButtonBoxStyle layout;
+
+  box = GTK_BOX (widget);
+  bbox = GTK_BUTTON_BOX (widget);
+
+  spacing = box->spacing;
+  layout = bbox->layout_style != GTK_BUTTONBOX_DEFAULT_STYLE
+         ? bbox->layout_style : default_layout_style;
+
+  _psppire_button_box_child_requisition (widget,
+                                        &nvis_children,
+                                        NULL,
+                                        &child_width,
+                                        &child_height);
+
+  if (nvis_children == 0)
+    {
+      requisition->width = 0;
+      requisition->height = 0;
+    }
+  else
+    {
+      switch (layout)
+      {
+      case GTK_BUTTONBOX_SPREAD:
+        requisition->height =
+               nvis_children*child_height + ((nvis_children+1)*spacing);
+       break;
+      case GTK_BUTTONBOX_EDGE:
+      case GTK_BUTTONBOX_START:
+      case GTK_BUTTONBOX_END:
+        requisition->height =
+               nvis_children*child_height + ((nvis_children-1)*spacing);
+       break;
+      default:
+           g_assert_not_reached();
+           break;
+      }
+      requisition->width = child_width;
+    }
+
+  requisition->width += GTK_CONTAINER (box)->border_width * 2;
+  requisition->height += GTK_CONTAINER (box)->border_width * 2;
+}
+
+
+
+static void
+gtk_vbutton_box_size_allocate (GtkWidget     *widget,
+                              GtkAllocation *allocation)
+{
+  GtkBox *base_box;
+  GtkButtonBox *box;
+  GtkBoxChild *child;
+  GList *children;
+  GtkAllocation child_allocation;
+  gint nvis_children;
+  gint n_secondaries;
+  gint child_width;
+  gint child_height;
+  gint x = 0;
+  gint y = 0;
+  gint secondary_y = 0;
+  gint height;
+  gint childspace;
+  gint childspacing = 0;
+  GtkButtonBoxStyle layout;
+  gint spacing;
+
+  base_box = GTK_BOX (widget);
+  box = GTK_BUTTON_BOX (widget);
+  spacing = base_box->spacing;
+  layout = box->layout_style != GTK_BUTTONBOX_DEFAULT_STYLE
+         ? box->layout_style : default_layout_style;
+  _psppire_button_box_child_requisition (widget,
+                                     &nvis_children,
+                                    &n_secondaries,
+                                     &child_width,
+                                     &child_height);
+  widget->allocation = *allocation;
+  height = allocation->height - GTK_CONTAINER (box)->border_width*2;
+  switch (layout)
+  {
+  case GTK_BUTTONBOX_SPREAD:
+    childspacing = (height - (nvis_children * child_height)) / (nvis_children 
+ 1);
+    y = allocation->y + GTK_CONTAINER (box)->border_width + childspacing;
+    secondary_y = y + ((nvis_children - n_secondaries) * (child_height + 
childspacing));
+    break;
+  case GTK_BUTTONBOX_EDGE:
+    if (nvis_children >= 2)
+      {
+        childspacing = (height - (nvis_children*child_height)) / 
(nvis_children-1);
+       y = allocation->y + GTK_CONTAINER (box)->border_width;
+       secondary_y = y + ((nvis_children - n_secondaries) * (child_height + 
childspacing));
+      }
+    else
+      {
+       /* one or zero children, just center */
+       childspacing = height;
+       y = secondary_y = allocation->y + (allocation->height - child_height) / 
2;
+      }
+    break;
+  case GTK_BUTTONBOX_START:
+    childspacing = spacing;
+    y = allocation->y + GTK_CONTAINER (box)->border_width;
+    secondary_y = allocation->y + allocation->height
+      - child_height * n_secondaries
+      - spacing * (n_secondaries - 1)
+      - GTK_CONTAINER (box)->border_width;
+    break;
+  case GTK_BUTTONBOX_END:
+    childspacing = spacing;
+    y = allocation->y + allocation->height
+      - child_height * (nvis_children - n_secondaries)
+      - spacing * (nvis_children - n_secondaries - 1)
+      - GTK_CONTAINER (box)->border_width;
+    secondary_y = allocation->y + GTK_CONTAINER (box)->border_width;
+    break;
+  default:
+    g_assert_not_reached();
+    break;
+  }
+
+  x = allocation->x + (allocation->width - child_width) / 2;
+  childspace = child_height + childspacing;
+
+  children = GTK_BOX (box)->children;
+
+  while (children)
+    {
+      child = children->data;
+      children = children->next;
+
+      if (GTK_WIDGET_VISIBLE (child->widget))
+       {
+         child_allocation.width = child_width;
+         child_allocation.height = child_height;
+         child_allocation.x = x;
+
+         if (child->is_secondary)
+           {
+             child_allocation.y = secondary_y;
+             secondary_y += childspace;
+           }
+         else
+           {
+             child_allocation.y = y;
+             y += childspace;
+           }
+
+         gtk_widget_size_allocate (child->widget, &child_allocation);
+       }
+    }
+}
+

Index: src/ui/gui/psppire-vbuttonbox.h
===================================================================
RCS file: src/ui/gui/psppire-vbuttonbox.h
diff -N src/ui/gui/psppire-vbuttonbox.h
--- /dev/null   1 Jan 1970 00:00:00 -0000
+++ src/ui/gui/psppire-vbuttonbox.h     4 Apr 2007 11:02:31 -0000       1.1
@@ -0,0 +1,57 @@
+/*
+    PSPPIRE --- A Graphical User Interface for PSPP
+    Copyright (C) 2007  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 2 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, write to the Free Software
+    Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
+    02110-1301, USA. */
+
+
+#ifndef __PSPPIRE_VBBOX_H__
+#define __PSPPIRE_VBBOX_H__
+
+
+#include <glib.h>
+#include <glib-object.h>
+#include "psppire-buttonbox.h"
+
+G_BEGIN_DECLS
+
+#define PSPPIRE_VBUTTON_BOX_TYPE            (psppire_vbutton_box_get_type ())
+#define PSPPIRE_VBUTTON_BOX(obj)            (G_TYPE_CHECK_INSTANCE_CAST 
((obj), PSPPIRE_VBUTTON_BOX_TYPE, PsppireVButtonBox))
+#define PSPPIRE_VBUTTON_BOX_CLASS(klass)    (G_TYPE_CHECK_CLASS_CAST ((klass), 
PSPPIRE_VBUTTON_BOX_TYPE, PsppireVButtonBoxClass))
+#define PSPPIRE_IS_VBUTTON_BOX(obj)         (G_TYPE_CHECK_INSTANCE_TYPE 
((obj), PSPPIRE_VBUTTON_BOX_TYPE))
+#define PSPPIRE_IS_VBUTTON_BOX_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), 
PSPPIRE_VBUTTON_BOX_TYPE))
+
+
+typedef struct _PsppireVButtonBox       PsppireVButtonBox;
+typedef struct _PsppireVButtonBoxClass  PsppireVButtonBoxClass;
+
+struct _PsppireVButtonBox
+{
+  PsppireButtonBox parent;
+};
+
+struct _PsppireVButtonBoxClass
+{
+  PsppireButtonBoxClass parent_class;
+};
+
+GType          psppire_vbutton_box_get_type        (void);
+GtkWidget*     psppire_vbutton_box_new             (void);
+
+G_END_DECLS
+
+#endif /* __PSPPIRE_VBBOX_H__ */
+

Index: glade/icons/16x16/psppire-buttonbox.png
===================================================================
RCS file: glade/icons/16x16/psppire-buttonbox.png
diff -N glade/icons/16x16/psppire-buttonbox.png
Binary files /tmp/cvs34Qlbp and /dev/null differ

Index: glade/icons/22x22/psppire-buttonbox.png
===================================================================
RCS file: glade/icons/22x22/psppire-buttonbox.png
diff -N glade/icons/22x22/psppire-buttonbox.png
Binary files /tmp/cvsI7enYr and /dev/null differ




reply via email to

[Prev in Thread] Current Thread [Next in Thread]