MatOCAD Logo

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

TListaW.cpp

Go to the documentation of this file.
00001 #include "../../include/ListaWidget/TListaW.h"
00002  TListaW::TListaW()
00003  { //Inizializzo il puntatore di testa e di coda della lista
00004 
00005    first=0;
00006    last=0;
00007   //Inizializzo il numero di elementi della lista
00008    numeroelementi=0;
00009  }
00010 
00011 TListaW::~TListaW(){
00012 
00013 
00014      while (numeroelementi)
00015      RimuoviNodo(1);
00016 
00017 
00018 
00019 }
00020 
00021  void TListaW::NuovoNodo(wxWindow* object,int idx)
00022  { //Se la lista è vuota
00023    if(first==0)
00024    { //Alloco il primo elemento impostando ptrfine=ptrinizio
00025       first=(pr*)malloc(sizeof(pr));
00026       last=first;
00027    } else
00028    { //Aggiungo un nuovo elemento
00029       last->next=(pr*)malloc(sizeof(pr));
00030       last=last->next;
00031    }
00032      //Il puntatore al successivo elemento dell'ultimo elemento all'interno della lista =NULL
00033       last->next=0;
00034      //Carico i dati nel nodo
00035      last->oggetto=object;
00036      last->id=idx;
00037       numeroelementi++;
00038 
00039      OrdinaElementi();
00040 
00041 
00042  }
00043 
00044 
00045  void TListaW::RimuoviNodo(int posizione)
00046  {  pr* ptrposizione;
00047     pr* ptrtemp;
00048     int i=1;
00049     ptrposizione=first;
00050 
00051  if(posizione==1)
00052   { //Se elimino il primo elemento ptrinizio punta all'elemento successivo della lista
00053     first=first->next;
00054     numeroelementi--;
00055     //Elimino l'elemento dalla lista
00056     free(ptrposizione);
00057   }else
00058   { //.. altrimenti mi posiziono sull'elemento precedente a quello da cancellare
00059     while((i<=posizione-2)&&(ptrposizione->next!=0))
00060      {
00061        ptrposizione=ptrposizione->next;
00062        i++;
00063      }
00064 
00065      if(ptrposizione->next!=0)
00066      { //e  lo cancello collegando prima l'elemento precedente con l'elemento successivo dell'elemento da canc
00067        ptrtemp=ptrposizione->next;
00068 
00069        ptrposizione->next=ptrtemp->next;
00070        free (ptrtemp);
00071        //Se ho eliminato l'ultimo elemento riposiziono
00072       if(ptrposizione->next==0)
00073         last=ptrposizione;
00074 
00075        numeroelementi--;
00076      }
00077    }
00078  }
00079 
00080 
00081 
00082 wxWindow* TListaW::TrovaSuccessivo(int id)
00083 {
00084   int posizione=TrovaPosizione(id);
00085   int i;
00086   pr* ptrtemp=first;
00087  if(posizione+1<=numeroelementi)
00088  { for(i=1;i<posizione+1;i++)
00089     ptrtemp=ptrtemp->next;
00090  }
00091   return(ptrtemp->oggetto);
00092 }
00093 
00094 /*Procedura che trova la posizione di un nodo dato l'ID*/
00095 
00096  int TListaW::TrovaPosizione(int idx)
00097  {pr* buffer;
00098   int i=1;
00099 
00100   buffer=first;
00101 
00102   while(buffer)//finche pr è diverso da NULL
00103   {
00104    if(buffer->id==idx)
00105     return(i);//se lo trovo restituisco la posizione
00106 
00107    i++;//incremento la posizione
00108    buffer=buffer->next;//passo al successivo
00109   }
00110   return(0);//se non trovo restituisco 0
00111  }
00112 
00113 
00114 
00115   void TListaW::OrdinaElementi()
00116   {
00117     pr* ptrposizione;
00118     int i;
00119     int flag;
00120     wxWindow* pannello;
00121     int id;
00122 
00123     do
00124     { flag=1;
00125       i=1;
00126       ptrposizione=first;
00127      while((i<numeroelementi)&&(flag==1))
00128       {
00129 
00130      if((ptrposizione->oggetto->GetPosition().y>ptrposizione->next->oggetto->GetPosition().y)||
00131          ((ptrposizione->oggetto->GetPosition().y==ptrposizione->next->oggetto->GetPosition().y)&&
00132          (ptrposizione->oggetto->GetPosition().x>ptrposizione->next->oggetto->GetPosition().x) ))
00133         {
00134 
00135          pannello=(ptrposizione->next)->oggetto;
00136          id=(ptrposizione->next)->id;
00137          (ptrposizione->next)->oggetto=ptrposizione->oggetto;
00138          (ptrposizione->next)->id=ptrposizione->id;
00139          ptrposizione->id=id;
00140          ptrposizione->oggetto=pannello;
00141          flag=0;
00142         }
00143         i++;
00144         ptrposizione=ptrposizione->next;
00145       }
00146     }while(flag==0);
00147 
00148 
00149   }
00150 bool TListaW::ControllaPosizione(wxPoint posizionereale, wxWindow** pannello)
00151 {  bool flag=true;
00152    int i=1;
00153    pr* elementolista=first;
00154 
00155   while((i<=numeroelementi)&&(flag==true))
00156    {     if ((posizionereale.y>=(elementolista->oggetto)->GetPosition().y)&&(posizionereale.y<=((elementolista->oggetto)->GetPosition().y+(elementolista->oggetto)->GetSize().y)))
00157          {if((posizionereale.x>=(elementolista->oggetto)->GetPosition().x)&&(posizionereale.x<=((elementolista->oggetto)->GetPosition().x+(elementolista->oggetto)->GetSize().x)))
00158            { flag=false;
00159             *pannello=elementolista->oggetto;
00160            }
00161          }
00162          elementolista=elementolista->next;
00163          i++;
00164    }
00165 return(flag);
00166 }
00167 
00168 wxWindow* TListaW::ExtractObject(int position)
00169  {    int i;
00170       pr* ptrposition;
00171       ptrposition=first;
00172   for (i=0;i<position-1;i++)
00173     {
00174        ptrposition=ptrposition->next;
00175     }
00176 
00177     return(ptrposition->oggetto);
00178  }
00179 

 

SourceForge Logo