Planet
navi homePPSaboutscreenshotsdownloaddevelopmentforum

Changeset 5111 in orxonox.OLD for trunk/src/util/shell.cc


Ignore:
Timestamp:
Aug 23, 2005, 11:13:56 PM (19 years ago)
Author:
bensch
Message:

orxonox/trunk: reverted the last steps, because they created a huge pack of seg-faults

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/util/shell.cc

    r5110 r5111  
    2020#include "text_engine.h"
    2121#include "list.h"
     22#include "array.h"
    2223#include "graphics_engine.h"
    2324#include "event_handler.h"
    2425
    2526#include "load_param.h"
    26 #include "class_list.h"
    27 
    28 #include "key_names.h"
    2927#include "debug.h"
    3028#include <stdarg.h>
     
    4240  this->setName("Shell");
    4341
    44   this->shellHeight = 400;
    45   this->bActive = false;
    4642  this->buffer = new tList<char>;
    4743
    48   this->textSize = 15;
    49   this->lineSpacing = 5;
     44  this->textSize = 10;
    5045
    5146  //this->bufferSize = 0;
    5247  this->bufferText = NULL;
    5348  this->setBufferSize(100);
    54   this->bufferDisplaySize = 10;
    5549  this->setBufferDisplaySize(10);
    56   this->setAbsCoor2D(3, -400);
     50  this->setAbsCoor2D(3, GraphicsEngine::getInstance()->getResolutionY());
    5751  this->delayed = 0;
    5852  this->setRepeatDelay(.3, .05);
    5953  this->pressedKey = SDLK_FIRST;
    6054
    61   this->inputLineText = NULL;
     55  this->inputLineText = TextEngine::getInstance()->createText("fonts/earth.ttf", 10, TEXT_DYNAMIC, 255, 0, 0);
     56  this->inputLineText->setAlignment(TEXT_ALIGN_LEFT);
     57  this->inputLineText->setText(NULL);
    6258  this->inputLine = new char[1];
    6359  this->inputLine[0] = '\0';
    64 
    65   this->rebuildText();
    66   this->completionList = NULL;
    67 
    68   // EVENT-Handler subscription of '`' to all States, and all other keyboard commands to ES_SEHLL
     60  this->inputLineText->setParent2D(this);
     61
     62
    6963  EventHandler* evh = EventHandler::getInstance();
    7064  evh->subscribe(this, ES_ALL, SDLK_BACKQUOTE);
     
    8377  for (int i = 0; i < this->bufferDisplaySize; i++)
    8478    delete this->bufferText[i];
    85   delete[] this->bufferText;
     79  delete this->bufferText;
    8680
    8781  // delete the inputLine
     
    9185  // delete all the Chars in the Buffers
    9286  tIterator<char>* charIterator = this->buffer->getIterator();
    93   char* charElem = charIterator->firstElement();
     87  char* charElem = charIterator->nextElement();
    9488  while (charElem != NULL)
    9589  {
     
    9993  delete charIterator;
    10094
    101 //  if (this->completionList != NULL)
    102     //delete this->completionList;
    103 
    10495  Shell::singletonRef = NULL;
    10596}
    106 
    107 
    108 void Shell::activate()
    109 {
    110   if (this->bActive == true)
    111     PRINTF(3)("The shell is already active\n");
    112   this->bActive = true;
    113 
    114   EventHandler::getInstance()->setState(ES_SHELL);
    115   this->setRelCoorSoft2D(0, 0, 1, 5);
    116 }
    117 
    118 void Shell::deactivate()
    119 {
    120   if (this->bActive == false)
    121     PRINTF(3)("The shell is already inactive\n");
    122   this->bActive = false;
    123 
    124   EventHandler::getInstance()->setState(ES_GAME);
    125   this->setRelCoorSoft2D(0, -400, 1, 5);
    126 }
    127 
    128 void Shell::setTextSize(unsigned int textSize, unsigned int lineSpacing)
    129 {
    130   this->textSize = textSize;
    131   this->lineSpacing = lineSpacing;
    132 
    133   this->rebuildText();
    134 }
    135 
    136 void Shell::rebuildText()
    137 {
    138   if (this->inputLineText == NULL)
    139     delete this->inputLineText;
    140   this->inputLineText = TextEngine::getInstance()->createText("fonts/Aniron_Bold.ttf", this->textSize, TEXT_DYNAMIC, 255, 0, 0);
    141   this->inputLineText->setAlignment(TEXT_ALIGN_LEFT);
    142   this->inputLineText->setText(NULL);
    143   this->inputLineText->setParent2D(this);
    144   this->inputLineText->setRelCoor2D(5, (this->textSize + this->lineSpacing)*this->bufferDisplaySize);
    145 
    146   this->setBufferDisplaySize(this->bufferDisplaySize);
    147 }
    148 
    149 
    15097
    15198/**
     
    159106    for (unsigned int i = 0; i < this->bufferDisplaySize; i++)
    160107      delete this->bufferText[i];
    161     delete[] this->bufferText;
     108    delete this->bufferText;
    162109  }
    163110
     
    165112  for (unsigned int i = 0; i < bufferDisplaySize; i++)
    166113  {
    167     this->bufferText[i] = TextEngine::getInstance()->createText("fonts/Aniron_Bold.ttf", this->textSize, TEXT_DYNAMIC, 255, 0, 0);
     114    this->bufferText[i] = TextEngine::getInstance()->createText("fonts/earth.ttf", this->textSize, TEXT_DYNAMIC, 255, 0, 0);
    168115    this->bufferText[i]->setAlignment(TEXT_ALIGN_LEFT);
    169     this->bufferText[i]->setRelCoor2D(5, (this->textSize + this->lineSpacing)*(bufferDisplaySize - i -1));
     116    this->bufferText[i]->setRelCoor2D(5, 12+12*i);
    170117    this->bufferText[i]->setText(NULL);
    171118    this->bufferText[i]->setParent2D(this);
    172119  }
     120
     121
    173122  this->bufferDisplaySize = bufferDisplaySize;
    174 
    175   this->shellHeight = (this->textSize + this->lineSpacing) * (bufferDisplaySize+1);
    176123}
    177124
     
    191138  // delete all the Chars in the Buffers
    192139  tIterator<char>* charIterator = this->buffer->getIterator();
    193   char* charElem = charIterator->firstElement();
     140  char* charElem = charIterator->nextElement();
    194141
    195142  while (charElem != NULL)
     
    206153 * @param line the Line as in the first argument in printf
    207154 * @param args the arguments as a va_list
     155 *
     156 * @todo optimize
    208157 */
    209158bool Shell::addBufferLineStatic(const char* line, ...)
     
    225174  return true;
    226175}
     176int curr = 0;
    227177
    228178/**
     
    249199   }
    250200
    251    if (this->bActive && likely(bufferText != NULL))
     201   if (likely(bufferText != NULL))
    252202   {
    253      Text* lastText = this->bufferText[this->bufferDisplaySize-1];
    254      Vector firstCoord = this->bufferText[0]->getRelCoorSoft2D();
    255 
    256      Text* swapText;
    257      Text* moveText = this->bufferText[0];
    258      this->bufferText[0]->setRelCoorSoft2D(this->bufferText[1]->getRelCoorSoft2D(), 5);
    259      for (unsigned int i = 1; i < this->bufferDisplaySize; i++)
     203     Text* moveText = this->bufferText[this->bufferDisplaySize-1];
     204     for (int i = this->bufferDisplaySize-1; i > 0; i--)
    260205     {
    261        if ( i < this->bufferDisplaySize-1)
    262          this->bufferText[i]->setRelCoorSoft2D(this->bufferText[i+1]->getRelCoorSoft2D(),5);
    263        swapText = this->bufferText[i];
    264        this->bufferText[i] = moveText;
    265        moveText = swapText;
     206       this->bufferText[i] = this->bufferText[i-1];
    266207     }
    267      lastText->setRelCoor2D(firstCoord);
    268      this->bufferText[0] = lastText;
    269 
    270      this->bufferText[0]->setText(newLine);
     208     this->bufferText[0] = moveText;
    271209   }
     210   this->bufferText[0]->setText(newLine);
     211   // this->bufferText->
     212//  this->inputLineText->setText(newLine);
    272213}
    273214
     
    289230{
    290231  tIterator<char>* charIterator = this->buffer->getIterator();
    291   char* charElem = charIterator->firstElement();
     232  char* charElem = charIterator->nextElement();
    292233
    293234  int i = 1;
     
    305246}
    306247
     248
    307249/**
    308250 * deletes the InputLine
     
    316258  this->inputLine = new char[1];
    317259  *this->inputLine = '\0';
     260
    318261}
    319262
     
    373316bool Shell::executeCommand()
    374317{
     318
    375319  this->addBufferLineStatic("Execute Command: %s\n", this->inputLine);
    376320  delete this->inputLine;
     
    393337}
    394338
     339
     340#include "key_names.h"
    395341/**
    396342 * listens for some event
     
    406352      if (EventHandler::getInstance()->getState() == ES_GAME)
    407353      {
    408         this->activate();
     354        EventHandler::getInstance()->setState(ES_SHELL);
     355        this->setRelCoorSoft2D(0, GraphicsEngine::getInstance()->getResolutionY()-150, 1, 5);
    409356      }
    410357
    411358      else
    412359      {
    413         this->deactivate();
     360        EventHandler::getInstance()->setState(ES_GAME);
     361        this->setRelCoorSoft2D(0, GraphicsEngine::getInstance()->getResolutionY()+10, 1, 5);
    414362      }
    415363    }
     
    434382  {
    435383    if (this->pressedKey == event.type)
    436     {
    437384      this->pressedKey = SDLK_FIRST;
    438       this->delayed = 0.0;
    439     }
     385    this->delayed = 0.0;
    440386  }
    441387}
     
    480426
    481427//  glTexCoord2f(this->texCoord.maxU, this->texCoord.minV);
    482   glVertex2f(GraphicsEngine::getInstance()->getResolutionX() - this->getAbsCoor2D().x, this->getAbsCoor2D().y  );
     428  glVertex2f(this->getAbsCoor2D().x + 800, this->getAbsCoor2D().y  );
    483429
    484430//  glTexCoord2f(this->texCoord.maxU, this->texCoord.maxV);
    485   glVertex2f(GraphicsEngine::getInstance()->getResolutionX() - this->getAbsCoor2D().x, this->getAbsCoor2D().y + this->shellHeight);
     431  glVertex2f(this->getAbsCoor2D().x + 800, this->getAbsCoor2D().y + 150);
    486432
    487433//  glTexCoord2f(this->texCoord.minU, this->texCoord.maxV);
    488   glVertex2f(this->getAbsCoor2D().x, this->getAbsCoor2D().y + this->shellHeight);
     434  glVertex2f(this->getAbsCoor2D().x, this->getAbsCoor2D().y + 150);
    489435
    490436  glEnd();
     
    505451  strcpy(completionLine, this->inputLine);
    506452
    507   char* commandBegin = strrchr(completionLine, ' ');
     453   char* commandBegin = strrchr(completionLine, ' ');
    508454  if (commandBegin == NULL)
    509455    commandBegin = completionLine;
     
    516462  }
    517463
    518   char* objectStart;
    519   if (objectStart = strstr(commandBegin, "::"))
    520   {
    521     char* classIdentity = new char[objectStart - commandBegin +1];
    522     strncpy(classIdentity, commandBegin, objectStart - commandBegin);
    523     classIdentity[objectStart - commandBegin] = '\0';
    524     this->objectComplete(objectStart+2, ClassList::StringToID(classIdentity));
    525     delete[] classIdentity;
    526   }
    527   else
    528     this->classComplete(commandBegin);
    529 
    530   delete[] completionLine;
    531 }
    532 
    533 /**
    534  * autocompletes a className
    535  * @param classBegin the Beginning of a String to autoComplete
    536  * @return true on success, false otherwise
    537  */
    538 bool Shell::classComplete(const char* classBegin)
    539 {
    540   if (unlikely(classBegin == NULL))
    541     return false;
    542   const tList<const char>* clList = ClassList::getClassList();
    543   if (clList != NULL)
    544   {
    545     const tList<const char>* classList = this->createCompleteList(clList, classBegin);
    546     if (classList != NULL)
    547       this->generalComplete(classList, classBegin, "%s::", "::");
    548     else
    549       return false;
    550   }
    551   else
    552     return false;
    553   return true;
    554 }
    555 
    556 /**
    557  * autocompletes an ObjectName
    558  * @param objectBegin the beginning string of a Object
    559  * @param classID the ID of the Class to search for.
    560  * @return true on success, false otherwise
    561  */
    562 bool Shell::objectComplete(const char* objectBegin, long classID)
    563 {
    564   printf("%s\n", objectBegin);
    565 
    566   if (unlikely(objectBegin == NULL))
    567     return false;
    568   tList<BaseObject>* boList = ClassList::getList(classID);
    569   if (boList != NULL)
    570   {
    571     printf("\n", boList->firstElement()->getName());
    572     const tList<const char>* objectList = this->createCompleteList(boList, objectBegin);
    573     if (objectList != NULL)
    574       this->generalComplete(objectList, objectBegin, "%s");
    575     else
    576       return false;
    577   }
    578   else
    579     return false;
    580   return true;
    581 }
    582 
    583 bool Shell::functionComplete(const char* functionBegin)
    584 {
    585 }
    586 
    587 /**
    588  * completes the inputline on grounds of an inputList
    589  * @param stringList the List to parse through
    590  * @param begin the String to search in the inputList, and to extend with it.
    591  * @param displayAs how to display the found value to the user, printf-style, !!with only one %s!! ex.: "::%s::"
    592  * @param addBack what should be added at the end of the completion
    593  * @param addFront what should be added to the front of one finished completion
    594  * @return true if ok, false otherwise
    595  */
    596 bool Shell::generalComplete(const tList<const char>* stringList, const char* begin, const char* displayAs, const char* addBack, const char* addFront)
    597 {
    598   if (stringList->getSize() == 0)
    599     return false;
    600 
    601   const char* addString = stringList->firstElement();
    602   unsigned int addLength = 0;
    603   unsigned int inputLenght = strlen(begin);
    604 
    605   if (addString != NULL)
    606     addLength = strlen(addString);
    607   tIterator<const char>* charIterator = stringList->getIterator();
    608   const char* charElem = charIterator->firstElement();
    609   while (charElem != NULL)
    610   {
    611     PRINTF(0)(displayAs, charElem);
    612     for (unsigned int i = inputLenght; i < addLength; i++)
    613       if (addString[i] != charElem[i])
    614     {
    615       addLength = i;
    616       break;
    617     }
    618     charElem = charIterator->nextElement();
    619   }
    620   delete charIterator;
    621 
    622   if (addLength >= inputLenght)
    623   {
    624     char* adder = new char[addLength+1];
    625     strncpy(adder, addString, addLength);
    626     adder[addLength] = '\0';
    627     this->removeCharacters(inputLenght);
    628     this->addCharacters(adder);
    629     if (addBack != NULL && stringList->getSize() == 1)
    630       this->addCharacters("::");
    631     delete[] adder;
    632   }
    633   return true;
    634 }
    635 
    636 
    637 
    638 /**
    639  * searches for classes, which beginn with classNameBegin
    640  * @param inputList the List to parse through
    641  * @param classNameBegin the beginning string
    642  * @return a NEW char-array with ClassNames. The LIST should be deleted afterwards,
    643  * !! The strings MUST NOT be deleted !!
    644  */
    645 const tList<const char>* Shell::createCompleteList(const tList<const char>* inputList, const char* classNameBegin)
    646 {
    647   if (inputList == NULL || classNameBegin == NULL)
    648     return NULL;
    649   unsigned int searchLength = strlen(classNameBegin);
    650   if (this->completionList != NULL)
    651     delete this->completionList;
    652   this->completionList = new tList<const char>;
    653 
    654 //  tList<const char>* classList = ClassList::getClassList();
    655 
    656   tIterator<const char>* iterator = inputList->getIterator();
    657   const char* enumString = iterator->firstElement();
    658   while (enumString != NULL)
    659   {
    660     if (strlen(enumString)>searchLength+1 &&
    661         !strncasecmp(enumString, classNameBegin, searchLength))
    662     {
    663       this->completionList->add(enumString);
    664     }
    665     enumString = iterator->nextElement();
    666   }
    667   delete iterator;
    668 
    669   return this->completionList;
    670 }
    671 
    672 /**
    673  * searches for classes, which beginn with classNameBegin
    674  * @param inputList the List to parse through
    675  * @param classNameBegin the beginning string
    676  * @return a NEW char-array with ClassNames. The LIST should be deleted afterwards,
    677  * !! The strings MUST NOT be deleted !!
    678  */
    679 const tList<const char>* Shell::createCompleteList(const tList<BaseObject>* inputList, const char* classNameBegin)
    680 {
    681   if (inputList == NULL || classNameBegin == NULL)
    682     return NULL;
    683   unsigned int searchLength = strlen(classNameBegin);
    684   if (this->completionList != NULL)
    685     delete this->completionList;
    686   this->completionList = new tList<const char>;
    687 
    688   tIterator<BaseObject>* iterator = inputList->getIterator();
    689   BaseObject* enumBO = iterator->firstElement();
    690   while (enumBO != NULL)
    691   {
    692     if (enumBO->getName() != NULL &&
    693         strlen(enumBO->getName())>searchLength+1 &&
    694         !strncasecmp(enumBO->getName(), classNameBegin, searchLength))
    695     {
    696       this->completionList->add(enumBO->getName());
    697     }
    698     enumBO = iterator->nextElement();
    699   }
    700   delete iterator;
    701 
    702   return this->completionList;
     464  printf("%s\n",commandBegin);
     465   Array<char*>* classArray = LoadClassDescription::searchClassWithShort(commandBegin);
     466   if (classArray->getCount() == 0)
     467   {
     468     delete[] completionLine;
     469     delete classArray;
     470     //PRINTF(0)("no completion found for %s\n", commandBegin);
     471     return false;
     472   }
     473
     474   for (unsigned int i = 0; i < classArray->getCount(); i++)
     475   {
     476     PRINTF(0)("%s\n", classArray->getEntry(i));
     477   }
     478   if (classArray->getCount() == 1)
     479   {
     480     this->removeCharacters(strlen(commandBegin));
     481     this->addCharacters(classArray->getEntry(0));
     482     this->addCharacter(' ');
     483   }
     484
     485   delete[] completionLine;
     486   delete classArray;
    703487}
    704488
     
    710494  if (this->pressedKey != SDLK_FIRST)
    711495    printf("%s::%f %f\n", SDLKToKeyname(this->pressedKey), this->delayed, this->repeatDelay);
    712 }
     496
     497}
Note: See TracChangeset for help on using the changeset viewer.