1 /************************************************************** 2 * 3 * Licensed to the Apache Software Foundation (ASF) under one 4 * or more contributor license agreements. See the NOTICE file 5 * distributed with this work for additional information 6 * regarding copyright ownership. The ASF licenses this file 7 * to you under the Apache License, Version 2.0 (the 8 * "License"); you may not use this file except in compliance 9 * with the License. You may obtain a copy of the License at 10 * 11 * http://www.apache.org/licenses/LICENSE-2.0 12 * 13 * Unless required by applicable law or agreed to in writing, 14 * software distributed under the License is distributed on an 15 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY 16 * KIND, either express or implied. See the License for the 17 * specific language governing permissions and limitations 18 * under the License. 19 * 20 *************************************************************/ 21 22 #include <precomp.h> 23 #include "hfi_interface.hxx" 24 25 26 // NOT FULLY DEFINED SERVICES 27 #include <ary/idl/i_ce.hxx> 28 #include <ary/idl/i_gate.hxx> 29 #include <ary/idl/ik_function.hxx> 30 #include <ary/idl/ik_interface.hxx> 31 #include <ary/idl/ip_ce.hxx> 32 #include <ary/idl/ip_type.hxx> 33 #include <toolkit/hf_docentry.hxx> 34 #include <toolkit/hf_linachain.hxx> 35 #include <toolkit/hf_navi_sub.hxx> 36 #include <toolkit/hf_title.hxx> 37 #include "hfi_doc.hxx" 38 #include "hfi_hierarchy.hxx" 39 #include "hfi_method.hxx" 40 #include "hfi_navibar.hxx" 41 #include "hfi_property.hxx" 42 #include "hfi_tag.hxx" 43 #include "hfi_typetext.hxx" 44 #include "hi_linkhelper.hxx" 45 46 47 extern const String 48 C_sCePrefix_Interface("interface"); 49 50 namespace 51 { 52 53 const String 54 C_sBaseInterface("Base Interfaces"); 55 const String 56 C_sList_BaseComments("Comments on Base Interfaces"); 57 const String 58 C_sList_Methods("Methods' Summary"); 59 const String 60 C_sList_Methods_Label("MethodsSummary"); 61 const String 62 C_sDetails_Methods("Methods' Details"); 63 const String 64 C_sDetails_Methods_Label("MethodsDetails"); 65 66 const String 67 C_sList_Attributes("Attributes' Summary"); 68 const String 69 C_sList_Attributes_Label("AttributesSummary"); 70 const String 71 C_sList_AttributesDetails("Attributes' Details"); 72 const String 73 C_sList_AttributesDetails_Label("AttributesDetails"); 74 75 76 77 enum E_SubListIndices 78 { 79 sli_MethodsSummay = 0, 80 sli_AttributesSummary = 1, 81 sli_MethodDetails = 2, 82 sli_AttributesDetails = 3 83 }; 84 85 } //anonymous namespace 86 87 88 89 90 HF_IdlInterface::HF_IdlInterface( Environment & io_rEnv, 91 Xml::Element & o_rOut ) 92 : HtmlFactory_Idl(io_rEnv, &o_rOut), 93 eCurProducedMembers(mem_none) 94 { 95 } 96 97 HF_IdlInterface::~HF_IdlInterface() 98 { 99 } 100 101 void 102 HF_IdlInterface::Produce_byData( const client & i_ce ) const 103 { 104 Dyn<HF_NaviSubRow> 105 pNaviSubRow( &make_Navibar(i_ce) ); 106 107 HF_TitleTable 108 aTitle(CurOut()); 109 110 HF_LinkedNameChain 111 aNameChain(aTitle.Add_Row()); 112 aNameChain.Produce_CompleteChain(Env().CurPosition(), nameChainLinker); 113 114 produce_Title(aTitle, C_sCePrefix_Interface, i_ce); 115 116 produce_BaseHierarchy( aTitle.Add_Row(), 117 i_ce, 118 C_sBaseInterface ); 119 120 write_Docu(aTitle.Add_Row(), i_ce); 121 CurOut() << new Html::HorizontalLine(); 122 123 dyn_ce_list dpFunctions; 124 ary::idl::ifc_interface::attr::Get_Functions(dpFunctions, i_ce); 125 if ( (*dpFunctions).operator bool() ) 126 { 127 eCurProducedMembers = mem_Functions; 128 129 produce_Members( *dpFunctions, 130 C_sList_Methods, 131 C_sList_Methods_Label, 132 C_sDetails_Methods, 133 C_sDetails_Methods_Label, 134 HtmlFactory_Idl::viewtype_summary ); 135 pNaviSubRow->SwitchOn(sli_MethodsSummay); 136 } 137 138 dyn_ce_list 139 dpAttributes; 140 ary::idl::ifc_interface::attr::Get_Attributes(dpAttributes, i_ce); 141 if ( (*dpAttributes).operator bool() ) 142 { 143 eCurProducedMembers = mem_Attributes; 144 145 produce_Members( *dpAttributes, 146 C_sList_Attributes, 147 C_sList_Attributes_Label, 148 C_sList_AttributesDetails, 149 C_sList_AttributesDetails_Label, 150 HtmlFactory_Idl::viewtype_summary ); 151 pNaviSubRow->SwitchOn(sli_AttributesSummary); 152 } 153 154 ary::idl::ifc_interface::attr::Get_Functions(dpFunctions, i_ce); 155 if ( (*dpFunctions).operator bool() ) 156 { 157 eCurProducedMembers = mem_Functions; 158 159 produce_Members( *dpFunctions, 160 C_sList_Methods, 161 C_sList_Methods_Label, 162 C_sDetails_Methods, 163 C_sDetails_Methods_Label, 164 HtmlFactory_Idl::viewtype_details ); 165 pNaviSubRow->SwitchOn(sli_MethodDetails); 166 } 167 168 ary::idl::ifc_interface::attr::Get_Attributes(dpAttributes, i_ce); 169 if ( (*dpAttributes).operator bool() ) 170 { 171 eCurProducedMembers = mem_Attributes; 172 173 produce_Members( *dpAttributes, 174 C_sList_Attributes, 175 C_sList_Attributes_Label, 176 C_sList_AttributesDetails, 177 C_sList_AttributesDetails_Label, 178 HtmlFactory_Idl::viewtype_details ); 179 pNaviSubRow->SwitchOn(sli_AttributesDetails); 180 } 181 182 eCurProducedMembers = mem_none; 183 184 pNaviSubRow->Produce_Row(); 185 } 186 187 DYN HF_NaviSubRow & 188 HF_IdlInterface::make_Navibar( const client & i_ce ) const 189 { 190 HF_IdlNavigationBar 191 aNaviBar(Env(), CurOut()); 192 aNaviBar.Produce_CeMainRow(i_ce); 193 194 DYN HF_NaviSubRow & 195 ret = aNaviBar.Add_SubRow(); 196 ret.AddItem(C_sList_Methods, C_sList_Methods_Label, false); 197 ret.AddItem(C_sList_Attributes, C_sList_Attributes_Label, false); 198 ret.AddItem(C_sDetails_Methods, C_sDetails_Methods_Label, false); 199 ret.AddItem(C_sList_AttributesDetails, C_sList_AttributesDetails_Label, false); 200 201 CurOut() << new Html::HorizontalLine(); 202 return ret; 203 } 204 205 void 206 HF_IdlInterface::produce_MemberDetails( HF_SubTitleTable & o_table, 207 const client & i_ce ) const 208 { 209 switch (eCurProducedMembers) 210 { 211 case mem_Functions: 212 break; 213 case mem_Attributes: 214 { 215 HF_IdlAttribute 216 aAttribute( Env(), o_table); 217 aAttribute.Produce_byData( i_ce ); 218 return; 219 }; 220 default: //Won't happen. 221 return; 222 } // end switch 223 224 typedef ary::idl::ifc_function::attr funcAttr; 225 226 HF_IdlMethod 227 aFunction( Env(), 228 o_table.Add_Row() 229 >> *new Html::TableCell 230 << new Html::ClassAttr(C_sCellStyle_MDetail) ); 231 232 ary::Dyn_StdConstIterator<ary::idl::Parameter> 233 pParameters; 234 funcAttr::Get_Parameters(pParameters, i_ce); 235 236 ary::Dyn_StdConstIterator<ary::idl::Type_id> 237 pExceptions; 238 funcAttr::Get_Exceptions(pExceptions, i_ce); 239 240 aFunction.Produce_byData( i_ce.LocalName(), 241 funcAttr::ReturnType(i_ce), 242 *pParameters, 243 *pExceptions, 244 funcAttr::IsOneway(i_ce), 245 funcAttr::HasEllipse(i_ce), 246 i_ce ); 247 } 248 249 void 250 HF_IdlInterface::produce_BaseHierarchy( Xml::Element & o_screen, 251 const client & i_ce, 252 const String & i_sLabel ) const 253 { 254 ary::Dyn_StdConstIterator<ary::idl::CommentedRelation> 255 pHelp; 256 ary::idl::ifc_interface::attr::Get_Bases(pHelp, i_ce); 257 if (NOT (*pHelp).operator bool()) 258 return; 259 260 // Check for XInterface as only base: 261 ary::StdConstIterator<ary::idl::CommentedRelation> & 262 itTest = *pHelp; 263 ary::idl::Ce_id 264 nCe = Env().Gate().Types().Search_CeRelatedTo((*itTest).Type()); 265 if (nCe.IsValid()) 266 { 267 // KORR_FUTURE 268 // Rather check for id(!) of com::sun::star::uno::XInterface. 269 if (Env().Gate().Ces().Find_Ce(nCe).LocalName() == "XInterface") 270 { 271 ++itTest; 272 if (NOT itTest.operator bool()) 273 return; 274 } 275 } 276 277 // Write hierarchy: 278 279 HF_DocEntryList 280 aDocList( o_screen ); 281 aDocList.Produce_Term(i_sLabel); 282 Xml::Element & 283 rBaseList = aDocList.Produce_Definition(); 284 285 // NEW 286 Write_BaseHierarchy(rBaseList, Env(), i_ce); 287 288 // Write comments: 289 // KORR_FUTURE: Make sure, no empty table is constructed when comments list is empty. 290 HF_SubTitleTable 291 aBaseTable( aDocList.Produce_Definition(), 292 "", 293 C_sList_BaseComments, 294 2, 295 HF_SubTitleTable::sublevel_3 ); 296 297 ary::Dyn_StdConstIterator<ary::idl::CommentedRelation> 298 pBases; 299 ary::idl::ifc_interface::attr::Get_Bases(pBases, i_ce); 300 for ( ary::StdConstIterator<ary::idl::CommentedRelation> & it = *pBases; 301 it.operator bool(); 302 ++it ) 303 { 304 Xml::Element & 305 rRow = aBaseTable.Add_Row(); 306 307 Xml::Element & 308 rTerm = rRow 309 >> *new Html::TableCell 310 << new Html::ClassAttr(C_sCellStyle_SummaryLeft); 311 HF_IdlTypeText 312 aTypeDisplay( Env(), rTerm, false, 0); 313 aTypeDisplay.Produce_byData((*it).Type()); 314 315 Xml::Element & 316 rDocu = rRow 317 >> *new Html::TableCell 318 << new Html::ClassAttr(C_sCellStyle_SummaryRight); 319 320 HF_DocEntryList 321 aDocuList(rDocu); 322 323 if ((*it).Info() != 0) 324 { 325 // aDocuList.Produce_Term("Comment on Base Reference"); 326 327 HF_IdlDocu 328 aDocuDisplay(Env(), aDocuList); 329 aDocuDisplay.Produce_fromReference(*(*it).Info(), i_ce); 330 } 331 else 332 { 333 const client * 334 pCe = Env().Linker().Search_CeFromType((*it).Type()); 335 const ce_info * 336 pShort = pCe != 0 337 ? Get_IdlDocu(pCe->Docu()) 338 : (const ce_info *)(0); 339 if ( pShort != 0 ) 340 { 341 aDocuList.Produce_NormalTerm("(referenced interface's summary:)"); 342 343 Xml::Element & 344 rDef = aDocuList.Produce_Definition(); 345 HF_IdlDocuTextDisplay 346 aShortDisplay( Env(), &rDef, *pCe); 347 pShort->Short().DisplayAt(aShortDisplay); 348 } // end if (pShort != 0) 349 } // endif ( (*i_commentedRef).Info() != 0 ) else 350 } // end for 351 } 352