/** * OrbisGIS is a java GIS application dedicated to research in GIScience. * OrbisGIS is developed by the GIS group of the DECIDE team of the * Lab-STICC CNRS laboratory, see <http://www.lab-sticc.fr/>. * * The GIS group of the DECIDE team is located at : * * Laboratoire Lab-STICC – CNRS UMR 6285 * Equipe DECIDE * UNIVERSITÉ DE BRETAGNE-SUD * Institut Universitaire de Technologie de Vannes * 8, Rue Montaigne - BP 561 56017 Vannes Cedex * * OrbisGIS is distributed under GPL 3 license. * * Copyright (C) 2007-2014 CNRS (IRSTV FR CNRS 2488) * Copyright (C) 2015-2017 CNRS (Lab-STICC UMR CNRS 6285) * * This file is part of OrbisGIS. * * OrbisGIS is free software: you can redistribute it and/or modify it under the * terms of the GNU General Public License as published by the Free Software * Foundation, either version 3 of the License, or (at your option) any later * version. * * OrbisGIS is distributed in the hope that it will be useful, but WITHOUT ANY * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR * A PARTICULAR PURPOSE. See the GNU General Public License for more details. * * You should have received a copy of the GNU General Public License along with * OrbisGIS. If not, see <http://www.gnu.org/licenses/>. * * For more information, please consult: <http://www.orbisgis.org/> * or contact directly: * info_at_ orbisgis.org */ package org.orbisgis.coremap.renderer.se.stroke; import java.awt.Graphics2D; import java.awt.Shape; import java.awt.geom.Rectangle2D; import java.io.IOException; import java.util.ArrayList; import java.util.List; import java.util.Map; import javax.xml.bind.JAXBElement; import net.opengis.se._2_0.core.ObjectFactory; import net.opengis.se._2_0.core.TextStrokeType; import org.orbisgis.coremap.map.MapTransform; import org.orbisgis.coremap.renderer.se.SeExceptions.InvalidStyle; import org.orbisgis.coremap.renderer.se.SymbolizerNode; import org.orbisgis.coremap.renderer.se.label.LineLabel; import org.orbisgis.coremap.renderer.se.parameter.ParameterException; /** * {@code TexteStroke} is used to render text labels along a line. It is useful * to add informations to the {@code CompoundStroke} elements. * It is dependant on a {@link LineLabel}, to store the text to render, and the styling * details used for the rendering. * @author Maxence Laurent, Alexis Guéganno */ public final class TextStroke extends Stroke { private LineLabel lineLabel; /** * Builds a new {@code TexteStroke} with an inner default {@link LineLabel}. */ public TextStroke() { setLineLabel(new LineLabel()); } /** * Build a new {@code TexteStroke} using the given JAXB {@code TextStrokeType}. * @param tst * @throws org.orbisgis.coremap.renderer.se.SeExceptions.InvalidStyle */ TextStroke(TextStrokeType tst) throws InvalidStyle { super(tst); if (tst.getLineLabel() != null) { setLineLabel(new LineLabel(tst.getLineLabel())); } } /** * Build a new {@code TexteStroke} using the given {@code JABElement}. * @param s * @throws org.orbisgis.coremap.renderer.se.SeExceptions.InvalidStyle */ TextStroke(JAXBElement<TextStrokeType> s) throws InvalidStyle { this(s.getValue()); } /** * Get the {@link LineLabel} associated to this {@code TextStroke}. * @return * A {@link LineLabel} that contains all the informations needed to * render the text. */ public LineLabel getLineLabel() { return lineLabel; } /** * Set the {@link LineLabel} associated to this {@code TextStroke}. * @param lineLabel */ public void setLineLabel(LineLabel lineLabel) { this.lineLabel = lineLabel; if (lineLabel != null) { lineLabel.setParent(this); } } @Override public void draw(Graphics2D g2, Map<String,Object> map, Shape shp, boolean selected, MapTransform mt, double offset) throws ParameterException, IOException { if (this.lineLabel != null) { lineLabel.draw(g2, map, shp, selected, mt); } } @Override public JAXBElement<TextStrokeType> getJAXBElement() { ObjectFactory of = new ObjectFactory(); return of.createTextStroke(this.getJAXBType()); } /** * Build a new {@link TextStrokeType} representing this {@code TextStroke}. * @return */ public TextStrokeType getJAXBType() { TextStrokeType s = new TextStrokeType(); this.setJAXBProperties(s); if (lineLabel != null) { s.setLineLabel(lineLabel.getJAXBType()); } return s; } @Override public List<SymbolizerNode> getChildren() { List<SymbolizerNode> ls = new ArrayList<SymbolizerNode>(); if (lineLabel != null) { ls.add(lineLabel); } return ls; } @Override public Double getNaturalLength(Map<String,Object> map, Shape shp, MapTransform mt) throws ParameterException, IOException { Rectangle2D bounds = lineLabel.getLabel().getBounds(null, map, mt); return bounds.getWidth(); } }