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 "pm_index.hxx" 24 25 26 // NOT FULLY DEFINED SERVICES 27 #include <ary/cpp/c_gate.hxx> 28 #include <ary/cpp/c_class.hxx> 29 #include <ary/cpp/c_define.hxx> 30 #include <ary/cpp/c_enum.hxx> 31 #include <ary/cpp/c_enuval.hxx> 32 #include <ary/cpp/c_funct.hxx> 33 #include <ary/cpp/c_macro.hxx> 34 #include <ary/cpp/c_namesp.hxx> 35 #include <ary/cpp/c_tydef.hxx> 36 #include <ary/cpp/c_vari.hxx> 37 #include <ary/cpp/cp_ce.hxx> 38 #include "aryattrs.hxx" 39 #include "hd_chlst.hxx" 40 #include "hd_docu.hxx" 41 #include "html_kit.hxx" 42 #include "navibar.hxx" 43 #include "opageenv.hxx" 44 #include "pagemake.hxx" 45 #include "strconst.hxx" 46 47 using namespace csi; 48 using ary::GlobalId; 49 50 51 52 53 namespace 54 { 55 56 inline const char * 57 F_CK_Text( ary::cpp::E_ClassKey i_eCK ) 58 { 59 switch (i_eCK) 60 { 61 case ary::cpp::CK_class: return "class"; 62 case ary::cpp::CK_struct: return "struct"; 63 case ary::cpp::CK_union: return "union"; 64 } // end switch 65 return ""; 66 } 67 68 template <class CE> 69 inline const char * 70 F_OwnerType( const CE & i_rData, const ary::cpp::Gate & i_rGate ) 71 { 72 if ( i_rData.Protection() == ary::cpp::PROTECT_global ) 73 return "namespace "; 74 75 const ary::cpp::Class * 76 pClass = dynamic_cast< const ary::cpp::Class* >( 77 i_rGate.Ces().Search_Ce(i_rData.Owner()) ); 78 if (pClass != 0) 79 return F_CK_Text(pClass->ClassKey()); 80 return ""; 81 } 82 83 } // anonymous namespace 84 85 PageMaker_Index::PageMaker_Index( PageDisplay & io_rPage, 86 char i_c ) 87 : SpecializedPageMaker(io_rPage), 88 pNavi(0), 89 c(i_c), 90 pCurIndex(0) 91 { 92 } 93 94 PageMaker_Index::~PageMaker_Index() 95 { 96 } 97 98 void 99 PageMaker_Index::MakePage() 100 { 101 pNavi = new NavigationBar( Env(), NavigationBar::LOC_Index ); 102 103 Write_NavBar(); 104 Write_TopArea(); 105 Write_CompleteAlphabeticalList(); 106 } 107 108 void 109 PageMaker_Index::do_Process( const ary::cpp::Namespace & i_rData ) 110 { 111 Write_CeIndexEntry( i_rData, "namespace", "namespace" ); 112 } 113 114 void 115 PageMaker_Index::do_Process( const ary::cpp::Class & i_rData ) 116 { 117 // KORR_FUTURE 118 // Really throw out all anonymous classes from index? 119 120 if ( strncmp(i_rData.LocalName().c_str()+1,"_Anonymous",10) == 0 ) 121 return; 122 123 Write_CeIndexEntry( i_rData, 124 F_CK_Text(i_rData.ClassKey()), 125 F_OwnerType(i_rData, Env().Gate()) ); 126 } 127 128 void 129 PageMaker_Index::do_Process( const ary::cpp::Enum & i_rData ) 130 { 131 Write_CeIndexEntry( i_rData, "enum", F_OwnerType(i_rData, Env().Gate()) ); 132 } 133 134 void 135 PageMaker_Index::do_Process( const ary::cpp::Typedef & i_rData ) 136 { 137 Write_CeIndexEntry( i_rData, "typedef", F_OwnerType(i_rData, Env().Gate()) ); 138 } 139 140 void 141 PageMaker_Index::do_Process( const ary::cpp::Function & i_rData ) 142 { 143 Write_CeIndexEntry( i_rData, "function", F_OwnerType(i_rData, Env().Gate()) ); 144 } 145 146 void 147 PageMaker_Index::do_Process( const ary::cpp::Variable & i_rData ) 148 { 149 Write_CeIndexEntry( i_rData, "variable", F_OwnerType(i_rData, Env().Gate()) ); 150 } 151 152 void 153 PageMaker_Index::do_Process( const ary::cpp::EnumValue & i_rData ) 154 { 155 Write_CeIndexEntry( i_rData, "enum value", "" ); 156 } 157 158 void 159 PageMaker_Index::do_Process( const ary::cpp::Define & i_rData ) 160 { 161 String sFileName; 162 163 pCurIndex->AddEntry(); 164 pCurIndex->Term() 165 >> *new html::Link( Link2CppDefinition(Env(), i_rData) ) 166 >> *new html::Bold 167 << i_rData.LocalName(); 168 pCurIndex->Term() 169 << " - define"; 170 pCurIndex->Def() << " "; 171 } 172 173 void 174 PageMaker_Index::do_Process( const ary::cpp::Macro & i_rData ) 175 { 176 String sFileName; 177 178 pCurIndex->AddEntry(); 179 pCurIndex->Term() 180 >> *new html::Link( Link2CppDefinition(Env(), i_rData) ) 181 >> *new html::Bold 182 << i_rData.LocalName(); 183 pCurIndex->Term() 184 << " - macro"; 185 186 pCurIndex->Def() << " "; 187 } 188 189 const ary::cpp::Gate * 190 PageMaker_Index::inq_Get_ReFinder() const 191 { 192 return &Env().Gate(); 193 } 194 195 void 196 PageMaker_Index::Write_NavBar() 197 { 198 pNavi->Write( CurOut() ); 199 CurOut() << new html::HorizontalLine; 200 } 201 202 203 const String C_sAlphabet( 204 "<a href=\"index-1.html\"><B>A</B></a> <a href=\"index-2.html\"><B>B</B></a> <a href=\"index-3.html\"><B>C</B></a> <a href=\"index-4.html\"><B>D</B></a> <a href=\"index-5.html\"><B>E</B></a> " 205 "<a href=\"index-6.html\"><B>F</B></a> <a href=\"index-7.html\"><B>G</B></a> <a href=\"index-8.html\"><B>H</B></a> <a href=\"index-9.html\"><B>I</B></a> <a href=\"index-10.html\"><B>J</B></a> " 206 "<a href=\"index-11.html\"><B>K</B></a> <a href=\"index-12.html\"><B>L</B></a> <a href=\"index-13.html\"><B>M</B></a> <a href=\"index-14.html\"><B>N</B></a> <a href=\"index-15.html\"><B>O</B></a> " 207 "<a href=\"index-16.html\"><B>P</B></a> <a href=\"index-17.html\"><B>Q</B></a> <a href=\"index-18.html\"><B>R</B></a> <a href=\"index-19.html\"><B>S</B></a> <a href=\"index-20.html\"><B>T</B></a> " 208 "<a href=\"index-21.html\"><B>U</B></a> <a href=\"index-22.html\"><B>V</B></a> <a href=\"index-23.html\"><B>W</B></a> <a href=\"index-24.html\"><B>X</B></a> <a href=\"index-25.html\"><B>Y</B></a> " 209 "<a href=\"index-26.html\"><B>Z</B></a> <a href=\"index-27.html\"><B>_</B></a>" ); 210 211 void 212 PageMaker_Index::Write_TopArea() 213 { 214 String sLetter(&c, 1); 215 216 adcdisp::PageTitle_Std fTitle; 217 fTitle( CurOut(), "Global Index", sLetter ); 218 219 CurOut() >>* new html::Paragraph 220 << new html::AlignAttr("center") 221 << new xml::XmlCode(C_sAlphabet); 222 223 CurOut() << new html::HorizontalLine; 224 } 225 226 void 227 PageMaker_Index::Write_CompleteAlphabeticalList() 228 { 229 std::vector<GlobalId> 230 aThisPagesItems; 231 const ary::cpp::Gate & 232 rGate = Env().Gate(); 233 234 static char sBegin[] = "X"; 235 static char sEnd[] = "Y"; 236 237 switch ( c ) 238 { 239 case 'Z': sBegin[0] = 'Z'; 240 sEnd[0] = '_'; 241 break; 242 case '_': sBegin[0] = '_'; 243 sEnd[0] = '0'; 244 break; 245 default: sBegin[0] = c; 246 sEnd[0] = char(c + 1); 247 break; 248 } 249 250 uintt 251 nCount = rGate.Get_AlphabeticalList( aThisPagesItems, sBegin, sEnd ); 252 if (nCount > 0 ) 253 { 254 adcdisp::IndexList 255 aIndex(CurOut()); 256 pCurIndex = &aIndex; 257 258 std::vector<GlobalId>::const_iterator itEnd = aThisPagesItems.end(); 259 for ( std::vector<GlobalId>::const_iterator it = aThisPagesItems.begin(); 260 it != itEnd; 261 ++it ) 262 { 263 const ary::Entity * 264 pRe = rGate.Search_Entity( *it ); 265 if ( pRe != 0 ) 266 pRe->Accept(*this); 267 } // end for 268 269 pCurIndex = 0; 270 } // endif (nCount > 0) 271 } 272 273 void 274 PageMaker_Index::Write_CeIndexEntry( const ary::cpp::CodeEntity & 275 i_rCe, 276 const char * i_sType, 277 const char * i_sOwnerType ) 278 { 279 if ( Ce_IsInternal(i_rCe) ) 280 return; 281 282 static csv::StreamStr aQualification(500); 283 284 const ary::cpp::CodeEntity & 285 rOwner = Env().Gate().Ces().Find_Ce(i_rCe.Owner()); 286 287 pCurIndex->AddEntry(); 288 pCurIndex->Term() 289 >> *new html::Link( Link2Ce(Env(), i_rCe) ) 290 >> *new html::Bold 291 << i_rCe.LocalName(); 292 pCurIndex->Term() 293 << " - " 294 << i_sType; 295 296 if ( rOwner.Owner().IsValid() ) 297 { 298 aQualification.seekp(0); 299 Env().Gate().Ces().Get_QualifiedName( aQualification, 300 rOwner.LocalName(), 301 rOwner.Owner() ); 302 303 pCurIndex->Term() 304 << " in " 305 << i_sOwnerType 306 << " " 307 << aQualification.c_str(); 308 } 309 310 pCurIndex->Def() << " "; 311 } 312