Sophie

Sophie

distrib > Fedora > 15 > i386 > by-pkgid > 84e3c6e8e1d0d7706a99d19480799d2a > files > 274

gtk+extra-devel-2.1.2-6.fc15.i686.rpm

<!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 &lt;kornos@softhome.net&gt; 
        .</STRONG><BR>
        Copyright : See the COPYRIGHT file<BR>
        GTK-EXTRA library author: Adrian Feiguin &lt;adrian@ifir.edu.ar&gt;</font></P>
		</TD>
	</TR>
</TABLE>
<P>&nbsp;</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 &lt;kornos@softhome.net&gt; in such a case.</font></pre>
<P>&nbsp;</P>
<P>&nbsp;</P>
<P>&nbsp;</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 &amp; 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,&quot;Edit table&quot;);
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 &quot;browser sheet&quot;) , 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),
                   &quot;activate&quot;,
                   (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 &quot;n&quot; 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),
                   &quot;activate&quot;,
                   (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,&quot;table_new&quot;)==0){
               .....do_some_stuf()
     }
     else if(strcmp(function_name,&quot;table_edit&quot;)==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),
                   &quot;traverse&quot;,
                   (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 &quot;traverse&quot; signal  is emited before &quot;deactivate_cell&quot; 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, &amp;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, &quot;NULL&quot;);<BR>combo_items=g_list_append (combo_items, &quot;NOT NULL&quot;);<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>&nbsp;</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">&nbsp;&nbsp;</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>&nbsp;</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">&amp;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>&nbsp;</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>&nbsp;</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>&nbsp;</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>&nbsp;</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>&nbsp; </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>&nbsp;</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 &quot;select_row&quot; and &quot;select_column&quot; 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>&nbsp;</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>&nbsp;</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>&nbsp;</P>
<P>&nbsp;</P>
<TABLE WIDTH=100% BORDER=0 CELLPADDING=2 CELLSPACING=0 BGCOLOR="#000000">
	<TR>
		<TD WIDTH=25% BGCOLOR="#000000">
			<P ALIGN=LEFT>&nbsp;</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>&nbsp;</P>
		</TD>
		<TD WIDTH=25% BGCOLOR="#000000">
			<P ALIGN=RIGHT>&nbsp;</P>
		</TD>
	</TR>
</TABLE>
<P>&nbsp;</P>
<P>&nbsp;</P>
<P>&nbsp;</P>
<P>&nbsp;</P>
<P>&nbsp;</P>
<P>&nbsp;</P>
<P>&nbsp;</P>
<P>&nbsp;</P>
<P>&nbsp;</P>
<P>&nbsp;</P>
</BODY>
</HTML>