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

生物技术

开发平台:

C/C++

  1. /*
  2.  * ===========================================================================
  3.  * PRODUCTION $Log: alnmulti_renderer.cpp,v $
  4.  * PRODUCTION Revision 1000.1  2004/06/01 21:07:11  gouriano
  5.  * PRODUCTION PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R1.12
  6.  * PRODUCTION
  7.  * ===========================================================================
  8.  */
  9. /*  $Id: alnmulti_renderer.cpp,v 1000.1 2004/06/01 21:07:11 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:  Andrey Yazhuk
  35.  *
  36.  * File Description:
  37.  *
  38.  */
  39. #include <ncbi_pch.hpp>
  40. #include <corelib/ncbistl.hpp>
  41. #include <corelib/ncbitime.hpp>
  42. #include <gui/widgets/aln_multiple/alnmulti_renderer.hpp>
  43. #include <algorithm>
  44. BEGIN_NCBI_SCOPE
  45. static const int kRulerSpace = 4;
  46. static const int kMasterRowSpace = 4;
  47. CAlnMultiRenderer::CAlnMultiRenderer(const TVPRect& rc)
  48. : m_pContext(NULL),
  49.   m_RulerAreaHeight(0),
  50.   m_MasterAreaHeight(0),
  51.   m_ListAreaHeight(0),
  52.   m_bFocused(true)
  53. {
  54.     m_RulerPane.EnableOffset();
  55.     SetBackColor(CGlColor(0.95f, 1.0f, 0.95f)); //light green
  56.     m_Ruler.SetHorizontal(true, CRuler::eTop);
  57.     m_RulerAreaHeight = m_Ruler.GetPreferredSize().Y() + kRulerSpace;
  58.     // setup columns
  59.     AddColumn(120, "Description", IAlignRow::eDescr);    
  60.     AddColumn(40, "Icons", IAlignRow::eIcons);
  61.     AddColumn(60, "Start", IAlignRow::eStart);
  62.     AddColumn(0,"Alignment", IAlignRow::eAlignment, 1.0); // resizable, takes 100% of free space
  63.     AddColumn(60, "End", IAlignRow::eEnd);
  64.     AddColumn(60, "SeqEnd", IAlignRow::eSeqEnd);
  65.     Resize(rc);
  66. }
  67. void CAlnMultiRenderer::SetContext(IAlnMultiRendererContext* p_context)
  68. {
  69.     m_pContext = p_context;
  70. }
  71. void    CAlnMultiRenderer::SetBackColor(const CGlColor Color)
  72. {
  73.     m_BackColor = Color;
  74. }
  75. const CGlColor&    CAlnMultiRenderer::GetBackColor() const
  76. {
  77.     return m_BackColor;
  78. }
  79. CRuler&    CAlnMultiRenderer::GetRuler()
  80. {
  81.     return m_Ruler;
  82. }
  83. void    CAlnMultiRenderer::Resize(const TVPRect& rc)
  84. {
  85.     m_rcBounds = rc;    
  86.     x_LayoutColumns();
  87.     x_Layout();
  88. }
  89. /// Graphics is rendered inthe current OpenGL context in the viewport defined
  90. /// by the / following rectangle
  91. /// (0, 0, m_rcBounds.Width() - 1, m_rcBounds.Height() - 1)
  92. void    CAlnMultiRenderer::Render()
  93. {
  94.     x_Render(NULL);
  95. }
  96. void    CAlnMultiRenderer::Render(TAreaVector& areas)
  97. {
  98.     x_Render(&areas);
  99. }
  100. void    CAlnMultiRenderer::x_Render(TAreaVector* p_areas)
  101. {
  102.     glClearColor(m_BackColor.GetRed(), m_BackColor.GetGreen(),
  103.                  m_BackColor.GetBlue(), m_BackColor.GetAlpha());
  104.     glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
  105.     x_RenderRuler(p_areas);
  106.     x_ResetRowListMap();
  107.     x_RenderMasterRow();
  108.     x_RenderItems(p_areas);
  109.     x_PurgeRowListMap();
  110. }
  111. void    CAlnMultiRenderer::Update()
  112. {
  113.     x_Layout();
  114.     m_RowToList.clear();
  115. }
  116. void    CAlnMultiRenderer::SetRulerHeight(int height)
  117. {
  118.     m_RulerAreaHeight = height;
  119.     x_Layout();
  120. }
  121. ////////////////////////////////////////////////////////////////////////////////
  122. /// protected members
  123. int     CAlnMultiRenderer::GetListTop() const
  124. {
  125.     return m_rcBounds.Height() - m_ListAreaHeight;
  126. }
  127. int     CAlnMultiRenderer::GetColumnIndexByType(EColumnType type) const
  128. {
  129.     int n_col = GetColumnsCount();
  130.     for( int i = 0; i < n_col; i++ )    {
  131.         if(m_vColumns[i].m_UserData == type)
  132.             return i;
  133.     }    
  134.     return -1;
  135. }
  136. TVPRect     CAlnMultiRenderer::GetColumnRect(int i_col) const
  137. {
  138.     const SColumn& Col = GetColumn(i_col);
  139.     return  TVPRect(Col.m_Pos, 0,
  140.                     Col.m_Pos + Col.m_Width -1, m_rcBounds.Height() - 1);
  141. }
  142. TVPRect     CAlnMultiRenderer::GetColumnRect(EColumnType Type)   const
  143. {
  144.     int iCol = GetColumnIndexByType(Type);
  145.     return GetColumnRect(iCol);
  146. }
  147. IAlignRow::EColumnType    CAlnMultiRenderer::GetColumnTypeByIndex(int i_col) const
  148. {
  149.     _ASSERT(i_col > -1);
  150.     int type = (int) GetColumn(i_col).m_UserData;
  151.     return (IAlignRow::EColumnType) type;
  152. }
  153. IAlignRow::EColumnType    CAlnMultiRenderer::GetColumnTypeByX(int x) const
  154. {
  155.     int i_col = CAlnMultiRenderer::GetColumnIndexByX(x);
  156.     if(i_col >= 0)  {
  157.         int type = (int) GetColumn(i_col).m_UserData;
  158.         return (IAlignRow::EColumnType) type;
  159.     } else return IAlignRow::eInvalid;
  160. }
  161. void    CAlnMultiRenderer::x_Layout()
  162. {
  163.     m_MasterAreaHeight = kMasterRowSpace * 2;
  164.     if(x_GetContext()) {
  165.         IAlignRow* pRow = x_GetContext()->GetMasterRow();
  166.         if(pRow)
  167.             m_MasterAreaHeight += pRow->GetHeightPixels();
  168.     }
  169.     m_ListAreaHeight = GetVPListTop() + 1;
  170. }
  171. void    CAlnMultiRenderer::x_RenderRuler(TAreaVector* p_areas)
  172. {
  173.     if(m_RulerAreaHeight > 0)   {
  174.         int iAlign = GetColumnIndexByType(IAlignRow::eAlignment);        
  175.         const SColumn& col = GetColumn(iAlign);
  176.         if(col.VisibleWidth())  {
  177.             TVPUnit bot_y = m_ListAreaHeight + m_MasterAreaHeight;
  178.             TVPUnit top_y = bot_y  + m_RulerAreaHeight - 1;
  179.             TVPRect rc_vp(col.m_Pos, bot_y, col.m_Pos + col.m_Width - 1, top_y);
  180.             m_RulerPane.SetViewport(rc_vp);
  181.             const CGlPane& port = x_GetContext()->GetAlignPort();
  182.     
  183.             TModelRect rcM = port.GetModelLimitsRect();  
  184.             rcM.SetVert(0, m_RulerAreaHeight - 1);          
  185.             m_RulerPane.SetModelLimitsRect(rcM);  
  186.     
  187.             TModelRect rcV = port.GetVisibleRect();        
  188.             rcV.SetVert(0, m_RulerAreaHeight - 1);          
  189.             m_RulerPane.SetVisibleRect(rcV);
  190.            
  191.             m_Ruler.Render(m_RulerPane);  // render
  192.             if(p_areas) {
  193.                 CHTMLActiveArea area(CHTMLActiveArea::eLink, rc_vp,
  194.                                      "Ruler", "Ruler", "");
  195.                 p_areas->push_back(area);
  196.             }
  197.         }
  198.     }
  199. }
  200. void    CAlnMultiRenderer::x_RenderMasterRow()
  201. {
  202.     CGlPane pane(CGlPane::eNeverUpdate);
  203.     pane.EnableOffset();
  204.     TVPRect rc(0, m_ListAreaHeight);
  205.     rc.SetSize(m_rcBounds.Width(), m_MasterAreaHeight);
  206.     pane.SetViewport(rc);
  207.     pane.OpenPixels();
  208.     glColor3f(0.85f, 1.0f, 0.85f);
  209.     glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);
  210.     glRecti(rc.Left(), rc.Bottom(), rc.Right(), rc.Top());
  211.     pane.Close();
  212.     int state = x_GetContext()->IsRendererFocused() ?
  213.                            IAlignRow::fWidgetFocused  : IAlignRow::fNone;
  214.     IAlignRow* p_row = x_GetContext()->GetMasterRow();
  215.     if(p_row)    {
  216.         int H = p_row->GetHeightPixels();
  217.         x_RenderRow(p_row, pane, state, rc.Bottom() + H + kMasterRowSpace, NULL);
  218.     }
  219. }
  220. void    CAlnMultiRenderer::x_RenderItems(TAreaVector* p_areas)
  221. {
  222.     if(x_GetContext()) {
  223.         // calculate visible range
  224.         const CGlPane& port = x_GetContext()->GetAlignPort();
  225.         TModelRect rcM = port.GetVisibleRect();
  226.         int iFirst = x_GetContext()->GetLineByModelY((int) rcM.Top());
  227.         iFirst = max(iFirst, 0);
  228.         int iLast = x_GetContext()->GetLineByModelY((int) rcM.Bottom());
  229.         iLast = (iLast == -1) ? x_GetContext()->GetLinesCount()-1 : iLast;
  230.         if(iLast >= iFirst) {
  231.             x_RenderItemsRange(iFirst, iLast, p_areas);
  232.         }
  233.     }
  234. }
  235. void CAlnMultiRenderer::x_RenderItemsRange(int iFirst, int iLast,
  236.                                            TAreaVector* p_areas)
  237. {
  238.     if(x_GetContext()) {
  239.         const CGlPane& port = x_GetContext()->GetAlignPort();
  240.         // create clipping rectangle
  241.         TVPRect rc_clip = port.GetViewport();
  242.         rc_clip.SetHorz(0, m_rcBounds.Width() - 1);
  243.         if(rc_clip.Height()  &&  rc_clip.Width())  {
  244.             int y1 = GetVPListTop() + (int) port.GetVisibleRect().Top();
  245.             const int base_state = m_bFocused ?
  246.                                    IAlignRow::fWidgetFocused  : IAlignRow::fNone;
  247.             int i_focused = x_GetContext()->GetFocusedItemIndex();
  248.             // create a single CGlPane for rendering all cells in all rows
  249.             CGlPane pane(p_areas ? CGlPane::eAlwaysUpdate : CGlPane::eNeverUpdate);
  250.             pane.EnableOffset();
  251.             pane.SetClipRect(&rc_clip);
  252.             for( int i = iFirst ; i <= iLast ; i++) {
  253.                 IAlignRow* p_row = x_GetContext()->GetRowByLine(i);
  254.                 int state = base_state;
  255.                 if(x_GetContext()->IsItemSelected(i))
  256.                     state |= IAlignRow::fItemSelected;
  257.                 if(i_focused == i)
  258.                     state |= IAlignRow::fItemFocused;
  259.                 int y = y1 - x_GetContext()->GetLinePosY(i);
  260.                 x_RenderRow(p_row, pane, state, y, p_areas);
  261.             }
  262.             pane.SetClipRect(NULL);
  263.         }
  264.     }
  265. }
  266. // renders all columns within the given Row, vp_top_y is OpenGL viewport
  267. // coordinate of the top pixel in the row
  268. void    CAlnMultiRenderer::x_RenderRow(IAlignRow* p_row, CGlPane& pane,
  269.                                        int state, int vp_top_y,
  270.                                        TAreaVector* p_areas)
  271. {
  272.     _ASSERT(p_row);
  273.     m_RowToList[p_row] = true; // update "on-screen" attribute
  274.     SetupPaneForRow(pane, p_row, vp_top_y);
  275.     int col_n = GetColumnsCount();
  276.     for( int i_col = 0;  i_col < col_n;  i_col++ )  {         
  277.         const SColumn& col = GetColumn(i_col);                        
  278.         if(col.VisibleWidth()) { 
  279.             SetupPaneForColumn(pane, i_col);
  280.             EColumnType type = x_GetColumnType(col);
  281.             p_row->RenderColumn(type, pane, state); 
  282.             if(p_areas) {
  283.                 p_row->GetHTMLActiveAreas(type, pane, *p_areas);
  284.             }
  285.         }
  286.     }
  287. }
  288. void    CAlnMultiRenderer::SetupPaneForRow(CGlPane& pane,
  289.                                            const IAlignRow* p_row,
  290.                                            int vp_top_y) const
  291. {
  292.     const CGlPane& port = x_GetContext()->GetAlignPort();
  293.     int vp_bottom_y = vp_top_y - (p_row->GetHeightPixels() - 1);
  294.     // setup model space
  295.     TModelRect rcLim = port.GetModelLimitsRect();
  296.     rcLim.SetVert(vp_top_y, vp_bottom_y);
  297.     pane.SetModelLimitsRect(rcLim);
  298.     TModelRect rcV = port.GetVisibleRect();
  299.     rcV.SetVert(vp_top_y, vp_bottom_y);
  300.     pane.SetVisibleRect(rcV);
  301.     TVPRect rc_vp(0, vp_bottom_y, m_rcBounds.Width() - 1, vp_top_y);
  302.     pane.SetViewport(rc_vp);
  303. }
  304. void CAlnMultiRenderer::SetupPaneForColumn(CGlPane& pane, int i_col) const
  305. {
  306.     const SColumn& col = GetColumn(i_col);
  307.     pane.GetViewport().SetHorz(col.m_Pos, col.m_Pos + col.m_Width - 1);
  308. }
  309. int     CAlnMultiRenderer::GetVPListTop() const
  310. {
  311.     return m_rcBounds.Height() - 1 - m_RulerAreaHeight - m_MasterAreaHeight;
  312. }
  313. int     CAlnMultiRenderer::x_GetLineByWindowY(int WinY) const
  314. {
  315.     int vpY = WinY - GetListTop();
  316.     int OffsetY = (int) x_GetContext()->GetAlignPort().GetVisibleRect().Top();
  317.     return x_GetContext()->GetLineByModelY(vpY + OffsetY);
  318. }
  319. TVPRect CAlnMultiRenderer::x_GetLineRect(int Index)
  320. {
  321.     int Top = 0, H = 0;
  322.     if(x_GetContext()  &&  Index >= 0) {
  323.         int OffsetY = (int) x_GetContext()->GetAlignPort().GetVisibleRect().Top();
  324.         Top = x_GetContext()->GetLinePosY(Index) - OffsetY;
  325.         H = x_GetContext()->GetLineHeight(Index);
  326.     }
  327.     return TVPRect(0, Top + H -1, m_rcBounds.Width() - 1, Top);
  328. }
  329. void    CAlnMultiRenderer::x_ResetRowListMap()
  330. {
  331.     NON_CONST_ITERATE(TRowToList, it, m_RowToList)  {
  332.         it->second = false;
  333.     }
  334. }
  335. void    CAlnMultiRenderer::x_PurgeRowListMap()
  336. {
  337.     for( TRowToList::iterator it = m_RowToList.begin(); it != m_RowToList.end();  )  {
  338.         if(! it->second) {
  339.             //row is off-screen now - purge cached graphics
  340.             (it->first)->GraphicsCacheCmd(IAlignRow::eDelete);
  341.             TRowToList::iterator next = it;
  342.             ++next;
  343.             m_RowToList.erase(it);
  344.             it = next;
  345.         } else it++;
  346.     }
  347. }
  348. const int kDefColumnWidth = 50;
  349. CAlnMultiRenderer::SColumn::SColumn()
  350. :   m_Pos(0), 
  351.     m_Width(kDefColumnWidth),
  352.     m_UserData(0),
  353.     m_bVisible(true),
  354.     m_Share(-1.0)
  355. {
  356. }
  357. int     CAlnMultiRenderer::GetColumnsCount() const
  358. {
  359.     return m_vColumns.size();
  360. }
  361. const   CAlnMultiRenderer::SColumn&  CAlnMultiRenderer::GetColumn(int index) const
  362. {
  363.     _ASSERT(index >= 0  &&  index < (int) m_vColumns.size());
  364.     return m_vColumns[index];
  365. }
  366. int     CAlnMultiRenderer::AddColumn()
  367. {
  368.     return AddColumn(kDefColumnWidth, "", 0);
  369. }
  370. int     CAlnMultiRenderer::AddColumn(int width, const string& label, int data,
  371.                                     double share)
  372. {
  373.     int index = GetColumnsCount();
  374.     return InsertColumn(index, width, label, data, share);
  375. }
  376. int     CAlnMultiRenderer::InsertColumn(int index, int width, const string& label,
  377.                                         int data, double share)
  378. {
  379.     _ASSERT(index >= 0  &&  index <= (int) m_vColumns.size());
  380.     
  381.     SColumn col;
  382.     col.m_Width = width;
  383.     col.m_Label = label;
  384.     col.m_UserData = data;
  385.     col.m_Share = share;
  386.     //###col.m_Pos = m_rcBounds.Width();
  387.     
  388.     TColumnVector::const_iterator it  = 
  389.         m_vColumns.insert(m_vColumns.begin() + index, col);
  390.     return it - m_vColumns.begin();
  391. }
  392. void    CAlnMultiRenderer::SetColumnWidth(int index, int width)
  393. {
  394.     _ASSERT(index >= 0  &&  index < (int) m_vColumns.size());
  395.     _ASSERT(width >= 0);
  396.     SColumn& col = m_vColumns[index];
  397.     int delta = width - col.m_Width;
  398.     col.m_Width = width;
  399.     
  400.     for( int i = index + 1; delta != 0  &&  i < (int) m_vColumns.size();  i++)  {
  401.         m_vColumns[i].m_Pos += delta;
  402.     }
  403. }
  404. void    CAlnMultiRenderer::SetColumnUserData(int index, int data)
  405. {
  406.     _ASSERT(index >= 0  &&  index < (int) m_vColumns.size());
  407.     m_vColumns[index].m_UserData = data;
  408. }
  409. void    CAlnMultiRenderer::SetColumnVisible(int index, bool b_visible)
  410. {
  411.     _ASSERT(index >= 0  &&  index < (int) m_vColumns.size());
  412.     SColumn& col = m_vColumns[index];
  413.     if(col.m_bVisible != b_visible) {
  414.         col.m_bVisible = b_visible;
  415.         int delta = b_visible ? col.m_Width : -col.m_Width;
  416.         for( int i = index + 1; delta != 0  &&  i < (int) m_vColumns.size();  i++)  {
  417.             m_vColumns[i].m_Pos += delta;
  418.         }
  419.     }
  420. }
  421. int     CAlnMultiRenderer::GetColumnIndexByX(int x) const
  422. {
  423.     ITERATE(TColumnVector, it, m_vColumns)  {
  424.         if(x >= it->m_Pos  &&  x < it->m_Pos + it->m_Width)
  425.             return it - m_vColumns.begin();
  426.     }
  427.     return -1;
  428. }
  429. void    CAlnMultiRenderer::UpdateColumns()
  430. {
  431.     Resize(m_rcBounds);
  432. }
  433. void    CAlnMultiRenderer::x_LayoutColumns()
  434. {
  435.     int w = m_rcBounds.Width();       
  436.     int n_col = (int) m_vColumns.size();
  437.     if(w > 0  &&  n_col > 0) { // resize all columns            
  438.         // getting statistics
  439.         int total_w = 0;
  440.         double total_share = 0.0; // sum of m_Share for all resizable columns
  441.         int last_sh_index = -1; // index of last resizable column
  442.         for( int j = 0; j < n_col;  j++ )   {
  443.             SColumn& col = m_vColumns[j];
  444.             if(col.m_bVisible)  {
  445.                 if(col.m_Share < 0.0)   {
  446.                     total_w += col.m_Width;
  447.                 } else {
  448.                     total_share += col.m_Share;
  449.                     last_sh_index = j;
  450.                 }
  451.             }
  452.         }
  453.         if(total_w < w)    { // there is some space left for resizable columns
  454.             int share_w = w - total_w;
  455.             double K = share_w / total_share; // proportion
  456.             int pos = 0, share_spent = 0;
  457.             for( int j = 0; j < n_col;  j++ )   {
  458.                 SColumn& col = m_vColumns[j];
  459.                 if(col.m_bVisible)  {
  460.                     col.m_Pos = pos;
  461.                 
  462.                     if(col.m_Share >= 0.0)   { // resizable column
  463.                         if(j == last_sh_index)  {
  464.                             col.m_Width = share_w - share_spent; // the rest
  465.                         } else {
  466.                             col.m_Width = (int) (0.5 + share_w * K);
  467.                             share_spent += col.m_Pos;
  468.                         }
  469.                     }
  470.                     pos += col.m_Width;
  471.                 }
  472.             }                    
  473.         } else { // barely enough for fixed size columns
  474.             int pos = 0;
  475.             for( int j = 0; j < n_col;  j++ )   {
  476.                 SColumn& col = m_vColumns[j];
  477.                 if(col.m_bVisible)  {
  478.                     col.m_Pos = pos;
  479.                     if(col.m_Share >= 0.0)   {
  480.                         col.m_Width = 0;
  481.                     }
  482.                     pos += col.m_Width;
  483.                 }
  484.             }
  485.         }
  486.     }
  487. }    
  488. END_NCBI_SCOPE
  489. /*
  490.  * ===========================================================================
  491.  * $Log: alnmulti_renderer.cpp,v $
  492.  * Revision 1000.1  2004/06/01 21:07:11  gouriano
  493.  * PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R1.12
  494.  *
  495.  * Revision 1.12  2004/05/21 22:27:52  gorelenk
  496.  * Added PCH ncbi_pch.hpp
  497.  *
  498.  * Revision 1.11  2004/05/10 17:46:35  yazhuk
  499.  * Addressed GCC warnings
  500.  *
  501.  * Revision 1.10  2004/04/22 17:10:34  yazhuk
  502.  * Fixed rendering of focus state
  503.  *
  504.  * Revision 1.9  2004/04/06 19:08:59  yazhuk
  505.  * Added "TAreaVector* p_areas" argument ot x_RenderRuler, generation of
  506.  * CHTMLActiveArea object for Ruler and alignment graphics
  507.  *
  508.  * Revision 1.8  2004/04/06 16:02:22  yazhuk
  509.  * Added cloumns management API to CAlnMultiRenderer, eliminated CColumnWidget
  510.  *
  511.  * Revision 1.7  2004/04/06 13:37:09  dicuccio
  512.  * Formatting changes - trimmed trailing white space
  513.  *
  514.  * Revision 1.6  2004/04/05 15:34:38  johnson
  515.  * added a few consts to SetupPane methods
  516.  *
  517.  * Revision 1.5  2004/03/29 19:04:42  yazhuk
  518.  * Support for  CHTMLActiveArea-s generation
  519.  *
  520.  * Revision 1.4  2004/03/26 15:02:59  yazhuk
  521.  * Changed width of "Icons" column
  522.  *
  523.  * Revision 1.3  2004/03/25 13:05:49  dicuccio
  524.  * Use _TRACE() instead of cout
  525.  *
  526.  * Revision 1.2  2004/03/09 21:03:39  yazhuk
  527.  * Clean-up
  528.  *
  529.  * Revision 1.1  2004/03/08 15:36:47  yazhuk
  530.  * Initial revision
  531.  *
  532.  *
  533.  * ===========================================================================
  534.  */