# Copyright (C) 2017-2019  Ruby-GNOME2 Project Team
#
# 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., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA

module Pango
  class Loader < GObjectIntrospection::Loader
    private
    def pre_load(repository, namespace)
      @pending_attribute_infos = []
    end

    def post_load(repository, namespace)
      require_extension
      @pending_attribute_infos.each do |info|
        name = rubyish_class_name(info)
        klass = @base_module.const_get(name)
        prepare_class(klass) do
          load_fields(info, klass)
          load_methods(info, klass)
        end
      end
      require_libraries
      convert_attribute_classes
    end

    def convert_attribute_classes
      self.class.register_boxed_class_converter(Attribute.gtype) do |attribute|
        attribute.klass.type.to_class
      end
    end

    def load_struct_info(info)
      case info.name
      when "AttrClass"
        klass = self.class.define_struct(info.size,
                                         info.name,
                                         @base_module)
        load_fields(info, klass)
      when /Class\z/
        super
      when "Attribute", /\AAttr[A-Z]/
        @pending_attribute_infos << info
      else
        super
      end
    end

    def load_field_reader(info, i, field_info, klass, name, method_name)
      case klass.name
      when "Pango::AttrShape"
        return if klass.method_defined?(method_name)
      end
      super
    end

    def load_method_info(info, klass, method_name)
      case klass.name
      when "Pango::Matrix"
        case method_name
        when "translate", "scale", "rotate", "concat"
          method_name += "!"
        end
      when "Pango::AttrList", "Pango::AttrIterator"
        return if klass.method_defined?(method_name)
      end
      super(info, klass, method_name)
    end

    def require_extension
      require "pango.so"
    end

    def require_libraries
      require "pango/attr-list"
      require "pango/attr-type"
      require "pango/color"
      require "pango/font-description"
      require "pango/language"
      require "pango/layout"
      require "pango/rectangle"
      require "pango/markup"
      require "pango/matrix"
      require "pango/version"

      require "pango/deprecated"
    end
  end
end
