]> git.saurik.com Git - wxWidgets.git/blob - src/common/layout.cpp
Unregister wake up pipe file fd in ~wxConsoleEventLoop.
[wxWidgets.git] / src / common / layout.cpp
1 /////////////////////////////////////////////////////////////////////////////
2 // Name:        src/common/layout.cpp
3 // Purpose:     Constraint layout system classes
4 // Author:      Julian Smart
5 // Modified by:
6 // Created:     04/01/98
7 // RCS-ID:      $Id$
8 // Copyright:   (c) Julian Smart
9 // Licence:     wxWindows licence
10 /////////////////////////////////////////////////////////////////////////////
11
12 // =============================================================================
13 // declarations
14 // =============================================================================
15
16 // ----------------------------------------------------------------------------
17 // headers
18 // ----------------------------------------------------------------------------
19
20 // For compilers that support precompilation, includes "wx.h".
21 #include "wx/wxprec.h"
22
23 #ifdef __BORLANDC__
24     #pragma hdrstop
25 #endif
26
27 #if wxUSE_CONSTRAINTS
28
29 #include "wx/layout.h"
30
31 #ifndef WX_PRECOMP
32     #include "wx/window.h"
33     #include "wx/utils.h"
34     #include "wx/dialog.h"
35     #include "wx/msgdlg.h"
36     #include "wx/intl.h"
37 #endif
38
39
40 IMPLEMENT_DYNAMIC_CLASS(wxIndividualLayoutConstraint, wxObject)
41 IMPLEMENT_DYNAMIC_CLASS(wxLayoutConstraints, wxObject)
42
43
44 inline void wxGetAsIs(wxWindowBase* win, int* w, int* h)
45 {
46 #if 1
47     // The old way.  Works for me.
48     win->GetSize(w, h);
49 #endif
50
51 #if 0
52     // Vadim's change.  Breaks wxPython's LayoutAnchors
53     win->GetBestSize(w, h);
54 #endif
55
56 #if 0
57     // Proposed compromise.  Doesn't work.
58     int sw, sh, bw, bh;
59     win->GetSize(&sw, &sh);
60     win->GetBestSize(&bw, &bh);
61     if (w)
62         *w = wxMax(sw, bw);
63     if (h)
64         *h = wxMax(sh, bh);
65 #endif
66 }
67
68
69 wxIndividualLayoutConstraint::wxIndividualLayoutConstraint()
70 {
71     myEdge = wxTop;
72     relationship = wxUnconstrained;
73     margin = 0;
74     value = 0;
75     percent = 0;
76     otherEdge = wxTop;
77     done = false;
78     otherWin = NULL;
79 }
80
81 void wxIndividualLayoutConstraint::Set(wxRelationship rel, wxWindowBase *otherW, wxEdge otherE, int val, int marg)
82 {
83     if (rel == wxSameAs)
84     {
85         // If Set is called by the user with wxSameAs then call SameAs to do
86         // it since it will actually use wxPercent instead.
87         SameAs(otherW, otherE, marg);
88         return;
89     }
90
91     relationship = rel;
92     otherWin = otherW;
93     otherEdge = otherE;
94
95     if ( rel == wxPercentOf )
96     {
97         percent = val;
98     }
99     else
100     {
101         value = val;
102     }
103
104     margin = marg;
105 }
106
107 void wxIndividualLayoutConstraint::LeftOf(wxWindowBase *sibling, int marg)
108 {
109     Set(wxLeftOf, sibling, wxLeft, 0, marg);
110 }
111
112 void wxIndividualLayoutConstraint::RightOf(wxWindowBase *sibling, int marg)
113 {
114     Set(wxRightOf, sibling, wxRight, 0, marg);
115 }
116
117 void wxIndividualLayoutConstraint::Above(wxWindowBase *sibling, int marg)
118 {
119     Set(wxAbove, sibling, wxTop, 0, marg);
120 }
121
122 void wxIndividualLayoutConstraint::Below(wxWindowBase *sibling, int marg)
123 {
124     Set(wxBelow, sibling, wxBottom, 0, marg);
125 }
126
127 //
128 // 'Same edge' alignment
129 //
130 void wxIndividualLayoutConstraint::SameAs(wxWindowBase *otherW, wxEdge edge, int marg)
131 {
132     Set(wxPercentOf, otherW, edge, 100, marg);
133 }
134
135 // The edge is a percentage of the other window's edge
136 void wxIndividualLayoutConstraint::PercentOf(wxWindowBase *otherW, wxEdge wh, int per)
137 {
138     Set(wxPercentOf, otherW, wh, per);
139 }
140
141 //
142 // Edge has absolute value
143 //
144 void wxIndividualLayoutConstraint::Absolute(int val)
145 {
146     value = val;
147     relationship = wxAbsolute;
148 }
149
150 // Reset constraint if it mentions otherWin
151 bool wxIndividualLayoutConstraint::ResetIfWin(wxWindowBase *otherW)
152 {
153     if (otherW == otherWin)
154     {
155         myEdge = wxTop;
156         relationship = wxAsIs;
157         margin = 0;
158         value = 0;
159         percent = 0;
160         otherEdge = wxTop;
161         otherWin = NULL;
162         return true;
163     }
164
165     return false;
166 }
167
168 // Try to satisfy constraint
169 bool wxIndividualLayoutConstraint::SatisfyConstraint(wxLayoutConstraints *constraints, wxWindowBase *win)
170 {
171     if (relationship == wxAbsolute)
172     {
173         done = true;
174         return true;
175     }
176
177     switch (myEdge)
178     {
179         case wxLeft:
180         {
181             switch (relationship)
182             {
183                 case wxLeftOf:
184                 {
185                     // We can know this edge if: otherWin is win's
186                     // parent, or otherWin has a satisfied constraint,
187                     // or otherWin has no constraint.
188                     int edgePos = GetEdge(otherEdge, win, otherWin);
189                     if (edgePos != -1)
190                     {
191                         value = edgePos - margin;
192                         done = true;
193                         return true;
194                     }
195                     else
196                         return false;
197                 }
198                 case wxRightOf:
199                 {
200                     int edgePos = GetEdge(otherEdge, win, otherWin);
201                     if (edgePos != -1)
202                     {
203                         value = edgePos + margin;
204                         done = true;
205                         return true;
206                     }
207                     else
208                         return false;
209                 }
210                 case wxPercentOf:
211                 {
212                     int edgePos = GetEdge(otherEdge, win, otherWin);
213                     if (edgePos != -1)
214                     {
215                         value = (int)(edgePos*(((float)percent)*0.01) + margin);
216                         done = true;
217                         return true;
218                     }
219                     else
220                         return false;
221                 }
222                 case wxUnconstrained:
223                 {
224                     // We know the left-hand edge position if we know
225                     // the right-hand edge and we know the width; OR if
226                     // we know the centre and the width.
227                     if (constraints->right.GetDone() && constraints->width.GetDone())
228                     {
229                         value = (constraints->right.GetValue() - constraints->width.GetValue() + margin);
230                         done = true;
231                         return true;
232                     }
233                     else if (constraints->centreX.GetDone() && constraints->width.GetDone())
234                     {
235                         value = (int)(constraints->centreX.GetValue() - (constraints->width.GetValue()/2) + margin);
236                         done = true;
237                         return true;
238                     }
239                     else
240                         return false;
241                 }
242                 case wxAsIs:
243                 {
244                     int y;
245                     win->GetPosition(&value, &y);
246                     done = true;
247                     return true;
248                 }
249                 default:
250                     break;
251             }
252             break;
253         }
254         case wxRight:
255         {
256             switch (relationship)
257             {
258                 case wxLeftOf:
259                 {
260                     // We can know this edge if: otherWin is win's
261                     // parent, or otherWin has a satisfied constraint,
262                     // or otherWin has no constraint.
263                     int edgePos = GetEdge(otherEdge, win, otherWin);
264                     if (edgePos != -1)
265                     {
266                         value = edgePos - margin;
267                         done = true;
268                         return true;
269                     }
270                     else
271                         return false;
272                 }
273                 case wxRightOf:
274                 {
275                     int edgePos = GetEdge(otherEdge, win, otherWin);
276                     if (edgePos != -1)
277                     {
278                         value = edgePos + margin;
279                         done = true;
280                         return true;
281                     }
282                     else
283                         return false;
284                 }
285                 case wxPercentOf:
286                 {
287                     int edgePos = GetEdge(otherEdge, win, otherWin);
288                     if (edgePos != -1)
289                     {
290                         value = (int)(edgePos*(((float)percent)*0.01) - margin);
291                         done = true;
292                         return true;
293                     }
294                     else
295                         return false;
296                 }
297                 case wxUnconstrained:
298                 {
299                     // We know the right-hand edge position if we know the
300                     // left-hand edge and we know the width, OR if we know the
301                     // centre edge and the width.
302                     if (constraints->left.GetDone() && constraints->width.GetDone())
303                     {
304                         value = (constraints->left.GetValue() + constraints->width.GetValue() - margin);
305                         done = true;
306                         return true;
307                     }
308                     else if (constraints->centreX.GetDone() && constraints->width.GetDone())
309                     {
310                         value = (int)(constraints->centreX.GetValue() + (constraints->width.GetValue()/2) - margin);
311                         done = true;
312                         return true;
313                     }
314                     else
315                         return false;
316                 }
317                 case wxAsIs:
318                 {
319                     int x, y;
320                     int w, h;
321                     wxGetAsIs(win, &w, &h);
322                     win->GetPosition(&x, &y);
323                     value = x + w;
324                     done = true;
325                     return true;
326                 }
327                 default:
328                     break;
329             }
330             break;
331         }
332         case wxTop:
333         {
334             switch (relationship)
335             {
336                 case wxAbove:
337                 {
338                     // We can know this edge if: otherWin is win's
339                     // parent, or otherWin has a satisfied constraint,
340                     // or otherWin has no constraint.
341                     int edgePos = GetEdge(otherEdge, win, otherWin);
342                     if (edgePos != -1)
343                     {
344                         value = edgePos - margin;
345                         done = true;
346                         return true;
347                     }
348                     else
349                         return false;
350                 }
351                 case wxBelow:
352                 {
353                     int edgePos = GetEdge(otherEdge, win, otherWin);
354                     if (edgePos != -1)
355                     {
356                         value = edgePos + margin;
357                         done = true;
358                         return true;
359                     }
360                     else
361                         return false;
362                 }
363                 case wxPercentOf:
364                 {
365                     int edgePos = GetEdge(otherEdge, win, otherWin);
366                     if (edgePos != -1)
367                     {
368                         value = (int)(edgePos*(((float)percent)*0.01) + margin);
369                         done = true;
370                         return true;
371                     }
372                     else
373                         return false;
374                 }
375                 case wxUnconstrained:
376                 {
377                     // We know the top edge position if we know the bottom edge
378                     // and we know the height; OR if we know the centre edge and
379                     // the height.
380                     if (constraints->bottom.GetDone() && constraints->height.GetDone())
381                     {
382                         value = (constraints->bottom.GetValue() - constraints->height.GetValue() + margin);
383                         done = true;
384                         return true;
385                     }
386                     else if (constraints->centreY.GetDone() && constraints->height.GetDone())
387                     {
388                         value = (constraints->centreY.GetValue() - (constraints->height.GetValue()/2) + margin);
389                         done = true;
390                         return true;
391                     }
392                     else
393                         return false;
394                 }
395                 case wxAsIs:
396                 {
397                     int x;
398                     win->GetPosition(&x, &value);
399                     done = true;
400                     return true;
401                 }
402                 default:
403                     break;
404             }
405             break;
406         }
407         case wxBottom:
408         {
409             switch (relationship)
410             {
411                 case wxAbove:
412                 {
413                     // We can know this edge if: otherWin is win's parent,
414                     // or otherWin has a satisfied constraint, or
415                     // otherWin has no constraint.
416                     int edgePos = GetEdge(otherEdge, win, otherWin);
417                     if (edgePos != -1)
418                     {
419                         value = edgePos + margin;
420                         done = true;
421                         return true;
422                     }
423                     else
424                         return false;
425                 }
426                 case wxBelow:
427                 {
428                     int edgePos = GetEdge(otherEdge, win, otherWin);
429                     if (edgePos != -1)
430                     {
431                         value = edgePos - margin;
432                         done = true;
433                         return true;
434                     }
435                     else
436                         return false;
437                 }
438                 case wxPercentOf:
439                 {
440                     int edgePos = GetEdge(otherEdge, win, otherWin);
441                     if (edgePos != -1)
442                     {
443                         value = (int)(edgePos*(((float)percent)*0.01) - margin);
444                         done = true;
445                         return true;
446                     }
447                     else
448                         return false;
449                 }
450                 case wxUnconstrained:
451                 {
452                     // We know the bottom edge position if we know the top edge
453                     // and we know the height; OR if we know the centre edge and
454                     // the height.
455                     if (constraints->top.GetDone() && constraints->height.GetDone())
456                     {
457                         value = (constraints->top.GetValue() + constraints->height.GetValue() - margin);
458                         done = true;
459                         return true;
460                     }
461                     else if (constraints->centreY.GetDone() && constraints->height.GetDone())
462                     {
463                         value = (constraints->centreY.GetValue() + (constraints->height.GetValue()/2) - margin);
464                         done = true;
465                         return true;
466                     }
467                     else
468                         return false;
469                 }
470                 case wxAsIs:
471                 {
472                     int x, y;
473                     int w, h;
474                     wxGetAsIs(win, &w, &h);
475                     win->GetPosition(&x, &y);
476                     value = h + y;
477                     done = true;
478                     return true;
479                 }
480                 default:
481                     break;
482             }
483             break;
484         }
485         case wxCentreX:
486         {
487             switch (relationship)
488             {
489                 case wxLeftOf:
490                 {
491                     // We can know this edge if: otherWin is win's parent, or
492                     // otherWin has a satisfied constraint, or otherWin has no
493                     // constraint.
494                     int edgePos = GetEdge(otherEdge, win, otherWin);
495                     if (edgePos != -1)
496                     {
497                         value = edgePos - margin;
498                         done = true;
499                         return true;
500                     }
501                     else
502                         return false;
503                 }
504                 case wxRightOf:
505                 {
506                     int edgePos = GetEdge(otherEdge, win, otherWin);
507                     if (edgePos != -1)
508                     {
509                         value = edgePos + margin;
510                         done = true;
511                         return true;
512                     }
513                     else
514                         return false;
515                 }
516                 case wxPercentOf:
517                 {
518                     int edgePos = GetEdge(otherEdge, win, otherWin);
519                     if (edgePos != -1)
520                     {
521                         value = (int)(edgePos*(((float)percent)*0.01) + margin);
522                         done = true;
523                         return true;
524                     }
525                     else
526                         return false;
527                 }
528                 case wxUnconstrained:
529                 {
530                     // We know the centre position if we know
531                     // the left-hand edge and we know the width, OR
532                     // the right-hand edge and the width
533                     if (constraints->left.GetDone() && constraints->width.GetDone())
534                     {
535                         value = (int)(constraints->left.GetValue() + (constraints->width.GetValue()/2) + margin);
536                         done = true;
537                         return true;
538                     }
539                     else if (constraints->right.GetDone() && constraints->width.GetDone())
540                     {
541                         value = (int)(constraints->left.GetValue() - (constraints->width.GetValue()/2) + margin);
542                         done = true;
543                         return true;
544                     }
545                     else
546                         return false;
547                 }
548                 default:
549                     break;
550             }
551             break;
552         }
553         case wxCentreY:
554         {
555             switch (relationship)
556             {
557                 case wxAbove:
558                 {
559                     // We can know this edge if: otherWin is win's parent,
560                     // or otherWin has a satisfied constraint, or otherWin
561                     // has no constraint.
562                     int edgePos = GetEdge(otherEdge, win, otherWin);
563                     if (edgePos != -1)
564                     {
565                         value = edgePos - margin;
566                         done = true;
567                         return true;
568                     }
569                     else
570                         return false;
571                 }
572                 case wxBelow:
573                 {
574                     int edgePos = GetEdge(otherEdge, win, otherWin);
575                     if (edgePos != -1)
576                     {
577                         value = edgePos + margin;
578                         done = true;
579                         return true;
580                     }
581                     else
582                         return false;
583                 }
584                 case wxPercentOf:
585                 {
586                     int edgePos = GetEdge(otherEdge, win, otherWin);
587                     if (edgePos != -1)
588                     {
589                         value = (int)(edgePos*(((float)percent)*0.01) + margin);
590                         done = true;
591                         return true;
592                     }
593                     else
594                         return false;
595                 }
596                 case wxUnconstrained:
597                 {
598                     // We know the centre position if we know
599                     // the top edge and we know the height, OR
600                     // the bottom edge and the height.
601                     if (constraints->bottom.GetDone() && constraints->height.GetDone())
602                     {
603                         value = (int)(constraints->bottom.GetValue() - (constraints->height.GetValue()/2) + margin);
604                         done = true;
605                         return true;
606                     }
607                     else if (constraints->top.GetDone() && constraints->height.GetDone())
608                     {
609                         value = (int)(constraints->top.GetValue() + (constraints->height.GetValue()/2) + margin);
610                         done = true;
611                         return true;
612                     }
613                     else
614                         return false;
615                 }
616                 default:
617                     break;
618             }
619             break;
620         }
621         case wxWidth:
622         {
623             switch (relationship)
624             {
625                 case wxPercentOf:
626                 {
627                     int edgePos = GetEdge(otherEdge, win, otherWin);
628                     if (edgePos != -1)
629                     {
630                         value = (int)(edgePos*(((float)percent)*0.01));
631                         done = true;
632                         return true;
633                     }
634                     else
635                         return false;
636                 }
637                 case wxAsIs:
638                 {
639                     if (win)
640                     {
641                         int h;
642                         wxGetAsIs(win, &value, &h);
643                         done = true;
644                         return true;
645                     }
646                     else return false;
647                 }
648                 case wxUnconstrained:
649                 {
650                     // We know the width if we know the left edge and the right edge, OR
651                     // if we know the left edge and the centre, OR
652                     // if we know the right edge and the centre
653                     if (constraints->left.GetDone() && constraints->right.GetDone())
654                     {
655                         value = constraints->right.GetValue() - constraints->left.GetValue();
656                         done = true;
657                         return true;
658                     }
659                     else if (constraints->centreX.GetDone() && constraints->left.GetDone())
660                     {
661                         value = (int)(2*(constraints->centreX.GetValue() - constraints->left.GetValue()));
662                         done = true;
663                         return true;
664                     }
665                     else if (constraints->centreX.GetDone() && constraints->right.GetDone())
666                     {
667                         value = (int)(2*(constraints->right.GetValue() - constraints->centreX.GetValue()));
668                         done = true;
669                         return true;
670                     }
671                     else
672                         return false;
673                 }
674                 default:
675                     break;
676             }
677             break;
678         }
679         case wxHeight:
680         {
681             switch (relationship)
682             {
683                 case wxPercentOf:
684                 {
685                     int edgePos = GetEdge(otherEdge, win, otherWin);
686                     if (edgePos != -1)
687                     {
688                         value = (int)(edgePos*(((float)percent)*0.01));
689                         done = true;
690                         return true;
691                     }
692                     else
693                         return false;
694                 }
695                 case wxAsIs:
696                 {
697                     if (win)
698                     {
699                         int w;
700                         wxGetAsIs(win, &w, &value);
701                         done = true;
702                         return true;
703                     }
704                     else return false;
705                 }
706                 case wxUnconstrained:
707                 {
708                     // We know the height if we know the top edge and the bottom edge, OR
709                     // if we know the top edge and the centre, OR
710                     // if we know the bottom edge and the centre
711                     if (constraints->top.GetDone() && constraints->bottom.GetDone())
712                     {
713                         value = constraints->bottom.GetValue() - constraints->top.GetValue();
714                         done = true;
715                         return true;
716                     }
717                     else if (constraints->top.GetDone() && constraints->centreY.GetDone())
718                     {
719                         value = (int)(2*(constraints->centreY.GetValue() - constraints->top.GetValue()));
720                         done = true;
721                         return true;
722                     }
723                     else if (constraints->bottom.GetDone() && constraints->centreY.GetDone())
724                     {
725                         value = (int)(2*(constraints->bottom.GetValue() - constraints->centreY.GetValue()));
726                         done = true;
727                         return true;
728                     }
729                     else
730                         return false;
731                 }
732                 default:
733                     break;
734             }
735             break;
736         }
737         default:
738             break;
739     }
740     return false;
741 }
742
743 // Get the value of this edge or dimension, or if this is not determinable, -1.
744 int wxIndividualLayoutConstraint::GetEdge(wxEdge which,
745                                           wxWindowBase *thisWin,
746                                           wxWindowBase *other) const
747 {
748     // If the edge or dimension belongs to the parent, then we know the
749     // dimension is obtainable immediately. E.g. a wxExpandSizer may contain a
750     // button (but the button's true parent is a panel, not the sizer)
751     if (other->GetChildren().Find((wxWindow*)thisWin))
752     {
753         switch (which)
754         {
755             case wxLeft:
756                 {
757                     return 0;
758                 }
759             case wxTop:
760                 {
761                     return 0;
762                 }
763             case wxRight:
764                 {
765                     int w, h;
766                     other->GetClientSizeConstraint(&w, &h);
767                     return w;
768                 }
769             case wxBottom:
770                 {
771                     int w, h;
772                     other->GetClientSizeConstraint(&w, &h);
773                     return h;
774                 }
775             case wxWidth:
776                 {
777                     int w, h;
778                     other->GetClientSizeConstraint(&w, &h);
779                     return w;
780                 }
781             case wxHeight:
782                 {
783                     int w, h;
784                     other->GetClientSizeConstraint(&w, &h);
785                     return h;
786                 }
787             case wxCentreX:
788             case wxCentreY:
789                 {
790                     int w, h;
791                     other->GetClientSizeConstraint(&w, &h);
792                     if (which == wxCentreX)
793                         return (int)(w/2);
794                     else
795                         return (int)(h/2);
796                 }
797             default:
798                 return -1;
799         }
800     }
801     switch (which)
802     {
803         case wxLeft:
804             {
805                 wxLayoutConstraints *constr = other->GetConstraints();
806                 // If no constraints, it means the window is not dependent
807                 // on anything, and therefore we know its value immediately
808                 if (constr)
809                 {
810                     if (constr->left.GetDone())
811                         return constr->left.GetValue();
812                     else
813                         return -1;
814                 }
815                 else
816                 {
817                     int x, y;
818                     other->GetPosition(&x, &y);
819                     return x;
820                 }
821             }
822         case wxTop:
823             {
824                 wxLayoutConstraints *constr = other->GetConstraints();
825                 // If no constraints, it means the window is not dependent
826                 // on anything, and therefore we know its value immediately
827                 if (constr)
828                 {
829                     if (constr->top.GetDone())
830                         return constr->top.GetValue();
831                     else
832                         return -1;
833                 }
834                 else
835                 {
836                     int x, y;
837                     other->GetPosition(&x, &y);
838                     return y;
839                 }
840             }
841         case wxRight:
842             {
843                 wxLayoutConstraints *constr = other->GetConstraints();
844                 // If no constraints, it means the window is not dependent
845                 // on anything, and therefore we know its value immediately
846                 if (constr)
847                 {
848                     if (constr->right.GetDone())
849                         return constr->right.GetValue();
850                     else
851                         return -1;
852                 }
853                 else
854                 {
855                     int x, y, w, h;
856                     other->GetPosition(&x, &y);
857                     other->GetSize(&w, &h);
858                     return (int)(x + w);
859                 }
860             }
861         case wxBottom:
862             {
863                 wxLayoutConstraints *constr = other->GetConstraints();
864                 // If no constraints, it means the window is not dependent
865                 // on anything, and therefore we know its value immediately
866                 if (constr)
867                 {
868                     if (constr->bottom.GetDone())
869                         return constr->bottom.GetValue();
870                     else
871                         return -1;
872                 }
873                 else
874                 {
875                     int x, y, w, h;
876                     other->GetPosition(&x, &y);
877                     other->GetSize(&w, &h);
878                     return (int)(y + h);
879                 }
880             }
881         case wxWidth:
882             {
883                 wxLayoutConstraints *constr = other->GetConstraints();
884                 // If no constraints, it means the window is not dependent
885                 // on anything, and therefore we know its value immediately
886                 if (constr)
887                 {
888                     if (constr->width.GetDone())
889                         return constr->width.GetValue();
890                     else
891                         return -1;
892                 }
893                 else
894                 {
895                     int w, h;
896                     other->GetSize(&w, &h);
897                     return w;
898                 }
899             }
900         case wxHeight:
901             {
902                 wxLayoutConstraints *constr = other->GetConstraints();
903                 // If no constraints, it means the window is not dependent
904                 // on anything, and therefore we know its value immediately
905                 if (constr)
906                 {
907                     if (constr->height.GetDone())
908                         return constr->height.GetValue();
909                     else
910                         return -1;
911                 }
912                 else
913                 {
914                     int w, h;
915                     other->GetSize(&w, &h);
916                     return h;
917                 }
918             }
919         case wxCentreX:
920             {
921                 wxLayoutConstraints *constr = other->GetConstraints();
922                 // If no constraints, it means the window is not dependent
923                 // on anything, and therefore we know its value immediately
924                 if (constr)
925                 {
926                     if (constr->centreX.GetDone())
927                         return constr->centreX.GetValue();
928                     else
929                         return -1;
930                 }
931                 else
932                 {
933                     int x, y, w, h;
934                     other->GetPosition(&x, &y);
935                     other->GetSize(&w, &h);
936                     return (int)(x + (w/2));
937                 }
938             }
939         case wxCentreY:
940             {
941                 wxLayoutConstraints *constr = other->GetConstraints();
942                 // If no constraints, it means the window is not dependent
943                 // on anything, and therefore we know its value immediately
944                 if (constr)
945                 {
946                     if (constr->centreY.GetDone())
947                         return constr->centreY.GetValue();
948                     else
949                         return -1;
950                 }
951                 else
952                 {
953                     int x, y, w, h;
954                     other->GetPosition(&x, &y);
955                     other->GetSize(&w, &h);
956                     return (int)(y + (h/2));
957                 }
958             }
959         default:
960             break;
961     }
962     return -1;
963 }
964
965 wxLayoutConstraints::wxLayoutConstraints()
966 {
967     left.SetEdge(wxLeft);
968     top.SetEdge(wxTop);
969     right.SetEdge(wxRight);
970     bottom.SetEdge(wxBottom);
971     centreX.SetEdge(wxCentreX);
972     centreY.SetEdge(wxCentreY);
973     width.SetEdge(wxWidth);
974     height.SetEdge(wxHeight);
975 }
976
977 bool wxLayoutConstraints::SatisfyConstraints(wxWindowBase *win, int *nChanges)
978 {
979     int noChanges = 0;
980
981     bool done = width.GetDone();
982     bool newDone = (done ? true : width.SatisfyConstraint(this, win));
983     if (newDone != done)
984         noChanges ++;
985
986     done = height.GetDone();
987     newDone = (done ? true : height.SatisfyConstraint(this, win));
988     if (newDone != done)
989         noChanges ++;
990
991     done = left.GetDone();
992     newDone = (done ? true : left.SatisfyConstraint(this, win));
993     if (newDone != done)
994         noChanges ++;
995
996     done = top.GetDone();
997     newDone = (done ? true : top.SatisfyConstraint(this, win));
998     if (newDone != done)
999         noChanges ++;
1000
1001     done = right.GetDone();
1002     newDone = (done ? true : right.SatisfyConstraint(this, win));
1003     if (newDone != done)
1004         noChanges ++;
1005
1006     done = bottom.GetDone();
1007     newDone = (done ? true : bottom.SatisfyConstraint(this, win));
1008     if (newDone != done)
1009         noChanges ++;
1010
1011     done = centreX.GetDone();
1012     newDone = (done ? true : centreX.SatisfyConstraint(this, win));
1013     if (newDone != done)
1014         noChanges ++;
1015
1016     done = centreY.GetDone();
1017     newDone = (done ? true : centreY.SatisfyConstraint(this, win));
1018     if (newDone != done)
1019         noChanges ++;
1020
1021     *nChanges = noChanges;
1022
1023     return AreSatisfied();
1024 }
1025
1026 #endif // wxUSE_CONSTRAINTS