------------------------------------------------------------------------------
-- --
-- GNOGA - The GNU Omnificent GUI for Ada --
-- --
-- G N O G A . G U I . V I E W --
-- --
-- B o d y --
-- --
-- --
-- Copyright (C) 2014 David Botton --
-- --
-- This library is free software; you can redistribute it and/or modify --
-- it under terms of the GNU General Public License as published by the --
-- Free Software Foundation; either version 3, 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. --
-- --
-- As a special exception under Section 7 of GPL version 3, you are --
-- granted additional permissions described in the GCC Runtime Library --
-- Exception, version 3.1, as published by the Free Software Foundation. --
-- --
-- You should have received a copy of the GNU General Public License and --
-- a copy of the GCC Runtime Library Exception along with this program; --
-- see the files COPYING3 and COPYING.RUNTIME respectively. If not, see --
-- . --
-- --
-- As a special exception, if other files instantiate generics from this --
-- unit, or you link this unit with other files to produce an executable, --
-- this unit does not by itself cause the resulting executable to be --
-- covered by the GNU General Public License. This exception does not --
-- however invalidate any other reasons why the executable file might be --
-- covered by the GNU Public License. --
-- --
-- For more information please go to http://www.gnoga.com --
------------------------------------------------------------------------------
with Ada.Strings.Wide_Wide_Maps.Wide_Wide_Constants;
with Gnoga.Gui.Document;
with Gnoga.Gui.Element.Common;
with Gnoga.Server.Connection;
with Gnoga.Server.Template_Parser.Simple;
package body Gnoga.Gui.View is
--------------
-- Finalize --
--------------
overriding procedure Finalize (Object : in out View_Base_Type) is
begin
if not Gnoga.Server.Connection.Shutting_Down then
for i in Object.Child_Array.First_Index .. Object.Child_Array.Last_Index loop
if Object.Child_Array.Element (i).Dynamic then
Object.Child_Array.Element (i).Free;
end if;
end loop;
end if;
Gnoga.Gui.Element.Element_Type (Object).Finalize;
end Finalize;
------------
-- Create --
------------
procedure Create
(View : in out View_Type;
Parent : in out Gnoga.Gui.Base.Base_Type'Class;
ID : in String := "")
is
begin
View.Create_From_HTML (Parent, "
", ID);
end Create;
--------------------
-- On_Child_Added --
--------------------
overriding procedure On_Child_Added
(View : in out View_Base_Type;
Child : in out Gnoga.Gui.Base.Base_Type'Class)
is
use Gnoga.Gui.Element;
begin
if Child in Element_Type'Class then
if Element_Type (Child).Auto_Place then
Element_Type (Child).Place_Inside_Bottom_Of (View);
end if;
end if;
if Child.Dynamic then
View.Child_Array.Append (Child'Unchecked_Access);
end if;
end On_Child_Added;
------------------
-- Fill_Parent --
------------------
procedure Fill_Parent (View : in out View_Base_Type) is
use Gnoga.Gui.Element;
begin
View.Position (Absolute);
View.Box_Height ("100%");
View.Box_Width ("100%");
if View.Height = 0 then
View.Position (Relative);
end if;
end Fill_Parent;
--------------
-- Put_Line --
--------------
procedure Put_Line
(View : in out View_Base_Type;
Message : in String;
Class : in String := "";
ID : in String := "")
is
D : Gnoga.Gui.Element.Common.DIV_Type;
begin
D.Create (View, Message, ID);
if Class /= "" then
D.Class_Name (Class);
end if;
end Put_Line;
---------
-- Put --
---------
procedure Put
(View : in out View_Base_Type;
Message : in String;
Class : in String := "";
ID : in String := "")
is
S : Gnoga.Gui.Element.Common.Span_Type;
begin
S.Create (View, Message, ID);
if Class /= "" then
S.Class_Name (Class);
end if;
end Put;
--------------
-- Put_HTML --
--------------
procedure Put_HTML
(View : in out View_Base_Type;
HTML : in String;
Class : in String := "";
ID : in String := "")
is
D : Gnoga.Gui.Element.Element_Type;
begin
D.Create_From_HTML (View, Escape_Quotes (HTML), ID);
if Class /= "" then
D.Class_Name (Class);
end if;
end Put_HTML;
--------------
-- New_Line --
--------------
procedure New_Line (View : in out View_Base_Type) is
begin
View.Put_HTML (" ");
end New_Line;
---------------------
-- Horizontal_Rule --
---------------------
procedure Horizontal_Rule (View : in out View_Base_Type) is
begin
View.Put_HTML ("");
end Horizontal_Rule;
---------------
-- Load_File --
---------------
procedure Load_File
(View : in out View_Base_Type;
File_Name : in String;
Class : in String := "";
ID : in String := "")
is
S : constant String := Gnoga.Server.Template_Parser.Simple.Load_View (File_Name);
begin
View.Put_Line (S, Class, ID);
end Load_File;
---------------
-- Load_HTML --
---------------
procedure Load_HTML
(View : in out View_Base_Type;
File_Name : in String;
Class : in String := "";
ID : in String := "")
is
use Ada.Strings.Wide_Wide_Maps.Wide_Wide_Constants;
S : constant String := Gnoga.Server.Template_Parser.Simple.Load_View (File_Name);
B : constant Natural := Index (Source => S, Pattern => " Lower_Case_Map);
T : constant Natural := Index (Source => S, Pattern => ">", From => B);
E : constant Natural := Index (Source => S, Pattern => " Lower_Case_Map);
begin
if B > 0 and E > 0 then
View.Put_HTML (S.Slice (T + 1, E - 1), Class, ID);
end if;
end Load_HTML;
--------------
-- Load_CSS --
--------------
procedure Load_CSS
(View : in out View_Base_Type;
URL : in String)
is
Document : Gnoga.Gui.Document.Document_Type;
begin
Document.Attach (View.Connection_ID);
Document.Head_Element.jQuery_Execute ("append ('')");
end Load_CSS;
-------------------
-- Load_CSS_File --
-------------------
procedure Load_CSS_File
(View : in out View_Base_Type;
File_Name : in String)
is
S : constant String := Gnoga.Server.Template_Parser.Simple.Load_View (File_Name);
Document : Gnoga.Gui.Document.Document_Type;
begin
Document.Attach (View.Connection_ID);
Document.Head_Element.jQuery_Execute ("append (''");
end Load_CSS_File;
-----------------
-- Add_Element --
-----------------
procedure Add_Element
(View : in out View_Base_Type;
Name : in String;
Element : Gnoga.Gui.Element.Pointer_To_Element_Class)
is
begin
View.Element_Map.Include (Key => Name, New_Item => Element);
end Add_Element;
-----------------
-- New_Element --
-----------------
function New_Element
(View : access View_Base_Type;
Name : String;
Element : Gnoga.Gui.Element.Pointer_To_Element_Class)
return Gnoga.Gui.Element.Pointer_To_Element_Class
is
begin
View.Add_Element (Name, Element);
Element.Dynamic;
return Element.all'Unrestricted_Access;
end New_Element;
---------
-- Add --
---------
function Add
(View : access View_Base_Type;
Element : access Gnoga.Gui.Element.Element_Type'Class)
return Gnoga.Gui.Element.Pointer_To_Element_Class
is
pragma Unreferenced (View);
begin
Element.Dynamic;
return Element.all'Unrestricted_Access;
end Add;
-------------
-- Element --
-------------
function Element
(View : View_Base_Type;
Name : String)
return Gnoga.Gui.Element.Pointer_To_Element_Class
is
begin
if View.Element_Map.Contains (Name) then
return View.Element_Map.Element (Name);
else
return null;
end if;
end Element;
-------------------
-- Element_Names --
-------------------
function Element_Names
(View : View_Base_Type)
return Gnoga.Types.Data_Array_Type
is
Names : Gnoga.Types.Data_Array_Type;
procedure Add_Name (C : in Gnoga.Gui.Element.Element_Type_Maps.Cursor);
procedure Add_Name (C : in Gnoga.Gui.Element.Element_Type_Maps.Cursor) is
begin
Names.Append (String'(Gnoga.Gui.Element.Element_Type_Maps.Key (C)));
end Add_Name;
begin
View.Element_Map.Iterate (Add_Name'Access);
return Names;
end Element_Names;
end Gnoga.Gui.View;