00001 #include "stdafx.h"
00002
00003 #include "BON.h"
00004 #include "BONImpl.h"
00005
00006 #include "ReferenceRep.h"
00007 #include "ModelRep.h"
00008
00009 #include "algorithm"
00010
00011 #include "globals.h"
00012 extern Globals global_vars;
00013
00014
00015 ReferenceRep::ReferenceRep( BON::FCO& ptr, BON::FCO& resp_ptr)
00016 : FCO( ptr, resp_ptr)
00017 , m_initialReferees()
00018 , m_finalReferees()
00019 , m_allReferees()
00020 {
00021 }
00022
00023
00024 ReferenceRep::~ReferenceRep()
00025 {
00026 m_initialReferees.clear();
00027 m_finalReferees.clear();
00028 m_allReferees.clear();
00029 }
00030
00031
00032 void ReferenceRep::addInitialReferee( FCO * refd )
00033 {
00034 if ( std::find( m_initialReferees.begin(), m_initialReferees.end(), refd)
00035 == m_initialReferees.end())
00036 m_initialReferees.push_back( refd );
00037 else
00038 global_vars.err << MSG_WARNING << "Warning: Reference \"" << m_ptr << "\" referring twice to fco: \"" << refd->getPtr() << "\". Disregarded.\n";
00039 }
00040
00041
00042 FCO * ReferenceRep::getInitialReferee() const
00043 {
00044 if (checkNotEmpty()) return m_initialReferees[0];
00045 else return 0;
00046 }
00047
00048
00049 const ReferenceRep::RefereeList& ReferenceRep::getInitialReferees() const
00050 {
00051 return m_initialReferees;
00052 }
00053
00054
00055 const ReferenceRep::RefereeList& ReferenceRep::getFinalReferees() const
00056 {
00057 return m_finalReferees;
00058 }
00059
00064 bool ReferenceRep::pointsToModels() const
00065 {
00066 bool to_models = false;
00067
00068 for( unsigned int i = 0; !to_models && i < m_allReferees.size(); ++i)
00069 {
00070
00071 if ( !m_allReferees[i]->isAbstract())
00072 {
00073 to_models = to_models || (m_allReferees[i]->getMyKind() == Any::MODEL);
00074 }
00075 }
00076
00077 return to_models;
00078 }
00079
00080
00081
00082
00083
00084
00085
00086
00087
00088
00089
00090
00091
00092
00093
00094
00095
00096
00097
00098
00099
00100
00101
00102
00103
00104
00105
00106
00107
00108
00109
00110
00111
00112
00113
00114
00115
00116
00117
00118
00119
00120
00121
00122
00123
00124
00125 std::vector<const ModelRep *> ReferenceRep::getModelRefVector() const
00126 {
00127 std::vector<const ModelRep *> models;
00128
00129 for( unsigned int i = 0; i < m_allReferees.size(); ++i)
00130 {
00131 if ( m_allReferees[i]->getMyKind() == Any::MODEL && !m_allReferees[i]->isAbstract())
00132 {
00133 const ModelRep * c_m = dynamic_cast<const ModelRep*>( m_allReferees[i]);
00134 if ( std::find( models.begin(), models.end(), c_m) == models.end())
00135 models.push_back( c_m);
00136 }
00137 }
00138
00139 return models;
00140 }
00141
00142
00143
00144
00145
00146
00147
00148
00149
00150
00151
00152
00153
00154
00155
00156
00157
00158
00159
00160
00161
00162
00163
00164
00165
00166
00167
00168
00169
00170
00171
00172
00173
00174
00175
00176
00177
00178
00179 void ReferenceRep::addFinalReferees( FCO * referee)
00180 {
00181
00182 RefereeList_Iterator l_it = std::find( m_finalReferees.begin(), m_finalReferees.end(), referee);
00183
00184 if ( l_it == m_finalReferees.end())
00185 m_finalReferees.push_back( referee);
00186 else { }
00187
00188 referee->addFinalRefersToMe( this);
00189 }
00190
00191
00192 void ReferenceRep::addFinalReferees( RefereeList & referees )
00193 {
00194 RefereeList_Iterator referee_it = referees.begin();
00195 for( ; referee_it != referees.end(); ++referee_it)
00196 {
00197 addFinalReferees( *referee_it);
00198 (*referee_it)->addFinalRefersToMe( this);
00199 }
00200 }
00201
00202
00203 void ReferenceRep::inherit()
00204 {
00205 std::vector<FCO*> refnce_descendants;
00206 this->getImpDescendants( refnce_descendants);
00207 refnce_descendants.push_back( this);
00208
00209 RefereeList_Iterator it = m_initialReferees.begin();
00210 for( ; it != m_initialReferees.end(); ++it)
00211 {
00212 FCO * target_ptr = *it;
00213
00214 std::vector<FCO*> refree_descendants;
00215
00216
00217 target_ptr->getIntDescendants( refree_descendants);
00218
00219 std::vector<FCO*>::reverse_iterator refnce_it = refnce_descendants.rbegin();
00220 for( ; refnce_it != refnce_descendants.rend(); ++refnce_it)
00221 {
00222 if ( (*refnce_it)->getMyKind() != Any::REF)
00223 global_vars.err << "Non-Reference descendant: " << (*refnce_it)->getPtr() <<" of reference: " << m_ptr <<"\n";
00224 else
00225 {
00226 ReferenceRep* one_refnce = dynamic_cast<ReferenceRep *>(*refnce_it);
00227 one_refnce->addFinalReferees( target_ptr);
00228 one_refnce->addFinalReferees( refree_descendants);
00229 }
00230 }
00231 }
00232 }
00233
00234
00235 bool ReferenceRep::finalize()
00236 {
00237 bool value_set = false;
00238 bool same_kind = true;
00239 const ModelRep * mod_ptr = 0;
00240 KIND_TYPE kind;
00241
00242 std::vector<FCO*> all_referees( m_finalReferees);
00243
00244 unsigned int current = 0;
00245 while( !all_referees.empty() && current < all_referees.size())
00246 {
00247 if ( all_referees[current]->getMyKind() != Any::FCO_REP &&
00248 all_referees[current]->getMyKind() != Any::REF)
00249 {
00250 if (!value_set)
00251 {
00252 kind = all_referees[current]->getMyKind();
00253 value_set = true;
00254 }
00255 else
00256 same_kind = same_kind && (all_referees[current]->getMyKind() == kind);
00257 }
00258 else if ( all_referees[current]->getMyKind() == Any::REF)
00259 {
00260 ReferenceRep * r = dynamic_cast<ReferenceRep *>( all_referees[current]);
00261
00262 const RefereeList &list = r->getFinalReferees();
00263
00264 RefereeList_ConstIterator list_iter = list.begin();
00265 for( ; list_iter != list.end(); ++list_iter)
00266 if (std::find( all_referees.begin(), all_referees.end(), *list_iter) == all_referees.end())
00267 all_referees.push_back( *list_iter);
00268 }
00269 ++current;
00270 }
00271
00272 m_allReferees = all_referees;
00273
00274 return same_kind;
00275 }
00276
00277
00278 std::string ReferenceRep::doDump()
00279 {
00280 std::string m_ref = askMetaRef();
00281
00282 std::string mmm = indStr() + "<reference name = \"" + getName() + "\" metaref = \"" + m_ref + "\"";
00283
00284 mmm += dumpAttributeList();
00285 mmm +=">\n";
00286 ++ind;
00287 mmm += dumpDispName();
00288 ++ind;
00289 mmm += dumpNamePosition();
00290 mmm += dumpShowPorts();
00291 mmm += dumpGeneralPref();
00292 --ind;
00293 mmm += dumpConstraints();
00294 mmm += dumpAttributes();
00295
00296 mmm += dumpIcon();
00297 mmm += dumpPortIcon();
00298 mmm += dumpDecorator();
00299 mmm += dumpHotspotEnabled();
00300 mmm += dumpTypeShown();
00301 mmm += dumpSubTypeIcon();
00302 mmm += dumpInstanceIcon();
00303 mmm += dumpNameWrap();
00304 mmm += dumpNameEnabled();
00305 mmm += dumpResizable();
00306 mmm += dumpAutoRouterPref();
00307 mmm += dumpHelpURL();
00308
00309
00310 mmm += dumpGradientFillEnabled();
00311 mmm += dumpGradientFillColor();
00312 mmm += dumpGradientFillDirection();
00313 mmm += dumpShadowCastEnabled();
00314 mmm += dumpShadowColor();
00315 mmm += dumpShadowThickness();
00316 mmm += dumpShadowDirection();
00317 mmm += dumpRoundRectangleEnabled();
00318 mmm += dumpRoundRectangleRadius();
00319
00320 mmm += indStr() + "<pointerspec name = \"ref\">\n";
00321 ++ind;
00322
00323
00324 AnyLexicographicSort lex;
00325 std::sort( m_finalReferees.begin(), m_finalReferees.end(), lex);
00326 RefereeList_Iterator it = m_finalReferees.begin();
00327 for( ; it != m_finalReferees.end(); ++it )
00328 {
00329 if (!(*it)->isAbstract())
00330 mmm += indStr() + "<pointeritem desc = \"" + (*it)->getName() + "\"></pointeritem>\n";
00331 }
00332
00333
00334 --ind;
00335 mmm += indStr() + "</pointerspec>\n";
00336 --ind;
00337 mmm += indStr() + "</reference>\n";
00338
00339 return mmm;
00340 }
00341
00342 std::string ReferenceRep::dumpShowPorts() const
00343 {
00344 std::string mmm = "";
00345 if(!m_showPorts)
00346 mmm += indStr() + "<regnode name = \"showPorts\" value =\"false\"></regnode>\n";
00347 return mmm;
00348 }
00349
00350 bool ReferenceRep::checkNotEmpty() const
00351 {
00352 return !m_allReferees.empty();
00353 }
00354
00355
00356
00357
00358
00359
00360
00361
00362
00363
00364
00365
00366
00367
00368
00369
00370
00371
00372
00373
00374
00375
00376
00377
00378
00379
00380
00381
00382
00383
00384
00385
00386
00387
00388
00389
00390
00391
00392
00393
00394
00395 int ReferenceRep::howManyAspectsAmongModelRefs() const
00396 {
00397 ModelRep::AspectRepPtrList intersection_of_asps = getAspectsIntersection();
00398 return (int) intersection_of_asps.size();
00399 }
00400
00401
00402 AspectRep * ReferenceRep::getFirstAspectFromIntersection() const
00403 {
00404 ModelRep::AspectRepPtrList intersection_of_asps = getAspectsIntersection();
00405
00406 AspectRep * lowest_asp = 0;
00407
00408 ModelRep::AspectRepPtrList::iterator asp_it = intersection_of_asps.begin();
00409 for( ; asp_it != intersection_of_asps.end(); ++asp_it)
00410 {
00411 if ( !lowest_asp)
00412 lowest_asp = *asp_it;
00413 else if ( !lowest_asp->lessThan( **asp_it))
00414 lowest_asp = *asp_it;
00415 }
00416
00417 return lowest_asp;
00418 }
00419
00420
00421 std::vector<AspectRep *> ReferenceRep::getAspectsIntersection() const
00422 {
00423 ModelRep::AspectRepPtrList intersection_of_asps;
00424 bool inited = false;
00425 std::vector<const ModelRep *> models = getModelRefVector();
00426 std::vector<const ModelRep *>::iterator it = models.begin();
00427 for( ; it != models.end(); ++it)
00428 {
00429 const ModelRep::AspectRepPtrList &asplist = (*it)->getFinalAspectRepPtrList();
00430 if ( !inited)
00431 {
00432 intersection_of_asps = asplist;
00433 inited = true;
00434 }
00435 else
00436 {
00437 ModelRep::AspectRepPtrList::iterator isect_it = intersection_of_asps.begin();
00438 while( isect_it != intersection_of_asps.end())
00439 {
00440 if ( std::find( asplist.begin(), asplist.end(), *isect_it) == asplist.end())
00441 isect_it = intersection_of_asps.erase( isect_it);
00442 else
00443 ++isect_it;
00444 }
00445 }
00446 }
00447 return intersection_of_asps;
00448 }
00449
00450
00451