Main Page | Class List | File List | Class Members | Related Pages

dlgeditprofile.cpp

00001 /***************************************************************************
00002                            dlgeditprofile.cpp
00003                            -------------------
00004     begin                : 2004-05-11 18:29
00005     copyright            : (C) 2004-2005 by Michael Menne, Dominik Haumann
00006     email                : menne@users.sourceforge.net, dhaumann@%
00007  ***************************************************************************/
00008 
00009 /***************************************************************************
00010  This program is free software; you can redistribute it and/or
00011  modify it under the terms of the GNU General Public License
00012  as published by the Free Software Foundation; either version 2
00013  of the License, or (at your option) any later version.
00014 
00015  This program is distributed in the hope that it will be useful,
00016  but WITHOUT ANY WARRANTY; without even the implied warranty of
00017  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
00018  GNU General Public License for more details.
00019 
00020  You should have received a copy of the GNU General Public License
00021  along with this program; if not, write to the Free Software
00022  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
00023  ***************************************************************************/
00024 
00025 #include "dlgeditprofile.h"
00026 #include "profilemanager.h"
00027 #include <wx/file.h>
00028 #include <wx/radiobut.h>
00029 
00030 namespace WDS
00031 {
00032 
00033 BEGIN_EVENT_TABLE(CDlgEditProfile, wxDialog)
00034     EVT_BUTTON( IDC_BTN_CSV, CDlgEditProfile::OnBtnTerrain )
00035     EVT_BUTTON( IDC_BTN_DAT, CDlgEditProfile::OnBtnCities )
00036     EVT_BUTTON( wxID_OK, CDlgEditProfile::OnOK )
00037     EVT_RADIOBUTTON( IDC_RB_DAT, CDlgEditProfile::OnRbDAT )
00038     EVT_RADIOBUTTON( IDC_RB_PHPMAP, CDlgEditProfile::OnRbPhpmap )
00039 END_EVENT_TABLE()
00040 
00041 /*----------------------------------------------------------------------------/
00042   Constructor / Destructor
00043 -----------------------------------------------------------------------------*/
00044 
00045 CDlgEditProfile::CDlgEditProfile( wxWindow *pParent, int type, CProfile* pProfile )
00046     : wxDialog(pParent, -1,
00047         (type==ADD?"Neues Profil - WDSMap":"Profil bearbeiten - WDSMap"),
00048         wxDefaultPosition, wxSize(400, 300), wxDEFAULT_DIALOG_STYLE | wxRESIZE_BORDER ),
00049         m_pProfile(pProfile)
00050 {
00051     //BEGIN Sizer
00052     // contains all three containers
00053     wxBoxSizer *sTop   = new wxBoxSizer( wxVERTICAL );
00054 
00055     // Profile GroupBox
00056     wxStaticBox *staticBox = new wxStaticBox( this, -1, "Profil" );
00057     wxStaticBoxSizer *sProfile = new wxStaticBoxSizer( staticBox, wxVERTICAL );
00058 
00059     // Phpmap GroupBox
00060     staticBox = new wxStaticBox( this, -1, "phpmap Account" );
00061     wxStaticBoxSizer *sPhpmap = new wxStaticBoxSizer( staticBox, wxVERTICAL );
00062     wxFlexGridSizer *sGrid = new wxFlexGridSizer( 3, 2, 5, 5 );
00063     sGrid->AddGrowableCol(1);
00064     sPhpmap->Add( sGrid, 1, wxALIGN_CENTER | wxEXPAND | wxALL, 5 );
00065 
00066     // are in Profile GroupBox
00067     wxBoxSizer *sName = new wxBoxSizer( wxHORIZONTAL );
00068     wxBoxSizer *sCSV  = new wxBoxSizer( wxHORIZONTAL );
00069     wxBoxSizer *sDAT  = new wxBoxSizer( wxHORIZONTAL );
00070 
00071     // Buttons OK and Cancel
00072     wxBoxSizer *sButtons = new wxBoxSizer( wxHORIZONTAL );
00073     //END Sizer
00074 
00075     //BEGIN Controls: Profile Groupbox
00076     wxStaticText *pLblName  = new wxStaticText( this, -1, "Name" );
00077     m_pEdtName      = new wxTextCtrl  ( this, IDC_EDT_NAME, "Server 1 - Eisige Winde" );
00078 
00079     wxStaticText *pLblCSV = new wxStaticText( this, -1, "Terrain Datei ( *.csv )" );
00080     m_pEdtCSV       = new wxTextCtrl  ( this, IDC_EDT_CSV, "" );
00081     m_pBtnCSV       = new wxButton( this, IDC_BTN_CSV, "...", wxDefaultPosition, wxSize(25, -1) );
00082 
00083     wxRadioButton *pRbDAT = new wxRadioButton( this, IDC_RB_DAT, "Stadt Datei ( *.dat )",
00084     wxDefaultPosition, wxDefaultSize, wxRB_GROUP  );
00085     m_pEdtDAT       = new wxTextCtrl  ( this, IDC_EDT_DAT,  "" );
00086     m_pBtnDAT       = new wxButton( this, IDC_BTN_DAT,  "...", wxDefaultPosition, wxSize(25, -1) );
00087 
00088     m_pRbPhpmap     = new wxRadioButton( this, IDC_RB_PHPMAP, "Daten von phpmap Server empfangen" );
00089     //END Controls: Profile Groupbox
00090 
00091 
00092     //BEGIN Controls: Phpmap Account Groupbox
00093     wxStaticText *pLblURL = new wxStaticText( this, -1, "Server URL" );
00094     m_pEdtServer      = new wxTextCtrl  ( this, IDC_EDT_SERVER, "" );
00095 
00096     wxStaticText *pLblUser  = new wxStaticText( this, -1, "User" );
00097     m_pEdtUser        = new wxTextCtrl  ( this, IDC_EDT_USER, "" );
00098 
00099     wxStaticText *pLblPassword = new wxStaticText( this, -1, "Passwort" );
00100     m_pEdtPassword    = new wxTextCtrl  ( this, IDC_EDT_PASSWORD, "",
00101                                           wxDefaultPosition, wxDefaultSize, wxTE_PASSWORD );
00102     //END Controls: Phpmap Account Groupbox
00103 
00104     //BEGIN OK/Cancel Buttons
00105     wxButton* pBtnOk    = new wxButton( this, wxID_OK, "OK" );
00106     wxButton* pBtnCancel  = new wxButton( this, wxID_CANCEL, "Abbrechen" );
00107 
00108     sButtons->Add( pBtnCancel, 0, wxALIGN_CENTER | wxRIGHT, 5);
00109     sButtons->Add( pBtnOk    , 0, wxALIGN_CENTER, 0);
00110     //END OK/Cancel Buttons
00111 
00112     //BEGIN fill Profile sizer
00113     sName->Add( pLblName  , 0, wxALIGN_CENTER_VERTICAL | wxRIGHT, 5 );
00114     sName->Add( m_pEdtName, 1, wxALIGN_CENTER_VERTICAL, 0 );
00115 
00116     sCSV ->Add( pLblCSV   , 0, wxALIGN_CENTER_VERTICAL | wxRIGHT, 5 );
00117     sCSV ->Add( m_pEdtCSV , 1, wxALIGN_CENTER_VERTICAL | wxRIGHT, 5 );
00118     sCSV ->Add( m_pBtnCSV , 0, wxALIGN_CENTER_VERTICAL, 0 );
00119 
00120     sDAT ->Add( pRbDAT    , 0, wxALIGN_CENTER_VERTICAL | wxRIGHT, 5 );
00121     sDAT ->Add( m_pEdtDAT , 1, wxALIGN_CENTER_VERTICAL | wxRIGHT, 5 );
00122     sDAT ->Add( m_pBtnDAT , 0, wxALIGN_CENTER_VERTICAL, 0 );
00123 
00124     sProfile->Add( sName  , 1, wxEXPAND | wxTOP | wxLEFT | wxRIGHT, 5 );
00125     sProfile->Add( sCSV   , 1, wxEXPAND | wxTOP | wxLEFT | wxRIGHT, 5 );
00126     sProfile->Add( sDAT   , 1, wxEXPAND | wxTOP | wxLEFT | wxRIGHT, 5 );
00127     sProfile->Add( m_pRbPhpmap, 1, wxALIGN_CENTER_VERTICAL | wxEXPAND | wxALL, 5 );
00128     //END fill Profile sizer
00129 
00130 
00131     //BEGIN fill Phpmap Account sizer
00132     // sGrind has spacing for row, col. no need to set it here
00133     sGrid->Add( pLblURL       , 0, wxALIGN_CENTER_VERTICAL, 0 );
00134     sGrid->Add( m_pEdtServer  , 1, wxALIGN_CENTER_VERTICAL | wxEXPAND, 0 );
00135 
00136     sGrid->Add( pLblUser      , 0, wxALIGN_CENTER_VERTICAL, 0 );
00137     sGrid->Add( m_pEdtUser    , 1, wxALIGN_CENTER_VERTICAL | wxEXPAND, 0 );
00138 
00139     sGrid->Add( pLblPassword  , 0, wxALIGN_CENTER_VERTICAL, 0 );
00140     sGrid->Add( m_pEdtPassword, 1, wxALIGN_CENTER_VERTICAL | wxEXPAND, 0 );
00141     //END fill Phpmap Account sizer
00142 
00143     //BEGIN fill sTop
00144     sTop->Add( sProfile, 0, wxEXPAND | wxTOP | wxLEFT | wxRIGHT, 10 );
00145     sTop->Add( sPhpmap , 0, wxEXPAND | wxTOP | wxLEFT | wxRIGHT, 10 );
00146     sTop->Add( sButtons, 0, wxALIGN_RIGHT | wxALL, 10 );
00147     //END fill sTop
00148 
00149     //BEGIN ToolTips
00150     m_pEdtName      ->SetToolTip( "Gib eine Beschreibung für das Profil ein wie z.B. \"Server 1 - Eisige Winde\"." );
00151     m_pEdtCSV       ->SetToolTip( "Wähle eine CSV-Datei, die die Map-Informationen enthält." );
00152     m_pEdtDAT       ->SetToolTip( "Wähle eine DAT-Datei, die alle Städte, Einheiten usw. enthält." );
00153     m_pBtnCSV       ->SetToolTip( "Nach CSV Datei suchen." );
00154     m_pBtnDAT       ->SetToolTip( "Nach DAT Datei suchen." );
00155 
00156     m_pEdtServer    ->SetToolTip( "Gib die Server URL ein, mit der man die phpmap erreichen kann.\n"
00157                                   "Beispiel: http://www.server.de/phpmap/map.php\n"
00158                                   "Hinweis: Du kannst die URL einfach per Copy&Paste aus deinem Browser kopieren.");
00159     m_pEdtUser      ->SetToolTip( "Gib den Benutzernamen von deinem phpmap-Account ein." );
00160     m_pEdtPassword  ->SetToolTip( "Gib das Passwort deines phpmap-Accounts ein." );
00161     //END ToolTips
00162 
00163     SetAutoLayout( true );
00164     SetSizer( sTop );
00165 
00166     sTop->SetSizeHints( this );
00167 
00168     // make sane size
00169     SetClientSize( 500, GetSize().GetHeight() );
00170 
00171     pBtnOk->SetFocus( );
00172     pBtnOk->SetDefault( );
00173 
00174     // Initialize dialog defaults
00175     if ( type == ADD ) {
00176         pRbDAT->SetValue( true );
00177         m_pRbPhpmap->SetValue( false );
00178 
00179         m_pEdtServer  ->Disable();
00180         m_pEdtUser    ->Disable();
00181         m_pEdtPassword->Disable();
00182 
00183         m_pEdtDAT->Enable();
00184         m_pBtnDAT->Enable();
00185     } else {
00186         // Set values from profile
00187         m_pEdtName->SetValue( m_pProfile->GetName() );
00188         m_pEdtCSV ->SetValue( m_pProfile->GetMap () );
00189         m_pEdtDAT ->SetValue( m_pProfile->GetDat () );
00190         pRbDAT->SetValue( !m_pProfile->GetUsePhpmap() );
00191         m_pRbPhpmap->SetValue( m_pProfile->GetUsePhpmap() );
00192 
00193         m_pEdtServer  ->SetValue( m_pProfile->GetServer() );
00194         m_pEdtUser    ->SetValue( m_pProfile->GetUser  () );
00195         m_pEdtPassword->SetValue( m_pProfile->GetPassword() );
00196 
00197         if ( m_pProfile->GetUsePhpmap() ) {
00198             m_pEdtServer  ->Enable();
00199             m_pEdtUser    ->Enable();
00200             m_pEdtPassword->Enable();
00201 
00202             m_pEdtDAT->Disable();
00203             m_pBtnDAT->Disable();
00204         } else {
00205             m_pEdtServer  ->Disable();
00206             m_pEdtUser    ->Disable();
00207             m_pEdtPassword->Disable();
00208 
00209             m_pEdtDAT->Enable();
00210             m_pBtnDAT->Enable();
00211         }
00212     }
00213 }
00214 
00215 CDlgEditProfile::~CDlgEditProfile()
00216 {
00217     // all widgets are automatically deleted.
00218 }
00219 
00220 /*----------------------------------------------------------------------------/
00221   Member Functions
00222 -----------------------------------------------------------------------------*/
00223 
00224 /*
00225  *  ValidateFiles( )
00226  *  Ueberprueft ob die Stadtdatei zu der Terraindatei passt
00227  */
00228 bool CDlgEditProfile::ValidateFiles( )
00229 {
00230   /*// 1. Terraindatei oeffnen und feststellen wie groß das Terrain ist ( x:y )
00231   int nMapWidth, nMapHeigth;
00232   wxString strTerrain = m_pTxtTerrain->GetValue();
00233 
00234   // Input Datei öffnen
00235   FILE *pFile = fopen( strTerrain.c_str(), "r" ); // FILE ist schneller als ifstream!
00236   if( pFile == NULL)
00237     return false;
00238 
00239   // CSV-Daten einlesen
00240   int w = 0, h  = 0;
00241   while( !feof( pFile ) )
00242   {
00243     char c = getc( pFile );
00244 
00245     if( h == 0 && c >= '0' && c <= '9') // Is c a number?
00246     {
00247       w++;  // Länge der ersten Zeile = Breite
00248     }
00249     else if( c == '\n' )
00250     {
00251       h++;  // Anzahl Zeilen = Höhe
00252     }
00253   }
00254   fclose( pFile );
00255 
00256   nMapWidth  = w - 2; // Linker und rechter Rand abziehen
00257   nMapHeigth = h - 1; // Oberen Rand abziehen
00258 
00259   // 2. Testen ob alle Einträge in der Datendatei innerhalb der Karte liegen
00260   wxString strCities = m_pTxtCities->GetValue();
00261 
00262   // Input Datei öffnen
00263   ifstream infile( strCities.c_str() );
00264   if ( infile.fail() )
00265     return false;
00266 
00267   int x, y;
00268   while( !infile.eof() )
00269   {
00270     // Spaces, Newlines usw. skippen
00271     eatwhite( infile );
00272 
00273     if( infile.peek() == '[' )
00274     {
00275       infile.ignore( 1024, '\n' );  // Rest der Zeile skippen
00276     }
00277     else
00278     {
00279       // X und Y Koordinate einlesen und Rest skippen
00280       infile >> x >> y;
00281       infile.ignore( 1024, '\n' );
00282 
00283       // Testen ob der Eintrag zum Terrain passt
00284       if( x <= 0 || x > nMapWidth ||
00285         y <= 0 || y > nMapHeigth )
00286         return false;
00287     }
00288   }
00289   infile.close();*/
00290 
00291   return true;
00292 }
00293 
00294 wxString CDlgEditProfile::GetServer( )
00295 {
00296     // be aware: I assume the users are *really* stupid
00297     // [protocol://]www.server.de[:port]/rest.php
00298 
00299     wxString result;
00300     wxString tmp = m_pEdtServer->GetValue().Strip();
00301 
00302     // remove "protocol://"
00303     int http = tmp.First("://");
00304     if ( http != -1 ) {
00305         tmp = tmp.SubString( http+3, tmp.Length() );
00306     }
00307 
00308     int port = tmp.First(":");
00309     int rest = tmp.First("/");
00310 
00311     if ( rest != -1 ) {
00312         if ( port != -1 ) {
00313             result = tmp;
00314         } else {
00315             result = tmp.BeforeFirst('/');
00316             result += ":80/";
00317             result += tmp.AfterFirst('/');
00318         }
00319     } else {
00320         // just try blind. it is wrong, but let's see if we can do
00321         // someting that makes sense
00322         if ( port != -1 ) {
00323             result = tmp;
00324             result += "/"; // hard core :)
00325         } else {
00326             result = tmp;
00327             result += ":80/";
00328         }
00329     }
00330 
00331     // remove everything behind the last /
00332     result = result.BeforeLast('/') + "/";
00333 
00334     // hope all this helped *sigh*
00335     return result;
00336 }
00337 
00338 //
00339 //BEGIN EVENT HANDLER
00340 //
00341 void CDlgEditProfile::OnBtnTerrain(wxCommandEvent &event)
00342 {
00343     wxFileDialog dlgFile( this, "CSV Datei wählen", "", "", "CVS Dateien (*.csv)|*.csv|Alle Dateien (*.*)|*.*",
00344         wxOPEN | wxHIDE_READONLY );
00345     if( dlgFile.ShowModal() == wxID_OK ) {
00346         wxString strPath = dlgFile.GetPath();
00347         m_pEdtCSV->SetValue( strPath );
00348 
00349         // Wenn es eine Towndatei mit gleichen Namen wie die Terraindatei gibt,
00350         // wird diese automatisch in die Town TextBox eingefuegt
00351         wxString strFile = strPath.BeforeLast( '.' ) + ".dat";
00352         if( wxFile::Exists( strFile ) ) {
00353             m_pEdtDAT->SetValue( strFile );
00354         }
00355     }
00356 }
00357 
00358 void CDlgEditProfile::OnBtnCities(wxCommandEvent &event)
00359 {
00360     wxFileDialog dlgFile( this, "DAT Datei wählen", "", "", "DAT Dateien (*.dat)|*.dat|Alle Dateien (*.*)|*.*",
00361         wxOPEN | wxHIDE_READONLY );
00362     if( dlgFile.ShowModal() == wxID_OK )
00363     {
00364         wxString strPath = dlgFile.GetPath();
00365 
00366         m_pEdtDAT->SetValue( strPath );
00367     }
00368 }
00369 
00370 void CDlgEditProfile::OnOK( wxCommandEvent &event )
00371 {
00372     if( !ValidateFiles() )
00373     {
00374         wxMessageBox( "Die DAT-Datei passt nicht zur CSV-Datei", "Fehler - WDSMap" );
00375         return;
00376     }
00377 
00378     m_pProfile->SetName     ( GetName() );
00379     m_pProfile->SetMap      ( GetTerrainFile() );
00380     m_pProfile->SetDat      ( GetCitiesFile() );
00381     m_pProfile->SetUsePhpmap( GetUsePhpmap() );
00382     m_pProfile->SetFogOfWar ( GetUsePhpmap() );  // phpmap: default is 'enable FogOfWar'
00383     m_pProfile->SetServer   ( GetServer() );
00384     m_pProfile->SetUser     ( GetUser() );
00385     m_pProfile->SetPassword ( GetPassword() );
00386 
00387     event.Skip( );
00388 }
00389 
00390 void CDlgEditProfile::OnRbDAT( wxCommandEvent &event )
00391 {
00392     m_pEdtServer  ->Disable();
00393     m_pEdtUser    ->Disable();
00394     m_pEdtPassword->Disable();
00395 
00396     m_pEdtDAT->Enable();
00397     m_pBtnDAT->Enable();
00398 }
00399 
00400 void CDlgEditProfile::OnRbPhpmap( wxCommandEvent &event )
00401 {
00402     m_pEdtServer  ->Enable();
00403     m_pEdtUser    ->Enable();
00404     m_pEdtPassword->Enable();
00405 
00406     m_pEdtDAT->Disable();
00407     m_pBtnDAT->Disable();
00408 }
00409 //
00410 //END EVENT HANDLER
00411 //
00412 
00413 }
00414 
00415 // kate: space-indent off; tab-width 4; replace-tabs off;

Generated on Sun Jan 16 18:20:26 2005 for WDSMap by  doxygen 1.3.9.1