#include #include "GWt_elementLigneFaisceau.h" #include "GWt_ligneFaisceau.h" #include "GWt_drift.h" #include "GWt_rfgun.h" #include "GWt_cell.h" #include "GWt_soleno.h" #include "GWt_bend.h" #include "nomDeLogiciel.h" #include "mixedTools.h" #include GWt_LigneFaisceau::GWt_LigneFaisceau(PspaApplication* ps) : WContainerWidget(), pspa_(ps) { cout<<"GWt_LigneFaisceau::GWt_LigneFaisceau() %d"<< this << "<---------------"<< endl; ligneFaisceauLayout_ = new WHBoxLayout(); // decorationStyle().setBackgroundColor (WColor(245,245,245)); ligneFaisceauLayout_->setContentsMargins(0,0,0,0); ligneFaisceauLayout_->setSpacing(0); setLayout(ligneFaisceauLayout_); // set the object name setObjectName("ligneFaisceau"); clear(); } void GWt_LigneFaisceau::clear() { ligneFaisceauLayout_->clear(); // add the first drop zone decorationStyle().setBorder (WBorder (WBorder::Dotted)); allDropZone_ = new GWt_dropZoneLigneFaisceau(pspa_); WVBoxLayout* fit = new WVBoxLayout(); allDropZone_->setLayout(fit); fit->addWidget(new WText("Drag elements here...."),1,Wt::AlignCenter |Wt::AlignMiddle); ligneFaisceauLayout_->addWidget(allDropZone_,1); } GWt_abstractElement* GWt_LigneFaisceau::addElement(typedElement eType){ return addElement(eType,NULL); } GWt_abstractElement* GWt_LigneFaisceau::addElement(typedElement eType, GWt_dropZoneLigneFaisceau* dropContainer ) { GWt_abstractElement* GWtAbstractElem = NULL; cout << " Entree addElement element " << nomdElements::getLabelFromType(eType) << endl; // 3 cases : // -dropContainer is an element of the ligneFaisceauLayout_ // -dropContainer is an element of the GWt_elementLigneFaisceau_ // -dropContainer is NULL, insert in the last element if(eType == inconnu) { cout << "GWt_LigneFaisceau::element type " << eType << " inconnu " << endl; return NULL; } // add the element to the datamanager // first time we insert an element : GWt_elementLigneFaisceau* firstElemIsElement = dynamic_cast (ligneFaisceauLayout_->itemAt(0)->widget()); if( (ligneFaisceauLayout_->count() == 1) && (!firstElemIsElement) ) { int index = indexOf(dropContainer); if( (index != -1) || (dropContainer == NULL) ) { // found // remove global drop zone ligneFaisceauLayout_->clear(); // add first element GWt_elementLigneFaisceau* elemLigneFaisceau = new GWt_elementLigneFaisceau(eType,pspa_); ligneFaisceauLayout_->addWidget(elemLigneFaisceau,1); GWtAbstractElem = elemLigneFaisceau->getGWt_AbstractElement(); // remove arrow from begin and end } else { // error return NULL; } } else { int index = -1; for (int a=0; a< ligneFaisceauLayout_->count(); a++) { GWt_elementLigneFaisceau* elem = static_cast (ligneFaisceauLayout_->itemAt(a)->widget ()); if (elem) { if (elem->getDropZoneLeft() == dropContainer) { index = a; } if (elem->getDropZoneRight() == dropContainer) { index = a+1; } } } // ligneFaisceauLayout_->addWidget(new GWt_elementLigneFaiseau(ptr),0); GWt_elementLigneFaisceau* elemLigneFaisceau = new GWt_elementLigneFaisceau(eType, pspa_); if (index != -1) { ligneFaisceauLayout_->insertWidget(index,elemLigneFaisceau,1); GWtAbstractElem = elemLigneFaisceau->getGWt_AbstractElement(); } else { ligneFaisceauLayout_->addWidget(elemLigneFaisceau,1); GWtAbstractElem = elemLigneFaisceau->getGWt_AbstractElement(); } } manageLineFaisceauLayout(); return GWtAbstractElem; } void GWt_LigneFaisceau::manageLineFaisceauLayout() { // special : hide/setVisible arrow : for (int a=0; a< ligneFaisceauLayout_->count(); a++) { if (GWt_elementLigneFaisceau* elem = dynamic_cast (ligneFaisceauLayout_->itemAt(a)->widget ())) { // update labels if (elem->getGWt_AbstractElement()) { elem->getGWt_AbstractElement()->updateLabelAndToolTipWidget(); } // one element if ((a == 0) && (a == (ligneFaisceauLayout_->count()-1))) { elem->getDropZoneLeft()->setStyleClass("elementLigneFaiseau_transparent"); elem->getDropZoneRight()->setStyleClass("elementLigneFaiseau_transparent"); // first } else if (a == 0){ elem->getDropZoneLeft()->setStyleClass("elementLigneFaiseau_transparent"); elem->getDropZoneRight()->setStyleClass("elementLigneFaiseau_line"); // last } else if (a == (ligneFaisceauLayout_->count()-1)){ elem->getDropZoneLeft()->setStyleClass("elementLigneFaiseau_line"); elem->getDropZoneRight()->setStyleClass("elementLigneFaiseau_transparent"); // middle elements } else { elem->getDropZoneLeft()->setStyleClass("elementLigneFaiseau_line"); elem->getDropZoneRight()->setStyleClass("elementLigneFaiseau_line"); } } } // insure that there is still the dropzone ! if (ligneFaisceauLayout_->count() == 0) { clear(); } pspa_->getExecuteWidget()->updateSections(); } void GWt_LigneFaisceau::update() { manageLineFaisceauLayout(); } void GWt_LigneFaisceau::removeElement(GWt_abstractElement* GWt_abstractElement) { if (GWt_abstractElement == NULL) return; // remove Widget // - GWt_abstractElement is an element of the GWt_elementLigneFaisceau_ int index = -1; for (int a=0; a< ligneFaisceauLayout_->count(); a++) { GWt_elementLigneFaisceau* elem = static_cast (ligneFaisceauLayout_->itemAt(a)->widget ()); if (elem) { if (elem->getGWt_AbstractElement() == GWt_abstractElement) { index = a; } } } if (index != -1) { // remove element from the list // pspa_->getDataManager()->removeElement(GWt_abstractElement->getElement()->getLabel()); ligneFaisceauLayout_->removeItem(ligneFaisceauLayout_->itemAt(index)); delete GWt_abstractElement; // manage widgets if necessary manageLineFaisceauLayout(); } } abstractElement* GWt_LigneFaisceau::getAbstractElement(int i){ int index = 0; if (i < 0) { return NULL; } for (int a=0; a< ligneFaisceauLayout_->count(); a++) { if (ligneFaisceauLayout_->itemAt(a)) { if (GWt_elementLigneFaisceau* elem = dynamic_cast (ligneFaisceauLayout_->itemAt(a)->widget ())) { if (index == i) { if (elem->getGWt_AbstractElement()) { return elem->getGWt_AbstractElement()->getAbstractElement(); } } index ++; } } } return NULL; } int GWt_LigneFaisceau::getAbstractElementIndexFromLabel(std::string txt){ int index = 0; if (txt == "") { return NULL; } for (int a=0; a< ligneFaisceauLayout_->count(); a++) { if (ligneFaisceauLayout_->itemAt(a)) { if (GWt_elementLigneFaisceau* elem = dynamic_cast (ligneFaisceauLayout_->itemAt(a)->widget ())) { if (elem->getGWt_AbstractElement()) { if (elem->getGWt_AbstractElement()->getAbstractElement()->getLabel() == txt) { return index; } } index ++; } } } return NULL; } int GWt_LigneFaisceau::getBeamLineSize() { int count = 0; for (int a=0; a< ligneFaisceauLayout_->count(); a++) { if (dynamic_cast (ligneFaisceauLayout_->itemAt(a)->widget ())) { count ++; } } return count; } vector GWt_LigneFaisceau::getAllAbstractElements() { vector elems; for (int a=0; a< ligneFaisceauLayout_->count(); a++) { if (GWt_elementLigneFaisceau* elem = dynamic_cast (ligneFaisceauLayout_->itemAt(a)->widget ())) { elems.push_back(elem->getGWt_AbstractElement()->getAbstractElement()); } } return elems; } void GWt_LigneFaisceau::update(int i){ int index = 0; // first if 1 // i--; for (int a=0; a< ligneFaisceauLayout_->count(); a++) { if (GWt_elementLigneFaisceau* elem = dynamic_cast (ligneFaisceauLayout_->itemAt(a)->widget ())) { if (index == i) { elem->update(); } index ++; } } } void GWt_LigneFaisceau::initializeSoftwares(){ vector elems = getAllAbstractElements(); for (int a=0; a< elems.size(); a++) { elems[a]->setSoftware(nomDeLogiciel::unknownSoftware); } }