[skycastle-commits] SF.net SVN: skycastle: [480] trunk/skycastle/modules/ui/src

  • From: zzorn@xxxxxxxxxxxxxxxxxxxxx
  • To: skycastle-commits@xxxxxxxxxxxxx
  • Date: Sat, 26 Apr 2008 08:20:44 -0700

Revision: 480
          http://skycastle.svn.sourceforge.net/skycastle/?rev=480&view=rev
Author:   zzorn
Date:     2008-04-26 08:20:43 -0700 (Sat, 26 Apr 2008)

Log Message:
-----------
Divided sketch app model into parts, and wrote a simple unit test.

Added Paths:
-----------
    trunk/skycastle/modules/ui/src/main/java/org/skycastle/sketch/model/group/
    
trunk/skycastle/modules/ui/src/main/java/org/skycastle/sketch/model/group/AbstractGroupElement.java
    
trunk/skycastle/modules/ui/src/main/java/org/skycastle/sketch/model/group/Group.java
    
trunk/skycastle/modules/ui/src/main/java/org/skycastle/sketch/model/group/GroupElement.java
    
trunk/skycastle/modules/ui/src/main/java/org/skycastle/sketch/model/group/GroupImpl.java
    trunk/skycastle/modules/ui/src/main/java/org/skycastle/sketch/model/point/
    
trunk/skycastle/modules/ui/src/main/java/org/skycastle/sketch/model/point/StrokePoint.java
    
trunk/skycastle/modules/ui/src/main/java/org/skycastle/sketch/model/point/StrokePointImpl.java
    trunk/skycastle/modules/ui/src/main/java/org/skycastle/sketch/model/sketch/
    
trunk/skycastle/modules/ui/src/main/java/org/skycastle/sketch/model/sketch/Sketch.java
    
trunk/skycastle/modules/ui/src/main/java/org/skycastle/sketch/model/sketch/SketchImpl.java
    trunk/skycastle/modules/ui/src/main/java/org/skycastle/sketch/model/stroke/
    
trunk/skycastle/modules/ui/src/main/java/org/skycastle/sketch/model/stroke/Stroke.java
    
trunk/skycastle/modules/ui/src/main/java/org/skycastle/sketch/model/stroke/StrokeImpl.java
    
trunk/skycastle/modules/ui/src/main/java/org/skycastle/sketch/model/stroke/StrokeListener.java
    trunk/skycastle/modules/ui/src/test/java/org/skycastle/sketch/model/
    
trunk/skycastle/modules/ui/src/test/java/org/skycastle/sketch/model/SketchModelTest.java

Removed Paths:
-------------
    trunk/skycastle/modules/ui/src/main/java/org/skycastle/sketch/Sketch.java
    
trunk/skycastle/modules/ui/src/main/java/org/skycastle/sketch/SketchImpl.java
    trunk/skycastle/modules/ui/src/main/java/org/skycastle/sketch/Stroke.java
    
trunk/skycastle/modules/ui/src/main/java/org/skycastle/sketch/StrokePoint.java
    
trunk/skycastle/modules/ui/src/main/java/org/skycastle/sketch/StrokePointImpl.java

Deleted: 
trunk/skycastle/modules/ui/src/main/java/org/skycastle/sketch/Sketch.java
===================================================================
--- trunk/skycastle/modules/ui/src/main/java/org/skycastle/sketch/Sketch.java   
2008-04-26 14:56:30 UTC (rev 479)
+++ trunk/skycastle/modules/ui/src/main/java/org/skycastle/sketch/Sketch.java   
2008-04-26 15:20:43 UTC (rev 480)
@@ -1,22 +0,0 @@
-package org.skycastle.sketch;
-
-/**
- * Holds the data of a drawing.
- * <p/>
- * Strokes can be added and removed.
- * <p/>
- * Strokes can be grouped into Layers.
- *
- * @author Hans Häggström
- */
-public interface Sketch
-{
-
-    /**
-     * Creates a new {@link Stroke} and adds it to the sketch.
-     *
-     * @return the created stroke.
-     */
-    Stroke createStroke();
-
-}

Deleted: 
trunk/skycastle/modules/ui/src/main/java/org/skycastle/sketch/SketchImpl.java
===================================================================
--- 
trunk/skycastle/modules/ui/src/main/java/org/skycastle/sketch/SketchImpl.java   
    2008-04-26 14:56:30 UTC (rev 479)
+++ 
trunk/skycastle/modules/ui/src/main/java/org/skycastle/sketch/SketchImpl.java   
    2008-04-26 15:20:43 UTC (rev 480)
@@ -1,23 +0,0 @@
-package org.skycastle.sketch;
-
-/**
- * @author Hans Häggström
- */
-public class SketchImpl
-        implements Sketch
-{
-
-    /**
-     * Creates a new {@link org.skycastle.sketch.SketchImpl}.
-     */
-    public SketchImpl()
-    {
-        throw new UnsupportedOperationException( "Constructor not yet 
implemented." ); // IMPLEMENT
-    }
-
-    public Stroke createStroke()
-    {
-        throw new UnsupportedOperationException( "This method has not yet been 
implemented." ); // IMPLEMENT
-
-    }
-}

Deleted: 
trunk/skycastle/modules/ui/src/main/java/org/skycastle/sketch/Stroke.java
===================================================================
--- trunk/skycastle/modules/ui/src/main/java/org/skycastle/sketch/Stroke.java   
2008-04-26 14:56:30 UTC (rev 479)
+++ trunk/skycastle/modules/ui/src/main/java/org/skycastle/sketch/Stroke.java   
2008-04-26 15:20:43 UTC (rev 480)
@@ -1,16 +0,0 @@
-package org.skycastle.sketch;
-
-/**
- * @author Hans Häggström
- *         <p/>
- *         Immutable, except points can be added (and removed?), and the 
changes listened to.
- */
-public interface Stroke
-{
-    /**
-     * @param strokePoint a new point to be added to the stroke.
-     */
-    void addPoint( StrokePoint strokePoint );
-
-
-}

Deleted: 
trunk/skycastle/modules/ui/src/main/java/org/skycastle/sketch/StrokePoint.java
===================================================================
--- 
trunk/skycastle/modules/ui/src/main/java/org/skycastle/sketch/StrokePoint.java  
    2008-04-26 14:56:30 UTC (rev 479)
+++ 
trunk/skycastle/modules/ui/src/main/java/org/skycastle/sketch/StrokePoint.java  
    2008-04-26 15:20:43 UTC (rev 480)
@@ -1,35 +0,0 @@
-package org.skycastle.sketch;
-
-/**
- * A point on a {@link Stroke}
- * <p/>
- * Immutable.
- *
- * @author Hans Häggström
- */
-public interface StrokePoint
-{
-    /**
-     * @return x coordinate of the point.
-     */
-    float getX();
-
-    /**
-     * @return y coordinate of the point.
-     */
-    float getY();
-
-    /**
-     * @param property the property to get
-     *
-     * @return the specified property of the stroke.
-     */
-    float getValue( String property, float defaultValue );
-
-    /**
-     * @param property the property to get
-     *
-     * @return the specified property of the stroke.
-     */
-    <T> T getObjectValue( String property, T defaultValue );
-}

Deleted: 
trunk/skycastle/modules/ui/src/main/java/org/skycastle/sketch/StrokePointImpl.java
===================================================================
--- 
trunk/skycastle/modules/ui/src/main/java/org/skycastle/sketch/StrokePointImpl.java
  2008-04-26 14:56:30 UTC (rev 479)
+++ 
trunk/skycastle/modules/ui/src/main/java/org/skycastle/sketch/StrokePointImpl.java
  2008-04-26 15:20:43 UTC (rev 480)
@@ -1,43 +0,0 @@
-package org.skycastle.sketch;
-
-/**
- * @author Hans Häggström
- */
-public class StrokePointImpl
-        implements StrokePoint
-{
-
-    private float myX =
-
-    /**
-     * Creates a new {@link org.skycastle.sketch.StrokePointImpl}.
-     */
-    public StrokePointImpl()
-    {
-        throw new UnsupportedOperationException( "Constructor not yet 
implemented." ); // IMPLEMENT
-    }
-
-    public float getX()
-    {
-        throw new UnsupportedOperationException( "This method has not yet been 
implemented." ); // IMPLEMENT
-
-    }
-
-    public float getY()
-    {
-        throw new UnsupportedOperationException( "This method has not yet been 
implemented." ); // IMPLEMENT
-
-    }
-
-    public float getValue( final String property, final float defaultValue )
-    {
-        throw new UnsupportedOperationException( "This method has not yet been 
implemented." ); // IMPLEMENT
-
-    }
-
-    public <T> T getObjectValue( final String property, final T defaultValue )
-    {
-        throw new UnsupportedOperationException( "This method has not yet been 
implemented." ); // IMPLEMENT
-
-    }
-}

Copied: 
trunk/skycastle/modules/ui/src/main/java/org/skycastle/sketch/model/group/AbstractGroupElement.java
 (from rev 479, 
trunk/skycastle/modules/ui/src/main/java/org/skycastle/sketch/model/AbstractGroupElement.java)
===================================================================
--- 
trunk/skycastle/modules/ui/src/main/java/org/skycastle/sketch/model/group/AbstractGroupElement.java
                         (rev 0)
+++ 
trunk/skycastle/modules/ui/src/main/java/org/skycastle/sketch/model/group/AbstractGroupElement.java
 2008-04-26 15:20:43 UTC (rev 480)
@@ -0,0 +1,49 @@
+package org.skycastle.sketch.model.group;
+
+/**
+ * @author Hans Haggstrom
+ */
+public abstract class AbstractGroupElement
+        implements GroupElement
+{
+
+    //======================================================================
+    // Private Fields
+
+    private String myName = null;
+
+    //======================================================================
+    // Public Methods
+
+    //----------------------------------------------------------------------
+    // Constructors
+
+    public AbstractGroupElement()
+    {
+    }
+
+    public AbstractGroupElement( final String name )
+    {
+        setName( name );
+    }
+
+    //----------------------------------------------------------------------
+    // GroupElement Implementation
+
+    public final String getName()
+    {
+        return myName;
+    }
+
+    //----------------------------------------------------------------------
+    // Other Public Methods
+
+    /**
+     * @param name a user readable name for this element, or null if none 
available.
+     */
+    public final void setName( final String name )
+    {
+        myName = name;
+    }
+
+}

Copied: 
trunk/skycastle/modules/ui/src/main/java/org/skycastle/sketch/model/group/Group.java
 (from rev 479, 
trunk/skycastle/modules/ui/src/main/java/org/skycastle/sketch/model/Group.java)
===================================================================
--- 
trunk/skycastle/modules/ui/src/main/java/org/skycastle/sketch/model/group/Group.java
                                (rev 0)
+++ 
trunk/skycastle/modules/ui/src/main/java/org/skycastle/sketch/model/group/Group.java
        2008-04-26 15:20:43 UTC (rev 480)
@@ -0,0 +1,45 @@
+package org.skycastle.sketch.model.group;
+
+import org.skycastle.util.listenable.collection.CollectionListener;
+
+import java.util.List;
+
+/**
+ * A way to organize the contents of a {@link 
org.skycastle.sketch.model.sketch.Sketch}.
+ * <p/>
+ * A {@link Group} can contain other {@link Group}s, or {@link 
org.skycastle.sketch.model.stroke.Stroke}s.
+ *
+ * @author Hans Haggstrom
+ */
+// IDEA: In the future, various effects could be applied on a group basis.
+public interface Group
+        extends GroupElement
+{
+
+    /**
+     * @param groupElement the {@link GroupElement} that should be added
+     */
+    void add( GroupElement groupElement );
+
+    /**
+     * @param groupElement the {@link GroupElement} that should be removed.
+     */
+    void remove( GroupElement groupElement );
+
+    /**
+     * @param groupElementCollectionListener a listener that is notified when 
{@link GroupElement}s are added
+     *                                       and removed to/from this {@link 
Group}.
+     */
+    void addGroupListener( CollectionListener<GroupElement> 
groupElementCollectionListener );
+
+    /**
+     * @param groupElementCollectionListener the listener to remove.
+     */
+    void removeGroupListener( CollectionListener<GroupElement> 
groupElementCollectionListener );
+
+    /**
+     * @return a read-only view on the {@link GroupElement}s in this {@link 
Group}.
+     */
+    List<GroupElement> getElements();
+
+}

Copied: 
trunk/skycastle/modules/ui/src/main/java/org/skycastle/sketch/model/group/GroupElement.java
 (from rev 479, 
trunk/skycastle/modules/ui/src/main/java/org/skycastle/sketch/model/GroupElement.java)
===================================================================
--- 
trunk/skycastle/modules/ui/src/main/java/org/skycastle/sketch/model/group/GroupElement.java
                         (rev 0)
+++ 
trunk/skycastle/modules/ui/src/main/java/org/skycastle/sketch/model/group/GroupElement.java
 2008-04-26 15:20:43 UTC (rev 480)
@@ -0,0 +1,16 @@
+package org.skycastle.sketch.model.group;
+
+/**
+ * Somethign that can be contained in a {@link Group}.
+ *
+ * @author Hans Haggstrom
+ */
+public interface GroupElement
+{
+
+    /**
+     * @return a user readable name for this element, or null if none 
available.
+     */
+    String getName();
+
+}

Copied: 
trunk/skycastle/modules/ui/src/main/java/org/skycastle/sketch/model/group/GroupImpl.java
 (from rev 479, 
trunk/skycastle/modules/ui/src/main/java/org/skycastle/sketch/model/GroupImpl.java)
===================================================================
--- 
trunk/skycastle/modules/ui/src/main/java/org/skycastle/sketch/model/group/GroupImpl.java
                            (rev 0)
+++ 
trunk/skycastle/modules/ui/src/main/java/org/skycastle/sketch/model/group/GroupImpl.java
    2008-04-26 15:20:43 UTC (rev 480)
@@ -0,0 +1,53 @@
+package org.skycastle.sketch.model.group;
+
+import org.skycastle.util.listenable.collection.CollectionListener;
+import org.skycastle.util.listenable.collection.list.ListenableArrayList;
+import org.skycastle.util.listenable.collection.list.ListenableMutableList;
+
+import java.util.List;
+
+/**
+ * @author Hans Haggstrom
+ */
+public final class GroupImpl
+        extends AbstractGroupElement
+        implements Group
+{
+
+    //======================================================================
+    // Private Fields
+
+    private final ListenableMutableList<GroupElement> myElements = new 
ListenableArrayList<GroupElement>( 100 );
+
+    //======================================================================
+    // Public Methods
+
+    //----------------------------------------------------------------------
+    // Group Implementation
+
+    public void add( final GroupElement groupElement )
+    {
+        myElements.add( groupElement );
+    }
+
+    public void remove( final GroupElement groupElement )
+    {
+        myElements.remove( groupElement );
+    }
+
+    public void addGroupListener( final CollectionListener<GroupElement> 
groupElementCollectionListener )
+    {
+        myElements.addCollectionListener( groupElementCollectionListener );
+    }
+
+    public void removeGroupListener( final CollectionListener<GroupElement> 
groupElementCollectionListener )
+    {
+        myElements.removeCollectionListener( groupElementCollectionListener );
+    }
+
+    public List<GroupElement> getElements()
+    {
+        return myElements.getReadOnlyList();
+    }
+
+}

Copied: 
trunk/skycastle/modules/ui/src/main/java/org/skycastle/sketch/model/point/StrokePoint.java
 (from rev 479, 
trunk/skycastle/modules/ui/src/main/java/org/skycastle/sketch/model/StrokePoint.java)
===================================================================
--- 
trunk/skycastle/modules/ui/src/main/java/org/skycastle/sketch/model/point/StrokePoint.java
                          (rev 0)
+++ 
trunk/skycastle/modules/ui/src/main/java/org/skycastle/sketch/model/point/StrokePoint.java
  2008-04-26 15:20:43 UTC (rev 480)
@@ -0,0 +1,48 @@
+package org.skycastle.sketch.model.point;
+
+/**
+ * A point on a {@link org.skycastle.sketch.model.stroke.Stroke}
+ * <p/>
+ * Can be modified by filters when the stroke is created, but usually not 
modified in the final {@link
+ * org.skycastle.sketch.model.stroke.Stroke}.
+ *
+ * @author Hans Häggström
+ */
+public interface StrokePoint
+{
+
+    /**
+     * @return x coordinate of the point.
+     */
+    float getX();
+
+    /**
+     * @param x coordinate of the point.
+     */
+    void setX( float x );
+
+    /**
+     * @return y coordinate of the point.
+     */
+    float getY();
+
+    /**
+     * @param y coordinate of the point.
+     */
+    void setY( float y );
+
+    /**
+     * @param property     the property to get
+     * @param defaultValue value returned if the specified property is not 
available.
+     *
+     * @return the specified property of the stroke.
+     */
+    <T> T getProperty( String property, T defaultValue );
+
+    /**
+     * @param property the property to set
+     * @param value    the value to set the property to.
+     */
+    void setProperty( String property, Object value );
+
+}

Copied: 
trunk/skycastle/modules/ui/src/main/java/org/skycastle/sketch/model/point/StrokePointImpl.java
 (from rev 479, 
trunk/skycastle/modules/ui/src/main/java/org/skycastle/sketch/model/StrokePointImpl.java)
===================================================================
--- 
trunk/skycastle/modules/ui/src/main/java/org/skycastle/sketch/model/point/StrokePointImpl.java
                              (rev 0)
+++ 
trunk/skycastle/modules/ui/src/main/java/org/skycastle/sketch/model/point/StrokePointImpl.java
      2008-04-26 15:20:43 UTC (rev 480)
@@ -0,0 +1,95 @@
+package org.skycastle.sketch.model.point;
+
+import java.util.HashMap;
+import java.util.Map;
+
+/**
+ * @author Hans Häggström
+ */
+public final class StrokePointImpl
+        implements StrokePoint
+{
+
+    //======================================================================
+    // Private Fields
+
+    private float myX = 0;
+    private float myY = 0;
+
+    private Map<String, Object> myProperties = null;
+
+    //======================================================================
+    // Public Methods
+
+    //----------------------------------------------------------------------
+    // Constructors
+
+    /**
+     * Creates a new {@link StrokePointImpl}.
+     */
+    public StrokePointImpl()
+    {
+        this( 0, 0 );
+    }
+
+    /**
+     * Creates a new {@link StrokePointImpl}.
+     *
+     * @param x x coordinate of point, in canvas coordinates.
+     * @param y y coordinate of point, in canvas coordinates.
+     */
+    public StrokePointImpl( float x, float y )
+    {
+        setX( x );
+        setY( y );
+    }
+
+    //----------------------------------------------------------------------
+    // StrokePoint Implementation
+
+    public float getX()
+    {
+        return myX;
+    }
+
+    public void setX( final float x )
+    {
+        myX = x;
+    }
+
+    public float getY()
+    {
+        return myY;
+    }
+
+    public void setY( final float y )
+    {
+        myY = y;
+    }
+
+
+    public <T> T getProperty( final String property, final T defaultValue )
+    {
+        if ( myProperties != null &&
+             myProperties.containsKey( property ) )
+        {
+            //noinspection unchecked
+            return (T) myProperties.get( property );
+        }
+        else
+        {
+            return defaultValue;
+        }
+    }
+
+    public void setProperty( final String property, final Object value )
+    {
+        if ( myProperties == null )
+        {
+            myProperties = new HashMap<String, Object>( 5 );
+        }
+
+        myProperties.put( property, value );
+    }
+
+}

Copied: 
trunk/skycastle/modules/ui/src/main/java/org/skycastle/sketch/model/sketch/Sketch.java
 (from rev 479, 
trunk/skycastle/modules/ui/src/main/java/org/skycastle/sketch/model/Sketch.java)
===================================================================
--- 
trunk/skycastle/modules/ui/src/main/java/org/skycastle/sketch/model/sketch/Sketch.java
                              (rev 0)
+++ 
trunk/skycastle/modules/ui/src/main/java/org/skycastle/sketch/model/sketch/Sketch.java
      2008-04-26 15:20:43 UTC (rev 480)
@@ -0,0 +1,23 @@
+package org.skycastle.sketch.model.sketch;
+
+import org.skycastle.sketch.model.group.Group;
+
+/**
+ * Holds the data of a drawing.
+ * <p/>
+ * Strokes can be added and removed.
+ * <p/>
+ * Strokes can be grouped into Layers.
+ *
+ * @author Hans Häggström
+ */
+public interface Sketch
+{
+
+    /**
+     * @return the base {@link org.skycastle.sketch.model.group.Group} for 
this {@link Sketch}. Can be used to
+     *         modify the contents of the {@link Sketch}.
+     */
+    Group getRootGroup();
+
+}

Copied: 
trunk/skycastle/modules/ui/src/main/java/org/skycastle/sketch/model/sketch/SketchImpl.java
 (from rev 479, 
trunk/skycastle/modules/ui/src/main/java/org/skycastle/sketch/model/SketchImpl.java)
===================================================================
--- 
trunk/skycastle/modules/ui/src/main/java/org/skycastle/sketch/model/sketch/SketchImpl.java
                          (rev 0)
+++ 
trunk/skycastle/modules/ui/src/main/java/org/skycastle/sketch/model/sketch/SketchImpl.java
  2008-04-26 15:20:43 UTC (rev 480)
@@ -0,0 +1,39 @@
+package org.skycastle.sketch.model.sketch;
+
+import org.skycastle.sketch.model.group.Group;
+import org.skycastle.sketch.model.group.GroupImpl;
+
+/**
+ * @author Hans Häggström
+ */
+public final class SketchImpl
+        implements Sketch
+{
+
+    //======================================================================
+    // Private Fields
+
+    private final Group myRootGroup = new GroupImpl();
+
+    //======================================================================
+    // Public Methods
+
+    //----------------------------------------------------------------------
+    // Constructors
+
+    /**
+     * Creates a new {@link SketchImpl}.
+     */
+    public SketchImpl()
+    {
+    }
+
+    //----------------------------------------------------------------------
+    // Sketch Implementation
+
+    public Group getRootGroup()
+    {
+        return myRootGroup;
+    }
+
+}

Copied: 
trunk/skycastle/modules/ui/src/main/java/org/skycastle/sketch/model/stroke/Stroke.java
 (from rev 479, 
trunk/skycastle/modules/ui/src/main/java/org/skycastle/sketch/model/Stroke.java)
===================================================================
--- 
trunk/skycastle/modules/ui/src/main/java/org/skycastle/sketch/model/stroke/Stroke.java
                              (rev 0)
+++ 
trunk/skycastle/modules/ui/src/main/java/org/skycastle/sketch/model/stroke/Stroke.java
      2008-04-26 15:20:43 UTC (rev 480)
@@ -0,0 +1,50 @@
+package org.skycastle.sketch.model.stroke;
+
+import org.skycastle.sketch.model.group.GroupElement;
+import org.skycastle.sketch.model.point.StrokePoint;
+
+import java.util.List;
+
+/**
+ * Immutable, except points can be added (and removed?), and the changes 
listened to.
+ *
+ * @author Hans Häggström
+ */
+public interface Stroke
+        extends GroupElement
+{
+
+    /**
+     * Adds the specified {@link org.skycastle.sketch.model.point.StrokePoint} 
to this {@link Stroke}.
+     *
+     * @param addedPoint should not be null or already added.
+     */
+    void addPoint( StrokePoint addedPoint );
+
+    /**
+     * Removes the specified {@link StrokePoint} from this {@link Stroke}.
+     *
+     * @param removedPoint should not be null, and should be present.
+     */
+    void removePoint( StrokePoint removedPoint );
+
+    /**
+     * @return a read-only list with the {@link 
org.skycastle.sketch.model.point.StrokePoint}s in this {@link
+     *         Stroke}.
+     */
+    List<StrokePoint> getPoints();
+
+    /**
+     * @return the {@link StrokeListener} that is currently listening to 
changes to this {@link Stroke}.
+     */
+    StrokeListener getStrokeListener();
+
+    /**
+     * Usually this is only called from the {@link 
org.skycastle.sketch.model.group.Group} that contains the
+     * {@link Stroke}.
+     *
+     * @param strokeListener the {@link StrokeListener} that should listen to 
changes to this {@link Stroke}.
+     */
+    void setStrokeListener( StrokeListener strokeListener );
+
+}

Copied: 
trunk/skycastle/modules/ui/src/main/java/org/skycastle/sketch/model/stroke/StrokeImpl.java
 (from rev 479, 
trunk/skycastle/modules/ui/src/main/java/org/skycastle/sketch/model/StrokeImpl.java)
===================================================================
--- 
trunk/skycastle/modules/ui/src/main/java/org/skycastle/sketch/model/stroke/StrokeImpl.java
                          (rev 0)
+++ 
trunk/skycastle/modules/ui/src/main/java/org/skycastle/sketch/model/stroke/StrokeImpl.java
  2008-04-26 15:20:43 UTC (rev 480)
@@ -0,0 +1,83 @@
+package org.skycastle.sketch.model.stroke;
+
+import org.skycastle.sketch.model.group.AbstractGroupElement;
+import org.skycastle.sketch.model.point.StrokePoint;
+import org.skycastle.util.ParameterChecker;
+import org.skycastle.util.listenable.collection.list.ListenableArrayList;
+import org.skycastle.util.listenable.collection.list.ListenableMutableList;
+
+import java.util.List;
+
+/**
+ * @author Hans Haggstrom
+ */
+public final class StrokeImpl
+        extends AbstractGroupElement
+        implements Stroke
+{
+
+    //======================================================================
+    // Private Fields
+
+    private final ListenableMutableList<StrokePoint> myPoints = new 
ListenableArrayList<StrokePoint>(
+            INITIAL_POINT_CAPACITY );
+
+    private StrokeListener myStrokeListener;
+
+    //======================================================================
+    // Private Constants
+
+    private static final int INITIAL_POINT_CAPACITY = 100;
+
+    //======================================================================
+    // Public Methods
+
+    //----------------------------------------------------------------------
+    // Stroke Implementation
+
+    public void addPoint( final StrokePoint addedPoint )
+    {
+        ParameterChecker.checkNotNull( addedPoint, "addedPoint" );
+        ParameterChecker.checkNotAlreadyContained( addedPoint, myPoints, 
"myPoints" );
+
+        myPoints.add( addedPoint );
+
+        if ( myStrokeListener != null )
+        {
+            myStrokeListener.onPointAdded( this, addedPoint );
+        }
+    }
+
+
+    public void removePoint( final StrokePoint removedPoint )
+    {
+        ParameterChecker.checkNotNull( removedPoint, "removedPoint" );
+        ParameterChecker.checkContained( removedPoint, myPoints, "myPoints" );
+
+        myPoints.remove( removedPoint );
+
+        if ( myStrokeListener != null )
+        {
+            myStrokeListener.onPointRemoved( this, removedPoint );
+        }
+    }
+
+
+    public List<StrokePoint> getPoints()
+    {
+        return myPoints.getReadOnlyList();
+    }
+
+
+    public StrokeListener getStrokeListener()
+    {
+        return myStrokeListener;
+    }
+
+
+    public void setStrokeListener( final StrokeListener strokeListener )
+    {
+        myStrokeListener = strokeListener;
+    }
+
+}

Added: 
trunk/skycastle/modules/ui/src/main/java/org/skycastle/sketch/model/stroke/StrokeListener.java
===================================================================
--- 
trunk/skycastle/modules/ui/src/main/java/org/skycastle/sketch/model/stroke/StrokeListener.java
                              (rev 0)
+++ 
trunk/skycastle/modules/ui/src/main/java/org/skycastle/sketch/model/stroke/StrokeListener.java
      2008-04-26 15:20:43 UTC (rev 480)
@@ -0,0 +1,29 @@
+package org.skycastle.sketch.model.stroke;
+
+import org.skycastle.sketch.model.point.StrokePoint;
+
+/**
+ * Listens to changes to {@link Stroke}s.
+ *
+ * @author Hans Häggström
+ */
+public interface StrokeListener
+{
+
+    /**
+     * Called when a point is added to a {@link Stroke}.
+     *
+     * @param stroke the {@link Stroke} in question.
+     * @param point  the point in question.
+     */
+    void onPointAdded( Stroke stroke, StrokePoint point );
+
+    /**
+     * Called when a point is removed from a {@link Stroke}.
+     *
+     * @param stroke the {@link Stroke} in question.
+     * @param point  the point in question.
+     */
+    void onPointRemoved( Stroke stroke, StrokePoint point );
+
+}

Copied: 
trunk/skycastle/modules/ui/src/test/java/org/skycastle/sketch/model/SketchModelTest.java
 (from rev 479, 
trunk/skycastle/modules/ui/src/test/java/org/skycastle/sketch/TestSketchModel.java)
===================================================================
--- 
trunk/skycastle/modules/ui/src/test/java/org/skycastle/sketch/model/SketchModelTest.java
                            (rev 0)
+++ 
trunk/skycastle/modules/ui/src/test/java/org/skycastle/sketch/model/SketchModelTest.java
    2008-04-26 15:20:43 UTC (rev 480)
@@ -0,0 +1,41 @@
+package org.skycastle.sketch.model;
+
+import junit.framework.TestCase;
+import org.skycastle.sketch.model.point.StrokePointImpl;
+import org.skycastle.sketch.model.sketch.Sketch;
+import org.skycastle.sketch.model.sketch.SketchImpl;
+import org.skycastle.sketch.model.stroke.Stroke;
+import org.skycastle.sketch.model.stroke.StrokeImpl;
+
+import java.awt.Color;
+
+/**
+ * @author Hans Häggström
+ */
+@SuppressWarnings( { "JavaDoc" } )
+public class SketchModelTest
+        extends TestCase
+{
+
+    //----------------------------------------------------------------------
+    // Test Methods
+
+    public void testCreateSketch()
+            throws Exception
+    {
+        final Sketch sketch = new SketchImpl();
+
+        final StrokeImpl stroke = new StrokeImpl();
+        sketch.getRootGroup().add( stroke );
+
+        final StrokePointImpl strokePoint = new StrokePointImpl( 10.0f, 20.0f 
);
+        stroke.addPoint( strokePoint );
+
+        strokePoint.setProperty( "foo", 23L );
+        strokePoint.setProperty( "bar", Color.RED );
+
+        final Stroke element = (Stroke) 
sketch.getRootGroup().getElements().get( 0 );
+        assertEquals( strokePoint, element.getPoints().get( 0 ) );
+    }
+
+}


This was sent by the SourceForge.net collaborative development platform, the 
world's largest Open Source development site.

Other related posts:

  • » [skycastle-commits] SF.net SVN: skycastle: [480] trunk/skycastle/modules/ui/src