00001 #include "stdafx.h"
00002
00003 #include "BON.h"
00004 #include "BONImpl.h"
00005
00006 #include "SetRep.h"
00007 #include "logger.h"
00008
00009 #include "algorithm"
00010
00011 #include "globals.h"
00012 extern Globals global_vars;
00013
00014 SetRep::SetRep( BON::FCO& ptr, BON::FCO& resp_ptr)
00015 : FCO( ptr, resp_ptr)
00016 {
00017 m_memberList.clear();
00018 m_memberMap.clear();
00019 }
00020
00021
00022 SetRep::~SetRep()
00023 {
00024 m_memberList.clear();
00025 m_memberMap.clear();
00026 }
00027
00028
00029 void SetRep::addMember( FCO * member)
00030 {
00031 SetMemberList_ConstIterator it =
00032 std::find( m_memberList.begin(), m_memberList.end(), member);
00033
00034 if (it == m_memberList.end())
00035 m_memberList.push_back( member);
00036 else
00037 global_vars.err << MSG_ERROR << "Set member " << member->getPtr() << " is twice in set " << m_ptr << "\n";
00038 }
00039
00040
00041
00042 void SetRep::addSetMemberRole( const ModelRep * model, const RoleRep& role)
00043 {
00044 PointerItemSeries & series = m_memberMap[model];
00045 PointerItem item = role.getSmartRoleName();
00046
00047 PointerItemSeries_Iterator it = std::find( series.begin(), series.end() ,item);
00048
00049
00050 if ( it == series.end() )
00051 series.push_back( item);
00052 else
00053 { }
00054 }
00055
00056
00057
00058 void SetRep::addSetMemberRole( const ModelRep * model, const RoleRep::RoleRepSeries & role_series)
00059 {
00060 RoleRep::RoleRepSeries_ConstIterator role_it = role_series.begin();
00061 for( ; role_it != role_series.end(); ++role_it)
00062 addSetMemberRole( model, *role_it);
00063 }
00064
00065
00066
00067
00068
00069
00070
00071
00072
00073
00074
00075
00076
00077
00078
00079
00080 void SetRep::inherit()
00081 {
00082 std::vector<FCO*> set_descendants;
00083 this->getImpDescendants( set_descendants);
00084 set_descendants.push_back( this);
00085
00086
00087
00088 ModelRepPtrList models = this->modelsIAmPartOfFinal();
00089 ModelRepPtrList_Iterator mod_it = models.begin();
00090
00091 for( ; mod_it != models.end(); ++mod_it )
00092 {
00093 ModelRep* mod_ptr = *mod_it;
00094
00095
00096
00097
00098
00099 SetMemberList_ConstIterator member_it = m_memberList.begin();
00100 for( ; member_it != m_memberList.end(); ++member_it)
00101 {
00102 FCO * member_ptr = *member_it;
00103 std::vector<FCO*> children;
00104
00105
00106
00107 member_ptr->getIntDescendants( children);
00108 children.push_back( member_ptr);
00109
00110
00111 std::vector<FCO*>::reverse_iterator child_it = children.rbegin();
00112 for( ; child_it != children.rend(); ++child_it)
00113 {
00114 FCO * child_member_ptr = * child_it;
00115 if ( !child_member_ptr->isAbstract())
00116 {
00117 RoleRep::RoleRepSeries series;
00118 bool has_some = mod_ptr->getFinalRoles( child_member_ptr, series);
00119
00120 if ( has_some && !series.empty())
00121 {
00122 std::vector<FCO*>::reverse_iterator sets_iterator = set_descendants.rbegin();
00123 for( ; sets_iterator != set_descendants.rend(); ++sets_iterator )
00124 {
00125 if ( (*sets_iterator)->getMyKind() != Any::SET)
00126 global_vars.err << MSG_ERROR << "Non-set descendant: " << (*sets_iterator)->getPtr() <<" of set: " << m_ptr <<"\n";
00127 else
00128 {
00129 SetRep* one_set = dynamic_cast<SetRep *>(*sets_iterator);
00130 std::string set_nm = one_set->getName();
00131
00132 one_set->addSetMemberRole( mod_ptr, series);
00133 }
00134 }
00135 }
00136 }
00137 }
00138 }
00139 }
00140 }
00141
00142
00143 std::string SetRep::doDump()
00144 {
00145 std::string m_ref = askMetaRef();
00146
00147 std::string mmm = indStr() + "<set name = \"" + getName() + "\" metaref = \"" + m_ref + "\"";
00148
00149 mmm += dumpAttributeList();
00150
00151 mmm +=" >\n";
00152 ++ind;
00153 mmm += dumpDispName();
00154 ++ind;
00155 mmm += dumpNamePosition();
00156 mmm += dumpGeneralPref();
00157
00158 mmm += dumpIcon();
00159 mmm += dumpPortIcon();
00160 mmm += dumpDecorator();
00161 mmm += dumpHotspotEnabled();
00162 mmm += dumpTypeShown();
00163 mmm += dumpSubTypeIcon();
00164 mmm += dumpInstanceIcon();
00165 mmm += dumpNameWrap();
00166 mmm += dumpNameEnabled();
00167 mmm += dumpResizable();
00168 mmm += dumpAutoRouterPref();
00169 mmm += dumpHelpURL();
00170
00171 mmm += dumpGradientFillEnabled();
00172 mmm += dumpGradientFillColor();
00173 mmm += dumpGradientFillDirection();
00174 mmm += dumpShadowCastEnabled();
00175 mmm += dumpShadowColor();
00176 mmm += dumpShadowThickness();
00177 mmm += dumpShadowDirection();
00178 mmm += dumpRoundRectangleEnabled();
00179 mmm += dumpRoundRectangleRadius();
00180 --ind;
00181 mmm += dumpConstraints();
00182 mmm += dumpAttributes();
00183 mmm += indStr() + "<pointerspec name = \"set\">\n";
00184 ++ind;
00185
00186
00187 PointerItemSeries dumper_list;
00188
00189 ModelRepPtrList models = this->modelsIAmPartOfFinal();
00190 ModelRepPtrList_ConstIterator mod_it = models.begin();
00191
00192
00193 for( ; mod_it != models.end(); ++mod_it )
00194 {
00195 ModelRep * mod_ptr = *mod_it;
00196
00197
00198 PointerItemSeries_Iterator part_it = m_memberMap[ mod_ptr].begin();
00199 for( ; part_it != m_memberMap[ mod_ptr].end(); ++part_it)
00200 {
00201
00202 if ( std::find( dumper_list.begin(), dumper_list.end(), *part_it) ==
00203 dumper_list.end())
00204 dumper_list.push_back( *part_it);
00205 else
00206 { }
00207 }
00208 }
00209
00210 PointerItemLex lex;
00211 std::sort( dumper_list.begin(), dumper_list.end(), lex);
00212 PointerItemSeries_Iterator dump_it = dumper_list.begin();
00213 for( ; dump_it != dumper_list.end(); ++dump_it)
00214 mmm += indStr() + "<pointeritem desc = \"" + dump_it->name() + "\"></pointeritem>\n";
00215
00216 --ind;
00217 mmm += indStr() + "</pointerspec>\n";
00218 --ind;
00219 mmm += indStr() + "</set>\n";
00220
00221 return mmm;
00222 }
00223
00224
00225 bool SetRep::checkSetElements()
00226 {
00227 bool res = true;
00228 const int number_of_lists = 1;
00229 const SetMemberList* lists[ number_of_lists] = {
00230 &m_memberList
00231 };
00232
00233 for( int i = 0; i < number_of_lists; ++i)
00234 {
00235 SetMemberList_ConstIterator member_it = lists[i]->begin();
00236
00237 for( ; member_it != lists[i]->end(); ++member_it)
00238 {
00239 FCO * member_ptr = *member_it;
00240
00241 if ( !member_ptr->checkIsPartOfFinal() && !member_ptr->isAbstract())
00242 {
00243 global_vars.err << MSG_ERROR << "CHECK: set member " << member_ptr->getPtr() << " in set \"" << m_ptr << "\" is not contained by any model.\n";
00244 res = false;
00245 }
00246 }
00247 }
00248 return res;
00249 }
00250