1ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 2ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru/* 3ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru ****************************************************************************** * 4ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * 5ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * Copyright (C) 1999-2007, International Business Machines 6ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * Corporation and others. All Rights Reserved. 7ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * 8ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru ****************************************************************************** * 9ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * file name: gnomelayout.cpp 10ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * 11ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * created on: 09/04/2001 12ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * created by: Eric R. Mader 13ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru */ 14ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 15ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#include <gnome.h> 16ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#include <ft2build.h> 17ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#include FT_FREETYPE_H 18ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 19ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#include "unicode/ustring.h" 20ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#include "unicode/uscript.h" 21ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 22ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#include "GnomeFontInstance.h" 23ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 24ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#include "paragraph.h" 25ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 26ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#include "GnomeGUISupport.h" 27ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#include "GnomeFontMap.h" 28ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#include "UnicodeReader.h" 29ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#include "ScriptCompositeFontInstance.h" 30ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 31ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#define ARRAY_LENGTH(array) (sizeof array / sizeof array[0]) 32ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 33ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Querustruct Context 34ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru{ 35ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru long width; 36ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru long height; 37ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru Paragraph *paragraph; 38ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru}; 39ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 40ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Querustatic FT_Library engine; 41ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Querustatic GnomeGUISupport *guiSupport; 42ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Querustatic GnomeFontMap *fontMap; 43ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Querustatic ScriptCompositeFontInstance *font; 44ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 45ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Querustatic GSList *appList = NULL; 46ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 47ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste QueruGtkWidget *newSample(const gchar *fileName); 48ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queruvoid closeSample(GtkWidget *sample); 49ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 50ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queruvoid showabout(GtkWidget */*widget*/, gpointer /*data*/) 51ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru{ 52ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru GtkWidget *aboutBox; 53ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru const gchar *documentedBy[] = {NULL}; 54ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru const gchar *writtenBy[] = { 55ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru "Eric Mader", 56ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru NULL 57ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru }; 58ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 59ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru aboutBox = gnome_about_new("Gnome Layout Sample", 60ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru "0.1", 61ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru "Copyright (C) 1998-2006 By International Business Machines Corporation and others. All Rights Reserved.", 62ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru "A simple demo of the ICU LayoutEngine.", 63ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru writtenBy, 64ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru documentedBy, 65ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru "", 66ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru NULL); 67ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 68ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru gtk_widget_show(aboutBox); 69ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru} 70ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 71ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queruvoid notimpl(GtkObject */*object*/, gpointer /*data*/) 72ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru{ 73ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru gnome_ok_dialog("Not implemented..."); 74ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru} 75ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 76ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Querugchar *prettyTitle(const gchar *path) 77ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru{ 78ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru const gchar *name = g_basename(path); 79ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru gchar *title = g_strconcat("Gnome Layout Sample - ", name, NULL); 80ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 81ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru return title; 82ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru} 83ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 84ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queruvoid openOK(GtkObject */*object*/, gpointer data) 85ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru{ 86ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru GtkFileSelection *fileselection = GTK_FILE_SELECTION(data); 87ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru GtkWidget *app = GTK_WIDGET(gtk_object_get_data(GTK_OBJECT(fileselection), "app")); 88ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru Context *context = (Context *) gtk_object_get_data(GTK_OBJECT(app), "context"); 89ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru gchar *fileName = g_strdup(gtk_file_selection_get_filename(fileselection)); 90ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru Paragraph *newPara; 91ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 92ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru gtk_widget_destroy(GTK_WIDGET(fileselection)); 93ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 94ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru newPara = Paragraph::paragraphFactory(fileName, font, guiSupport); 95ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 96ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru if (newPara != NULL) { 97ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru gchar *title = prettyTitle(fileName); 98ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru GtkWidget *area = GTK_WIDGET(gtk_object_get_data(GTK_OBJECT(app), "area")); 99ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 100ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru if (context->paragraph != NULL) { 101ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru delete context->paragraph; 102ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru } 103ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 104ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru context->paragraph = newPara; 105ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru gtk_window_set_title(GTK_WINDOW(app), title); 106ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 107ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru gtk_widget_hide(area); 108ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru context->paragraph->breakLines(context->width, context->height); 109ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru gtk_widget_show_all(area); 110ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 111ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru g_free(title); 112ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru } 113ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 114ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru g_free(fileName); 115ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru} 116ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 117ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queruvoid openfile(GtkObject */*object*/, gpointer data) 118ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru{ 119ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru GtkWidget *app = GTK_WIDGET(data); 120ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru GtkWidget *fileselection; 121ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru GtkWidget *okButton; 122ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru GtkWidget *cancelButton; 123ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 124ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru fileselection = 125ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru gtk_file_selection_new("Open File"); 126ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 127ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru gtk_object_set_data(GTK_OBJECT(fileselection), "app", app); 128ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 129ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru okButton = 130ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru GTK_FILE_SELECTION(fileselection)->ok_button; 131ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 132ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru cancelButton = 133ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru GTK_FILE_SELECTION(fileselection)->cancel_button; 134ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 135ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru gtk_signal_connect(GTK_OBJECT(fileselection), "destroy", 136ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru GTK_SIGNAL_FUNC(gtk_main_quit), NULL); 137ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 138ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru gtk_signal_connect(GTK_OBJECT(okButton), "clicked", 139ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru GTK_SIGNAL_FUNC(openOK), fileselection); 140ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 141ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru gtk_signal_connect_object(GTK_OBJECT(cancelButton), "clicked", 142ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru GTK_SIGNAL_FUNC(gtk_widget_destroy), GTK_OBJECT(fileselection)); 143ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 144ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru gtk_window_set_modal(GTK_WINDOW(fileselection), TRUE); 145ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru gtk_widget_show(fileselection); 146ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru gtk_main(); 147ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru} 148ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 149ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queruvoid newapp(GtkObject */*object*/, gpointer /*data*/) 150ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru{ 151ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru GtkWidget *app = newSample("Sample.txt"); 152ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 153ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru gtk_widget_show_all(app); 154ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru} 155ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 156ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queruvoid closeapp(GtkWidget */*widget*/, gpointer data) 157ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru{ 158ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru GtkWidget *app = GTK_WIDGET(data); 159ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 160ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru closeSample(app); 161ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru} 162ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 163ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queruvoid shutdown(GtkObject */*object*/, gpointer /*data*/) 164ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru{ 165ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru gtk_main_quit(); 166ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru} 167ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 168ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste QueruGnomeUIInfo fileMenu[] = 169ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru{ 170ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru GNOMEUIINFO_MENU_NEW_ITEM((gchar *) "_New Sample", 171ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru (gchar *) "Create a new Gnome Layout Sample", 172ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru newapp, NULL), 173ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 174ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru GNOMEUIINFO_MENU_OPEN_ITEM(openfile, NULL), 175ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru GNOMEUIINFO_SEPARATOR, 176ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru GNOMEUIINFO_MENU_CLOSE_ITEM(closeapp, NULL), 177ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru GNOMEUIINFO_MENU_EXIT_ITEM(shutdown, NULL), 178ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru GNOMEUIINFO_END 179ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru}; 180ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 181ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste QueruGnomeUIInfo helpMenu[] = 182ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru{ 183ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru // GNOMEUIINFO_HELP("gnomelayout"), 184ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru GNOMEUIINFO_MENU_ABOUT_ITEM(showabout, NULL), 185ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru GNOMEUIINFO_END 186ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru}; 187ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 188ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste QueruGnomeUIInfo mainMenu[] = 189ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru{ 190ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru GNOMEUIINFO_SUBTREE(N_((gchar *) "File"), fileMenu), 191ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru GNOMEUIINFO_SUBTREE(N_((gchar *) "Help"), helpMenu), 192ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru GNOMEUIINFO_END 193ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru}; 194ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 195ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Querugint eventDelete(GtkWidget *widget, GdkEvent */*event*/, gpointer /*data*/) 196ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru{ 197ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru closeSample(widget); 198ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 199ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru // indicate that closeapp already destroyed the window 200ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru return TRUE; 201ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru} 202ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 203ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Querugint eventConfigure(GtkWidget */*widget*/, GdkEventConfigure *event, Context *context) 204ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru{ 205ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru if (context->paragraph != NULL) { 206ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru context->width = event->width; 207ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru context->height = event->height; 208ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 209ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru if (context->width > 0 && context->height > 0) { 210ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru context->paragraph->breakLines(context->width, context->height); 211ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru } 212ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru } 213ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 214ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru return TRUE; 215ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru} 216ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 217ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Querugint eventExpose(GtkWidget *widget, GdkEvent */*event*/, Context *context) 218ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru{ 219ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru if (context->paragraph != NULL) { 220ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru gint maxLines = context->paragraph->getLineCount() - 1; 221ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru gint firstLine = 0, lastLine = context->height / context->paragraph->getLineHeight(); 222ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru GnomeSurface surface(widget); 223ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 224ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru context->paragraph->draw(&surface, firstLine, (maxLines < lastLine)? maxLines : lastLine); 225ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru } 226ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 227ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru return TRUE; 228ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru} 229ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 230ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste QueruGtkWidget *newSample(const gchar *fileName) 231ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru{ 232ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru Context *context = new Context(); 233ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 234ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru context->width = 600; 235ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru context->height = 400; 236ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru context->paragraph = Paragraph::paragraphFactory(fileName, font, guiSupport); 237ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 238ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru gchar *title = prettyTitle(fileName); 239ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru GtkWidget *app = gnome_app_new("gnomeLayout", title); 240ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 241ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru gtk_object_set_data(GTK_OBJECT(app), "context", context); 242ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 243ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru gtk_window_set_default_size(GTK_WINDOW(app), 600 - 24, 400); 244ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 245ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru gnome_app_create_menus_with_data(GNOME_APP(app), mainMenu, app); 246ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 247ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru gtk_signal_connect(GTK_OBJECT(app), "delete_event", 248ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru GTK_SIGNAL_FUNC(eventDelete), NULL); 249ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 250ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru GtkWidget *area = gtk_drawing_area_new(); 251ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru gtk_object_set_data(GTK_OBJECT(app), "area", area); 252ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 253ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru GtkStyle *style = gtk_style_copy(gtk_widget_get_style(area)); 254ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 255ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru for (int i = 0; i < 5; i += 1) { 256ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru style->fg[i] = style->white; 257ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru } 258ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 259ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru gtk_widget_set_style(area, style); 260ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 261ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru gnome_app_set_contents(GNOME_APP(app), area); 262ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 263ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru gtk_signal_connect(GTK_OBJECT(area), 264ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru "expose_event", 265ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru GTK_SIGNAL_FUNC(eventExpose), 266ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru context); 267ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 268ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru gtk_signal_connect(GTK_OBJECT(area), 269ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru "configure_event", 270ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru GTK_SIGNAL_FUNC(eventConfigure), 271ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru context); 272ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 273ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru appList = g_slist_prepend(appList, app); 274ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 275ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru g_free(title); 276ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 277ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru return app; 278ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru} 279ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 280ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queruvoid closeSample(GtkWidget *app) 281ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru{ 282ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru Context *context = (Context *) gtk_object_get_data(GTK_OBJECT(app), "context"); 283ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 284ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru if (context->paragraph != NULL) { 285ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru delete context->paragraph; 286ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru } 287ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 288ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru delete context; 289ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 290ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru appList = g_slist_remove(appList, app); 291ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 292ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru gtk_widget_destroy(app); 293ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 294ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru if (appList == NULL) { 295ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru gtk_main_quit(); 296ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru } 297ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru} 298ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 299ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queruint main (int argc, char *argv[]) 300ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru{ 301ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru LEErrorCode fontStatus = LE_NO_ERROR; 302ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru poptContext ptctx; 303ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru GtkWidget *app; 304ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 305ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru FT_Init_FreeType(&engine); 306ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 307ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru gnome_init_with_popt_table("gnomelayout", "0.1", argc, argv, NULL, 0, &ptctx); 308ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 309ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru guiSupport = new GnomeGUISupport(); 310ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru fontMap = new GnomeFontMap(engine, "FontMap.Gnome", 24, guiSupport, fontStatus); 311ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru font = new ScriptCompositeFontInstance(fontMap); 312ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 313ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru if (LE_FAILURE(fontStatus)) { 314ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru FT_Done_FreeType(engine); 315ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru return 1; 316ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru } 317ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 318ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru const char *defaultArgs[] = {"Sample.txt", NULL}; 319ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru const char **args = poptGetArgs(ptctx); 320ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 321ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru if (args == NULL) { 322ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru args = defaultArgs; 323ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru } 324ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 325ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru for (int i = 0; args[i] != NULL; i += 1) { 326ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru app = newSample(args[i]); 327ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 328ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru gtk_widget_show_all(app); 329ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru } 330ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 331ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru poptFreeContext(ptctx); 332ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 333ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru gtk_main(); 334ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 335ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru delete font; 336ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru delete guiSupport; 337ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 338ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru FT_Done_FreeType(engine); 339ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 340ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru exit(0); 341ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru} 342