Testgtk source code
This code is part of testgtk, a demo application packaged with GtkAda. Testgtk demonstrates the various widgets of GtkAda
-----------------------------------------------------------------------
-- GtkAda - Ada95 binding for the Gimp Toolkit --
-- --
-- Copyright (C) 2006 AdaCore --
-- --
-- This library is free software; you can redistribute it and/or --
-- modify it under the terms of the GNU General Public --
-- License as published by the Free Software Foundation; either --
-- version 2 of the License, or (at your option) any later version. --
-- --
-- This library is distributed in the hope that it will be useful, --
-- but WITHOUT ANY WARRANTY; without even the implied warranty of --
-- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU --
-- General Public License for more details. --
-- --
-- You should have received a copy of the GNU General Public --
-- License along with this library; if not, write to the --
-- Free Software Foundation, Inc., 59 Temple Place - Suite 330, --
-- Boston, MA 02111-1307, USA. --
-- --
--
--
--
--
--
--
--
-----------------------------------------------------------------------
with Glib;
use Glib;
with Glib.Properties;
use Glib.Properties;
with Gtk.Button;
use Gtk.Button;
with Gtk.Box;
use Gtk.Box;
with Gtk.Frame;
use Gtk.Frame;
with Gtk.Cell_Renderer;
use Gtk.Cell_Renderer;
with Gtk.Cell_Renderer_Text;
use Gtk.Cell_Renderer_Text;
with Gtk.Cell_View;
use Gtk.Cell_View;
with Gtk.Cell_Layout;
use Gtk.Cell_Layout;
with Gtk.List_Store;
use Gtk.List_Store;
with Gtk.Tree_Model;
use Gtk.Tree_Model;
with Gtk.Widget;
use Gtk.Widget;
with Gtkada.Handlers;
use Gtkada.Handlers;
package body Create_Cell_View
is
Column_0 :
constant := 0;
Column_1 :
constant := 1;
-- The columns in the model
Path : Gtk_Tree_Path;
procedure Move_To_Previous (View :
access Gtk_Widget_Record'Class);
procedure Move_To_Next (View :
access Gtk_Widget_Record'Class);
-- Display the previous or next function in the cell view
procedure Compute_Column_3
(Cell_Layout : Gtk_Cell_Layout;
Cell :
access Gtk.Cell_Renderer.Gtk_Cell_Renderer_Record'Class;
Model :
access Gtk.Tree_Model.Gtk_Tree_Model_Record'Class;
Iter : Gtk.Tree_Model.Gtk_Tree_Iter);
-- Compute dynamically what to display in the third column of the view,
-- based on the contents of the model. In this example, this is a
-- concatenation of the two model columns
----------
-- Help --
----------
function Help
return String
is
begin
return "A @bGtk_Cell_View@B provides a view
of a single row
of a tree"
& " model." & ASCII.LF
& "In this example, the first two columns displayed come straight from"
& " the model, where they are stored as a string
and an integer. The"
& " third column
is computed dynamically,
and doesn't exist
in the"
& " model itself.";
end Help;
----------------------
-- Move_To_Previous --
----------------------
procedure Move_To_Previous (View :
access Gtk_Widget_Record'Class)
is
begin
if Prev (Path)
then
Set_Displayed_Row (Gtk_Cell_View (View), Path);
end if;
end Move_To_Previous;
------------------
-- Move_To_Next --
------------------
procedure Move_To_Next (View :
access Gtk_Widget_Record'Class)
is
begin
Next (Path);
Set_Displayed_Row (Gtk_Cell_View (View), Path);
end Move_To_Next;
----------------------
-- Compute_Column_3 --
----------------------
procedure Compute_Column_3
(Cell_Layout : Gtk_Cell_Layout;
Cell :
access Gtk.Cell_Renderer.Gtk_Cell_Renderer_Record'Class;
Model :
access Gtk.Tree_Model.Gtk_Tree_Model_Record'Class;
Iter : Gtk.Tree_Model.Gtk_Tree_Iter)
is
pragma Unreferenced (Cell_Layout);
begin
Set_Property
(Cell, Gtk.Cell_Renderer_Text.Text_Property,
"--" & Get_String (Model, Iter, 0) & "--"
& Gint'Image (Get_Int (Model, Iter, 1)) & "--");
end Compute_Column_3;
---------
-- Run --
---------
procedure Run (Frame :
access Gtk.Frame.Gtk_Frame_Record'Class)
is
Box, Hbox : Gtk_Box;
Prev, Next : Gtk_Button;
Model : Gtk_List_Store;
Iter : Gtk_Tree_Iter;
View : Gtk_Cell_View;
Render : Gtk_Cell_Renderer_Text;
begin
Set_Label (Frame, "Cell View");
Gtk_New_Vbox (Box, Homogeneous => False);
Add (Frame, Box);
Gtk_New_Hbox (Hbox, Homogeneous => True);
Pack_Start (Box, Hbox, Expand => False);
Gtk_New (Prev, "Previous row");
Pack_Start (Hbox, Prev, Expand => False);
Gtk_New (Next, "Next row");
Pack_Start (Hbox, Next, Expand => False);
-- Create a model. This is a set of rows, each with two columns in this
-- specific case.
Gtk_New (Model, (Column_0 => GType_String,
Column_1 => GType_Int));
Append (Model, Iter);
Set (Model, Iter, Column_0, "row 1");
Set (Model, Iter, Column_1, 1);
Append (Model, Iter);
Set (Model, Iter, Column_0, "row 2");
Set (Model, Iter, Column_1, 2);
Append (Model, Iter);
Set (Model, Iter, Column_0, "row 3");
Set (Model, Iter, Column_1, 3);
-- Create the cell view. We need to specify the renderer that will show
-- the columns of the model. Note that we do not have to display all
-- the columns.
-- Adding renderers is done through the Gtk_Cell_Layout interface, not
-- directly through Gtk_Cell_View.
Gtk_New (View);
Pack_Start (Box, View, Expand => True, Fill => False);
Set_Model (View, Gtk_Tree_Model (Model));
Gtk_New (Render);
Pack_Start (+View, Render, Expand => True);
Add_Attribute (+View, Render, "text", Column_0);
Gtk_New (Render);
Pack_Start (+View, Render, Expand => True);
Add_Attribute (+View, Render, "text", Column_1);
-- The third column in the view is computed dynamically from the others
-- in the model, and doesn't have to exist in the model itself.
Gtk_New (Render);
Pack_Start (+View, Render, Expand => True);
Set_Cell_Data_Func (+View, Render, Compute_Column_3'Access);
Path := Gtk_New_First;
Set_Displayed_Row (View, Path);
Widget_Callback.Object_Connect
(Prev, "clicked", Move_To_Previous'Access, View);
Widget_Callback.Object_Connect
(Next, "clicked", Move_To_Next'Access, View);
Show_All (Frame);
end Run;
end Create_Cell_View;