]> gerrit.simantics Code Review - simantics/platform.git/blob - bundles/org.simantics.utils/src/org/simantics/utils/page/MarginUtils.java
Migrated source code from Simantics SVN
[simantics/platform.git] / bundles / org.simantics.utils / src / org / simantics / utils / page / MarginUtils.java
1 /*******************************************************************************\r
2  * Copyright (c) 2007, 2010 Association for Decentralized Information Management\r
3  * in Industry THTH ry.\r
4  * All rights reserved. This program and the accompanying materials\r
5  * are made available under the terms of the Eclipse Public License v1.0\r
6  * which accompanies this distribution, and is available at\r
7  * http://www.eclipse.org/legal/epl-v10.html\r
8  *\r
9  * Contributors:\r
10  *     VTT Technical Research Centre of Finland - initial API and implementation\r
11  *******************************************************************************/\r
12 package org.simantics.utils.page;\r
13 \r
14 \r
15 /**\r
16  * \r
17  * @See {@link RulerPainter} RulerPainter.RULER_MARGIN5\r
18  * @author Toni Kalajainen\r
19  */\r
20 public class MarginUtils {\r
21 \r
22     public static Margin marginOf(double controlRelative, double controlAbsolute, double diagramAbsolute) {\r
23         return new Margin(controlRelative/100, controlAbsolute, diagramAbsolute);\r
24     }\r
25 \r
26     /** No margin */\r
27     public static final Margin NO_MARGIN = marginOf(0, 0, 0);\r
28     /** 5% margin */\r
29     public static final Margin MARGIN5 = marginOf(5, 0, 0);\r
30     /** 2% margin */\r
31     public static final Margin MARGIN2 = marginOf(2, 0, 0);\r
32     /** 10mm margin */\r
33     public static final Margin MARGIN_10mm = marginOf(0, 0, 10);\r
34 \r
35     \r
36     /** No margins */\r
37     public static final Margins NO_MARGINS = new Margins(NO_MARGIN, NO_MARGIN, NO_MARGIN, NO_MARGIN);\r
38     /** 5% margin */\r
39     public static final Margins MARGINS5 = new Margins(MARGIN5, MARGIN5, MARGIN5, MARGIN5);\r
40     /** 2% margin */\r
41     public static final Margins MARGINS2 = new Margins(MARGIN2, MARGIN2, MARGIN2, MARGIN2);\r
42     /** 10mm margin */\r
43     public static final Margins MARGINS_10mm = new Margins(MARGIN_10mm, MARGIN_10mm, MARGIN_10mm, MARGIN_10mm);\r
44 \r
45     /**\r
46      * A margin.\r
47      */\r
48     public static class Margin {\r
49         /** Relative margins 0..100 (in control coordinates) */\r
50         public final double controlRelative;\r
51         /** Margins in absolute values of control units */\r
52         public final double controlAbsolute;\r
53         /** Margins in absolute values of diaram units*/\r
54         public final double diagramAbsolute;\r
55 \r
56         public Margin(double controlRelative, double controlAbsolute, double diagramAbsolute) {\r
57             this.controlRelative = controlRelative;\r
58             this.controlAbsolute = controlAbsolute;\r
59             this.diagramAbsolute = diagramAbsolute;\r
60         }\r
61 \r
62         @Override\r
63         public String toString() {\r
64             return "(" + controlRelative + " " + controlAbsolute + " " + diagramAbsolute + ")";\r
65         }\r
66 \r
67         public boolean isZero() {\r
68             return Math.abs(controlRelative) < Double.MIN_VALUE\r
69             && Math.abs(controlAbsolute) < Double.MIN_VALUE\r
70             && Math.abs(diagramAbsolute) < Double.MIN_VALUE;\r
71         }\r
72 \r
73         @Override\r
74         public int hashCode() {\r
75             final int prime = 31;\r
76             int result = 1;\r
77             long temp;\r
78             temp = Double.doubleToLongBits(controlAbsolute);\r
79             result = prime * result + (int) (temp ^ (temp >>> 32));\r
80             temp = Double.doubleToLongBits(controlRelative);\r
81             result = prime * result + (int) (temp ^ (temp >>> 32));\r
82             temp = Double.doubleToLongBits(diagramAbsolute);\r
83             result = prime * result + (int) (temp ^ (temp >>> 32));\r
84             return result;\r
85         }\r
86 \r
87         @Override\r
88         public boolean equals(Object obj) {\r
89             if (this == obj)\r
90                 return true;\r
91             if (obj == null)\r
92                 return false;\r
93             if (getClass() != obj.getClass())\r
94                 return false;\r
95             Margin other = (Margin) obj;\r
96             if (Double.doubleToLongBits(controlAbsolute) != Double.doubleToLongBits(other.controlAbsolute))\r
97                 return false;\r
98             if (Double.doubleToLongBits(controlRelative) != Double.doubleToLongBits(other.controlRelative))\r
99                 return false;\r
100             if (Double.doubleToLongBits(diagramAbsolute) != Double.doubleToLongBits(other.diagramAbsolute))\r
101                 return false;\r
102             return true;\r
103         }\r
104     }\r
105 \r
106     /**\r
107      * 4 margins: top, bottom, left, right\r
108      */\r
109     public static class Margins {\r
110 \r
111         public static final int TOP    = 1 << 0;\r
112         public static final int BOTTOM = 1 << 1;\r
113         public static final int LEFT   = 1 << 2;\r
114         public static final int RIGHT  = 1 << 3;\r
115 \r
116         public final Margin top;\r
117         public final Margin bottom;\r
118         public final Margin left;\r
119         public final Margin right;\r
120 \r
121         public Margins(Margin top, Margin bottom, Margin left, Margin right) {\r
122             assert top != null;\r
123             assert bottom != null;\r
124             assert left != null;\r
125             assert right != null;\r
126 \r
127             this.top = top;\r
128             this.bottom = bottom;\r
129             this.left = left;\r
130             this.right = right;\r
131         }\r
132 \r
133         /**\r
134          * @param a bitmask consisting of the values {@link #TOP},\r
135          *        {@link #BOTTOM}, {@link #LEFT} and {@link #RIGHT}\r
136          * @param top\r
137          * @return\r
138          */\r
139         public Margins withSide(int side, Margin m) {\r
140             Margin t = ((side & TOP) != 0) ? m : top;\r
141             Margin b = ((side & BOTTOM) != 0) ? m : bottom;\r
142             Margin l = ((side & LEFT) != 0) ? m : left;\r
143             Margin r = ((side & RIGHT) != 0) ? m : right;\r
144             return new Margins(t, b, l, r);\r
145         }\r
146 \r
147         public boolean isZero() {\r
148             return top.isZero() && bottom.isZero() && left.isZero() && right.isZero();\r
149         }\r
150 \r
151         @Override\r
152         public String toString() {\r
153             return "[top=" + top + ", bottom=" + bottom + ", left=" + left + ", right=" + right + "]";\r
154         }\r
155 \r
156         @Override\r
157         public int hashCode() {\r
158             final int prime = 31;\r
159             int result = 1;\r
160             result = prime * result + bottom.hashCode();\r
161             result = prime * result + left.hashCode();\r
162             result = prime * result + right.hashCode();\r
163             result = prime * result + top.hashCode();\r
164             return result;\r
165         }\r
166 \r
167         @Override\r
168         public boolean equals(Object obj) {\r
169             if (this == obj)\r
170                 return true;\r
171             if (obj == null)\r
172                 return false;\r
173             if (getClass() != obj.getClass())\r
174                 return false;\r
175             Margins other = (Margins) obj;\r
176             if (!top.equals(other.top))\r
177                 return false;\r
178             if (!bottom.equals(other.bottom))\r
179                 return false;\r
180             if (!left.equals(other.left))\r
181                 return false;\r
182             if (!right.equals(other.right))\r
183                 return false;\r
184             return true;\r
185         }\r
186     }\r
187 \r
188 }\r