nux-1.16.0
TableItem.cpp
00001 /*
00002  * Copyright 2010 Inalogic® Inc.
00003  *
00004  * This program is free software: you can redistribute it and/or modify it
00005  * under the terms of the GNU Lesser General Public License, as
00006  * published by the  Free Software Foundation; either version 2.1 or 3.0
00007  * of the License.
00008  *
00009  * This program is distributed in the hope that it will be useful, but
00010  * WITHOUT ANY WARRANTY; without even the implied warranties of
00011  * MERCHANTABILITY, SATISFACTORY QUALITY or FITNESS FOR A PARTICULAR
00012  * PURPOSE.  See the applicable version of the GNU Lesser General Public
00013  * License for more details.
00014  *
00015  * You should have received a copy of both the GNU Lesser General Public
00016  * License along with this program. If not, see <http://www.gnu.org/licenses/>
00017  *
00018  * Authored by: Jay Taoko <jaytaoko@inalogic.com>
00019  *
00020  */
00021 
00022 
00023 #include "Nux.h"
00024 #include "TableCtrl.h"
00025 #include "TableItem.h"
00026 
00027 namespace nux
00028 {
00029 
00030   const int ITEMDEFAULTWIDTH = 140;
00031   const int ITEMDEFAULTHEIGHT = 20;
00032 
00033   Color GPropertyItemTextColor0 = Color (0xFFDEDEDE);
00034   Color GPropertyItemTextColor1 = Color (0xFFE9E9E9);
00035 
00036   ColumnHeader::ColumnHeader()
00037   {
00038     m_header_area = new InputArea (NUX_TRACKER_LOCATION);
00039     m_header_area->SinkReference();
00040     _fix_width = false;
00041     _fix_width_value = 80;
00042   }
00043 
00044   ColumnHeader::ColumnHeader(const ColumnHeader& Other)
00045   {
00046     m_header_area = 0;
00047     if (Other.m_header_area)
00048     {
00049       m_header_area = Other.m_header_area;
00050       m_header_area->Reference();
00051       _fix_width = Other._fix_width;
00052       _fix_width_value = Other._fix_width_value;
00053     }
00054   }
00055 
00056   ColumnHeader::~ColumnHeader()
00057   {
00058     if (m_header_area)
00059       m_header_area->UnReference();
00060     m_header_area = 0;
00061   }
00062 
00063   ColumnHeader& ColumnHeader::operator = (const ColumnHeader& Other)
00064   {
00065     if (m_header_area)
00066     {
00067       m_header_area->UnReference();
00068       m_header_area = 0;
00069     }
00070 
00071     if (Other.m_header_area)
00072     {
00073       m_header_area = Other.m_header_area;
00074       m_header_area->Reference();
00075       _fix_width = Other._fix_width;
00076       _fix_width_value = Other._fix_width_value;
00077     }
00078     return *this;
00079   }
00080 
00081   RowHeader::RowHeader()
00082   {
00083     _table_item = 0;
00084   }
00085 
00086   RowHeader::RowHeader(const RowHeader& Other)
00087   {
00088     _table_item = 0;
00089   }
00090 
00091   RowHeader::~RowHeader()
00092   {
00093     _table_item = 0;
00094   }
00095 
00096   RowHeader& RowHeader::operator = (const RowHeader& Other)
00097   {
00098 
00099     return *this;
00100   }
00101 
00102   TableItem::TableItem (const TCHAR *name, NodeParameterType type)
00103     : NodeNetCom (name, type)
00104     , m_Table(0)
00105     , m_isOpen(false)
00106     , m_bParentOpen(false)
00107     , m_bDirty(true)
00108     , m_PropertyRedraw(false)
00109     , m_PropertyTextColor(GPropertyItemTextColor0)
00110     , m_AlwaysShowOpeningButton(false)
00111     , m_bIsMouseInside(false)
00112     , m_bIsFirstVisibleItem(false)
00113     , m_bIsLastVisibleItem(false)
00114   {
00115     _row_header_area = new InputArea (NUX_TRACKER_LOCATION);
00116     _row_header_area->Reference();
00117   }
00118 
00119   TableItem::~TableItem()
00120   {
00121     _row_header_area->UnReference();
00122   }
00123 
00124   void TableItem::PushChildFront ( NodeItem *child )
00125   {
00126     NodeItem::PushChildFront (child);
00127   }
00128 
00129   void TableItem::PushChildBack ( NodeItem *child )
00130   {
00131     NodeItem::PushChildBack (child);
00132   }
00133 
00134   void TableItem::AddNextSibling ( NodeItem *sibling )
00135   {
00136     NodeItem::AddNextSibling (sibling);
00137   }
00138 
00139   void TableItem::AddPrevSibling ( NodeItem *sibling )
00140   {
00141     NodeItem::AddPrevSibling (sibling);
00142   }
00143 
00144   void TableItem::Unlink ( void )
00145   {
00146     TableItem *root = (TableItem *) RootNode();
00147     NodeItem::Unlink();
00148 
00149     if (root->m_Table)
00150       root->m_Table->ResetTable();
00151   }
00152 
00153   long TableItem::ProcessPropertyEvent (IEvent &ievent, long TraverseInfo, long ProcessEventInfo)
00154   {
00155     //m_bIsMouseInside = false;
00156     long ret = TraverseInfo;
00157     Geometry geo = m_ItemGeometryVector[0];
00158 
00159     if (ievent.e_event == NUX_MOUSE_PRESSED && ! (ret & eMouseEventSolved) && ! (ProcessEventInfo & eDoNotProcess) )
00160     {
00161       for (t_u32 i = 0; i < m_ItemGeometryVector.size(); i++)
00162       {
00163         if (m_ItemGeometryVector[i].IsPointInside (ievent.GetX() - ievent.GetRootX(), ievent.GetY() - ievent.GetRootY() ) )
00164         {
00165           sigCellFocus.emit();
00166           ret |= 0; // if we don't return 0, then we can't have doubleclick on this item. //eMouseEventSolved;
00167           break;
00168         }
00169       }
00170     }
00171     else
00172     {
00173       for (t_u32 i = 0; i < m_ItemGeometryVector.size(); i++)
00174       {
00175         if (m_ItemGeometryVector[i].IsPointInside (ievent.GetX() - ievent.GetRootX(), ievent.GetY() - ievent.GetRootY() ) )
00176         {
00177           if (! (ret & eMouseEventSolved) && ! (ProcessEventInfo & eDoNotProcess) )
00178           {
00179             if (m_bIsMouseInside == false)
00180             {
00181               setDirtyItem (true);
00182 
00183               WindowThread *application = GetWindowThread ();
00184 
00185               if (application)
00186                 application->RequestRedraw();
00187 
00188               //nuxDebugMsg(TEXT("Dirty In: %s"), GetName());
00189             }
00190 
00191             m_bIsMouseInside = true;
00192 
00193             ret |=  eMouseEventSolved;
00194           }
00195         }
00196         else
00197         {
00198           if (m_bIsMouseInside)
00199           {
00200             setDirtyItem (true);
00201 
00202             WindowThread *application = GetWindowThread ();
00203 
00204             if (application)
00205               application->RequestRedraw();
00206 
00207             //nuxDebugMsg(TEXT("Dirty Out: %s"), GetName());
00208           }
00209 
00210           m_bIsMouseInside = false;
00211         }
00212       }
00213     }
00214 
00215     // We don't trap the mouse down here. We let the TableCtrl capture it.
00216     // The TableCtrl does the following:
00217     //  - Set the dirty flags of the previously selected TableItem if any.
00218     //  - Find the newly selected TableItem and set its dirty flag to true.
00219 
00220 
00221 //    if(geo.IsPointInside(ievent.GetX()-ievent.GetRootX(), ievent.GetY()-ievent.GetRootY()))
00222 //    {
00223 //        if(m_bIsMouseInside != true)
00224 //        {
00225 //            setDirtyItem(true);
00226 //            m_bIsMouseInside = true;
00227 //            TraverseInfo = eMouseEventSolved;
00228 //        }
00229 //        //        else
00230 //        //        {
00231 //        //            setDirtyItem(true);
00232 //        //            m_bIsMouseInside = false;
00233 //        //        }
00234 //    }
00235 //    else
00236 //    {
00237 //        if(m_bIsMouseInside != false)
00238 //        {
00239 //            setDirtyItem(true);
00240 //            m_bIsMouseInside = false;
00241 //        }
00242 //    }
00243     return ret;
00244   }
00245 
00246   void TableItem::DrawProperty (GraphicsEngine &GfxContext, TableCtrl *table, bool force_draw, Geometry geo, const BasePainter &Painter,
00247                                 RowHeader *row, const std::vector<ColumnHeader>& column_vector, Color ItemBackgroundColor)
00248   {
00249     Geometry FirstColumnGeometry = m_ItemGeometryVector[0];
00250 
00251     if (isDirtyItem() )
00252     {
00253       t_u32 nBackground;
00254 
00255       if (m_bIsMouseInside)
00256       {
00257         nBackground = table->PushItemBackground (GfxContext, this, true);
00258         //nuxDebugMsg(TEXT("DrawDirty"));
00259       }
00260       else
00261       {
00262         nBackground = table->PushItemBackground (GfxContext, this, false);
00263       }
00264 
00265       Painter.PaintTextLineStatic(GfxContext, GetSysFont(), geo, row->_table_item->GetName(), Color (0xFF000000));
00266       table->PopItemBackground(GfxContext, nBackground);
00267       setDirtyItem(false);
00268     }
00269   }
00270 
00271   int TableItem::GetItemBestHeight()
00272   {
00273     return COLUMNHEADERHEIGHT;
00274   }
00275 
00276   void TableItem::SetPropertyItemWidth()
00277   {
00278 
00279   }
00280 
00281 }
 All Classes Namespaces Functions Variables Typedefs Enumerations Enumerator Friends