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