+bool wxSizerItem::InformFirstDirection(int direction, int size, int availableOtherDir)
+{
+ // The size that come here will be including borders. Child items should get it
+ // without borders.
+ if( size>0 )
+ {
+ if( direction==wxHORIZONTAL )
+ {
+ if (m_flag & wxWEST)
+ size -= m_border;
+ if (m_flag & wxEAST)
+ size -= m_border;
+ }
+ else if( direction==wxVERTICAL )
+ {
+ if (m_flag & wxNORTH)
+ size -= m_border;
+ if (m_flag & wxSOUTH)
+ size -= m_border;
+ }
+ }
+
+ bool didUse = false;
+ // Pass the information along to the held object
+ if (IsSizer())
+ {
+ didUse = GetSizer()->InformFirstDirection(direction,size,availableOtherDir);
+ if (didUse)
+ m_minSize = GetSizer()->CalcMin();
+ }
+ else if (IsWindow())
+ {
+ didUse = GetWindow()->InformFirstDirection(direction,size,availableOtherDir);
+ if (didUse)
+ m_minSize = m_window->GetEffectiveMinSize();
+
+ // This information is useful for items with wxSHAPED flag, since
+ // we can request an optimal min size for such an item. Even if
+ // we overwrite the m_minSize member here, we can read it back from
+ // the owned window (happens automatically).
+ if( (m_flag & wxSHAPED) && (m_flag & wxEXPAND) && direction )
+ {
+ if( !wxIsNullDouble(m_ratio) )
+ {
+ wxCHECK_MSG( (m_proportion==0), false, wxT("Shaped item, non-zero proportion in wxSizerItem::InformFirstDirection()") );
+ if( direction==wxHORIZONTAL && !wxIsNullDouble(m_ratio) )
+ {
+ // Clip size so that we don't take too much
+ if( availableOtherDir>=0 && int(size/m_ratio)-m_minSize.y>availableOtherDir )
+ size = int((availableOtherDir+m_minSize.y)*m_ratio);
+ m_minSize = wxSize(size,int(size/m_ratio));
+ }
+ else if( direction==wxVERTICAL )
+ {
+ // Clip size so that we don't take too much
+ if( availableOtherDir>=0 && int(size*m_ratio)-m_minSize.x>availableOtherDir )
+ size = int((availableOtherDir+m_minSize.x)/m_ratio);
+ m_minSize = wxSize(int(size*m_ratio),size);
+ }
+ didUse = true;
+ }
+ }
+ }
+
+ return didUse;
+}
+