MechSys  1.0
Computing library for simulations in continuum and discrete mechanics
/home/dorival/mechsys/lib/gui/wxsipair.h
Go to the documentation of this file.
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
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Defines