--------------------------------------------------------------------------------
--                                                                            --
-- Copyright (C) 2004, RISC OS Ada Library (RASCAL) developers.               --
--                                                                            --
-- This library is free software; you can redistribute it and/or              --
-- modify it under the terms of the GNU Lesser General Public                 --
-- License as published by the Free Software Foundation; either               --
-- version 2.1 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           --
-- Lesser General Public License for more details.                            --
--                                                                            --
-- You should have received a copy of the GNU Lesser 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    --
--                                                                            --
--------------------------------------------------------------------------------

-- @brief Multitasking file operations.
-- $Author$
-- $Date$
-- $Revision$

with RASCAL.OS;     use RASCAL.OS;

package RASCAL.FilerAction is

   type Filer_Control_Action_Type is (Acknowledge,Verbose_On,Verbose_Off);
   type FilerAction_Operation_Type is (Copy,Rename,Delete,Set_Access,Set_Type,Count,Move,Copy_Local,Stamp,Find);
   subtype FilerAction_Option_Type is integer;

   Verbose        : FilerAction_Option_Type := 1;
   Confirm        : FilerAction_Option_Type := 2;
   Force          : FilerAction_Option_Type := 4;
   Newer          : FilerAction_Option_Type := 8;
   Recurse        : FilerAction_Option_Type := 16;
   Confirm_Delete : FilerAction_Option_Type := 32;
   Faster         : FilerAction_Option_Type := 64;

   --
   -- This message should be broadcast to instruct the filer to open a directory.
   --Filing system modules use Service_StartFiler to record the Filer's task handle and hence do not use a broadcast message.
   --
   type Message_FilerOpenDir is
   record
   Header         : Message_Event_Header;
   FS_Number      : Integer;
   Flag           : Integer;
   Name           : Char_Array(1..208);
   end record;
   pragma Convention (C, Message_FilerOpenDir);

   type Message_FilerOpenDir_Pointer is access Message_FilerOpenDir;

   type AMEL_Message_FilerOpenDir is abstract new
        Message_EventListener(Message_Event_FilerOpenDir) with
   record
   Event : Message_FilerOpenDir_Pointer;
   end record;

   --
   -- All directories starting with given name wil be closed.
   --
   type Message_FilerCloseDir is
   record
   Header         : Message_Event_Header;
   FS_Number      : Integer;
   Flag           : Integer;
   Name           : Char_Array(1..208);
   end record;
   pragma Convention (C, Message_FilerCloseDir);

   type Message_FilerCloseDir_Pointer is access Message_FilerCloseDir;

   type AMEL_Message_FilerCloseDir is abstract new
        Message_EventListener(Message_Event_FilerCloseDir) with
   record
   Event : Message_FilerCloseDir_Pointer;
   end record;

   --
   -- This message is similar to Message_FilerOpenDir, but allows the position and mode of the viewer to be specified.
   --
   type Message_FilerOpenDirAt is
   record
   Header         : Message_Event_Header;
   FS_Number      : Integer;
   Flag           : Integer;
   X_Position     : Integer;
   Y_Position     : Integer;
   Width          : Integer;
   Height         : Integer;
   View_Mode      : Integer;
   Name           : Char_Array(1..200);
   end record;
   pragma Convention (C, Message_FilerOpenDirAt);

   type Message_FilerOpenDirAt_Pointer is access Message_FilerOpenDirAt;

   type AMEL_Message_FilerOpenDirAt is abstract new
        Message_EventListener(Message_Event_FilerOpenDirAt) with
   record
   Event : Message_FilerOpenDirAt_Pointer;
   end record;

   --
   --Sending this message to a Filer_Action task sets the directory to act on, and clears the list of leafnames.
   --
   type Message_FilerSelectionDirectory is
   record
   Header         : Message_Event_Header;
   Name           : Char_Array(1..208);
   end record;
   pragma Convention (C, Message_FilerSelectionDirectory);

   type Message_FilerSelectionDirectory_Pointer is access Message_FilerSelectionDirectory;

   type AMEL_Message_FilerSelectionDirectory is abstract new
        Message_EventListener(Message_Event_FilerSelectionDirectory) with
   record
   Event : Message_FilerSelectionDirectory_Pointer;
   end record;

   --
   -- Sending this message to a Filer_Action task adds the leafnames to the task's list of leafnames to act upon.
   --The leafnames are for files in the directory which has already been specified with Message_FilerSelectionDirectory.
   --
   --{fCode}Name_List{f} is a null terminated space seperated list of leafnames.
   --
   type Message_FilerAddSelection is
   record
   Header         : Message_Event_Header;
   Name_List      : Char_Array(1..208);
   end record;
   pragma Convention (C, Message_FilerAddSelection);

   type Message_FilerAddSelection_Pointer is access Message_FilerAddSelection;

   type AMEL_Message_FilerAddSelection is abstract new
        Message_EventListener(Message_Event_FilerAddSelection) with
   record
   Event : Message_FilerAddSelection_Pointer;
   end record;

   --
   -- Sending this message to a Filer_Action task both specifies and starts the operation to perform on the list of leafnames sent with Message_FilerAddSelection.
   --
   type Message_FilerAction is
   record
   Header         : Message_Event_Header;
   Operation      : FilerAction_Operation_Type;
   Options        : Integer;
   Data           : Integer;
   end record;
   pragma Convention (C, Message_FilerAction);

   type Message_FilerAction_Pointer is access Message_FilerAction;

   type AMEL_Message_FilerAction is abstract new
        Message_EventListener(Message_Event_FilerAction) with
   record
   Event : Message_FilerAction_Pointer;
   end record;

   --
   -- Sending this message to a Filer_Action task performs various controls.
   --'Acknowledge' can be used to see if the task is still busy.
   --
   type Message_FilerControlAction is
   record
   Header         : Message_Event_Header;
   Control        : Filer_Control_Action_Type;
   end record;
   pragma Convention (C, Message_FilerControlAction);

   type Message_FilerControlAction_Pointer is access Message_FilerControlAction;

   type AMEL_Message_FilerControlAction is abstract new
        Message_EventListener(Message_Event_FilerControlAction) with
   record
   Event : Message_FilerControlAction_Pointer;
   end record;

   --
   -- This message is sent from the filer to an application when a selection has been dragged, just before the application recieves the multiple DataLoad messages.
   --
   type Message_FilerSelection is
   record
   Header         : Message_Event_Header;
   BoundingBox_X0 : Integer;
   BoundingBox_Y0 : Integer;
   BoundingBox_X1 : Integer;
   BoundingBox_Y1 : Integer;
   Width          : Integer;
   Height         : Integer;
   View_Mode      : Integer;
   Start_Column   : Integer;
   Start_Row      : Integer;
   End_Column     : Integer;
   end_Row        : Integer;
   end record;
   pragma Convention (C, Message_FilerSelection);

   type Message_FilerSelection_Pointer is access Message_FilerSelection;

   type AMEL_Message_FilerSelection is abstract new
        Message_EventListener(Message_Event_FilerSelection) with
   record
   Event : Message_FilerSelection_Pointer;
   end record;

   --
   --
   --
   procedure Set_Selection_Directory (Block: in out Wimp_Block_Type;
                                      Path : in string );

   --
   -- This sends Message_FilerSelectionDirectory to the Filer_Action task.
   --
   procedure Send_Selected_Directory (Directory   : in string;
                                      Task_Handle : in integer);

   --
   -- Each filename has to be separated by a single space - {/}e.g.{/} '{fCode}File1 File2 File3{f}'.
   --This buffers filenames until it fills a message block, at which point it sends them to the Filer_Action task using Message_FilerAddSelection.
   --
   --To start the operation see FilerAction_SendStartOperation (which will first send any remaining buffered names to the task).
   --
   procedure Send_Selected_File (Filename    : in string;
                                 Task_Handle : in integer);

   --
   -- This SWI sends any remaining leafnames with Message_FilerAddSelection, then starts the selected operation by constructing and sending Message_FilerAction.
   --Reason dependent data is always a pointer, even for word sized data. Usually the data is a destination pathname.
   --
   procedure Send_Start_Operation (Path        : in string;
                                   Operation   : in FilerAction_Operation_Type;
                                   Task_Handle : in integer;
                                   Options     : in FilerAction_Option_Type := Verbose);

end RASCAL.FilerAction;
