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