-----------------------------------------------------------------------
--                               G P S                               --
--                                                                   --
--                      Copyright (C) 2009, AdaCore                  --
--                                                                   --
-- GPS 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 program 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 Ada.Strings.Unbounded;      use Ada.Strings.Unbounded;

with Glib;                       use Glib;
with Glib.Object;                use Glib.Object;

with GNATCOLL.Scripts;           use GNATCOLL.Scripts;
with GNATCOLL.Scripts.Gtkada;    use GNATCOLL.Scripts.Gtkada;

with GPS.Kernel;                 use GPS.Kernel;
with GPS.Kernel.MDI;             use GPS.Kernel.MDI;
with GPS.Kernel.Preferences;     use GPS.Kernel.Preferences;
with GPS.Kernel.Scripts;         use GPS.Kernel.Scripts;
with Histories;
with Switches_Chooser.Gtkada;    use Switches_Chooser.Gtkada;
with Switches_Parser;            use Switches_Parser;
with XML_Utils;                  use XML_Utils;

package body Switches_Chooser.Scripts is

   Name_Cst     : aliased constant String := "name";
   Xml_Data_Cst : aliased constant String := "xmldata";

   function Dummy_Other_Config_Finder
     (Name : String) return Switches_Editor_Config;
   --  Dummy procedure for cross-config finder (unsupported for scripts)

   procedure Command_Handler
     (Data : in out Callback_Data'Class; Command : String);
   --  Handle commands for the SwitchesParser class

   -------------------------------
   -- Dummy_Other_Config_Finder --
   -------------------------------

   function Dummy_Other_Config_Finder
     (Name : String) return Switches_Editor_Config
   is
      pragma Unreferenced (Name);
   begin
      return null;
   end Dummy_Other_Config_Finder;

   ---------------------
   -- Command_Handler --
   ---------------------

   procedure Command_Handler
     (Data : in out Callback_Data'Class; Command : String)
   is
      Class    : constant Class_Type :=
                   New_Class (Get_Kernel (Data), "SwitchesChooser");
      Inst     : constant Class_Instance := Nth_Arg (Data, 1, Class);
      Config   : Switches_Editor_Config;
      Editor   : Switches_Chooser.Gtkada.Switches_Editor;
      Error    : Unbounded_String;
      Xml      : XML_Utils.Node_Ptr;

   begin
      if Command = Constructor_Method then
         Name_Parameters
           (Data,
            ( --  1 => Self,
             2 => Name_Cst'Access,
             3 => Xml_Data_Cst'Access));

         Xml := XML_Utils.Parse_Buffer (Nth_Arg (Data, 3));
         Parse_Switches_Node
           (Current_Tool_Name   => Nth_Arg (Data, 2),
            Current_Tool_Config => Config,
            Error_Message       => Error,
            Finder              => Dummy_Other_Config_Finder'Access,
            Node                => Xml);
         Switches_Chooser.Gtkada.Gtk_New
           (Editor, Config,
            Get_Tooltips (Get_Kernel (Data)),
            Use_Native_Dialogs.Get_Pref,
            null,
            Histories.No_Key);

         GNATCOLL.Scripts.Gtkada.Set_Data
           (Inst, GObject (Editor));

      else
         Editor := Switches_Chooser.Gtkada.Switches_Editor
           (GNATCOLL.Scripts.Gtkada.Get_Data (Inst));

         if Command = "set_cmd_line" then
            Editor.Set_Command_Line (Nth_Arg (Data, 2));

         elsif Command = "get_cmd_line" then
            declare
               Cmd_Line : constant String_List_Access :=
                            Editor.Get_Command_Line (False);
               Ret      : Unbounded_String;
            begin
               for J in Cmd_Line'Range loop
                  if J = Cmd_Line'First then
                     Ret := To_Unbounded_String (Cmd_Line (J).all);
                  else
                     Ret := Ret & " " & Cmd_Line (J).all;
                  end if;
               end loop;

               Set_Return_Value (Data, To_String (Ret));
            end;
         end if;
      end if;
   end Command_Handler;

   ---------------------
   -- Register_Module --
   ---------------------

   procedure Register_Module
     (Kernel : access GPS.Kernel.Kernel_Handle_Record'Class)
   is
      Class : constant Class_Type := New_Class
        (Kernel, "SwitchesChooser", Get_GUI_Class (Kernel));
   begin
      Register_Command
        (Kernel, Constructor_Method, 2, 2, Class => Class,
         Handler                                 => Command_Handler'Access);
      Register_Command
        (Kernel, "set_cmd_line", 1, 1, Class => Class,
         Handler => Command_Handler'Access);
      Register_Command
        (Kernel, "get_cmd_line", 0, 0, Class => Class,
         Handler => Command_Handler'Access);
   end Register_Module;

end Switches_Chooser.Scripts;
