/**************************************************/
/* WORKSHEET.CPP : routines de trace du cartouche */
/**************************************************/

#include "fctsys.h"
#include "gr_basic.h"

#include "common.h"
#include "macros.h"

#include "worksheet.h"

/* Must be defined in main applications: */
extern wxString g_Main_Title;

/*************************************************************************************/
void WinEDA_DrawFrame::TraceWorkSheet( wxDC* DC, BASE_SCREEN* screen, int line_width )
/*************************************************************************************/

/* Draw the sheet references
 */
{
    if( !m_Draw_Sheet_Ref )
        return;

    Ki_PageDescr*     Sheet = screen->m_CurrentSheetDesc;
    int               ii, jj, xg, yg, ipas, gxpas, gypas;
    wxPoint           pos;
    int               refx, refy, Color;
    wxString          Line;
    Ki_WorkSheetData* WsItem;
    int               scale = m_InternalUnits / 1000;
    wxSize  size( SIZETEXT* scale, SIZETEXT* scale );
    wxSize  size_ref( SIZETEXT_REF* scale, SIZETEXT_REF* scale );

    wxString msg;
    int      UpperLimit = VARIABLE_BLOCK_START_POSITION;
    int      width = line_width;

    Color = RED;
    if( Sheet == NULL )
    {
        DisplayError( this,
            wxT( "WinEDA_DrawFrame::TraceWorkSheet() error: m_CurrentSheet NULL" ) );
        return;
    }

    // if not printing, draw the page limits:
    if( !g_IsPrinting & g_ShowPageLimits )
    {
        GRSetDrawMode( DC, GR_COPY );
        GRRect( &DrawPanel->m_ClipBox, DC, 0, 0,
            Sheet->m_Size.x * scale, Sheet->m_Size.y * scale, width,
            g_DrawBgColor == WHITE ? LIGHTGRAY : DARKDARKGRAY );
    }

    GRSetDrawMode( DC, GR_COPY );
    /* trace de la bordure */
    refx = Sheet->m_LeftMargin;
    refy = Sheet->m_TopMargin;                      /* Upper left corner */
    xg   = Sheet->m_Size.x - Sheet->m_RightMargin;
    yg   = Sheet->m_Size.y - Sheet->m_BottomMargin; /* lower right corner */

    for( ii = 0; ii < 2; ii++ )
    {
        GRRect( &DrawPanel->m_ClipBox, DC, refx * scale, refy * scale,
            xg * scale, yg * scale, width, Color );

        refx += GRID_REF_W; refy += GRID_REF_W;
        xg   -= GRID_REF_W; yg -= GRID_REF_W;
    }

    /* trace des reperes */
    refx = Sheet->m_LeftMargin;
    refy = Sheet->m_TopMargin;                      /* Upper left corner */
    xg   = Sheet->m_Size.x - Sheet->m_RightMargin;
    yg   = Sheet->m_Size.y - Sheet->m_BottomMargin; /* lower right corner */

    /* Trace des reperes selon l'axe X */
    ipas  = (xg - refx) / PAS_REF;
    gxpas = ( xg - refx) / ipas;
    for( ii = refx + gxpas, jj = 1; ipas > 0; ii += gxpas, jj++, ipas-- )
    {
        Line.Printf( wxT( "%d" ), jj );
        if( ii < xg - PAS_REF / 2 )
        {
            GRLine( &DrawPanel->m_ClipBox, DC, ii * scale, refy * scale,
                ii * scale, (refy + GRID_REF_W) * scale, width, Color );
        }
        DrawGraphicText( DrawPanel, DC,
            wxPoint( (ii - gxpas / 2) * scale, (refy + GRID_REF_W / 2) * scale ),
            Color,
            Line, TEXT_ORIENT_HORIZ, size_ref,
            GR_TEXT_HJUSTIFY_CENTER, GR_TEXT_VJUSTIFY_CENTER, width );
        if( ii < xg - PAS_REF / 2 )
        {
            GRLine( &DrawPanel->m_ClipBox, DC, ii * scale, yg * scale,
                ii * scale, (yg - GRID_REF_W) * scale, width, Color );
        }
        DrawGraphicText( DrawPanel, DC,
            wxPoint( (ii - gxpas / 2) * scale, (yg - GRID_REF_W / 2) * scale ),
            Color,
            Line, TEXT_ORIENT_HORIZ, size_ref,
            GR_TEXT_HJUSTIFY_CENTER, GR_TEXT_VJUSTIFY_CENTER, width );
    }

    /* Trace des reperes selon l'axe Y */
    ipas  = (yg - refy) / PAS_REF;
    gypas = ( yg - refy) / ipas;
    for( ii = refy + gypas, jj = 0; ipas > 0; ii += gypas, jj++, ipas-- )
    {
        Line.Empty();
        if( jj < 26 )
            Line.Printf( wxT( "%c" ), jj + 'A' );
        else
            Line.Printf( wxT( "%c" ), 'a' + jj - 26 );
        if( ii < yg - PAS_REF / 2 )
        {
            GRLine( &DrawPanel->m_ClipBox, DC, refx * scale, ii * scale,
                (refx + GRID_REF_W) * scale, ii * scale, width, Color );
        }
        DrawGraphicText( DrawPanel, DC,
            wxPoint( (refx + GRID_REF_W / 2) * scale, (ii - gypas / 2) * scale ),
            Color,
            Line, TEXT_ORIENT_HORIZ, size_ref,
            GR_TEXT_HJUSTIFY_CENTER, GR_TEXT_VJUSTIFY_CENTER, width );
        if( ii < yg - PAS_REF / 2 )
        {
            GRLine( &DrawPanel->m_ClipBox, DC, xg * scale, ii * scale,
                (xg - GRID_REF_W) * scale, ii * scale, width, Color );
        }
        DrawGraphicText( DrawPanel, DC,
            wxPoint( (xg - GRID_REF_W / 2) * scale, (ii - gxpas / 2) * scale ),
            Color,
            Line, TEXT_ORIENT_HORIZ, size_ref,
            GR_TEXT_HJUSTIFY_CENTER, GR_TEXT_VJUSTIFY_CENTER, width );
    }

    /* Trace du cartouche */
    refx = Sheet->m_Size.x - Sheet->m_RightMargin - GRID_REF_W;
    refy = Sheet->m_Size.y - Sheet->m_BottomMargin - GRID_REF_W; /* lower right corner */

    for( WsItem = &WS_Date; WsItem != NULL; WsItem = WsItem->Pnext )
    {
        pos.x = (refx - WsItem->m_Posx) * scale;
        pos.y = (refy - WsItem->m_Posy) * scale;
        msg.Empty();

        switch( WsItem->m_Type )
        {
        case WS_DATE:
            if( WsItem->m_Legende )
                msg = WsItem->m_Legende;
            msg += screen->m_Date;
            DrawGraphicText( DrawPanel, DC, pos, Color,
                msg, TEXT_ORIENT_HORIZ, size,
                GR_TEXT_HJUSTIFY_LEFT, GR_TEXT_VJUSTIFY_CENTER, width );
            break;

        case WS_REV:
            if( WsItem->m_Legende )
                msg = WsItem->m_Legende;
            msg += screen->m_Revision;
            DrawGraphicText( DrawPanel, DC, pos, Color,
                msg, TEXT_ORIENT_HORIZ, size,
                GR_TEXT_HJUSTIFY_LEFT, GR_TEXT_VJUSTIFY_CENTER, width );
            break;

        case WS_KICAD_VERSION:
            if( WsItem->m_Legende )
                msg = WsItem->m_Legende;
            msg += g_ProductName + g_Main_Title;
            msg += wxT( " " ) + GetBuildVersion();
            DrawGraphicText( DrawPanel, DC, pos, Color,
                msg, TEXT_ORIENT_HORIZ, size,
                GR_TEXT_HJUSTIFY_LEFT, GR_TEXT_VJUSTIFY_CENTER, width );
            break;

        case WS_SIZESHEET:
            if( WsItem->m_Legende )
                msg = WsItem->m_Legende;
            msg += Sheet->m_Name;
            DrawGraphicText( DrawPanel, DC, pos, Color,
                msg, TEXT_ORIENT_HORIZ, size,
                GR_TEXT_HJUSTIFY_LEFT, GR_TEXT_VJUSTIFY_CENTER, width );
            break;


        case WS_IDENTSHEET:
            if( WsItem->m_Legende )
                msg = WsItem->m_Legende;
            msg << screen->m_ScreenNumber << wxT( "/" ) << screen->m_NumberOfScreen;
            DrawGraphicText( DrawPanel, DC, pos, Color,
                msg, TEXT_ORIENT_HORIZ, size,
                GR_TEXT_HJUSTIFY_LEFT, GR_TEXT_VJUSTIFY_CENTER, width );
            break;

        case WS_FILENAME:
        {
            wxString fname, fext;
            wxFileName::SplitPath( screen->m_FileName, (wxString*) NULL, &fname, &fext );
            if( WsItem->m_Legende )
                msg = WsItem->m_Legende;
            msg << fname << wxT( "." ) << fext;
            DrawGraphicText( DrawPanel, DC, pos, Color,
                msg, TEXT_ORIENT_HORIZ, size,
                GR_TEXT_HJUSTIFY_LEFT, GR_TEXT_VJUSTIFY_CENTER, width );
        }
            break;

        case WS_FULLSHEETNAME:
            if( WsItem->m_Legende )
                msg = WsItem->m_Legende;
            msg += GetScreenDesc();
            DrawGraphicText( DrawPanel, DC, pos, Color,
                msg, TEXT_ORIENT_HORIZ, size,
                GR_TEXT_HJUSTIFY_LEFT, GR_TEXT_VJUSTIFY_CENTER, width );
            break;


        case WS_COMPANY_NAME:
            if( WsItem->m_Legende )
                msg = WsItem->m_Legende;
            msg += screen->m_Company;
            if( !msg.IsEmpty() )
            {
                DrawGraphicText( DrawPanel, DC, pos, Color,
                    msg, TEXT_ORIENT_HORIZ, size,
                    GR_TEXT_HJUSTIFY_LEFT, GR_TEXT_VJUSTIFY_CENTER, width );
                UpperLimit = MAX( UpperLimit, WsItem->m_Posy + SIZETEXT );
            }
            break;

        case WS_TITLE:
            if( WsItem->m_Legende )
                msg = WsItem->m_Legende;
            msg += screen->m_Title;
            DrawGraphicText( DrawPanel, DC, pos, Color,
                msg, TEXT_ORIENT_HORIZ, size,
                GR_TEXT_HJUSTIFY_LEFT, GR_TEXT_VJUSTIFY_CENTER, width );
            break;

        case WS_COMMENT1:
            if( WsItem->m_Legende )
                msg = WsItem->m_Legende;
            msg += screen->m_Commentaire1;
            if( !msg.IsEmpty() )
            {
                DrawGraphicText( DrawPanel, DC, pos, Color,
                    msg, TEXT_ORIENT_HORIZ, size,
                    GR_TEXT_HJUSTIFY_LEFT, GR_TEXT_VJUSTIFY_CENTER, width );
                UpperLimit = MAX( UpperLimit, WsItem->m_Posy + SIZETEXT );
            }
            break;

        case WS_COMMENT2:
            if( WsItem->m_Legende )
                msg = WsItem->m_Legende;
            msg += screen->m_Commentaire2;
            if( !msg.IsEmpty() )
            {
                DrawGraphicText( DrawPanel, DC, pos, Color,
                    msg, TEXT_ORIENT_HORIZ, size,
                    GR_TEXT_HJUSTIFY_LEFT, GR_TEXT_VJUSTIFY_CENTER, width );
                UpperLimit = MAX( UpperLimit, WsItem->m_Posy + SIZETEXT );
            }
            break;

        case WS_COMMENT3:
            if( WsItem->m_Legende )
                msg = WsItem->m_Legende;
            msg += screen->m_Commentaire3;
            if( !msg.IsEmpty() )
            {
                DrawGraphicText( DrawPanel, DC, pos, Color,
                    msg, TEXT_ORIENT_HORIZ, size,
                    GR_TEXT_HJUSTIFY_LEFT, GR_TEXT_VJUSTIFY_CENTER, width );
                UpperLimit = MAX( UpperLimit, WsItem->m_Posy + SIZETEXT );
            }
            break;

        case WS_COMMENT4:
            if( WsItem->m_Legende )
                msg = WsItem->m_Legende;
            msg += screen->m_Commentaire4;
            if( !msg.IsEmpty() )
            {
                DrawGraphicText( DrawPanel, DC, pos, Color,
                    msg, TEXT_ORIENT_HORIZ, size,
                    GR_TEXT_HJUSTIFY_LEFT, GR_TEXT_VJUSTIFY_CENTER, width );
                UpperLimit = MAX( UpperLimit, WsItem->m_Posy + SIZETEXT );
            }
            break;

        case WS_UPPER_SEGMENT:
            if( UpperLimit == 0 )
                break;

        case WS_LEFT_SEGMENT:
            WS_MostUpperLine.m_Posy        =
                WS_MostUpperLine.m_Endy    =
                    WS_MostLeftLine.m_Posy = UpperLimit;
            pos.y = (refy - WsItem->m_Posy) * scale;

        case WS_SEGMENT:
            xg = Sheet->m_Size.x -
                 GRID_REF_W - Sheet->m_RightMargin - WsItem->m_Endx;
            yg = Sheet->m_Size.y -
                 GRID_REF_W - Sheet->m_BottomMargin - WsItem->m_Endy;
            GRLine( &DrawPanel->m_ClipBox, DC, pos.x, pos.y,
                xg * scale, yg * scale, width, Color );
            break;
        }
    }
}


/*********************************************************************/
wxString WinEDA_DrawFrame::GetScreenDesc()
/*********************************************************************/
{
    wxString msg;

    msg << GetBaseScreen()->m_ScreenNumber << wxT( "/" )
        << GetBaseScreen()->m_NumberOfScreen;
    return msg;
}
