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.