KickJava   Java API By Example, From Geeks To Geeks.

Java > Open Source Codes > org > nightlabs > editor2d > impl > Editor2DFactoryImpl


1 /* *****************************************************************************
2  * NightLabs Editor2D - Graphical editor framework *
3  * Copyright (C) 2004-2005 NightLabs - http://NightLabs.org *
4  * *
5  * This library is free software; you can redistribute it and/or *
6  * modify it under the terms of the GNU Lesser General Public *
7  * License as published by the Free Software Foundation; either *
8  * version 2.1 of the License, or (at your option) any later version. *
9  * *
10  * This library 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 GNU *
13  * Lesser General Public License for more details. *
14  * *
15  * You should have received a copy of the GNU Lesser General Public *
16  * License along with this library; if not, write to the *
17  * Free Software Foundation, Inc., *
18  * 51 Franklin St, Fifth Floor, *
19  * Boston, MA 02110-1301 USA *
20  * *
21  * Or get it online : *
22  * http://www.gnu.org/copyleft/lesser.html *
23  * *
24  * *
25  ******************************************************************************/

26
27 package org.nightlabs.editor2d.impl;
28
29 import java.awt.Color JavaDoc;
30 import java.awt.geom.AffineTransform JavaDoc;
31 import java.awt.geom.PathIterator JavaDoc;
32 import java.awt.image.BufferedImage JavaDoc;
33 import java.io.ByteArrayInputStream JavaDoc;
34 import java.io.ByteArrayOutputStream JavaDoc;
35 import java.io.IOException JavaDoc;
36 import java.util.StringTokenizer JavaDoc;
37
38 import org.nightlabs.editor2d.DrawComponent;
39 import org.nightlabs.editor2d.DrawComponentContainer;
40 import org.nightlabs.editor2d.Editor2DFactory;
41 import org.nightlabs.editor2d.EditorGuide;
42 import org.nightlabs.editor2d.EditorRuler;
43 import org.nightlabs.editor2d.EllipseDrawComponent;
44 import org.nightlabs.editor2d.ImageDrawComponent;
45 import org.nightlabs.editor2d.Layer;
46 import org.nightlabs.editor2d.LineDrawComponent;
47 import org.nightlabs.editor2d.MultiLayerDrawComponent;
48 import org.nightlabs.editor2d.RectangleDrawComponent;
49 import org.nightlabs.editor2d.ShapeDrawComponent;
50 import org.nightlabs.editor2d.TextDrawComponent;
51 import org.nightlabs.editor2d.j2d.GeneralShape;
52 import com.sun.image.codec.jpeg.ImageFormatException;
53 import com.sun.image.codec.jpeg.JPEGCodec;
54 import com.sun.image.codec.jpeg.JPEGImageDecoder;
55 import com.sun.image.codec.jpeg.JPEGImageEncoder;
56
57 /**
58  * <!-- begin-user-doc -->
59  * An implementation of the model <b>Factory</b>.
60  * <!-- end-user-doc -->
61  *
62  */

63 public class Editor2DFactoryImpl
64 implements Editor2DFactory
65 {
66     /**
67      * Creates an instance of the factory.
68      * <!-- begin-user-doc -->
69    * <!-- end-user-doc -->
70      * @generated
71      */

72   public Editor2DFactoryImpl() {
73         super();
74     }
75
76 // /**
77
// * <!-- begin-user-doc -->
78
// * <!-- end-user-doc -->
79
// * @generated
80
// */
81
// public Object createFromString(EDataType eDataType, String initialValue) {
82
// switch (eDataType.getClassifierID()) {
83
// case Editor2DPackage.COLOR:
84
// return createColorFromString(eDataType, initialValue);
85
// case Editor2DPackage.RECTANGLE:
86
// return createRectangleFromString(eDataType, initialValue);
87
// case Editor2DPackage.GENERAL_SHAPE:
88
// return createGeneralShapeFromString(eDataType, initialValue);
89
// case Editor2DPackage.AFFINE_TRANSFORM:
90
// return createAffineTransformFromString(eDataType, initialValue);
91
// case Editor2DPackage.BUFFERED_IMAGE:
92
// return createBufferedImageFromString(eDataType, initialValue);
93
// case Editor2DPackage.COLLECTION:
94
// return createCollectionFromString(eDataType, initialValue);
95
// default:
96
// throw new IllegalArgumentException("The datatype '" + eDataType.getName() + "' is not a valid classifier");
97
// }
98
// }
99

100 // /**
101
// * <!-- begin-user-doc -->
102
// * <!-- end-user-doc -->
103
// * @generated
104
// */
105
// public String convertToString(EDataType eDataType, Object instanceValue)
106
// {
107
// switch (eDataType.getClassifierID())
108
// {
109
// case Editor2DPackage.COLOR:
110
// return convertColorToString(eDataType, instanceValue);
111
// case Editor2DPackage.RECTANGLE:
112
// return convertRectangleToString(eDataType, instanceValue);
113
// case Editor2DPackage.GENERAL_SHAPE:
114
// return convertGeneralShapeToString(eDataType, instanceValue);
115
// case Editor2DPackage.AFFINE_TRANSFORM:
116
// return convertAffineTransformToString(eDataType, instanceValue);
117
// case Editor2DPackage.BUFFERED_IMAGE:
118
// return convertBufferedImageToString(eDataType, instanceValue);
119
// case Editor2DPackage.COLLECTION:
120
// return convertCollectionToString(eDataType, instanceValue);
121
// default:
122
// throw new IllegalArgumentException("The datatype '" + eDataType.getName() + "' is not a valid classifier");
123
// }
124
// }
125

126     /**
127      * <!-- begin-user-doc -->
128    * <!-- end-user-doc -->
129      * @generated
130      */

131   public DrawComponent createDrawComponent() {
132         DrawComponentImpl drawComponent = new DrawComponentImpl();
133         return drawComponent;
134     }
135
136     /**
137      * <!-- begin-user-doc -->
138    * <!-- end-user-doc -->
139      * @generated
140      */

141   public ShapeDrawComponent createShapeDrawComponent() {
142         ShapeDrawComponentImpl shapeDrawComponent = new ShapeDrawComponentImpl();
143         return shapeDrawComponent;
144     }
145
146     /**
147      * <!-- begin-user-doc -->
148    * <!-- end-user-doc -->
149      * @generated
150      */

151   public Layer createLayer() {
152         LayerImpl layer = new LayerImpl();
153         return layer;
154     }
155
156     /**
157      * <!-- begin-user-doc -->
158    * <!-- end-user-doc -->
159      * @generated
160      */

161   public MultiLayerDrawComponent createMultiLayerDrawComponent() {
162         MultiLayerDrawComponentImpl multiLayerDrawComponent = new MultiLayerDrawComponentImpl();
163         validateMLDC(multiLayerDrawComponent);
164         return multiLayerDrawComponent;
165     }
166
167   public static final int UNIT_PIXELS = 2;
168   public static final int UNIT_CENTIMETER = 1;
169   protected void validateMLDC(MultiLayerDrawComponent mldc)
170   {
171     if (mldc == null)
172       throw new IllegalStateException JavaDoc("Param mldc must not be null!");
173     
174     // create Factory
175
Editor2DFactory factory = Editor2DFactory.eINSTANCE;
176     
177     // check Layers
178
if (mldc.getCurrentLayer() == null)
179     {
180       Layer l = factory.createLayer();
181       if (l.getParent() == null)
182         l.setParent(mldc);
183       
184       mldc.addDrawComponent(l);
185       mldc.setCurrentLayer(l);
186     }
187     
188     // check Rulers
189
if (mldc.getLeftRuler() == null)
190     {
191       EditorRuler leftRuler = factory.createEditorRuler();
192       leftRuler.setHorizontal(false);
193       leftRuler.setUnit(UNIT_PIXELS);
194       mldc.setLeftRuler(leftRuler);
195     }
196     
197     if (mldc.getTopRuler() == null)
198     {
199       EditorRuler topRuler = factory.createEditorRuler();
200       topRuler.setHorizontal(true);
201       topRuler.setUnit(UNIT_PIXELS);
202       mldc.setTopRuler(topRuler);
203     }
204   }
205   
206     /**
207      * <!-- begin-user-doc -->
208    * <!-- end-user-doc -->
209      * @generated
210      */

211   public RectangleDrawComponent createRectangleDrawComponent() {
212         RectangleDrawComponentImpl rectangleDrawComponent = new RectangleDrawComponentImpl();
213         return rectangleDrawComponent;
214     }
215
216     /**
217      * <!-- begin-user-doc -->
218    * <!-- end-user-doc -->
219      * @generated
220      */

221   public EllipseDrawComponent createEllipseDrawComponent() {
222         EllipseDrawComponentImpl ellipseDrawComponent = new EllipseDrawComponentImpl();
223         return ellipseDrawComponent;
224     }
225
226     /**
227      * <!-- begin-user-doc -->
228    * <!-- end-user-doc -->
229      * @generated
230      */

231   public TextDrawComponent createTextDrawComponent() {
232         TextDrawComponentImpl textDrawComponent = new TextDrawComponentImpl();
233         return textDrawComponent;
234     }
235
236     /**
237      * <!-- begin-user-doc -->
238    * <!-- end-user-doc -->
239      * @generated
240      */

241   public DrawComponentContainer createDrawComponentContainer() {
242         DrawComponentContainerImpl drawComponentContainer = new DrawComponentContainerImpl();
243         return drawComponentContainer;
244     }
245
246     /**
247      * <!-- begin-user-doc -->
248    * <!-- end-user-doc -->
249      * @generated
250      */

251   public LineDrawComponent createLineDrawComponent() {
252         LineDrawComponentImpl lineDrawComponent = new LineDrawComponentImpl();
253         return lineDrawComponent;
254     }
255
256     /**
257      * <!-- begin-user-doc -->
258    * <!-- end-user-doc -->
259      * @generated
260      */

261   public EditorGuide createEditorGuide() {
262         EditorGuideImpl editorGuide = new EditorGuideImpl();
263         return editorGuide;
264     }
265
266     /**
267      * <!-- begin-user-doc -->
268    * <!-- end-user-doc -->
269      * @generated
270      */

271   public EditorRuler createEditorRuler() {
272         EditorRulerImpl editorRuler = new EditorRulerImpl();
273         return editorRuler;
274     }
275
276     /**
277      * <!-- begin-user-doc -->
278    * <!-- end-user-doc -->
279      * @generated
280      */

281   public ImageDrawComponent createImageDrawComponent() {
282         ImageDrawComponentImpl imageDrawComponent = new ImageDrawComponentImpl();
283         return imageDrawComponent;
284     }
285
286   /**
287    * <!-- begin-user-doc -->
288    * <!-- end-user-doc -->
289    *
290    */

291   public Color JavaDoc createColorFromString(String JavaDoc initialValue)
292   {
293     StringBuffer JavaDoc sb = new StringBuffer JavaDoc(initialValue);
294     Integer JavaDoc integerRed = new Integer JavaDoc(sb.substring(2,5));
295     Integer JavaDoc integerGreen = new Integer JavaDoc(sb.substring(8,11));
296     Integer JavaDoc integerBlue = new Integer JavaDoc(sb.substring(14,17));
297     Integer JavaDoc integerAlpha = new Integer JavaDoc(sb.substring(20,23));
298     Color JavaDoc c = new Color JavaDoc(integerRed.intValue(), integerGreen.intValue(), integerBlue.intValue(), integerAlpha.intValue());
299     return c;
300   }
301
302   /**
303    * <!-- begin-user-doc -->
304    * <!-- end-user-doc -->
305    *
306    */

307   public String JavaDoc convertColorToString(Object JavaDoc instanceValue)
308   {
309     java.awt.Color JavaDoc color = (java.awt.Color JavaDoc) instanceValue;
310     StringBuffer JavaDoc sb = new StringBuffer JavaDoc();
311     
312     sb.append("R:");
313     sb.append(convertColorValue(color.getRed()));
314     sb.append(",");
315     sb.append("G:");
316     sb.append(convertColorValue(color.getGreen()));
317     sb.append(",");
318     sb.append("B:");
319     sb.append(convertColorValue(color.getBlue()));
320     sb.append(",");
321     sb.append("A:");
322     sb.append(convertColorValue(color.getAlpha()));
323     return sb.toString();
324   }
325
326 // /**
327
// * <!-- begin-user-doc -->
328
// * <!-- end-user-doc -->
329
// * @generated
330
// */
331
// public Rectangle createRectangleFromString(EDataType eDataType, String initialValue) {
332
// return (Rectangle)super.createFromString(eDataType, initialValue);
333
// }
334

335 // /**
336
// * <!-- begin-user-doc -->
337
// * <!-- end-user-doc -->
338
// * @generated
339
// */
340
// public String convertRectangleToString(Object instanceValue) {
341
// return super.convertToString(eDataType, instanceValue);
342
// }
343

344   protected String JavaDoc convertColorValue(int rgbVal)
345   {
346     StringBuffer JavaDoc sb = new StringBuffer JavaDoc(String.valueOf(rgbVal));
347     int length = sb.length();
348     if (length == 2) {
349       sb.insert(0, 0);
350     } else if (length == 1) {
351       sb.insert(0, 0);
352       sb.insert(1, 0);
353     } else if (length == 0) {
354       sb.insert(0, 0);
355       sb.insert(1, 0);
356       sb.insert(2, 0);
357     } else if (length > 3) {
358       throw new IllegalArgumentException JavaDoc("Param rgbVal must not be > 3!");
359     }
360     return sb.toString();
361   }
362     
363   /**
364    * <!-- begin-user-doc -->
365    * <!-- end-user-doc -->
366    *
367    */

368   public GeneralShape createGeneralShapeFromString(String JavaDoc initialValue)
369   {
370     StringTokenizer JavaDoc st = new StringTokenizer JavaDoc(initialValue);
371     int type = 0;
372     GeneralShape gp = new GeneralShape();
373     while (st.hasMoreTokens())
374     {
375       StringBuffer JavaDoc sb = new StringBuffer JavaDoc(st.nextToken());
376       if (sb.substring(0,1).equals("T")) {
377         type = new Integer JavaDoc(sb.substring(1,2)).intValue();
378       }
379       
380       switch (type)
381       {
382         case (PathIterator.SEG_MOVETO):
383           float mx1 = new Double JavaDoc(st.nextToken()).floatValue();
384             float my1 = new Double JavaDoc(st.nextToken()).floatValue();
385             gp.moveTo(mx1,my1);
386             break;
387         case (PathIterator.SEG_LINETO):
388           float lx1 = new Double JavaDoc(st.nextToken()).floatValue();
389             float ly1 = new Double JavaDoc(st.nextToken()).floatValue();
390             gp.lineTo(lx1,ly1);
391             break;
392         case (PathIterator.SEG_QUADTO):
393           float qx1 = new Double JavaDoc(st.nextToken()).floatValue();
394             float qy1 = new Double JavaDoc(st.nextToken()).floatValue();
395           float qx2 = new Double JavaDoc(st.nextToken()).floatValue();
396             float qy2 = new Double JavaDoc(st.nextToken()).floatValue();
397             gp.quadTo(qx1,qy1,qx2,qy2);
398             break;
399         case (PathIterator.SEG_CUBICTO):
400           float cx1 = new Double JavaDoc(st.nextToken()).floatValue();
401             float cy1 = new Double JavaDoc(st.nextToken()).floatValue();
402           float cx2 = new Double JavaDoc(st.nextToken()).floatValue();
403             float cy2 = new Double JavaDoc(st.nextToken()).floatValue();
404           float cx3 = new Double JavaDoc(st.nextToken()).floatValue();
405             float cy3 = new Double JavaDoc(st.nextToken()).floatValue();
406             gp.curveTo(cx1,cy1,cx2,cy2,cx3,cy3);
407             break;
408         case (PathIterator.SEG_CLOSE):
409           gp.closePath();
410             break;
411       }
412     }
413     return gp;
414   }
415
416   /**
417    * <!-- begin-user-doc -->
418    * <!-- end-user-doc -->
419    *
420    */

421   public String JavaDoc convertGeneralShapeToString(Object JavaDoc instanceValue)
422   {
423     GeneralShape gp =(GeneralShape) instanceValue;
424     double[] coords = new double[6];
425     StringBuffer JavaDoc sb = new StringBuffer JavaDoc();
426     for (PathIterator JavaDoc pi = gp.getPathIterator(null); !pi.isDone(); pi.next())
427     {
428       int segType = pi.currentSegment(coords);
429       sb.append("T");
430       sb.append(segType);
431       sb.append(" ");
432       switch (segType)
433       {
434         case (PathIterator.SEG_MOVETO):
435             writeDouble(coords[0], sb);
436             writeDouble(coords[1], sb);
437           break;
438         case (PathIterator.SEG_LINETO):
439                 writeDouble(coords[0], sb);
440                 writeDouble(coords[1], sb);
441           break;
442         case (PathIterator.SEG_QUADTO):
443                 writeDouble(coords[0], sb);
444                 writeDouble(coords[1], sb);
445                 writeDouble(coords[2], sb);
446                 writeDouble(coords[3], sb);
447           break;
448         case (PathIterator.SEG_CUBICTO):
449                 writeDouble(coords[0], sb);
450                 writeDouble(coords[1], sb);
451                 writeDouble(coords[2], sb);
452                 writeDouble(coords[3], sb);
453                 writeDouble(coords[4], sb);
454                 writeDouble(coords[5], sb);
455           break;
456         case (PathIterator.SEG_CLOSE):
457           break;
458       }
459     }
460     return sb.toString();
461   }
462     
463   protected final static String JavaDoc atSeperator = ", ";
464   /**
465    * <!-- begin-user-doc -->
466    * <!-- end-user-doc -->
467    *
468    */

469   public AffineTransform JavaDoc createAffineTransformFromString(String JavaDoc initialValue)
470   {
471 // return (AffineTransform)super.createFromString(eDataType, initialValue);
472
StringTokenizer JavaDoc st = new StringTokenizer JavaDoc(initialValue, atSeperator);
473     double[] matrix = new double[6];
474     int matrixLength = 6;
475     for (int i=0; i<matrixLength; i++)
476     {
477       matrix[i] = new Double JavaDoc(st.nextToken()).doubleValue();
478     }
479     return new AffineTransform JavaDoc(matrix);
480   }
481   
482   /**
483    * <!-- begin-user-doc -->
484    * <!-- end-user-doc -->
485    *
486    * converts the AffineTransform Matrix into a String, similar to AffineTransform.toString()
487    */

488   public String JavaDoc convertAffineTransformToString(Object JavaDoc instanceValue)
489   {
490     AffineTransform JavaDoc at = (AffineTransform JavaDoc) instanceValue;
491     StringBuffer JavaDoc sb = new StringBuffer JavaDoc();
492     double[] matrix = new double[6];
493     at.getMatrix(matrix);
494     for (int i=0; i<matrix.length; i++)
495     {
496       sb.append(matrix[i]);
497       if (i!=matrix.length-1)
498         sb.append(atSeperator);
499     }
500     return sb.toString();
501   }
502
503   /**
504    * <!-- begin-user-doc -->
505    * <!-- end-user-doc -->
506    *
507    */

508   public BufferedImage JavaDoc createBufferedImageFromString(String JavaDoc initialValue)
509   {
510 // return (BufferedImage)super.createFromString(eDataType, initialValue);
511
byte[] imageData = createByteArrayFromString(initialValue);
512     ByteArrayInputStream JavaDoc inputStream = new ByteArrayInputStream JavaDoc(imageData);
513     JPEGImageDecoder decoder = JPEGCodec.createJPEGDecoder(inputStream);
514     BufferedImage JavaDoc image = null;
515     try {
516       image = decoder.decodeAsBufferedImage();
517     } catch (ImageFormatException e) {
518       // TODO Auto-generated catch block
519
e.printStackTrace();
520     } catch (IOException JavaDoc e) {
521       // TODO Auto-generated catch block
522
e.printStackTrace();
523     }
524     return image;
525   }
526
527 // public String convertBufferedImageToString(EDataType eDataType, Object instanceValue)
528
// {
529
// return super.convertToString(eDataType, instanceValue);
530
//// MessageDigest md;
531
//// String hash = "";
532
//// try
533
//// {
534
//// md = MessageDigest.getInstance("SHA");
535
//// BufferedImage image = (BufferedImage) instanceValue;
536
//// DataBuffer dataBuffer = image.getData().getDataBuffer();
537
//// int dataType = dataBuffer.getDataType();
538
//// if (dataType == DataBuffer.TYPE_BYTE)
539
//// {
540
//// DataBufferByte byteBuffer = (DataBufferByte) dataBuffer;
541
//// byte[][] bankData = byteBuffer.getBankData();
542
//// for (int i = 0; i < bankData.length; i++)
543
//// {
544
//// byte[] byteArray = bankData[i];
545
//// md.update(byteArray);
546
//// }
547
//// }
548
//// byte[] d = md.digest();
549
//// StringBuffer digestStr = new StringBuffer();
550
//// for (int i = 0; i < d.length; ++i)
551
//// {
552
//// String b = Integer.toHexString((int)d[i] & 0xFF);
553
//// if (b.length() == 1)
554
//// digestStr.append('0');
555
////
556
//// digestStr.append(b);
557
//// }
558
//// hash = digestStr.toString();
559
//// }
560
//// catch (NoSuchAlgorithmException e) {
561
//// // TODO Auto-generated catch block
562
//// e.printStackTrace();
563
//// }
564
//// return hash;
565
// }
566
public String JavaDoc convertBufferedImageToString(Object JavaDoc instanceValue)
567   {
568         BufferedImage JavaDoc image = (BufferedImage JavaDoc) instanceValue;
569         ByteArrayOutputStream JavaDoc outputStream = new ByteArrayOutputStream JavaDoc();
570         JPEGImageEncoder encoder = JPEGCodec.createJPEGEncoder(outputStream);
571         try {
572       encoder.encode(image);
573     } catch (ImageFormatException e) {
574       // TODO Auto-generated catch block
575
e.printStackTrace();
576     } catch (IOException JavaDoc e) {
577       // TODO Auto-generated catch block
578
e.printStackTrace();
579     }
580         byte[] imageData = outputStream.toByteArray();
581         String JavaDoc imageString = convertByteArrayToString(imageData);
582         return imageString;
583   }
584   
585   protected static final char [] HEX_DIGITS =
586   { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F' };
587   
588   protected String JavaDoc convertByteArrayToString(byte[] instanceValue)
589   {
590     if (instanceValue == null)
591     {
592       return null;
593     }
594     else
595     {
596       byte [] bytes = instanceValue;
597       char [] result = new char[2 * bytes.length];
598       for (int i = 0, j = 0; i < bytes.length; ++i)
599       {
600         int high = (bytes[i] >> 4) & 0xF;
601         int low = bytes[i] & 0xF;
602         result[j++] = HEX_DIGITS[high];
603         result[j++] = HEX_DIGITS[low];
604       }
605       return new String JavaDoc(result);
606     }
607   }
608   
609   protected byte[] createByteArrayFromString(String JavaDoc initialValue)
610   {
611     if (initialValue == null)
612     {
613       return null;
614     }
615
616     int size = initialValue.length();
617     int limit = (size + 1) / 2;
618     byte [] result = new byte[limit];
619     if (size % 2 != 0)
620     {
621       result[--limit] = hexCharToByte(initialValue.charAt(size - 1));
622     }
623     
624     for (int i = 0, j = 0; i < limit; ++i)
625     {
626       byte high = hexCharToByte(initialValue.charAt(j++));
627       byte low = hexCharToByte(initialValue.charAt(j++));
628       result[i] = (byte)(high << 4 | low);
629     }
630     return result;
631   }
632   
633   protected static byte hexCharToByte(char character)
634   {
635     switch (character)
636     {
637       case '0':
638       case '1':
639       case '2':
640       case '3':
641       case '4':
642       case '5':
643       case '6':
644       case '7':
645       case '8':
646       case '9':
647       {
648         return (byte)(character - '0');
649       }
650       case 'a':
651       case 'b':
652       case 'c':
653       case 'd':
654       case 'e':
655       case 'f':
656       {
657         return (byte)(character - 'a' + 10);
658       }
659       case 'A':
660       case 'B':
661       case 'C':
662       case 'D':
663       case 'E':
664       case 'F':
665       {
666         return (byte)(character - 'A' + 10);
667       }
668       default:
669       {
670         throw new NumberFormatException JavaDoc("Invalid hexadecimal");
671       }
672     }
673   }
674   
675   protected String JavaDoc writeDouble(double d, StringBuffer JavaDoc sb)
676   {
677     sb.append(d);
678     sb.append(" ");
679     return sb.toString();
680   }
681   
682 } //Editor2DFactoryImpl
683
Popular Tags