/**************************************************************
 * 
 * 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 "hfi_linklist.hxx"


// NOT FULLY DEFINED SERVICES
#include <ary/idl/i_ce.hxx>
#include <ary/idl/i_gate.hxx>
#include <ary/idl/ip_ce.hxx>
#include <ary/idl/ip_type.hxx>
#include <toolkit/hf_docentry.hxx>
#include <toolkit/hf_title.hxx>
#include "hfi_doc.hxx"
#include "hfi_tag.hxx"
#include "hfi_typetext.hxx"
#include "hi_ary.hxx"
#include "hi_env.hxx"




//*******************           HF_CommentedLink_Table         **********************************//

HF_CommentedLink_Table::HF_CommentedLink_Table( Environment  &          io_rEnv,
                                                Xml::Element &          o_rOut,
                                                const String &          i_sTitle,
                                                const String &          i_sLabel,
                                                bool                    i_bBorder )
    :    HtmlFactory_Idl(io_rEnv,&o_rOut),
         pTable( new Html::Table( (i_bBorder ? "1" : "0"), "100%", "5", "0") ),
         pCurLinkColumn(0),
         pCurCommentColumn(0)
{
    *pTable
        << new Html::ClassAttr("commentedlinks");

    CurOut()
        >> *new Html::Label(i_sLabel)
           << new Html::LineBreak;
    CurOut()
        << pTable;
//    HF_SubTitle aTitle(*pTable);
//    aTitle.Produce_it(i_sTitle);
}

HF_CommentedLink_Table::~HF_CommentedLink_Table()
{
}

void
HF_CommentedLink_Table::Add_Line()
{
    Html::TableRow &
        rRow = pTable->AddRow();

    pCurLinkColumn = & (rRow.AddCell()
                            << new Html::WidthAttr("30%")
                            << new Xml::AnAttribute("valign","top") );
    pCurCommentColumn  = & rRow.AddCell();
}

Xml::Element &
HF_CommentedLink_Table::Cur_LinkColumn()
{
    csv_assert(pCurLinkColumn != 0);
    return *pCurLinkColumn;
}

Xml::Element &
HF_CommentedLink_Table::Cur_CommentColumn()
{
    csv_assert(pCurCommentColumn != 0);
    return *pCurCommentColumn;
}


//*******************           HF_MemberTable         **********************************//

HF_MemberTable::HF_MemberTable( Environment  &      io_rEnv,
                                Xml::Element &      o_rOut,
                                const String &      i_sTitle,
                                const String &      i_sLabel,
                                bool                i_bInline )
    :    HtmlFactory_Idl(io_rEnv,&o_rOut),
         pTable( new Html::Table("1", "100%", "5", "0") ),
         pCurDeclaration(0),
         pCurDescription(0),
         bInline(i_bInline)
{
    *pTable
        << new Html::ClassAttr("memberlist");

    CurOut()
        >> *new Html::Label(i_sLabel)
           << new Html::LineBreak;
    CurOut()
        << pTable;
//    HF_SubTitle aTitle(*pTable);
//    aTitle.Produce_it(i_sTitle);
}

HF_MemberTable::~HF_MemberTable()
{
}

void
HF_MemberTable::Add_Line()
{
    if (bInline)
    {
        Html::TableRow & rRow = pTable->AddRow();

        pCurDeclaration = &( rRow.AddCell()
                                << new Xml::AnAttribute("valign","top")
                                << new Html::WidthAttr("30%") );
        pCurDescription = & rRow.AddCell();
    }
    else
    {
        Html::DefList *
            pMemberSpace = new Html::DefList;
        *pMemberSpace
            << new Html::ClassAttr("member");

        pTable->AddRow().AddCell() << pMemberSpace;

        pCurDeclaration =
            & ( *pMemberSpace
                    >> *new Html::DefListTerm
                        << new Html::ClassAttr("member") );
        pCurDescription =
            & ( *pMemberSpace
                    >> *new Html::DefListDefinition()
                        << new Html::ClassAttr("member") );
    }
}

Xml::Element &
HF_MemberTable::Cur_Declaration()
{
    csv_assert(pCurDeclaration != 0);
    return *pCurDeclaration;
}

Xml::Element &
HF_MemberTable::Cur_Description()
{
    csv_assert(pCurDescription != 0);
    return *pCurDescription;
}



//*******************           HF_IdlLinkList         **********************************//

HF_IdlLinkList::HF_IdlLinkList( Environment  &   io_rEnv,
                                Xml::Element *   o_pOut )
    :    HtmlFactory_Idl(io_rEnv,o_pOut)
{
}

HF_IdlLinkList::~HF_IdlLinkList()
{
}

void
HF_IdlLinkList::Produce_NamespaceMembers( const String &                        i_sTitle,
                                          const String &                        i_sLabel,
                                          const std::vector<ary::idl::Ce_id> &  i_rList,
                                          bool                                  i_bNestedNamespaces ) const
{
    HF_CommentedLink_Table
        aTableMaker( Env(), CurOut(),
                     i_sTitle, i_sLabel,
                     true );

    std::vector<ary::idl::Ce_id>::const_iterator itEnd = i_rList.end();
    for ( std::vector<ary::idl::Ce_id>::const_iterator it = i_rList.begin();
          it != itEnd;
          ++it )
    {
        static String   sEntryName;
        static String   sEntryLink;
        const ce_info *
                        pDocu = 0;
        Get_EntryData_NamespaceMembers( sEntryName, sEntryLink, pDocu, *it, i_bNestedNamespaces );
        aTableMaker.Add_Line();

        aTableMaker.Cur_LinkColumn()
           >> *new Html::Link(sEntryLink)
              << sEntryName;

        if ( pDocu != 0 )
        {
            HF_IdlShortDocu
                aTextDisplay(Env(), aTableMaker.Cur_CommentColumn() );
            aTextDisplay.Produce_byData( pDocu );
        }
    }   // end for
}

void
HF_IdlLinkList::Produce_GlobalLinks( const String &      i_sTitle,
                                     const String &      i_sLabel,
                                     ce_list &           i_rList ) const
{
    HF_CommentedLink_Table
        aTableMaker( Env(), CurOut(),
                     i_sTitle, i_sLabel,
                     true );

    for ( ; i_rList; ++i_rList )
    {
        aTableMaker.Add_Line();
        HF_IdlTypeText
            aLinkText( Env(), aTableMaker.Cur_LinkColumn(), true );
        aLinkText.Produce_byData(*i_rList);

        const ce_info *
            pDocu = Get_EntryDocu(*i_rList);
        if ( pDocu != 0 )
        {
            HF_IdlShortDocu
                aTextDisplay(Env(), aTableMaker.Cur_CommentColumn() );
            aTextDisplay.Produce_byData( pDocu, *i_rList );
        }
    }
}

void
HF_IdlLinkList::Produce_GlobalCommentedLinks( const String &          i_sTitle,
                                              const String &          i_sLabel,
                                              comref_list &           i_rList ) const
{
    HF_CommentedLink_Table
        aTableMaker( Env(), CurOut(),
                     i_sTitle, i_sLabel,
                     true );
/*
    for ( ; i_rList; ++i_rList )
    {
        aTableMaker.Add_Line();
        HF_IdlTypeText
            aLinkText( Env(), aTableMaker.Cur_LinkColumn(), true );
        aLinkText.Produce_byData( (*i_rList).first );

        HF_DocEntryList
            aDocList( aTableMaker.Cur_CommentColumn() );
        if ( (*i_rList).second != 0 )
        {
            HF_IdlDocu
                aDocuDisplay( Env(), aDocList );
            aDocuDisplay.Produce_byData( (*i_rList).second );
        }
        else
        {
            const ce_info *
                pShort = Get_EntryDocu(
                            Env().Gate().Types().Search_CeRelatedTo(
                                            (*i_rList).first) );
            if ( pShort != 0 )
            {
                if (pShort->IsDeprecated())
                {
                    aDocList.Produce_Term()
                        << "[ DEPRECATED ]";
                }
                if (pShort->IsOptional())
                {
                    aDocList.Produce_Term()
                        << "[ OPTIONAL ]";
                }

                aDocList.Produce_Term()
                    << "Description";

                HF_IdlDocuTextDisplay
                    aShortDisplay( Env(), &aDocList.Produce_Definition() );
                aShortDisplay.Set_CurScopeTo(
                        Env().Gate().Types().Search_CeRelatedTo((*i_rList).first) );
                pShort->Short().DisplayAt(aShortDisplay);
            }
        }
    }
*/
}

void
HF_IdlLinkList::Produce_MemberLinks( const String &     i_sTitle,
                                     const String &     i_sLabel,
                                     ce_list &          i_rList ) const
{
    HF_CommentedLink_Table
        aTableMaker( Env(), CurOut(),
                     i_sTitle, i_sLabel,
                     true );

/*
    for ( ; i_rList; ++i_rList )
    {
        const ary::idl::CodeEntity &
            rCe = Env().Gate().Ces().Find_Ce(*i_rList);

        aTableMaker.Add_Line();
        aTableMaker.Cur_LinkColumn()
            >> *new Html::Link(
                    StreamLock(200)() << "#" << rCe.LocalName() << c_str)
               << rCe.LocalName();

        const ce_info *
            pDocu = rCe.Docu();
        if ( pDocu != 0 )
        {
            HF_IdlShortDocu
                aTextDisplay(Env(), aTableMaker.Cur_CommentColumn() );
            aTextDisplay.Produce_byData( *pDocu );
        }
    }   // end for
*/
}

void
HF_IdlLinkList::Get_EntryData_NamespaceMembers(
                            String &                o_sEntryName,
                            String &                o_sEntryLink,
                            const ce_info * &       o_pDocu,
                            ce_id                   i_nMemberId,
                            bool                    i_bIsNestedNamespace  ) const
{
    const ary::idl::CodeEntity &
        rCe = Env().Data().Find_Ce(i_nMemberId);

    o_sEntryName = rCe.LocalName();
    o_sEntryLink = StreamLock(200)() << rCe.LocalName()
                                     << ( i_bIsNestedNamespace
                                                ?   "/module-ix"
                                                :   "" )
                                     << ".html"
                                     << c_str;
    o_pDocu = rCe.Docu();
}

const ary::doc::OldIdlDocu *
HF_IdlLinkList::Get_EntryDocu(ce_id i_nMemberId) const
{
    if (i_nMemberId.IsValid())
        return Env().Data().Find_Ce(i_nMemberId).Docu();
    else
        return 0;
}
