00001
00002
00120 #include "Defs.h"
00121 #include "wx/defs.h"
00122
00123 #include "IconShape.h"
00124
00125
00126
00127
00128
00129
00130
00131 IMPLEMENT_DYNAMIC_CLASS(MutIconShape, MutPanel)
00132
00133 BEGIN_EVENT_TABLE(MutIconShape, MutPanel)
00134 EVT_PAINT(MutIconShape::OnPaint)
00135 EVT_SET_FOCUS(MutIconShape::OnGetFocus)
00136 EVT_KILL_FOCUS(MutIconShape::OnKillFocus)
00137 EVT_CLOSE(MutIconShape::DeleteSelfEvent)
00138 END_EVENT_TABLE()
00139
00140 bool MutIconShape::Create (wxWindow * parent, wxWindowID id)
00141 {
00142 DEBUGLOG (other,_T (""));
00143
00144
00145 if (!MutPanel::Create(parent,id,wxDefaultPosition,wxDefaultSize,wxBORDER_RAISED | wxTAB_TRAVERSAL)) return false;
00146 Icon = GetMutIcon();
00147 wxASSERT(Icon.IsOk());
00148 SetAutoLayout(true);
00149
00150
00151
00152 return true;
00153 }
00154
00155
00156
00157 wxSize MutIconShape::DoGetBestSize() const
00158 {
00159
00160 wxSize s(0,0);
00161 wxSize s1(0,0);
00162 DEBUGLOG (other, _T("best size: %dx%d"),s.x,s.y);
00163
00164
00165
00166 if (staticText) s += staticText->GetBestSize();
00167 DEBUGLOG (other, _T("staticText %p best size: %dx%d"),&staticText,s.x,s.y);
00168 if (GetIcon().IsOk()) {
00169 s.x = std::max (Icon.GetWidth(), s.x);
00170 int h = Icon.GetHeight();
00171 s.y += h;
00172 }
00173
00174 if (GetSizer()) {
00175 s1 = GetSizer()->CalcMin();
00176 DEBUGLOG (other, _T("our %p sizer best size: %dx%d"),this,s1.x,s1.y);
00177 s.x = std::max(s.x,s1.x);
00178 s.y += std::max(s1.y,0);
00179 }
00180 s1 = GetSize() - GetClientSize();
00181 s.x += wxMax(0, s1.x);
00182 s.y += wxMax(0, s1.y);
00183
00184 s1 = MutPanel::DoGetBestSize();
00185 DEBUGLOG (other, _T("our %p parent best size: %dx%d"),this,s1.x,s1.y);
00186
00187 s1.x = std::max(s.x,s1.x);
00188 s1.y = std::max(s.y,s1.y);
00189
00190 DEBUGLOG (other, _T("our %p best size: %dx%d"),this,s.x,s.y);
00191 wxConstCast(this,MutIconShape)->SetMinSize(s1);
00192 return s1;
00193 }
00194
00195
00196 void MutIconShape::SetFocus() {
00197 MutPanel::SetFocus();
00198 DEBUGLOG (other, _T(""));
00199 SetWindowStyle((GetWindowStyle() & ~ wxBORDER_RAISED)| wxBORDER_SUNKEN);
00200 GetContainingSizer()->Layout();
00201 Refresh();
00202 }
00203
00204 void MutIconShape::OnGetFocus(wxFocusEvent & event)
00205 {
00206 DEBUGLOG (other, _T(""));
00207 OnFocus(event);
00208 SetFocus();
00209 }
00210
00211 void MutIconShape::OnKillFocus(wxFocusEvent & event)
00212 {
00213 DEBUGLOG (other, _T(""));
00214 SetWindowStyle((GetWindowStyle() & ~ wxBORDER_SUNKEN) | wxBORDER_RAISED);
00215 wxSizer * sizer = GetContainingSizer();
00216 if (sizer) sizer->Layout();
00217 Refresh();
00218 }
00219
00220
00221 void MutIconShape::OnPaint( wxPaintEvent& WXUNUSED(event) )
00222 {
00223 wxPaintDC dc(this);
00224 PrepareDC(dc);
00225 OnDraw(dc);
00226 }
00227
00228 void MutIconShape::OnDraw (wxDC & dc)
00229 {
00230 wxRect size = GetRect();
00231 DEBUGLOG (other, _T("Checking icon"));
00232
00233 if (!GetIcon().IsOk()) {
00234 SetIcon(GetMutIcon());
00235 DEBUGLOG (other, _T("Checking icon again"));
00236
00237 }
00238 DEBUGLOG (other, _T("Icon ok."));
00239
00240 int x = 0, y = 0;
00241 if (GetIcon().IsOk()) {
00242 DEBUGLOG (other, _T("Size: %dx%d"),GetIcon().GetHeight(),
00243 GetIcon().GetWidth());
00244 x = (size.width-GetIcon().GetWidth())/2;
00245 dc.DrawIcon(GetIcon(), x, y);
00246 }
00247
00248 DEBUGLOG (other, _T("Focus %p and this %p"),FindFocus(),this);
00249
00250
00251
00252
00253
00254
00255
00256
00257 }
00258
00259 wxPoint MutIconShape::GetPerimeterPoint(const wxPoint &i,const wxPoint &o) const {
00260 wxRect r = GetRect();
00261 DEBUGLOG (other, _T("Rect: (%d,%d) -- (%d,%d)"),r.x,r.y,r.x+r.width,r.y+r.height);
00262 DEBUGLOG (other, _T("Points: i = (%d,%d), o = (%d, %d)"),i.x,i.y,o.x,o.y);
00263 wxRect ir = GetIconRect();
00264 #ifdef DEBUG
00265 std::cerr.flush();
00266 wxASSERT(r.Contains(i));
00267 #endif
00268
00269 wxPoint p;
00270
00271 if (r.x+r.width <= o.x) {
00272 p.x = r.x + r.width;
00273 p.y = r.y + ir.height/2;
00274 } else if (r.x >= o.y) {
00275 p.x = r.x;
00276 p.y = r.y + ir.height/2;
00277 } else if (r.y <= o.y) {
00278 p.x = r.x + r.width/2;
00279 p.y = r.y;
00280 } else if (r.y + r.height >= o.y) {
00281 p.x = r.x + r.width/2;
00282 p.y = r.y + r.height;
00283 } else p = o;
00284
00285 return p;
00286 }
00287
00288 void MutIconShape::LineTo(wxDC &dc, const wxPoint & p) const
00289 {
00290 wxRect rect = GetRect();
00291 wxPoint p1(rect.x + rect.width/2, rect.y + Icon.GetHeight()/2);
00292 dc.DrawLine(p1,p);
00293 }
00294
00295
00296 bool MutIconShape::Recompute()
00297 {
00298 return true;
00299 }
00300
00301 bool MutIconShape::Layout() {
00302 int w = 0, h = 0, y = Icon.GetHeight();
00303 GetVirtualSize(&w, &h);
00304 if (staticText) {
00305 staticText->Move(0,y);
00306 staticText->CentreOnParent(wxHORIZONTAL);
00307 wxSize s = staticText->GetSize();
00308 y += s.y;
00309 }
00310
00311 if ( GetSizer() )
00312 {
00313 DEBUGLOG (other, _T("sizer"));
00314 GetSizer()->SetDimension( 0, y, w, h );
00315 PRINTSIZER(GetSizer());
00316 }
00317 #if wxUSE_CONSTRAINTS
00318 else
00319 {
00320 DEBUGLOG (other, _T("constraints"));
00321 SatisfyConstraints();
00322 SetConstraintSizes();
00323 }
00324 #endif
00325 return true;
00326 }
00327
00328 void MutIconShape::DeleteSelf()
00329 {
00330 Hide();
00331 wxCloseEvent event(wxEVT_CLOSE_WINDOW, m_windowId);
00332 event.SetEventObject(this);
00333 event.SetCanVeto(false);
00334
00335 GetEventHandler()->AddPendingEvent(event);
00336 }
00337
00338
00339
00340