#include "diawxgtk.h" /* Get the width of a notebook tab */ PRIVATE int BOOK::getpadwidth(int no) { wxClientDC dc(this); dc.SetFont (*font_prop); wxCoord fw,fh; dc.GetTextExtent (pads[no]->title,&fw,&fh); return (int)(fw + 2 * GetCharWidth()); } PUBLIC void BOOK::fitstrategie( int left, int top, bool use_cur_dim, wxSize &give) { int n = nbc; int max_page_width = 0; int max_page_height = 0; int padswidth = 0; int tbw[nbc],tbh[nbc]; wxClientDC dc(this); dc.SetFont (*font_prop); for (int i=0; ic->GetSize(&pagew,&pageh); }else{ if (item->pref_width == -1){ item->c->GetSize(&item->pref_width ,&item->pref_height); } pagew = item->pref_width; pageh = item->pref_height; } if (pagew > max_page_width) max_page_width = pagew; if (pageh > max_page_height) max_page_height = pageh; tbw[i] = pagew; tbh[i] = pageh; int padwidth = getpadwidth(i); pads[i]->start = padswidth; padswidth += padwidth; pads[i]->stop = padswidth; } scrollpad = false; if (padswidth > max_page_width){ scrollpad = true; }else{ offpad = 0; } int padsh = n > 0 ? 20 : 0; int bkwidth = max_page_width + left; int bkheight = max_page_height + top + padsh; b_offsety = bkheight; offsetx = left; offsety = top + padsh; for (int i=0; ic; wxFORMBASE *b = (wxFORMBASE*)c; #if 0 c->SetSize (offsetx,offsety,tbw[i],tbh[i]); if (b->may_stretch()){ b->stretch (bkwidth,tbh[i]); } #else // fprintf (stderr,"layoutbook %d %d %d %d\n",max_page_width,tbw[i],max_page_height,tbh[i]); int diffx = max_page_width - tbw[i]; int diffy = max_page_height - tbh[i]; b->resizeitems (diffx,diffy); b->SetSize (offsetx,offsety,-1,-1); #endif if (i==nopage){ c->Show(TRUE); }else{ c->Show(FALSE); } } if (n > 0){ int minwidth = pads[0]->stop + 25; if (bkwidth < minwidth) bkwidth = minwidth; //SetClientSize (bkwidth+3,bkheight+3); //SetSizeHints (bkwidth+3,bkheight+3); give.Set (bkwidth+3,bkheight+3); }else{ //SetClientSize (0,0); give.Set (0,0); } setpadvisible (nopage); } PUBLIC void BOOK::dolayout(int, int, bool, wxSize &give) { fitstrategie (3,0,true,give); } PUBLIC bool BOOK::doalllayout() { bool ret = false; #if 0 int maxw=0,maxh=0; for (int i=0; ic; b->doalllayout(); if (c->weightx ==0 && c->weighty == 0){ b->getweight(c->weightx,c->weighty); } int w,h; b->GetSize(&w,&h); if (w > maxw) maxw = w; if (h > maxh) maxh = h; } { int w,h; GetSize(&w,&h); if (w < maxw || h < maxh){ // fprintf (stderr,"BOOK::doalllayout %d %d <> %d %d\n",w,h,maxw,maxh); ret = true; } } if (!gettop()->was_resized() || !layout_once || ret){ wxSize give; fitstrategie (3,0,true,give); } if (pref_width == -1) GetSize (&pref_width,&pref_height); #endif return ret; } class BOOK_SIZER: public wxSizer{ int revlayout; BOOK *mf; int std_width,std_height; int last_width,last_height; /*~PROTOBEG~ BOOK_SIZER */ public: BOOK_SIZER (BOOK *_mf); protected: wxSize CalcMin (void); void RecalcSizes (void); public: void layout_if (void); /*~PROTOEND~ BOOK_SIZER */ }; extern int layout_indent; PUBLIC BOOK_SIZER::BOOK_SIZER(BOOK *_mf) { revlayout = -1; mf = _mf; std_width = std_height = -1; last_width = last_height = -1; } /* Compute the layout of the form to find its standard dimensions */ PUBLIC void BOOK_SIZER::layout_if() { int new_revlayout = mf->getrevlayout(); if (new_revlayout != revlayout){ revlayout = new_revlayout; wxSize give; mf->dolayout (1000,1000,false,give); last_width = std_width = give.GetWidth(); last_height = std_height = give.GetHeight(); //layout_debug (mf->id,"MinSize %d %d\n",std_width,std_height); SetMinSize (std_width,std_height); mf->SetSizeHints (std_width,std_height); mf->pref_width = std_width; mf->pref_height = std_height; } } PROTECTED wxSize BOOK_SIZER::CalcMin() { layout_if(); return wxSize (std_width,std_height); } PROTECTED void BOOK_SIZER::RecalcSizes() { layout_if(); int width,height; mf->GetClientSize (&width,&height); //layout_debug (mf->id,"RecalcSizes1 now[%d %d] last[ %d %d] std[%d %d]\n",width,height,last_width,last_height,std_width,std_height); //layout_indent++; if (last_width != width || last_height != height){ mf->resizeitems (width-last_width,height-last_height); last_width = width; last_height = height; } //layout_indent--; //layout_debug (mf->id,"RecalcSizes2 %d %d\n",m_size.GetWidth(),m_size.GetHeight()); } /* Register the general purpose layout engine as a sizer */ PRIVATE void BOOK::initsizer() { BOOK_SIZER *s = new BOOK_SIZER (this); SetSizer (s); }