AbiWord SDK

From AbiWiki

Revision as of 22:58, 7 November 2008 by MartinSevior (Talk | contribs)
Jump to: navigation, search

AbiWord can be compiled to create a stand alone library, headers and package configuration file. These are built if you place the following into the AbiWord ./configure script.

 ./configure --prefix=/Path/To/Install --enable-libabiword

Note if you need to load plugins for your widget build libabiword like this:

 ./configure --prefix=/Path/To/Install --enable-dynamic

This will create the following files

  • /Path/To/Install/bin/abiword-2.7
  • /Path/To/Install/include/abiword-2.7/libabiword.h
  • /Path/To/Install/lib/pkgconfig/abiword-2.7.pc
  • /Path/To/Install/lib/libabiword-2.7.so

The most easily accessible way to use this library is to use the GtkWidget, AbiWidget.

In addition there are a large variety of Gtk signals emitted by the widget that reflect the current document and the location of the insertion caret within the document. You can hook up callback's to these signals to implement useful features (like buttons that reflect the current state of the document at the caret).

Simple Example program

The following example assumes that you set your PKG_CONFIG_PATH environment variable to discover abiword-2.7.pc. The code below also shows some of the signals emitted by the widget as the user navigates through the document. You can use these signals to determine the state of the document at the current insertion point.

A complete listing of all the methods and signals currently implemented will be made eventually. In the meantime look at the abiwidget.h header file available here.

The Makefile

test-widget: test-widget.c
		  gcc -o test-widget `pkg-config --cflags --libs abiword-2.7` test-widget.c

clean:
		  rm -f test-widget *~

The Example code, test-widget.c

#include <stdio.h>
#include <stdlib.h>
#include <libabiword.h>
#include <abiwidget.h>

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);
}

int main(int argc, char ** argv)
{
    GtkWidget * window;
    GtkWidget * abi;

    gtk_init (&argc, &argv);

    window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
    gtk_widget_set_usize(GTK_WIDGET(window),640,480);

    /* Initialize libabiword */
    libabiword_init(argc, (const char **)argv);

    /* Construct our widget! */
    abi = abi_widget_new ();
    gtk_container_add (GTK_CONTAINER (window), abi);
    gtk_widget_show_all (window);

    g_signal_connect (G_OBJECT (abi), "bold", G_CALLBACK (boolean_signal), (void*)"bold");
    g_signal_connect (G_OBJECT (abi), "italic", G_CALLBACK (boolean_signal), (void*)"italic");
    g_signal_connect (G_OBJECT (abi), "underline", G_CALLBACK (boolean_signal), (void*)"underline");
    g_signal_connect (G_OBJECT (abi), "can-undo", G_CALLBACK (boolean_signal), (void*)"can-undo");
    g_signal_connect (G_OBJECT (abi), "can-redo", G_CALLBACK (boolean_signal), (void*)"can-redo");
    g_signal_connect (G_OBJECT (abi), "font-size", G_CALLBACK (double_signal), (void*)"font-size");
    g_signal_connect (G_OBJECT (abi), "font-family", G_CALLBACK (string_signal), (void*)"font-family");

    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);

    if (argv[1])
        abi_widget_load_file (ABI_WIDGET (abi), argv[1], "");

    gtk_main ();

    /* Close libabiword */
    libabiword_shutdown ();
    return 0;
}
Personal tools