<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2//EN"> <HTML> <HEAD> <META HTTP-EQUIV="CONTENT-TYPE" CONTENT="text/html; charset=iso-8859-1"> <TITLE>Untitled Document</TITLE> <META NAME="CREATED" CONTENT="20020809;16263500"> <META NAME="CHANGED" CONTENT="20020809;18435400"> </HEAD> <BODY LANG="en-US"> <TABLE WIDTH=100% BORDER=1 CELLPADDING=2 CELLSPACING=2 STYLE="page-break-before: always"> <TR> <TD BGCOLOR="#000000"> <P ALIGN=CENTER><FONT COLOR="#ffffff"><FONT SIZE=7>GTK-SHEET TUTORIAL </FONT></FONT> </P> </TD> </TR> <TR> <TD HEIGHT=61 BGCOLOR="#9aded3"> <P ALIGN=LEFT><font size="4" face="Arial, Helvetica, sans-serif">GTK-EXTRA Reference Manual Author: <STRONG>Victor Mierla aka Kornos <kornos@softhome.net> .</STRONG><BR> Copyright : See the COPYRIGHT file<BR> GTK-EXTRA library author: Adrian Feiguin <adrian@ifir.edu.ar></font></P> </TD> </TR> </TABLE> <P> </P> <PRE><FONT FACE="Arial, Helvetica, sans-serif"><FONT SIZE=6><U>INDEX</U></FONT></FONT> <FONT SIZE=4 face="Arial, Helvetica, sans-serif"> 1. <A HREF="#Introduction">Introduction</A></FONT> <FONT SIZE=4 face="Arial, Helvetica, sans-serif"> 2. <A HREF="#create">Creating a sheet</A></FONT> <FONT SIZE=4 face="Arial, Helvetica, sans-serif"> 3. <A HREF="#signals">Sheet signals</A></FONT> <FONT SIZE=4 face="Arial, Helvetica, sans-serif"> 4. <a href="#modify_content">Modifying cell contents</a><SPAN STYLE="text-decoration: none"><br> </SPAN></FONT><FONT FACE="Arial, Helvetica, sans-serif"><FONT SIZE=4>4.1 - <a href="#_4.1">functions that modify a cell</a></FONT></FONT> <FONT FACE="Arial, Helvetica, sans-serif"><FONT SIZE=4> 4.2 - <a href="#_4.2">functions that modify a range of cells</a></FONT></FONT> <FONT FACE="Arial, Helvetica, sans-serif"><FONT SIZE=4> 4.3 - <a href="#_4.3">functions that modify all cells from the sheet</a></FONT></FONT> <FONT FACE="Arial, Helvetica, sans-serif"><FONT SIZE=4> 4.4 - <a href="#_4.4">functions that set row/column titles , sheet title , etc</a> </FONT></FONT><FONT SIZE=4 face="Arial, Helvetica, sans-serif"><SPAN STYLE="text-decoration: none"><BR> 5. <a href="#modify_state">Modifying sheet state</a><BR></SPAN> 6. <a href="#selections">Selections</a> 7. <a href="#operations">Row/column operations</a><BR> </FONT></PRE> <pre> <font size="4" face="Arial, Helvetica, sans-serif">Remark : This tutorial does not cover all functions from GtkSheet library. It it only a reference to the most important(used) functions.</font> <font size="4" face="Arial, Helvetica, sans-serif">This tutorial may contain errors or inaccuracies .Please mail me <kornos@softhome.net> in such a case.</font></pre> <P> </P> <P> </P> <P> </P> <PRE><A NAME="Introduction"></A><FONT FACE="Arial, Helvetica, sans-serif"><FONT SIZE=4>1.<U><FONT SIZE=5>Introduction</FONT></U></FONT></FONT> <br><FONT FACE="Arial, Helvetica, sans-serif"><FONT SIZE=4> <font size="3"> GtkSheet is a spreadsheet widget for Gtk (an Excel-like table)</font></FONT></FONT> <FONT size="3" FACE="Arial, Helvetica, sans-serif"> </FONT> <FONT size="3" FACE="Arial, Helvetica, sans-serif"> Internally, GtkSheet allocates memory for the sheet cells contents using an array of pointers to GtkSheetEntry widgets.</FONT> <FONT size="3" FACE="Arial, Helvetica, sans-serif"> A GtkSheetEntry widget( a cell in fact) is a GtkEntry subclass with the following differences :</FONT> <FONT size="3" FACE="Arial, Helvetica, sans-serif"> - It doesn't draw the border. </FONT> <FONT size="3" FACE="Arial, Helvetica, sans-serif"> - It is dinamically resized as the text is typed.</FONT> <FONT size="3" FACE="Arial, Helvetica, sans-serif"> - It allows right/left/center text justification (gtk_entry_size_allocate & entry_adjust_scroll)</FONT> <FONT size="3" FACE="Arial, Helvetica, sans-serif"> In a cell you may pack text , pictures or other widgets.</FONT> <FONT size="3" FACE="Arial, Helvetica, sans-serif"> Unfortunately, GtkEntry is a one text-line widget, so if you are searching for a Word-cell like behaviour(a multi -line cell) ,</FONT> <FONT size="3" FACE="Arial, Helvetica, sans-serif">you should probably consider checking other widgets(?!) or rewrite GtkSheet :-)</FONT> <FONT size="3" FACE="Arial, Helvetica, sans-serif"> The maximum number of rows/columns in a sheet is stored in a guint so in fact the maximum size of the sheet practically depends on the available memory in your system.</FONT> <font size="3"> <A NAME="create"></A><FONT size="4" FACE="Arial, Helvetica, sans-serif"><strong>2. <U>Creating a sheet</U></strong></FONT></font> <FONT size="3" FACE="Arial, Helvetica, sans-serif">The first step when you write a program using GtkSheet is to create the sheet widget and to <U>pack it into a scrolled window</U>.</FONT> <FONT size="3" FACE="Arial, Helvetica, sans-serif">If you'll pack the sheet into a normal window you'll receive some warnings about adjustment signals.</FONT> </PRE> <TABLE WIDTH=100% BORDER=0 CELLPADDING=2 CELLSPACING=2> <TR> <TD BGCOLOR="#ccffff"> <PRE>window = gtk_window_new (GTK_WINDOW_TOPLEVEL); ............................... window_box= gtk_vbox_new (FALSE,TRUE); scrolled_window=gtk_scrolled_window_new(NULL, NULL); gtk_container_add (GTK_CONTAINER (window), window_box); gtk_box_pack_start (GTK_BOX (window_box), scrolled_window, 1,1,1); sheet=gtk_sheet_new(3,11,"Edit table"); GTK_SHEET_SET_FLAGS(sheet, GTK_SHEET_AUTORESIZE); gtk_container_add(GTK_CONTAINER(scrolled_window), sheet); gtk_widget_show_all(window);</PRE> </TD> </TR> </TABLE> <PRE STYLE="margin-bottom: 0.5cm"><FONT FACE="Arial, Helvetica, sans-serif"><FONT SIZE=3>You should set the GTK_SHEET_AUTORESIZE flag so the cell would resize as you type.</FONT></FONT> <FONT size="3" FACE="Arial, Helvetica, sans-serif">GtkSheet can be created with a custom entry widget. You can use GtkEntry or a GtkEntry subclass <br>(e.g. GtkSheetEntry, GtkSpinButton) or a box or table containing a GtkEntry subclass (e.g. GtkCombo)</FONT></PRE> <TABLE WIDTH=75% BORDER=0 CELLPADDING=2 CELLSPACING=2> <TR> <TD BGCOLOR="#F5F0CD"> <PRE>gtk_sheet_new_with_custom_entry (gint nrows, gint ncols, GtkType *entry_type);</PRE></TD> </TR> </TABLE> <PRE STYLE="margin-bottom: 0.5cm"><FONT FACE="Arial, Helvetica, sans-serif"><FONT SIZE=3>if you want to construct a non-editable spreadsheet ( called "browser sheet") , just fow viewing purposes use:</FONT></FONT></PRE> <TABLE WIDTH=75% BORDER=0 CELLPADDING=2 CELLSPACING=2> <TR> <TD BGCOLOR="#F5F0CD"> <PRE>gtk_sheet_construct_browser(GtkSheet *sheet,guint rows,guint columns, const gchar *title);</PRE></TD> </TR> </TABLE> <p><font size="3" face="Arial, Helvetica, sans-serif">The lines and columns(white coloured by default) are numbered from 0 to max row/col number.<br> The gray row/col are numbered -1 .</font></p> <PRE> <font size="3" face="Arial, Helvetica, sans-serif">Screenshot :</font></PRE> <table width="100%" border="0"> <tr> <td><img src="pics/gtksheet_new_sheet.jpg" width="484" height="201"></td> </tr> </table> <PRE> <A NAME="signals"></A><FONT FACE="Arial, Helvetica, sans-serif"><FONT SIZE=4> 3. <U><strong>Sheet signals</strong></U></FONT></FONT> <FONT FACE="Arial, Helvetica, sans-serif"><FONT SIZE=3>The interaction between user and sheet is done(as in all Gtk programs) through signals.</FONT></FONT> <FONT size="3" FACE="Arial, Helvetica, sans-serif">In GtkSheet the next signals are implemented :</FONT> <FONT FACE="Arial, Helvetica, sans-serif"><FONT SIZE=4> </FONT></FONT> <FONT FACE="Arial, Helvetica, sans-serif"><FONT SIZE=4> <FONT SIZE=2>SELECT_ROW, </FONT></FONT></FONT> <FONT FACE="Arial, Helvetica, sans-serif"><FONT SIZE=2> SELECT_COLUMN, </FONT></FONT> <FONT FACE="Arial, Helvetica, sans-serif"><FONT SIZE=2> SELECT_RANGE,</FONT></FONT> <FONT FACE="Arial, Helvetica, sans-serif"><FONT SIZE=2> CLIP_RANGE,</FONT></FONT> <FONT FACE="Arial, Helvetica, sans-serif"><FONT SIZE=2> RESIZE_RANGE,</FONT></FONT> <FONT FACE="Arial, Helvetica, sans-serif"><FONT SIZE=2> MOVE_RANGE,</FONT></FONT> <FONT FACE="Arial, Helvetica, sans-serif"><FONT SIZE=2> TRAVERSE, </FONT></FONT> <FONT FACE="Arial, Helvetica, sans-serif"><FONT SIZE=2> DEACTIVATE, </FONT></FONT> <FONT FACE="Arial, Helvetica, sans-serif"><FONT SIZE=2> ACTIVATE,</FONT></FONT> <FONT FACE="Arial, Helvetica, sans-serif"><FONT SIZE=2> SET_CELL,</FONT></FONT> <FONT FACE="Arial, Helvetica, sans-serif"><FONT SIZE=2> CLEAR_CELL,</FONT></FONT> <FONT FACE="Arial, Helvetica, sans-serif"><FONT SIZE=2> CHANGED,</FONT></FONT> <FONT FACE="Arial, Helvetica, sans-serif"><FONT SIZE=2> NEW_COL_WIDTH,</FONT></FONT> <FONT FACE="Arial, Helvetica, sans-serif"><FONT SIZE=2> NEW_ROW_HEIGHT,</FONT></FONT> <FONT FACE="Arial, Helvetica, sans-serif"><FONT SIZE=2> LAST_SIGNAL</FONT></FONT> <FONT FACE="Arial, Helvetica, sans-serif"><FONT SIZE=3>If you're trying to catch these signals , you should connect them to a callback(function that treats the signal/event).</FONT></FONT> <FONT size="3" FACE="Arial, Helvetica, sans-serif">If these notions seem strange to you , perhaps it's better to read the Gtk/Gnome documentation .</FONT> <FONT size="3" FACE="Arial, Helvetica, sans-serif">The most used signals (by me at least) are : ACTIVATE,DEACTIVATE,TRAVERSE.</FONT> <FONT size="3" FACE="Arial, Helvetica, sans-serif">Callback functions for different signals have different parameters.</FONT> <FONT size="3" FACE="Arial, Helvetica, sans-serif">For a correct use you should check out the Gtk-Extra Reference Manual , the examples or Gtk-Extra source code.</FONT> <FONT size="3" FACE="Arial, Helvetica, sans-serif">Incorrect use of the callback function parameters should have an undefined result(in the worst cases)</FONT> <FONT size="3" FACE="Arial, Helvetica, sans-serif">The <U><strong>ACTIVATE</strong></U> signal should be connected if you want to do something when a cell is clicked:</FONT></PRE> <TABLE WIDTH=100% BORDER=0 CELLPADDING=2 CELLSPACING=2> <TR> <TD BGCOLOR="#ccffff"> <PRE>gtk_signal_connect(GTK_OBJECT(sheet), "activate", (GtkSignalFunc) alarm_activate, NULL); <FONT FACE="Arial, Helvetica, sans-serif"><FONT SIZE=3>The callback function should have these parameters:</FONT></FONT> gint alarm_activate(GtkWidget *sheet, gint row, gint col, gpointer data) { ................ }</PRE> </TD> </TR> </TABLE> <PRE><FONT FACE="Arial, Helvetica, sans-serif"><FONT SIZE=3>If you have different functions that require the same cell to behave in a different way , I suggest that <br>instead of writing "n" alarm_activate() </FONT></FONT><FONT size="3" FACE="Arial, Helvetica, sans-serif">callbacks , write just one callback function that looks like this:</FONT></PRE> <TABLE WIDTH=100% BORDER=0 CELLPADDING=2 CELLSPACING=2> <TR> <TD BGCOLOR="#ccffff"> <PRE>gtk_signal_connect(GTK_OBJECT(sheet), "activate", (GtkSignalFunc) alarm_activate, (gpointer)function_name); <FONT FACE="Arial, Helvetica, sans-serif"><FONT SIZE=3>When the signal is connected , pass the function name (for example) as the last parameter.</FONT></FONT> gint alarm_activate(GtkWidget *sheet, gint row, gint col, gpointer function_name) { if(strcmp(function_name,"table_new")==0){ .....do_some_stuf() } else if(strcmp(function_name,"table_edit")==0){ .....do_other_stuf() } } <FONT FACE="Arial, Helvetica, sans-serif"><FONT SIZE=3>In this way , you'll have a much cleaner code , with as few functions as possible.</FONT></FONT> <FONT size="3" FACE="Arial, Helvetica, sans-serif">It is better to have a single callback function that treats all posible behaviour cases ,<br>instead of many functions which make the code harder to read.</FONT></PRE> </TD> </TR> </TABLE> <PRE><FONT FACE="Arial, Helvetica, sans-serif"><FONT SIZE=3>A very important signal is <U><strong>TRAVERSE</strong></U>.</FONT></FONT></PRE> <TABLE WIDTH=100% BORDER=0 CELLPADDING=2 CELLSPACING=2> <TR> <TD BGCOLOR="#ccffff"> <PRE>gtk_signal_connect(GTK_OBJECT(sheet), "traverse", (GtkSignalFunc) alarm_traverse, NULL); <FONT FACE="Arial, Helvetica, sans-serif"><FONT SIZE=3>The callback function should have these parameters:</FONT></FONT> gint alarm_traverse(GtkWidget *widget, gint row, gint col, gint *new_row, gint *new_col, gpointer data) { ........... }</PRE> </TD> </TR> </TABLE> <PRE><FONT FACE="Arial, Helvetica, sans-serif"><FONT SIZE=3>The "traverse" signal is emited before "deactivate_cell" and allows to veto the movement.</FONT></FONT> <FONT size="3" FACE="Arial, Helvetica, sans-serif"> In such case, the entry will remain in the site, and the other signals will not be emited.</FONT> <FONT size="3" FACE="Arial, Helvetica, sans-serif">The traverse signal is useful when you need to know in what cell have you previously clicked or what was selected. </FONT> <FONT size="3" FACE="Arial, Helvetica, sans-serif">The explanation for the the other signals is quite straightforward so if you want more details you should check <br>GtkExtra Reference Manual or the GtkExtra source code.</FONT> <FONT size="3" FACE="Arial, Helvetica, sans-serif"><U><strong> REMARK</strong></U>: Adrian told me that a callback function should ALWAYS return TRUE or FALSE.</FONT> <FONT size="3" FACE="Arial, Helvetica, sans-serif"> Otherwise BUGZ may occur.</FONT> <A NAME="modify_cells"></A><FONT FACE="Arial, Helvetica, sans-serif"><FONT SIZE=4> <a name="modify_contents" id="modify_contents"></a><a name="modify_content"></a><strong>4. <U>Modifying cell contents</U></strong></FONT></FONT> <FONT FACE="Arial, Helvetica, sans-serif"><FONT SIZE=3>As previously stated , a cell may contain text, picture or other widgets.</FONT></FONT> <FONT SIZE=3><FONT FACE="Arial, Helvetica, sans-serif">GtkSheet functions can be categorized after the number of modified cells:</FONT></FONT> <FONT FACE="Arial, Helvetica, sans-serif"><FONT SIZE=4> <font size="3">4.1 - <a href="#_4.1">functions that modify a cell</a></font></FONT></FONT> <FONT size="3" FACE="Arial, Helvetica, sans-serif"> 4.2 - <a href="#_4.2">functions that modify a range of cells</a></FONT> <FONT size="3" FACE="Arial, Helvetica, sans-serif"> 4.3 - <a href="#_4.3">functions that modify all cells from the sheet</a></FONT> <FONT size="3" FACE="Arial, Helvetica, sans-serif"> 4.4 - <a href="#_4.4">functions that set row/column titles , sheet title , etc </a></FONT> <FONT FACE="Arial, Helvetica, sans-serif"><FONT SIZE=4><B><a name="_4.1" id="_4.1"></a>4.1 <U><font size="3">Functions that modify a cell </font></U></B></FONT></FONT><FONT FACE="Arial, Helvetica, sans-serif"><FONT SIZE=3><SPAN STYLE="text-decoration: none"> <strong>* </strong></SPAN><strong><U>A cell text is set by:</U></strong></FONT></FONT></PRE> <TABLE WIDTH=100% BORDER=0 CELLPADDING=2 CELLSPACING=2> <TR> <TD BGCOLOR="#F5F0CD"> <PRE>/* Set a cell text with justification */ void gtk_sheet_set_cell (GtkSheet *sheet, gint row, gint col, GtkJustification justification, const gchar *text); /* No justification is made */ void gtk_sheet_set_cell_text (GtkSheet *sheet, gint row, gint col, const gchar *text); </PRE> </TD> </TR> </TABLE> <PRE><FONT FACE="Arial, Helvetica, sans-serif"><FONT SIZE=3>The text string will be strdup()'ed by the gtkextra library so you may free your string after this line.</FONT></FONT> <FONT size="3" FACE="Arial, Helvetica, sans-serif">Do not free the internally allocated string !</FONT> <FONT size="3" FACE="Arial, Helvetica, sans-serif">This will be done by the library at the destruction of the sheet or when the gtk_sheet_set_cell is called again.</FONT> <FONT size="3" FACE="Arial, Helvetica, sans-serif">The text justification in the cell may be : GTK_JUSTIFY_LEFT, GTK_JUSTIFY_RIGHT, GTK_JUSTIFY_CENTER</FONT> <FONT FACE="Arial, Helvetica, sans-serif"><FONT SIZE=3><strong> *<U> A cell text may be read by :</U></strong></FONT></FONT></PRE> <TABLE WIDTH=100% BORDER=0 CELLPADDING=2 CELLSPACING=2 style="margin-bottom: 0.5cm"> <TR> <TD BGCOLOR="#F5F0CD"> <PRE>gchar * gtk_sheet_cell_get_text (GtkSheet *sheet, gint row, gint col);</PRE></TD> </TR> </TABLE> <p STYLE="margin-bottom: 0.5cm"><FONT FACE="Arial, Helvetica, sans-serif"><FONT SIZE=3>Screenshot: </FONT></FONT> <FONT FACE="Arial, Helvetica, sans-serif"><FONT SIZE=3></FONT></FONT></p> <table width="100%" border="0"> <tr> <td><img src="pics/gtksheet_cell_text.jpg" width="313" height="191"></td> </tr> </table> <PRE STYLE="margin-bottom: 0.5cm"><br> <FONT FACE="Arial, Helvetica, sans-serif"><FONT SIZE=4>*<U> A cell text may be deleted by :</U></FONT></FONT></PRE> <TABLE WIDTH=100% BORDER=0 CELLPADDING=2 CELLSPACING=0> <COL WIDTH=256*> <TR> <TD WIDTH=100% BGCOLOR="#F5F0CD"> <PRE>void gtk_sheet_cell_clear(GtkSheet *sheet, gint row, gint col); - delete cell contents<BR>void gtk_sheet_cell_delete(GGtSheet *sheet, gint row, gint col); - delete + remove links</PRE></TD> </TR> </TABLE> <PRE> <FONT FACE="Arial, Helvetica, sans-serif"><FONT SIZE=3>* You may change<strong> <U>background/foreground</U></strong> color of cell (a cell, a range of cells or the whole sheet).</FONT></FONT> <FONT SIZE=3><FONT FACE="Arial, Helvetica, sans-serif">See the <A HREF="../gtkextra-sheet.html#gtk_sheet_set_foreground">example</A> in the manual .</FONT></FONT> <FONT FACE="Arial, Helvetica, sans-serif"><FONT SIZE=3> <strong>* You can pack a <U>xpm</U> into a cell like this :</strong></FONT></FONT></PRE> <TABLE WIDTH=100% BORDER=0 CELLPADDING=2 CELLSPACING=0> <COL WIDTH=256*> <TR> <TD WIDTH=100% BGCOLOR="#ccffff"> <PRE STYLE="margin-bottom: 0.5cm">GtkWidget *sheet,*bullet;<BR>GdkPixmap *pixmap;<BR>GdkColormap *colormap;<BR>GdkBitmap *mask; ............<BR>sheet=gtk_sheet_new(...);<BR>.......<BR>colormap = gdk_colormap_get_system();<BR>pixmap = gdk_pixmap_colormap_create_from_xpm_d(NULL, colormap, &mask, NULL,<BR> bullet_xpm);<BR>bullet = gtk_pixmap_new(pixmap, mask);<BR>gtk_sheet_attach(GTK_SHEET(sheet), bullet, 1, 1, 0,0 ,.5, .5);<BR>........<BR>gtk_widget_show_all (bullet); // don't forget this!!<BR>gtk_widget_show_all (window); See the full example <a href="xpm.c">here(xpm.c)</a>.</PRE></TD> </TR> </TABLE> <PRE STYLE="margin-bottom: 0.5cm"><FONT FACE="Arial, Helvetica, sans-serif"><FONT SIZE=3><strong>Screenshot</strong></FONT><FONT SIZE=4>:</FONT></FONT></PRE> <table width="100%" border="0"> <tr> <td><img src="pics/gtksheet_pack_xpm.jpg" width="280" height="119"></td> </tr> </table> <PRE STYLE="margin-bottom: 0.5cm"><FONT FACE="Arial, Helvetica, sans-serif"><FONT SIZE=3> * You can pack a <U><strong>combo box</strong></U> into a cell like this ( my way,it needs improvement ) :</FONT></FONT></PRE> <TABLE WIDTH=100% BORDER=0 CELLPADDING=2 CELLSPACING=0> <COL WIDTH=256*> <TR> <TD WIDTH=100% BGCOLOR="#ccffff"> <PRE STYLE="margin-bottom: 0.5cm">GtkWidget *sheet,*combo;<BR>GList *combo_items;<BR>..................<BR>combo=gtk_combo_new(); combo_items=NULL;<BR>combo_items=g_list_append (combo_items, "NULL");<BR>combo_items=g_list_append (combo_items, "NOT NULL");<BR>gtk_combo_set_popdown_strings (GTK_COMBO (nul_combo), combo_items);<BR>g_list_free(combo_items);<BR><br>// From GtkExtra 1.0 the cell may be resized automatically to fit the widget<br>//You can thank me for bugging Adrian with this ;-)<BR>gtk_sheet_attach_default (GTK_SHEET(sheet), current_combo, row, col,0,0); // Until GtkExtra 0.99.17 you must resize it yourself<BR>gtk_sheet_set_column_width(GTK_SHEET(sheet),col,170); // 170 is the width of the combo box. <SPAN STYLE="text-decoration: none"><BR>gtk_widget_show(combo);</SPAN></PRE> </TD> </TR> </TABLE> <pre><font size="3" face="Arial, Helvetica, sans-serif"><strong>Screenshot</strong></font><font size="4" face="Arial, Helvetica, sans-serif"> :</font></pre> <img src="pics/gtksheet_pack_combo.jpg" width="469" height="484"> <pre><font size="4" face="Arial, Helvetica, sans-serif"> <font size="3">The widgets can be added to a cell using these functions</font></font>.<br><font size="3" face="Arial, Helvetica, sans-serif">Some of them expand/shrink cell depending of widget size ,others don't.<br>See the GtkSheet manual for details</font></pre> <TABLE WIDTH=100% BORDER=0 CELLPADDING=2 CELLSPACING=0> <COL WIDTH=256*> <TR> <TD WIDTH=100% BGCOLOR="#F5F0CD"> <PRE STYLE="margin-bottom: 0.5cm">/* Attach widget at (row x,col y) starting at the upper left of the cell */<BR>GtkSheetChild *gtk_sheet_put (GtkSheet *sheet, GtkWidget *widget, gint x, gint y); void gtk_sheet_attach (GtkSheet *sheet,GtkWidget *widget,gint row, gint col,gint xoptions,gint yoptions,gint xpadding,gint ypadding); <br>void gtk_sheet_attach_default (GtkSheet *sheet,GtkWidget *widget,gint row, gint col); <br>void gtk_sheet_attach_floating (GtkSheet *sheet,GtkWidget *widget,gint row, gint col);</PRE></TD> </TR> </TABLE> <P> </P> <P><FONT SIZE=4><FONT size="3" FACE="Arial, Helvetica, sans-serif">* You can<strong> <u>set a link</u></strong> for each cell. This is in fact a pointer you want to be associated to the cell.</FONT></FONT><font size="3"> </font></P> <TABLE WIDTH=100% BORDER=0 CELLPADDING=2 CELLSPACING=0> <COL WIDTH=256*> <TR> <TD WIDTH=100% BGCOLOR="#F5F0CD"> <PRE>void gtk_sheet_link_cell(GtkSheet *sheet, gint row, gint col,gpointer link);<BR>gpointer gtk_sheet_get_link(GtkSheet *sheet, gint row, gint col);<BR>void gtk_sheet_remove_link(GtkSheet *sheet, gint row, gint col);</PRE></TD> </TR> </TABLE> <P><BR> <BR> <FONT FACE="Arial, Helvetica, sans-serif"><font face="Arial, Helvetica, sans-serif"><font size=4><b><a name="_4.2" id="_4.2"></a></b></font></font><FONT SIZE=4><B>4.2 <U>Functions that modify a range of cells</U></B></FONT></FONT></P> <P> </P> <P><FONT SIZE=4><FONT size="3" FACE="Arial, Helvetica, sans-serif">A <u><strong>range of cells</strong></u> is in fact : </FONT></FONT></P> <TABLE WIDTH=100% BORDER=0 CELLPADDING=2 CELLSPACING=0> <COL WIDTH=256*> <TR> <TD WIDTH=100% BGCOLOR="#E1F0FD"> <PRE>struct _GtkSheetRange<br>{<br> gint row0,col0; /* upper-left cell */<br> gint rowi,coli; /* lower-right cell */<br>};</PRE></TD> </TR> </TABLE> <P><FONT SIZE=4><FONT size="3" FACE="Arial, Helvetica, sans-serif">Some functions operating on range of cells:</FONT></FONT></P> <TABLE WIDTH=100% BORDER=0 CELLPADDING=2 CELLSPACING=0> <COL WIDTH=256*> <TR> <TD WIDTH=100% BGCOLOR="#F5F0CD"> <PRE>void gtk_sheet_get_visible_range (GtkSheet *sheet,GtkSheetRange *range); <br>void gtk_sheet_range_set_background (GtkSheet *sheet, const GtkSheetRange *range, const GdkColor *color);<br>void gtk_sheet_range_set_foreground (GtkSheet *sheet, const GtkSheetRange *range,const GdkColor *color);<br>void gtk_sheet_select_range (GtkSheet *sheet, const GtkSheetRange *range);<br>void gtk_sheet_unselect_range (GtkSheet *sheet); void gtk_sheet_range_clear (GtkSheet *sheet, const GtkSheetRange *range);<br>void gtk_sheet_range_delete (GtkSheet *sheet, const GtkSheetRange *range); void gtk_sheet_range_set_editable (GtkSheet *sheet, const GtkSheetRange *range, gint editable);<br>void gtk_sheet_range_set_visible (GtkSheet *sheet, const GtkSheetRange *range, gboolean visible);<br>void gtk_sheet_range_set_border (GtkSheet *sheet, const GtkSheetRange *range, gint mask, guint width, gint line_style);<br>void gtk_sheet_range_set_border_color GtkSheet *sheet, const GtkSheetRange *range, const GdkColor *color);</PRE></TD> </TR> </TABLE> <P><FONT SIZE=4><FONT size="3" FACE="Arial, Helvetica, sans-serif"><strong>Remark:</strong></FONT></FONT></P> <TABLE WIDTH=100% BORDER=0 CELLPADDING=2 CELLSPACING=2> <TR> <TD BGCOLOR="#ccffff"><PRE>/* When you declare a range like this:*/ <br>......<br>GtkSheetRange range; ................. /* You must call the range functions like this : */ <br>void gtk_sheet_range_clear (sheet, <strong><font size="3" face="Arial, Helvetica, sans-serif">&range</font></strong>); </PRE></TD> </TR> </TABLE> <P><FONT SIZE=4><FONT size="3" FACE="Arial, Helvetica, sans-serif"><strong>Screenshot</strong>: Modifying the background color of a range</FONT></FONT></P> <table width="100%" border="0"> <tr> <td><img src="pics/gtksheet_range_bg.jpg" width="706" height="344"></td> </tr> </table> <P> </P> <P><FONT FACE="Arial, Helvetica, sans-serif"><font face="Arial, Helvetica, sans-serif"><font size=4><b><a name="_4.3" id="_4.3"></a></b></font></font><FONT SIZE=4><B>4.3 <U>Functions that modify all cells from the sheet</U></B></FONT></FONT></P> <P> </P> <P><font size="3" face="Arial, Helvetica, sans-serif">These functions are used if you want the cells to contain the same widget.<br> These are some of them: </font></P> <TABLE WIDTH=100% BORDER=0 CELLPADDING=2 CELLSPACING=0> <COL WIDTH=256*> <TR> <TD WIDTH=100% BGCOLOR="#F5F0CD"><PRE>GtkWidget *gtk_sheet_new_with_custom_entry (guint rows, guint columns, const gchar *title,GtkType entry_type); <br>void gtk_sheet_set_foreground (GtkSheet *sheet,GdkColor *fg_color);<br>void gtk_sheet_set_background (GtkSheet *sheet,GdkColor *bg_color);</PRE></TD> </TR> </TABLE> <P> </P> <P><FONT FACE="Arial, Helvetica, sans-serif"><FONT SIZE=4><B><a name="_4.4" id="_4.4"></a></B>4.4 <FONT FACE="Arial, Helvetica, sans-serif"><U>Functions that set titles</U></FONT></FONT></FONT></P> <P> </P> <P><font size="3" face="Arial, Helvetica, sans-serif">* A <u><strong>row/column title</strong></u><strong> </strong>can be set with: </font></P> <TABLE WIDTH=100% BORDER=0 CELLPADDING=2 CELLSPACING=0> <COL WIDTH=256*> <TR> <TD WIDTH=100% BGCOLOR="#F5F0CD"><PRE>void gtk_sheet_row_button_add_label (GtkSheet *sheet, gint row, const gchar *label); <br>void gtk_sheet_column_button_add_label (GtkSheet *sheet, gint row, const gchar *label); <br></PRE> </TD> </TR> </TABLE> <P><font size="4" face="Arial, Helvetica, sans-serif"> <font size="3"><strong><u>gtk_sheet_set_row_title()</u></strong> is used for setting an internal label associated with a row.<br> Some people told that this is useless but i find it very usefull in some cases.<br> And one more thing : please don't ask again on the mailing list what this function does.<br> The secret is unveiled now :-)</font><br> <br> <font size="3">* The<strong> <u>sheet title</u></strong> may be set with : </font></font></P> <TABLE WIDTH=100% BORDER=0 CELLPADDING=2 CELLSPACING=0> <COL WIDTH=256*> <TR> <TD WIDTH=100% BGCOLOR="#F5F0CD"><PRE>void gtk_sheet_set_title (GtkSheet *sheet, const gchar *title);<br></PRE> </TD> </TR> </TABLE> <P><br> <font size="3" face="Arial, Helvetica, sans-serif">* The <u><strong>dimensions of the row/column titles</strong></u> may be set with the next functions.<br> These functions exist because you may want to resize the width of a column or height of a row,<br> unless you set the autoresize flag, which will do it automaticaly for you.<br> </font></P> <TABLE WIDTH=100% BORDER=0 CELLPADDING=2 CELLSPACING=0> <COL WIDTH=256*> <TR> <TD WIDTH=100% BGCOLOR="#F5F0CD"><PRE>void gtk_sheet_set_row_titles_width(GtkSheet *sheet, guint width); <br>void gtk_sheet_set_column_titles_height(GtkSheet *sheet, guint height);<br></PRE> </TD> </TR> </TABLE> <P><br> <font size="3">* <font face="Arial, Helvetica, sans-serif"><u><strong>Row/column title justification</strong></u> is done with:</font></font></P> <TABLE WIDTH=100% BORDER=0 CELLPADDING=2 CELLSPACING=0> <COL WIDTH=256*> <TR> <TD WIDTH=100% BGCOLOR="#F5F0CD"><PRE>void gtk_sheet_set_row_titles_width(GtkSheet *sheet, guint width); <br>void gtk_sheet_set_column_titles_height(GtkSheet *sheet, guint height);<br></PRE> </TD> </TR> </TABLE> <P><font size="4" face="Arial, Helvetica, sans-serif"> </font> </P> <P><FONT SIZE=4 face="Arial, Helvetica, sans-serif"><SPAN STYLE="text-decoration: none"><a name="modify_state" id="modify_state"></a>5. <u> <strong>Modifying sheet state</strong></u></SPAN></FONT><br> </P> <P><br> <font size="3">* <font face="Arial, Helvetica, sans-serif">You can<strong> <u>freeze/unfreeze</u></strong> the sheet with:</font></font> </P> <TABLE WIDTH=100% BORDER=0 CELLPADDING=2 CELLSPACING=0> <COL WIDTH=256*> <TR> <TD WIDTH=100% BGCOLOR="#F5F0CD"><PRE>void gtk_sheet_freeze (GtkSheet *sheet); <br>void gtk_sheet_thaw (GtkSheet *sheet);<br></PRE> </TD> </TR> </TABLE> <pre><font size="3">*<font face="Arial, Helvetica, sans-serif"> </font><font face="Arial, Helvetica, sans-serif">Set if cell contents <u><strong>can be edited</strong></u> or not in the given range: </font></font></pre> <table width=100% border=0 cellpadding=2 cellspacing=0> <col width=256*> <tr> <td width=100% bgcolor="#F5F0CD"><pre>void gtk_sheet_range_set_editable (GtkSheet *sheet, const GtkSheetRange *range, gint editable);<br></pre> </td> </tr> </table> <pre><font size="3" face="Arial, Helvetica, sans-serif"><br>*<strong>REMARK</strong> : From GtkExtra 1.0 sheet state will be set with <strong>functions</strong>:</font><br> </pre> <TABLE WIDTH=100% BORDER=0 CELLPADDING=2 CELLSPACING=0> <COL WIDTH=256*> <TR> <TD WIDTH=100% BGCOLOR="#F5F0CD"><pre>void gtk_sheet_set_autoresize (GtkSheet *sheet, gboolean autoresize); gboolean gtk_sheet_autoresize (GtkSheet *sheet); void gtk_sheet_set_autoscroll (GtkSheet *sheet, gboolean autoscroll); gboolean gtk_sheet_autoscroll(GtkSheet *sheet); void gtk_sheet_set_clip_text (GtkSheet *sheet, gboolean clip_text); gboolean gtk_sheet_clip_text (GtkSheet *sheet); void gtk_sheet_set_locked (GtkSheet *sheet, gboolean lock); void gtk_sheet_locked (GtkSheet *sheet); void gtk_sheet_rows_set_resizable (GtkSheet *sheet, gboolean resizable); gboolean gtk_sheet_rows_resizable (GtkSheet *sheet); void gtk_sheet_columns_set_resizable (GtkSheet *sheet, gboolean resizable); gboolean gtk_sheet_columns_resizable (GtkSheet *sheet); void gtk_sheet_show_column_titles (GtkSheet *sheet); void gtk_sheet_show_row_titles (GtkSheet *sheet); void gtk_sheet_hide_column_titles (GtkSheet *sheet); void gtk_sheet_hide_row_titles (GtkSheet *sheet); gboolean gtk_sheet_column_titles_visible (GtkSheet *sheet); gboolean gtk_sheet_row_titles_visible (GtkSheet *sheet); void gtk_sheet_set_justify_entry (GtkSheet *sheet, gboolean justify); gboolean gtk_sheet_justify_entry (GtkSheet *sheet);</pre></TD> </TR> </TABLE> <pre><font size="3" face="Arial, Helvetica, sans-serif"><br>*Up to (including) GtkExtra 0.99.17 Sheet state is mainly set by a <u><strong>set of macros</strong></u>:</font> </pre> <TABLE WIDTH=100% BORDER=0 CELLPADDING=2 CELLSPACING=0> <COL WIDTH=256*> <TR> <TD WIDTH=100% BGCOLOR="#F5F0CD"><PRE> GTK_SHEET_AUTORESIZE(sheet)<br> GTK_SHEET_ROW_FROZEN(sheet) <br> GTK_SHEET_COLUMN_FROZEN(sheet) <br> GTK_SHEET_CLIP_TEXT(sheet) <br> GTK_SHEET_AUTO_SCROLL(sheet)<br> GTK_SHEET_JUSTIFY_ENTRY(sheet) <br> GTK_SHEET_ROW_TITLES_VISIBLE(sheet)<br> GTK_SHEET_COL_TITLES_VISIBLE(sheet)</PRE></TD> </TR> </TABLE> <P> </P> <P><FONT SIZE=4 face="Arial, Helvetica, sans-serif"><SPAN STYLE="text-decoration: none"><a name="selections"></a>6. <u> <strong>Selections</strong></u></SPAN></FONT></P> <P> </P> <pre><font size="3" face="Arial, Helvetica, sans-serif">* <u><strong>Select a row/column</strong></u>:</font></pre> <TABLE WIDTH=100% BORDER=0 CELLPADDING=2 CELLSPACING=0> <COL WIDTH=256*> <TR> <TD WIDTH=100% BGCOLOR="#F5F0CD"><PRE>void gtk_sheet_select_row (GtkSheet * sheet,gint row);<br>void gtk_sheet_select_column (GtkSheet * sheet,gint column);<br></PRE> </TD> </TR> </TABLE> <P><br> <font size="3" face="Arial, Helvetica, sans-serif">* <u><strong>(Un)Select a range</strong></u>: </font></P> <TABLE WIDTH=100% BORDER=0 CELLPADDING=2 CELLSPACING=0> <COL WIDTH=256*> <TR> <TD WIDTH=100% BGCOLOR="#F5F0CD"><PRE>void gtk_sheet_select_range (GtkSheet *sheet, const GtkSheetRange *range); <br>void gtk_sheet_unselect_range (GtkSheet *sheet);<br></PRE> </TD> </TR> </TABLE> <pre> <font size="3" face="Arial, Helvetica, sans-serif">A row/column selection can be catched using "select_row" and "select_column" signals:</font><font size="3" face="Arial, Helvetica, sans-serif"> </font></pre> <TABLE WIDTH=100% BORDER=0 CELLPADDING=2 CELLSPACING=0> <COL WIDTH=256*> <TR> <TD WIDTH=100% BGCOLOR="#F5F0CD"><PRE>void (*select_row) (GtkSheet *sheet, gint row);<br>void (*select_column) (GtkSheet *sheet, gint column);<br></PRE> </TD> </TR> </TABLE> <P> </P> <P><FONT SIZE=4 face="Arial, Helvetica, sans-serif"><SPAN STYLE="text-decoration: none"><a name="operations"></a>7. <u> <strong>Row/column operations</strong></u></SPAN></FONT></P> <P> </P> <pre><font size="3" face="Arial, Helvetica, sans-serif">The most common row/column operations are:<br> - insertion<br> - deletion<br> - finding the number of row/cols<br></font></pre> <TABLE WIDTH=100% BORDER=0 CELLPADDING=2 CELLSPACING=0> <COL WIDTH=256*> <TR> <TD WIDTH=100% BGCOLOR="#F5F0CD"><PRE>void gtk_sheet_add_column (GtkSheet *sheet, guint ncols);<br>void gtk_sheet_add_row (GtkSheet *sheet, guint nrows);<br>void gtk_sheet_insert_rows (GtkSheet *sheet, guint row, guint nrows);<br>void gtk_sheet_insert_columns (GtkSheet *sheet, guint col, guint ncols); <br>void gtk_sheet_delete_rows (GtkSheet *sheet, guint row, guint nrows);<br>void gtk_sheet_delete_columns (GtkSheet *sheet, guint col, guint ncols); <br>guint gtk_sheet_get_columns_count (GtkSheet *sheet);<br>guint gtk_sheet_get_rows_count (GtkSheet *sheet);</PRE></TD> </TR> </TABLE> <P> </P> <P> </P> <TABLE WIDTH=100% BORDER=0 CELLPADDING=2 CELLSPACING=0 BGCOLOR="#000000"> <TR> <TD WIDTH=25% BGCOLOR="#000000"> <P ALIGN=LEFT> </P> </TD> <TD WIDTH=50% BGCOLOR="#0000c0"> <P ALIGN=CENTER><A HREF="../index.html"><B><FONT SIZE=3><FONT COLOR="#ffffff">Home</FONT></FONT></B></A></P> </TD> <TD BGCOLOR="#000000"> <P ALIGN=CENTER> </P> </TD> <TD WIDTH=25% BGCOLOR="#000000"> <P ALIGN=RIGHT> </P> </TD> </TR> </TABLE> <P> </P> <P> </P> <P> </P> <P> </P> <P> </P> <P> </P> <P> </P> <P> </P> <P> </P> <P> </P> </BODY> </HTML>