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