![]() |
MechSys
1.0
Computing library for simulations in continuum and discrete mechanics
|
00001 /************************************************************************ 00002 * MechSys - Open Library for Mechanical Systems * 00003 * Copyright (C) 2005 Dorival M. Pedroso, Raúl D. D. Farfan * 00004 * * 00005 * This program is free software: you can redistribute it and/or modify * 00006 * it under the terms of the GNU General Public License as published by * 00007 * the Free Software Foundation, either version 3 of the License, or * 00008 * any later version. * 00009 * * 00010 * This program is distributed in the hope that it will be useful, * 00011 * but WITHOUT ANY WARRANTY; without even the implied warranty of * 00012 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * 00013 * GNU General Public License for more details. * 00014 * * 00015 * You should have received a copy of the GNU General Public License * 00016 * along with this program. If not, see <http://www.gnu.org/licenses/> * 00017 ************************************************************************/ 00018 00019 #ifndef MECHSYS_WXSIPAIR_H 00020 #define MECHSYS_WXSIPAIR_H 00021 00022 // wxWidgets 00023 #ifdef HAS_WXW 00024 #include <wx/grid.h> 00025 #include <mechsys/gui/common.h> 00026 #endif 00027 00028 // MechSys 00029 #include <mechsys/util/maps.h> 00030 #include <mechsys/util/fatal.h> 00031 #include <mechsys/util/util.h> 00032 00033 namespace GUI 00034 { 00035 00036 class WxSIPairTable : public wxGridTableBase, public SIPair 00037 { 00038 public: 00039 // Constructor & Destructor 00040 WxSIPairTable () : Val2Name(NULL), Transposed(false) {} 00041 00042 // Derived Methods 00043 int GetNumberRows () { return (Transposed ? 1 : Keys.Size()); } 00044 int GetNumberCols () { return (Transposed ? Keys.Size() : 1); } 00045 wxString GetValue (int row, int col); 00046 void SetValue (int row, int col, wxString const & Str); 00047 bool IsEmptyCell (int row, int col) { return false; } 00048 00049 // Methods 00050 void DeleteCols (wxArrayInt const & ColsToDelete); 00051 void DeleteRows (wxArrayInt const & RowsToDelete); 00052 00053 // Data 00054 SDPair const * Val2Name; 00055 bool Transposed; 00056 }; 00057 00058 class WxSIPair : public wxWindow 00059 { 00060 public: 00061 // Constructor & Destructor 00062 WxSIPair (wxWindow * Parent, WxSIPairTable * tab=NULL); 00063 00064 // Methods 00065 void ReBuild (bool ReadControls=true); 00066 00067 // Data 00068 WxSIPairTable * Tab; 00069 wxGrid * Grd; 00070 bool FitCol; 00071 bool Transp; 00072 00073 // Events 00074 void OnReBuild (wxCommandEvent & Event) { ReBuild (); } 00075 void OnAdd (wxCommandEvent & Event); 00076 void OnDel (wxCommandEvent & Event); 00077 DECLARE_EVENT_TABLE() 00078 }; 00079 00080 00082 00083 00084 inline wxString WxSIPairTable::GetValue (int Row, int Col) 00085 { 00086 int row = Row; 00087 int col = Col; 00088 if (Transposed) { row=Col; col=Row; } 00089 wxString buf; 00090 int val = (*this)(Keys[row]); 00091 if (Keys[row]=="name" && Val2Name!=NULL) 00092 { 00093 String name; 00094 Val2Name->Val2Key (val, name); 00095 buf = name; 00096 } 00097 else buf.Printf("%s: %d", Keys[row].CStr(), val); 00098 return buf; 00099 } 00100 00101 inline void WxSIPairTable::SetValue (int Row, int Col, wxString const & Str) 00102 { 00103 int row = Row; 00104 int col = Col; 00105 if (Transposed) { row=Col; col=Row; } 00106 if (Keys[row]=="name" && Val2Name!=NULL) return; 00107 long val; 00108 if (Str.ToLong(&val)) (*this)(Keys[row]) = val; 00109 } 00110 00111 inline void WxSIPairTable::DeleteCols (wxArrayInt const & ColsToDelete) 00112 { 00113 if (!Transposed) return; 00114 Array<String> keys_to_delete(ColsToDelete.size()); 00115 for (size_t i=0; i<ColsToDelete .size(); ++i) keys_to_delete[i] = Keys[ColsToDelete[i]]; 00116 for (size_t i=0; i<keys_to_delete.size(); ++i) Del (keys_to_delete[i].CStr()); 00117 } 00118 00119 inline void WxSIPairTable::DeleteRows (wxArrayInt const & RowsToDelete) 00120 { 00121 if (Transposed) return; 00122 Array<String> keys_to_delete(RowsToDelete.size()); 00123 for (size_t i=0; i<RowsToDelete .size(); ++i) keys_to_delete[i] = Keys[RowsToDelete[i]]; 00124 for (size_t i=0; i<keys_to_delete.size(); ++i) Del (keys_to_delete[i].CStr()); 00125 } 00126 00127 00129 00130 00131 enum 00132 { 00133 ID_WXSIPAIR_FITCOL = wxID_HIGHEST+3000, 00134 ID_WXSIPAIR_TRANSP, 00135 ID_WXSIPAIR_ADD, 00136 ID_WXSIPAIR_DEL, 00137 }; 00138 00139 BEGIN_EVENT_TABLE (WxSIPair, wxWindow) 00140 EVT_CHECKBOX (ID_WXSIPAIR_FITCOL, WxSIPair::OnReBuild) 00141 EVT_CHECKBOX (ID_WXSIPAIR_TRANSP, WxSIPair::OnReBuild) 00142 EVT_BUTTON (ID_WXSIPAIR_ADD, WxSIPair::OnAdd) 00143 EVT_BUTTON (ID_WXSIPAIR_DEL, WxSIPair::OnDel) 00144 END_EVENT_TABLE () 00145 00146 WxSIPair::WxSIPair (wxWindow * Parent, WxSIPairTable * tab) 00147 : wxWindow (Parent, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxFULL_REPAINT_ON_RESIZE), 00148 FitCol (false), 00149 Transp (false) 00150 { 00151 // force validation of child controls 00152 SetExtraStyle (wxWS_EX_VALIDATE_RECURSIVELY); 00153 00154 // controls 00155 wxBoxSizer * szt = new wxBoxSizer(wxVERTICAL); 00156 wxBoxSizer * szr = new wxBoxSizer(wxHORIZONTAL); 00157 SetSizer (szt); 00158 szt->Fit (this); 00159 szt->SetSizeHints (this); 00160 ADD_WXCHECKBOX (this, szr, ID_WXSIPAIR_TRANSP, c0, "Transposed", Transp); 00161 ADD_WXCHECKBOX (this, szr, ID_WXSIPAIR_FITCOL, c1, "Fit columns to data", FitCol); 00162 ADD_WXBUTTON (this, szr, ID_WXSIPAIR_ADD, c2, "Add" ); 00163 ADD_WXBUTTON (this, szr, ID_WXSIPAIR_DEL, c3, "Del" ); 00164 szt->Add (szr); 00165 00166 // create table and grid 00167 Tab = (tab==NULL ? new GUI::WxSIPairTable() : tab); 00168 Grd = new wxGrid (this, wxID_ANY); 00169 szt->Add (Grd, 0,wxALIGN_LEFT|wxALL|wxEXPAND,2); 00170 Transp = Tab->Transposed; 00171 ReBuild (false); 00172 } 00173 00174 void WxSIPair::ReBuild (bool ReadControls) 00175 { 00176 // synchronise data from/to controls 00177 if (ReadControls) TransferDataFromWindow (); 00178 else TransferDataToWindow (); 00179 00180 // rebuild grid based on updated table 00181 Tab->Transposed = Transp; 00182 Grd->SetTable (Tab, /*take_ownership*/false); 00183 Grd->ForceRefresh (); 00184 00185 // reshape window 00186 if (FitCol) Grd->Fit (); 00187 Layout (); 00188 } 00189 00190 inline void WxSIPair::OnAdd (wxCommandEvent & Event) 00191 { 00192 String buf; 00193 for (size_t i=0; i<Tab->Keys.Size(); ++i) 00194 { 00195 int idx = atoi(Tab->Keys[i].CStr()) + 1; 00196 buf.Printf ("%d", idx); 00197 if (!Tab->HasKey(buf.CStr())) 00198 { 00199 Tab->Set (buf.CStr(), 0); 00200 break; 00201 } 00202 } 00203 if (Tab->Keys.Size()==0) Tab->Set ("0", 0); 00204 ReBuild (); 00205 } 00206 00207 inline void WxSIPair::OnDel (wxCommandEvent & Event) 00208 { 00209 wxArrayInt sel = (Tab->Transposed ? Grd->GetSelectedCols() : Grd->GetSelectedRows()); 00210 if (Tab->Transposed) Tab->DeleteCols (sel); 00211 else Tab->DeleteRows (sel); 00212 ReBuild (); 00213 } 00214 00215 }; // namespace GUI 00216 00217 #endif // MECHSYS_WXSIPAIR_H