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
10 * VTT Technical Research Centre of Finland - initial API and implementation
\r
11 *******************************************************************************/
\r
12 package org.simantics.utils.page;
\r
17 * @See {@link RulerPainter} RulerPainter.RULER_MARGIN5
\r
18 * @author Toni Kalajainen
\r
20 public class MarginUtils {
\r
22 public static Margin marginOf(double controlRelative, double controlAbsolute, double diagramAbsolute) {
\r
23 return new Margin(controlRelative/100, controlAbsolute, diagramAbsolute);
\r
27 public static final Margin NO_MARGIN = marginOf(0, 0, 0);
\r
29 public static final Margin MARGIN5 = marginOf(5, 0, 0);
\r
31 public static final Margin MARGIN2 = marginOf(2, 0, 0);
\r
33 public static final Margin MARGIN_10mm = marginOf(0, 0, 10);
\r
37 public static final Margins NO_MARGINS = new Margins(NO_MARGIN, NO_MARGIN, NO_MARGIN, NO_MARGIN);
\r
39 public static final Margins MARGINS5 = new Margins(MARGIN5, MARGIN5, MARGIN5, MARGIN5);
\r
41 public static final Margins MARGINS2 = new Margins(MARGIN2, MARGIN2, MARGIN2, MARGIN2);
\r
43 public static final Margins MARGINS_10mm = new Margins(MARGIN_10mm, MARGIN_10mm, MARGIN_10mm, MARGIN_10mm);
\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
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
63 public String toString() {
\r
64 return "(" + controlRelative + " " + controlAbsolute + " " + diagramAbsolute + ")";
\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
74 public int hashCode() {
\r
75 final int prime = 31;
\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
88 public boolean equals(Object obj) {
\r
93 if (getClass() != obj.getClass())
\r
95 Margin other = (Margin) obj;
\r
96 if (Double.doubleToLongBits(controlAbsolute) != Double.doubleToLongBits(other.controlAbsolute))
\r
98 if (Double.doubleToLongBits(controlRelative) != Double.doubleToLongBits(other.controlRelative))
\r
100 if (Double.doubleToLongBits(diagramAbsolute) != Double.doubleToLongBits(other.diagramAbsolute))
\r
107 * 4 margins: top, bottom, left, right
\r
109 public static class Margins {
\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
116 public final Margin top;
\r
117 public final Margin bottom;
\r
118 public final Margin left;
\r
119 public final Margin right;
\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
128 this.bottom = bottom;
\r
130 this.right = right;
\r
134 * @param a bitmask consisting of the values {@link #TOP},
\r
135 * {@link #BOTTOM}, {@link #LEFT} and {@link #RIGHT}
\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
147 public boolean isZero() {
\r
148 return top.isZero() && bottom.isZero() && left.isZero() && right.isZero();
\r
152 public String toString() {
\r
153 return "[top=" + top + ", bottom=" + bottom + ", left=" + left + ", right=" + right + "]";
\r
157 public int hashCode() {
\r
158 final int prime = 31;
\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
168 public boolean equals(Object obj) {
\r
173 if (getClass() != obj.getClass())
\r
175 Margins other = (Margins) obj;
\r
176 if (!top.equals(other.top))
\r
178 if (!bottom.equals(other.bottom))
\r
180 if (!left.equals(other.left))
\r
182 if (!right.equals(other.right))
\r