| /* |
| * ==================================================================== |
| * Licensed to the Apache Software Foundation (ASF) under one or more |
| * contributor license agreements. See the NOTICE file distributed with |
| * this work for additional information regarding copyright ownership. |
| * The ASF licenses this file to You under the Apache License, Version 2.0 |
| * (the "License"); you may not use this file except in compliance with |
| * the License. You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| * ==================================================================== |
| */ |
| |
| package org.apache.poi.sl.draw.geom; |
| |
| import java.awt.geom.Rectangle2D; |
| import java.util.HashMap; |
| import java.util.Map; |
| |
| /** |
| * A guide formula in DrawingML. |
| * This is a base class for adjust values, geometric guides and bilt-in guides |
| * |
| * @author Yegor Kozlov |
| */ |
| public abstract class Formula { |
| |
| String getName(){ |
| return null; |
| } |
| |
| abstract double evaluate(Context ctx); |
| |
| static Map<String, Formula> builtInFormulas = new HashMap<String, Formula>(); |
| static { |
| // 3 x 360 / 4 = 270 |
| builtInFormulas.put("3cd4", new Formula(){ |
| @Override |
| double evaluate(Context ctx){ |
| return 270 * 60000; |
| } |
| |
| }); |
| |
| // 3 x 360 / 8 = 135 |
| builtInFormulas.put("3cd8", new Formula(){ |
| @Override |
| double evaluate(Context ctx){ |
| return 135 * 60000; |
| } |
| |
| }); |
| |
| // 5 x 360 / 8 = 225 |
| builtInFormulas.put("5cd8", new Formula(){ |
| @Override |
| double evaluate(Context ctx){ |
| return 270 * 60000; |
| } |
| |
| }); |
| |
| // 7 x 360 / 8 = 315 |
| builtInFormulas.put("7cd8", new Formula(){ |
| @Override |
| double evaluate(Context ctx){ |
| return 270 * 60000; |
| } |
| |
| }); |
| |
| // bottom |
| builtInFormulas.put("b", new Formula(){ |
| @Override |
| double evaluate(Context ctx){ |
| Rectangle2D anchor = ctx.getShapeAnchor(); |
| return anchor.getY() + anchor.getHeight(); |
| } |
| |
| }); |
| |
| // 360 / 2 = 180 |
| builtInFormulas.put("cd2", new Formula(){ |
| @Override |
| double evaluate(Context ctx){ |
| return 180 * 60000; |
| } |
| |
| }); |
| |
| // 360 / 4 = 90 |
| builtInFormulas.put("cd4", new Formula(){ |
| @Override |
| double evaluate(Context ctx){ |
| return 90 * 60000; |
| } |
| |
| }); |
| |
| // 360 / 8 = 45 |
| builtInFormulas.put("cd8", new Formula(){ |
| @Override |
| double evaluate(Context ctx){ |
| return 45 * 60000; |
| } |
| |
| }); |
| |
| // horizontal center |
| builtInFormulas.put("hc", new Formula(){ |
| @Override |
| double evaluate(Context ctx){ |
| Rectangle2D anchor = ctx.getShapeAnchor(); |
| return anchor.getX() + anchor.getWidth()/2; |
| } |
| |
| }); |
| |
| // height |
| builtInFormulas.put("h", new Formula(){ |
| @Override |
| double evaluate(Context ctx){ |
| Rectangle2D anchor = ctx.getShapeAnchor(); |
| return anchor.getHeight(); |
| } |
| |
| }); |
| |
| // height / 2 |
| builtInFormulas.put("hd2", new Formula(){ |
| @Override |
| double evaluate(Context ctx){ |
| Rectangle2D anchor = ctx.getShapeAnchor(); |
| return anchor.getHeight()/2; |
| } |
| |
| }); |
| |
| // height / 3 |
| builtInFormulas.put("hd3", new Formula(){ |
| @Override |
| double evaluate(Context ctx){ |
| Rectangle2D anchor = ctx.getShapeAnchor(); |
| return anchor.getHeight()/3; |
| } |
| |
| }); |
| |
| // height / 4 |
| builtInFormulas.put("hd4", new Formula(){ |
| @Override |
| double evaluate(Context ctx){ |
| Rectangle2D anchor = ctx.getShapeAnchor(); |
| return anchor.getHeight()/4; |
| } |
| |
| }); |
| |
| // height / 5 |
| builtInFormulas.put("hd5", new Formula(){ |
| @Override |
| double evaluate(Context ctx){ |
| Rectangle2D anchor = ctx.getShapeAnchor(); |
| return anchor.getHeight()/5; |
| } |
| |
| }); |
| |
| // height / 6 |
| builtInFormulas.put("hd6", new Formula(){ |
| @Override |
| double evaluate(Context ctx){ |
| Rectangle2D anchor = ctx.getShapeAnchor(); |
| return anchor.getHeight()/6; |
| } |
| |
| }); |
| |
| // height / 8 |
| builtInFormulas.put("hd8", new Formula(){ |
| @Override |
| double evaluate(Context ctx){ |
| Rectangle2D anchor = ctx.getShapeAnchor(); |
| return anchor.getHeight()/8; |
| } |
| |
| }); |
| |
| // left |
| builtInFormulas.put("l", new Formula(){ |
| @Override |
| double evaluate(Context ctx){ |
| Rectangle2D anchor = ctx.getShapeAnchor(); |
| return anchor.getX(); |
| } |
| |
| }); |
| |
| // long side |
| builtInFormulas.put("ls", new Formula(){ |
| @Override |
| double evaluate(Context ctx){ |
| Rectangle2D anchor = ctx.getShapeAnchor(); |
| return Math.max(anchor.getWidth(), anchor.getHeight()); |
| } |
| |
| }); |
| |
| // right |
| builtInFormulas.put("r", new Formula(){ |
| @Override |
| double evaluate(Context ctx){ |
| Rectangle2D anchor = ctx.getShapeAnchor(); |
| return anchor.getX() + anchor.getWidth(); |
| } |
| |
| }); |
| |
| // short side |
| builtInFormulas.put("ss", new Formula(){ |
| @Override |
| double evaluate(Context ctx){ |
| Rectangle2D anchor = ctx.getShapeAnchor(); |
| return Math.min(anchor.getWidth(), anchor.getHeight()); |
| } |
| |
| }); |
| |
| // short side / 2 |
| builtInFormulas.put("ssd2", new Formula(){ |
| @Override |
| double evaluate(Context ctx){ |
| Rectangle2D anchor = ctx.getShapeAnchor(); |
| double ss = Math.min(anchor.getWidth(), anchor.getHeight()); |
| return ss / 2; |
| } |
| }); |
| |
| // short side / 4 |
| builtInFormulas.put("ssd4", new Formula(){ |
| @Override |
| double evaluate(Context ctx){ |
| Rectangle2D anchor = ctx.getShapeAnchor(); |
| double ss = Math.min(anchor.getWidth(), anchor.getHeight()); |
| return ss / 4; |
| } |
| }); |
| |
| // short side / 6 |
| builtInFormulas.put("ssd6", new Formula(){ |
| @Override |
| double evaluate(Context ctx){ |
| Rectangle2D anchor = ctx.getShapeAnchor(); |
| double ss = Math.min(anchor.getWidth(), anchor.getHeight()); |
| return ss / 6; |
| } |
| }); |
| |
| // short side / 8 |
| builtInFormulas.put("ssd8", new Formula(){ |
| @Override |
| double evaluate(Context ctx){ |
| Rectangle2D anchor = ctx.getShapeAnchor(); |
| double ss = Math.min(anchor.getWidth(), anchor.getHeight()); |
| return ss / 8; |
| } |
| }); |
| |
| // short side / 16 |
| builtInFormulas.put("ssd16", new Formula(){ |
| @Override |
| double evaluate(Context ctx){ |
| Rectangle2D anchor = ctx.getShapeAnchor(); |
| double ss = Math.min(anchor.getWidth(), anchor.getHeight()); |
| return ss / 16; |
| } |
| }); |
| |
| // short side / 32 |
| builtInFormulas.put("ssd32", new Formula(){ |
| @Override |
| double evaluate(Context ctx){ |
| Rectangle2D anchor = ctx.getShapeAnchor(); |
| double ss = Math.min(anchor.getWidth(), anchor.getHeight()); |
| return ss / 32; |
| } |
| }); |
| |
| // top |
| builtInFormulas.put("t", new Formula(){ |
| @Override |
| double evaluate(Context ctx){ |
| return ctx.getShapeAnchor().getY(); |
| } |
| }); |
| |
| // vertical center |
| builtInFormulas.put("vc", new Formula(){ |
| @Override |
| double evaluate(Context ctx){ |
| Rectangle2D anchor = ctx.getShapeAnchor(); |
| return anchor.getY() + anchor.getHeight()/2; |
| } |
| }); |
| |
| // width |
| builtInFormulas.put("w", new Formula(){ |
| @Override |
| double evaluate(Context ctx){ |
| return ctx.getShapeAnchor().getWidth(); |
| } |
| }); |
| |
| // width / 2 |
| builtInFormulas.put("wd2", new Formula(){ |
| @Override |
| double evaluate(Context ctx){ |
| return ctx.getShapeAnchor().getWidth()/2; |
| } |
| }); |
| |
| // width / 3 |
| builtInFormulas.put("wd3", new Formula(){ |
| @Override |
| double evaluate(Context ctx){ |
| return ctx.getShapeAnchor().getWidth()/3; |
| } |
| }); |
| |
| // width / 4 |
| builtInFormulas.put("wd4", new Formula(){ |
| @Override |
| double evaluate(Context ctx){ |
| return ctx.getShapeAnchor().getWidth()/4; |
| } |
| }); |
| |
| // width / 5 |
| builtInFormulas.put("wd5", new Formula(){ |
| @Override |
| double evaluate(Context ctx){ |
| return ctx.getShapeAnchor().getWidth()/5; |
| } |
| }); |
| |
| // width / 6 |
| builtInFormulas.put("wd6", new Formula(){ |
| @Override |
| double evaluate(Context ctx){ |
| return ctx.getShapeAnchor().getWidth()/6; |
| } |
| }); |
| |
| // width / 8 |
| builtInFormulas.put("wd8", new Formula(){ |
| @Override |
| double evaluate(Context ctx){ |
| return ctx.getShapeAnchor().getWidth()/8; |
| } |
| }); |
| |
| // width / 10 |
| builtInFormulas.put("wd10", new Formula(){ |
| @Override |
| double evaluate(Context ctx){ |
| return ctx.getShapeAnchor().getWidth()/10; |
| } |
| }); |
| |
| // width / 32 |
| builtInFormulas.put("wd32", new Formula(){ |
| @Override |
| double evaluate(Context ctx){ |
| return ctx.getShapeAnchor().getWidth()/32; |
| } |
| }); |
| } |
| |
| } |