Planet
navi homePPSaboutscreenshotsdownloaddevelopmentforum

source: orxonox.OLD/orxonox/branches/updater/src/gui/orxonox_gui_exec.cc @ 3464

Last change on this file since 3464 was 3464, checked in by bensch, 19 years ago

orxonox/branches/updater: made the loading and saving more modular.
thanks to patrick I now know the real meaning of virtual members.

File size: 10.5 KB
Line 
1/*
2   orxonox - the future of 3D-vertical-scrollers
3
4   Copyright (C) 2004 orx
5
6   This program is free software; you can redistribute it and/or modify
7   it under the terms of the GNU General Public License as published by
8   the Free Software Foundation; either version 2, or (at your option)
9   any later version.
10
11   This program is distributed in the hope that it will be useful,
12   but WITHOUT ANY WARRANTY; without even the implied warranty of
13   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14   GNU General Public License for more details.
15
16   You should have received a copy of the GNU General Public License
17   along with this program; if not, write to the Free Software Foundation,
18   Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. 
19
20
21   ### File Specific:
22   main-programmer: Benjamin Grauer
23
24*/
25
26#include "orxonox_gui_exec.h"
27#include <iostream>
28#include <string>
29
30HashTable* orxonoxFlagHash;
31
32/**
33    \brief Creates the Exec-Frame
34*/
35OrxonoxGuiExec::OrxonoxGuiExec(void)
36{
37  configFile =(char*)malloc(512*sizeof(char));
38
39  this->execFrame = new Frame("Execute-Tags:");
40  this->execBox = new Box('v');
41  this->execFrame->setGroupName("misc");
42 
43  this->start = new Button("Start");
44#ifdef HAVE_GTK2
45  this->start->connectSignal("clicked", this, startOrxonox);
46#endif /* HAVE_GTK2 */
47  this->execBox->fill(start);
48  this->saveSettings = new CheckButton("Save Settings");
49  this->saveSettings->value = 1;
50  this->saveSettings->saveability();
51  this->execBox->fill(this->saveSettings);
52  this->verboseMode = new Menu("verbose mode", "nothing", "error", "warning", "info", "lastItem");
53  this->verboseMode->setFlagName("verbose", "v", 0);
54  this->verboseMode->saveability();
55  this->execBox->fill(this->verboseMode);
56  this->alwaysShow = new CheckButton("Always Show this Menu");
57  this->alwaysShow->setFlagName("gui", "g", 0);
58  this->alwaysShow->saveability();
59  this->execBox->fill(this->alwaysShow);
60  this->quit = new Button("Quit");
61#ifdef HAVE_GTK2
62  this->quit->connectSignal("clicked", this, OrxonoxGuiExec::quitOrxonox);
63  //  Window::mainWindow->connectSignal("remove", this, OrxonoxGuiExec::quitOrxonox);
64  Window::mainWindow->connectSignal("destroy", this, OrxonoxGuiExec::quitOrxonox);
65#endif /* HAVE_GTK2 */
66  this->execBox->fill(this->quit);
67
68  this->execFrame->fill(this->execBox);
69}
70
71/**
72   \brief Destructs the Execution-stuff
73*/
74OrxonoxGuiExec::~OrxonoxGuiExec(void)
75{
76  if(this->configFile)
77    delete []this->configFile;
78}
79
80/**
81   \brief Return the Frame
82   \return Returns the Exec-frame
83*/
84Widget* OrxonoxGuiExec::getWidget(void)
85{
86  return execFrame;
87}
88
89/* FILE HANDLING */
90
91/**
92   \brief Sets the location of the configuration File.
93   \param filename the location of the configFile
94
95   \todo: memory allocation could be better.
96
97   The name will be parsed from ~/ to /home/[username] on unix and c:/Documents and Settings/username/Settings/ on Windows
98*/
99void OrxonoxGuiExec::setFilename(char* filename)
100{
101  char* buffer = (char*)malloc(2048*sizeof(char));
102  sprintf(buffer, "%s", filename);
103  if(!strncmp(buffer, "~/", 2))
104  {
105#ifdef __WIN32__
106    sprintf(configFile, "%s/%s", getenv("USERPROFILE"), buffer+2);
107#else
108    sprintf(configFile, "%s/%s", getenv("HOME"), buffer+2);
109#endif
110  }
111  else if(buffer)
112    strcpy(this->configFile, buffer);
113  free (buffer);
114}
115
116/**
117   \returns The name of the Configuration-File
118*/
119char* OrxonoxGuiExec::getConfigFile(void)
120{
121  return this->configFile;
122}
123
124/**
125   \brief checks if a option should be saved.
126   \return 1 if it should 0 if not/
127*/
128int OrxonoxGuiExec::shouldsave()
129{
130  return(static_cast<Option*>(this->saveSettings)->value);
131}
132
133/**
134    \brief Saves the configuration-file to the Disk.\n
135    \param widget from which Widget on should be saved.
136
137    this Function only opens and closes the file, in between OrxonoxGuiExec::writeFileText(Widget* widget) will execute the real writing process.
138*/
139void OrxonoxGuiExec::writeToFile(Widget* widget)
140{
141  this->CONFIG_FILE = fopen(configFile, "w");
142  if(this->CONFIG_FILE)
143    this->writeFileText(widget, 0);
144  fclose(this->CONFIG_FILE);
145}
146
147/**
148   \brief Actually writes into the configuration file to the disk.
149   \param widget from which Widget on should be saved.
150   \param depth initially "0", and grows higher, while new Groups are bundeled.
151*/
152void OrxonoxGuiExec::writeFileText(Widget* widget, int depth)
153{
154  int counter = 0;
155  while(counter < depth &&((widget->isOption>0
156                              &&(static_cast<Option*>(widget)->isSaveable()))
157                             ||(widget->isOption<0
158                                && static_cast<Packer*>(widget)->getGroupName())))
159    {
160      fprintf(this->CONFIG_FILE, "  ", depth);
161      counter++;
162    }
163 
164  // check if it is a Packer, and if it is, check if it has a name and if there is something in it.
165  if(widget->isOption <0)
166    {
167      if(static_cast<Packer*>(widget)->getGroupName())
168        {
169          fprintf(CONFIG_FILE, "[%s]\n", static_cast<Packer*>(widget)->getGroupName());
170          this->writeFileText(static_cast<Packer*>(widget)->down, depth+1);
171          fprintf(CONFIG_FILE, "\n");
172        }
173      else
174        {
175          this->writeFileText(static_cast<Packer*>(widget)->down, depth);
176        }
177    } 
178  //  if(widget->isOption == 0)
179  //    printf("%s\n",widget->title);
180  if(widget->isOption >= 1)
181    if (static_cast<Option*>(widget)->isSaveable())
182      {
183        char Buffer[256];
184        char* space2under;
185        strcpy(Buffer, static_cast<Option*>(widget)->title);
186        if(strchr(Buffer, '_'))
187          cout << "Warning Optionname" << Buffer << " is not Valid for Saving, because it includes an underscore" << endl;
188        while(space2under = strchr(Buffer, ' '))
189          {
190            space2under[0] = '_';
191          }
192          fprintf(CONFIG_FILE, "%s = %s\n", Buffer, static_cast<Option*>(widget)->save());
193      }
194
195  if(widget->next != NULL)
196    this->writeFileText(widget->next, depth);
197}
198
199/**
200   \brief Reads in Configuration Data.
201   \param widget from which Widget on should be saved.
202*/
203void OrxonoxGuiExec::readFromFile(Widget* widget)
204{
205  this->CONFIG_FILE = fopen(configFile, "r");
206  VarInfo varInfo;
207  if(this->CONFIG_FILE)
208    {
209      Widget* groupWidget = widget;
210      char Buffer[256] = "";
211      char Variable[256]= "";
212      char* Value;
213      while(fscanf(this->CONFIG_FILE, "%s", Buffer) != EOF)
214        {
215          // group-search //
216          if(!strncmp(Buffer, "[", 1))
217            {
218              if((groupWidget = locateGroup(widget, Buffer, 1))==NULL)
219                {
220                  cout << "!!There is no group called " << Buffer << " in this GUI.\n First best Widget will get the Infos assigned.\n Config-File will be updated in next Save\n";
221                  groupWidget = widget;
222                }
223              else
224                PRINT(3)("Group %s located.\n", static_cast<Packer*>(groupWidget)->groupName);
225            }
226          // option-setting //
227          if(!strcmp(Buffer, "="))
228            {
229              char* under2space;
230              while(under2space = strchr(Variable, '_'))
231                {
232                  sprintf(under2space, " %s", under2space+1);
233                }
234             
235              fscanf(this->CONFIG_FILE, "%s", Buffer);
236              varInfo.variableName = Variable;
237              varInfo.variableValue = Buffer;
238              groupWidget->walkThrough(this->readFileText, &varInfo, 0);
239              sprintf(Variable, "");
240            }
241          sprintf(Variable, "%s", Buffer);
242        }
243      widget->walkThrough(widget->setOptions, 0);
244    }
245}
246
247/**
248   \brief Maps Confugurations to the Options.
249   \param widget which widget downwards
250   \param varInfo Information about the Variable to read
251*/
252void OrxonoxGuiExec::readFileText(Widget* widget, void* varInfo)
253{
254  VarInfo* info =(VarInfo*)varInfo;
255  if(widget->title && !strcmp(widget->title, info->variableName))
256    {
257      PRINT(3)("Located Option %s.\n", widget->title);
258      if(widget->isOption >= 1)
259          static_cast<Option*>(widget)->load(info->variableValue);
260    }
261}
262
263/**
264   \brief Locates a Group.
265   \param widget The Widget from where to search from
266   \param groupName The GroupName for which to search.
267   \param depth The Depth of the search seen from the first widget we searched from.
268   \returns The Widget that holds the Group, or the NULL if the Group wasn't found.
269
270   \todo do this in gui-gtk.
271*/
272Widget* OrxonoxGuiExec::locateGroup(Widget* widget, char* groupName, int depth)
273{
274  Widget* tmp;
275
276  // removes the trailing and ending [ ].
277  if(!strncmp(groupName, "[", 1))
278    {
279      groupName = groupName+1;
280      groupName[strlen(groupName)-1] = '\0';
281    }
282
283  if(widget->isOption < 0)
284    {
285      if(static_cast<Packer*>(widget)->getGroupName() && !strcmp(groupName, static_cast<Packer*>(widget)->getGroupName()))
286        {
287          return widget;
288        }
289      else
290        {
291          if((tmp = locateGroup(static_cast<Packer*>(widget)->down, groupName, depth+1)) != NULL)
292            return tmp;
293        }
294    } 
295 
296  if(widget->next != NULL && depth != 0)
297    {
298      if((tmp = locateGroup(widget->next, groupName, depth)) != NULL)
299        return tmp;
300    }
301  return NULL;
302}
303
304#ifdef HAVE_GTK2
305/**
306   \brief Starts ORXONOX.(not really implemented yet, but the function is there.\n
307   \param widget the widget that executed the start command
308   \param data additional data
309
310   This is a Signal and can be executed through Widget::signal_connect
311*/
312int OrxonoxGuiExec::startOrxonox(GtkWidget* widget, void* data)
313{
314  OrxonoxGuiExec* exec =(OrxonoxGuiExec*)data;
315  if(exec->shouldsave())
316    exec->writeToFile(Window::mainWindow);
317  cout << "Starting Orxonox" <<endl;
318  gtk_main_quit();
319  system("cd ..;./orxonox"); //!< \todo fix this. should execute orxonox for real(coded not over the shell)
320}
321
322/**
323   \brief Starts ORXONOX.(not really implemented yet, but the function is there.\n
324   \param widget the widget that executed the start command
325   \param data additional data
326
327   This is a Signal and can be executed through Widget::signal_connect
328*/
329int OrxonoxGuiExec::quitOrxonox(GtkWidget* widget, void* data)
330{
331  OrxonoxGuiExec* exec =(OrxonoxGuiExec*)data;
332  PRINT(3)( "Quitting Orxonox %p\n", exec);
333  if(exec->shouldsave())
334    exec->writeToFile(Window::mainWindow);
335  gtk_main_quit();
336}
337#else /* HAVE_GTK2 */
338/**
339   \brief Starts ORXONOX.(not really implemented yet, but the function is there.\n
340   \param widget the widget that executed the start command
341   \param data additional data
342*/
343int OrxonoxGuiExec::startOrxonox(void* widget, void* data)
344{
345  OrxonoxGuiExec* exec =(OrxonoxGuiExec*)data;
346  PRINT(3)("Starting Orxonox\n");
347  if(exec->shouldsave())
348    exec->writeToFile(Window::mainWindow);
349  system("cd ..;./orxonox"); //!< \todo fix this. should execute orxonox for real(coded not over the shell)
350}
351/**
352   \brief Quits ORXONOX.
353   \param widget the widget that executed the Quit command
354   \param data additional data
355
356   This is a Signal and can be executed through Widget::signal_connect
357*/
358int OrxonoxGuiExec::quitOrxonox(void* widget, void* data)
359{
360  OrxonoxGuiExec* exec =(OrxonoxGuiExec*)data;
361  PRINT(3)("Quiting Orxonox");
362  if(exec->shouldsave())
363    exec->writeToFile(Window::mainWindow);
364}
365
366#endif /* HAVE_GTK2 */
Note: See TracBrowser for help on using the repository browser.