MatOCAD Logo

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

PnlFoglio.cpp

Go to the documentation of this file.
00001 
00002 #include "../../include/PnlFoglio/PnlFoglio.h"
00003 
00004 IMPLEMENT_CLASS(PnlFoglio, wxResizeableControlCanvas)
00006 BEGIN_EVENT_TABLE(PnlFoglio, wxResizeableControlCanvas)
00008         EVT_RIGHT_DOWN(PnlFoglio::OnRightDown)
00009         EVT_LEFT_DOWN(PnlFoglio::OnLeftDown)
00010         EVT_MENU(1050,PnlFoglio::MnuAggiungiGrafico2DClick)
00011         EVT_MENU(1051,PnlFoglio::MnuAggiungiGrafico3DClick)
00012         EVT_MENU(1052,PnlFoglio::MnuAggiungiEtichettaClick)
00013         EVT_MOTION(PnlFoglio::PnlMove)
00014         EVT_PAINT(PnlFoglio::PnlFoglioPaint)  //Process a wxEVT_PAINT event.
00015     EVT_KEY_DOWN(PnlFoglio::OnChar)    
00016     EVT_GRAPH_INFO(PnlFoglio::OnGraphInfo)
00017 END_EVENT_TABLE()
00019 
00020 
00021 
00022 PnlFoglio::PnlFoglio(wxWindow* parent, wxWindowID id, const wxPoint& pos, const wxSize& size, long style, const wxString& name) :  wxResizeableControlCanvas(parent,id,pos,size,style,name)
00023 {
00024 //Imposto dinamicamente il focus sul foglio   se il foglio non ha ancora il focus
00025     FunctionGrid* griglia;
00026     SetFocusIgnoringChildren();
00027         ident=1200;
00028         SetScrollbars(8,8,1000,1000);
00029     posizionescroll.x=0;
00030     posizionescroll.y=0;
00031     DISEGNA=true;
00032     SetBackgroundColour(wxColour(*wxWHITE));
00033     foglio=new wxClientDC(this);
00034     PopFoglio =  new wxMenu((_T("")) );
00035         PopFoglio->Append(1050,_T("Aggiungi Grafico 2D"),_T("Aggiunge un grafico 2D"), wxITEM_NORMAL);
00036         PopFoglio->Append(1051,_T("Aggiungi Grafico 3D"),_T("Aggiunge un grafico 3D"), wxITEM_NORMAL);
00037         PopFoglio->Append(1052,_T("Aggiungi Etichetta"),_T("Aggiunge un'etichetta"), wxITEM_NORMAL);
00038 
00039  //Istanzio una nuova listaw e un cursore in gestionepannello
00040     gestionepannello=(gestione*)malloc(sizeof(gestione));
00041     gestionepannello->IdentSelezione=(int*)malloc(sizeof(int));
00042     gestionepannello->objects=new TListaW();
00043     gestionepannello->Selezione=0;
00044     *(gestionepannello->IdentSelezione)=0;
00045    // griglia=new FunctionGrid(this, 567,wxPoint(1,1),wxSize(100,100),wxWANTS_CHARS,_T("cio"));
00046                         /*    ,
00047                            const wxSize& size ,
00048                            long style,
00049                            const wxString& name )
00050 */}
00051 
00052 
00053 PnlFoglio::~PnlFoglio()
00054 {
00055   foglio->~wxClientDC();//Distruggo il foglio di disegno
00056   delete(gestionepannello->objects);
00057   free(gestionepannello->IdentSelezione);
00058   free(gestionepannello);
00059 
00060 }
00061 
00062 
00063 void PnlFoglio::Elimina()
00064 {
00065    //Rimuove dalla lista dei widget
00066      gestionepannello->objects->RimuoviNodo(gestionepannello->objects->TrovaPosizione(gestionepannello->Selezione->GetId()));
00067   //Distruggo l'oggetto
00068      ((TBasePanel*)(gestionepannello->Selezione))->~TBasePanel();
00069 
00070   //Imposto il  puntatore a 0 per identificare l'assenza di un oggetto selezionato
00071  }
00072 
00073 
00074  void PnlFoglio::PnlMove(wxMouseEvent& event)
00075  {  wxPoint posizione_click;
00076 
00077     wxString string;
00078 
00079      posizione_click=event.GetPosition();//salvo in posizione la posizione del click
00080    ((wxFrame*)GetParent()->GetParent())->GetStatusBar()->SetStatusText(_T("Foglio"),2);
00081     string.Printf(_T("%d"),posizione_click.x);
00082     ((wxFrame*)GetParent()->GetParent())->GetStatusBar()->SetStatusText(string,3);
00083    string.Printf(_T("%d"),posizione_click.y);
00084     ((wxFrame*)GetParent()->GetParent())->GetStatusBar()->SetStatusText(string,4);
00085 
00086 
00087 
00088   }
00089 
00090 
00091   void PnlFoglio::PnlFoglioPaint(wxPaintEvent& event)
00092   {
00093     if(DISEGNA==true)
00094      DisegnaCrocetta();
00095    else
00096      DISEGNA=true;
00097      event.Skip();
00098   }
00099 
00100 
00101 
00102 
00103 void PnlFoglio::OnRightDown(wxMouseEvent& event)
00104 {
00105      posizionereale=event.GetPosition();
00106      PopupMenu(PopFoglio);
00107      SetFocusIgnoringChildren();
00108 
00109      event.Skip();
00110 
00111 }
00112 
00113 
00114 void PnlFoglio::OnLeftDown(wxMouseEvent& event)
00115 {       RimuoviSelezione();
00116         CancellaCrocetta();
00117         posizionereale=event.GetPosition();
00118         CalcUnscrolledPosition(posizionereale.x,posizionereale.y,&posizionevirtuale.x,&posizionevirtuale.y);
00119         DisegnaCrocetta();
00120         SetFocusIgnoringChildren();
00121         event.Skip();
00122 }
00123 
00124 
00125 void PnlFoglio::RimuoviSelezione()
00126  {
00127 
00128     if(*(gestionepannello->IdentSelezione)!=0)
00129        {
00130          gestionepannello->Selezione->Show(0);
00131          gestionepannello->Selezione->SetWindowStyle(wxNO_3D|wxNO_BORDER);
00132          gestionepannello->Selezione->Show(1);
00133          gestionepannello->Selezione=0;
00134          *(gestionepannello->IdentSelezione)=0;
00135        }
00136  }
00137 /*
00138  * MnuproprietaClick
00139  */
00140 void PnlFoglio::MnuAggiungiGrafico2DClick(wxCommandEvent& event)
00141 {       //Aggiungo un  grafico 2d in relazione alla posizione della croce +
00142     DISEGNA=false;
00143     CancellaCrocetta();
00144     wxWindow* buffer=new PnlGraphFrame((wxWindow*)this,ident,posizionereale,wxSize(300,300) ,wxNO_3D|wxSIMPLE_BORDER,_T("Grafico 2D"),gestionepannello );
00145     buffer->SetBackgroundColour(wxColour(0xff,0xff,0xff));
00146     gestionepannello->objects->NuovoNodo(buffer,ident);
00147     ident++;//incremento l'identificatore
00148         event.Skip();
00149 }
00150 
00151 void PnlFoglio::MnuAggiungiGrafico3DClick(wxCommandEvent& event)
00152 {       // insert your code here
00153     DISEGNA=false;
00154     CancellaCrocetta();
00155         wxWindow* buffer=new Graph3DFrame((wxWindow*)this,ident,posizionereale, wxSize(300,300) ,wxNO_3D|wxSIMPLE_BORDER,_T("Grafico 3D"),gestionepannello);
00156     gestionepannello->objects->NuovoNodo(buffer,ident);
00157         ident++;//incremento l'identificatore
00158         event.Skip();
00159 }
00160 
00161 void PnlFoglio::MnuAggiungiEtichettaClick(wxCommandEvent& event)
00162 {       // insert your code here
00163     DISEGNA=false;
00164     CancellaCrocetta();
00165     wxWindow* buffer=new PnlFunzione(this,wxSize(100,40),ident,posizionereale ,wxNO_3D|wxSIMPLE_BORDER,_T("Etichetta"),gestionepannello );
00166     gestionepannello->objects->NuovoNodo(buffer,ident);
00167     buffer->SetFocus();
00168     ident++;//incremento l'identificatore
00169      event.Skip();
00170 }
00171 
00172 void PnlFoglio::OnGraphInfo(GraphInfoEvent& event)
00173 {
00174      ((wxFrame*)GetParent()->GetParent())->GetStatusBar()->SetStatusText(wxString(event.strobject,wxConvUTF8),2);
00175      ((wxFrame*)GetParent()->GetParent())->GetStatusBar()->SetStatusText(wxString(event.strposx,wxConvUTF8),3);
00176      ((wxFrame*)GetParent()->GetParent())->GetStatusBar()->SetStatusText(wxString(event.strposy,wxConvUTF8),4);
00177 
00178 
00179 }
00180 
00181 
00182 
00183 void PnlFoglio::OnChar(wxKeyEvent& event)
00184 {      wxSize dimensioni;
00185        wxWindow* pannello;
00186        bool POSIZIONEFUORI;
00187        dimensioni=GetSize();
00188        GetViewStart(&(posizionescroll.x),&(posizionescroll.y));
00189 
00190 
00191  //Se è selezionato un oggetto  significa che devo riposizionare la crocetta su pnlfoglio in relazione all'oggetto
00192  // e al tasto premuto dall'utente
00193    if(*(gestionepannello->IdentSelezione)!=0)
00194     { //Se la crocetta è attualmente disegnata sotto l'oggetto selezionato
00195 
00196         if((posizionereale.x>=(gestionepannello->Selezione)->GetPosition().x)&&(posizionereale.x<=((gestionepannello->Selezione)->GetPosition().x+(gestionepannello->Selezione)->GetSize().x))&&
00197            (posizionereale.y>=(gestionepannello->Selezione)->GetPosition().y)&&(posizionereale.y<=((gestionepannello->Selezione)->GetPosition().y+(gestionepannello->Selezione)->GetSize().y)))
00198           POSIZIONEFUORI=false;// flag=false
00199         else
00200          {  POSIZIONEFUORI=true;//altrimenti...
00201             CancellaCrocetta();
00202          }
00203 
00204      switch(event.GetKeyCode()) { //Se l'utente, con il focus su un oggetto, ha premuto...
00205        case WXK_RIGHT:  //Aggiorno la posizione reale sul foglio della coordinata x
00206         {   posizionereale.x=(gestionepannello->Selezione)->GetPosition().x+(gestionepannello->Selezione)->GetSize().x;
00207           if(POSIZIONEFUORI) //Ma se la crocetta si trovava fuori dalla zona occupata dall'oggetto
00208                             //Imposto anche la coordinata y
00209             posizionereale.y=(gestionepannello->Selezione)->GetPosition().y;
00210           break;
00211         }
00212        case WXK_LEFT:    //Aggiorno la posizione reale sul foglio della coordinata x
00213         { posizionereale.x=gestionepannello->Selezione->GetPosition().x;
00214          if(POSIZIONEFUORI) //Medesimo discorso
00215             posizionereale.y=(gestionepannello->Selezione)->GetPosition().y;
00216           break;
00217         }
00218         case WXK_UP:    //Aggiorno la posizione reale sul foglio della coordinata y
00219         { posizionereale.y=gestionepannello->Selezione->GetPosition().y;
00220          if(POSIZIONEFUORI) //Aggiorno la coordinata x della crocetta
00221            posizionereale.x=(gestionepannello->Selezione)->GetPosition().x;
00222           break;
00223         }
00224         case WXK_DOWN:
00225         { posizionereale.y=gestionepannello->Selezione->GetPosition().y+gestionepannello->Selezione->GetSize().y;
00226          if(POSIZIONEFUORI)
00227            posizionereale.x=(gestionepannello->Selezione)->GetPosition().x;
00228           break;
00229         }
00230        }
00231        CalcUnscrolledPosition(posizionereale.x,posizionereale.y,&posizionevirtuale.x,&posizionevirtuale.y);
00232        RimuoviSelezione();//Rimuovo la selezione dall'oggetto precedentemente selezionato
00233      }
00234 
00235      switch(event.GetKeyCode()) {
00236          //Se viene premuta la freccia sinistra
00237           case WXK_LEFT:
00238            if(posizionevirtuale.x>8)  //Se nel foglio totale sono ad almeno 8 pixel dal bordo sinistro
00239             {   CancellaCrocetta();
00240                 posizionevirtuale.x=posizionevirtuale.x-8;//Riposiziono la crocetta
00241               if(posizionereale.x-8<=0)  //Se sono all'estremo inferiore della parte visibile del foglio
00242                { posizionescroll.x--;
00243                  Scroll(posizionescroll.x,posizionescroll.y); //Sposto la scrollbar
00244                }
00245               //Traduco la posizione assoluta (posizionevirtuale) nella posizione relativa all'inizio della parte visualizzata di
00246              //  pnlfoglio
00247                  CalcScrolledPosition(posizionevirtuale.x,posizionevirtuale.y,&posizionereale.x,&posizionereale.y);
00248 
00249                if(gestionepannello->objects->ControllaPosizione(posizionereale,&pannello)!=true)
00250                  { DISEGNA=false;
00251                   ((TBasePanel*)pannello)->ImpostaSelezione();
00252                  }else
00253                    DisegnaCrocetta();
00254               }
00255              break;
00256 
00257          //Se viene premuta la freccia destra
00258           case WXK_RIGHT:
00259             if(posizionevirtuale.x<GetVirtualSize().GetWidth()-16)
00260              {  CancellaCrocetta();
00261                 posizionevirtuale.x=posizionevirtuale.x+8;
00262               if(dimensioni.x<posizionereale.x+16)
00263                {posizionescroll.x++;
00264                 Scroll(posizionescroll.x,posizionescroll.y);
00265                }
00266                CalcScrolledPosition(posizionevirtuale.x,posizionevirtuale.y,&posizionereale.x,&posizionereale.y);
00267 
00268                if(gestionepannello->objects->ControllaPosizione(posizionereale,&pannello)!=true)
00269                  { DISEGNA=false;
00270                    ((TBasePanel*)pannello)->ImpostaSelezione();
00271                  }else
00272                    DisegnaCrocetta();
00273 
00274               }
00275           break;
00276 
00277           case WXK_UP:
00278             if(posizionevirtuale.y>16)
00279              {         CancellaCrocetta();
00280 
00281                  posizionevirtuale.y=posizionevirtuale.y-8;
00282               if(posizionereale.y-8<=0)
00283                { posizionescroll.y--;
00284                  Scroll(posizionescroll.x,posizionescroll.y);
00285                }
00286                CalcScrolledPosition(posizionevirtuale.x,posizionevirtuale.y,&posizionereale.x,&posizionereale.y);
00287 
00288                if(gestionepannello->objects->ControllaPosizione(posizionereale,&pannello)!=true)
00289                  { DISEGNA=false;
00290                   ((TBasePanel*)pannello)->ImpostaSelezione();
00291                  }else
00292                    DisegnaCrocetta();
00293 
00294               }
00295            break;
00296 
00297            case WXK_DOWN:
00298              if(posizionevirtuale.y<GetVirtualSize().GetHeight()-16)
00299               {         CancellaCrocetta();
00300 
00301                  posizionevirtuale.y=posizionevirtuale.y+8;
00302                if(dimensioni.y<posizionereale.y+16)
00303                 {posizionescroll.y++;
00304                  Scroll(posizionescroll.x,posizionescroll.y);
00305                 }
00306                 CalcScrolledPosition(posizionevirtuale.x,posizionevirtuale.y,&posizionereale.x,&posizionereale.y);
00307 
00308                 if(gestionepannello->objects->ControllaPosizione(posizionereale,&pannello)!=true)
00309                  { DISEGNA=false;
00310                   ((TBasePanel*)pannello)->ImpostaSelezione();
00311                  }else
00312                    DisegnaCrocetta();
00313 
00314                }
00315             break;
00316 
00317           //Se premo invia la crocetta va a capo
00318           case WXK_RETURN:
00319              CancellaCrocetta();
00320              posizionevirtuale.x=8;
00321              posizionevirtuale.y=posizionevirtuale.y+16;
00322             if(dimensioni.y<posizionereale.y+16)
00323                    posizionescroll.y+=2;
00324 
00325                    Scroll(0,posizionescroll.y);
00326               CalcScrolledPosition(posizionevirtuale.x,posizionevirtuale.y,&posizionereale.x,&posizionereale.y);
00327 
00328                if(gestionepannello->objects->ControllaPosizione(posizionereale,&pannello)!=true)
00329                  { DISEGNA=false;
00330                   ((TBasePanel*)pannello)->ImpostaSelezione();
00331                  }else
00332                    DisegnaCrocetta();
00333             break;
00334 
00335               //Quando si preme back space torno su di una riga
00336             case WXK_BACK:
00337              if(posizionevirtuale.y-16>0)
00338                {   CancellaCrocetta();
00339                    posizionevirtuale.x=8;
00340                    posizionevirtuale.y=posizionevirtuale.y-16;
00341                 if(posizionereale.y-16<0)
00342                    posizionescroll.y-=2;
00343                    Scroll(0,posizionescroll.y);
00344                   CalcScrolledPosition(posizionevirtuale.x,posizionevirtuale.y,&posizionereale.x,&posizionereale.y);
00345                }
00346               if(gestionepannello->objects->ControllaPosizione(posizionereale,&pannello)!=true)
00347                  { DISEGNA=false;
00348                   ((TBasePanel*)pannello)->ImpostaSelezione();
00349                  }else
00350                    DisegnaCrocetta();
00351                 break;
00352 
00353   //This keys move the scroll on pnlfoglio
00354         case  312: //OnPageUp
00355            posizionescroll.y-=dimensioni.y/8;
00356            if(posizionescroll.y<=0)
00357             posizionescroll.y=1;
00358 
00359             Scroll(posizionescroll.x,posizionescroll.y);
00360             DisegnaCrocetta();
00361             break;
00362 
00363          case  313: //OnPageDown
00364             posizionescroll.y+=dimensioni.y/8;
00365            if(posizionescroll.y>=GetVirtualSize().GetHeight()/8)
00366             posizionescroll.y=GetVirtualSize().GetHeight()/8;
00367 
00368             Scroll(posizionescroll.x,posizionescroll.y);
00369             DisegnaCrocetta();
00370             break;
00371 
00372           case  314: //OnLastPage
00373              posizionescroll.y=GetVirtualSize().GetHeight()/8  ;
00374              Scroll(posizionescroll.x,posizionescroll.y);
00375              DisegnaCrocetta();
00376              break;
00377 
00378            case  315: //OnFirstPage
00379              posizionescroll.y=1;
00380              Scroll(posizionescroll.x,posizionescroll.y);
00381              DisegnaCrocetta();
00382              break;
00383 
00384 
00385           default:
00386            wxWindow* buffer=new PnlFunzione((wxWindow*)this,wxSize(100,40),ident,posizionereale ,wxNO_3D|wxSIMPLE_BORDER,_T("Etichetta"),gestionepannello,event.GetKeyCode() );
00387            gestionepannello->objects->NuovoNodo(buffer,ident);
00388            ident++;//incremento l'identificatore
00389      }
00390  }
00391 
00392 
00393 void PnlFoglio::DisegnaCrocetta()
00394 {
00395       CalcScrolledPosition(posizionevirtuale.x,posizionevirtuale.y,&posizionereale.x,&posizionereale.y);
00396    //Se la crocetta è da disegnare nel riquadro di pnlfoglio visualizzato...
00397 
00398     if((posizionereale.x>0)&&(posizionereale.x<GetSize().x)&&(posizionereale.y>0)&&(posizionereale.y<GetSize().y))
00399      {
00400       penna.SetColour(255,0,0);
00401       foglio->SetPen(penna);
00402       foglio->BeginDrawing();
00403      /* disegno + sul foglio*/
00404       foglio->DrawLine(posizionereale.x-5,posizionereale.y,posizionereale.x+5,posizionereale.y);
00405       foglio->DrawLine(posizionereale.x,posizionereale.y-5,posizionereale.x,posizionereale.y+5);
00406       foglio->EndDrawing();
00407      }
00408 
00409 }
00410 
00411 void PnlFoglio::CancellaCrocetta()
00412 {   //Se la crocetta è da disegnare nel riquadro di pnlfoglio visualizzato...
00413 
00414      if((posizionereale.x>0)&&(posizionereale.x<GetSize().x)&&(posizionereale.y>0)&&(posizionereale.y<GetSize().y))
00415     {
00416       penna.SetColour(255,255,255);
00417       foglio->SetPen(penna);
00418       foglio->BeginDrawing();
00419      /* disegno + sul foglio*/
00420       foglio->DrawLine(posizionereale.x-5,posizionereale.y,posizionereale.x+5,posizionereale.y);
00421       foglio->DrawLine(posizionereale.x,posizionereale.y-5,posizionereale.x,posizionereale.y+5);
00422       foglio->EndDrawing();
00423     }
00424 
00425 }
00426 
00427 wxMenu* PnlFoglio::GetPopUp()
00428 { return PopFoglio;
00429 }
00430 
00431 void PnlFoglio::SetTreeItemId(wxTreeItemId Id)
00432 {
00433   TreeId=Id;
00434 }
00435 
00436 wxTreeItemId PnlFoglio::GetTreeItemId()
00437 {
00438   return TreeId;
00439 }

 

SourceForge Logo