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