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_globalindex.hxx"
24
25
26 // NOT FULLY DEFINED SERVICES
27 #include <cosv/tpl/tpltools.hxx>
28 #include <ary/idl/i_ce.hxx>
29 #include <ary/idl/i_types4idl.hxx>
30 #include <ary/idl/i_module.hxx>
31 #include <toolkit/hf_title.hxx>
32 #include "hfi_navibar.hxx"
33 #include "hfi_typetext.hxx"
34 #include "hi_linkhelper.hxx"
35
36
37
38
39 namespace
40 {
41
42 /**
43 */
44 enum E_Types
45 {
46 t_service = 0,
47 t_interface = 1,
48 t_struct = 2,
49 t_exception = 3,
50 t_enum = 4,
51 t_typedef = 5,
52 t_constantsgroup = 6,
53 t_property = 7,
54 t_function = 8,
55 t_structelement = 9,
56 t_enumvalue = 10,
57 t_constant = 11,
58 t_module = 12,
59 t_singleton = 13,
60 t_attribute = 14,
61 t_siservice = 15,
62 t_sisingleton = 16,
63 t_MAX
64 };
65
66 String G_sDummy;
67
68
69 /* RC-Ids for IDL types (see reposy.cxx):
70
71 Module 2000
72 Interface 2001
73 Function 2002
74 Service 2003
75 Property 2004
76
77 Enum 2005
78 EnumValue 2006
79 Typedef 2007
80 Struct 2008
81 StructElement 2009
82
83 Exception 2010
84 ConstantGroup 2011
85 Constant 2012
86 Singleton 2013
87 Attribute 2014
88 SglIfcService 2015
89 SglIfcSingleton 2016
90 */
91 const int C_nNumberOfIdlTypes = 17;
92 const char * C_sTypeNames[C_nNumberOfIdlTypes] =
93 { "module ", "interface ", "function ", "service ", "property ",
94 "enum ", "value ", "typedef ", "struct ", "field ",
95 "exception ", "constants group ", "constant ","singleton ", "attribute ",
96 "service", "singleton"
97 };
98 const char * C_sOwnerNames[C_nNumberOfIdlTypes] =
99 { "module ", "module ", "interface ", "module ", "service ",
100 "module ", "enum ", "module ", "module ", "", // could be struct or exception
101 "module ", "module ", "constants group ", "module ", "interface ",
102 "module", "module"
103 };
104 const intt C_nNamesArrayOffset = intt(ary::idl::Module::class_id);
105 const int C_nIxField = 9;
106
107
108
109
110 const char C_cAlphabet[] =
111 "<a class=\"inverse\" href=\"index-1.html\"><B>A</B></a> <a class=\"inverse\" href=\"index-2.html\"><B>B</B></a> <a class=\"inverse\" href=\"index-3.html\"><B>C</B></a> <a class=\"inverse\" href=\"index-4.html\"><B>D</B></a> <a class=\"inverse\" href=\"index-5.html\"><B>E</B></a> "
112 "<a class=\"inverse\" href=\"index-6.html\"><B>F</B></a> <a class=\"inverse\" href=\"index-7.html\"><B>G</B></a> <a class=\"inverse\" href=\"index-8.html\"><B>H</B></a> <a class=\"inverse\" href=\"index-9.html\"><B>I</B></a> <a class=\"inverse\" href=\"index-10.html\"><B>J</B></a> "
113 "<a class=\"inverse\" href=\"index-11.html\"><B>K</B></a> <a class=\"inverse\" href=\"index-12.html\"><B>L</B></a> <a class=\"inverse\" href=\"index-13.html\"><B>M</B></a> <a class=\"inverse\" href=\"index-14.html\"><B>N</B></a> <a class=\"inverse\" href=\"index-15.html\"><B>O</B></a> "
114 "<a class=\"inverse\" href=\"index-16.html\"><B>P</B></a> <a class=\"inverse\" href=\"index-17.html\"><B>Q</B></a> <a class=\"inverse\" href=\"index-18.html\"><B>R</B></a> <a class=\"inverse\" href=\"index-19.html\"><B>S</B></a> <a class=\"inverse\" href=\"index-20.html\"><B>T</B></a> "
115 "<a class=\"inverse\" href=\"index-21.html\"><B>U</B></a> <a class=\"inverse\" href=\"index-22.html\"><B>V</B></a> <a class=\"inverse\" href=\"index-23.html\"><B>W</B></a> <a class=\"inverse\" href=\"index-24.html\"><B>X</B></a> <a class=\"inverse\" href=\"index-25.html\"><B>Y</B></a> "
116 "<a class=\"inverse\" href=\"index-26.html\"><B>Z</B></a>";
117
118
119
120 HF_IdlGlobalIndex::PageData G_PageData;
121
122 } // end anonymous namespace
123
124
125 inline void
write_EntryItself(Xml::Element & o_destination,const ary::idl::CodeEntity & i_ce,const HF_IdlTypeText & i_typeLinkWriter) const126 HF_IdlGlobalIndex::write_EntryItself( Xml::Element & o_destination,
127 const ary::idl::CodeEntity & i_ce,
128 const HF_IdlTypeText & i_typeLinkWriter ) const
129 {
130 i_typeLinkWriter.Produce_IndexLink(o_destination, i_ce);
131 o_destination << " - ";
132 }
133
134
HF_IdlGlobalIndex(Environment & io_rEnv,Xml::Element & o_rOut)135 HF_IdlGlobalIndex::HF_IdlGlobalIndex( Environment & io_rEnv,
136 Xml::Element & o_rOut )
137 : HtmlFactory_Idl(io_rEnv, &o_rOut)
138 {
139 }
140
~HF_IdlGlobalIndex()141 HF_IdlGlobalIndex::~HF_IdlGlobalIndex()
142 {
143 }
144
145 void
Produce_Page(ary::idl::alphabetical_index::E_Letter i_letter) const146 HF_IdlGlobalIndex::Produce_Page(ary::idl::alphabetical_index::E_Letter i_letter) const
147 {
148 make_Navibar();
149
150 HF_TitleTable
151 aTitle(CurOut());
152 StreamLock sl(100);
153 aTitle.Produce_Title( sl()
154 << "Global Index "
155 << ( i_letter != ary::idl::alphabetical_index::non_alpha
156 ? char(int(i_letter)-'a'+'A')
157 : '_' )
158 << c_str );
159
160 // Letters Index
161 aTitle.Add_Row()
162 << new Xml::XmlCode(
163 "<p align=\"center\"><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> <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>"
164 " <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> <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>"
165 " <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> <a href=\"index-26.html\"><b>Z</b></a> <a href=\"index-27.html\"><b>_</b></a></p>" );
166
167 Out().Enter(CurOut() >> *new Html::DefList);
168
169 csv::erase_container(G_PageData);
170 Env().Data().Get_IndexData(G_PageData, i_letter);
171
172 // Helper object to produce links to the index Entries.
173 HF_IdlTypeText aTypeLinkWriter(Env(),HF_IdlTypeText::use_for_javacompatible_index);
174
175 PageData::const_iterator itEnd = G_PageData.end();
176 for ( PageData::const_iterator iter = G_PageData.begin();
177 iter != itEnd;
178 ++iter )
179 {
180 produce_Line(iter, aTypeLinkWriter);
181 } // end for
182
183 Out().Leave();
184 CurOut() << new Html::HorizontalLine;
185 }
186
187 void
make_Navibar() const188 HF_IdlGlobalIndex::make_Navibar() const
189 {
190 HF_IdlNavigationBar
191 aNaviBar(Env(), CurOut());
192 aNaviBar.Produce_IndexMainRow();
193
194 CurOut() << new Html::HorizontalLine();
195 }
196
197 void
produce_Line(PageData::const_iterator i_entry,const HF_IdlTypeText & i_typeLinkWriter) const198 HF_IdlGlobalIndex::produce_Line( PageData::const_iterator i_entry,
199 const HF_IdlTypeText & i_typeLinkWriter) const
200 {
201 const client &
202 rCe = Env().Data().Find_Ce(*i_entry);
203 if (NOT rCe.Owner().IsValid())
204 return; // Omit global namespace.
205
206 // The destination for the created output:
207 Xml::Element & rDT = CurOut() >> *new Html::DefListTerm;
208
209 /** The following code is intended to produce an output that
210 will be recognized by the context help system of Forte.
211 That is reached by making it similar to the indices, that
212 Javadoc produces.
213 If the link to the Entry contains a hashmark, the Forte-Help
214 requires following a link to the owner.
215 But if there is no hashmark, the following link must go to
216 the same Entry again. Doesn't make really sense :-(, but that's
217 like it is.
218 */
219 write_EntryItself(rDT,rCe,i_typeLinkWriter);
220 if (rCe.SightLevel() == ary::idl::sl_Member)
221 write_OwnerOfEntry(rDT,rCe,i_typeLinkWriter);
222 else
223 write_EntrySecondTime(rDT,rCe,i_typeLinkWriter);
224
225 // This produces an empty "<dd></dd>", which is also needed to reach
226 // similarity to the Javadoc index:
227 CurOut() << new Html::DefListDefinition;
228 }
229
230 void
write_OwnerOfEntry(Xml::Element & o_destination,const ary::idl::CodeEntity & i_ce,const HF_IdlTypeText & i_typeLinkWriter) const231 HF_IdlGlobalIndex::write_OwnerOfEntry( Xml::Element & o_destination,
232 const ary::idl::CodeEntity & i_ce,
233 const HF_IdlTypeText & i_typeLinkWriter ) const
234 {
235 const client &
236 rOwner = Env().Data().Find_Ce(i_ce.Owner());
237
238 int nIx = int(i_ce.AryClass() - C_nNamesArrayOffset);
239 csv_assert(csv::in_range(0,nIx,C_nNumberOfIdlTypes));
240
241 o_destination << C_sTypeNames[nIx]
242 << "in ";
243 if (nIx != C_nIxField)
244 {
245 o_destination << C_sOwnerNames[nIx];
246 }
247 else
248 {
249 uintt
250 nOwnerIx = rOwner.AryClass() - C_nNamesArrayOffset;
251 csv_assert(
252 nOwnerIx < static_cast< unsigned int >(C_nNumberOfIdlTypes));
253 o_destination << C_sTypeNames[nOwnerIx];
254 }
255 i_typeLinkWriter.Produce_IndexOwnerLink(o_destination, rOwner);
256 }
257
258 void
write_EntrySecondTime(Xml::Element & o_destination,const ary::idl::CodeEntity & i_ce,const HF_IdlTypeText & i_typeLinkWriter) const259 HF_IdlGlobalIndex::write_EntrySecondTime( Xml::Element & o_destination,
260 const ary::idl::CodeEntity & i_ce,
261 const HF_IdlTypeText & i_typeLinkWriter ) const
262 {
263 int nIx = int(i_ce.AryClass() - C_nNamesArrayOffset);
264 csv_assert(csv::in_range(0,nIx,C_nNumberOfIdlTypes));
265
266 o_destination << C_sTypeNames[nIx]
267 << " ";
268 i_typeLinkWriter.Produce_IndexSecondEntryLink(o_destination, i_ce);
269 }
270