[skycastle-commits] SF.net SVN: skycastle: [451] trunk/skycastle/modules

  • From: zzorn@xxxxxxxxxxxxxxxxxxxxx
  • To: skycastle-commits@xxxxxxxxxxxxx
  • Date: Sat, 12 Apr 2008 14:31:48 -0700

Revision: 451
          http://skycastle.svn.sourceforge.net/skycastle/?rev=451&view=rev
Author:   zzorn
Date:     2008-04-12 14:31:47 -0700 (Sat, 12 Apr 2008)

Log Message:
-----------
Implemented a demo or test for the UI, implementing some functionality to get 
it working.

Modified Paths:
--------------
    
trunk/skycastle/modules/core/src/main/java/org/skycastle/core/ClientContext.java
    
trunk/skycastle/modules/core/src/main/java/org/skycastle/core/GameObjectContext.java
    
trunk/skycastle/modules/core/src/main/java/org/skycastle/core/ServerSideContext.java
    
trunk/skycastle/modules/ui/src/main/java/org/skycastle/ui/PropertyReference.java
    
trunk/skycastle/modules/ui/src/main/java/org/skycastle/ui/PropertyReferenceImpl.java
    
trunk/skycastle/modules/ui/src/main/java/org/skycastle/ui/PropertyReferenceListener.java
    trunk/skycastle/modules/ui/src/main/java/org/skycastle/ui/TextFieldUi.java

Added Paths:
-----------
    trunk/skycastle/modules/ui/src/main/java/org/skycastle/ui/ClientUi.java
    trunk/skycastle/modules/ui/src/main/java/org/skycastle/ui/PanelUi.java
    trunk/skycastle/modules/ui/src/main/java/org/skycastle/ui/SwingClientUi.java
    trunk/skycastle/modules/ui/src/main/java/org/skycastle/ui/example/
    
trunk/skycastle/modules/ui/src/main/java/org/skycastle/ui/example/UiDemo.java

Modified: 
trunk/skycastle/modules/core/src/main/java/org/skycastle/core/ClientContext.java
===================================================================
--- 
trunk/skycastle/modules/core/src/main/java/org/skycastle/core/ClientContext.java
    2008-04-10 12:48:52 UTC (rev 450)
+++ 
trunk/skycastle/modules/core/src/main/java/org/skycastle/core/ClientContext.java
    2008-04-12 21:31:47 UTC (rev 451)
@@ -97,6 +97,16 @@
         return myInGameClock_ms;
     }
 
+    public GameObject createGameObject()
+    {
+        final DefaultGameObject gameObject = new DefaultGameObject();
+        gameObject.setId( createGameObjectId( gameObject ) );
+
+        addGameObject( gameObject );
+
+        return gameObject;
+    }
+
     //----------------------------------------------------------------------
     // Other Public Methods
 

Modified: 
trunk/skycastle/modules/core/src/main/java/org/skycastle/core/GameObjectContext.java
===================================================================
--- 
trunk/skycastle/modules/core/src/main/java/org/skycastle/core/GameObjectContext.java
        2008-04-10 12:48:52 UTC (rev 450)
+++ 
trunk/skycastle/modules/core/src/main/java/org/skycastle/core/GameObjectContext.java
        2008-04-12 21:31:47 UTC (rev 451)
@@ -43,4 +43,11 @@
      */
     long getCurrentGameTime_ms();
 
+    /**
+     * Creates a new default game object, registers it with the {@link 
GameObjectContext}, and returns it for
+     * reading and writing.
+     *
+     * @return the created game object.  Can be read and written to.
+     */
+    GameObject createGameObject();
 }

Modified: 
trunk/skycastle/modules/core/src/main/java/org/skycastle/core/ServerSideContext.java
===================================================================
--- 
trunk/skycastle/modules/core/src/main/java/org/skycastle/core/ServerSideContext.java
        2008-04-10 12:48:52 UTC (rev 450)
+++ 
trunk/skycastle/modules/core/src/main/java/org/skycastle/core/ServerSideContext.java
        2008-04-12 21:31:47 UTC (rev 451)
@@ -64,4 +64,9 @@
         throw new UnsupportedOperationException( "This method has not yet been 
implemented." ); // IMPLEMENT
     }
 
+    public GameObject createGameObject()
+    {
+        throw new UnsupportedOperationException( "This method has not yet been 
implemented." ); // IMPLEMENT
+    }
+
 }

Added: trunk/skycastle/modules/ui/src/main/java/org/skycastle/ui/ClientUi.java
===================================================================
--- trunk/skycastle/modules/ui/src/main/java/org/skycastle/ui/ClientUi.java     
                        (rev 0)
+++ trunk/skycastle/modules/ui/src/main/java/org/skycastle/ui/ClientUi.java     
2008-04-12 21:31:47 UTC (rev 451)
@@ -0,0 +1,28 @@
+package org.skycastle.ui;
+
+/**
+ * An interface for the main client UI that contains the main window.
+ *
+ * @author Hans Haggstrom
+ */
+// TODO: Multi head / window support by allowing creation of multiple windows? 
 Would allow for different sized monitors.
+public interface ClientUi
+{
+
+    /**
+     * Creates the main window and shows it.
+     * Also starts the main client game loop.
+     */
+    void start();
+
+    /**
+     * Closes down the UI and the main client loop.
+     */
+    void stop();
+
+    /**
+     * @param rootUi the topmost UI to show in the main window.
+     */
+    void setRootUi( UiObject rootUi );
+
+}

Added: trunk/skycastle/modules/ui/src/main/java/org/skycastle/ui/PanelUi.java
===================================================================
--- trunk/skycastle/modules/ui/src/main/java/org/skycastle/ui/PanelUi.java      
                        (rev 0)
+++ trunk/skycastle/modules/ui/src/main/java/org/skycastle/ui/PanelUi.java      
2008-04-12 21:31:47 UTC (rev 451)
@@ -0,0 +1,28 @@
+package org.skycastle.ui;
+
+import javax.swing.*;
+
+/**
+ * A panel that can hold other UI objects.
+ *
+ * @author Hans Haggstrom
+ */
+public class PanelUi
+        extends UiObject
+{
+
+    //======================================================================
+    // Private Constants
+
+    private static final long serialVersionUID = 1L;
+
+    //======================================================================
+    // Protected Methods
+
+    @Override
+    protected JComponent createUi()
+    {
+        throw new UnsupportedOperationException( "This method has not yet been 
implemented." ); // IMPLEMENT
+    }
+
+}

Modified: 
trunk/skycastle/modules/ui/src/main/java/org/skycastle/ui/PropertyReference.java
===================================================================
--- 
trunk/skycastle/modules/ui/src/main/java/org/skycastle/ui/PropertyReference.java
    2008-04-10 12:48:52 UTC (rev 450)
+++ 
trunk/skycastle/modules/ui/src/main/java/org/skycastle/ui/PropertyReference.java
    2008-04-12 21:31:47 UTC (rev 451)
@@ -43,7 +43,7 @@
     /**
      * @return true if there actually is some refered property, false if it is 
not found.
      */
-    boolean isReferenceExisting();
+    boolean isAvailable();
 
     /**
      * @return metadata for the property.

Modified: 
trunk/skycastle/modules/ui/src/main/java/org/skycastle/ui/PropertyReferenceImpl.java
===================================================================
--- 
trunk/skycastle/modules/ui/src/main/java/org/skycastle/ui/PropertyReferenceImpl.java
        2008-04-10 12:48:52 UTC (rev 450)
+++ 
trunk/skycastle/modules/ui/src/main/java/org/skycastle/ui/PropertyReferenceImpl.java
        2008-04-12 21:31:47 UTC (rev 451)
@@ -1,9 +1,15 @@
 package org.skycastle.ui;
 
+import org.skycastle.core.GameContext;
+import org.skycastle.core.GameObject;
 import org.skycastle.core.GameObjectId;
+import org.skycastle.util.ParameterChecker;
 import org.skycastle.util.parameters.ParameterMetadata;
 import org.skycastle.util.parameters.ParameterValidationException;
 
+import java.util.HashSet;
+import java.util.Set;
+
 /**
  * @author Hans Haggstrom
  */
@@ -12,6 +18,14 @@
 {
 
     //======================================================================
+    // Private Fields
+
+    private final Set<PropertyReferenceListener> myListeners = new 
HashSet<PropertyReferenceListener>( 4 );
+
+    private GameObjectId myGameObjectId;
+    private String myPropertyIdentifier;
+
+    //======================================================================
     // Private Constants
 
     private static final long serialVersionUID = 1L;
@@ -34,7 +48,10 @@
 
     public void setReference( final GameObjectId gameObjectId, final String 
propertyIdentifier )
     {
-        throw new UnsupportedOperationException( "This method has not yet been 
implemented." ); // IMPLEMENT
+        myGameObjectId = gameObjectId;
+        myPropertyIdentifier = propertyIdentifier;
+
+        notifyPropertyChanged();
     }
 
     public void clearReference()
@@ -42,14 +59,32 @@
         throw new UnsupportedOperationException( "This method has not yet been 
implemented." ); // IMPLEMENT
     }
 
-    public boolean isReferenceExisting()
+    public boolean isAvailable()
     {
-        throw new UnsupportedOperationException( "This method has not yet been 
implemented." ); // IMPLEMENT
+        final GameObject gameObject = 
GameContext.getGameObjectContext().getGameObjectById( myGameObjectId, false );
+
+        if ( gameObject == null )
+        {
+            return false;
+        }
+        else
+        {
+            return ( gameObject.hasProperty( myPropertyIdentifier ) );
+        }
     }
 
     public ParameterMetadata getPropertyMetadata()
     {
-        throw new UnsupportedOperationException( "This method has not yet been 
implemented." ); // IMPLEMENT
+        final GameObject gameObject = 
GameContext.getGameObjectContext().getGameObjectById( myGameObjectId, false );
+
+        if ( gameObject == null )
+        {
+            return null;
+        }
+        else
+        {
+            return ( gameObject.getPropertyMetadata( myPropertyIdentifier ) );
+        }
     }
 
     public void setProperty( final GameObjectId caller, final Object value )
@@ -60,22 +95,59 @@
 
     public <T> T getProperty( final GameObjectId caller, final Class<T> 
expectedType, final T defaultValue )
     {
-        throw new UnsupportedOperationException( "This method has not yet been 
implemented." ); // IMPLEMENT
+        final GameObject gameObject = 
GameContext.getGameObjectContext().getGameObjectById( myGameObjectId, false );
+
+        if ( gameObject == null )
+        {
+            return defaultValue;
+        }
+        else
+        {
+            return ( gameObject.getPropertyValue( myPropertyIdentifier, 
defaultValue ) );
+        }
     }
 
     public void addChangeListener( final PropertyReferenceListener listener )
     {
-        throw new UnsupportedOperationException( "This method has not yet been 
implemented." ); // IMPLEMENT
+        ParameterChecker.checkNotNull( listener, "listener" );
+        ParameterChecker.checkNotAlreadyContained( listener, myListeners, 
"myListeners" );
+
+        myListeners.add( listener );
     }
 
     public void removeChangeListener( final PropertyReferenceListener listener 
)
     {
-        throw new UnsupportedOperationException( "This method has not yet been 
implemented." ); // IMPLEMENT
+        ParameterChecker.checkNotNull( listener, "listener" );
+        ParameterChecker.checkContained( listener, myListeners, "myListeners" 
);
+
+        myListeners.remove( listener );
     }
 
+
     public boolean isEditable()
     {
-        throw new UnsupportedOperationException( "This method has not yet been 
implemented." ); // IMPLEMENT
+        // TODO: Find out edit rights of current user for this property...
+        return false;
+
+        /*
+        final ParameterMetadata propertyMetadata = getPropertyMetadata();
+
+        if ( propertyMetadata != null )
+        {
+            propertyMetadata.;
+        }
+        */
     }
 
+    //======================================================================
+    // Private Methods
+
+    private void notifyPropertyChanged()
+    {
+        for ( PropertyReferenceListener listener : myListeners )
+        {
+            listener.onPropertyChanged( this );
+        }
+    }
+
 }

Modified: 
trunk/skycastle/modules/ui/src/main/java/org/skycastle/ui/PropertyReferenceListener.java
===================================================================
--- 
trunk/skycastle/modules/ui/src/main/java/org/skycastle/ui/PropertyReferenceListener.java
    2008-04-10 12:48:52 UTC (rev 450)
+++ 
trunk/skycastle/modules/ui/src/main/java/org/skycastle/ui/PropertyReferenceListener.java
    2008-04-12 21:31:47 UTC (rev 451)
@@ -1,7 +1,5 @@
 package org.skycastle.ui;
 
-import org.skycastle.util.parameters.ParameterMetadata;
-
 /**
  * A listener that is notified of property value changes.
  *
@@ -9,17 +7,16 @@
  */
 public interface PropertyReferenceListener
 {
-    void onPropertyValueChange( Object newValue );
-
-    void onPropertyMetadataChanged( ParameterMetadata newMetadata );
-
     /**
-     * Called when the property is no longer available.
+     * Called when the value of the property changed.
+     *
+     * @param propertyReference
      */
-    void onPropertyDissappeared();
+    void onPropertyValueChange( PropertyReference propertyReference );
 
     /**
-     * Called when a new property is available.
+     * Called when there was a larger change to the property.  The 
availability, metadata, and value may have changed.
      */
-    void onPropertyAppeared( ParameterMetadata parameterMetadata, Object 
parameterValue, boolean editable );
+    void onPropertyChanged( PropertyReference propertyReference );
+
 }

Added: 
trunk/skycastle/modules/ui/src/main/java/org/skycastle/ui/SwingClientUi.java
===================================================================
--- 
trunk/skycastle/modules/ui/src/main/java/org/skycastle/ui/SwingClientUi.java    
                            (rev 0)
+++ 
trunk/skycastle/modules/ui/src/main/java/org/skycastle/ui/SwingClientUi.java    
    2008-04-12 21:31:47 UTC (rev 451)
@@ -0,0 +1,75 @@
+package org.skycastle.ui;
+
+import javax.swing.*;
+import java.awt.Dimension;
+
+/**
+ * A Swing based implementation of {@link ClientUi}.
+ *
+ * @author Hans Haggstrom
+ */
+public class SwingClientUi
+        implements ClientUi
+{
+
+    //======================================================================
+    // Private Fields
+
+    private JFrame myMainFrame;
+    private UiObject myRootUi;
+    private static final Dimension DEFAULT_SIZE = new Dimension( 800, 600 );
+    private JPanel myRootPanel;
+
+    //======================================================================
+    // Public Methods
+
+    //----------------------------------------------------------------------
+    // ClientUi Implementation
+
+    public void start()
+    {
+        myMainFrame = new JFrame( "Skycastle Client" );
+
+        // DEBUG:  In the future have a separate close handler that treats 
closing as an event call?
+        myMainFrame.setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE );
+
+        myMainFrame.setVisible( true );
+
+        myRootPanel = new JPanel();
+        myRootPanel.setPreferredSize( DEFAULT_SIZE );
+        myMainFrame.getContentPane().add( myRootPanel );
+
+        myMainFrame.pack();
+
+        if ( myRootUi != null )
+        {
+            myRootPanel.add( myRootUi.getUi() );
+        }
+    }
+
+    public void stop()
+    {
+        myMainFrame.setVisible( false );
+
+        // DEBUG: Maybe implement in other way later?
+        System.exit( 0 );
+    }
+
+    public void setRootUi( final UiObject rootUi )
+    {
+        if ( myMainFrame != null &&
+             myRootUi != null )
+        {
+            myRootPanel.remove( myRootUi.getUi() );
+        }
+
+        myRootUi = rootUi;
+
+        if ( myMainFrame != null &&
+             myRootUi != null )
+        {
+            myRootPanel.add( myRootUi.getUi() );
+        }
+    }
+
+}

Modified: 
trunk/skycastle/modules/ui/src/main/java/org/skycastle/ui/TextFieldUi.java
===================================================================
--- trunk/skycastle/modules/ui/src/main/java/org/skycastle/ui/TextFieldUi.java  
2008-04-10 12:48:52 UTC (rev 450)
+++ trunk/skycastle/modules/ui/src/main/java/org/skycastle/ui/TextFieldUi.java  
2008-04-12 21:31:47 UTC (rev 451)
@@ -26,49 +26,36 @@
     private JTextField myTextField;
 
     //======================================================================
+    // Public Methods
+
+    public PropertyReference getPropertyReference()
+    {
+        return myPropertyReference;
+    }
+
+    //======================================================================
     // Protected Methods
 
     @Override
     protected JComponent createUi()
     {
-        myTextField = new JTextField();
+        myTextField = new JTextField( 20 );
 
         myPropertyReference.addChangeListener( new PropertyReferenceListener()
         {
 
-            public void onPropertyValueChange( final Object newValue )
+            public void onPropertyValueChange( final PropertyReference 
propertyReference )
             {
                 // TODO: Only update the text field if it is not currently 
being actively edited?
 
-                updateValue( newValue );
+                updateValue();
             }
 
-
-            public void onPropertyMetadataChanged( final ParameterMetadata 
newMetadata )
+            public void onPropertyChanged( final PropertyReference 
propertyReference )
             {
-                updateDescription( newMetadata );
+                update();
             }
 
-
-            public void onPropertyDissappeared()
-            {
-                myTextField.setEditable( false );
-                myTextField.setEnabled( false );
-
-                updateValue( null );
-                updateDescription( null );
-            }
-
-
-            public void onPropertyAppeared( final ParameterMetadata 
parameterMetadata, final Object parameterValue, final boolean editable )
-            {
-                myTextField.setEditable( editable );
-                myTextField.setEnabled( true );
-
-                updateValue( parameterValue );
-                updateDescription( parameterMetadata );
-            }
-
         } );
 
         // TODO: Check for correctness while the field is being edited
@@ -97,36 +84,41 @@
 
         } );
 
+        update();
 
         return myTextField;
     }
 
+    private void update()
+    {
+        myTextField.setEditable( myPropertyReference.isAvailable() &&
+                                 myPropertyReference.isEditable() );
+        myTextField.setEnabled( myPropertyReference.isAvailable() );
+
+        updateValue();
+        updateDescription();
+    }
+
     //======================================================================
     // Private Methods
 
-    private void updateDescription( final ParameterMetadata parameterMetadata )
+    private void updateDescription()
     {
-        if ( parameterMetadata != null )
+        final ParameterMetadata propertyMetadata = 
myPropertyReference.getPropertyMetadata();
+        if ( propertyMetadata != null )
         {
-            myTextField.setToolTipText( 
parameterMetadata.getUiMetadata().getDescription() );
+            myTextField.setToolTipText( 
propertyMetadata.getUiMetadata().getDescription() );
         }
         else
         {
-            myTextField.setToolTipText( "" );
+            myTextField.setToolTipText( null );
         }
     }
 
 
-    private void updateValue( final Object parameterValue )
+    private void updateValue()
     {
-        if ( parameterValue != null )
-        {
-            myTextField.setText( parameterValue.toString() );
-        }
-        else
-        {
-            myTextField.setText( "" );
-        }
+        myTextField.setText( String.valueOf( myPropertyReference.getProperty( 
getId(), Object.class, " " ) ) );
     }
 
 }

Added: 
trunk/skycastle/modules/ui/src/main/java/org/skycastle/ui/example/UiDemo.java
===================================================================
--- 
trunk/skycastle/modules/ui/src/main/java/org/skycastle/ui/example/UiDemo.java   
                            (rev 0)
+++ 
trunk/skycastle/modules/ui/src/main/java/org/skycastle/ui/example/UiDemo.java   
    2008-04-12 21:31:47 UTC (rev 451)
@@ -0,0 +1,48 @@
+package org.skycastle.ui.example;
+
+import org.skycastle.core.ClientContext;
+import org.skycastle.core.GameContext;
+import org.skycastle.core.GameObject;
+import org.skycastle.core.GameObjectContext;
+import org.skycastle.ui.ClientUi;
+import org.skycastle.ui.SwingClientUi;
+import org.skycastle.ui.TextFieldUi;
+import org.skycastle.util.parameters.ParameterValidationException;
+
+/**
+ * Builds up an UI from the UiObjects by instantiating them directly.
+ *
+ * @author Hans Haggstrom
+ */
+public class UiDemo
+{
+
+    //----------------------------------------------------------------------
+    // Main Method
+
+    public static void main( String[] args )
+    {
+        GameContext.setGameObjectContext( new ClientContext() );
+        final GameObjectContext context = GameContext.getGameObjectContext();
+
+        ClientUi swingClientUi = new SwingClientUi();
+
+        final TextFieldUi textFieldUi = new TextFieldUi();
+
+
+        GameObject gameObject = context.createGameObject();
+        try
+        {
+            gameObject.addProperty( "hp", 10, "Hitpoints" );
+        }
+        catch ( ParameterValidationException e )
+        {
+            e.printStackTrace();  //To change body of catch statement use File 
| Settings | File Templates.
+        }
+        textFieldUi.getPropertyReference().setReference( gameObject.getId(), 
"hp" );
+        swingClientUi.setRootUi( textFieldUi );
+
+        swingClientUi.start();
+    }
+
+}


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: [451] trunk/skycastle/modules