1*0841af79SAndrew Rist /**************************************************************
2cdf0e10cSrcweir  *
3*0841af79SAndrew Rist  * Licensed to the Apache Software Foundation (ASF) under one
4*0841af79SAndrew Rist  * or more contributor license agreements.  See the NOTICE file
5*0841af79SAndrew Rist  * distributed with this work for additional information
6*0841af79SAndrew Rist  * regarding copyright ownership.  The ASF licenses this file
7*0841af79SAndrew Rist  * to you under the Apache License, Version 2.0 (the
8*0841af79SAndrew Rist  * "License"); you may not use this file except in compliance
9*0841af79SAndrew Rist  * with the License.  You may obtain a copy of the License at
10*0841af79SAndrew Rist  *
11*0841af79SAndrew Rist  *   http://www.apache.org/licenses/LICENSE-2.0
12*0841af79SAndrew Rist  *
13*0841af79SAndrew Rist  * Unless required by applicable law or agreed to in writing,
14*0841af79SAndrew Rist  * software distributed under the License is distributed on an
15*0841af79SAndrew Rist  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16*0841af79SAndrew Rist  * KIND, either express or implied.  See the License for the
17*0841af79SAndrew Rist  * specific language governing permissions and limitations
18*0841af79SAndrew Rist  * under the License.
19*0841af79SAndrew Rist  *
20*0841af79SAndrew Rist  *************************************************************/
21cdf0e10cSrcweir 
22cdf0e10cSrcweir #include <precomp.h>
23cdf0e10cSrcweir #include "pm_class.hxx"
24cdf0e10cSrcweir 
25cdf0e10cSrcweir 
26cdf0e10cSrcweir // NOT FULLY DEFINED SERVICES
27cdf0e10cSrcweir #include <ary/cpp/c_gate.hxx>
28cdf0e10cSrcweir #include <ary/cpp/c_class.hxx>
29cdf0e10cSrcweir #include <ary/cpp/c_tydef.hxx>
30cdf0e10cSrcweir #include <ary/cpp/cp_ce.hxx>
31cdf0e10cSrcweir #include <ary/loc/loc_file.hxx>
32cdf0e10cSrcweir #include <ary/loc/locp_le.hxx>
33cdf0e10cSrcweir #include <ary/getncast.hxx>
34cdf0e10cSrcweir #include "hd_chlst.hxx"
35cdf0e10cSrcweir #include "hd_docu.hxx"
36cdf0e10cSrcweir #include "hdimpl.hxx"
37cdf0e10cSrcweir #include "html_kit.hxx"
38cdf0e10cSrcweir #include "navibar.hxx"
39cdf0e10cSrcweir #include "opageenv.hxx"
40cdf0e10cSrcweir #include "pagemake.hxx"
41cdf0e10cSrcweir #include "strconst.hxx"
42cdf0e10cSrcweir 
43cdf0e10cSrcweir using namespace adcdisp;
44cdf0e10cSrcweir 
45cdf0e10cSrcweir using namespace csi;
46cdf0e10cSrcweir using csi::html::HorizontalLine;
47cdf0e10cSrcweir using csi::html::LineBreak;
48cdf0e10cSrcweir using csi::html::Link;
49cdf0e10cSrcweir using csi::html::Table;
50cdf0e10cSrcweir using csi::html::TableRow;
51cdf0e10cSrcweir using csi::html::TableCell;
52cdf0e10cSrcweir 
53cdf0e10cSrcweir using ary::cpp::CesConstIterator;
54cdf0e10cSrcweir using ary::doc::OldCppDocu;
55cdf0e10cSrcweir 
56cdf0e10cSrcweir const char * const C_sTitle_InnerClasses    = "Classes";
57cdf0e10cSrcweir const char * const C_sTitle_InnerStructs    = "Structs";
58cdf0e10cSrcweir const char * const C_sTitle_InnerUnions     = "Unions";
59cdf0e10cSrcweir const char * const C_sTitle_Methods         = "Methods";
60cdf0e10cSrcweir const char * const C_sTitle_StaticMethods   = "Static Methods";
61cdf0e10cSrcweir const char * const C_sTitle_Data            = "Data";
62cdf0e10cSrcweir const char * const C_sTitle_StaticData      = "Static Data";
63cdf0e10cSrcweir 
64cdf0e10cSrcweir const char * const C_sLabel_StaticOperations    = "static_ops";
65cdf0e10cSrcweir const char * const C_sLabel_StaticVariables     = "static_vars";
66cdf0e10cSrcweir 
67cdf0e10cSrcweir const char * const   C_sTitlePublic      = "Public Members";
68cdf0e10cSrcweir const char * const   C_sTitleProtected   = "Protected Members";
69cdf0e10cSrcweir const char * const   C_sTitlePrivate     = "Private Members";
70cdf0e10cSrcweir const char * const   C_sMprTitles[3]     = { C_sTitlePublic,
71cdf0e10cSrcweir                                              C_sTitleProtected,
72cdf0e10cSrcweir                                              C_sTitlePrivate
73cdf0e10cSrcweir                                            };
74cdf0e10cSrcweir const char * const   C_sSummaryTitlePublic      = "Public Members";
75cdf0e10cSrcweir const char * const   C_sSummaryTitleProtected   = "Protected Members";
76cdf0e10cSrcweir const char * const   C_sSummaryTitlePrivate     = "Private Members";
77cdf0e10cSrcweir const char *
78cdf0e10cSrcweir         C_sMprSummaryTitles[3] =
79cdf0e10cSrcweir         { C_sSummaryTitlePublic, C_sSummaryTitleProtected, C_sSummaryTitlePrivate };
80cdf0e10cSrcweir const char *
81cdf0e10cSrcweir         C_sMprPrefixes[3] =
82cdf0e10cSrcweir         { "publ_", "prot_", "priv_" };
83cdf0e10cSrcweir const char *
84cdf0e10cSrcweir         C_sSummaryItems_Titles[PageMaker_Class::cl_MAX] =
85cdf0e10cSrcweir         { C_sTitle_InnerClasses, C_sTitle_InnerStructs, C_sTitle_InnerUnions,
86cdf0e10cSrcweir           C_sTitle_Enums, C_sTitle_Typedefs,
87cdf0e10cSrcweir           C_sTitle_Methods, C_sTitle_StaticMethods, C_sTitle_Data, C_sTitle_StaticData };
88cdf0e10cSrcweir const char *
89cdf0e10cSrcweir         C_sSummaryItems_Labels[PageMaker_Class::cl_MAX] =
90cdf0e10cSrcweir         { C_sLabel_Classes, C_sLabel_Structs, C_sLabel_Unions,
91cdf0e10cSrcweir           C_sLabel_Enums, C_sLabel_Typedefs,
92cdf0e10cSrcweir           C_sLabel_Operations, C_sLabel_StaticOperations,
93cdf0e10cSrcweir           C_sLabel_Variables, C_sLabel_StaticVariables };
94cdf0e10cSrcweir 
95cdf0e10cSrcweir 
96cdf0e10cSrcweir const ary::cpp::E_Protection
97cdf0e10cSrcweir         aProt[3] = { ary::cpp::PROTECT_public,
98cdf0e10cSrcweir                      ary::cpp::PROTECT_protected,
99cdf0e10cSrcweir                      ary::cpp::PROTECT_private };
100cdf0e10cSrcweir 
101cdf0e10cSrcweir 
PageMaker_Class(PageDisplay & io_rPage,const ary::cpp::Class & i_rClass)102cdf0e10cSrcweir PageMaker_Class::PageMaker_Class( PageDisplay &             io_rPage,
103cdf0e10cSrcweir                                   const ary::cpp::Class &   i_rClass )
104cdf0e10cSrcweir     :   SpecializedPageMaker(io_rPage),
105cdf0e10cSrcweir         pMe( &i_rClass ),
106cdf0e10cSrcweir         pChildDisplay( new ChildList_Display(io_rPage.Env(), i_rClass) ),
107cdf0e10cSrcweir         pNavi(0)
108cdf0e10cSrcweir         // pProtectionArea,
109cdf0e10cSrcweir         // bChildLists_Exist
110cdf0e10cSrcweir {
111cdf0e10cSrcweir     int i_max = 3 * cl_MAX;
112cdf0e10cSrcweir     for (int i = 0; i < i_max; i++)
113cdf0e10cSrcweir     {
114cdf0e10cSrcweir         bChildLists_Exist[i] = false;
115cdf0e10cSrcweir     }  // end for
116cdf0e10cSrcweir }
117cdf0e10cSrcweir 
~PageMaker_Class()118cdf0e10cSrcweir PageMaker_Class::~PageMaker_Class()
119cdf0e10cSrcweir {
120cdf0e10cSrcweir }
121cdf0e10cSrcweir 
122cdf0e10cSrcweir void
MakePage()123cdf0e10cSrcweir PageMaker_Class::MakePage()
124cdf0e10cSrcweir {
125cdf0e10cSrcweir     pNavi = new NavigationBar( Env(), Me() );
126cdf0e10cSrcweir 
127cdf0e10cSrcweir     Write_NavBar();
128cdf0e10cSrcweir     Write_TopArea();
129cdf0e10cSrcweir     Write_DocuArea();
130cdf0e10cSrcweir     Write_ChildLists();
131cdf0e10cSrcweir 
132cdf0e10cSrcweir     pNavi->Write_SubRows();
133cdf0e10cSrcweir     pNavi = 0;
134cdf0e10cSrcweir }
135cdf0e10cSrcweir 
136cdf0e10cSrcweir void
Write_NavBar()137cdf0e10cSrcweir PageMaker_Class::Write_NavBar()
138cdf0e10cSrcweir {
139cdf0e10cSrcweir     NavigationBar   aNavi( Env(), Me() );
140cdf0e10cSrcweir     pNavi->Write( CurOut() );
141cdf0e10cSrcweir     CurOut() << new HorizontalLine;
142cdf0e10cSrcweir }
143cdf0e10cSrcweir 
144cdf0e10cSrcweir inline bool
IsInterface(const ary::doc::Documentation & i_doc)145cdf0e10cSrcweir IsInterface(const ary::doc::Documentation & i_doc)
146cdf0e10cSrcweir {
147cdf0e10cSrcweir     const OldCppDocu *
148cdf0e10cSrcweir         doc = Get_CppDocu(i_doc);
149cdf0e10cSrcweir     return doc != 0
150cdf0e10cSrcweir             ?   doc->IsInterface()
151cdf0e10cSrcweir             :   false;
152cdf0e10cSrcweir }
153cdf0e10cSrcweir 
154cdf0e10cSrcweir void
Write_TopArea()155cdf0e10cSrcweir PageMaker_Class::Write_TopArea()
156cdf0e10cSrcweir {
157cdf0e10cSrcweir     TemplateClause fTemplateClause;
158cdf0e10cSrcweir     PageTitle_Std fTitle;
159cdf0e10cSrcweir 
160cdf0e10cSrcweir     Page().Write_NameChainWithLinks( Me() );
161cdf0e10cSrcweir 
162cdf0e10cSrcweir     fTemplateClause( CurOut(), Me().TemplateParameters() );
163cdf0e10cSrcweir     fTitle( CurOut(), Get_ClassTypeKey(Me()), Me().LocalName() );
164cdf0e10cSrcweir 
165cdf0e10cSrcweir     CurOut() << new HorizontalLine;
166cdf0e10cSrcweir 
167cdf0e10cSrcweir     Write_BaseHierarchy();
168cdf0e10cSrcweir     Write_DerivedList();
169cdf0e10cSrcweir 
170cdf0e10cSrcweir     CurOut() << new LineBreak;
171cdf0e10cSrcweir 
172cdf0e10cSrcweir     adcdisp::FlagTable
173cdf0e10cSrcweir         aFlags( CurOut(), 4 );
174cdf0e10cSrcweir     aFlags.SetColumn( 0, "virtual",
175cdf0e10cSrcweir                       Me().Virtuality() != ary::cpp::VIRTUAL_none );
176cdf0e10cSrcweir     aFlags.SetColumn( 1, "abstract",
177cdf0e10cSrcweir                       Me().Virtuality() == ary::cpp::VIRTUAL_abstract );
178cdf0e10cSrcweir     aFlags.SetColumn( 2, "interface",
179cdf0e10cSrcweir                       IsInterface(Me().Docu())
180cdf0e10cSrcweir                       OR  Me().Virtuality() == ary::cpp::VIRTUAL_abstract );
181cdf0e10cSrcweir     aFlags.SetColumn( 3, "template",
182cdf0e10cSrcweir                       Me().TemplateParameters().size() > 0 );
183cdf0e10cSrcweir }
184cdf0e10cSrcweir 
185cdf0e10cSrcweir void
Write_DocuArea()186cdf0e10cSrcweir PageMaker_Class::Write_DocuArea()
187cdf0e10cSrcweir {
188cdf0e10cSrcweir     Docu_Display aDocuShow( Env() );
189cdf0e10cSrcweir 
190cdf0e10cSrcweir     aDocuShow.Assign_Out(CurOut());
191cdf0e10cSrcweir     Me().Accept( aDocuShow );
192cdf0e10cSrcweir     aDocuShow.Unassign_Out();
193cdf0e10cSrcweir 
194cdf0e10cSrcweir     ary::loc::File &
195cdf0e10cSrcweir         rFile = Env().Gate().Locations().Find_File( Me().Location() );
196cdf0e10cSrcweir 
197cdf0e10cSrcweir     adcdisp::ExplanationList
198cdf0e10cSrcweir         aFileText( CurOut() );
199cdf0e10cSrcweir     aFileText.AddEntry("File");
200cdf0e10cSrcweir     aFileText.Def()
201cdf0e10cSrcweir         << rFile.LocalName();
202cdf0e10cSrcweir 
203cdf0e10cSrcweir     CurOut() << new HorizontalLine;
204cdf0e10cSrcweir }
205cdf0e10cSrcweir 
206cdf0e10cSrcweir void
Write_ChildLists()207cdf0e10cSrcweir PageMaker_Class::Write_ChildLists()
208cdf0e10cSrcweir {
209cdf0e10cSrcweir     int i_max = 3 * cl_MAX;
210cdf0e10cSrcweir     for (int i = 0; i < i_max; i++)
211cdf0e10cSrcweir     {
212cdf0e10cSrcweir         bChildLists_Exist[i] = false;
213cdf0e10cSrcweir     }  // end for
214cdf0e10cSrcweir 
215cdf0e10cSrcweir     csi::html::DefListDefinition &
216cdf0e10cSrcweir             rPublic = Setup_MemberSegment_Out( mp_public );
217cdf0e10cSrcweir     csi::html::DefListDefinition &
218cdf0e10cSrcweir             rProtected = Setup_MemberSegment_Out( mp_protected );
219cdf0e10cSrcweir     csi::html::DefListDefinition &
220cdf0e10cSrcweir             rPrivate = Setup_MemberSegment_Out( mp_private );
221cdf0e10cSrcweir 
222cdf0e10cSrcweir     Write_ChildList_forClasses( rPublic,
223cdf0e10cSrcweir                                 rProtected,
224cdf0e10cSrcweir                                 rPrivate,
225cdf0e10cSrcweir                                 C_sLabel_Classes,
226cdf0e10cSrcweir                                 C_sTitle_InnerClasses,
227cdf0e10cSrcweir                                 ary::cpp::CK_class );
228cdf0e10cSrcweir     Write_ChildList_forClasses( rPublic,
229cdf0e10cSrcweir                                 rProtected,
230cdf0e10cSrcweir                                 rPrivate,
231cdf0e10cSrcweir                                 C_sLabel_Structs,
232cdf0e10cSrcweir                                 C_sTitle_InnerStructs,
233cdf0e10cSrcweir                                 ary::cpp::CK_struct );
234cdf0e10cSrcweir     Write_ChildList_forClasses( rPublic,
235cdf0e10cSrcweir                                 rProtected,
236cdf0e10cSrcweir                                 rPrivate,
237cdf0e10cSrcweir                                 C_sLabel_Unions,
238cdf0e10cSrcweir                                 C_sTitle_InnerUnions,
239cdf0e10cSrcweir                                 ary::cpp::CK_union );
240cdf0e10cSrcweir 
241cdf0e10cSrcweir     Write_ChildList( ary::cpp::Class::SLOT_Enums,
242cdf0e10cSrcweir                      cl_Enums,
243cdf0e10cSrcweir                      C_sLabel_Enums,
244cdf0e10cSrcweir                      C_sTitle_Enums,
245cdf0e10cSrcweir                      rPublic,
246cdf0e10cSrcweir                      rProtected,
247cdf0e10cSrcweir                      rPrivate );
248cdf0e10cSrcweir     Write_ChildList( ary::cpp::Class::SLOT_Typedefs,
249cdf0e10cSrcweir                      cl_Typedefs,
250cdf0e10cSrcweir                      C_sLabel_Typedefs,
251cdf0e10cSrcweir                      C_sTitle_Typedefs,
252cdf0e10cSrcweir                      rPublic,
253cdf0e10cSrcweir                      rProtected,
254cdf0e10cSrcweir                      rPrivate );
255cdf0e10cSrcweir 
256cdf0e10cSrcweir     Write_ChildList( ary::cpp::Class::SLOT_Operations,
257cdf0e10cSrcweir                      cl_Operations,
258cdf0e10cSrcweir                      C_sLabel_Operations,
259cdf0e10cSrcweir                      C_sTitle_Methods,
260cdf0e10cSrcweir                      rPublic,
261cdf0e10cSrcweir                      rProtected,
262cdf0e10cSrcweir                      rPrivate );
263cdf0e10cSrcweir     Write_ChildList( ary::cpp::Class::SLOT_StaticOperations,
264cdf0e10cSrcweir                      cl_StaticOperations,
265cdf0e10cSrcweir                      C_sLabel_StaticOperations,
266cdf0e10cSrcweir                      C_sTitle_StaticMethods,
267cdf0e10cSrcweir                      rPublic,
268cdf0e10cSrcweir                      rProtected,
269cdf0e10cSrcweir                      rPrivate );
270cdf0e10cSrcweir     Write_ChildList( ary::cpp::Class::SLOT_Data,
271cdf0e10cSrcweir                      cl_Data,
272cdf0e10cSrcweir                      C_sLabel_Variables,
273cdf0e10cSrcweir                      C_sTitle_Data,
274cdf0e10cSrcweir                      rPublic,
275cdf0e10cSrcweir                      rProtected,
276cdf0e10cSrcweir                      rPrivate );
277cdf0e10cSrcweir     Write_ChildList( ary::cpp::Class::SLOT_StaticData,
278cdf0e10cSrcweir                      cl_StaticData,
279cdf0e10cSrcweir                      C_sLabel_StaticVariables,
280cdf0e10cSrcweir                      C_sTitle_StaticData,
281cdf0e10cSrcweir                      rPublic,
282cdf0e10cSrcweir                      rProtected,
283cdf0e10cSrcweir                      rPrivate );
284cdf0e10cSrcweir 
285cdf0e10cSrcweir     Create_NaviSubRow(mp_public);       // Also puts out or deletes pPublic.
286cdf0e10cSrcweir     Create_NaviSubRow(mp_protected);    // Also puts out or deletes pProtected.
287cdf0e10cSrcweir     Create_NaviSubRow(mp_private);      // Also puts out or deletes pPrivate.
288cdf0e10cSrcweir }
289cdf0e10cSrcweir 
290cdf0e10cSrcweir void
Write_ChildList(ary::SlotAccessId i_nSlot,E_ChidList i_eChildListIndex,const char * i_sLabel,const char * i_sListTitle,csi::xml::Element & o_rPublic,csi::xml::Element & o_rProtected,csi::xml::Element & o_rPrivate)291cdf0e10cSrcweir PageMaker_Class::Write_ChildList( ary::SlotAccessId   i_nSlot,
292cdf0e10cSrcweir                                   E_ChidList          i_eChildListIndex,
293cdf0e10cSrcweir                                   const char *        i_sLabel,
294cdf0e10cSrcweir                                   const char *        i_sListTitle,
295cdf0e10cSrcweir                                   csi::xml::Element & o_rPublic,
296cdf0e10cSrcweir                                   csi::xml::Element & o_rProtected,
297cdf0e10cSrcweir                                   csi::xml::Element & o_rPrivate )
298cdf0e10cSrcweir 
299cdf0e10cSrcweir {
300cdf0e10cSrcweir     bool    bPublic_ChildrenExist = false;
301cdf0e10cSrcweir     bool    bProtected_ChildrenExist = false;
302cdf0e10cSrcweir     bool    bPrivate_ChildrenExist = false;
303cdf0e10cSrcweir 
304cdf0e10cSrcweir     ChildList_Display::Area_Result
305cdf0e10cSrcweir             aPublic_Result( bPublic_ChildrenExist, o_rPublic );
306cdf0e10cSrcweir     ChildList_Display::Area_Result
307cdf0e10cSrcweir             aProtected_Result( bProtected_ChildrenExist, o_rProtected );
308cdf0e10cSrcweir     ChildList_Display::Area_Result
309cdf0e10cSrcweir             aPrivate_Result( bPrivate_ChildrenExist, o_rPrivate );
310cdf0e10cSrcweir 
311cdf0e10cSrcweir     String sLabelPublic = ChildListLabel(i_sLabel, mp_public);
312cdf0e10cSrcweir     String sLabelProtected = ChildListLabel(i_sLabel, mp_protected);
313cdf0e10cSrcweir     String sLabelPrivate = ChildListLabel(i_sLabel, mp_private);
314cdf0e10cSrcweir 
315cdf0e10cSrcweir     pChildDisplay->Run_Members( aPublic_Result,
316cdf0e10cSrcweir                                 aProtected_Result,
317cdf0e10cSrcweir                                 aPrivate_Result,
318cdf0e10cSrcweir                                 i_nSlot,
319cdf0e10cSrcweir                                 sLabelPublic,
320cdf0e10cSrcweir                                 sLabelProtected,
321cdf0e10cSrcweir                                 sLabelPrivate,
322cdf0e10cSrcweir                                 i_sListTitle );
323cdf0e10cSrcweir 
324cdf0e10cSrcweir     bChildLists_Exist[i_eChildListIndex]
325cdf0e10cSrcweir                 = bPublic_ChildrenExist;
326cdf0e10cSrcweir     bChildLists_Exist[i_eChildListIndex + cl_MAX]
327cdf0e10cSrcweir                 = bProtected_ChildrenExist;
328cdf0e10cSrcweir     bChildLists_Exist[i_eChildListIndex + 2*cl_MAX]
329cdf0e10cSrcweir                 = bPrivate_ChildrenExist;
330cdf0e10cSrcweir 
331cdf0e10cSrcweir     if (bPublic_ChildrenExist)
332cdf0e10cSrcweir         o_rPublic << new HorizontalLine;
333cdf0e10cSrcweir     if (bProtected_ChildrenExist)
334cdf0e10cSrcweir         o_rProtected << new HorizontalLine;
335cdf0e10cSrcweir     if (bPrivate_ChildrenExist)
336cdf0e10cSrcweir         o_rPrivate << new HorizontalLine;
337cdf0e10cSrcweir }
338cdf0e10cSrcweir 
339cdf0e10cSrcweir void
Write_ChildList_forClasses(csi::xml::Element & o_rPublic,csi::xml::Element & o_rProtected,csi::xml::Element & o_rPrivate,const char * i_sLabel,const char * i_sListTitle,ary::cpp::E_ClassKey i_eFilter)340cdf0e10cSrcweir PageMaker_Class::Write_ChildList_forClasses( csi::xml::Element &    o_rPublic,
341cdf0e10cSrcweir                                              csi::xml::Element &    o_rProtected,
342cdf0e10cSrcweir                                              csi::xml::Element &    o_rPrivate,
343cdf0e10cSrcweir                                              const char *           i_sLabel,
344cdf0e10cSrcweir                                              const char *           i_sListTitle,
345cdf0e10cSrcweir                                              ary::cpp::E_ClassKey   i_eFilter )
346cdf0e10cSrcweir {
347cdf0e10cSrcweir     bool    bPublic_ChildrenExist = false;
348cdf0e10cSrcweir     bool    bProtected_ChildrenExist = false;
349cdf0e10cSrcweir     bool    bPrivate_ChildrenExist = false;
350cdf0e10cSrcweir 
351cdf0e10cSrcweir     ChildList_Display::Area_Result
352cdf0e10cSrcweir             aPublic_Result( bPublic_ChildrenExist, o_rPublic );
353cdf0e10cSrcweir     ChildList_Display::Area_Result
354cdf0e10cSrcweir             aProtected_Result( bProtected_ChildrenExist, o_rProtected );
355cdf0e10cSrcweir     ChildList_Display::Area_Result
356cdf0e10cSrcweir             aPrivate_Result( bPrivate_ChildrenExist, o_rPrivate );
357cdf0e10cSrcweir 
358cdf0e10cSrcweir     String sLabelPublic = ChildListLabel(i_sLabel, mp_public);
359cdf0e10cSrcweir     String sLabelProtected = ChildListLabel(i_sLabel, mp_protected);
360cdf0e10cSrcweir     String sLabelPrivate = ChildListLabel(i_sLabel, mp_private);
361cdf0e10cSrcweir 
362cdf0e10cSrcweir     pChildDisplay->Run_MemberClasses( aPublic_Result,
363cdf0e10cSrcweir                                       aProtected_Result,
364cdf0e10cSrcweir                                       aPrivate_Result,
365cdf0e10cSrcweir                                       ary::cpp::Class::SLOT_NestedClasses,
366cdf0e10cSrcweir                                       sLabelPublic,
367cdf0e10cSrcweir                                       sLabelProtected,
368cdf0e10cSrcweir                                       sLabelPrivate,
369cdf0e10cSrcweir                                       i_sListTitle,
370cdf0e10cSrcweir                                       i_eFilter );
371cdf0e10cSrcweir 
372cdf0e10cSrcweir     bChildLists_Exist[int(cl_NestedClasses)+int(i_eFilter)]
373cdf0e10cSrcweir                 = bPublic_ChildrenExist;
374cdf0e10cSrcweir     bChildLists_Exist[int(cl_NestedClasses)+int(i_eFilter) + cl_MAX]
375cdf0e10cSrcweir                 = bProtected_ChildrenExist;
376cdf0e10cSrcweir     bChildLists_Exist[int(cl_NestedClasses)+int(i_eFilter) + 2*cl_MAX]
377cdf0e10cSrcweir                 = bPrivate_ChildrenExist;
378cdf0e10cSrcweir 
379cdf0e10cSrcweir     if (bPublic_ChildrenExist)
380cdf0e10cSrcweir         o_rPublic << new HorizontalLine;
381cdf0e10cSrcweir     if (bProtected_ChildrenExist)
382cdf0e10cSrcweir         o_rProtected << new HorizontalLine;
383cdf0e10cSrcweir     if (bPrivate_ChildrenExist)
384cdf0e10cSrcweir         o_rPrivate << new HorizontalLine;
385cdf0e10cSrcweir }
386cdf0e10cSrcweir 
387cdf0e10cSrcweir const char *
ChildListLabel(const char * i_sLabel,E_MemberProtection i_eMpr)388cdf0e10cSrcweir PageMaker_Class::ChildListLabel( const char * i_sLabel, E_MemberProtection i_eMpr )
389cdf0e10cSrcweir {
390cdf0e10cSrcweir  	static char sResult[100];
391cdf0e10cSrcweir     strcpy( sResult, C_sMprPrefixes[i_eMpr] );  // SAFE STRCPY (#100211# - checked)
392cdf0e10cSrcweir     strcat( sResult, i_sLabel );                // SAFE STRCAT (#100211# - checked)
393cdf0e10cSrcweir     return sResult;
394cdf0e10cSrcweir }
395cdf0e10cSrcweir 
396cdf0e10cSrcweir csi::html::DefListDefinition &
Setup_MemberSegment_Out(E_MemberProtection i_eMpr)397cdf0e10cSrcweir PageMaker_Class::Setup_MemberSegment_Out( E_MemberProtection i_eMpr )
398cdf0e10cSrcweir {
399cdf0e10cSrcweir     html::DefList * pDefList = new html::DefList;
400cdf0e10cSrcweir     pProtectionArea[i_eMpr] = pDefList;
401cdf0e10cSrcweir 
402cdf0e10cSrcweir     pDefList->AddTerm()
403cdf0e10cSrcweir         << new html::ClassAttr("subtitle")
404cdf0e10cSrcweir         >> *new html::Label( C_sMprPrefixes[i_eMpr] )
405cdf0e10cSrcweir                 >> *new html::Headline(3)
406cdf0e10cSrcweir                         << C_sMprTitles[i_eMpr];
407cdf0e10cSrcweir     return pDefList->AddDefinition();
408cdf0e10cSrcweir }
409cdf0e10cSrcweir 
410cdf0e10cSrcweir void
Create_NaviSubRow(E_MemberProtection i_eMpr)411cdf0e10cSrcweir PageMaker_Class::Create_NaviSubRow( E_MemberProtection i_eMpr )
412cdf0e10cSrcweir {
413cdf0e10cSrcweir     int nIndexAdd = int(cl_MAX) * int(i_eMpr);
414cdf0e10cSrcweir 
415cdf0e10cSrcweir     bool bEmpty = true;
416cdf0e10cSrcweir     for (int e = 0; e < cl_MAX; e++)
417cdf0e10cSrcweir     {
418cdf0e10cSrcweir         if ( bChildLists_Exist[e + nIndexAdd] )
419cdf0e10cSrcweir         {
420cdf0e10cSrcweir             bEmpty = false;
421cdf0e10cSrcweir             break;
422cdf0e10cSrcweir         }
423cdf0e10cSrcweir     }  // end for
424cdf0e10cSrcweir     if (bEmpty)
425cdf0e10cSrcweir     {
426cdf0e10cSrcweir         pProtectionArea[i_eMpr] = 0;
427cdf0e10cSrcweir         return;
428cdf0e10cSrcweir     }
429cdf0e10cSrcweir     else //
430cdf0e10cSrcweir     {
431cdf0e10cSrcweir         CurOut() << pProtectionArea[i_eMpr].Release();
432cdf0e10cSrcweir     }  // endif
433cdf0e10cSrcweir 
434cdf0e10cSrcweir     pNavi->MakeSubRow( C_sMprSummaryTitles[i_eMpr] );
435cdf0e10cSrcweir     for (int i = 0; i < cl_MAX; i++)
436cdf0e10cSrcweir     {
437cdf0e10cSrcweir         pNavi->AddItem( C_sSummaryItems_Titles[i],
438cdf0e10cSrcweir                         ChildListLabel( C_sSummaryItems_Labels[i], i_eMpr ),
439cdf0e10cSrcweir                         bChildLists_Exist[i+nIndexAdd] );
440cdf0e10cSrcweir     }  // end for
441cdf0e10cSrcweir }
442cdf0e10cSrcweir 
443cdf0e10cSrcweir void
Write_DerivedList()444cdf0e10cSrcweir PageMaker_Class::Write_DerivedList()
445cdf0e10cSrcweir {
446cdf0e10cSrcweir     adcdisp::ExplanationList
447cdf0e10cSrcweir         aDeriveds( CurOut() );
448cdf0e10cSrcweir     aDeriveds.AddEntry( "Known Derived Classes" );
449cdf0e10cSrcweir 
450cdf0e10cSrcweir     if ( Me().KnownDerivatives().Size() == 0 )
451cdf0e10cSrcweir     {
452cdf0e10cSrcweir         aDeriveds.Def() << "None.";
453cdf0e10cSrcweir         return;
454cdf0e10cSrcweir     }
455cdf0e10cSrcweir 
456cdf0e10cSrcweir     typedef ary::List_Rid  RidList;
457cdf0e10cSrcweir 
458cdf0e10cSrcweir     CesConstIterator
459cdf0e10cSrcweir         itEnd = Me().KnownDerivatives().End();
460cdf0e10cSrcweir     for ( CesConstIterator it = Me().KnownDerivatives().Begin();
461cdf0e10cSrcweir           it != itEnd;
462cdf0e10cSrcweir           ++it )
463cdf0e10cSrcweir     {
464cdf0e10cSrcweir         const ary::cpp::CodeEntity &
465cdf0e10cSrcweir             rCe = Env().Gate().Ces().Find_Ce(*it);
466cdf0e10cSrcweir 
467cdf0e10cSrcweir         aDeriveds.Def()
468cdf0e10cSrcweir             >> *new html::Link( Link2Ce(Env(),rCe) )
469cdf0e10cSrcweir                 << rCe.LocalName();
470cdf0e10cSrcweir         aDeriveds.Def()
471cdf0e10cSrcweir             << new html::LineBreak;
472cdf0e10cSrcweir     }   // end for
473cdf0e10cSrcweir }
474cdf0e10cSrcweir 
475cdf0e10cSrcweir 
476cdf0e10cSrcweir // ==============  Creating a classes base hierarchy  ====================== //
477cdf0e10cSrcweir 
478cdf0e10cSrcweir 
479cdf0e10cSrcweir namespace
480cdf0e10cSrcweir {
481cdf0e10cSrcweir 
482cdf0e10cSrcweir class Node
483cdf0e10cSrcweir {
484cdf0e10cSrcweir   public:
485cdf0e10cSrcweir                         Node(
486cdf0e10cSrcweir                             const ary::cpp::Class &
487cdf0e10cSrcweir                                                 i_rClass,
488cdf0e10cSrcweir                             ary::cpp::Type_id   i_nClassType,
489cdf0e10cSrcweir                             const ary::cpp::Gate &
490cdf0e10cSrcweir                                                 i_rGate,
491cdf0e10cSrcweir                             intt                i_nPositionOffset,
492cdf0e10cSrcweir                             Node *              io_pDerived = 0,
493cdf0e10cSrcweir                             ary::cpp::E_Protection
494cdf0e10cSrcweir                                                 i_eProtection = ary::cpp::PROTECT_global,
495cdf0e10cSrcweir                             bool                i_bVirtual = false );
496cdf0e10cSrcweir                         ~Node();
497cdf0e10cSrcweir 
498cdf0e10cSrcweir     void                FillPositionList(
499cdf0e10cSrcweir                             std::vector< const Node* > &
500cdf0e10cSrcweir                                                 o_rPositionList ) const;
501cdf0e10cSrcweir     void                Write2(
502cdf0e10cSrcweir                             csi::xml::Element & o_rOut,
503cdf0e10cSrcweir                             const OuputPage_Environment &
504cdf0e10cSrcweir                                                 i_rEnv ) const;
505cdf0e10cSrcweir 
BaseCount() const506cdf0e10cSrcweir     intt                BaseCount() const       { return nCountBases; }
Position() const507cdf0e10cSrcweir     intt                Position() const        { return nPosition; }
Xpos() const508cdf0e10cSrcweir     int                 Xpos() const            { return 3*Position(); }
Ypos() const509cdf0e10cSrcweir     int                 Ypos() const            { return 2*Position(); }
Derived() const510cdf0e10cSrcweir     const Node *        Derived() const         { return pDerived; }
511cdf0e10cSrcweir 
512cdf0e10cSrcweir   private:
513cdf0e10cSrcweir     typedef std::vector< DYN Node* > BaseList;
514cdf0e10cSrcweir 
515cdf0e10cSrcweir     void                IncrBaseCount();
516cdf0e10cSrcweir 
517cdf0e10cSrcweir     // DATA
518cdf0e10cSrcweir     BaseList            aBases;
519cdf0e10cSrcweir     intt                nCountBases;
520cdf0e10cSrcweir     Node *              pDerived;
521cdf0e10cSrcweir 
522cdf0e10cSrcweir     String              sName;
523cdf0e10cSrcweir     const ary::cpp::Class *
524cdf0e10cSrcweir                         pClass;
525cdf0e10cSrcweir     ary::cpp::Type_id   nClassType;
526cdf0e10cSrcweir     ary::cpp::E_Protection
527cdf0e10cSrcweir                         eProtection;
528cdf0e10cSrcweir     bool                bVirtual;
529cdf0e10cSrcweir 
530cdf0e10cSrcweir     intt                nPosition;
531cdf0e10cSrcweir };
532cdf0e10cSrcweir 
533cdf0e10cSrcweir void                WriteNodeHierarchy(
534cdf0e10cSrcweir                         csi::xml::Element & o_rOut,
535cdf0e10cSrcweir                         const OuputPage_Environment &
536cdf0e10cSrcweir                                             i_rEnv,
537cdf0e10cSrcweir                         const Node &        i_rClass );
538cdf0e10cSrcweir 
539cdf0e10cSrcweir const ary::cpp::Class *
540cdf0e10cSrcweir                     HereFind_Class(
541cdf0e10cSrcweir                         const ary::cpp::Gate &
542cdf0e10cSrcweir                                             i_rGate,
543cdf0e10cSrcweir                         ary::cpp::Type_id   i_nReferingTypeId );
544cdf0e10cSrcweir 
545cdf0e10cSrcweir }   // anonymous namespace
546cdf0e10cSrcweir 
547cdf0e10cSrcweir void
Write_BaseHierarchy()548cdf0e10cSrcweir PageMaker_Class::Write_BaseHierarchy()
549cdf0e10cSrcweir {
550cdf0e10cSrcweir     adcdisp::ExplanationList aBases( CurOut() );
551cdf0e10cSrcweir     aBases.AddEntry( "Base Classes" );
552cdf0e10cSrcweir 
553cdf0e10cSrcweir     if (   Me().BaseClasses().size() == 0 )
554cdf0e10cSrcweir     {
555cdf0e10cSrcweir         aBases.Def() << "None.";
556cdf0e10cSrcweir     }
557cdf0e10cSrcweir     else
558cdf0e10cSrcweir     {
559cdf0e10cSrcweir         Dyn< Node >
560cdf0e10cSrcweir             pBaseGraph( new Node(Me(), ary::cpp::Type_id(0), Env().Gate(), 0) );
561cdf0e10cSrcweir         WriteNodeHierarchy( aBases.Def(), Env(), *pBaseGraph );
562cdf0e10cSrcweir     }
563cdf0e10cSrcweir }
564cdf0e10cSrcweir 
565cdf0e10cSrcweir 
566cdf0e10cSrcweir 
567cdf0e10cSrcweir namespace
568cdf0e10cSrcweir {
569cdf0e10cSrcweir 
570cdf0e10cSrcweir void
WriteNodeHierarchy(csi::xml::Element & o_rOut,const OuputPage_Environment & i_rEnv,const Node & i_rClass)571cdf0e10cSrcweir WriteNodeHierarchy( csi::xml::Element &             o_rOut,
572cdf0e10cSrcweir                     const OuputPage_Environment &   i_rEnv,
573cdf0e10cSrcweir                     const Node &                    i_rClass )
574cdf0e10cSrcweir {
575cdf0e10cSrcweir     typedef const Node *            NodePtr;
576cdf0e10cSrcweir     typedef std::vector<NodePtr>    NodeList;
577cdf0e10cSrcweir 
578cdf0e10cSrcweir     NodeList aPositionList;
579cdf0e10cSrcweir     intt nSize = i_rClass.Position()+1;
580cdf0e10cSrcweir     aPositionList.reserve(nSize);
581cdf0e10cSrcweir     i_rClass.FillPositionList( aPositionList );
582cdf0e10cSrcweir 
583cdf0e10cSrcweir     xml::Element &
584cdf0e10cSrcweir         rPre = o_rOut
585cdf0e10cSrcweir                >> *new xml::AnElement("pre")
586cdf0e10cSrcweir                    << new html::StyleAttr("font-family:monospace;");
587cdf0e10cSrcweir 
588cdf0e10cSrcweir     for ( int line = 0; line < nSize; ++line )
589cdf0e10cSrcweir     {
590cdf0e10cSrcweir         char * sLine1 = new char[2 + line*5];
591cdf0e10cSrcweir         char * sLine2 = new char[1 + line*5];
592cdf0e10cSrcweir         *sLine1 = '\0';
593cdf0e10cSrcweir         *sLine2 = '\0';
594cdf0e10cSrcweir 
595cdf0e10cSrcweir         bool bBaseForThisLineReached = false;
596cdf0e10cSrcweir      	for ( int col = 0; col < line; ++col )
597cdf0e10cSrcweir         {
598cdf0e10cSrcweir             intt nDerivPos = aPositionList[col]->Derived()->Position();
599cdf0e10cSrcweir 
600cdf0e10cSrcweir             if ( nDerivPos >= line )
601cdf0e10cSrcweir                 strcat(sLine1, "  |  ");
602cdf0e10cSrcweir             else
603cdf0e10cSrcweir                 strcat(sLine1, "     ");
604cdf0e10cSrcweir 
605cdf0e10cSrcweir             if ( nDerivPos > line )
606cdf0e10cSrcweir             {
607cdf0e10cSrcweir                 strcat(sLine2, "  |  ");
608cdf0e10cSrcweir             }
609cdf0e10cSrcweir             else if ( nDerivPos == line )
610cdf0e10cSrcweir             {
611cdf0e10cSrcweir                 if (bBaseForThisLineReached)
612cdf0e10cSrcweir                     strcat(sLine2, "--+--");
613cdf0e10cSrcweir                 else
614cdf0e10cSrcweir                 {
615cdf0e10cSrcweir                     bBaseForThisLineReached = true;
616cdf0e10cSrcweir                     strcat(sLine2, "  +--");
617cdf0e10cSrcweir                 }
618cdf0e10cSrcweir             }
619cdf0e10cSrcweir             else // nDerivPos < line
620cdf0e10cSrcweir             {
621cdf0e10cSrcweir                 if (bBaseForThisLineReached)
622cdf0e10cSrcweir                     strcat(sLine2, "-----");
623cdf0e10cSrcweir                 else
624cdf0e10cSrcweir                     strcat(sLine2, "     ");
625cdf0e10cSrcweir             }
626cdf0e10cSrcweir         }  // end for (col)
627cdf0e10cSrcweir         strcat(sLine1,"\n");
628cdf0e10cSrcweir         rPre
629cdf0e10cSrcweir             << sLine1
630cdf0e10cSrcweir             << sLine2;
631cdf0e10cSrcweir         delete [] sLine1;
632cdf0e10cSrcweir         delete [] sLine2;
633cdf0e10cSrcweir 
634cdf0e10cSrcweir         aPositionList[line]->Write2( rPre, i_rEnv );
635cdf0e10cSrcweir         rPre << "\n";
636cdf0e10cSrcweir     }   // end for (line)
637cdf0e10cSrcweir }
638cdf0e10cSrcweir 
639cdf0e10cSrcweir const ary::cpp::Class *
HereFind_Class(const ary::cpp::Gate & i_rGate,ary::cpp::Type_id i_nReferingTypeId)640cdf0e10cSrcweir HereFind_Class( const ary::cpp::Gate & i_rGate,
641cdf0e10cSrcweir                 ary::cpp::Type_id      i_nReferingTypeId )
642cdf0e10cSrcweir {
643cdf0e10cSrcweir     const ary::cpp::CodeEntity *
644cdf0e10cSrcweir         pCe = i_rGate.Search_RelatedCe( i_nReferingTypeId );
645cdf0e10cSrcweir 
646cdf0e10cSrcweir     if ( pCe != 0 )
647cdf0e10cSrcweir     {
648cdf0e10cSrcweir 		if  ( ary::is_type<ary::cpp::Class>(*pCe) )
649cdf0e10cSrcweir         {
650cdf0e10cSrcweir 			return ary::ary_cast<ary::cpp::Class>(pCe);
651cdf0e10cSrcweir         }
652cdf0e10cSrcweir 		else if ( ary::is_type<ary::cpp::Typedef>(*pCe) )
653cdf0e10cSrcweir 		{
654cdf0e10cSrcweir 			const ary::cpp::Typedef *
655cdf0e10cSrcweir 				pTydef = ary::ary_cast<ary::cpp::Typedef>(pCe);
656cdf0e10cSrcweir 			return  HereFind_Class( i_rGate, pTydef->DescribingType() );
657cdf0e10cSrcweir 		}
658cdf0e10cSrcweir 	}
659cdf0e10cSrcweir 
660cdf0e10cSrcweir     static const ary::cpp::Class aClassNull_( "Base class not found",
661cdf0e10cSrcweir 											  ary::cpp::Ce_id(0),
662cdf0e10cSrcweir 											  ary::cpp::PROTECT_global,
663cdf0e10cSrcweir 											  ary::loc::Le_id(0),
664cdf0e10cSrcweir 											  ary::cpp::CK_class );
665cdf0e10cSrcweir     return &aClassNull_;
666cdf0e10cSrcweir }
667cdf0e10cSrcweir 
668cdf0e10cSrcweir 
669cdf0e10cSrcweir 
670cdf0e10cSrcweir //*********************        Node        ***********************//
671cdf0e10cSrcweir 
Node(const ary::cpp::Class & i_rClass,ary::cpp::Type_id i_nClassType,const ary::cpp::Gate & i_rGate,intt i_nPositionOffset,Node * io_pDerived,ary::cpp::E_Protection i_eProtection,bool i_bVirtual)672cdf0e10cSrcweir Node::Node( const ary::cpp::Class &         i_rClass,
673cdf0e10cSrcweir             ary::cpp::Type_id               i_nClassType,
674cdf0e10cSrcweir             const ary::cpp::Gate &          i_rGate,
675cdf0e10cSrcweir             intt                            i_nPositionOffset,
676cdf0e10cSrcweir             Node *                          io_pDerived,
677cdf0e10cSrcweir             ary::cpp::E_Protection          i_eProtection,
678cdf0e10cSrcweir             bool                            i_bVirtual )
679cdf0e10cSrcweir     :   aBases(),
680cdf0e10cSrcweir         nCountBases(0),
681cdf0e10cSrcweir         pDerived(io_pDerived),
682cdf0e10cSrcweir         pClass(&i_rClass),
683cdf0e10cSrcweir         nClassType(i_nClassType),
684cdf0e10cSrcweir         eProtection(i_eProtection),
685cdf0e10cSrcweir         bVirtual(i_bVirtual),
686cdf0e10cSrcweir         nPosition(i_nPositionOffset)
687cdf0e10cSrcweir {
688cdf0e10cSrcweir     typedef ary::cpp::List_Bases  BList;
689cdf0e10cSrcweir 
690cdf0e10cSrcweir     for ( BList::const_iterator it = i_rClass.BaseClasses().begin();
691cdf0e10cSrcweir           it != i_rClass.BaseClasses().end();
692cdf0e10cSrcweir           ++it )
693cdf0e10cSrcweir     {
694cdf0e10cSrcweir         const ary::cpp::Class *
695cdf0e10cSrcweir                 pBaseClass = HereFind_Class( i_rGate, (*it).nId );
696cdf0e10cSrcweir 
697cdf0e10cSrcweir         Dyn<Node>
698cdf0e10cSrcweir             pBase( new Node(*pBaseClass,
699cdf0e10cSrcweir                             (*it).nId,
700cdf0e10cSrcweir                             i_rGate,
701cdf0e10cSrcweir                             nPosition,
702cdf0e10cSrcweir                             this,
703cdf0e10cSrcweir                             (*it).eProtection,
704cdf0e10cSrcweir                             (*it).eVirtuality == ary::cpp::VIRTUAL_virtual)
705cdf0e10cSrcweir                  );
706cdf0e10cSrcweir         IncrBaseCount();
707cdf0e10cSrcweir         nPosition += pBase->BaseCount() + 1;
708cdf0e10cSrcweir         aBases.push_back( pBase.Release() );
709cdf0e10cSrcweir     }   // end for
710cdf0e10cSrcweir }
711cdf0e10cSrcweir 
~Node()712cdf0e10cSrcweir Node::~Node()
713cdf0e10cSrcweir {
714cdf0e10cSrcweir }
715cdf0e10cSrcweir 
716cdf0e10cSrcweir void
FillPositionList(std::vector<const Node * > & o_rPositionList) const717cdf0e10cSrcweir Node::FillPositionList( std::vector< const Node* > & o_rPositionList ) const
718cdf0e10cSrcweir {
719cdf0e10cSrcweir     for ( BaseList::const_iterator it = aBases.begin();
720cdf0e10cSrcweir           it != aBases.end();
721cdf0e10cSrcweir           ++it )
722cdf0e10cSrcweir     {
723cdf0e10cSrcweir         (*it)->FillPositionList(o_rPositionList);
724cdf0e10cSrcweir     }  // end for
725cdf0e10cSrcweir 
726cdf0e10cSrcweir 	if( o_rPositionList.size() != uintt(Position()) )
727cdf0e10cSrcweir     {
728cdf0e10cSrcweir 		csv_assert(false);
729cdf0e10cSrcweir     }
730cdf0e10cSrcweir     o_rPositionList.push_back(this);
731cdf0e10cSrcweir }
732cdf0e10cSrcweir 
733cdf0e10cSrcweir void
Write2(csi::xml::Element & o_rOut,const OuputPage_Environment & i_rEnv) const734cdf0e10cSrcweir Node::Write2( csi::xml::Element &           o_rOut,
735cdf0e10cSrcweir               const OuputPage_Environment & i_rEnv ) const
736cdf0e10cSrcweir {
737cdf0e10cSrcweir     if ( Derived() == 0 )
738cdf0e10cSrcweir     {
739cdf0e10cSrcweir         o_rOut
740cdf0e10cSrcweir             >> *new xml::AnElement("span")
741cdf0e10cSrcweir                 << new html::ClassAttr("btself")
742cdf0e10cSrcweir                 << pClass->LocalName();
743cdf0e10cSrcweir         return;
744cdf0e10cSrcweir     }
745cdf0e10cSrcweir 
746cdf0e10cSrcweir     csi::xml::Element *
747cdf0e10cSrcweir         pOut = & ( o_rOut >> *new xml::AnElement("span") );
748cdf0e10cSrcweir     switch ( eProtection )
749cdf0e10cSrcweir     {
750cdf0e10cSrcweir  	    case ary::cpp::PROTECT_public:
751cdf0e10cSrcweir  	                if (bVirtual)
752cdf0e10cSrcweir                         *pOut << new html::ClassAttr("btvpubl");
753cdf0e10cSrcweir                     else
754cdf0e10cSrcweir                         *pOut << new html::ClassAttr("btpubl");
755cdf0e10cSrcweir                     break;
756cdf0e10cSrcweir         case ary::cpp::PROTECT_protected:
757cdf0e10cSrcweir  	                if (bVirtual)
758cdf0e10cSrcweir                         *pOut << new html::ClassAttr("btvprot");
759cdf0e10cSrcweir                     else
760cdf0e10cSrcweir                         *pOut << new html::ClassAttr("btprot");
761cdf0e10cSrcweir                     break;
762cdf0e10cSrcweir         case ary::cpp::PROTECT_private:
763cdf0e10cSrcweir  	                if (bVirtual)
764cdf0e10cSrcweir                         *pOut << new html::ClassAttr("btvpriv");
765cdf0e10cSrcweir                     else
766cdf0e10cSrcweir                         *pOut << new html::ClassAttr("btpriv");
767cdf0e10cSrcweir                     break;
768cdf0e10cSrcweir         default:    // do nothing.
769cdf0e10cSrcweir                     ;
770cdf0e10cSrcweir     }   // end switch
771cdf0e10cSrcweir 
772cdf0e10cSrcweir     csi::xml::Element & rOut = *pOut;
773cdf0e10cSrcweir 
774cdf0e10cSrcweir     Get_LinkedTypeText( rOut, i_rEnv, nClassType, false );
775cdf0e10cSrcweir     rOut << " (";
776cdf0e10cSrcweir     if ( bVirtual )
777cdf0e10cSrcweir         rOut << "virtual ";
778cdf0e10cSrcweir     switch ( eProtection )
779cdf0e10cSrcweir     {
780cdf0e10cSrcweir      	case ary::cpp::PROTECT_public:
781cdf0e10cSrcweir                     rOut << "public)";
782cdf0e10cSrcweir                     break;
783cdf0e10cSrcweir      	case ary::cpp::PROTECT_protected:
784cdf0e10cSrcweir                     rOut << "protected)";
785cdf0e10cSrcweir                     break;
786cdf0e10cSrcweir      	case ary::cpp::PROTECT_private:
787cdf0e10cSrcweir                     rOut << "private)";
788cdf0e10cSrcweir                     break;
789cdf0e10cSrcweir         default:    // do nothing.
790cdf0e10cSrcweir                     ;
791cdf0e10cSrcweir     }   // end switch
792cdf0e10cSrcweir }
793cdf0e10cSrcweir 
794cdf0e10cSrcweir void
IncrBaseCount()795cdf0e10cSrcweir Node::IncrBaseCount()
796cdf0e10cSrcweir {
797cdf0e10cSrcweir     ++nCountBases;
798cdf0e10cSrcweir     if (pDerived != 0)
799cdf0e10cSrcweir         pDerived->IncrBaseCount();
800cdf0e10cSrcweir }
801cdf0e10cSrcweir 
802cdf0e10cSrcweir 
803cdf0e10cSrcweir }   // anonymous namespace
804cdf0e10cSrcweir 
805cdf0e10cSrcweir 
806