00001 /* 00002 * This source file is part of libRocket, the HTML/CSS Interface Middleware 00003 * 00004 * For the latest information, see http://www.librocket.com 00005 * 00006 * Copyright (c) 2008-2010 CodePoint Ltd, Shift Technology Ltd 00007 * 00008 * Permission is hereby granted, free of charge, to any person obtaining a copy 00009 * of this software and associated documentation files (the "Software"), to deal 00010 * in the Software without restriction, including without limitation the rights 00011 * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 00012 * copies of the Software, and to permit persons to whom the Software is 00013 * furnished to do so, subject to the following conditions: 00014 * 00015 * The above copyright notice and this permission notice shall be included in 00016 * all copies or substantial portions of the Software. 00017 * 00018 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 00019 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 00020 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 00021 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 00022 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 00023 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN 00024 * THE SOFTWARE. 00025 * 00026 */ 00027 00028 #ifndef ROCKETCONTROLSELEMENTDATAGRID_H 00029 #define ROCKETCONTROLSELEMENTDATAGRID_H 00030 00031 #include <Rocket/Controls/Header.h> 00032 #include <Rocket/Controls/DataSourceListener.h> 00033 #include <Rocket/Core/Element.h> 00034 00035 namespace Rocket { 00036 namespace Controls { 00037 00038 class DataFormatter; 00039 class ElementDataGridRow; 00040 00047 class ROCKETCONTROLS_API ElementDataGrid : public Core::Element, public DataSourceListener 00048 { 00049 public: 00050 ElementDataGrid(const Rocket::Core::String& tag); 00051 virtual ~ElementDataGrid(); 00052 00055 void SetDataSource(const Rocket::Core::String& data_source_name); 00056 00062 struct Column 00063 { 00066 Rocket::Core::StringList fields; 00067 00070 DataFormatter* formatter; 00073 Core::Element* header; 00074 00076 float current_width; 00077 00081 bool refresh_on_child_change; 00082 }; 00083 00090 bool AddColumn(const Rocket::Core::String& fields, const Rocket::Core::String& formatter, float initial_width, const Rocket::Core::String& header_rml); 00096 void AddColumn(const Rocket::Core::String& fields, const Rocket::Core::String& formatter, float initial_width, Core::Element* header_element); 00098 int GetNumColumns(); 00100 const Column* GetColumn(int column_index); 00102 const Rocket::Core::String& GetAllColumnFields(); 00103 00108 ElementDataGridRow* AddRow(ElementDataGridRow* parent, int index); 00112 void RemoveRows(int index, int num_rows = 1); 00113 00115 int GetNumRows() const; 00118 ElementDataGridRow* GetRow(int index) const; 00119 00120 protected: 00121 virtual void OnUpdate(); 00122 00123 virtual void ProcessEvent(Core::Event& event); 00124 00127 virtual void GetInnerRML(Rocket::Core::String& content) const; 00128 00129 private: 00130 typedef std::vector< Column > ColumnList; 00131 typedef std::vector< ElementDataGridRow* > RowList; 00132 00133 ColumnList columns; 00134 Rocket::Core::String column_fields; 00135 00136 // The row that contains the header elements of the table. 00137 ElementDataGridRow* header; 00138 00139 // The root row, all the top level rows are children under this. Not 00140 // actually rendered, has "display: none". 00141 ElementDataGridRow* root; 00142 // If this is non-empty, then in the previous update the data source was set 00143 // and we must set it this update. 00144 Rocket::Core::String new_data_source; 00145 00146 // The block element that contains all our rows. Only used for applying styles. 00147 Core::Element* body; 00148 // Stores if the body has already been made visible by having enough rows added. 00149 bool body_visible; 00150 }; 00151 00152 } 00153 } 00154 00155 #endif