nux-1.14.0
|
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 }