Hi,
I am trying to use libabiword in our application Bibledit, but I am
running into a problem I don't know how to solve. Most likely I am doing
something wrong, only I can't figure out exactly where the problem is.
There is a small application, code follows below, to test libabiword. I
try to save the document in the editor by calling function
gboolean abi_widget_save (AbiWidget *w, const char *fname)
But this function returns false after being called.
I can see that it actually calls UT_Error IE_Exp::writeFile(const char *
szFilename) in file ie_exp.cpp, but it fails within that function.
Here is that function:
UT_Error IE_Exp::writeFile(const char * szFilename)
{
g_print (szFilename);
g_print ("\n");
g_print ("writeFile1\n");
UT_return_val_if_fail(m_pDocument, UT_IE_COULDNOTWRITE);
g_print ("writeFile2\n");
UT_return_val_if_fail(szFilename && *szFilename, UT_IE_COULDNOTWRITE);
g_print ("writeFile3\n");
m_bCancelled = false;
g_print ("writeFile4\n");
if (!(m_fp = openFile(szFilename)))
return m_bCancelled ? UT_SAVE_CANCELLED : UT_IE_COULDNOTWRITE;
m_bOwnsFp = true;
g_print ("writeFile5\n");
UT_Error error = _writeDocument();
g_print ("writeFile6\n");
if (UT_OK == error)
_closeFile();
else
_abortFile();
// Note: we let our caller worry about resetting the dirty bit
// Note: on the document and possibly updating the filename.
return error;
}
It has been tagged with some debug messages to see where it fails. Here
is the output:
writeFile1
writeFile2
writeFile3
writeFile4
It fails after writeFile4.
Any help here is greatly appreciated.
I am attaching the source code of the testing application too, sorry for
the long message.
Thanks!
Teus.
#include <stdio.h>
#include <stdlib.h>
#include <libabiword.h>
#include <abiwidget.h>
#include <gdk/gdkkeysyms.h>
#include "be.h"
#include <exception> // Standard exception class
#include <stdexcept> // logic_error and runtime_error
#include <iostream>
#include <cstdlib>
#include <string>
#include <fstream>
#include <vector>
#include <set>
#include <sstream>
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <map>
using namespace std;
static void on_button1_activate (GtkButton *button, gpointer user_data)
{
abi_widget_invoke (ABI_WIDGET (abi), "insFootnote");
}
// The style name has another useful feature: one can see if we are in a
footnote or an endnote.
static void style_name_signal (AbiWidget * widget,
const char * value,
gpointer user_data)
{
gtk_label_set_text (GTK_LABEL (label1), value);
}
static void can_undo_signal (AbiWidget * widget,
gboolean value,
gpointer user_data)
{
gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (togglebutton1), value);
}
static void can_redo_signal (AbiWidget * widget,
gboolean value,
gpointer user_data)
{
gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (togglebutton2), value);
}
static void boolean_signal (AbiWidget * widget,
gboolean value,
gpointer user_data)
{
g_print ("Boolean signal '%s': %d\n", (char *)user_data, value);
}
/*
static void string_signal (AbiWidget * widget,
const char * value,
gpointer user_data)
{
g_print ("String signal '%s': %s\n", (char *)user_data, value);
}
*/
static void double_signal (AbiWidget * widget,
double value,
gpointer user_data)
{
g_print ("Double signal '%s': %f\n", (char *)user_data, value);
}
static gboolean on_key_press_event (GtkWidget * widget, GdkEventKey *
event, gpointer user_data)
{
// Handle control pressed.
guint modifiers = gtk_accelerator_get_default_mod_mask ();
if ((event->state & modifiers) == GDK_CONTROL_MASK) {
switch (event->keyval) {
case GDK_O: // Disable Ctrl-O: Open file
case GDK_o:
case GDK_S: // Disable Ctrl-S: Save file
case GDK_s:
return TRUE;
break;
default:
break;
}
}
return FALSE;
}
static void on_buttonsave_clicked (GtkButton *button, gpointer user_data)
{
g_print ("Saving file\n");
cout << abi_widget_save (ABI_WIDGET (abi),
"/home/teus/documents/dev/bibledit-abi/test.abw") << endl;
//cout << abi_widget_save_with_type (ABI_WIDGET (abi),
"/home/teus/documents/dev/bibledit-abi/test.abw", ".abw" ) << endl;
}
int main(int argc, char ** argv)
{
gtk_init (&argc, &argv);
window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
gtk_widget_set_usize(GTK_WIDGET(window), 640, 640);
vbox1 = gtk_vbox_new (FALSE, 0);
gtk_widget_show (vbox1);
gtk_container_add (GTK_CONTAINER (window), vbox1);
hbox2 = gtk_hbox_new (FALSE, 0);
gtk_widget_show (hbox2);
gtk_box_pack_start (GTK_BOX (vbox1), hbox2, FALSE, FALSE, 0);
button1 = gtk_button_new_with_mnemonic ("test");
gtk_widget_show (button1);
gtk_box_pack_start (GTK_BOX (hbox2), button1, FALSE, FALSE, 0);
buttonsave = gtk_button_new_with_mnemonic ("save");
gtk_widget_show (buttonsave);
gtk_box_pack_start (GTK_BOX (hbox2), buttonsave, FALSE, FALSE, 0);
label1 = gtk_label_new ("");
gtk_widget_show (label1);
gtk_box_pack_start (GTK_BOX (vbox1), label1, FALSE, FALSE, 0);
hbox1 = gtk_hbox_new (FALSE, 0);
gtk_widget_show (hbox1);
gtk_box_pack_start (GTK_BOX (vbox1), hbox1, FALSE, FALSE, 0);
togglebutton1 = gtk_toggle_button_new_with_mnemonic ("can undo");
gtk_widget_show (togglebutton1);
gtk_box_pack_start (GTK_BOX (hbox1), togglebutton1, FALSE, FALSE, 0);
togglebutton2 = gtk_toggle_button_new_with_mnemonic ("can redo");
gtk_widget_show (togglebutton2);
gtk_box_pack_start (GTK_BOX (hbox1), togglebutton2, FALSE, FALSE, 0);
/* Initialize libabiword */
libabiword_init(argc, (const char **)argv);
abi = abi_widget_new ();
/* The key press event must be connected at this stage, else the
widget absorbs every event */
g_signal_connect (G_OBJECT (abi), "key_press_event", G_CALLBACK
(on_key_press_event), NULL);
gtk_box_pack_start (GTK_BOX (vbox1), abi, TRUE, TRUE, 0);
gtk_widget_show_all (window);
abi_widget_view_normal_layout (ABI_WIDGET (abi));
g_signal_connect ((gpointer) button1, "clicked", G_CALLBACK
(on_button1_activate), NULL);
g_signal_connect ((gpointer) buttonsave, "clicked", G_CALLBACK
(on_buttonsave_clicked), NULL);
g_signal_connect (G_OBJECT (abi), "bold", G_CALLBACK (boolean_signal),
NULL);
g_signal_connect (G_OBJECT (abi), "italic", G_CALLBACK
(boolean_signal), NULL);
g_signal_connect (G_OBJECT (abi), "underline", G_CALLBACK
(boolean_signal), NULL);
g_signal_connect (G_OBJECT (abi), "can-undo", G_CALLBACK
(can_undo_signal), NULL);
g_signal_connect (G_OBJECT (abi), "can-redo", G_CALLBACK
(can_redo_signal), NULL);
g_signal_connect (G_OBJECT (abi), "font-size", G_CALLBACK
(double_signal), NULL);
//g_signal_connect (G_OBJECT (abi), "font-family", G_CALLBACK
(string_signal), "font-family");
g_signal_connect (G_OBJECT (abi), "is-dirty", G_CALLBACK
(boolean_signal), NULL);
g_signal_connect (G_OBJECT (abi), "style-name", G_CALLBACK
(style_name_signal), NULL);
g_signal_connect (G_OBJECT (window), "destroy", G_CALLBACK
(gtk_main_quit), NULL);
g_signal_connect (G_OBJECT (window), "delete_event", G_CALLBACK
(gtk_main_quit), NULL);
abi_widget_load_file (ABI_WIDGET (abi),
"/home/teus/documents/dev/bibledit-abi/test.abw");
gtk_widget_grab_focus (abi);
gtk_main ();
/* Close libabiword */
libabiword_shutdown ();
return 0;
}
Received on Tue Mar 13 06:05:52 2007
This archive was generated by hypermail 2.1.8 : Tue Mar 13 2007 - 06:05:53 CET