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 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 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 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 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 141 static void newapp(GtkObject *object, gpointer data) 142 { 143 GtkWidget *app = newSample("Sample.txt"); 144 145 gtk_widget_show_all(app); 146 } 147 148 static void closeapp(GtkWidget *widget, gpointer data) 149 { 150 GtkWidget *app = GTK_WIDGET(data); 151 152 closeSample(app); 153 } 154 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 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 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 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 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 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 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