# Copyright (c) 2023 M.J.N. Corino, The Netherlands
#
# This software is released under the MIT license.

###
# wxRuby3 wxWidgets interface director
###

require_relative './window'

module WXRuby3

  class Director

    class PropertyGridManager < Window

      include Typemap::PGPropArg

      def setup
        super
        spec.override_inheritance_chain('wxPropertyGridManager', %w[wxPanel wxWindow wxEvtHandler wxObject])
        spec.add_swig_code 'typedef const wxPGPropArgCls& wxPGPropArg;'
        # mixin PropertyGridInterface
        spec.include_mixin 'wxPropertyGridManager', 'Wx::PG::PropertyGridInterface'
        # for AddPage and InsertPage
        spec.disown 'wxPropertyGridPage *pageObj'
        spec.suppress_warning(473, 'wxPropertyGridManager::InsertPage')
        # do not expose iterator class; #each_property provided by PropertyGridInterface mixin
        spec.ignore 'wxPropertyGridManager::GetVIterator'
        # customize mark function
        spec.add_header_code <<~__HEREDOC
          static void GC_mark_wxPropertyGridManager(void* ptr) 
          {
          #ifdef __WXRB_DEBUG__
            if (wxRuby_TraceLevel()>1)
              std::wcout << "> GC_mark_wxPropertyGridManager : " << ptr << std::endl;
          #endif
            if ( GC_IsWindowDeleted(ptr) )
            {
              return;
            }
            // Do standard marking routines as for all wxWindows
            GC_mark_wxWindow(ptr);
            
            wxPropertyGridManager* wx_pg = (wxPropertyGridManager*) ptr;

            // mark all properties of all pages
          #ifdef __WXRB_DEBUG__
            long l = 0;
          #endif
            for (size_t i=0; i < wx_pg->GetPageCount() ;++i)
            {
              wxPGVIterator it =
                  wx_pg->GetPage(i)->GetVIterator(wxPG_ITERATOR_FLAGS_ALL | wxPG_IT_CHILDREN(wxPG_ITERATOR_FLAGS_ALL));
              // iterate all
              for ( ; !it.AtEnd(); it.Next() )
              {
          #ifdef __WXRB_DEBUG__
                ++l;
          #endif
                wxPGProperty* p = it.GetProperty();
                VALUE rb_p = SWIG_RubyInstanceFor(p);
                if (NIL_P(rb_p))
                {
                  VALUE object = (VALUE) p->GetClientData();
                  if ( object && !NIL_P(object))
                  {
          #ifdef __WXRB_DEBUG__
                    if (wxRuby_TraceLevel()>2)
                      std::wcout << "*** marking property data " << p << ":" << p->GetName() << std::endl;
          #endif
                    rb_gc_mark(object);
                  }
                }
                else
                {
                  rb_gc_mark(rb_p);
                }
              }
            }
          #ifdef __WXRB_DEBUG__
            if (wxRuby_TraceLevel()>1)
              std::wcout << "*** iterated " << l << " properties" << std::endl;
          #endif
          }
        __HEREDOC
        spec.add_swig_code '%markfunc wxPropertyGridManager "GC_mark_wxPropertyGridManager";'
      end
    end # class PropertyGridManager

  end # class Director

end # module WXRuby3
