ElementDataGrid.h

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