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 "hfi_module.hxx"
24 
25 
26 // NOT FULLY DEFINED SERVICES
27 #include <ary/idl/i_ce.hxx>
28 #include <ary/idl/i_module.hxx>
29 #include <ary/idl/ik_module.hxx>
30 #include <ary/doc/d_oldidldocu.hxx>
31 #include <ary/getncast.hxx>
32 #include <toolkit/hf_docentry.hxx>
33 #include <toolkit/hf_linachain.hxx>
34 #include <toolkit/hf_navi_sub.hxx>
35 #include <toolkit/hf_title.hxx>
36 #include "hfi_doc.hxx"
37 #include "hfi_navibar.hxx"
38 #include "hfi_tag.hxx"
39 #include "hfi_typetext.hxx"
40 #include "hi_linkhelper.hxx"
41 
42 
43 extern const String
44     C_sCePrefix_Module("module");
45 
46 namespace
47 {
48 
49 const String
50     C_sList_NestedModules("Nested Modules");
51 const String
52     C_sList_NestedModules_Label("NestedModules");
53 const String
54     C_sList_Services("Services");
55 const String
56     C_sList_Singletons("Singletons");
57 const String
58     C_sList_Interfaces("Interfaces");
59 const String
60     C_sList_Structs("Structs");
61 const String
62     C_sList_Exceptions("Exceptions");
63 const String
64     C_sList_Enums("Enums");
65 const String
66     C_sList_Typedefs("Typedefs");
67 const String
68     C_sList_ConstGroups("Constant Groups");
69 const String
70     C_sList_ConstGroups_Label("ConstantGroups");
71 
72 
73 enum E_SubListIndices
74 {   // In case of changes, also adapt make_Navibar() !!
75     sli_NestedModules = 0,
76     sli_Services = 1,
77     sli_Singletons = 2,
78     sli_Interfaces = 3,
79     sli_Structs = 4,
80     sli_Exceptions = 5,
81     sli_Enums = 6,
82     sli_Typedefs = 7,
83     sli_ConstGroups = 8
84 };
85 
86 } //anonymous namespace
87 
88 
HF_IdlModule(Environment & io_rEnv,Xml::Element & o_rOut)89 HF_IdlModule::HF_IdlModule( Environment &         io_rEnv,
90                             Xml::Element &        o_rOut )
91     :   HtmlFactory_Idl(io_rEnv, &o_rOut)
92 {
93 }
94 
~HF_IdlModule()95 HF_IdlModule::~HF_IdlModule()
96 {
97 }
98 
99 typedef ary::idl::ifc_module::attr  ModuleAttr;
100 
101 
102 void
Produce_byData(const client & i_ce) const103 HF_IdlModule::Produce_byData( const client & i_ce ) const
104 {
105     Dyn<HF_NaviSubRow>
106         pNaviSubRow( &make_Navibar(i_ce) );
107 
108     HF_TitleTable
109         aTitle(CurOut());
110     HF_LinkedNameChain
111         aNameChain(aTitle.Add_Row());
112 
113     if ( Env().CurPosition().Depth() > 0 )
114     {
115         aNameChain.Produce_CompleteChain_forModule(Env().CurPosition(), nameChainLinker);
116 
117         StreamLock
118             sl(200);
119         aTitle.Produce_Title( sl()
120 				    		    << C_sCePrefix_Module
121       					        << " "
122 						        << i_ce.LocalName()
123     							<< c_str );
124     }
125     else
126     {
127         aTitle.Produce_Title( "Global Module" );
128     }
129 
130     write_Docu(aTitle.Add_Row(), i_ce);
131     CurOut() << new Html::HorizontalLine();
132 
133 
134     // Write children lists:
135     ce_ptr_list aNestedModules;
136     ce_ptr_list aServices;
137     ce_ptr_list aInterfaces;
138     ce_ptr_list aStructs;
139     ce_ptr_list aExceptions;
140     ce_ptr_list aEnums;
141     ce_ptr_list aTypedefs;
142     ce_ptr_list aConstantGroups;
143     ce_ptr_list aSingletons;
144 
145     ModuleAttr::Get_AllChildrenSeparated(
146                                 aNestedModules,
147                                 aServices,
148                                 aInterfaces,
149                                 aStructs,
150                                 aExceptions,
151                                 aEnums,
152                                 aTypedefs,
153                                 aConstantGroups,
154                                 aSingletons,
155                                 Env().Data().Ces(),
156                                 i_ce );
157 
158     // Has this to be in the order of enum E_SubListIndices ???
159     if (produce_ChildList(C_sList_NestedModules, C_sList_NestedModules_Label, aNestedModules ))
160         pNaviSubRow->SwitchOn(sli_NestedModules);
161     if (produce_ChildList(C_sList_Services, C_sList_Services, aServices))
162         pNaviSubRow->SwitchOn(sli_Services);
163     if (produce_ChildList(C_sList_Singletons, C_sList_Singletons, aSingletons))
164         pNaviSubRow->SwitchOn(sli_Singletons);
165     if (produce_ChildList(C_sList_Interfaces, C_sList_Interfaces, aInterfaces))
166         pNaviSubRow->SwitchOn(sli_Interfaces);
167     if (produce_ChildList(C_sList_Structs, C_sList_Structs, aStructs))
168         pNaviSubRow->SwitchOn(sli_Structs);
169     if (produce_ChildList(C_sList_Exceptions, C_sList_Exceptions, aExceptions))
170         pNaviSubRow->SwitchOn(sli_Exceptions);
171     if (produce_ChildList(C_sList_Enums, C_sList_Enums, aEnums))
172         pNaviSubRow->SwitchOn(sli_Enums);
173     if (produce_ChildList(C_sList_Typedefs, C_sList_Typedefs, aTypedefs))
174         pNaviSubRow->SwitchOn(sli_Typedefs);
175     if (produce_ChildList(C_sList_ConstGroups, C_sList_ConstGroups_Label, aConstantGroups))
176         pNaviSubRow->SwitchOn(sli_ConstGroups);
177     pNaviSubRow->Produce_Row();
178 }
179 
180 DYN HF_NaviSubRow &
make_Navibar(const client & i_ce) const181 HF_IdlModule::make_Navibar( const client & i_ce ) const
182 {
183     HF_IdlNavigationBar
184         aNaviBar(Env(), CurOut());
185     aNaviBar.Produce_ModuleMainRow(i_ce);
186 
187     DYN HF_NaviSubRow &
188         ret = aNaviBar.Add_SubRow();
189 
190     // Has to be in the order of E_SubListIndices:
191     ret.AddItem(C_sList_NestedModules, C_sList_NestedModules_Label, false);
192     ret.AddItem(C_sList_Services, C_sList_Services, false);
193     ret.AddItem(C_sList_Singletons, C_sList_Singletons, false);
194     ret.AddItem(C_sList_Interfaces, C_sList_Interfaces, false);
195     ret.AddItem(C_sList_Structs, C_sList_Structs, false);
196     ret.AddItem(C_sList_Exceptions, C_sList_Exceptions, false);
197     ret.AddItem(C_sList_Enums, C_sList_Enums, false);
198     ret.AddItem(C_sList_Typedefs, C_sList_Typedefs, false);
199     ret.AddItem(C_sList_ConstGroups, C_sList_ConstGroups_Label, false);
200 
201     CurOut() << new Html::HorizontalLine();
202     return ret;
203 }
204 
205 bool
produce_ChildList(const String & i_sName,const String & i_sLabel,const ce_ptr_list & i_list) const206 HF_IdlModule::produce_ChildList( const String &      i_sName,
207                                  const String &      i_sLabel,
208                                  const ce_ptr_list & i_list ) const
209 {
210     if ( i_list.size() == 0 )
211         return false;
212 
213     HF_SubTitleTable
214         aTable( CurOut(),
215                 i_sLabel,
216                 i_sName,
217                 2 );
218 
219     ce_ptr_list::const_iterator
220         itEnd = i_list.end();
221     for ( ce_ptr_list::const_iterator it = i_list.begin();
222           it != itEnd;
223           ++it )
224     {
225         Xml::Element &
226             rRow = aTable.Add_Row();
227         produce_Link(rRow, *it);
228         produce_LinkDoc(rRow, *it);
229     }   // end for
230 
231     return true;
232 }
233 
234 void
produce_Link(Xml::Element & o_row,const client * i_ce) const235 HF_IdlModule::produce_Link( Xml::Element &      o_row,
236                             const client *      i_ce ) const
237 {
238     csv_assert(i_ce != 0);
239     Xml::Element &
240         rCell = o_row
241                 >> *new Html::TableCell
242                     << new Html::ClassAttr(C_sCellStyle_SummaryLeft);
243 
244     if ( NOT ary::is_type<ary::idl::Module>(*i_ce) )
245     {
246         HF_IdlTypeText
247             aText(Env(), rCell, true);
248         aText.Produce_byData(i_ce->CeId());
249     }
250     else
251     {
252         StreamLock slBuf(100);
253      	rCell
254             >> *new Html::Link( slBuf() << i_ce->LocalName()
255                                         << "/module-ix.html"
256                                         << c_str )
257                 << i_ce->LocalName();
258     }
259 }
260 
261 void
produce_LinkDoc(Xml::Element & o_row,const client * i_ce) const262 HF_IdlModule::produce_LinkDoc( Xml::Element &      o_row,
263                                const client *      i_ce ) const
264 {
265     csv_assert(i_ce != 0);
266 
267     // We need the cell in any case, because, the rendering may be hurt else.
268     Xml::Element &
269         rCell = o_row
270                     >> *new Html::TableCell
271                         << new Html::ClassAttr(C_sCellStyle_SummaryRight);
272 
273     const client &
274         rCe = *i_ce;
275     const ce_info *
276         pShort = Get_IdlDocu(rCe.Docu());
277     if ( pShort == 0 )
278         return;
279 
280 
281     if (pShort->IsDeprecated())
282     {
283         rCell << "[ DEPRECATED ]" << new Html::LineBreak;
284     }
285     if (pShort->IsOptional())
286     {
287         rCell << "[ OPTIONAL ]" << new Html::LineBreak;
288     }
289 
290     HF_IdlDocuTextDisplay
291         aShortDisplay(Env(), &rCell, *i_ce);
292     pShort->Short().DisplayAt(aShortDisplay);
293 }
294