blob: 1dc8060a4b8c2172d2bd96a3eff4be19b0b9e308 [file] [log] [blame]
/**************************************************************
*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*
*************************************************************/
#include <precomp.h>
#include "pm_index.hxx"
// NOT FULLY DEFINED SERVICES
#include <ary/cpp/c_gate.hxx>
#include <ary/cpp/c_class.hxx>
#include <ary/cpp/c_define.hxx>
#include <ary/cpp/c_enum.hxx>
#include <ary/cpp/c_enuval.hxx>
#include <ary/cpp/c_funct.hxx>
#include <ary/cpp/c_macro.hxx>
#include <ary/cpp/c_namesp.hxx>
#include <ary/cpp/c_tydef.hxx>
#include <ary/cpp/c_vari.hxx>
#include <ary/cpp/cp_ce.hxx>
#include "aryattrs.hxx"
#include "hd_chlst.hxx"
#include "hd_docu.hxx"
#include "html_kit.hxx"
#include "navibar.hxx"
#include "opageenv.hxx"
#include "pagemake.hxx"
#include "strconst.hxx"
using namespace csi;
using ary::GlobalId;
namespace
{
inline const char *
F_CK_Text( ary::cpp::E_ClassKey i_eCK )
{
switch (i_eCK)
{
case ary::cpp::CK_class: return "class";
case ary::cpp::CK_struct: return "struct";
case ary::cpp::CK_union: return "union";
} // end switch
return "";
}
template <class CE>
inline const char *
F_OwnerType( const CE & i_rData, const ary::cpp::Gate & i_rGate )
{
if ( i_rData.Protection() == ary::cpp::PROTECT_global )
return "namespace ";
const ary::cpp::Class *
pClass = dynamic_cast< const ary::cpp::Class* >(
i_rGate.Ces().Search_Ce(i_rData.Owner()) );
if (pClass != 0)
return F_CK_Text(pClass->ClassKey());
return "";
}
} // anonymous namespace
PageMaker_Index::PageMaker_Index( PageDisplay & io_rPage,
char i_c )
: SpecializedPageMaker(io_rPage),
pNavi(0),
c(i_c),
pCurIndex(0)
{
}
PageMaker_Index::~PageMaker_Index()
{
}
void
PageMaker_Index::MakePage()
{
pNavi = new NavigationBar( Env(), NavigationBar::LOC_Index );
Write_NavBar();
Write_TopArea();
Write_CompleteAlphabeticalList();
}
void
PageMaker_Index::do_Process( const ary::cpp::Namespace & i_rData )
{
Write_CeIndexEntry( i_rData, "namespace", "namespace" );
}
void
PageMaker_Index::do_Process( const ary::cpp::Class & i_rData )
{
// KORR_FUTURE
// Really throw out all anonymous classes from index?
if ( strncmp(i_rData.LocalName().c_str()+1,"_Anonymous",10) == 0 )
return;
Write_CeIndexEntry( i_rData,
F_CK_Text(i_rData.ClassKey()),
F_OwnerType(i_rData, Env().Gate()) );
}
void
PageMaker_Index::do_Process( const ary::cpp::Enum & i_rData )
{
Write_CeIndexEntry( i_rData, "enum", F_OwnerType(i_rData, Env().Gate()) );
}
void
PageMaker_Index::do_Process( const ary::cpp::Typedef & i_rData )
{
Write_CeIndexEntry( i_rData, "typedef", F_OwnerType(i_rData, Env().Gate()) );
}
void
PageMaker_Index::do_Process( const ary::cpp::Function & i_rData )
{
Write_CeIndexEntry( i_rData, "function", F_OwnerType(i_rData, Env().Gate()) );
}
void
PageMaker_Index::do_Process( const ary::cpp::Variable & i_rData )
{
Write_CeIndexEntry( i_rData, "variable", F_OwnerType(i_rData, Env().Gate()) );
}
void
PageMaker_Index::do_Process( const ary::cpp::EnumValue & i_rData )
{
Write_CeIndexEntry( i_rData, "enum value", "" );
}
void
PageMaker_Index::do_Process( const ary::cpp::Define & i_rData )
{
String sFileName;
pCurIndex->AddEntry();
pCurIndex->Term()
>> *new html::Link( Link2CppDefinition(Env(), i_rData) )
>> *new html::Bold
<< i_rData.LocalName();
pCurIndex->Term()
<< " - define";
pCurIndex->Def() << " ";
}
void
PageMaker_Index::do_Process( const ary::cpp::Macro & i_rData )
{
String sFileName;
pCurIndex->AddEntry();
pCurIndex->Term()
>> *new html::Link( Link2CppDefinition(Env(), i_rData) )
>> *new html::Bold
<< i_rData.LocalName();
pCurIndex->Term()
<< " - macro";
pCurIndex->Def() << " ";
}
const ary::cpp::Gate *
PageMaker_Index::inq_Get_ReFinder() const
{
return &Env().Gate();
}
void
PageMaker_Index::Write_NavBar()
{
pNavi->Write( CurOut() );
CurOut() << new html::HorizontalLine;
}
const String C_sAlphabet(
"<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> "
"<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> "
"<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>" );
void
PageMaker_Index::Write_TopArea()
{
String sLetter(&c, 1);
adcdisp::PageTitle_Std fTitle;
fTitle( CurOut(), "Global Index", sLetter );
CurOut() >>* new html::Paragraph
<< new html::AlignAttr("center")
<< new xml::XmlCode(C_sAlphabet);
CurOut() << new html::HorizontalLine;
}
void
PageMaker_Index::Write_CompleteAlphabeticalList()
{
std::vector<GlobalId>
aThisPagesItems;
const ary::cpp::Gate &
rGate = Env().Gate();
static char sBegin[] = "X";
static char sEnd[] = "Y";
switch ( c )
{
case 'Z': sBegin[0] = 'Z';
sEnd[0] = '_';
break;
case '_': sBegin[0] = '_';
sEnd[0] = '0';
break;
default: sBegin[0] = c;
sEnd[0] = char(c + 1);
break;
}
uintt
nCount = rGate.Get_AlphabeticalList( aThisPagesItems, sBegin, sEnd );
if (nCount > 0 )
{
adcdisp::IndexList
aIndex(CurOut());
pCurIndex = &aIndex;
std::vector<GlobalId>::const_iterator itEnd = aThisPagesItems.end();
for ( std::vector<GlobalId>::const_iterator it = aThisPagesItems.begin();
it != itEnd;
++it )
{
const ary::Entity *
pRe = rGate.Search_Entity( *it );
if ( pRe != 0 )
pRe->Accept(*this);
} // end for
pCurIndex = 0;
} // endif (nCount > 0)
}
void
PageMaker_Index::Write_CeIndexEntry( const ary::cpp::CodeEntity &
i_rCe,
const char * i_sType,
const char * i_sOwnerType )
{
if ( Ce_IsInternal(i_rCe) )
return;
static csv::StreamStr aQualification(500);
const ary::cpp::CodeEntity &
rOwner = Env().Gate().Ces().Find_Ce(i_rCe.Owner());
pCurIndex->AddEntry();
pCurIndex->Term()
>> *new html::Link( Link2Ce(Env(), i_rCe) )
>> *new html::Bold
<< i_rCe.LocalName();
pCurIndex->Term()
<< " - "
<< i_sType;
if ( rOwner.Owner().IsValid() )
{
aQualification.seekp(0);
Env().Gate().Ces().Get_QualifiedName( aQualification,
rOwner.LocalName(),
rOwner.Owner() );
pCurIndex->Term()
<< " in "
<< i_sOwnerType
<< " "
<< aQualification.c_str();
}
pCurIndex->Def() << " ";
}