1 /*
2  * This source file is part of libRocket, the HTML/CSS Interface Middleware
3  *
4  * For the latest information, see http://www.librocket.com
5  *
6  * Copyright (c) 2008-2010 CodePoint Ltd, Shift Technology Ltd
7  *
8  * Permission is hereby granted, free of charge, to any person obtaining a copy
9  * of this software and associated documentation files (the "Software"), to deal
10  * in the Software without restriction, including without limitation the rights
11  * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
12  * copies of the Software, and to permit persons to whom the Software is
13  * furnished to do so, subject to the following conditions:
14  *
15  * The above copyright notice and this permission notice shall be included in
16  * all copies or substantial portions of the Software.
17  *
18  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
19  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
20  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
21  * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
22  * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
23  * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
24  * THE SOFTWARE.
25  *
26  */
27 
28 #ifndef ROCKETCOREBOX_H
29 #define ROCKETCOREBOX_H
30 
31 #include "Types.h"
32 
33 namespace Rocket {
34 namespace Core {
35 
36 /**
37 	Stores a box with four sized areas; content, padding, a border and margin. See
38 	http://www.w3.org/TR/REC-CSS2/box.html#box-dimensions for a diagram.
39 
40 	@author Peter Curry
41  */
42 
43 class ROCKETCORE_API Box
44 {
45 public:
46 	enum Area
47 	{
48 		MARGIN = 0,
49 		BORDER = 1,
50 		PADDING = 2,
51 		CONTENT = 3,
52 		NUM_AREAS = 3,		// ignores CONTENT
53 	};
54 
55 	enum Edge
56 	{
57 		TOP = 0,
58 		RIGHT = 1,
59 		BOTTOM = 2,
60 		LEFT = 3,
61 		NUM_EDGES = 4
62 	};
63 
64 	/// Initialises a zero-sized box.
65 	Box();
66 	/// Initialises a box with a default content area and no padding, borders and margins.
67 	Box(const Vector2f& content);
68 	~Box();
69 
70 	/// Returns the offset of this box. This will usually be (0, 0).
71 	/// @return The box's offset.
72 	const Vector2f& GetOffset() const;
73 	/// Returns the top-left position of one of the box's areas, relative to the top-left of the border area. This
74 	/// means the position of the margin area is likely to be negative.
75 	/// @param area[in] The desired area.
76 	/// @return The position of the area.
77 	Vector2f GetPosition(Area area = Box::CONTENT) const;
78 	/// Returns the size of one of the box's areas. This will include all inner areas.
79 	/// @param area[in] The desired area.
80 	/// @return The size of the requested area.
81 	Vector2f GetSize(Area area = Box::CONTENT) const;
82 
83 	/// Sets the offset of the box, relative usually to the owning element. This should only be set for auxiliary
84 	/// boxes of an element.
85 	/// @param offset[in] The offset of the box from the primary box.
86 	void SetOffset(const Vector2f& offset);
87 	/// Sets the size of the content area.
88 	/// @param content[in] The size of the new content area.
89 	void SetContent(const Vector2f& content);
90 	/// Sets the size of one of the edges of one of the box's outer areas.
91 	/// @param area[in] The area to change.
92 	/// @param edge[in] The area edge to change.
93 	/// @param size[in] The new size of the area segment.
94 	void SetEdge(Area area, Edge edge, float size);
95 
96 	/// Returns the size of one of the area edges.
97 	/// @param area[in] The desired area.
98 	/// @param edge[in] The desired edge.
99 	/// @return The size of the requested area edge.
100 	float GetEdge(Area area, Edge edge) const;
101 	/// Returns the cumulative size of one edge up to one of the box's areas.
102 	/// @param area[in] The area to measure up to (and including). So, MARGIN will return the width of the margin, and PADDING will be the sum of the margin, border and padding.
103 	/// @param edge[in] The desired edge.
104 	/// @return The cumulative size of the edge.
105 	float GetCumulativeEdge(Area area, Edge edge) const;
106 
107 	/// Compares the size of the content area and the other area edges.
108 	/// @return True if the boxes represent the same area.
109 	bool operator==(const Box& rhs) const;
110 	/// Compares the size of the content area and the other area edges.
111 	/// @return True if the boxes do not represent the same area.
112 	bool operator!=(const Box& rhs) const;
113 
114 private:
115 	Vector2f content;
116 	float area_edges[NUM_AREAS][NUM_EDGES];
117 
118 	Vector2f offset;
119 };
120 
121 }
122 }
123 
124 #endif
125