View Javadoc

1   /**********************************************
2    * Copyright (C) 2011 Lukas Laag
3    * This file is part of svgreal.
4    * 
5    * svgreal is free software: you can redistribute it and/or modify
6    * it under the terms of the GNU General Public License as published by
7    * the Free Software Foundation, either version 3 of the License, or
8    * (at your option) any later version.
9    * 
10   * svgreal is distributed in the hope that it will be useful,
11   * but WITHOUT ANY WARRANTY; without even the implied warranty of
12   * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
13   * GNU General Public License for more details.
14   * 
15   * You should have received a copy of the GNU General Public License
16   * along with svgreal.  If not, see http://www.gnu.org/licenses/
17   **********************************************/
18  package org.vectomatic.svg.edit.client.command.add;
19  
20  import org.vectomatic.dom.svg.OMSVGElement;
21  import org.vectomatic.dom.svg.OMSVGPoint;
22  import org.vectomatic.dom.svg.OMSVGRectElement;
23  import org.vectomatic.dom.svg.OMSVGTransform;
24  import org.vectomatic.dom.svg.impl.SVGElement;
25  import org.vectomatic.dom.svg.utils.SVGConstants;
26  import org.vectomatic.svg.edit.client.SvgrealApp;
27  import org.vectomatic.svg.edit.client.command.FactoryInstantiatorBase;
28  import org.vectomatic.svg.edit.client.command.IFactoryInstantiator;
29  import org.vectomatic.svg.edit.client.event.MouseDownProcessor;
30  import org.vectomatic.svg.edit.client.event.MouseMoveProcessor;
31  import org.vectomatic.svg.edit.client.event.MouseUpProcessor;
32  import org.vectomatic.svg.edit.client.model.ModelConstants;
33  
34  import com.google.gwt.core.client.GWT;
35  import com.google.gwt.event.dom.client.MouseDownEvent;
36  import com.google.gwt.event.dom.client.MouseMoveEvent;
37  import com.google.gwt.event.dom.client.MouseUpEvent;
38  
39  /**
40   * Command factory to add new rects to the SVG model.
41   * @author laaglu
42   */
43  public class AddRectCommandFactory extends AddCommandFactoryBase implements MouseDownProcessor, MouseMoveProcessor, MouseUpProcessor {
44  	@SuppressWarnings("serial")
45  	public static final IFactoryInstantiator<AddRectCommandFactory> INSTANTIATOR = new FactoryInstantiatorBase<AddRectCommandFactory>(ModelConstants.INSTANCE.addRectCmdFactory(), ModelConstants.INSTANCE.addRectCmdFactoryDesc()) {
46  		@Override
47  		public AddRectCommandFactory create() {
48  			return new AddRectCommandFactory();
49  		}
50  	};
51  	/**
52  	 * The new rect element
53  	 */
54  	protected OMSVGRectElement rect;
55  	/**
56  	 * The rect first point
57  	 */
58  	protected OMSVGPoint p1;
59  	/**
60  	 * The rect second point
61  	 */
62  	protected OMSVGPoint p2;
63  
64  	@Override
65  	public IFactoryInstantiator<?> getInstantiator() {
66  		return INSTANTIATOR;
67  	}
68  
69  	@Override
70  	public void start(Object requester) {
71  		GWT.log("AddRectCommandFactory.start(" + requester + ")");
72  		super.start(requester);
73  		updateStatus(ModelConstants.INSTANCE.addRectCmdFactory1());
74  	}
75  
76  	@Override
77  	public boolean processMouseDown(MouseDownEvent event) {
78  		if (owner != null && rect != null) {
79  			owner.getTwinGroup().removeChild(rect);
80  		}
81  		updateStatus(ModelConstants.INSTANCE.addRectCmdFactory2());
82  		owner = SvgrealApp.getApp().getActiveModel();
83  		OMSVGElement parent = owner.getTwinGroup();
84  		p1 = owner.getCoordinates(event, true);
85  		p2 = owner.getSvgElement().createSVGPoint(p1);
86  		rect = new OMSVGRectElement(p1.getX(), p1.getY(), 0, 0, 0, 0);
87  		OMSVGTransform xform = owner.getSvgElement().createSVGTransform();
88  		xform.setRotate(-owner.getRotation(), p1.getX(), p1.getY());
89  		rect.getTransform().getBaseVal().appendItem(xform);
90  		applyCssContextStyle((SVGElement) rect.getElement().cast());
91  		rect.getStyle().setSVGProperty(SVGConstants.CSS_VISIBILITY_PROPERTY, SVGConstants.CSS_VISIBLE_VALUE);
92  		parent.appendChild(rect);
93  		return true;
94  	}
95  	
96  	@Override
97  	public boolean processMouseUp(MouseUpEvent event) {
98  		if (owner != null) {
99  			updateStatus(ModelConstants.INSTANCE.addRectCmdFactory1());
100 			if (rect.getWidth().getBaseVal().getValue() == 0 || rect.getHeight().getBaseVal().getValue() == 0) {
101 				owner.getTwinGroup().removeChild(rect);
102 			} else {
103 				createCommand(rect);
104 			}
105 			rect = null;
106 			owner = null;
107 		}
108 		return true;
109 	}
110 	
111 	@Override
112 	public boolean processMouseMove(MouseMoveEvent event) {
113 		if (owner != null) {
114 			p2 = owner.getCoordinates(event, true);
115 			float xmin = Math.min(p1.getX(), p2.getX());
116 			float ymin = Math.min(p1.getY(), p2.getY());
117 			float xmax = Math.max(p1.getX(), p2.getX());
118 			float ymax = Math.max(p1.getY(), p2.getY());
119 			rect.getX().getBaseVal().setValue(xmin);
120 			rect.getY().getBaseVal().setValue(ymin);
121 			rect.getWidth().getBaseVal().setValue(xmax - xmin);
122 			rect.getHeight().getBaseVal().setValue(ymax - ymin);
123 		}
124 		return true;
125 	}
126 }