-- модуль, который занимается расположением стрелочки на окне и самого окна со стрелочкой
arrow_setter = {}

-- функция для размещения стрелки у всплывающих окон
-- _widget - виджет у которого двигаем стрелочку и который располагаем
-- _offset - смещение на окне откуда должна исходить стрелочка
-- _arrow_offset - смещение стерлочки, в выбраном способе расположения
-- _limits - огранчиения за которые не должны выходить окна
-- _directions - приоритет направлений, который будет использоваться при выборе напровелния стрелки из доступных
	-- пример _directions = {"left_top_m", "left_top", "right_bottom", "left_bottom", "right_top"}
function arrow_setter.MoveArrow(_widget, _offset, _arrow_offset, _limits, _directions)
	-- таблица возможных вариантов расположения стрелочки
	arrow_setter.arrow_location_table = 
	{
		-- окно появялется справа сверху, стрелочка справа
		right_top_m = 
		{
			arrow_mirror = sf.misc.FloatVector(-1, 1),
			angle = 3.1415/2,
			get_arrow_offset = function (_dialog_size)
				return sf.misc.FloatVector(-_arrow_offset.Y, _dialog_size.Y - _arrow_offset.X)
			end,
			get_dialog_offset = function (_dialog_size, _arrow_size)
				return sf.misc.FloatVector(_arrow_size.Y + _arrow_offset.Y, -_dialog_size.Y+ _arrow_offset.X)
			end,
		},

		-- окно повялется слева сверху, стрелочка на окне снизу
		left_top_m = 
		{
			-- параметр, который своим наличием говорит о том что видже т стрелки нужно отобразить
			-- значения X и Y говорят по каким осям его отражать
			arrow_mirror = sf.misc.FloatVector(-1, 1),
			-- угол поворота виджета
			angle = 0,
			-- функция, которая возвращает оффсет видежта стрелки на окне
			get_arrow_offset = function (_dialog_size)
				return sf.misc.FloatVector(_dialog_size.X - _arrow_offset.X, _dialog_size.Y + _arrow_offset.Y) --_dialog_size.X + _arrow_offset.Y, _dialog_size.Y - _arrow_offset.X)
			end,
			-- функция, которая возвращает оффсет всего окна со стрелкой, что бы стрелка указывала в _offset
			get_dialog_offset = function (_dialog_size, _arrow_size)
				return sf.misc.FloatVector( -_dialog_size.X + _arrow_offset.X, - _dialog_size.Y - _arrow_size.Y - _arrow_offset.Y)
			end,
		},

		-- окно повялется слева сверху, стрелочка на окне слева
		left_top = 
		{
			angle = 3.1415/2*3,
			get_arrow_offset = function (_dialog_size)
				return sf.misc.FloatVector(_dialog_size.X + _arrow_offset.Y, _dialog_size.Y - _arrow_offset.X)
			end,
			get_dialog_offset = function (_dialog_size, _arrow_size)
				return sf.misc.FloatVector( -_dialog_size.X - _arrow_size.Y - _arrow_offset.Y, - _dialog_size.Y  + _arrow_offset.X)
			end,
		},

		-- окно снизу справа, стрелочка слева
		right_bottom = 
		{
			angle = 3.1415/2,
			get_arrow_offset = function (_dialog_size)
				return sf.misc.FloatVector(-_arrow_offset.Y, _arrow_offset.X)
			end,
			get_dialog_offset = function (_dialog_size, _arrow_size)
				return sf.misc.FloatVector(_arrow_size.Y + _arrow_offset.Y, - _arrow_offset.X)
			end,
		},
		
		-- окно слева снизу, стрелочка на онкне сверху
		
		left_bottom = 
		{
			angle = 3.1415,
			get_arrow_offset = function (_dialog_size)
				return sf.misc.FloatVector(_dialog_size.X - _arrow_offset.X, -_arrow_offset.Y)
			end,
			get_dialog_offset = function (_dialog_size, _arrow_size)
				return sf.misc.FloatVector(- (_dialog_size.X - _arrow_offset.X), _arrow_size.Y + _arrow_offset.Y)
			end,
		},

		-- окно справа сверху, стрелочка на окне снизу
		right_top = 
		{
			angle = 0,
			get_arrow_offset = function (_dialog_size)
				return sf.misc.FloatVector(_arrow_offset.X, _dialog_size.Y + _arrow_offset.Y)
			end,
			get_dialog_offset = function (_dialog_size, _arrow_size)
				return sf.misc.FloatVector( - _arrow_offset.X, - _arrow_size.Y - _arrow_offset.Y - _dialog_size.Y)
			end,
		},
	}
    
	-- получаем размер окна
	local dialog_size = _widget.GetSize()
    -- виджет стрелочки            
    local arrow_widget = __cast(_widget.GetWidget("bubblehelp_arrow_widget", true), sf.gui.CImageWidget)
    -- размер стрелочки
    local arrow_size = arrow_widget.GetSize()
	
    -- ищем расположение стрелочки, которое подходит нам
	local nice_direction = nil
	-- для этого обходим доступные расположения окна и смотрим удовлетовряют ли они ограничениям
    if _directions and #_directions > 0 then
		for _,id in pairs(_directions) do
			local o = arrow_setter.arrow_location_table[id]
			local dialog_offset = o.get_dialog_offset(dialog_size, arrow_size) + _offset
			if dialog_offset.X > _limits.left and 
			   dialog_offset.Y > _limits.top and 
			   dialog_offset.X + dialog_size.X < _limits.right and 
			   dialog_offset.Y + dialog_size.Y < _limits.bottom then
				
				nice_direction = o	
				break
			end
		end
		if nice_direction == nil then
			nice_direction = arrow_setter.arrow_location_table[_directions[1]]
		end
		
	else
		for i,o in pairs(arrow_setter.arrow_location_table) do
			local dialog_offset = o.get_dialog_offset(dialog_size, arrow_size) + _offset
			if dialog_offset.X > _limits.left and 
			   dialog_offset.Y > _limits.top and 
			   dialog_offset.X + dialog_size.X < _limits.right and 
			   dialog_offset.Y + dialog_size.Y < _limits.bottom then
				
				nice_direction = o	
				break
			end
		end
	end

	-- если не нашли, то принудительно ставим right_top
    if nice_direction == nil then
        nice_direction = arrow_setter.arrow_location_table["right_top"]
    end

    -- устанаваливаем смещение для виджета стрелочки
	local arrow_offset = nice_direction.get_arrow_offset(dialog_size) 
    arrow_widget.SetRotation(sf.misc.MatrixRotation(nice_direction.angle))
    arrow_widget.SetOffset(arrow_offset.X, arrow_offset.Y)
	-- если нужно отражаем стрелочку
	if nice_direction.arrow_mirror then
		arrow_size = arrow_widget.GetSize()
		arrow_widget.SetSize(arrow_size.X*nice_direction.arrow_mirror.X, arrow_size.Y*nice_direction.arrow_mirror.Y)
	end
    -- устанаваливаем смещение для окна
    local dialog_offset = nice_direction.get_dialog_offset(dialog_size, arrow_size)
    _widget.SetOffset(_offset.X + dialog_offset.X, _offset.Y + dialog_offset.Y)
end
