package gui

import lang

$include "guih.icn"

#
# Simulate a V1 _Event, but within the gui package.
#
class _Event:Object(event, component, code)
   method get_event()
      return self.event
   end

   method get_code()
      return self.code
   end

   method get_component()
      return self.component
   end
end

#
# Convert a V2 style Event to a V1 _Event.
#
procedure V2TOV1(ev)
   local p, code, c

   #
   # V1 didn't have mouse movement, so speed things up
   # by ignoring these events.
   #
   if ev.get_param() === -12 then
      fail

   c := get_class_for_name(get_class_name(ev.get_source())).get_implemented_classes()

   if member(c, "gui__Button") then {
      code := case ev.get_type() of {
         BUTTON_PRESS_EVENT : 0
         BUTTON_RELEASE_EVENT : 1
         BUTTON_HELD_EVENT : -1
         ev.get_param() == ("\r"|"\l") &
         ACTION_EVENT : 2
         default: fail
      }
   }
   else if member(c, "gui__TextField") then {
      code := case ev.get_type() of {
         CONTENT_CHANGED_EVENT : 1
         ACTION_EVENT : 0
         default: fail
      }
   }
   else if member(c, "gui__ScrollBar") then {
      code := case ev.get_type() of {
         SCROLLBAR_PRESSED_EVENT : 0
         SCROLLBAR_DRAGGED_EVENT : 1
         default: fail
      }
   }
   else if member(c, "gui__Tree") then {
      code := case ev.get_type() of {
         CURSOR_MOVED_EVENT : 0
         SELECTION_CHANGED_EVENT : 1
         TREE_NODE_EXPANSION_EVENT : 2
         default: fail
      }
   }
   else if member(c, "gui__SelectableScrollArea") then {
      code := case ev.get_type() of {
         CURSOR_MOVED_EVENT : 0
         SELECTION_CHANGED_EVENT : 1
         default: fail
      }
   }
   else if member(c, "gui__Table") then {
      code := case ev.get_type() of {
         CURSOR_MOVED_EVENT : 0
         SELECTION_CHANGED_EVENT : 1
         default: fail
      }
   }
   else if member(c, "gui__EditableTextList") then {
      code := case ev.get_type() of {
         CURSOR_MOVED_EVENT |
         CONTENT_CHANGED_EVENT |
         SELECTION_CHANGED_EVENT : 0
         default: fail
      }
   }
   else if member(c, "gui__List") then {
      code := case ev.get_type() of {
         SELECTION_CHANGED_EVENT : 0
         default: fail
      }
   }
   else if member(c, "gui__EditList") then {
      code := case ev.get_type() of {
         SELECTION_CHANGED_EVENT : 0
         CONTENT_CHANGED_EVENT : 2
         default: fail
      }
   }
   else if member(c, "gui__MenuComponent") then {
      code := case ev.get_type() of {
         ACTION_EVENT : 0
         default: fail
      }
   }
   else
      code := 0

   #
   # Some components now return nested Event objects as the param
   # field; so go down to the lowest level if needed.
   #
   p := ev.get_param()
   while lang::is_instance(p, "util__Event") do
      p := p.get_param()

   return _Event(p, ev.get_source(), code)
end