source: PSPA/Interface_Web/trunk/pspaWT/sources/userInterface/src/GWt_ligneFaisceau.cc @ 323

Last change on this file since 323 was 323, checked in by garnier, 11 years ago

Correction du bug #37

File size: 8.1 KB
Line 
1#include <iostream>
2
3#include "GWt_elementLigneFaisceau.h"
4#include "GWt_ligneFaisceau.h"
5#include "GWt_drift.h"
6#include "GWt_rfgun.h"
7#include "GWt_cell.h"
8#include "GWt_soleno.h"
9#include "GWt_bend.h"
10
11#include "mixedTools.h"
12
13#include <Wt/WVBoxLayout>
14
15
16GWt_LigneFaisceau::GWt_LigneFaisceau(PspaApplication* ps) :
17WContainerWidget(),
18pspa_(ps),
19nObjets_(NULL)
20{
21   
22    cout<<"GWt_LigneFaisceau::GWt_LigneFaisceau() %d"<< this << "<---------------"<< endl;
23   
24    ligneFaisceauLayout_ = new WHBoxLayout();
25    //  decorationStyle().setBackgroundColor (WColor(245,245,245));
26    setLayout(ligneFaisceauLayout_);
27    ligneFaisceauLayout_->setContentsMargins(0,0,0,0);
28    ligneFaisceauLayout_->setSpacing    (0);
29   
30    int nElts= nomdElements::getNumberOfElements();
31    nObjets_= new Compteur[nElts];
32   
33    // set the object name
34    setObjectName("ligneFaisceau");
35   
36   
37    clear();
38}
39
40
41void GWt_LigneFaisceau::clear() {
42    ligneFaisceauLayout_->clear();
43
44    // add the first drop zone
45    decorationStyle().setBorder (WBorder (WBorder::Dotted));
46    allDropZone_ = new GWt_dropZoneLigneFaisceau(pspa_);
47    WVBoxLayout* fit = new WVBoxLayout();
48    allDropZone_->setLayout(fit);
49   
50    fit->addWidget(new WText("Drag elements here...."),1,Wt::AlignCenter |Wt::AlignMiddle);
51    ligneFaisceauLayout_->addWidget(allDropZone_,1);
52}
53
54
55GWt_abstractElement* GWt_LigneFaisceau::addElement(typedElement eType){
56    return addElement(eType,NULL);
57}
58
59
60
61GWt_abstractElement* GWt_LigneFaisceau::addElement(typedElement eType, GWt_dropZoneLigneFaisceau* dropContainer ){
62
63    GWt_abstractElement* GWtAbstractElem = NULL;
64   
65    cout << " Entree addElement element " << nomdElements::getLabelFromType(eType) << endl;
66   
67    int nElements= nomdElements ::getNumberOfElements();
68    nObjets_= new Compteur[nElements];
69   
70    // 3 cases :
71    // -dropContainer is an element of the ligneFaisceauLayout_
72    // -dropContainer is an element of the GWt_elementLigneFaisceau_
73    // -dropContainer is NULL, insert in the last element
74   
75    if(eType == inconnu) {
76        cout << "GWt_LigneFaisceau::element type " << eType << " inconnu " << endl;
77        return NULL;
78    }
79   
80    // add the element to the datamanager
81   
82    // first time we insert an element :
83    GWt_elementLigneFaisceau* firstElemIsElement = dynamic_cast <GWt_elementLigneFaisceau*> (ligneFaisceauLayout_->itemAt(0)->widget());
84    if ((ligneFaisceauLayout_->count() == 1) && (!firstElemIsElement)) {
85        int index = indexOf (dropContainer);
86        if ((index != -1) || (dropContainer == NULL)){ // found
87            // remove global drop zone
88            ligneFaisceauLayout_->clear();
89
90            // add first element
91            GWt_elementLigneFaisceau* elemLigneFaisceau = new GWt_elementLigneFaisceau(eType, pspa_);
92           
93            ligneFaisceauLayout_->addWidget(elemLigneFaisceau,1);
94            GWtAbstractElem = elemLigneFaisceau->getGWt_AbstractElement();
95            // remove arrow from begin and end
96           
97        } else { // error
98            return NULL;
99        }
100    } else {
101        int index = -1;
102        for (int a=0; a< ligneFaisceauLayout_->count(); a++) {
103            GWt_elementLigneFaisceau* elem = static_cast <GWt_elementLigneFaisceau*> (ligneFaisceauLayout_->itemAt(a)->widget ());
104            if (elem) {
105                if (elem->getDropZoneLeft() == dropContainer) {
106                    index = a;
107                }
108                if (elem->getDropZoneRight() == dropContainer) {
109                    index = a+1;
110                }
111            }
112           
113        }
114       
115       
116        //  ligneFaisceauLayout_->addWidget(new GWt_elementLigneFaiseau(ptr),0);
117        GWt_elementLigneFaisceau* elemLigneFaisceau = new GWt_elementLigneFaisceau(eType, pspa_);
118        if (index != -1) {
119//            nObjets_[ptr->getNomdElement().getElementType()].incr();
120            ligneFaisceauLayout_->insertWidget(index,elemLigneFaisceau,1);
121            GWtAbstractElem = elemLigneFaisceau->getGWt_AbstractElement();
122        } else {
123            ligneFaisceauLayout_->addWidget(elemLigneFaisceau,1);
124            GWtAbstractElem = elemLigneFaisceau->getGWt_AbstractElement();
125        }
126    }
127    manageLineFaisceauLayout();
128
129    return GWtAbstractElem;
130}
131
132
133void GWt_LigneFaisceau::manageLineFaisceauLayout() {
134    // special : hide/setVisible arrow :
135    for (int a=0; a< ligneFaisceauLayout_->count(); a++) {
136        if (GWt_elementLigneFaisceau* elem = dynamic_cast <GWt_elementLigneFaisceau*> (ligneFaisceauLayout_->itemAt(a)->widget ())) {
137
138            // update labels
139            elem->getGWt_AbstractElement()->updateLabelAndToolTipWidget();
140           
141            //  one element
142            if ((a == 0) && (a == (ligneFaisceauLayout_->count()-1))) {
143                elem->getDropZoneLeft()->setStyleClass("elementLigneFaiseau_transparent");
144                elem->getDropZoneRight()->setStyleClass("elementLigneFaiseau_transparent");
145
146                // first
147            } else if (a == 0){
148                elem->getDropZoneLeft()->setStyleClass("elementLigneFaiseau_transparent");
149                elem->getDropZoneRight()->setStyleClass("elementLigneFaiseau_line");
150
151                // last
152            } else if (a == (ligneFaisceauLayout_->count()-1)){
153                elem->getDropZoneLeft()->setStyleClass("elementLigneFaiseau_line");
154                elem->getDropZoneRight()->setStyleClass("elementLigneFaiseau_transparent");
155               
156               
157                // middle elements
158            } else {
159                elem->getDropZoneLeft()->setStyleClass("elementLigneFaiseau_line");
160                elem->getDropZoneRight()->setStyleClass("elementLigneFaiseau_line");
161            }
162        }
163    }
164   
165    // insure that there is still the dropzone !
166    if (ligneFaisceauLayout_->count() == 0) {
167        clear();
168    }
169   
170    pspa_->getExecuteWidget()->updateSelections();
171}
172
173
174
175void GWt_LigneFaisceau::update() {
176    manageLineFaisceauLayout();
177}
178
179
180void GWt_LigneFaisceau::removeElement(GWt_abstractElement* GWt_abstractElement) {
181    if (GWt_abstractElement == NULL)
182        return;
183   
184    // remove Widget
185    // - GWt_abstractElement is an element of the GWt_elementLigneFaisceau_
186   
187    int index = -1;
188    for (int a=0; a< ligneFaisceauLayout_->count(); a++) {
189        GWt_elementLigneFaisceau* elem = static_cast <GWt_elementLigneFaisceau*> (ligneFaisceauLayout_->itemAt(a)->widget ());
190        if (elem) {
191            if (elem->getGWt_AbstractElement() == GWt_abstractElement) {
192                index = a;
193            }
194        }
195    }
196   
197    if (index != -1) {
198        // remove element from the list
199//        pspa_->getDataManager()->removeElement(GWt_abstractElement->getElement()->getLabel());
200       
201        ligneFaisceauLayout_->removeItem(ligneFaisceauLayout_->itemAt(index));
202        delete GWt_abstractElement;
203       
204        // manage widgets if necessary
205        manageLineFaisceauLayout();
206    }
207}
208
209
210abstractElement* GWt_LigneFaisceau::getAbstractElement(int i){
211    int index = 0;
212
213    // first if 1
214//    i--;
215   
216    for (int a=0; a< ligneFaisceauLayout_->count(); a++) {
217        if (GWt_elementLigneFaisceau* elem = dynamic_cast <GWt_elementLigneFaisceau*> (ligneFaisceauLayout_->itemAt(a)->widget ())) {
218            if (index == i) {
219                printf("GWt_LigneFaisceau::getAbstractElement %d %s\n",i,elem->getGWt_AbstractElement()->getAbstractElement()->getLabel().c_str());
220                return elem->getGWt_AbstractElement()->getAbstractElement();
221            }
222            index ++;
223        }
224    }
225    return NULL;
226}
227
228
229int GWt_LigneFaisceau::getBeamLineSize() {
230    int count = 0;
231    for (int a=0; a< ligneFaisceauLayout_->count(); a++) {
232        if (dynamic_cast <GWt_elementLigneFaisceau*> (ligneFaisceauLayout_->itemAt(a)->widget ())) {
233            count ++;
234        }
235    }
236    return count;
237}
238
239
240vector <abstractElement*> GWt_LigneFaisceau::getAllAbstractElements(){
241    vector <abstractElement*> elems;
242    for (int a=0; a< ligneFaisceauLayout_->count(); a++) {
243        if (GWt_elementLigneFaisceau* elem = dynamic_cast <GWt_elementLigneFaisceau*> (ligneFaisceauLayout_->itemAt(a)->widget ())) {
244            elems.push_back(elem->getGWt_AbstractElement()->getAbstractElement());
245        }
246    }
247    return elems;
248}
249
Note: See TracBrowser for help on using the repository browser.