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 "pagemake.hxx" 24 25 26 // NOT FULLY DEFINED SERVICES 27 #include <ary/cpp/c_gate.hxx> 28 #include <ary/cpp/c_namesp.hxx> 29 #include <ary/cpp/c_class.hxx> 30 #include <ary/cpp/c_enum.hxx> 31 #include <ary/cpp/c_tydef.hxx> 32 #include <ary/cpp/cp_ce.hxx> 33 #include <ary/loc/loc_file.hxx> 34 #include <display/corframe.hxx> 35 #include "hd_chlst.hxx" 36 #include "hd_docu.hxx" 37 #include "hdimpl.hxx" 38 #include "html_kit.hxx" 39 #include "navibar.hxx" 40 #include "opageenv.hxx" 41 #include "outfile.hxx" 42 #include "pm_aldef.hxx" 43 #include "pm_class.hxx" 44 #include "pm_help.hxx" 45 #include "pm_index.hxx" 46 #include "pm_namsp.hxx" 47 #include "pm_start.hxx" 48 #include "strconst.hxx" 49 50 51 using namespace csi; 52 using csi::html::Link; 53 using csi::html::HorizontalLine; 54 55 56 const int C_nNrOfIndexLetters = 27; 57 58 59 template <class SPECIAL_MAKER> 60 inline void 61 Make_SpecialPage( DYN SPECIAL_MAKER * let_dpMaker ) 62 { 63 Dyn< SPECIAL_MAKER > pMaker( let_dpMaker ); 64 pMaker->MakePage(); 65 pMaker = 0; 66 } 67 68 69 PageDisplay::PageDisplay( OuputPage_Environment & io_rEnv ) 70 : HtmlDisplay_Impl( io_rEnv ), 71 pMyFile( new HtmlDocuFile ) 72 { 73 } 74 75 PageDisplay::~PageDisplay() 76 { 77 78 } 79 80 void 81 PageDisplay::Create_OverviewFile() 82 { 83 Env().SetFile_Overview(); 84 File().SetLocation( Env().CurPath(), 0 ); 85 86 SetupFileOnCurEnv( C_sHFTitle_Overview ); 87 Make_SpecialPage( new PageMaker_Overview(*this) ); 88 Create_File(); 89 } 90 91 void 92 PageDisplay::Create_AllDefsFile() 93 { 94 // This method is a provisorium, because later this will 95 // be spreaded over the files. 96 97 Env().MoveDir_2Root(); 98 Env().SetFile_AllDefs(); 99 File().SetLocation( Env().CurPath(), 0 ); 100 101 SetupFileOnCurEnv( "Defines and Macros" ); 102 Make_SpecialPage( new PageMaker_AllDefs(*this) ); 103 Create_File(); 104 } 105 106 void 107 PageDisplay::Create_IndexFiles() 108 { 109 Env().MoveDir_2Index(); 110 111 for ( int i = 0; i < C_nNrOfIndexLetters; ++i ) 112 Create_IndexFile(i); 113 } 114 115 void 116 PageDisplay::Create_HelpFile() 117 { 118 Env().SetFile_Help(); 119 File().SetLocation( Env().CurPath(), 0 ); 120 121 SetupFileOnCurEnv( C_sHFTitle_Help ); 122 Make_SpecialPage( new PageMaker_Help(*this) ); 123 Create_File(); 124 } 125 126 void 127 PageDisplay::Create_NamespaceFile() 128 { 129 csv_assert( Env().CurNamespace() != 0 ); 130 Env().SetFile_CurNamespace(); 131 File().SetLocation( Env().CurPath(), Env().Depth() ); 132 if (Env().CurNamespace()->Owner().IsValid()) 133 { 134 StreamLock sNsp(100); 135 SetupFileOnCurEnv( sNsp() << C_sHFTypeTitle_Namespace 136 << " " 137 << Env().CurNamespace()->LocalName() 138 << c_str ); 139 } 140 else 141 { 142 SetupFileOnCurEnv( C_sHFTitle_GlobalNamespaceCpp ); 143 } 144 145 Make_SpecialPage( new PageMaker_Namespace(*this) ); 146 147 Create_File(); 148 } 149 150 void 151 PageDisplay::Setup_OperationsFile_for( const ary::loc::File & i_rFile ) 152 { 153 csv_assert( Env().CurNamespace() != 0 ); 154 Env().SetFile_Operations(&i_rFile); 155 File().SetLocation( Env().CurPath(), Env().Depth() ); 156 157 StreamLock sOpFile(100); 158 SetupFileOnCurEnv( sOpFile() << "Global Functions in Namespace " 159 << Env().CurNamespace()->LocalName() 160 << " in Sourcefile " 161 << i_rFile.LocalName() 162 << c_str ); 163 NavigationBar 164 aNavi( Env(), 165 NavigationBar::CEGT_operations ); 166 aNavi.Write( CurOut() ); 167 CurOut() << new HorizontalLine; 168 169 adcdisp::PageTitle_Std fTitle; 170 csi::xml::Element & rTitle = fTitle( CurOut() ); 171 if (Env().CurNamespace()->Owner().IsValid()) 172 { 173 rTitle << "Global Functions in Namespace " 174 << Env().CurNamespace()->LocalName(); 175 } 176 else 177 { 178 rTitle << "Global Functions in Global Namespace C++"; 179 } 180 181 rTitle << new html::LineBreak 182 << "in Sourcefile " 183 << i_rFile.LocalName(); 184 CurOut() << new HorizontalLine; 185 } 186 187 void 188 PageDisplay::Setup_OperationsFile_for( const ary::cpp::Class & i_rClass ) 189 { 190 csv_assert( Env().CurNamespace() != 0 ); 191 Env().SetFile_Operations(0); 192 File().SetLocation( Env().CurPath(), Env().Depth() ); 193 194 StreamLock sOpFile(100); 195 SetupFileOnCurEnv( sOpFile() << "Methods of Class " 196 << i_rClass.LocalName() 197 << c_str ); 198 NavigationBar 199 aNavi( Env(), 200 NavigationBar::CEGT_operations ); 201 aNavi.Write( CurOut() ); 202 CurOut() << new HorizontalLine; 203 204 adcdisp::PageTitle_Std fTitle; 205 fTitle( CurOut(), "Methods of Class", i_rClass.LocalName() ); 206 207 CurOut() << new HorizontalLine; 208 } 209 210 void 211 PageDisplay::Setup_DataFile_for( const ary::loc::File & i_rFile ) 212 { 213 csv_assert( Env().CurNamespace() != 0 ); 214 Env().SetFile_Data(&i_rFile); 215 File().SetLocation( Env().CurPath(), Env().Depth() ); 216 217 StreamLock sDataFile(100); 218 SetupFileOnCurEnv( sDataFile() << "Global Data in Namespace " 219 << Env().CurNamespace()->LocalName() 220 << " in Sourcefile " 221 << i_rFile.LocalName() 222 << c_str ); 223 NavigationBar 224 aNavi( Env(), 225 NavigationBar::CEGT_data ); 226 aNavi.Write( CurOut() ); 227 CurOut() << new HorizontalLine; 228 229 adcdisp::PageTitle_Std fTitle; 230 csi::xml::Element & rTitle = fTitle( CurOut() ); 231 if ( Env().CurNamespace()->Owner().IsValid() ) 232 { 233 rTitle << "Global Data in Namespace " 234 << Env().CurNamespace()->LocalName(); 235 } 236 else 237 { 238 rTitle << "Global Data in Global Namespace C++"; 239 } 240 241 rTitle 242 << new html::LineBreak 243 << "in Sourcefile " 244 << i_rFile.LocalName(); 245 CurOut() << new HorizontalLine; 246 } 247 248 void 249 PageDisplay::Setup_DataFile_for( const ary::cpp::Class & i_rClass ) 250 { 251 csv_assert( Env().CurNamespace() != 0 ); 252 Env().SetFile_Data(0); 253 File().SetLocation( Env().CurPath(), Env().Depth() ); 254 255 StreamLock sDataFile(100); 256 SetupFileOnCurEnv( sDataFile() << "Data of Class " 257 << i_rClass.LocalName() 258 << c_str ); 259 260 NavigationBar 261 aNavi( Env(), 262 NavigationBar::CEGT_data ); 263 aNavi.Write( CurOut() ); 264 CurOut() << new HorizontalLine; 265 266 adcdisp::PageTitle_Std fTitle; 267 fTitle( CurOut(), "Data of Class", i_rClass.LocalName() ); 268 269 CurOut() << new HorizontalLine; 270 } 271 272 void 273 PageDisplay::Create_File() 274 { 275 Easy().Leave(); 276 File().CreateFile(); 277 } 278 279 void 280 PageDisplay::do_Process(const ary::cpp::Class & i_rData) 281 { 282 Env().SetFile_Class(i_rData); 283 File().SetLocation( Env().CurPath(), Env().Depth() ); 284 285 const char * 286 sTypeTitle = i_rData.ClassKey() == ary::cpp::CK_class 287 ? C_sHFTypeTitle_Class 288 : i_rData.ClassKey() == ary::cpp::CK_struct 289 ? C_sHFTypeTitle_Struct 290 : C_sHFTypeTitle_Union; 291 StreamLock sClassFile(60); 292 SetupFileOnCurEnv( sClassFile() << sTypeTitle 293 << " " 294 << i_rData.LocalName() 295 << c_str ); 296 297 Make_SpecialPage( new PageMaker_Class(*this, i_rData) ); 298 299 Create_File(); 300 } 301 302 void 303 PageDisplay::do_Process(const ary::cpp::Enum & i_rData) 304 { 305 if ( Ce_IsInternal(i_rData) ) 306 return; 307 308 Env().SetFile_Enum(i_rData); 309 File().SetLocation( Env().CurPath(), Env().Depth() ); 310 311 StreamLock sEnumFile(100); 312 SetupFileOnCurEnv( sEnumFile() << C_sHFTypeTitle_Enum 313 << " " 314 << i_rData.LocalName() 315 << c_str ); 316 Write_NavBar_Enum(i_rData); 317 Write_TopArea_Enum(i_rData); 318 Write_DocuArea_Enum(i_rData); 319 Write_ChildList_Enum(i_rData); 320 321 Create_File(); 322 } 323 324 void 325 PageDisplay::do_Process(const ary::cpp::Typedef & i_rData) 326 { 327 if ( Ce_IsInternal(i_rData) ) 328 return; 329 330 Env().SetFile_Typedef(i_rData); 331 File().SetLocation( Env().CurPath(), Env().Depth() ); 332 333 StreamLock sTypedefFile(100); 334 SetupFileOnCurEnv( sTypedefFile() << C_sHFTypeTitle_Typedef 335 << " " 336 << i_rData.LocalName() 337 << c_str ); 338 Write_NavBar_Typedef(i_rData); 339 Write_TopArea_Typedef(i_rData); 340 Write_DocuArea_Typedef(i_rData); 341 342 343 Create_File(); 344 } 345 346 void 347 PageDisplay::Write_NameChainWithLinks( const ary::cpp::CodeEntity & i_rCe ) 348 { 349 if ( Env().CurNamespace()->Id() != i_rCe.Id() ) 350 { 351 RecursiveWrite_NamespaceLink( Env().CurNamespace() ); 352 if ( Env().CurClass() != 0 ) 353 { 354 CurOut() << new html::Sbr; 355 RecursiveWrite_ClassLink( Env().CurClass(), 1 ); 356 } 357 } 358 else 359 { 360 RecursiveWrite_NamespaceLink( Env().CurNamespace()->Parent() ); 361 } 362 } 363 364 const ary::cpp::Gate * 365 PageDisplay::inq_Get_ReFinder() const 366 { 367 return &Env().Gate(); 368 } 369 370 void 371 PageDisplay::RecursiveWrite_NamespaceLink( const ary::cpp::Namespace * i_pNamespace ) 372 { 373 if ( i_pNamespace == 0 ) 374 { 375 return; 376 } 377 else if (NOT i_pNamespace->Owner().IsValid()) 378 { // Global namespace: 379 StreamLock sNspDir(50); 380 CurOut() 381 >> *new Link( PathPerRoot(Env(), 382 sNspDir() << C_sDIR_NamespacesCpp 383 << "/" 384 << C_sHFN_Namespace 385 << c_str) ) 386 << new xml::AnAttribute( "alt", C_sHFTitle_GlobalNamespaceCpp ) 387 >> *new html::Font 388 << new html::SizeAttr("+1") 389 >> *new html::Bold 390 << "::"; 391 CurOut() 392 << " "; 393 return; 394 } 395 else 396 { 397 RecursiveWrite_NamespaceLink( i_pNamespace->Parent() ); 398 } 399 400 uintt nLevelDistance = Env().Depth() - ( i_pNamespace->Depth() + 1 ); 401 csv_assert( nLevelDistance < 100 ); 402 CurOut() 403 >> *new Link( PathPerLevelsUp(nLevelDistance, C_sHFN_Namespace) ) 404 << new xml::AnAttribute( "alt", C_sHFTypeTitle_Namespace) 405 >> *new html::Font 406 << new html::SizeAttr("+1") 407 >> *new html::Bold 408 << i_pNamespace->LocalName(); 409 CurOut() 410 >> *new html::Font 411 << new html::SizeAttr("+1") 412 << " :: "; 413 } 414 415 void 416 PageDisplay::RecursiveWrite_ClassLink( const ary::cpp::Class * i_pClass, 417 uintt i_nLevelDistance ) 418 { 419 if ( i_pClass == 0 ) 420 return; 421 422 if ( i_pClass->Protection() != ary::cpp::PROTECT_global ) 423 { 424 RecursiveWrite_ClassLink( 425 dynamic_cast< const ary::cpp::Class* >( 426 Env().Gate().Ces().Search_Ce(i_pClass->Owner())), 427 i_nLevelDistance + 1 ); 428 } 429 430 CurOut() 431 >> *new Link( Path2Class(i_nLevelDistance, i_pClass->LocalName()) ) 432 << new html::ClassAttr("nqclass") 433 << i_pClass->LocalName() 434 << " :: "; 435 } 436 437 void 438 PageDisplay::SetupFileOnCurEnv( const char * i_sTitle ) 439 { 440 File().SetLocation( Env().CurPath(), Env().Depth() ); 441 File().SetTitle( i_sTitle ); 442 File().SetCopyright( Env().Layout().CopyrightText() ); 443 File().EmptyBody(); 444 445 // This sets CurOut() to the contents of <body></body> 446 // in File() : 447 Easy().Enter( File().Body() ); 448 } 449 450 void 451 PageDisplay::Write_NavBar_Enum( const ary::cpp::Enum & i_rData ) 452 { 453 NavigationBar aNavi( Env(), i_rData ); 454 aNavi.MakeSubRow("List of"); 455 aNavi.AddItem( C_sTitle_EnumValues, C_sLabel_EnumValues, true ); 456 aNavi.Write( CurOut(), true ); 457 458 CurOut() << new HorizontalLine; 459 } 460 461 void 462 PageDisplay::Write_TopArea_Enum( const ary::cpp::Enum & i_rData ) 463 { 464 Write_NameChainWithLinks( i_rData ); 465 466 adcdisp::PageTitle_Std fTitle; 467 fTitle( CurOut(), C_sHFTypeTitle_Enum, i_rData.LocalName() ); 468 469 CurOut() << new HorizontalLine; 470 } 471 472 void 473 PageDisplay::Write_DocuArea_Enum( const ary::cpp::Enum & i_rData ) 474 { 475 Docu_Display aDocuShow( Env() ); 476 477 aDocuShow.Assign_Out(CurOut()); 478 aDocuShow.Process(i_rData.Docu()); 479 aDocuShow.Unassign_Out(); 480 481 CurOut() << new HorizontalLine; 482 } 483 484 void 485 PageDisplay::Write_ChildList_Enum( const ary::cpp::Enum & i_rData ) 486 { 487 bool bChildrenExist = false; 488 ChildList_Display::Area_Result 489 aResult( bChildrenExist, CurOut() ); 490 491 ChildList_Display aDisplay(Env(), i_rData); 492 aDisplay.Run_Simple( aResult, 493 ary::cpp::Enum::SLOT_Values, 494 C_sLabel_EnumValues, 495 C_sTitle_EnumValues ); 496 497 if (NOT bChildrenExist) 498 CurOut() >> *new html::Headline(4) << "This enum has no values."; 499 CurOut() << new HorizontalLine; 500 } 501 502 void 503 PageDisplay::Write_NavBar_Typedef( const ary::cpp::Typedef & i_rData ) 504 { 505 NavigationBar aNavi( Env(), i_rData ); 506 aNavi.Write( CurOut(), true ); 507 508 CurOut() << new HorizontalLine; 509 } 510 511 void 512 PageDisplay::Write_TopArea_Typedef( const ary::cpp::Typedef & i_rData ) 513 { 514 Write_NameChainWithLinks( i_rData ); 515 516 adcdisp::PageTitle_Std fTitle; 517 fTitle( CurOut(), C_sHFTypeTitle_Typedef, i_rData.LocalName() ); 518 519 CurOut() << new HorizontalLine; 520 } 521 522 void 523 PageDisplay::Write_DocuArea_Typedef( const ary::cpp::Typedef & i_rData ) 524 { 525 adcdisp::ExplanationList aDef( CurOut() ); 526 aDef.AddEntry("Definition:"); 527 xml::Element & rDef = aDef.Def(); 528 529 ary::cpp::Type_id 530 nDefiningType = i_rData.DescribingType(); 531 532 const ary::cpp::CodeEntity * 533 pRelatedCe = Env().Gate().Search_RelatedCe(nDefiningType); 534 if ( pRelatedCe != 0 ) 535 { 536 const char * sTypeKey = Get_TypeKey(*pRelatedCe); 537 if ( NOT csv::no_str(sTypeKey) ) 538 rDef << sTypeKey << " "; 539 } 540 541 dshelp::Get_LinkedTypeText( rDef, Env(), nDefiningType ); 542 543 Docu_Display aDocuShow( Env() ); 544 545 aDocuShow.Assign_Out(CurOut()); 546 aDocuShow.Process(i_rData.Docu()); 547 aDocuShow.Unassign_Out(); 548 549 CurOut() << new HorizontalLine; 550 } 551 552 void 553 PageDisplay::Create_IndexFile( int i_nLetter ) 554 { 555 static char aLetters[C_nNrOfIndexLetters+1] = "ABCDEFGHIJKLMNOPQRSTUVWXYZ_"; 556 csv_assert( 0 <= i_nLetter AND i_nLetter < C_nNrOfIndexLetters ); 557 558 char cCurLetter = aLetters[i_nLetter]; 559 Env().SetFile_Index( cCurLetter ); 560 561 static char sIndexFileTitle[] = "Global Index X"; 562 const int nPositionOfLetterInTitle = 13; 563 sIndexFileTitle[nPositionOfLetterInTitle] = cCurLetter; 564 SetupFileOnCurEnv( sIndexFileTitle ); 565 566 Make_SpecialPage( new PageMaker_Index(*this, cCurLetter ) ); 567 568 Create_File(); 569 } 570 571