panel_grid.cpp
上传用户:yhdzpy8989
上传日期:2007-06-13
资源大小:13604k
文件大小:5k
源码类别:

生物技术

开发平台:

C/C++

  1. /*
  2.  * ===========================================================================
  3.  * PRODUCTION $Log: panel_grid.cpp,v $
  4.  * PRODUCTION Revision 1000.1  2004/06/01 21:03:38  gouriano
  5.  * PRODUCTION PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R1.4
  6.  * PRODUCTION
  7.  * ===========================================================================
  8.  */
  9. /*  $Id: panel_grid.cpp,v 1000.1 2004/06/01 21:03:38 gouriano Exp $
  10.  * ===========================================================================
  11.  *
  12.  *                            PUBLIC DOMAIN NOTICE
  13.  *               National Center for Biotechnology Information
  14.  *
  15.  *  This software / database is a "United States Government Work" under the
  16.  *  terms of the United States Copyright Act.  It was written as part of
  17.  *  the author's official duties as a United States Government employee and
  18.  *  thus cannot be copyrighted.  This software / database is freely available
  19.  *  to the public for use. The National Library of Medicine and the U.S.
  20.  *  Government have not placed any restriction on its use or reproduction.
  21.  *
  22.  *  Although all reasonable efforts have been taken to ensure the accuracy
  23.  *  and reliability of the software and data, the NLM and the U.S.
  24.  *  Government do not and cannot warrant the performance or results that
  25.  *  may be obtained by using this software or data. The NLM and the U.S.
  26.  *  Government disclaim all warranties, express or implied, including
  27.  *  warranties of performance, merchantability or fitness for any particular
  28.  *  purpose.
  29.  *
  30.  *  Please cite the author in any work or product based on this material.
  31.  *
  32.  * ===========================================================================
  33.  *
  34.  * Authors:  Peter Meric
  35.  *
  36.  * File Description:
  37.  *   CPanelGrid - manage multi-page spread for a PDF document
  38.  *
  39.  * Note:
  40.  *   Column and Row values are zero-based ie. first index is zero
  41.  *   Panel values are one-based ie. first index is one
  42.  */
  43. #include <ncbi_pch.hpp>
  44. #include "panel_grid.hpp"
  45. #include <gui/utils/id_generator.hpp>
  46. #include "pdf_object.hpp"
  47. BEGIN_NCBI_SCOPE
  48. CPanelGrid::CPanelGrid(CIdGenerator& objid_gen,
  49.                        unsigned int cols,
  50.                        unsigned int rows
  51.                       )
  52.     : m_ObjIdGenerator(&objid_gen),
  53.       m_Cols(cols),
  54.       m_Rows(rows),
  55.       m_Panels(cols * rows)
  56. {
  57.     for (unsigned int r = 0; r < m_Rows; ++r) {
  58.         for (unsigned int c = 0; c < m_Cols; ++c) {
  59.             CRef<CPanel> p(new CPanel());
  60.             p->m_HAlign = GetHAlign(c);
  61.             p->m_VAlign = GetVAlign(r);
  62.             p->m_Col = c;
  63.             p->m_Row = r;
  64.             p->m_PanelNum = r * m_Cols + c + 1;
  65.             p->m_HPageOffset = c;
  66.             p->m_VPageOffset = m_Rows - r - 1;
  67.             p->m_Panel = CRef<CPdfObject>(new CPdfObject(m_ObjIdGenerator->NextId()));
  68.             const unsigned int idx = x_GetPanelNumber(c, r) - 1;
  69.             m_Panels[idx] = p;
  70.         }
  71.     }
  72. }
  73. CPanelGrid::~CPanelGrid()
  74. {
  75. }
  76. CPanelGrid::TAlignment CPanelGrid::GetVAlign(unsigned int row) const
  77. {
  78.     // first row is bottom-aligned
  79.     TAlignment valign = CPrintOptions::eBottom;
  80.     if (m_Rows == 1) {
  81.         valign = CPrintOptions::eMiddle;
  82.     }
  83.     else {
  84.         if (row == m_Rows - 1) {
  85.             valign = CPrintOptions::eTop;
  86.         }
  87.         else if (row > 0) {
  88.             valign = CPrintOptions::eMiddle;
  89.         }
  90.     }
  91.     return valign;
  92. }
  93. CPanelGrid::TAlignment CPanelGrid::GetHAlign(unsigned int col) const
  94. {
  95.     // first column is right-aligned
  96.     TAlignment halign = CPrintOptions::eRight;
  97.     if (m_Cols == 1) {
  98.         halign = CPrintOptions::eCenter;
  99.     }
  100.     else {
  101.         if (col == m_Cols - 1) {
  102.             halign = CPrintOptions::eLeft;
  103.         }
  104.         else if (col > 0) {
  105.             halign = CPrintOptions::eCenter;
  106.         }
  107.     }
  108.     return halign;
  109. }
  110. CRef<CPanel> CPanelGrid::GetPanel(unsigned int panel) const
  111. {
  112.     if (panel == 0) {
  113.         return CRef<CPanel>();
  114.     }
  115.     return m_Panels[panel - 1];
  116. }
  117. CRef<CPanel> CPanelGrid::GetPanel(unsigned int col, unsigned int row) const
  118. {
  119.     return GetPanel(x_GetPanelNumber(col, row));
  120. }
  121. unsigned int CPanelGrid::x_GetPanelNumber(unsigned int col, unsigned int row) const
  122. {
  123.     if (col >= m_Cols || row >= m_Rows)
  124.     {
  125.         return 0;
  126.     }
  127.     return row * m_Cols + col + 1;
  128. }
  129. unsigned int CPanelGrid::GetNumPanels(void) const
  130. {
  131.     return m_Cols * m_Rows;
  132. }
  133. CPanelGrid::SNeighbours CPanelGrid::GetNeighbours(unsigned int col, unsigned int row) const
  134. {
  135.     // MSVC++ didn't like an initializer list for SNeighbours
  136.     SNeighbours n;
  137.     n.left = GetPanel(col - 1, row);
  138.     n.right = GetPanel(col + 1, row);
  139.     n.top = GetPanel(col, row - 1);
  140.     n.bottom = GetPanel(col, row + 1);
  141.     return n;
  142. }
  143. END_NCBI_SCOPE
  144. /*
  145.  * ===========================================================================
  146.  * $Log: panel_grid.cpp,v $
  147.  * Revision 1000.1  2004/06/01 21:03:38  gouriano
  148.  * PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R1.4
  149.  *
  150.  * Revision 1.4  2004/05/21 22:27:50  gorelenk
  151.  * Added PCH ncbi_pch.hpp
  152.  *
  153.  * Revision 1.3  2003/06/25 18:02:51  meric
  154.  * Source rearrangement: move "private" headers into the src/ tree
  155.  *
  156.  * Revision 1.2  2003/06/24 22:36:40  meric
  157.  * MSVC++ didn't like initializer list for struct SNeighbours, so instead
  158.  * are assigning to each attribute
  159.  *
  160.  * Revision 1.1  2003/06/24 15:39:50  meric
  161.  * Initial version
  162.  *
  163.  *
  164.  * ===========================================================================
  165.  */