/************************************************************** * * 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 #include "nav_main.hxx" // NOT FULLY DEFINED SERVICES #include #include #include #include #include #include #include #include "hdimpl.hxx" #include "opageenv.hxx" #include "strconst.hxx" using namespace ::csi::html; using namespace ::csi::xml; const String sOverview("Overview"); const String sNamespace("Namespace"); const String sClass("Class"); const String sTree("Tree"); const String sProject("Project"); const String sFile("File"); const String sIndex("Index"); const String sHelp("Help"); //******************** MainItem and derived ones ***************// class MainItem { public: virtual ~MainItem() {} void Write2( TableRow & o_rOut ); private: virtual void do_Write2( TableRow & o_rOut ) = 0; }; inline void MainItem::Write2( TableRow & o_rOut ) { do_Write2(o_rOut); } namespace { class MainRowItem : public MainItem { public: MainRowItem( const String & i_sText, const char * i_sLink, const char * i_sTip ); ~MainRowItem(); private: enum E_Style { eSelf, eNo, eStd }; virtual void do_Write2( TableRow & o_rOut ); String sText; String sLink; String sTip; }; MainRowItem::MainRowItem( const String & i_sText, const char * i_sLink, const char * i_sTip ) : sText(i_sText), sLink(i_sLink), sTip(i_sTip) { } MainRowItem::~MainRowItem() { } void MainRowItem::do_Write2( TableRow & o_rOut ) { TableCell & rCell = o_rOut.AddCell(); rCell << new ClassAttr( "navimain" ) << new XmlCode(" ") >> *new Link(sLink.c_str()) << sText.c_str(); rCell << new XmlCode(" "); } class SelectedItem : public MainItem { public: SelectedItem( const String & i_sText ) : sText(i_sText) {} private: virtual void do_Write2( TableRow & o_rOut ); String sText; }; void SelectedItem::do_Write2( TableRow & o_rOut ) { TableCell & rCell = o_rOut.AddCell(); rCell << new ClassAttr( "navimainself" ) << new XmlCode(" ") << sText.c_str() << new XmlCode(" "); } class UnavailableItem : public MainItem { public: UnavailableItem( const String & i_sText ) : sText(i_sText) {} private: virtual void do_Write2( TableRow & o_rOut ); String sText; }; void UnavailableItem::do_Write2( TableRow & o_rOut ) { TableCell & rCell = o_rOut.AddCell(); rCell << new ClassAttr( "navimainnone" ) << new XmlCode(" ") << sText.c_str() << new XmlCode(" "); } } // anonymous namespace //************************ MainRow ***************************// MainRow::MainRow( const OuputPage_Environment & i_rEnv ) : // aItems, pEnv(&i_rEnv) { } MainRow::~MainRow() { csv::erase_container_of_heap_ptrs(aItems); } void MainRow::SetupItems_Overview() { Create_ItemList_Global( eSelf, eStd, eStd ); } void MainRow::SetupItems_AllDefs() { Create_ItemList_Global( eStd, eStd, eStd ); } void MainRow::SetupItems_Index() { Create_ItemList_Global( eStd, eSelf, eStd ); } void MainRow::SetupItems_Help() { Create_ItemList_Global( eStd, eStd, eSelf ); } void MainRow::SetupItems_Ce( const ary::cpp::CodeEntity & i_rCe ) { csv_assert( pEnv->CurNamespace() != 0 ); bool bIsNamespace = i_rCe.Id() == pEnv->CurNamespace()->Id(); bool bHasClass = pEnv->CurClass() != 0; bool bIsClass = dynamic_cast< const ary::cpp::Class * >(&i_rCe) != 0; Create_ItemList_InDirTree_Cpp( ( bIsNamespace ? eSelf : eStd ), ( bIsClass ? eSelf : bHasClass ? eStd : eNo ), eNo, 0 ); } void MainRow::SetupItems_FunctionGroup() { Create_ItemList_InDirTree_Cpp( eStd, (pEnv->CurClass() != 0 ? eStd : eNo), eNo, 0 ); } void MainRow::SetupItems_DataGroup() { SetupItems_FunctionGroup(); } void MainRow::Write2( csi::xml::Element & o_rOut ) const { Table * pTable = new Table; o_rOut >> *pTable << new AnAttribute( "class", "navimain" ) << new AnAttribute( "border", "0" ) << new AnAttribute( "cellpadding", "1" ) << new AnAttribute( "cellspacing", "0" ); TableRow & rRow = pTable->AddRow(); rRow << new AnAttribute( "align", "center" ) << new AnAttribute( "valign", "top" ); for ( ItemList::const_iterator it = aItems.begin(); it != aItems.end(); ++it ) { (*it)->Write2( rRow ); } } void MainRow::Create_ItemList_Global( E_Style i_eOverview, E_Style i_eIndex, E_Style i_eHelp ) { if ( i_eOverview == eStd ) { String sLinkOverview = ( i_eIndex == eSelf ? dshelp::PathPerLevelsUp( 1, C_sHFN_Overview ) : C_sHFN_Overview ); Add_Item( i_eOverview, sOverview, sLinkOverview.c_str(), "" ); } else { Add_Item( i_eOverview, sOverview, "", "" ); } if ( i_eIndex == eSelf ) Add_Item( eStd, sNamespace, "../names/index.html", "" ); else Add_Item( eStd, sNamespace, "names/index.html", "" ); Add_Item( eNo, sClass, "", "" ); if ( i_eIndex == eStd ) { Add_Item( i_eIndex, sIndex, C_sPath_Index, "" ); } else { Add_Item( i_eIndex, sIndex, "", "" ); } if ( i_eHelp == eStd ) { String sLinkHelp = ( i_eIndex == eSelf ? PathPerLevelsUp(1,C_sHFN_Help) : C_sHFN_Help ); Add_Item( i_eHelp, sHelp, sLinkHelp.c_str(), "" ); } else { Add_Item( i_eHelp, sHelp, "", "" ); } } void MainRow::Create_ItemList_InDirTree_Cpp( E_Style i_eNsp, E_Style i_eClass, E_Style , const char * ) { String sLinkOverview = PathPerRoot(*pEnv, C_sHFN_Overview); Add_Item( eStd, sOverview, sLinkOverview.c_str(), "" ); if (i_eNsp == eStd) { String sLinkNamespace = PathPerNamespace(*pEnv, "index.html"); Add_Item( i_eNsp, sNamespace, sLinkNamespace.c_str(), "" ); } else { Add_Item( i_eNsp, sNamespace, "", "" ); } if (i_eClass == eStd) { csv_assert( pEnv->CurClass() != 0 ); StreamLock sLinkClass(300); sLinkClass() << PathPerNamespace(*pEnv, "c-") << pEnv->CurClass()->LocalName() << ".html"; StreamLock sTipClass(300); sTipClass() << "Class " << pEnv->CurClass()->LocalName(); Add_Item( i_eClass, sClass, sLinkClass().c_str(), sTipClass().c_str() ); } else { Add_Item( i_eClass, sClass, "", "" ); } Add_Item( eStd, sIndex, PathPerRoot(*pEnv, C_sPath_Index), "" ); String sLinkHelp = PathPerRoot(*pEnv, "help.html"); Add_Item( eStd, sHelp, sLinkHelp.c_str(), "" ); } void MainRow::Add_Item( E_Style i_eStyle, const String & i_sText, const char * i_sLink, const char * i_sTip ) { switch (i_eStyle) { case eStd: aItems.push_back( new MainRowItem(i_sText, i_sLink, i_sTip) ); break; case eNo: aItems.push_back( new UnavailableItem(i_sText) ); break; case eSelf: aItems.push_back( new SelectedItem(i_sText) ); break; default: csv_assert(false); } }