diff --git a/9781430236146.jpg b/9781430236146.jpg new file mode 100644 index 0000000..1560691 Binary files /dev/null and b/9781430236146.jpg differ diff --git a/BookSourceCode/.DS_Store b/BookSourceCode/.DS_Store new file mode 100644 index 0000000..acbe96b Binary files /dev/null and b/BookSourceCode/.DS_Store differ diff --git a/BookSourceCode/.project b/BookSourceCode/.project new file mode 100644 index 0000000..6f79dfc --- /dev/null +++ b/BookSourceCode/.project @@ -0,0 +1,17 @@ + + + BookSourceCode + + + + + + com.powerflasher.fdt.core.FlashBuilder + + + + + + com.powerflasher.fdt.core.FlashNature + + diff --git a/BookSourceCode/.settings/com.powerflasher.fdt.classpath b/BookSourceCode/.settings/com.powerflasher.fdt.classpath new file mode 100644 index 0000000..5d9d8f1 --- /dev/null +++ b/BookSourceCode/.settings/com.powerflasher.fdt.classpath @@ -0,0 +1,13 @@ + + + libs + src + libs/MarioAssets.swc + libs/CommandPatternBin.swc + frameworks/libs/player/{playerVersion}/playerglobal.swc + frameworks/libs/flex.swc + libs/greensock.swc + libs/SimpleMCAnimation.swc + libs/MVCBin.swc + libs/FactoryMethodBin.swc + diff --git a/BookSourceCode/.settings/com.powerflasher.fdt.core.prefs b/BookSourceCode/.settings/com.powerflasher.fdt.core.prefs new file mode 100644 index 0000000..67d4e95 --- /dev/null +++ b/BookSourceCode/.settings/com.powerflasher.fdt.core.prefs @@ -0,0 +1,15 @@ +#Sun Sep 25 10:59:01 EDT 2011 +com.powerflasher.fdt.core.CompatiblePlayers=External_SWF_Viewer\:Browser\:Standalone_Flash_Player +com.powerflasher.fdt.core.CompilerArguments=-static-link-runtime-shared-libraries\=true\n-target-player\={playerVersion}\n-library-path+\="{flexSDK}/frameworks/locale/en_US"\n-default-size\=550,400 +com.powerflasher.fdt.core.DefaultOutputFolder=bin +com.powerflasher.fdt.core.DefaultPlayer=External_SWF_Viewer +com.powerflasher.fdt.core.Language=AS3 +com.powerflasher.fdt.core.PassClasspath=true +com.powerflasher.fdt.core.PassMainclass=true +com.powerflasher.fdt.core.PassRsls=false +com.powerflasher.fdt.core.PassSwcs=true +com.powerflasher.fdt.core.PlayerVersion=10.0 +com.powerflasher.fdt.core.ProjectTypeHint=AS 3 +com.powerflasher.fdt.core.Runtime=Flash_Player +com.powerflasher.fdt.core.SdkName=Flex 4.0 +eclipse.preferences.version=1 diff --git a/BookSourceCode/.settings/launch/APauseConductor.launch b/BookSourceCode/.settings/launch/APauseConductor.launch new file mode 100644 index 0000000..83bfef7 --- /dev/null +++ b/BookSourceCode/.settings/launch/APauseConductor.launch @@ -0,0 +1,25 @@ + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/BookSourceCode/.settings/launch/Adapter (1).launch b/BookSourceCode/.settings/launch/Adapter (1).launch new file mode 100644 index 0000000..54f28b3 --- /dev/null +++ b/BookSourceCode/.settings/launch/Adapter (1).launch @@ -0,0 +1,30 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/BookSourceCode/.settings/launch/ArrayIterator.launch b/BookSourceCode/.settings/launch/ArrayIterator.launch new file mode 100644 index 0000000..1820f5b --- /dev/null +++ b/BookSourceCode/.settings/launch/ArrayIterator.launch @@ -0,0 +1,25 @@ + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/BookSourceCode/.settings/launch/Builder.launch b/BookSourceCode/.settings/launch/Builder.launch new file mode 100644 index 0000000..4ae738c --- /dev/null +++ b/BookSourceCode/.settings/launch/Builder.launch @@ -0,0 +1,25 @@ + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/BookSourceCode/.settings/launch/ChainOfResponsibility.launch b/BookSourceCode/.settings/launch/ChainOfResponsibility.launch new file mode 100644 index 0000000..ac75dc6 --- /dev/null +++ b/BookSourceCode/.settings/launch/ChainOfResponsibility.launch @@ -0,0 +1,25 @@ + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/BookSourceCode/.settings/launch/CommandExample.launch b/BookSourceCode/.settings/launch/CommandExample.launch new file mode 100644 index 0000000..12b7285 --- /dev/null +++ b/BookSourceCode/.settings/launch/CommandExample.launch @@ -0,0 +1,25 @@ + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/BookSourceCode/.settings/launch/CompositePattern (1).launch b/BookSourceCode/.settings/launch/CompositePattern (1).launch new file mode 100644 index 0000000..85ec986 --- /dev/null +++ b/BookSourceCode/.settings/launch/CompositePattern (1).launch @@ -0,0 +1,30 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/BookSourceCode/.settings/launch/ContactForm.launch b/BookSourceCode/.settings/launch/ContactForm.launch new file mode 100644 index 0000000..48a17ee --- /dev/null +++ b/BookSourceCode/.settings/launch/ContactForm.launch @@ -0,0 +1,30 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/BookSourceCode/.settings/launch/Decorator (1).launch b/BookSourceCode/.settings/launch/Decorator (1).launch new file mode 100644 index 0000000..ee29ea3 --- /dev/null +++ b/BookSourceCode/.settings/launch/Decorator (1).launch @@ -0,0 +1,25 @@ + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/BookSourceCode/.settings/launch/DocumentClass (10).launch b/BookSourceCode/.settings/launch/DocumentClass (10).launch new file mode 100644 index 0000000..491716c --- /dev/null +++ b/BookSourceCode/.settings/launch/DocumentClass (10).launch @@ -0,0 +1,25 @@ + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/BookSourceCode/.settings/launch/DocumentClass (11).launch b/BookSourceCode/.settings/launch/DocumentClass (11).launch new file mode 100644 index 0000000..08d1ede --- /dev/null +++ b/BookSourceCode/.settings/launch/DocumentClass (11).launch @@ -0,0 +1,25 @@ + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/BookSourceCode/.settings/launch/DocumentClass (12).launch b/BookSourceCode/.settings/launch/DocumentClass (12).launch new file mode 100644 index 0000000..c0c95fb --- /dev/null +++ b/BookSourceCode/.settings/launch/DocumentClass (12).launch @@ -0,0 +1,25 @@ + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/BookSourceCode/.settings/launch/DocumentClass (5).launch b/BookSourceCode/.settings/launch/DocumentClass (5).launch new file mode 100644 index 0000000..7eb74cf --- /dev/null +++ b/BookSourceCode/.settings/launch/DocumentClass (5).launch @@ -0,0 +1,25 @@ + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/BookSourceCode/.settings/launch/DocumentClass (6).launch b/BookSourceCode/.settings/launch/DocumentClass (6).launch new file mode 100644 index 0000000..c83572b --- /dev/null +++ b/BookSourceCode/.settings/launch/DocumentClass (6).launch @@ -0,0 +1,25 @@ + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/BookSourceCode/.settings/launch/DocumentClass (7).launch b/BookSourceCode/.settings/launch/DocumentClass (7).launch new file mode 100644 index 0000000..299a39a --- /dev/null +++ b/BookSourceCode/.settings/launch/DocumentClass (7).launch @@ -0,0 +1,25 @@ + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/BookSourceCode/.settings/launch/DocumentClass (8).launch b/BookSourceCode/.settings/launch/DocumentClass (8).launch new file mode 100644 index 0000000..f19308a --- /dev/null +++ b/BookSourceCode/.settings/launch/DocumentClass (8).launch @@ -0,0 +1,30 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/BookSourceCode/.settings/launch/DocumentClass (9).launch b/BookSourceCode/.settings/launch/DocumentClass (9).launch new file mode 100644 index 0000000..d893615 --- /dev/null +++ b/BookSourceCode/.settings/launch/DocumentClass (9).launch @@ -0,0 +1,30 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/BookSourceCode/.settings/launch/FactoryMethod (1).launch b/BookSourceCode/.settings/launch/FactoryMethod (1).launch new file mode 100644 index 0000000..d064f0d --- /dev/null +++ b/BookSourceCode/.settings/launch/FactoryMethod (1).launch @@ -0,0 +1,25 @@ + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/BookSourceCode/.settings/launch/ObserverPattern (1).launch b/BookSourceCode/.settings/launch/ObserverPattern (1).launch new file mode 100644 index 0000000..ffb4399 --- /dev/null +++ b/BookSourceCode/.settings/launch/ObserverPattern (1).launch @@ -0,0 +1,25 @@ + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/BookSourceCode/.settings/launch/Strategy.launch b/BookSourceCode/.settings/launch/Strategy.launch new file mode 100644 index 0000000..53795c8 --- /dev/null +++ b/BookSourceCode/.settings/launch/Strategy.launch @@ -0,0 +1,30 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/BookSourceCode/.settings/launch/Styler.launch b/BookSourceCode/.settings/launch/Styler.launch new file mode 100644 index 0000000..ad21156 --- /dev/null +++ b/BookSourceCode/.settings/launch/Styler.launch @@ -0,0 +1,25 @@ + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/BookSourceCode/.settings/launch/TheIterator (1).launch b/BookSourceCode/.settings/launch/TheIterator (1).launch new file mode 100644 index 0000000..7801dd7 --- /dev/null +++ b/BookSourceCode/.settings/launch/TheIterator (1).launch @@ -0,0 +1,25 @@ + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/BookSourceCode/.settings/org.eclipse.core.resources.prefs b/BookSourceCode/.settings/org.eclipse.core.resources.prefs new file mode 100644 index 0000000..e5102bf --- /dev/null +++ b/BookSourceCode/.settings/org.eclipse.core.resources.prefs @@ -0,0 +1,3 @@ +#Sun Sep 25 10:59:01 EDT 2011 +eclipse.preferences.version=1 +encoding/=UTF-8 diff --git a/BookSourceCode/bin/APauseConductor.swf b/BookSourceCode/bin/APauseConductor.swf new file mode 100644 index 0000000..d88577d Binary files /dev/null and b/BookSourceCode/bin/APauseConductor.swf differ diff --git a/BookSourceCode/bin/Adapter.swf b/BookSourceCode/bin/Adapter.swf new file mode 100644 index 0000000..7c33215 Binary files /dev/null and b/BookSourceCode/bin/Adapter.swf differ diff --git a/BookSourceCode/bin/AdapterPatternBin.fla b/BookSourceCode/bin/AdapterPatternBin.fla new file mode 100644 index 0000000..a6974e9 Binary files /dev/null and b/BookSourceCode/bin/AdapterPatternBin.fla differ diff --git a/BookSourceCode/bin/ArrayIterator.swf b/BookSourceCode/bin/ArrayIterator.swf new file mode 100644 index 0000000..4576c96 Binary files /dev/null and b/BookSourceCode/bin/ArrayIterator.swf differ diff --git a/BookSourceCode/bin/CommandPatternBin.fla b/BookSourceCode/bin/CommandPatternBin.fla new file mode 100644 index 0000000..f94b3fb Binary files /dev/null and b/BookSourceCode/bin/CommandPatternBin.fla differ diff --git a/BookSourceCode/bin/CompositePattern.swf b/BookSourceCode/bin/CompositePattern.swf new file mode 100644 index 0000000..27c01f6 Binary files /dev/null and b/BookSourceCode/bin/CompositePattern.swf differ diff --git a/BookSourceCode/bin/Decorator.swf b/BookSourceCode/bin/Decorator.swf new file mode 100644 index 0000000..bde3062 Binary files /dev/null and b/BookSourceCode/bin/Decorator.swf differ diff --git a/BookSourceCode/bin/DocumentClass.swf b/BookSourceCode/bin/DocumentClass.swf new file mode 100644 index 0000000..53cf6d0 Binary files /dev/null and b/BookSourceCode/bin/DocumentClass.swf differ diff --git a/BookSourceCode/bin/FactoryMethod.swf b/BookSourceCode/bin/FactoryMethod.swf new file mode 100644 index 0000000..4a6ce94 Binary files /dev/null and b/BookSourceCode/bin/FactoryMethod.swf differ diff --git a/BookSourceCode/bin/FactoryMethodBin.fla b/BookSourceCode/bin/FactoryMethodBin.fla new file mode 100644 index 0000000..5c66808 Binary files /dev/null and b/BookSourceCode/bin/FactoryMethodBin.fla differ diff --git a/BookSourceCode/bin/FactoryMethodBin.swf b/BookSourceCode/bin/FactoryMethodBin.swf new file mode 100644 index 0000000..cc9b0e2 Binary files /dev/null and b/BookSourceCode/bin/FactoryMethodBin.swf differ diff --git a/BookSourceCode/bin/MVCBin.fla b/BookSourceCode/bin/MVCBin.fla new file mode 100644 index 0000000..02e45d7 Binary files /dev/null and b/BookSourceCode/bin/MVCBin.fla differ diff --git a/BookSourceCode/bin/MVCBin.swf b/BookSourceCode/bin/MVCBin.swf new file mode 100644 index 0000000..0d07d9c Binary files /dev/null and b/BookSourceCode/bin/MVCBin.swf differ diff --git a/BookSourceCode/bin/Styler.swf b/BookSourceCode/bin/Styler.swf new file mode 100644 index 0000000..3bba702 Binary files /dev/null and b/BookSourceCode/bin/Styler.swf differ diff --git a/BookSourceCode/bin/SwimmingWithTheDolphins.flv b/BookSourceCode/bin/SwimmingWithTheDolphins.flv new file mode 100644 index 0000000..8b20fb5 Binary files /dev/null and b/BookSourceCode/bin/SwimmingWithTheDolphins.flv differ diff --git a/BookSourceCode/bin/music.mp3 b/BookSourceCode/bin/music.mp3 new file mode 100644 index 0000000..809f939 Binary files /dev/null and b/BookSourceCode/bin/music.mp3 differ diff --git a/BookSourceCode/css/Generic.css b/BookSourceCode/css/Generic.css new file mode 100644 index 0000000..24dd36c --- /dev/null +++ b/BookSourceCode/css/Generic.css @@ -0,0 +1,3 @@ +.body{ +font-family:Arial; +} \ No newline at end of file diff --git a/BookSourceCode/libs/CommandPatternBin.swc b/BookSourceCode/libs/CommandPatternBin.swc new file mode 100644 index 0000000..cbcde17 Binary files /dev/null and b/BookSourceCode/libs/CommandPatternBin.swc differ diff --git a/BookSourceCode/libs/FactoryMethodBin.swc b/BookSourceCode/libs/FactoryMethodBin.swc new file mode 100644 index 0000000..c7ed0eb Binary files /dev/null and b/BookSourceCode/libs/FactoryMethodBin.swc differ diff --git a/BookSourceCode/libs/MVCBin.swc b/BookSourceCode/libs/MVCBin.swc new file mode 100644 index 0000000..3a9585e Binary files /dev/null and b/BookSourceCode/libs/MVCBin.swc differ diff --git a/BookSourceCode/libs/MarioAssets.swc b/BookSourceCode/libs/MarioAssets.swc new file mode 100644 index 0000000..4fa65ca Binary files /dev/null and b/BookSourceCode/libs/MarioAssets.swc differ diff --git a/BookSourceCode/libs/SimpleMCAnimation.swc b/BookSourceCode/libs/SimpleMCAnimation.swc new file mode 100644 index 0000000..ead9e52 Binary files /dev/null and b/BookSourceCode/libs/SimpleMCAnimation.swc differ diff --git a/BookSourceCode/libs/greensock.swc b/BookSourceCode/libs/greensock.swc new file mode 100644 index 0000000..fd51bf0 Binary files /dev/null and b/BookSourceCode/libs/greensock.swc differ diff --git a/BookSourceCode/src/chapter_eight/adapter/DocumentClass.as b/BookSourceCode/src/chapter_eight/adapter/DocumentClass.as new file mode 100644 index 0000000..9781b5e --- /dev/null +++ b/BookSourceCode/src/chapter_eight/adapter/DocumentClass.as @@ -0,0 +1,55 @@ +package chapter_eight.adapter +{ + import chapter_eight.adapter.conductors.PauseConductor; + import chapter_eight.adapter.adapters.AudioDecoratorIPauseAdapter; + import chapter_eight.adapter.adapters.MChasStartStop; + import chapter_eight.adapter.conductors.abstractions.APauseConductor; + import chapter_eight.decorator.abstraction.ASoundDecorator.Audible; + import chapter_eight.decorator.concretes.InfiniteLoopDecorator; + import chapter_eight.decorator.concretes.PauseableAudibleDecorator; + import chapter_eight.decorator.interfaces.ISound; + import flash.display.MovieClip; + import flash.display.Sprite; + import flash.events.MouseEvent; + import flash.net.URLRequest; + + + public class DocumentClass extends Sprite + { + private var _isPlaying : Boolean = false + var sound : ISound + var pauseconductor : APauseConductor + + public function DocumentClass() + { + sound = new Audible( new URLRequest( "music.mp3" ) ); + sound = new InfiniteLoopDecorator( sound ); + sound = new PauseableAudibleDecorator( sound ); + sound.play() + + var mc : MovieClip = new SimpleMCAnimation(); + addChild( mc ) + + var mcMinimialPauseAdaption : IPause = new MChasStartStop( mc ) + var soundMinimialPauseAdaption : IPause = new AudioDecoratorIPauseAdapter( PauseableAudibleDecorator( sound ) ) + + pauseconductor = new PauseConductor() + pauseconductor.addElement( soundMinimialPauseAdaption ) + pauseconductor.addElement( mcMinimialPauseAdaption ) + stage.addEventListener( MouseEvent.MOUSE_DOWN , onDown ) + } + + private function onDown( event : MouseEvent ) : void + { + _isPlaying = !_isPlaying; + if (_isPlaying) + { + pauseconductor.pause() + } + else + { + pauseconductor.resume() + } + } + } +} \ No newline at end of file diff --git a/BookSourceCode/src/chapter_eight/adapter/IPause.as b/BookSourceCode/src/chapter_eight/adapter/IPause.as new file mode 100644 index 0000000..aba40e5 --- /dev/null +++ b/BookSourceCode/src/chapter_eight/adapter/IPause.as @@ -0,0 +1,11 @@ +package chapter_eight.adapter +{ + /** + * @author Ben Smith + */ + public interface IPause + { + function pause():void + function resume():void + } +} diff --git a/BookSourceCode/src/chapter_eight/adapter/adapters/AudibleIPauseAdapter.as b/BookSourceCode/src/chapter_eight/adapter/adapters/AudibleIPauseAdapter.as new file mode 100644 index 0000000..ade4fd3 --- /dev/null +++ b/BookSourceCode/src/chapter_eight/adapter/adapters/AudibleIPauseAdapter.as @@ -0,0 +1,30 @@ +package chapter_eight.adapter.adapters +{ + import chapter_eight.adapter.IPause; + import chapter_eight.decorator.concretes.PauseableAudibleDecorator; + import chapter_eight.decorator.interfaces.ISound; + + /** + * @author Ben Smith + */ + public class AudibleIPauseAdapter extends PauseableAudibleDecorator implements IPause + { + public function AudibleIPauseAdapter( snd : ISound ) + { + super( snd ); + } + + public function pause() : void + { + trace('stop') + this.stop() + } + + public function resume() : void + { + + trace('resume') + this.play() + } + } +} diff --git a/BookSourceCode/src/chapter_eight/adapter/adapters/AudioDecoratorIPauseAdapter.as b/BookSourceCode/src/chapter_eight/adapter/adapters/AudioDecoratorIPauseAdapter.as new file mode 100644 index 0000000..e8fa91c --- /dev/null +++ b/BookSourceCode/src/chapter_eight/adapter/adapters/AudioDecoratorIPauseAdapter.as @@ -0,0 +1,15 @@ +package chapter_eight.adapter.adapters +{ + import chapter_eight.adapter.adapters.abstractions.AMinimalStopPlayToPauseResume; + import chapter_eight.decorator.concretes.PauseableAudibleDecorator; + /** + * @author Ben Smith + */ + public class AudioDecoratorIPauseAdapter extends AMinimalStopPlayToPauseResume + { + public function AudioDecoratorIPauseAdapter( startStop : PauseableAudibleDecorator ) + { + super( startStop ); + } + } +} diff --git a/BookSourceCode/src/chapter_eight/adapter/adapters/ClipAdapter.as b/BookSourceCode/src/chapter_eight/adapter/adapters/ClipAdapter.as new file mode 100644 index 0000000..737643b --- /dev/null +++ b/BookSourceCode/src/chapter_eight/adapter/adapters/ClipAdapter.as @@ -0,0 +1,28 @@ +package chapter_eight.adapter.adapters +{ + import chapter_eight.adapter.IPause; + import flash.display.MovieClip; + + /** + * @author Ben Smith + */ + public class ClipAdapter implements IPause + { + private var _mc : MovieClip + + public function ClipAdapter( mc : MovieClip ) + { + _mc = mc + } + + public function pause() : void + { + _mc.stop() + } + + public function resume() : void + { + _mc.play() + } + } +} diff --git a/BookSourceCode/src/chapter_eight/adapter/adapters/MChasStartStop.as b/BookSourceCode/src/chapter_eight/adapter/adapters/MChasStartStop.as new file mode 100644 index 0000000..e3b41cc --- /dev/null +++ b/BookSourceCode/src/chapter_eight/adapter/adapters/MChasStartStop.as @@ -0,0 +1,17 @@ +package chapter_eight.adapter.adapters +{ + import chapter_eight.adapter.adapters.abstractions.AMinimalStopPlayToPauseResume; + + import flash.display.MovieClip; + + /** + * @author Ben Smith + */ + public class MChasStartStop extends AMinimalStopPlayToPauseResume + { + public function MChasStartStop( mc : MovieClip ) + { + super( mc ); + } + } +} diff --git a/BookSourceCode/src/chapter_eight/adapter/adapters/abstractions/AMinimalStopPlayToPauseResume.as b/BookSourceCode/src/chapter_eight/adapter/adapters/abstractions/AMinimalStopPlayToPauseResume.as new file mode 100644 index 0000000..6a92af6 --- /dev/null +++ b/BookSourceCode/src/chapter_eight/adapter/adapters/abstractions/AMinimalStopPlayToPauseResume.as @@ -0,0 +1,31 @@ +package chapter_eight.adapter.adapters.abstractions +{ + import chapter_eight.adapter.IPause; + + /** + * @author Ben Smith + */ + public class AMinimalStopPlayToPauseResume extends Object implements IPause + { + protected var _stopStart : * + + public function AMinimalStopPlayToPauseResume( startStop : * ) + { + _stopStart = startStop + } + + public function pause() : void + { + trace( 'mc stop' ); + trace( _stopStart ) + _stopStart.stop() + } + + public function resume() : void + { + trace( 'mc play' ); + trace( _stopStart ) + _stopStart.play() + } + } +} diff --git a/BookSourceCode/src/chapter_eight/adapter/conductors/PauseConductor.as b/BookSourceCode/src/chapter_eight/adapter/conductors/PauseConductor.as new file mode 100644 index 0000000..a31da99 --- /dev/null +++ b/BookSourceCode/src/chapter_eight/adapter/conductors/PauseConductor.as @@ -0,0 +1,22 @@ +package chapter_eight.adapter.conductors +{ + import chapter_eight.adapter.conductors.abstractions.APauseConductor; + import chapter_seven.iterator_pattern.collections.concretes.DictionaryCollection; + import chapter_seven.iterator_pattern.interfaces.IIterate; + + /** + * @author Ben Smith + */ + public class PauseConductor extends APauseConductor + { + public function PauseConductor() + { + super(); + } + + override protected function doCreateCollection() : IIterate + { + return new DictionaryCollection() + } + } +} diff --git a/BookSourceCode/src/chapter_eight/adapter/conductors/abstractions/APauseConductor.as b/BookSourceCode/src/chapter_eight/adapter/conductors/abstractions/APauseConductor.as new file mode 100644 index 0000000..5082d98 --- /dev/null +++ b/BookSourceCode/src/chapter_eight/adapter/conductors/abstractions/APauseConductor.as @@ -0,0 +1,84 @@ +package chapter_eight.adapter.conductors.abstractions +{ + import chapter_eight.adapter.IPause; + import chapter_seven.iterator_pattern.interfaces.IIterate; + import chapter_seven.iterator_pattern.interfaces.IIterator; + import flash.errors.IllegalOperationError; + + + /** + * @author Ben Smith + */ + public class APauseConductor extends Object + { + private var _collection : IIterate + private var _iterator : IIterator + + public function APauseConductor() + { + _collection = doCreateCollection() + } + + final public function addElement( element : IPause ) : void + { + doAddElement( element ) + } + + final public function removeElement( element : IPause ) : void + { + doRemoveElement( element ) + } + + final public function pause() : void + { + doPause() + } + + final public function resume() : void + { + doResume() + } + + protected function doRemoveElement( element : IPause ) : void + { + _collection.remove( element ) + } + + protected function doAddElement( element : IPause ) : void + { + _collection.append( element ) + } + + protected function doCreateCollection() : IIterate + { + throw new IllegalOperationError( 'doCreateCollection must be overridden' ) + return null + } + + protected function doPause() : void + { + _iterator = _collection.createIterator() + + while (_iterator.hasNext()) + { + + var pauseable : IPause = _iterator.currentElement() + trace( pauseable ) + _iterator.next() + pauseable.pause() + } + } + + protected function doResume() : void + { + _iterator.reset() + while (_iterator.hasNext()) + { + var resumeable : IPause = _iterator.currentElement() + trace( resumeable ) + _iterator.next() + resumeable.resume() + } + } + } +} diff --git a/BookSourceCode/src/chapter_eight/composite/DocumentClass.as b/BookSourceCode/src/chapter_eight/composite/DocumentClass.as new file mode 100644 index 0000000..0320b1b --- /dev/null +++ b/BookSourceCode/src/chapter_eight/composite/DocumentClass.as @@ -0,0 +1,90 @@ +package chapter_eight.composite +{ + import chapter_eight.adapter.IPause; + import chapter_eight.adapter.adapters.AudioDecoratorIPauseAdapter; + import chapter_eight.adapter.adapters.MChasStartStop; + import chapter_eight.composite.components.PauseableComponent; + import chapter_eight.composite.components.PauseableComposite; + import chapter_eight.composite.components.PauseableLeaf; + import chapter_eight.decorator.abstraction.ASoundDecorator.Audible; + import chapter_eight.decorator.concretes.InfiniteLoopDecorator; + import chapter_eight.decorator.concretes.PauseableAudibleDecorator; + import chapter_eight.decorator.interfaces.ISound; + import flash.display.MovieClip; + import flash.display.Sprite; + import flash.events.MouseEvent; + import flash.net.URLRequest; + + + /** + * @author Ben Smith + */ + [SWF( backgroundColor="#ffffff" )] + public class DocumentClass extends Sprite + { + private var _compositeOfIPauseObjects : PauseableComponent + private var _sndComposite : PauseableComponent + private var _mcComposite : PauseableComponent + private var _isPlaying : Boolean = true + + public function DocumentClass() + { + var sound : ISound = new Audible( new URLRequest( "music.mp3" ) ) + sound = new InfiniteLoopDecorator( sound ) + sound = new PauseableAudibleDecorator( sound ) + sound.play() + + var mc : MovieClip = new SimpleMCAnimation() + addChild( mc ) + + var mcMinimialPauseAdaption : IPause = new MChasStartStop( mc ); + var soundMinimialPauseAdaption : IPause = new AudioDecoratorIPauseAdapter( PauseableAudibleDecorator( sound ) ); + + var mcLeaf : PauseableLeaf = new PauseableLeaf( mcMinimialPauseAdaption ); + var sndLeaf : PauseableLeaf = new PauseableLeaf( soundMinimialPauseAdaption ); + + var pauseableMCComposite : PauseableComposite = new PauseableComposite() + pauseableMCComposite.addComponent( mcLeaf ) + + var pauseableSndComposite : PauseableComposite = new PauseableComposite() + pauseableSndComposite.addComponent( sndLeaf ) + + var iPauseComposites : PauseableComposite = new PauseableComposite() + iPauseComposites.addComponent( pauseableMCComposite ) + iPauseComposites.addComponent( pauseableSndComposite ) + + + _compositeOfIPauseObjects = iPauseComposites + + + + _sndComposite = pauseableSndComposite + _mcComposite = pauseableMCComposite + + stage.addEventListener( MouseEvent.MOUSE_DOWN , onDown ); + } + + private function onDown( event : MouseEvent ) : void + { + + /* this may appear to be exact as the adapter class , I assure you + * it's not. replace the _compositeOfIPauseObjects + * with any of the other 2 possible composites to see how you can + * target the pause/resume of particular composites. + */ + if (_isPlaying) + { + // _sndComposite.pause() + // _mcComposite.pause() + _compositeOfIPauseObjects.pause() + } + else + { + // _sndComposite.resume() + // _mcComposite.resume() + _compositeOfIPauseObjects.resume() + } + _isPlaying = !_isPlaying + } + } +} diff --git a/BookSourceCode/src/chapter_eight/composite/components/PauseableComponent.as b/BookSourceCode/src/chapter_eight/composite/components/PauseableComponent.as new file mode 100644 index 0000000..7480969 --- /dev/null +++ b/BookSourceCode/src/chapter_eight/composite/components/PauseableComponent.as @@ -0,0 +1,37 @@ +package chapter_eight.composite.components +{ + import chapter_eight.composite.components.abstraction.Component; + import flash.errors.IllegalOperationError; + + + /** + * @author Ben Smith + */ + public class PauseableComponent extends Component + { + public function PauseableComponent() + { + super(); + } + + final public function pause() : void + { + doPause(); + } + + final public function resume() : void + { + doResume(); + } + + protected function doResume() : void + { + throw new IllegalOperationError( 'doResume must be overridden' ) + } + + protected function doPause() : void + { + throw new IllegalOperationError( 'doPause must be overridden' ) + } + } +} diff --git a/BookSourceCode/src/chapter_eight/composite/components/PauseableComposite.as b/BookSourceCode/src/chapter_eight/composite/components/PauseableComposite.as new file mode 100644 index 0000000..3399dc5 --- /dev/null +++ b/BookSourceCode/src/chapter_eight/composite/components/PauseableComposite.as @@ -0,0 +1,60 @@ +package chapter_eight.composite.components +{ + import chapter_seven.iterator_pattern.collections.concretes.ArrayCollection; + import chapter_seven.iterator_pattern.interfaces.IIterator; + + /** + * @author Ben Smith + */ + public class PauseableComposite extends PauseableComponent + { + protected var _arCollection : ArrayCollection; + + public function PauseableComposite() + { + super(); + } + + public function addComponent( pauseable : PauseableComponent ) : void + { + doVerifyCollection() + _arCollection.append( pauseable ) + } + + public function removeComponent( pauseable : PauseableComponent ) : void + { + } + + override protected function doResume() : void + { + var it : IIterator = _arCollection.createIterator() + while (it.hasNext()) + { + var cnent : PauseableComponent = it.currentElement() as PauseableComponent + trace(cnent) + + cnent.resume() + it.next(); + } + } + + override protected function doPause() : void + { + var it : IIterator = _arCollection.createIterator() + while (it.hasNext()) + { + var cnent : PauseableComponent = it.currentElement() as PauseableComponent + trace(cnent) + + cnent.pause(); + it.next(); + } + } + + private function doVerifyCollection() : void + { + if (!_arCollection) + _arCollection = new ArrayCollection() + } + } +} diff --git a/BookSourceCode/src/chapter_eight/composite/components/PauseableLeaf.as b/BookSourceCode/src/chapter_eight/composite/components/PauseableLeaf.as new file mode 100644 index 0000000..d56defd --- /dev/null +++ b/BookSourceCode/src/chapter_eight/composite/components/PauseableLeaf.as @@ -0,0 +1,30 @@ +package chapter_eight.composite.components +{ + import chapter_eight.adapter.IPause; + + /** + * @author Ben Smith + */ + public class PauseableLeaf extends PauseableComponent + { + protected var _iPause : IPause + + public function PauseableLeaf( _pauseable : IPause ) + { + super(); + _iPause = _pauseable + } + + override protected function doResume() : void + { + trace(_iPause) + _iPause.resume(); + } + + override protected function doPause() : void + { + trace(_iPause) + _iPause.pause(); + } + } +} diff --git a/BookSourceCode/src/chapter_eight/composite/components/abstraction/Component.as b/BookSourceCode/src/chapter_eight/composite/components/abstraction/Component.as new file mode 100644 index 0000000..b47300f --- /dev/null +++ b/BookSourceCode/src/chapter_eight/composite/components/abstraction/Component.as @@ -0,0 +1,34 @@ +package chapter_eight.composite.components.abstraction +{ + + /** + * @author Ben Smith + */ + public class Component extends Object + { + private static var _counter : int = 0; + protected var _parentComposite : Component; + protected var _identity : int; + + public function Component() + { + _counter++; + } + + public function get identity() : int + { + return _identity; + } + + final public function get parentComposite() : Component + { + return _parentComposite; + } + + final public function set parentComposite( parentComposite : Component ) : void + { + _parentComposite = parentComposite; + } + + } +} diff --git a/BookSourceCode/src/chapter_eight/decorator/DocumentClass.as b/BookSourceCode/src/chapter_eight/decorator/DocumentClass.as new file mode 100644 index 0000000..b0ab74b --- /dev/null +++ b/BookSourceCode/src/chapter_eight/decorator/DocumentClass.as @@ -0,0 +1,46 @@ +package chapter_eight.decorator +{ + import chapter_eight.decorator.abstraction.ASoundDecorator.Audible; + import chapter_eight.decorator.concretes.InfiniteLoopDecorator; + import chapter_eight.decorator.concretes.PauseableAudibleDecorator; + import chapter_eight.decorator.interfaces.ISound; + import chapter_eight.decorator.interfaces.ISoundChannel; + + import flash.display.Sprite; + import flash.events.MouseEvent; + import flash.net.URLRequest; + + /** + * @author Ben Smith + */ + public class DocumentClass extends Sprite + { + private var _isPlaying : Boolean = false + var sound : ISound + + public function DocumentClass() + { + sound = new Audible( new URLRequest( "music.mp3" ) ); + sound = new InfiniteLoopDecorator( sound ); + sound = new PauseableAudibleDecorator( sound ); + sound.play() + + stage.addEventListener( MouseEvent.MOUSE_DOWN , onDown ) + } + + private function onDown( event : MouseEvent ) : void + { + var localsnd : ISound = sound + var snd : ISoundChannel = ISoundChannel( localsnd ) + _isPlaying = !_isPlaying; + if (_isPlaying) + { + snd.stop() + } + else + { + localsnd.play() + } + } + } +} diff --git a/BookSourceCode/src/chapter_eight/decorator/abstraction/ASoundDecorator/AbstractSoundDecorator.as b/BookSourceCode/src/chapter_eight/decorator/abstraction/ASoundDecorator/AbstractSoundDecorator.as new file mode 100644 index 0000000..091d445 --- /dev/null +++ b/BookSourceCode/src/chapter_eight/decorator/abstraction/ASoundDecorator/AbstractSoundDecorator.as @@ -0,0 +1,105 @@ +package chapter_eight.decorator.abstraction.ASoundDecorator +{ + import chapter_eight.decorator.interfaces.ISound; + + import flash.errors.IllegalOperationError; + import flash.events.Event; + import flash.media.ID3Info; + import flash.media.SoundChannel; + import flash.media.SoundLoaderContext; + import flash.media.SoundTransform; + import flash.net.URLRequest; + import flash.utils.ByteArray; + + /** + * @author Ben Smith + */ + public class AbstractSoundDecorator implements ISound + { + protected static var _channel : SoundChannel + protected var _snd : ISound + + public function AbstractSoundDecorator( snd : ISound ) : void + { + _snd = snd + } + + public function get bytesLoaded() : uint + { + return 0; + } + + public function get bytesTotal() : int + { + return 0; + } + + public function close() : void + { + } + + public function extract( target : ByteArray , length : Number , startPosition : Number = -1 ) : Number + { + return 0; + } + + public function get id3() : ID3Info + { + return null; + } + + public function get isBuffering() : Boolean + { + return false; + } + + public function get length() : Number + { + return 0; + } + + public function load( stream : URLRequest , context : SoundLoaderContext = null ) : void + { + } + + final public function play( startTime : Number = 0 , loops : int = 0 , sndTransform : SoundTransform = null ) : SoundChannel + { + _channel = doPlay( startTime , loops , sndTransform ) + return _channel + } + + public function get url() : String + { + return ""; + } + + public function addEventListener( type : String , listener : Function , useCapture : Boolean = false , priority : int = 0 , useWeakReference : Boolean = false ) : void + { + } + + public function dispatchEvent( event : Event ) : Boolean + { + return false; + } + + public function hasEventListener( type : String ) : Boolean + { + return false; + } + + public function removeEventListener( type : String , listener : Function , useCapture : Boolean = false ) : void + { + } + + public function willTrigger( type : String ) : Boolean + { + return false; + } + + protected function doPlay( startTime : Number = 0 , loops : int = 0 , sndTransform : SoundTransform = null ) : SoundChannel + { + throw new IllegalOperationError( 'doPlay must be overridden' ) + return null; + } + } +} diff --git a/BookSourceCode/src/chapter_eight/decorator/abstraction/ASoundDecorator/Audible.as b/BookSourceCode/src/chapter_eight/decorator/abstraction/ASoundDecorator/Audible.as new file mode 100644 index 0000000..8f75bef --- /dev/null +++ b/BookSourceCode/src/chapter_eight/decorator/abstraction/ASoundDecorator/Audible.as @@ -0,0 +1 @@ +package chapter_eight.decorator.abstraction.ASoundDecorator { import chapter_eight.decorator.interfaces.ISound; import flash.media.Sound; import flash.media.SoundLoaderContext; import flash.net.URLRequest; /** * @author Ben Smith */ public class Audible extends Sound implements ISound { public function Audible( stream : URLRequest = null , context : SoundLoaderContext = null ) { super( stream , context ); } } } \ No newline at end of file diff --git a/BookSourceCode/src/chapter_eight/decorator/concretes/FadeUpDeorator.as b/BookSourceCode/src/chapter_eight/decorator/concretes/FadeUpDeorator.as new file mode 100644 index 0000000..9496afb --- /dev/null +++ b/BookSourceCode/src/chapter_eight/decorator/concretes/FadeUpDeorator.as @@ -0,0 +1,53 @@ +package chapter_eight.decorator.concretes +{ + import chapter_eight.decorator.abstraction.ASoundDecorator.AbstractSoundDecorator; + import chapter_eight.decorator.interfaces.ISound; + + import com.greensock.TweenLite; + import com.greensock.easing.Quad; + + import flash.events.Event; + import flash.media.SoundChannel; + import flash.media.SoundTransform; + + /** + * @author Ben Smith + */ + public class FadeUpDeorator extends AbstractSoundDecorator + { + public function FadeUpDeorator( snd : ISound ) + { + super( snd ); + } + + override protected function doPlay( startTime : Number = 0 , loops : int = 1000 , sndTransform : SoundTransform = null ) : SoundChannel + { + removeEvents(); + + var sndTransform : SoundTransform = new SoundTransform() + sndTransform.volume = 0; + + _channel = _snd.play( startTime , loops,sndTransform); + _channel.addEventListener( Event.SOUND_COMPLETE , repeat ); + + + TweenLite.to( sndTransform , 2 , { ease:Quad.easeIn , volume:1 , onUpdate:function() + { + trace( sndTransform.volume ) + _channel.soundTransform = sndTransform; + } } ); + return _channel + } + + private function repeat( event : Event ) : void + { + _channel = play( 0 , 0 , null ); + } + + private function removeEvents() : void + { + if (_channel) + _channel.removeEventListener( Event.SOUND_COMPLETE , repeat ) + } + } +} diff --git a/BookSourceCode/src/chapter_eight/decorator/concretes/InfiniteLoopDecorator.as b/BookSourceCode/src/chapter_eight/decorator/concretes/InfiniteLoopDecorator.as new file mode 100644 index 0000000..ab8ae7c --- /dev/null +++ b/BookSourceCode/src/chapter_eight/decorator/concretes/InfiniteLoopDecorator.as @@ -0,0 +1,39 @@ +package chapter_eight.decorator.concretes +{ + import chapter_eight.decorator.abstraction.ASoundDecorator.AbstractSoundDecorator; + import chapter_eight.decorator.interfaces.ISound; + + import flash.events.Event; + import flash.media.SoundChannel; + import flash.media.SoundTransform; + + /** + * @author Ben Smith + */ + public class InfiniteLoopDecorator extends AbstractSoundDecorator + { + public function InfiniteLoopDecorator( snd : ISound ) + { + super( snd ); + } + + override protected function doPlay( startTime : Number = 0 , loops : int = 0 , sndTransform : SoundTransform = null ) : SoundChannel + { + removeEvents() + _channel = _snd.play( startTime , loops ) + _channel.addEventListener( Event.SOUND_COMPLETE , repeat ) + return _channel + } + + private function repeat( event : Event ) : void + { + _channel = play( 0 , 0 , null ); + } + + private function removeEvents() : void + { + if (_channel) + _channel.removeEventListener( Event.SOUND_COMPLETE , repeat ) + } + } +} diff --git a/BookSourceCode/src/chapter_eight/decorator/concretes/PauseableAudibleDecorator.as b/BookSourceCode/src/chapter_eight/decorator/concretes/PauseableAudibleDecorator.as new file mode 100644 index 0000000..d7b0780 --- /dev/null +++ b/BookSourceCode/src/chapter_eight/decorator/concretes/PauseableAudibleDecorator.as @@ -0,0 +1,79 @@ +package chapter_eight.decorator.concretes +{ + import chapter_eight.decorator.abstraction.ASoundDecorator.AbstractSoundDecorator; + import chapter_eight.decorator.interfaces.ISound; + import chapter_eight.decorator.interfaces.ISoundChannel; + + import flash.events.Event; + import flash.media.SoundChannel; + import flash.media.SoundTransform; + + /** + * @author Ben Smith + */ + public class PauseableAudibleDecorator extends AbstractSoundDecorator implements ISoundChannel + { + protected var _position : Number = 0; + + public function PauseableAudibleDecorator( snd : ISound ) + { + super( snd ); + } + + override protected function doPlay( startTime : Number = 0 , loops : int = 0 , sndTransform : SoundTransform = null ) : SoundChannel + { + trace('sound play') + stop() + removeEvents() + _channel = _snd.play( _position , loops , sndTransform ) + _channel.addEventListener( Event.SOUND_COMPLETE , resetPosition ) + return _channel + } + + private function removeEvents() : void + { + if (_channel) + _channel.removeEventListener( Event.SOUND_COMPLETE , resetPosition ) + } + + private function resetPosition( event : Event ) : void + { + _position = 0 + } + + public function get leftPeak() : Number + { + return 0; + } + + public function get position() : Number + { + return 0; + } + + public function get rightPeak() : Number + { + return 0; + } + + public function get soundTransform() : SoundTransform + { + return null; + } + + public function set soundTransform( sndTransform : SoundTransform ) : void + { + } + + public function stop() : void + { + trace('sound stop') + if (_channel) + { + _position = _channel.position + trace( _position ) + _channel.stop(); + } + } + } +} diff --git a/BookSourceCode/src/chapter_eight/decorator/interfaces/ISound.as b/BookSourceCode/src/chapter_eight/decorator/interfaces/ISound.as new file mode 100644 index 0000000..a1c97c4 --- /dev/null +++ b/BookSourceCode/src/chapter_eight/decorator/interfaces/ISound.as @@ -0,0 +1,36 @@ +package chapter_eight.decorator.interfaces +{ + import flash.events.IEventDispatcher; + import flash.media.ID3Info; + import flash.media.SoundChannel; + import flash.media.SoundLoaderContext; + import flash.media.SoundTransform; + import flash.net.URLRequest; + import flash.utils.ByteArray; + + /** + * @author Ben Smith + */ + public interface ISound extends IEventDispatcher + { + function get bytesLoaded() : uint; + + function get bytesTotal() : int; + + function close() : void; + + function extract( target : ByteArray , length : Number , startPosition : Number = -1 ) : Number; + + function get id3() : ID3Info; + + function get isBuffering() : Boolean; + + function get length() : Number; + + function load( stream : URLRequest , context : SoundLoaderContext = null ) : void; + + function play( startTime : Number = 0 , loops : int = 0 , sndTransform : SoundTransform = null ) : SoundChannel; + + function get url() : String; + } +} diff --git a/BookSourceCode/src/chapter_eight/decorator/interfaces/ISoundChannel.as b/BookSourceCode/src/chapter_eight/decorator/interfaces/ISoundChannel.as new file mode 100644 index 0000000..8c76bff --- /dev/null +++ b/BookSourceCode/src/chapter_eight/decorator/interfaces/ISoundChannel.as @@ -0,0 +1,22 @@ +package chapter_eight.decorator.interfaces +{ + import flash.media.SoundTransform; + + /** + * @author Ben Smith + */ + public interface ISoundChannel + { + function get leftPeak() : Number; + + function get position() : Number; + + function get rightPeak() : Number; + + function get soundTransform() : SoundTransform; + + function set soundTransform( sndTransform : SoundTransform ) : void; + + function stop() : void; + } +} diff --git a/BookSourceCode/src/chapter_eight/decorator/interfaces/ISoundTransform.as b/BookSourceCode/src/chapter_eight/decorator/interfaces/ISoundTransform.as new file mode 100644 index 0000000..e4912c8 --- /dev/null +++ b/BookSourceCode/src/chapter_eight/decorator/interfaces/ISoundTransform.as @@ -0,0 +1,21 @@ +package chapter_eight.decorator.interfaces +{ + /** + * @author Ben Smith + */ + public interface ISoundTransform + { + function get leftToLeft() : Number; + function set leftToLeft( leftToLeft : Number ) : void; + function get leftToRight() : Number; + function set leftToRight( leftToRight : Number ) : void; + function get pan() : Number; + function set pan( panning : Number ) : void; + function get rightToLeft() : Number; + function set rightToLeft( rightToLeft : Number ) : void; + function get rightToRight() : Number; + function set rightToRight( rightToRight : Number ) : void; + function get volume() : Number; + function set volume( volume : Number ) : void; + } +} diff --git a/BookSourceCode/src/chapter_eight/facade/DocumentClass.as b/BookSourceCode/src/chapter_eight/facade/DocumentClass.as new file mode 100644 index 0000000..5b9a51e --- /dev/null +++ b/BookSourceCode/src/chapter_eight/facade/DocumentClass.as @@ -0,0 +1,39 @@ +package chapter_eight.facade +{ + import chapter_eight.facade.components.PauseResumeVideoPlayerFacade; + import flash.display.Sprite; + import flash.events.MouseEvent; + + /** + * @author Ben Smith + */ + public class DocumentClass extends Sprite + { + var pause : Boolean = false + var vid : PauseResumeVideoPlayerFacade + + public function DocumentClass() : void + { + /* ensure the swf is saved locally*/ + + vid = new PauseResumeVideoPlayerFacade() + addChild( vid ) + vid.playURL( "SwimmingWithTheDolphins.flv" ); + + stage.addEventListener( MouseEvent.MOUSE_DOWN , toggleVideo ) + } + + private function toggleVideo( event : MouseEvent ) : void + { + if (!pause) + { + vid.pause() + } + else + { + vid.resume() + } + pause = !pause + } + } +} diff --git a/BookSourceCode/src/chapter_eight/facade/components/NSExtension.as b/BookSourceCode/src/chapter_eight/facade/components/NSExtension.as new file mode 100644 index 0000000..516265d --- /dev/null +++ b/BookSourceCode/src/chapter_eight/facade/components/NSExtension.as @@ -0,0 +1,41 @@ +package chapter_eight.facade.components +{ + import flash.events.NetStatusEvent; + import flash.net.NetConnection; + import flash.net.NetStream; + + /** + * @author Ben Smith + */ + public class NSExtension extends NetStream + { + public function NSExtension( connection : NetConnection , peerID : String = "connectToFMS" ) + { + trace( connection ) + super( connection , peerID ); + addEventListener( NetStatusEvent.NET_STATUS , doHandleNetStatus ); + client = this + } + + protected function doHandleNetStatus( event : NetStatusEvent ) : void + { + trace( event.info.code ) + } + + final public function onMetaData( evt : Object ) : void + { + for (var obj:* in evt) + { + trace( obj , evt[obj] ) + } + } + + final public function onXMPData( obj : Object ) : void + { + for (var e:* in obj) + { + trace( e , obj[obj] ) + } + } + } +} diff --git a/BookSourceCode/src/chapter_eight/facade/components/PauseResumeVideoPlayerFacade.as b/BookSourceCode/src/chapter_eight/facade/components/PauseResumeVideoPlayerFacade.as new file mode 100644 index 0000000..3b02c44 --- /dev/null +++ b/BookSourceCode/src/chapter_eight/facade/components/PauseResumeVideoPlayerFacade.as @@ -0,0 +1,46 @@ +package chapter_eight.facade.components +{ + import chapter_eight.facade.components.abstraction.AbstractVideoPlayerFacade; + import flash.media.Video; + import flash.net.NetConnection; + import flash.net.NetStream; + + /** + * @author Ben Smith + */ + public class PauseResumeVideoPlayerFacade extends AbstractVideoPlayerFacade + { + public function PauseResumeVideoPlayerFacade() + { + super(); + } + + public function pause() : void + { + _ns.pause(); + } + + public function resume() : void + { + _ns.resume(); + } + + override protected function doGetNetConnection() : NetConnection + { + return new NetConnection() + } + + override protected function doGetNetStream() : NetStream + { + return new NSExtension( _nc ) + } + + override protected function doGetVideo() : Video + { + var vid : Video = new Video() + vid.width = 640 + vid.height = 320 + return vid + } + } +} diff --git a/BookSourceCode/src/chapter_eight/facade/components/abstraction/AbstractVideoPlayerFacade.as b/BookSourceCode/src/chapter_eight/facade/components/abstraction/AbstractVideoPlayerFacade.as new file mode 100644 index 0000000..e0b522a --- /dev/null +++ b/BookSourceCode/src/chapter_eight/facade/components/abstraction/AbstractVideoPlayerFacade.as @@ -0,0 +1,54 @@ +package chapter_eight.facade.components.abstraction +{ + import flash.display.Sprite; + import flash.errors.IllegalOperationError; + import flash.media.Video; + import flash.net.NetConnection; + import flash.net.NetStream; + + /** + * @author Ben Smith + */ + public class AbstractVideoPlayerFacade extends Sprite + { + protected var _vid : Video + protected var _ns : NetStream + protected var _nc : NetConnection + + public function AbstractVideoPlayerFacade() + { + _nc = doGetNetConnection(); + _nc.connect( null ) + _ns = doGetNetStream(); + _vid = doGetVideo() + _vid.attachNetStream( _ns ) + addChild( _vid ) + } + + public function playURL( url : String ) : void + { + _ns.play( url ) + } + + final public function close() : void + { + _nc.close() + _vid.clear() + } + + protected function doGetVideo() : Video + { + throw new IllegalOperationError( 'doGetVideo must be overridden' ) + } + + protected function doGetNetStream() : NetStream + { + throw new IllegalOperationError( 'doGetNetStream must be overridden' ) + } + + protected function doGetNetConnection() : NetConnection + { + throw new IllegalOperationError( 'doGetNetConnection must be overridden' ) + } + } +} diff --git a/BookSourceCode/src/chapter_eleven/mvc/DocumentClass.as b/BookSourceCode/src/chapter_eleven/mvc/DocumentClass.as new file mode 100644 index 0000000..7bd6a9f --- /dev/null +++ b/BookSourceCode/src/chapter_eleven/mvc/DocumentClass.as @@ -0,0 +1,33 @@ +package chapter_eleven.mvc +{ + import chapter_eleven.mvc.model.ConfigModel; + import chapter_eleven.mvc.view.LeafView; + import chapter_eleven.mvc.view.WindowView; + + import flash.display.Sprite; + import flash.display.StageAlign; + import flash.display.StageScaleMode; + + /** + * @author Ben Smith + */ + public class DocumentClass extends Sprite + { + public function DocumentClass() + { + stage.scaleMode = StageScaleMode.EXACT_FIT; + stage.align = StageAlign.TOP_LEFT; + mouseEnabled = false; + + var cm : ConfigModel = new ConfigModel(); + + cm.name = "Default_Text.txt" + cm.xPos = Math.random() * this.stage.stageWidth; + cm.yPos = Math.random() * this.stage.stageHeight; + + var windowView : WindowView = new WindowView( cm ); + addChild( windowView ); + windowView.addComponent( new LeafView( cm ) ) + } + } +} diff --git a/BookSourceCode/src/chapter_eleven/mvc/controller/AbstractController.as b/BookSourceCode/src/chapter_eleven/mvc/controller/AbstractController.as new file mode 100644 index 0000000..808ab45 --- /dev/null +++ b/BookSourceCode/src/chapter_eleven/mvc/controller/AbstractController.as @@ -0,0 +1,42 @@ +package chapter_eleven.mvc.controller +{ + import chapter_eleven.mvc.model.AbstractModel; + import chapter_eleven.mvc.view.AbstractView; + + + + /** + * @author Ben Smith + */ + public class AbstractController extends Object + { + protected var _mdl : AbstractModel; + protected var _view : AbstractView; + + public function AbstractController( mdl : AbstractModel=null , view : AbstractView=null ) + { + _mdl = mdl; + _view = view; + } + + public function get mdl() : AbstractModel + { + return _mdl; + } + + public function set mdl( mdl : AbstractModel ) : void + { + _mdl = mdl; + } + + public function get view() : AbstractView + { + return _view; + } + + public function set view( view : AbstractView ) : void + { + _view = view; + } + } +} diff --git a/BookSourceCode/src/chapter_eleven/mvc/controller/ComponentRenamerController.as b/BookSourceCode/src/chapter_eleven/mvc/controller/ComponentRenamerController.as new file mode 100644 index 0000000..ce81d76 --- /dev/null +++ b/BookSourceCode/src/chapter_eleven/mvc/controller/ComponentRenamerController.as @@ -0,0 +1,68 @@ +package chapter_eleven.mvc.controller +{ + import chapter_eleven.mvc.elements.DisplayField; + import chapter_eleven.mvc.model.AbstractModel; + import chapter_eleven.mvc.model.ConfigModel; + import chapter_eleven.mvc.view.OSComponent; + + import flash.events.FocusEvent; + import flash.events.KeyboardEvent; + import flash.events.MouseEvent; + import flash.ui.Keyboard; + import flash.ui.Mouse; + import flash.ui.MouseCursor; + import flash.utils.getTimer; + + /** + * @author Ben Smith + */ + public class ComponentRenamerController extends AbstractController + { + protected var _display : DisplayField + protected var _timer : int + protected const MAX_DURATION : int = 1000 + + public function ComponentRenamerController( mdl : AbstractModel , view : OSComponent ) + { + super( mdl , view ); + _timer = 0 + _display = view.field + _display.addEventListener( MouseEvent.CLICK , onMouseClick ) + _display.addEventListener( FocusEvent.FOCUS_OUT , onOut ) + _display.addEventListener( KeyboardEvent.KEY_DOWN , onPossibleEnter ) + } + + private function onPossibleEnter( event : KeyboardEvent ) : void + { + switch(event.keyCode) + { + case Keyboard.ENTER: + commit(); + break; + } + } + + protected function onOut( event : FocusEvent ) : void + { + commit() + } + + protected function commit() : void + { + _display.display(); + ConfigModel( _mdl ).name = _display.text + + Mouse.cursor = MouseCursor.ARROW + } + + private function onMouseClick( event : MouseEvent ) : void + { + var currentTimer : int = getTimer() + if ((currentTimer - _timer) < MAX_DURATION) + { + _display.rename() + } + _timer = currentTimer + } + } +} diff --git a/BookSourceCode/src/chapter_eleven/mvc/controller/DragController.as b/BookSourceCode/src/chapter_eleven/mvc/controller/DragController.as new file mode 100644 index 0000000..c66ce3a --- /dev/null +++ b/BookSourceCode/src/chapter_eleven/mvc/controller/DragController.as @@ -0,0 +1,45 @@ +package chapter_eleven.mvc.controller +{ + import chapter_eleven.mvc.model.AbstractModel; + import chapter_eleven.mvc.model.ConfigModel; + import chapter_eleven.mvc.view.AbstractView; + + import flash.display.Sprite; + import flash.events.MouseEvent; + import flash.utils.Timer; + + /** + * @author Ben Smith + */ + public class DragController extends AbstractController + { + protected var _isPressed : Boolean + protected var _timer : Timer + protected var _clone : Sprite + protected var _posX : int; + protected var _posY : int; + + public function DragController( mdl : AbstractModel = null , view : AbstractView = null ) + { + super( mdl , view ); + _view.mouseChildren = true; + _view.addEventListener( MouseEvent.MOUSE_DOWN , onMouseDown ); + } + + private function onMouseDown( event : MouseEvent ) : void + { + _view.addEventListener( MouseEvent.MOUSE_UP , onMouseUp ) + event.target.startDrag( false , null ); + } + + private function onMouseUp( event : MouseEvent ) : void + { + _view.removeEventListener( MouseEvent.MOUSE_UP , onMouseUp ); + event.target.stopDrag(); + + var mdl : ConfigModel = ConfigModel( _mdl ) + mdl.xPos = _posX; + mdl.yPos = _posX; + } + } +} diff --git a/BookSourceCode/src/chapter_eleven/mvc/controller/DragableController.as b/BookSourceCode/src/chapter_eleven/mvc/controller/DragableController.as new file mode 100644 index 0000000..3be13c2 --- /dev/null +++ b/BookSourceCode/src/chapter_eleven/mvc/controller/DragableController.as @@ -0,0 +1,41 @@ +package chapter_eleven.mvc.controller +{ + import chapter_eleven.mvc.model.AbstractModel; + import chapter_eleven.mvc.view.AbstractFileSystemView; + + import flash.display.Sprite; + import flash.events.MouseEvent; + import flash.utils.Timer; + + /** + * @author Ben Smith + */ + public class DragableController extends AbstractController + { + protected var _isPressed : Boolean + protected var _timer : Timer + protected var _clone : Sprite + protected var _posX : int + protected var _posY : int + + public function DragableController( mdl : AbstractModel , view : AbstractFileSystemView ) + { + super( mdl , view ); + _view.mouseEnabled = false; + _view.mouseChildren = true; + _view.addEventListener( MouseEvent.MOUSE_DOWN , onMouseDown ); + } + + private function onMouseDown( event : MouseEvent ) : void + { + _view.addEventListener( MouseEvent.MOUSE_UP , onMouseUp ) + event.target.startDrag( false , null ); + } + + private function onMouseUp( event : MouseEvent ) : void + { + _view.removeEventListener( MouseEvent.MOUSE_UP , onMouseUp ); + event.target.stopDrag(); + } + } +} diff --git a/BookSourceCode/src/chapter_eleven/mvc/elements/DisplayField.as b/BookSourceCode/src/chapter_eleven/mvc/elements/DisplayField.as new file mode 100644 index 0000000..20db9b0 --- /dev/null +++ b/BookSourceCode/src/chapter_eleven/mvc/elements/DisplayField.as @@ -0,0 +1,38 @@ +package chapter_eleven.mvc.elements +{ + import flash.text.TextField; + import flash.text.TextFieldAutoSize; + import flash.text.TextFieldType; + + /** + * @author Ben Smith + */ + public class DisplayField extends TextField + { + public function DisplayField() + { + super() + this.autoSize = TextFieldAutoSize.CENTER; + this.height = 10; + this.width = 1; + this.embedFonts = false; + display() + } + + public function rename() : void + { + var end : int = this.text.indexOf( '.' ) + this.type = TextFieldType.INPUT + this.selectable = true + this.setSelection( -1 , (end > -1) ? end : text.length ) + border = true + } + + public function display() : void + { + this.type = TextFieldType.DYNAMIC + this.selectable = false + border = false + } + } +} diff --git a/BookSourceCode/src/chapter_eleven/mvc/model/AbstractModel.as b/BookSourceCode/src/chapter_eleven/mvc/model/AbstractModel.as new file mode 100644 index 0000000..6993989 --- /dev/null +++ b/BookSourceCode/src/chapter_eleven/mvc/model/AbstractModel.as @@ -0,0 +1,43 @@ +package chapter_eleven.mvc.model +{ + import chapter_seven.the_observer_pattern.interfaces.IObserve; + import chapter_seven.the_observer_pattern.interfaces.ISubject; + import flash.errors.IllegalOperationError; + import flash.events.EventDispatcher; + import flash.events.IEventDispatcher; + import flash.utils.Dictionary; + + + /** + * @author Ben Smith + */ + public class AbstractModel extends EventDispatcher implements ISubject + { + protected var dict : Dictionary + + public function AbstractModel( target : IEventDispatcher = null ) + { + super( target ); + dict = new Dictionary( false ) + } + + public function addObserver( observer : IObserve , aspect : Function ) : Boolean + { + dict[observer] = aspect + return true + } + + public function removeObserver( observer : IObserve ) : Boolean + { + dict[observer] = null + delete dict[observer] + + return true; + } + + protected function notify() : void + { + throw new IllegalOperationError( 'notify must be overridden' ); + } + } +} diff --git a/BookSourceCode/src/chapter_eleven/mvc/model/ConfigModel.as b/BookSourceCode/src/chapter_eleven/mvc/model/ConfigModel.as new file mode 100644 index 0000000..6027667 --- /dev/null +++ b/BookSourceCode/src/chapter_eleven/mvc/model/ConfigModel.as @@ -0,0 +1,47 @@ +package chapter_eleven.mvc.model +{ + /** + * @author Ben Smith + */ + public class ConfigModel extends AbstractModel + { + private var _name : String; + private var _xPos : int; + private var _yPos : int; + + public function ConfigModel() + { + super(); + } + + public function get name() : String + { + return _name; + } + + public function set name( name : String ) : void + { + _name = name; + } + + public function get xPos() : int + { + return _xPos; + } + + public function set xPos( xPos : int ) : void + { + _xPos = xPos; + } + + public function get yPos() : int + { + return _yPos; + } + + public function set yPos( yPos : int ) : void + { + _yPos = yPos; + } + } +} diff --git a/BookSourceCode/src/chapter_eleven/mvc/model/FileSystem.as b/BookSourceCode/src/chapter_eleven/mvc/model/FileSystem.as new file mode 100644 index 0000000..aaf9cd2 --- /dev/null +++ b/BookSourceCode/src/chapter_eleven/mvc/model/FileSystem.as @@ -0,0 +1,33 @@ +package chapter_eleven.mvc.model +{ + /** + * @author Ben Smith + */ + public class FileSystem extends AbstractModel + { + private var volume : XML = + + + FeZEC + + + + + + + + + + + + + public function FileSystem() + { + super() + } + + public function rename() : void + { + } + } +} diff --git a/BookSourceCode/src/chapter_eleven/mvc/view/AbstractFileSystemView.as b/BookSourceCode/src/chapter_eleven/mvc/view/AbstractFileSystemView.as new file mode 100644 index 0000000..7fec85f --- /dev/null +++ b/BookSourceCode/src/chapter_eleven/mvc/view/AbstractFileSystemView.as @@ -0,0 +1,28 @@ +package chapter_eleven.mvc.view +{ + import chapter_eleven.mvc.controller.AbstractController; + import chapter_eleven.mvc.model.ConfigModel; + + import flash.errors.IllegalOperationError; + + /** + * @author Ben Smith + */ + public class AbstractFileSystemView extends AbstractView + { + + protected var _strategy : AbstractController; + + public function AbstractFileSystemView( mdl : ConfigModel ) + { + super( mdl ); + + } + + protected function createDefaultController() : AbstractController + { + throw new IllegalOperationError( 'createDefaultController must be overridden' ) + return null + } + } +} diff --git a/BookSourceCode/src/chapter_eleven/mvc/view/AbstractFolder.as b/BookSourceCode/src/chapter_eleven/mvc/view/AbstractFolder.as new file mode 100644 index 0000000..ac7d9bd --- /dev/null +++ b/BookSourceCode/src/chapter_eleven/mvc/view/AbstractFolder.as @@ -0,0 +1,46 @@ +package chapter_eleven.mvc.view +{ + import chapter_eleven.mvc.elements.DisplayField; + import chapter_eleven.mvc.model.ConfigModel; + + import flash.display.Bitmap; + import flash.errors.IllegalOperationError; + + /** + * @author Ben Smith + */ + public class AbstractFolder extends UIComposite + { + public function AbstractFolder( mdl : ConfigModel ) + { + super( mdl ); + _representation = createIcon(); + addChild( _representation ); + _field = createDisplayField(); + _strategy = this.createDefaultController() + } + + public function get fileName() : String + { + return _fileName; + } + + public function set fileName( fileName : String ) : void + { + _fileName = fileName; + } + + protected function createDisplayField() : DisplayField + { + throw new IllegalOperationError( 'createDisplayField must be overridden' ) + return null; + } + + protected function createIcon() : Bitmap + { + return null; + } + + + } +} \ No newline at end of file diff --git a/BookSourceCode/src/chapter_eleven/mvc/view/AbstractView.as b/BookSourceCode/src/chapter_eleven/mvc/view/AbstractView.as new file mode 100644 index 0000000..d555724 --- /dev/null +++ b/BookSourceCode/src/chapter_eleven/mvc/view/AbstractView.as @@ -0,0 +1,39 @@ +package chapter_eleven.mvc.view +{ + import chapter_eleven.mvc.model.AbstractModel; + import chapter_seven.the_observer_pattern.interfaces.IObserve; + import flash.display.Sprite; + + + + /** + * @author Ben Smith + */ + public class AbstractView extends Sprite implements IObserve + { + protected var _mdl : AbstractModel + + public function AbstractView( mdl : AbstractModel=null ) + { + if(mdl) + this.mdl = mdl; + + } + + public function notify( str : String ) : void + { + } + + public function get mdl() : AbstractModel + { + return _mdl; + } + + public function set mdl( mdl : AbstractModel ) : void + { + _mdl = mdl; + _mdl.addObserver(this,null) + } + + } +} diff --git a/BookSourceCode/src/chapter_eleven/mvc/view/FileSystemView.as b/BookSourceCode/src/chapter_eleven/mvc/view/FileSystemView.as new file mode 100644 index 0000000..93aa935 --- /dev/null +++ b/BookSourceCode/src/chapter_eleven/mvc/view/FileSystemView.as @@ -0,0 +1,20 @@ +package chapter_eleven.mvc.view +{ + import chapter_eleven.mvc.model.ConfigModel; + import chapter_eleven.mvc.model.FileSystem; + + import flash.display.Bitmap; + + /** + * @author Ben Smith + */ + public class FileSystemView extends AbstractFileSystemView + { + private var _backGround : Bitmap + + public function FileSystemView( mdl : FileSystem ) + { + super( ConfigModel( mdl ) ); + } + } +} diff --git a/BookSourceCode/src/chapter_eleven/mvc/view/FolderView.as b/BookSourceCode/src/chapter_eleven/mvc/view/FolderView.as new file mode 100644 index 0000000..7a11c59 --- /dev/null +++ b/BookSourceCode/src/chapter_eleven/mvc/view/FolderView.as @@ -0,0 +1,47 @@ +package chapter_eleven.mvc.view +{ + import chapter_eleven.mvc.controller.AbstractController; + import chapter_eleven.mvc.controller.ComponentRenamerController; + import chapter_eleven.mvc.elements.DisplayField; + import chapter_eleven.mvc.model.ConfigModel; + + import flash.display.Bitmap; + import flash.display.BitmapData; + import flash.events.MouseEvent; + + /** + * @author Ben Smith + */ + public class FolderView extends AbstractFolder + { + + + public function FolderView( mdl : ConfigModel = null ) + { + super( mdl ); + + + _field.text = mdl.name + _field.x = (this.width - _field.textWidth) * .5; + _field.y = this.height + PADDING; + _field.addEventListener( MouseEvent.MOUSE_DOWN , dispatch ); + _field.addEventListener( MouseEvent.MOUSE_UP , dispatch ); + addChild( _field ); + } + + override protected function createDefaultController() : AbstractController + { + return new ComponentRenamerController( _mdl , this ) + } + + override protected function createDisplayField() : DisplayField + { + return new DisplayField() + } + + override protected function createIcon() : Bitmap + { + return new Bitmap(new FolderImage()); + } + } +} diff --git a/BookSourceCode/src/chapter_eleven/mvc/view/IComposite.as b/BookSourceCode/src/chapter_eleven/mvc/view/IComposite.as new file mode 100644 index 0000000..55a6abf --- /dev/null +++ b/BookSourceCode/src/chapter_eleven/mvc/view/IComposite.as @@ -0,0 +1,11 @@ +package chapter_eleven.mvc.view +{ + /** + * @author Ben Smith + */ + public interface IComposite + { + function addComponent( cmpt : OSComponent ) : void + function removeComponent( cmpt : OSComponent ) : void + } +} diff --git a/BookSourceCode/src/chapter_eleven/mvc/view/LeafView.as b/BookSourceCode/src/chapter_eleven/mvc/view/LeafView.as new file mode 100644 index 0000000..3fdca34 --- /dev/null +++ b/BookSourceCode/src/chapter_eleven/mvc/view/LeafView.as @@ -0,0 +1,52 @@ +package chapter_eleven.mvc.view +{ + import chapter_eleven.mvc.controller.AbstractController; + import chapter_eleven.mvc.controller.ComponentRenamerController; + import chapter_eleven.mvc.elements.DisplayField; + import chapter_eleven.mvc.model.ConfigModel; + + import flash.display.Bitmap; + import flash.events.MouseEvent; + + /** + * @author Ben Smith + */ + public class LeafView extends OSComponent + { + + private var embeddedClass : Class; + + public function LeafView( mdl : ConfigModel = null ) + { + super( mdl ); + + _representation = createIcon() + _field = createDisplayField() + this.x = mdl.xPos + this.y = mdl.yPos + addChild( _representation ) + _field.text = mdl.name + _field.y = this.height + PADDING + _field.x = (this.width - _field.textWidth) * .5; + _field.addEventListener( MouseEvent.MOUSE_DOWN , dispatch ) + _field.addEventListener( MouseEvent.MOUSE_UP , dispatch ) + addChild( _field ) + _strategy = createDefaultController() + } + + protected function createDisplayField() : DisplayField + { + return new DisplayField() + } + + protected function createIcon() : Bitmap + { + return new Bitmap(new FileImage()) + } + + override protected function createDefaultController() : AbstractController + { + return new ComponentRenamerController( _mdl , this ) + } + } +} diff --git a/BookSourceCode/src/chapter_eleven/mvc/view/OSComponent.as b/BookSourceCode/src/chapter_eleven/mvc/view/OSComponent.as new file mode 100644 index 0000000..cfdbaaa --- /dev/null +++ b/BookSourceCode/src/chapter_eleven/mvc/view/OSComponent.as @@ -0,0 +1,46 @@ +package chapter_eleven.mvc.view +{ + import chapter_eleven.mvc.elements.DisplayField; + import chapter_eleven.mvc.model.ConfigModel; + + import flash.display.Bitmap; + import flash.events.MouseEvent; + + /** + * @author Ben Smith + */ + public class OSComponent extends AbstractFileSystemView + { + protected var _fileName : String; + protected var _field : DisplayField; + protected var _representation : Bitmap; + protected var _parentComposite : OSComponent + static protected const PADDING : int = 4 + + public function OSComponent( mdl : ConfigModel ) + { + super( mdl ); + } + + protected function dispatch( event : MouseEvent ) : void + { + event.stopPropagation() + dispatchEvent( event ) + } + + public function open() : void + { + } + + public function close() : void + { + } + + public function get field() : DisplayField + { + return _field; + } + } +} + + diff --git a/BookSourceCode/src/chapter_eleven/mvc/view/UIComposite.as b/BookSourceCode/src/chapter_eleven/mvc/view/UIComposite.as new file mode 100644 index 0000000..c78c430 --- /dev/null +++ b/BookSourceCode/src/chapter_eleven/mvc/view/UIComposite.as @@ -0,0 +1,37 @@ +package chapter_eleven.mvc.view +{ + import chapter_eleven.mvc.model.ConfigModel; + import chapter_seven.iterator_pattern.collections.concretes.ArrayCollection; + + + /** + * @author Ben Smith + */ + public class UIComposite extends OSComponent implements IComposite + { + protected var _arCollection : ArrayCollection + + public function UIComposite( mdl : ConfigModel ) + { + super( mdl ); + } + + public function addComponent( cmpt : OSComponent ) : void + { + verifyCollection() + _arCollection.append(cmpt) + cmpt.mdl=this._mdl + } + + public function removeComponent( cmpt : OSComponent ) : void + { + + } + + protected function verifyCollection() : void + { + if (!_arCollection) + _arCollection = new ArrayCollection() + } + } +} diff --git a/BookSourceCode/src/chapter_eleven/mvc/view/WindowView.as b/BookSourceCode/src/chapter_eleven/mvc/view/WindowView.as new file mode 100644 index 0000000..5e6b3b6 --- /dev/null +++ b/BookSourceCode/src/chapter_eleven/mvc/view/WindowView.as @@ -0,0 +1,57 @@ +package chapter_eleven.mvc.view +{ + import chapter_eleven.mvc.controller.AbstractController; + import chapter_eleven.mvc.controller.DragableController; + import chapter_eleven.mvc.model.ConfigModel; + + import flash.display.Bitmap; + import flash.display.BitmapData; + import flash.display.DisplayObject; + import flash.events.Event; + + /** + * @author Ben Smith + */ + public class WindowView extends AbstractFileSystemView + { + private var _arCollection : Array = []; + private var _bg : Bitmap + + public function WindowView( mdl : ConfigModel ) + { + super( mdl ); + this.mouseEnabled = false + this.mouseChildren = true + addEventListener( Event.ADDED_TO_STAGE , onStagePresent ) + _strategy = createDefaultController() + } + + private function onStagePresent( event : Event ) : void + { + removeEventListener( Event.ADDED_TO_STAGE , onStagePresent ) + _bg = makeBackground() + addChildAt( _bg , 0 ) + } + + private function makeBackground() : Bitmap + { + return (new Bitmap( new BitmapData( this.stage.stageWidth , this.stage.stageHeight , false , 0xc9c9c9 ) )) + } + + public function addComponent( cmpt : AbstractView ) : void + { + doAddComponent( cmpt ) + } + + override protected function createDefaultController() : AbstractController + { + return new DragableController( _mdl , this ) + } + + protected function doAddComponent( cmpt : DisplayObject ) : void + { + _arCollection[_arCollection.length] = cmpt + addChild( cmpt ); + } + } +} diff --git a/BookSourceCode/src/chapter_seven/chain_of_responsibility/DocumentClass.as b/BookSourceCode/src/chapter_seven/chain_of_responsibility/DocumentClass.as new file mode 100644 index 0000000..cce909e --- /dev/null +++ b/BookSourceCode/src/chapter_seven/chain_of_responsibility/DocumentClass.as @@ -0,0 +1,38 @@ +package chapter_seven.chain_of_responsibility +{ + import chapter_seven.chain_of_responsibility.components.HandlerSprite; + import chapter_seven.chain_of_responsibility.components.InitiatorSprite; + import chapter_seven.chain_of_responsibility.components.NullHandler; + import chapter_seven.chain_of_responsibility.components.abstraction.AbstractEventHandlerSprite; + import flash.display.DisplayObject; + import flash.display.Sprite; + + /** + * @author Ben Smith + */ + public class DocumentClass extends Sprite + { + public function DocumentClass() + { + var sprite_A : Sprite = new HandlerSprite(); + sprite_A.name = 'sprite_A'; + + var sprite_B : AbstractEventHandlerSprite = new HandlerSprite(); + sprite_B.name = 'sprite_B'; + sprite_B.y = sprite_B.tall + + var child_A : AbstractEventHandlerSprite = new InitiatorSprite(); + child_A.name = 'childSprite_A'; + child_A.x = child_A.wide + + addChild( sprite_B ); + addChild( sprite_A ); + sprite_A.addChild( DisplayObject( child_A ) ); + + child_A.addHandler( sprite_B ); + // pass sprite_B ass the successor of child_A + sprite_B.addHandler( new NullHandler() ); + // pass NullHandler ass the successor of sprite_B; + } + } +} diff --git a/BookSourceCode/src/chapter_seven/chain_of_responsibility/components/HandlerSprite.as b/BookSourceCode/src/chapter_seven/chain_of_responsibility/components/HandlerSprite.as new file mode 100644 index 0000000..edaa370 --- /dev/null +++ b/BookSourceCode/src/chapter_seven/chain_of_responsibility/components/HandlerSprite.as @@ -0,0 +1,22 @@ +package chapter_seven.chain_of_responsibility.components +{ + import chapter_seven.chain_of_responsibility.components.abstraction.AbstractEventHandlerSprite; + + import flash.events.Event; + + /** + * @author Ben Smith + */ + public class HandlerSprite extends AbstractEventHandlerSprite + { + public function HandlerSprite() + { + super(); + } + + override protected function doHandleEvent( event : Event ) : void + { + trace( this.name + ' I received the doHanleEvent' ) + } + } +} diff --git a/BookSourceCode/src/chapter_seven/chain_of_responsibility/components/InitiatorSprite.as b/BookSourceCode/src/chapter_seven/chain_of_responsibility/components/InitiatorSprite.as new file mode 100644 index 0000000..7fb5b2a --- /dev/null +++ b/BookSourceCode/src/chapter_seven/chain_of_responsibility/components/InitiatorSprite.as @@ -0,0 +1,21 @@ +package chapter_seven.chain_of_responsibility.components +{ + import flash.events.MouseEvent; + + /** + * @author Ben Smith + */ + public class InitiatorSprite extends HandlerSprite + { + public function InitiatorSprite() + { + super(); + addEventListener( MouseEvent.MOUSE_OVER , onHover , false , 0 , true ); + } + + private function onHover( me : MouseEvent ) : void + { + this.forwardEvent( me ) + } + } +} diff --git a/BookSourceCode/src/chapter_seven/chain_of_responsibility/components/NullHandler.as b/BookSourceCode/src/chapter_seven/chain_of_responsibility/components/NullHandler.as new file mode 100644 index 0000000..cf9c90a --- /dev/null +++ b/BookSourceCode/src/chapter_seven/chain_of_responsibility/components/NullHandler.as @@ -0,0 +1,27 @@ +package chapter_seven.chain_of_responsibility.components +{ + import chapter_seven.chain_of_responsibility.components.interfaces.IEventHandler; + + import flash.events.Event; + + /** + * @author Ben Smith + */ + public class NullHandler extends Object implements IEventHandler + { + public function NullHandler() + { + } + + final public function addHandler( handler : IEventHandler ) : void + { + return; + } + + final public function forwardEvent( event : Event ) : void + { + trace( 'end of the chain' ) + return; + } + } +} diff --git a/BookSourceCode/src/chapter_seven/chain_of_responsibility/components/abstraction/AbstractEventHandlerSprite.as b/BookSourceCode/src/chapter_seven/chain_of_responsibility/components/abstraction/AbstractEventHandlerSprite.as new file mode 100644 index 0000000..cfaf1e3 --- /dev/null +++ b/BookSourceCode/src/chapter_seven/chain_of_responsibility/components/abstraction/AbstractEventHandlerSprite.as @@ -0,0 +1,61 @@ +package chapter_seven.chain_of_responsibility.components.abstraction +{ + import chapter_seven.chain_of_responsibility.components.interfaces.IEventHandler; + import flash.display.Sprite; + import flash.errors.IllegalOperationError; + import flash.events.Event; + + /** + * @author Ben Smith + */ + public class AbstractEventHandlerSprite extends Sprite implements IEventHandler + { + private var _eventHandler : IEventHandler; + static protected const WIDTH : int = 58; + static protected const HEIGHT : int = 58; + + public function AbstractEventHandlerSprite() + { + this.graphics.lineStyle(1,0xFFFFFF,1) + this.graphics.beginFill( 0x000000 ); + this.graphics.drawRect( 0 , 0 , WIDTH , HEIGHT ) + } + + final public function addHandler( eventHandler : IEventHandler ) : void + { + doAddHandler( eventHandler ); + } + + final public function forwardEvent( event : Event ) : void + { + doHandleEvent( event ); + doForwardEvent( event ); + } + + protected function doAddHandler( eventHandler : IEventHandler ) : void + { + _eventHandler = eventHandler; + trace( eventHandler + ' added' ) + } + + protected function doHandleEvent( event : Event ) : void + { + throw new IllegalOperationError( 'doHandleEvent must be overridden' ) + } + + protected function doForwardEvent( event : Event ) : void + { + _eventHandler.forwardEvent( event ); + } + + public function get wide() : Number + { + return WIDTH + } + + public function get tall() : Number + { + return HEIGHT + } + } +} diff --git a/BookSourceCode/src/chapter_seven/chain_of_responsibility/components/interfaces/IEventHandler.as b/BookSourceCode/src/chapter_seven/chain_of_responsibility/components/interfaces/IEventHandler.as new file mode 100644 index 0000000..e188ff8 --- /dev/null +++ b/BookSourceCode/src/chapter_seven/chain_of_responsibility/components/interfaces/IEventHandler.as @@ -0,0 +1,11 @@ +package chapter_seven.chain_of_responsibility.components.interfaces { + import flash.events.Event; + + /** + * @author Ben Smith + */ + public interface IEventHandler { + function addHandler(handler:IEventHandler) : void; + function forwardEvent(event : Event) : void; + } +} diff --git a/BookSourceCode/src/chapter_seven/command_pattern/DocumentClass.as b/BookSourceCode/src/chapter_seven/command_pattern/DocumentClass.as new file mode 100644 index 0000000..6c779a6 --- /dev/null +++ b/BookSourceCode/src/chapter_seven/command_pattern/DocumentClass.as @@ -0,0 +1,27 @@ +package chapter_seven.command_pattern +{ + import chapter_seven.command_pattern.commanders.pauseable_commands.PauseCommand; + import chapter_seven.command_pattern.commanders.pauseable_commands.ResumeCommand; + import chapter_seven.command_pattern.components.ReusableButton; + import chapter_seven.command_pattern.interfaces.IPause; + import flash.display.Sprite; + + + /** + * @author Ben Smith + */ + public class DocumentClass extends Sprite + { + var btn : ReusableButton + + public function DocumentClass() + { + var whateverPauseable : IPause = addChild(new SomeMovieClip()) as IPause; + + btn = addChild(new SomeButton()) as ReusableButton; + btn.exitCommand = new ResumeCommand( whateverPauseable ) + btn.hoverCommand = new PauseCommand( whateverPauseable ); + btn.y=50; + } + } +} diff --git a/BookSourceCode/src/chapter_seven/command_pattern/commanders/interfaces/ICommand.as b/BookSourceCode/src/chapter_seven/command_pattern/commanders/interfaces/ICommand.as new file mode 100644 index 0000000..ff765e5 --- /dev/null +++ b/BookSourceCode/src/chapter_seven/command_pattern/commanders/interfaces/ICommand.as @@ -0,0 +1,10 @@ +package chapter_seven.command_pattern.commanders.interfaces +{ + /** + * @author Ben Smith + */ + public interface ICommand + { + function execute() : void + } +} diff --git a/BookSourceCode/src/chapter_seven/command_pattern/commanders/pauseable_commands/PauseCommand.as b/BookSourceCode/src/chapter_seven/command_pattern/commanders/pauseable_commands/PauseCommand.as new file mode 100644 index 0000000..dcdcf32 --- /dev/null +++ b/BookSourceCode/src/chapter_seven/command_pattern/commanders/pauseable_commands/PauseCommand.as @@ -0,0 +1,23 @@ +package chapter_seven.command_pattern.commanders.pauseable_commands +{ + import chapter_seven.command_pattern.commanders.pauseable_commands.abstractions.APauseableCommand; + import chapter_seven.command_pattern.interfaces.IPause; + + /** + * @author Ben Smith + */ + public class PauseCommand extends APauseableCommand + { + + public function PauseCommand( aReceiver : IPause ) + { + super(aReceiver) + } + + override protected function doExecution() : void + { + _receiver.pause(); + } + + } +} \ No newline at end of file diff --git a/BookSourceCode/src/chapter_seven/command_pattern/commanders/pauseable_commands/ResumeCommand.as b/BookSourceCode/src/chapter_seven/command_pattern/commanders/pauseable_commands/ResumeCommand.as new file mode 100644 index 0000000..0fd63a6 --- /dev/null +++ b/BookSourceCode/src/chapter_seven/command_pattern/commanders/pauseable_commands/ResumeCommand.as @@ -0,0 +1,21 @@ +package chapter_seven.command_pattern.commanders.pauseable_commands +{ + import chapter_seven.command_pattern.commanders.pauseable_commands.abstractions.APauseableCommand; + import chapter_seven.command_pattern.interfaces.IPause; + + /** + * @author Ben Smith + */ + public class ResumeCommand extends APauseableCommand + { + public function ResumeCommand( aReceiver : IPause ) : void + { + super( aReceiver ); + } + + override protected function doExecution() : void + { + _receiver.resume(); + } + } +} \ No newline at end of file diff --git a/BookSourceCode/src/chapter_seven/command_pattern/commanders/pauseable_commands/abstractions/APauseableCommand.as b/BookSourceCode/src/chapter_seven/command_pattern/commanders/pauseable_commands/abstractions/APauseableCommand.as new file mode 100644 index 0000000..088a1cd --- /dev/null +++ b/BookSourceCode/src/chapter_seven/command_pattern/commanders/pauseable_commands/abstractions/APauseableCommand.as @@ -0,0 +1,40 @@ +package chapter_seven.command_pattern.commanders.pauseable_commands.abstractions +{ + import chapter_seven.command_pattern.commanders.interfaces.ICommand; + import chapter_seven.command_pattern.interfaces.IPause; + + import flash.errors.IllegalOperationError; + + /** + * @author Ben Smith + */ + public class APauseableCommand implements ICommand + { + protected var _receiver : IPause + + public function APauseableCommand( aReceiver : IPause ) : void + { + _receiver = aReceiver; + } + + final public function execute() : void + { + doExecution(); + } + + final public function set receiver( aReceiver : IPause ) : void + { + _receiver = aReceiver; + } + + final public function get receiver() : IPause + { + return _receiver ; + } + + protected function doExecution() : void + { + throw new IllegalOperationError( 'doExecution must be overridden' ); + } + } +} diff --git a/BookSourceCode/src/chapter_seven/command_pattern/components/ReusableButton.as b/BookSourceCode/src/chapter_seven/command_pattern/components/ReusableButton.as new file mode 100644 index 0000000..a8a6b2a --- /dev/null +++ b/BookSourceCode/src/chapter_seven/command_pattern/components/ReusableButton.as @@ -0,0 +1,54 @@ +package chapter_seven.command_pattern.components +{ + import chapter_seven.command_pattern.commanders.interfaces.ICommand; + + import flash.display.Sprite; + import flash.events.MouseEvent; + + /** + * @author Ben Smith + */ + public class ReusableButton extends Sprite + { + private var _exitCommand : ICommand; + private var _hoverCommand : ICommand; + + public function ReusableButton() + { + buttonMode = true; + mouseChildren = false; + addEventListener( MouseEvent.MOUSE_OVER , onHover ) + addEventListener( MouseEvent.MOUSE_OUT , onOut ) + } + + final public function get hoverCommand() : ICommand + { + return _hoverCommand; + } + + final public function set hoverCommand( command : ICommand ) : void + { + _hoverCommand = command; + } + + final public function get exitCommand() : ICommand + { + return _exitCommand; + } + + final public function set exitCommand( command : ICommand ) : void + { + _exitCommand = command; + } + + final private function onHover( me : MouseEvent ) : void + { + _hoverCommand.execute(); + } + + final private function onOut( me : MouseEvent ) : void + { + _exitCommand.execute(); + } + } +} diff --git a/BookSourceCode/src/chapter_seven/command_pattern/interfaces/IPause.as b/BookSourceCode/src/chapter_seven/command_pattern/interfaces/IPause.as new file mode 100644 index 0000000..12eed16 --- /dev/null +++ b/BookSourceCode/src/chapter_seven/command_pattern/interfaces/IPause.as @@ -0,0 +1,12 @@ +package chapter_seven.command_pattern.interfaces +{ + /** + * @author Ben Smith + */ + public interface IPause + { + function pause() : void; + + function resume() : void; + } +} diff --git a/BookSourceCode/src/chapter_seven/command_pattern/products/ExtendedMovieClip.as b/BookSourceCode/src/chapter_seven/command_pattern/products/ExtendedMovieClip.as new file mode 100644 index 0000000..eae0b48 --- /dev/null +++ b/BookSourceCode/src/chapter_seven/command_pattern/products/ExtendedMovieClip.as @@ -0,0 +1,23 @@ +package chapter_seven.command_pattern.products +{ + import chapter_seven.command_pattern.interfaces.IPause; + + import flash.display.MovieClip; + + /** + * @author Ben Smith + */ + public class ExtendedMovieClip extends MovieClip implements IPause + { + + final public function pause() : void + { + this.stop(); + } + + final public function resume() : void + { + this.play(); + } + } +} \ No newline at end of file diff --git a/BookSourceCode/src/chapter_seven/command_pattern/products/ExtendedMovieClipAndSound.as b/BookSourceCode/src/chapter_seven/command_pattern/products/ExtendedMovieClipAndSound.as new file mode 100644 index 0000000..2851c39 --- /dev/null +++ b/BookSourceCode/src/chapter_seven/command_pattern/products/ExtendedMovieClipAndSound.as @@ -0,0 +1,27 @@ +package chapter_seven.command_pattern.products +{ + import chapter_seven.command_pattern.interfaces.IPause; + + import flash.display.Sprite; + + /** + * @author Ben Smith + */ + public class ExtendedMovieClipAndSound extends Sprite implements IPause + { + private var _mc : ExtendedMovieClip; + private var _snd : ExtendedSound; + + final public function pause() : void + { + _mc. pause(); + _snd. pause(); + } + + final public function resume() : void + { + _mc. resume(); + _snd.resume(); + } + } +} diff --git a/BookSourceCode/src/chapter_seven/command_pattern/products/ExtendedSound.as b/BookSourceCode/src/chapter_seven/command_pattern/products/ExtendedSound.as new file mode 100644 index 0000000..3bde195 --- /dev/null +++ b/BookSourceCode/src/chapter_seven/command_pattern/products/ExtendedSound.as @@ -0,0 +1,27 @@ +package chapter_seven.command_pattern.products +{ + import chapter_seven.command_pattern.interfaces.IPause; + + import flash.media.Sound; + import flash.media.SoundChannel; + + /** + * @author Ben Smith + */ + public class ExtendedSound extends Sound implements IPause + { + private var _sndPosition : Number; + private var _sndChannel : SoundChannel; + + final public function pause() : void + { + _sndPosition=_sndChannel.position; + _sndChannel.stop(); + } + + final public function resume() : void + { + _sndChannel = play( _sndPosition , 0 ); + } + } +} diff --git a/BookSourceCode/src/chapter_seven/iterator_pattern/DocumentClass.as b/BookSourceCode/src/chapter_seven/iterator_pattern/DocumentClass.as new file mode 100644 index 0000000..9dc8630 --- /dev/null +++ b/BookSourceCode/src/chapter_seven/iterator_pattern/DocumentClass.as @@ -0,0 +1,51 @@ +package chapter_seven.iterator_pattern +{ + import chapter_seven.iterator_pattern.collections.abstractions.AbstractArrayCollection; + import chapter_seven.iterator_pattern.collections.concretes.ArrayCollection; + import chapter_seven.iterator_pattern.interfaces.IIterator; + import chapter_seven.iterator_pattern.iterators.concretes.ArrayIterator; + import flash.display.Sprite; + + + /** + * @author Ben Smith + */ + public class DocumentClass extends Sprite + { + public function DocumentClass() + { + var arrayCollection : AbstractArrayCollection = new ArrayCollection() + arrayCollection.append( 1 ) + arrayCollection.append( 2 ) + arrayCollection.append( 3 ) + arrayCollection.append( 4 ) + arrayCollection.append( 5 ) + + var it : IIterator = arrayCollection.createIterator(); + + do + { + trace( it.currentElement() ); + it.next(); + } + while (it.hasNext()) + + arrayCollection.each( test ) + var ar : Array = [ 1 , 2 , 3 , 4 , 5 , 6 ] + + var itr : IIterator = new ArrayIterator( ar ) + do + { + trace( itr.currentElement() + ' via AS3.0 Array ' ); + itr.next(); + } + while (itr.hasNext()) + } + + function test( element : int , index : int , arrayCollection : Array ) : Boolean + { + trace( element , index , arrayCollection ) + return true + } + } +} diff --git a/BookSourceCode/src/chapter_seven/iterator_pattern/collections/abstractions/AbastractCollection.as b/BookSourceCode/src/chapter_seven/iterator_pattern/collections/abstractions/AbastractCollection.as new file mode 100644 index 0000000..ad47726 --- /dev/null +++ b/BookSourceCode/src/chapter_seven/iterator_pattern/collections/abstractions/AbastractCollection.as @@ -0,0 +1,62 @@ +package chapter_seven.iterator_pattern.collections.abstractions +{ + import chapter_seven.iterator_pattern.interfaces.IIterate; + import chapter_seven.iterator_pattern.interfaces.IIterator; + import flash.errors.IllegalOperationError; + + + /** + * @author Ben Smith + */ + public class AbastractCollection extends Object implements IIterate + { + protected var _iterator : IIterator + + public function AbastractCollection() + { + } + + final public function count() : int + { + return doCount() + } + + final public function append( element : * ) : Boolean + { + return doAppend( element ); + } + + final public function remove( element : * ) : Boolean + { + return doRemove( element ); + } + + final public function createIterator( string : String = null ) : IIterator + { + return doCreateIterator( string ) + } + + protected function doCount() : int + { + throw new IllegalOperationError( ' doCount must be overriden' ) + return 0; + } + + protected function doAppend( element : * ) : Boolean + { + throw new IllegalOperationError( ' doAppend must be overriden' ) + return false; + } + + protected function doRemove( element : * ) : Boolean + { + throw new IllegalOperationError( ' doRemove must be overriden' ) + return false; + } + + protected function doCreateIterator( string : String ) : IIterator + { + return null; + } + } +} diff --git a/BookSourceCode/src/chapter_seven/iterator_pattern/collections/abstractions/AbstractArrayCollection.as b/BookSourceCode/src/chapter_seven/iterator_pattern/collections/abstractions/AbstractArrayCollection.as new file mode 100644 index 0000000..fbb4721 --- /dev/null +++ b/BookSourceCode/src/chapter_seven/iterator_pattern/collections/abstractions/AbstractArrayCollection.as @@ -0,0 +1,57 @@ +package chapter_seven.iterator_pattern.collections.abstractions +{ + import chapter_seven.iterator_pattern.interfaces.IIterator; + import flash.errors.IllegalOperationError; + + + + /** + * @author Ben Smith + */ + public class AbstractArrayCollection extends AbastractCollection + { + protected var _collection : Array + + public function AbstractArrayCollection() + { + super(); + _collection = new Array() + } + + public function each( func : Function ) : void + { + var tmpIt : IIterator = doCreateIterator( null ) + var __count : int = 0 + do + { + + func.call( this , tmpIt.currentElement() , __count , _collection ) + tmpIt.next() + __count++ + } + while (tmpIt.hasNext()) + } + + override protected function doCount() : int + { + return _collection.length + } + + override protected function doAppend( element : * ) : Boolean + { + _collection[_collection.length] = element; + + return true + } + + override protected function doRemove( element : * ) : Boolean + { + return false; + } + + override protected function doCreateIterator( string : String ) : IIterator + { + throw new IllegalOperationError( ' doCreateIterator must be overriden' ) + } + } +} diff --git a/BookSourceCode/src/chapter_seven/iterator_pattern/collections/concretes/ArrayCollection.as b/BookSourceCode/src/chapter_seven/iterator_pattern/collections/concretes/ArrayCollection.as new file mode 100644 index 0000000..a1570a0 --- /dev/null +++ b/BookSourceCode/src/chapter_seven/iterator_pattern/collections/concretes/ArrayCollection.as @@ -0,0 +1,22 @@ +package chapter_seven.iterator_pattern.collections.concretes +{ + import chapter_seven.iterator_pattern.collections.abstractions.AbstractArrayCollection; + import chapter_seven.iterator_pattern.interfaces.IIterator; + import chapter_seven.iterator_pattern.iterators.concretes.ArrayIterator; + + /** + * @author Ben Smith + */ + public class ArrayCollection extends AbstractArrayCollection + { + public function ArrayCollection() + { + super(); + } + + override protected function doCreateIterator( string : String ) : IIterator + { + return new ArrayIterator( _collection ); + } + } +} diff --git a/BookSourceCode/src/chapter_seven/iterator_pattern/collections/concretes/DictionaryCollection.as b/BookSourceCode/src/chapter_seven/iterator_pattern/collections/concretes/DictionaryCollection.as new file mode 100644 index 0000000..71c96ab --- /dev/null +++ b/BookSourceCode/src/chapter_seven/iterator_pattern/collections/concretes/DictionaryCollection.as @@ -0,0 +1,61 @@ +package chapter_seven.iterator_pattern.collections.concretes +{ + import chapter_seven.iterator_pattern.interfaces.IIterate; + import chapter_seven.iterator_pattern.interfaces.IIterator; + import chapter_seven.iterator_pattern.iterators.concretes.ArrayIterator; + import flash.utils.Dictionary; + import flash.utils.getTimer; + + + /** + * @author Ben Smith + */ + public class DictionaryCollection implements IIterate + { + private var _dict : Dictionary + + public function DictionaryCollection() + { + _dict = new Dictionary() + } + + public function count() : int + { + var i : int = 0 + var obj : Object + var localDict : Object = _dict + for (obj in localDict) + { + i++ + } + return i + } + + public function append( item : * ) : Boolean + { + _dict[item] = String( getTimer() ).toString(); + return true + } + + public function remove( item : * ) : Boolean + { + delete _dict[item] + return true + } + + final public function createIterator( string : String = null ) : IIterator + { + return doCreateIterator( string ) + } + + protected function doCreateIterator( string : String ) : IIterator + { + var ar : Array = [] + for (var obj:* in _dict) + { + ar[ar.length] = obj + } + return new ArrayIterator( ar ); + } + } +} diff --git a/BookSourceCode/src/chapter_seven/iterator_pattern/collections/concretes/xml/XMLListCollection.as b/BookSourceCode/src/chapter_seven/iterator_pattern/collections/concretes/xml/XMLListCollection.as new file mode 100644 index 0000000..de858f7 --- /dev/null +++ b/BookSourceCode/src/chapter_seven/iterator_pattern/collections/concretes/xml/XMLListCollection.as @@ -0,0 +1,41 @@ +package chapter_seven.iterator_pattern.collections.concretes.xml +{ + import chapter_seven.iterator_pattern.collections.abstractions.AbastractCollection; + import chapter_seven.iterator_pattern.interfaces.IIterator; + + /** + * @author Ben Smith + */ + public class XMLListCollection extends AbastractCollection + { + protected var _collection : XMLList; + protected var _cursor : int = 0 + + public function XMLListCollection() + { + _collection = new XMLList() + } + + override protected function doCount() : int + { + return _cursor + } + + override protected function doAppend( element : * ) : Boolean + { + _collection[_cursor++] = element; + + return true + } + + override protected function doRemove( element : * ) : Boolean + { + return false; + } + + override protected function doCreateIterator( string : String ) : IIterator + { + return new XMLListItterator( _collection ); + } + } +} \ No newline at end of file diff --git a/BookSourceCode/src/chapter_seven/iterator_pattern/collections/concretes/xml/XMLListItterator.as b/BookSourceCode/src/chapter_seven/iterator_pattern/collections/concretes/xml/XMLListItterator.as new file mode 100644 index 0000000..c4f38da --- /dev/null +++ b/BookSourceCode/src/chapter_seven/iterator_pattern/collections/concretes/xml/XMLListItterator.as @@ -0,0 +1,14 @@ +package chapter_seven.iterator_pattern.collections.concretes.xml +{ + import chapter_seven.iterator_pattern.iterators.abstractions.AbstractIterator; + + /** + * @author Ben Smith + */ + public class XMLListItterator extends AbstractIterator + { + public function XMLListItterator( xmlList : XMLList ) + { + } + } +} diff --git a/BookSourceCode/src/chapter_seven/iterator_pattern/collections/concretes/xml/interfaces/IXMLListIterator.as b/BookSourceCode/src/chapter_seven/iterator_pattern/collections/concretes/xml/interfaces/IXMLListIterator.as new file mode 100644 index 0000000..0a84a37 --- /dev/null +++ b/BookSourceCode/src/chapter_seven/iterator_pattern/collections/concretes/xml/interfaces/IXMLListIterator.as @@ -0,0 +1,11 @@ +package chapter_seven.iterator_pattern.collections.concretes.xml.interfaces +{ + import chapter_seven.iterator_pattern.interfaces.IIterate; + /** + * @author Ben Smith + */ + public interface IXMLListIterator extends IIterate + { + function set aggregate( xmllist : XMLList ) : void + } +} diff --git a/BookSourceCode/src/chapter_seven/iterator_pattern/factory/abstract/AbstractArrayIteratorFactory.as b/BookSourceCode/src/chapter_seven/iterator_pattern/factory/abstract/AbstractArrayIteratorFactory.as new file mode 100644 index 0000000..944a166 --- /dev/null +++ b/BookSourceCode/src/chapter_seven/iterator_pattern/factory/abstract/AbstractArrayIteratorFactory.as @@ -0,0 +1,9 @@ +package chapter_seven.iterator_pattern.factory.abstract +{ + /** + * @author Ben Smith + */ + public class AbstractArrayIteratorFactory + { + } +} diff --git a/BookSourceCode/src/chapter_seven/iterator_pattern/interfaces/IAggregate.as b/BookSourceCode/src/chapter_seven/iterator_pattern/interfaces/IAggregate.as new file mode 100644 index 0000000..078d68b --- /dev/null +++ b/BookSourceCode/src/chapter_seven/iterator_pattern/interfaces/IAggregate.as @@ -0,0 +1,14 @@ +package chapter_seven.iterator_pattern.interfaces +{ + /** + * @author Ben Smith + */ + public interface IAggregate + { + function count() : int + + function append( item : * ) : Boolean; + + function remove( item : * ) : Boolean; + } +} diff --git a/BookSourceCode/src/chapter_seven/iterator_pattern/interfaces/IIterate.as b/BookSourceCode/src/chapter_seven/iterator_pattern/interfaces/IIterate.as new file mode 100644 index 0000000..ea59e49 --- /dev/null +++ b/BookSourceCode/src/chapter_seven/iterator_pattern/interfaces/IIterate.as @@ -0,0 +1,10 @@ +package chapter_seven.iterator_pattern.interfaces +{ + /** + * @author Ben Smith + */ + public interface IIterate extends IAggregate + { + function createIterator( string : String = null ) : IIterator + } +} diff --git a/BookSourceCode/src/chapter_seven/iterator_pattern/interfaces/IIterator.as b/BookSourceCode/src/chapter_seven/iterator_pattern/interfaces/IIterator.as new file mode 100644 index 0000000..591b7ef --- /dev/null +++ b/BookSourceCode/src/chapter_seven/iterator_pattern/interfaces/IIterator.as @@ -0,0 +1,16 @@ +package chapter_seven.iterator_pattern.interfaces +{ + /** + * @author Ben Smith + */ + public interface IIterator + { + function next() : void; + + function hasNext() : Boolean + + function reset() : void + + function currentElement():* + } +} diff --git a/BookSourceCode/src/chapter_seven/iterator_pattern/iterators/abstractions/AbstractIterator.as b/BookSourceCode/src/chapter_seven/iterator_pattern/iterators/abstractions/AbstractIterator.as new file mode 100644 index 0000000..9a2964e --- /dev/null +++ b/BookSourceCode/src/chapter_seven/iterator_pattern/iterators/abstractions/AbstractIterator.as @@ -0,0 +1,56 @@ +package chapter_seven.iterator_pattern.iterators.abstractions +{ + import chapter_seven.iterator_pattern.interfaces.IIterator; + import flash.errors.IllegalOperationError; + + + /** + * @author Ben Smith + */ + public class AbstractIterator extends Object implements IIterator + { + protected var _cursor : int = 0; + final public function next() : void + { + doNext() + } + + final public function hasNext() : Boolean + { + return doHasNext() + } + + final public function reset() : void + { + doReset() + } + + final public function currentElement() : * + { + return doCurrentElement() + } + + protected function doNext() : void + { + throw new IllegalOperationError( 'doNext must be overriden ' ) + } + + protected function doHasNext() : Boolean + { + throw new IllegalOperationError( 'doHasNext must be overriden ' ) + return false; + } + + protected function doReset() : void + { + throw new IllegalOperationError( 'doReset must be overriden ' ) + } + + protected function doCurrentElement() : * + { + throw new IllegalOperationError( 'doCurrentElement must be overriden ' ) + return null + } + } + +} diff --git a/BookSourceCode/src/chapter_seven/iterator_pattern/iterators/concretes/ArrayIterator.as b/BookSourceCode/src/chapter_seven/iterator_pattern/iterators/concretes/ArrayIterator.as new file mode 100644 index 0000000..16a6de9 --- /dev/null +++ b/BookSourceCode/src/chapter_seven/iterator_pattern/iterators/concretes/ArrayIterator.as @@ -0,0 +1,37 @@ +package chapter_seven.iterator_pattern.iterators.concretes +{ + import chapter_seven.iterator_pattern.iterators.abstractions.AbstractIterator; + + /** + * @author Ben Smith + */ + public class ArrayIterator extends AbstractIterator + { + protected var _collection : Array; + + public function ArrayIterator( collection : Array ) + { + _collection = collection; + } + + override protected function doNext() : void + { + _cursor++; + } + + override protected function doHasNext() : Boolean + { + return _cursor < (_collection.length ); + } + + override protected function doReset() : void + { + _cursor = 0; + } + + override protected function doCurrentElement() : * + { + return _collection[_cursor] + } + } +} diff --git a/BookSourceCode/src/chapter_seven/iterator_pattern/iterators/concretes/IArrayIterator.as b/BookSourceCode/src/chapter_seven/iterator_pattern/iterators/concretes/IArrayIterator.as new file mode 100644 index 0000000..d6bf380 --- /dev/null +++ b/BookSourceCode/src/chapter_seven/iterator_pattern/iterators/concretes/IArrayIterator.as @@ -0,0 +1,12 @@ +package chapter_seven.iterator_pattern.iterators.concretes +{ + import chapter_seven.iterator_pattern.interfaces.IIterate; + + /** + * @author Ben Smith + */ + public interface IArrayIterator extends IIterate + { + function set agregate( arrayAggregate : Array ) : void + } +} diff --git a/BookSourceCode/src/chapter_seven/memento/DocumentClass.as b/BookSourceCode/src/chapter_seven/memento/DocumentClass.as new file mode 100644 index 0000000..8212b8d --- /dev/null +++ b/BookSourceCode/src/chapter_seven/memento/DocumentClass.as @@ -0,0 +1,34 @@ +package chapter_seven.memento +{ + import chapter_seven.memento.components.Caretaker; + import chapter_seven.memento.components.Originator; + import chapter_seven.memento.components.util.FormField; + import flash.display.Sprite; + import flash.display.StageAlign; + import flash.display.StageScaleMode; + import flash.text.TextFieldType; + + /** + * @author Ben Smith + */ + public class DocumentClass extends Sprite + { + var careTaker : Caretaker + var ff : FormField + + public function DocumentClass() + { + stage.align = StageAlign.TOP_LEFT + stage.scaleMode = StageScaleMode.NO_SCALE + + ff = new Originator() + ff.width = 300; + ff.height = 500; + ff.type = TextFieldType.INPUT; + ff.border = true; + addChild( ff ) + + careTaker = new Caretaker( Originator( ff ) ) + } + } +} diff --git a/BookSourceCode/src/chapter_seven/memento/components/Caretaker.as b/BookSourceCode/src/chapter_seven/memento/components/Caretaker.as new file mode 100644 index 0000000..b9f22ce --- /dev/null +++ b/BookSourceCode/src/chapter_seven/memento/components/Caretaker.as @@ -0,0 +1,78 @@ +package chapter_seven.memento.components +{ + import flash.display.Sprite; + import flash.events.KeyboardEvent; + import flash.sampler.getSize; + import flash.ui.Keyboard; + + /** + * @author Ben Smith + */ + public class Caretaker extends Sprite + { + public var _stack : Vector. + private var _originator : Originator + private var _backSpaceMonitor : Array = [] + + public function Caretaker( orginator : Originator ) + { + _originator = orginator + _originator.addEventListener( KeyboardEvent.KEY_DOWN , onKeyDown ) + _originator.addEventListener( KeyboardEvent.KEY_UP , onKeyUP ) + _stack = new Vector.(); + } + + + public function reset():void{ + + } + + public function stepBackward():void{ + + } + + private function onKeyUP( event : KeyboardEvent ) : void + { + if (!event.ctrlKey) + { + if (event.keyCode == Keyboard.BACKSPACE) + { + _backSpaceMonitor[_backSpaceMonitor.length] = true + } + if (_backSpaceMonitor.length > 1) + { + _backSpaceMonitor.shift() + return + } + else + { + addStack( _originator.makeMemento() ) + } + } + } + + + + private function onKeyDown( event : KeyboardEvent ) : void + { + + if (event.ctrlKey && event.keyCode == 90) + { + _originator.setMemento( retrieveStack() ) + } + } + + + + private function addStack( memento : Memento ) : void + { + trace( getSize( memento ) ) + _stack[_stack.length] = memento + } + + private function retrieveStack() : Memento + { + return _stack.pop() + } + } +} diff --git a/BookSourceCode/src/chapter_seven/memento/components/Memento.as b/BookSourceCode/src/chapter_seven/memento/components/Memento.as new file mode 100644 index 0000000..69e7c95 --- /dev/null +++ b/BookSourceCode/src/chapter_seven/memento/components/Memento.as @@ -0,0 +1,38 @@ +package chapter_seven.memento.components +{ + import chapter_seven.memento.components.namespaces.originatorOnly; + + /** + * @author Ben Smith + */ + public class Memento extends Object + { + private var _string : String + private var _cursor : int + + public function Memento() + { + + } + + originatorOnly function get string() : String + { + return _string; + } + + originatorOnly function set string( str : String ) : void + { + _string = str; + } + + originatorOnly function get cursor() : int + { + return _cursor; + } + + originatorOnly function set cursor( cursor : int ) : void + { + _cursor = cursor; + } + } +} diff --git a/BookSourceCode/src/chapter_seven/memento/components/Originator.as b/BookSourceCode/src/chapter_seven/memento/components/Originator.as new file mode 100644 index 0000000..7baf525 --- /dev/null +++ b/BookSourceCode/src/chapter_seven/memento/components/Originator.as @@ -0,0 +1,23 @@ +package chapter_seven.memento.components +{ + import chapter_seven.memento.components.namespaces.originatorOnly; + import chapter_seven.memento.components.util.FormField; + + /** + * @author Ben Smith + */ + public class Originator extends FormField + { + use namespace originatorOnly + public function Originator() + { + super(); + } + + override protected function doMakeMemento() : Memento + { + var memento : Memento = new Memento() + return memento + } + } +} diff --git a/BookSourceCode/src/chapter_seven/memento/components/interfaces/IMemento.as b/BookSourceCode/src/chapter_seven/memento/components/interfaces/IMemento.as new file mode 100644 index 0000000..2133e26 --- /dev/null +++ b/BookSourceCode/src/chapter_seven/memento/components/interfaces/IMemento.as @@ -0,0 +1,12 @@ +package chapter_seven.memento.components.interfaces +{ + import chapter_seven.memento.components.Memento; + /** + * @author Ben Smith + */ + public interface IMemento + { + function setMemento( memento : Memento ) : void + function makeMemento() : Memento + } +} \ No newline at end of file diff --git a/BookSourceCode/src/chapter_seven/memento/components/namespaces/originatorOnly.as b/BookSourceCode/src/chapter_seven/memento/components/namespaces/originatorOnly.as new file mode 100644 index 0000000..8a49e3b --- /dev/null +++ b/BookSourceCode/src/chapter_seven/memento/components/namespaces/originatorOnly.as @@ -0,0 +1,7 @@ +package chapter_seven.memento.components.namespaces +{ + /** + * @author Ben Smith + */ + public namespace originatorOnly; +} diff --git a/BookSourceCode/src/chapter_seven/memento/components/util/FormField.as b/BookSourceCode/src/chapter_seven/memento/components/util/FormField.as new file mode 100644 index 0000000..8978f0a --- /dev/null +++ b/BookSourceCode/src/chapter_seven/memento/components/util/FormField.as @@ -0,0 +1,40 @@ +package chapter_seven.memento.components.util +{ + import chapter_seven.memento.components.Memento; + import chapter_seven.memento.components.interfaces.IMemento; + import chapter_seven.memento.components.namespaces.originatorOnly; + + import flash.errors.IllegalOperationError; + import flash.text.TextField; + + /** + * @author Ben Smith + */ + public class FormField extends TextField implements IMemento + { + use namespace originatorOnly + public function FormField() + { + } + + public function setMemento( memento : Memento ) : void + { + this.text = memento.string + this.setSelection( memento.cursor , memento.cursor ) + } + + final public function makeMemento() : Memento + { + var memento : Memento = doMakeMemento() + memento.string = this.text + memento.cursor = this.caretIndex + return memento + } + + protected function doMakeMemento() : Memento + { + throw new IllegalOperationError( 'doMakeMomento must be overridden' ) + return null + } + } +} diff --git a/BookSourceCode/src/chapter_seven/state_pattern/DocumentClass.as b/BookSourceCode/src/chapter_seven/state_pattern/DocumentClass.as new file mode 100644 index 0000000..409e0f9 --- /dev/null +++ b/BookSourceCode/src/chapter_seven/state_pattern/DocumentClass.as @@ -0,0 +1,21 @@ +package chapter_seven.state_pattern +{ + import chapter_seven.state_pattern.SimpleCalculator.abstractions.AbstractCalculatorContext; + import chapter_seven.state_pattern.SimpleCalculator.concretes.CalculatorContextStateLogic; + import flash.display.Sprite; + + + /** + * @author Ben Smith + */ + public class DocumentClass extends Sprite + { + public function DocumentClass() + { + var ti_92Plus : AbstractCalculatorContext = new CalculatorContextStateLogic() + ti_92Plus.addition() + ti_92Plus.setDilineatedValues( Vector.( [ 2 , 2 ] ) ) + ti_92Plus.setDilineatedValues( Vector.( [ 3 , 9 ] ) ) + } + } +} diff --git a/BookSourceCode/src/chapter_seven/state_pattern/SimpleCalculator/abstractions/AbstractCalculatorContext.as b/BookSourceCode/src/chapter_seven/state_pattern/SimpleCalculator/abstractions/AbstractCalculatorContext.as new file mode 100644 index 0000000..e5df297 --- /dev/null +++ b/BookSourceCode/src/chapter_seven/state_pattern/SimpleCalculator/abstractions/AbstractCalculatorContext.as @@ -0,0 +1,66 @@ +package chapter_seven.state_pattern.SimpleCalculator.abstractions +{ + import flash.errors.IllegalOperationError; + + /** + * @author Ben Smith + */ + public class AbstractCalculatorContext + { + protected var _state : AbstractStateObject + + public function AbstractCalculatorContext() + { + } + + final public function addition() : void + { + doAddition() + } + + final public function subtraction() : void + { + dosubtraction() + } + + final public function division() : void + { + doDivision() + } + + final public function multiplication() : void + { + doMultiplication() + } + + final public function setDilineatedValues( values : Vector. ) : void + { + doSetDilineatedValues( values ) + } + + protected function doAddition() : void + { + throw new IllegalOperationError( 'doAddition must be overridden' ) + } + + protected function dosubtraction() : void + { + throw new IllegalOperationError( 'dosubtraction must be overridden' ) + } + + protected function doDivision() : void + { + throw new IllegalOperationError( 'doDivision must be overridden' ) + } + + protected function doMultiplication() : void + { + throw new IllegalOperationError( 'doMultiplication must be overridden' ) + } + + protected function doSetDilineatedValues( values : Vector. ) : void + { + throw new IllegalOperationError( 'doSetDilineatedValues must be overridden' ) + } + } +} diff --git a/BookSourceCode/src/chapter_seven/state_pattern/SimpleCalculator/abstractions/AbstractStateObject.as b/BookSourceCode/src/chapter_seven/state_pattern/SimpleCalculator/abstractions/AbstractStateObject.as new file mode 100644 index 0000000..43aae23 --- /dev/null +++ b/BookSourceCode/src/chapter_seven/state_pattern/SimpleCalculator/abstractions/AbstractStateObject.as @@ -0,0 +1,14 @@ +package chapter_seven.state_pattern.SimpleCalculator.abstractions +{ + import flash.errors.IllegalOperationError; + /** + * @author Ben Smith + */ + public class AbstractStateObject + { + public function calculate( values : Vector. ) : void + { + throw new IllegalOperationError( 'calculate must be overridden' ) + } + } +} diff --git a/BookSourceCode/src/chapter_seven/state_pattern/SimpleCalculator/concretes/AdditionState.as b/BookSourceCode/src/chapter_seven/state_pattern/SimpleCalculator/concretes/AdditionState.as new file mode 100644 index 0000000..f749de0 --- /dev/null +++ b/BookSourceCode/src/chapter_seven/state_pattern/SimpleCalculator/concretes/AdditionState.as @@ -0,0 +1,22 @@ +package chapter_seven.state_pattern.SimpleCalculator.concretes +{ + import chapter_seven.state_pattern.SimpleCalculator.abstractions.AbstractStateObject; + + /** + * @author Ben Smith + */ + public class AdditionState extends AbstractStateObject + { + public function AdditionState() + { + } + override public function calculate( values : Vector. ) : void + { + var sum:Number=0 + for each( var number:Number in values){ + sum+=number + } + trace(sum) + } + } +} diff --git a/BookSourceCode/src/chapter_seven/state_pattern/SimpleCalculator/concretes/CalculatorContext.as b/BookSourceCode/src/chapter_seven/state_pattern/SimpleCalculator/concretes/CalculatorContext.as new file mode 100644 index 0000000..8ca2f75 --- /dev/null +++ b/BookSourceCode/src/chapter_seven/state_pattern/SimpleCalculator/concretes/CalculatorContext.as @@ -0,0 +1,53 @@ +package chapter_seven.state_pattern.SimpleCalculator.concretes +{ + import chapter_seven.state_pattern.SimpleCalculator.abstractions.AbstractCalculatorContext; + import chapter_seven.state_pattern.SimpleCalculator.abstractions.AbstractStateObject; + import flash.errors.IllegalOperationError; + + + /** + * @author Ben Smith + */ + public class CalculatorContext extends AbstractCalculatorContext + { + protected static var Addition_Mode : int = 0; + protected static var Subtraction_Mode : int = 1 + protected static var Multiplication_Mode : int = 2 + protected static var Division_Mode : int = 3 + + public function CalculatorContext() + { + } + + override protected function doAddition() : void + { + this._state = doCreateAbstractStateObject( Addition_Mode ) + } + + override protected function dosubtraction() : void + { + this._state = doCreateAbstractStateObject( Subtraction_Mode ) + } + + override protected function doDivision() : void + { + this._state = doCreateAbstractStateObject( Division_Mode ) + } + + override protected function doMultiplication() : void + { + this._state = doCreateAbstractStateObject( Multiplication_Mode ) + } + + override protected function doSetDilineatedValues( values : Vector. ) : void + { + this._state.calculate( values ) + } + + protected function doCreateAbstractStateObject( EnumType : int ) : AbstractStateObject + { + throw new IllegalOperationError( 'doFactoryMethod must be overridden' ) + return null + } + } +} diff --git a/BookSourceCode/src/chapter_seven/state_pattern/SimpleCalculator/concretes/CalculatorContextStateLogic.as b/BookSourceCode/src/chapter_seven/state_pattern/SimpleCalculator/concretes/CalculatorContextStateLogic.as new file mode 100644 index 0000000..5aba6b0 --- /dev/null +++ b/BookSourceCode/src/chapter_seven/state_pattern/SimpleCalculator/concretes/CalculatorContextStateLogic.as @@ -0,0 +1,31 @@ +package chapter_seven.state_pattern.SimpleCalculator.concretes +{ + import chapter_seven.state_pattern.SimpleCalculator.abstractions.AbstractStateObject; + + /** + * @author Ben Smith + */ + public class CalculatorContextStateLogic extends CalculatorContext + { + override protected function doCreateAbstractStateObject( EnumType : int ) : AbstractStateObject + { + var product : AbstractStateObject + switch(EnumType) + { + case 0: + product = new AdditionState() + break; + case 1: + product = new SubtractionState() + break; + case 2: + product = new MultiplicationState() + break; + case 3: + product = new DivisionState() + break; + } + return product + } + } +} diff --git a/BookSourceCode/src/chapter_seven/state_pattern/SimpleCalculator/concretes/DivisionState.as b/BookSourceCode/src/chapter_seven/state_pattern/SimpleCalculator/concretes/DivisionState.as new file mode 100644 index 0000000..4713be2 --- /dev/null +++ b/BookSourceCode/src/chapter_seven/state_pattern/SimpleCalculator/concretes/DivisionState.as @@ -0,0 +1,15 @@ +package chapter_seven.state_pattern.SimpleCalculator.concretes +{ + import chapter_seven.state_pattern.SimpleCalculator.abstractions.AbstractStateObject; + + /** + * @author Ben Smith + */ + public class DivisionState extends AbstractStateObject + { + public function DivisionState() + { + } + + } +} diff --git a/BookSourceCode/src/chapter_seven/state_pattern/SimpleCalculator/concretes/MultiplicationState.as b/BookSourceCode/src/chapter_seven/state_pattern/SimpleCalculator/concretes/MultiplicationState.as new file mode 100644 index 0000000..7737c4a --- /dev/null +++ b/BookSourceCode/src/chapter_seven/state_pattern/SimpleCalculator/concretes/MultiplicationState.as @@ -0,0 +1,14 @@ +package chapter_seven.state_pattern.SimpleCalculator.concretes +{ + import chapter_seven.state_pattern.SimpleCalculator.abstractions.AbstractStateObject; + + /** + * @author Ben Smith + */ + public class MultiplicationState extends AbstractStateObject + { + public function MultiplicationState() + { + } + } +} diff --git a/BookSourceCode/src/chapter_seven/state_pattern/SimpleCalculator/concretes/SubtractionState.as b/BookSourceCode/src/chapter_seven/state_pattern/SimpleCalculator/concretes/SubtractionState.as new file mode 100644 index 0000000..62e2305 --- /dev/null +++ b/BookSourceCode/src/chapter_seven/state_pattern/SimpleCalculator/concretes/SubtractionState.as @@ -0,0 +1,14 @@ +package chapter_seven.state_pattern.SimpleCalculator.concretes +{ + import chapter_seven.state_pattern.SimpleCalculator.abstractions.AbstractStateObject; + + /** + * @author Ben Smith + */ + public class SubtractionState extends AbstractStateObject + { + public function SubtractionState() + { + } + } +} diff --git a/BookSourceCode/src/chapter_seven/strategy_method/DocumentClass.as b/BookSourceCode/src/chapter_seven/strategy_method/DocumentClass.as new file mode 100644 index 0000000..24ae09f --- /dev/null +++ b/BookSourceCode/src/chapter_seven/strategy_method/DocumentClass.as @@ -0,0 +1,34 @@ +package chapter_seven.strategy_method +{ + import chapter_seven.strategy_method.form.ContactForm; + import chapter_seven.strategy_method.strategies.form_strategies.interfaces.IValidate; + import chapter_seven.strategy_method.strategies.form_strategies.validations.ConfirmedEmailValidation; + import chapter_seven.strategy_method.strategies.form_strategies.validations.DefaultProfanityFilter; + import chapter_seven.strategy_method.strategies.form_strategies.validations.EmailValidation; + import chapter_seven.strategy_method.strategies.form_strategies.validations.RequiredValidation; + import flash.display.Sprite; + + + /** + * @author Ben Smith + */ + public class DocumentClass extends Sprite + { + public function DocumentClass() + { + var form : IValidate = new ContactForm() + + form.analysis = new RequiredValidation() + form.validate() + + form.analysis = new EmailValidation() + form.validate() + + form.analysis = new ConfirmedEmailValidation() + form.validate() + + form.analysis = new DefaultProfanityFilter() + form.validate() + } + } +} diff --git a/BookSourceCode/src/chapter_seven/strategy_method/form/ContactForm.as b/BookSourceCode/src/chapter_seven/strategy_method/form/ContactForm.as new file mode 100644 index 0000000..d362907 --- /dev/null +++ b/BookSourceCode/src/chapter_seven/strategy_method/form/ContactForm.as @@ -0,0 +1,99 @@ +package chapter_seven.strategy_method.form +{ + import chapter_seven.strategy_method.form.abstractions.FormObject; + import chapter_seven.strategy_method.strategies.form_strategies.abstractions.AFormValidationBehavior; + import chapter_seven.strategy_method.strategies.form_strategies.interfaces.IForm; + import chapter_seven.strategy_method.strategies.form_strategies.interfaces.IValidate; + import flash.display.Sprite; + + + /** + * @author Ben Smith + */ + public class ContactForm extends Sprite implements IForm, IValidate + { + protected var _email : FormObject; + protected var _confirmEmail : FormObject; + protected var _firstName : FormObject; + protected var _lastName : FormObject; + protected var _formCollections : Vector.; + protected var _analysis : AFormValidationBehavior; + + public function ContactForm() + { + _email = new FormObject(); + _confirmEmail = new FormObject(); + _firstName = new FormObject(); + _lastName = new FormObject(); + + _formCollections = Vector.( [ _email , _confirmEmail , _firstName , _lastName ] ); + + _email.packet.data = "iBen@Spilled-Milk.com"; + _confirmEmail.packet.data = "iBen@Spilled-Milk.com"; + _firstName.packet.data = "Ben"; + _lastName.packet.data = "Smith"; + } + + public function get email() : FormObject + { + return _email; + } + + public function set email( email : FormObject ) : void + { + _email = email; + } + + public function get firstName() : FormObject + { + return _firstName; + } + + public function set firstName( firstName : FormObject ) : void + { + _firstName = firstName; + } + + public function get lastName() : FormObject + { + return _lastName; + } + + public function set lastName( lastName : FormObject ) : void + { + _lastName = lastName; + } + + public function get analysis() : AFormValidationBehavior + { + return _analysis; + } + + public function set analysis( analysis : AFormValidationBehavior ) : void + { + _analysis = analysis; + _analysis.formContactForm = this; + trace( _analysis ); + } + + public function validate() : void + { + _analysis.validate(); + } + + public function get formCollections() : Vector. + { + return _formCollections; + } + + public function get confirmEmail() : FormObject + { + return _confirmEmail; + } + + public function set confirmEmail( confirmEmail : FormObject ) : void + { + _confirmEmail = confirmEmail; + } + } +} diff --git a/BookSourceCode/src/chapter_seven/strategy_method/form/FormPacket.as b/BookSourceCode/src/chapter_seven/strategy_method/form/FormPacket.as new file mode 100644 index 0000000..f068bab --- /dev/null +++ b/BookSourceCode/src/chapter_seven/strategy_method/form/FormPacket.as @@ -0,0 +1,84 @@ +package chapter_seven.strategy_method.form +{ + /** + * @author Ben Smith + */ + public class FormPacket extends Object + { + protected var _hasErrors : Boolean; + protected var _isRequired : Boolean; + protected var _errors : Array; + protected var _data : String; + protected var _prompt : String; + + public function FormPacket() + { + _isRequired = true + _hasErrors = false + _data = "" + _prompt = "Do it" + } + + public function get data() : String + { + return _data; + } + + public function set data( data : String ) : void + { + _data = data; + } + + public function get errors() : Array + { + return _errors; + } + + public function set errors( error : Array ) : void + { + if (_errors == null) + { + _errors = error + } + } + + public function addError( error : String ) : void + { + if (_errors == null) + { + _errors = [] + } + _errors[_errors.length] = error + } + + public function get hasErrors() : Boolean + { + return _hasErrors; + } + + public function set hasErrors( hasErrors : Boolean ) : void + { + _hasErrors = hasErrors; + } + + public function get isRequired() : Boolean + { + return _isRequired; + } + + public function set isRequired( isRequired : Boolean ) : void + { + _isRequired = isRequired; + } + + public function get prompt() : String + { + return _prompt; + } + + public function set prompt( prompt : String ) : void + { + _prompt = prompt; + } + } +} diff --git a/BookSourceCode/src/chapter_seven/strategy_method/form/abstractions/FormObject.as b/BookSourceCode/src/chapter_seven/strategy_method/form/abstractions/FormObject.as new file mode 100644 index 0000000..8252032 --- /dev/null +++ b/BookSourceCode/src/chapter_seven/strategy_method/form/abstractions/FormObject.as @@ -0,0 +1,28 @@ +package chapter_seven.strategy_method.form.abstractions +{ + import chapter_seven.strategy_method.form.FormPacket; + import flash.display.Sprite; + + + /** + * @author Ben Smith + */ + public class FormObject extends Sprite + { + private var _packet : FormPacket + + public function FormObject() + { + _packet = new FormPacket(); + } + + public function resetData() : void + { + } + + public function get packet() : FormPacket + { + return _packet; + } + } +} diff --git a/BookSourceCode/src/chapter_seven/strategy_method/strategies/form_strategies/abstractions/AFormValidationBehavior.as b/BookSourceCode/src/chapter_seven/strategy_method/strategies/form_strategies/abstractions/AFormValidationBehavior.as new file mode 100644 index 0000000..594fea0 --- /dev/null +++ b/BookSourceCode/src/chapter_seven/strategy_method/strategies/form_strategies/abstractions/AFormValidationBehavior.as @@ -0,0 +1,37 @@ +package chapter_seven.strategy_method.strategies.form_strategies.abstractions +{ + import chapter_seven.strategy_method.strategies.form_strategies.interfaces.IForm; + import flash.errors.IllegalOperationError; + + + /** + * @author Ben Smith + */ + public class AFormValidationBehavior extends Object + { + protected var _formContactForm : IForm + + public function AFormValidationBehavior( form : IForm = null ) + { + if (form) + { + _formContactForm = form + } + } + + public function get formContactForm() : IForm + { + return _formContactForm; + } + + public function set formContactForm( formContactForm : IForm ) : void + { + _formContactForm = formContactForm; + } + + public function validate() : void + { + throw new IllegalOperationError( 'validate must be overridden' ) + } + } +} diff --git a/BookSourceCode/src/chapter_seven/strategy_method/strategies/form_strategies/abstractions/AProfanityFilter.as b/BookSourceCode/src/chapter_seven/strategy_method/strategies/form_strategies/abstractions/AProfanityFilter.as new file mode 100644 index 0000000..55e010e --- /dev/null +++ b/BookSourceCode/src/chapter_seven/strategy_method/strategies/form_strategies/abstractions/AProfanityFilter.as @@ -0,0 +1,64 @@ +package chapter_seven.strategy_method.strategies.form_strategies.abstractions +{ + import chapter_seven.strategy_method.form.ContactForm; + import chapter_seven.strategy_method.form.FormPacket; + import chapter_seven.strategy_method.form.abstractions.FormObject; + import flash.errors.IllegalOperationError; + + + /** + * @author Ben Smith + */ + public class AProfanityFilter extends AFormValidationBehavior + { + protected static const Error : String = 'Please refrain from using obscenities'; + protected var profanityAr : Vector.; + + public function AProfanityFilter( form : ContactForm = null ) + { + super( form ); + doProfanity(); + } + + protected function doProfanity() : void + { + throw new IllegalOperationError( 'doProfanity must be overridden' ) + } + + override public function validate() : void + { + var field : Vector.= this._formContactForm.formCollections + for each (var form:FormObject in field) + { + var fp : FormPacket = form.packet + var data : String = fp.data + if (recourse( data )) + { + fp.hasErrors = true + fp.addError( Error ) + } + } + } + + protected function recourse( str : String , count : uint = 0 ) : Boolean + { + var tmpAr : Array; + var expressionString : String = (count < profanityAr.length - 1) ? '\\b' + profanityAr[count] + '\\b' : profanityAr[count] + + var regExp : RegExp = new RegExp( expressionString , 'gix' ) + tmpAr = (regExp.exec( str )); + if (tmpAr != null) + { + return true + } + else + { + if (count < profanityAr.length - 1) + { + return recourse( str , ++count ) + } + } + return false + } + } +} diff --git a/BookSourceCode/src/chapter_seven/strategy_method/strategies/form_strategies/interfaces/IForm.as b/BookSourceCode/src/chapter_seven/strategy_method/strategies/form_strategies/interfaces/IForm.as new file mode 100644 index 0000000..7d060f2 --- /dev/null +++ b/BookSourceCode/src/chapter_seven/strategy_method/strategies/form_strategies/interfaces/IForm.as @@ -0,0 +1,21 @@ +package chapter_seven.strategy_method.strategies.form_strategies.interfaces +{ + import chapter_seven.strategy_method.form.abstractions.FormObject; + + /** + * @author Ben Smith + */ + public interface IForm + { + function get formCollections() : Vector. + + function get firstName() : FormObject + + function get lastName() : FormObject + + function get confirmEmail() : FormObject + + function get email() : FormObject + + } +} diff --git a/BookSourceCode/src/chapter_seven/strategy_method/strategies/form_strategies/interfaces/IValidate.as b/BookSourceCode/src/chapter_seven/strategy_method/strategies/form_strategies/interfaces/IValidate.as new file mode 100644 index 0000000..a117507 --- /dev/null +++ b/BookSourceCode/src/chapter_seven/strategy_method/strategies/form_strategies/interfaces/IValidate.as @@ -0,0 +1,14 @@ +package chapter_seven.strategy_method.strategies.form_strategies.interfaces +{ + import chapter_seven.strategy_method.strategies.form_strategies.abstractions.AFormValidationBehavior; + + /** + * @author Ben Smith + */ + public interface IValidate + { + function set analysis( validateAlgorithm : AFormValidationBehavior ) : void + + function validate() : void + } +} diff --git a/BookSourceCode/src/chapter_seven/strategy_method/strategies/form_strategies/validations/ConfirmedEmailValidation.as b/BookSourceCode/src/chapter_seven/strategy_method/strategies/form_strategies/validations/ConfirmedEmailValidation.as new file mode 100644 index 0000000..e7d7ba9 --- /dev/null +++ b/BookSourceCode/src/chapter_seven/strategy_method/strategies/form_strategies/validations/ConfirmedEmailValidation.as @@ -0,0 +1,39 @@ +package chapter_seven.strategy_method.strategies.form_strategies.validations +{ + import chapter_seven.strategy_method.form.ContactForm; + import chapter_seven.strategy_method.form.FormPacket; + import chapter_seven.strategy_method.form.abstractions.FormObject; + import chapter_seven.strategy_method.strategies.form_strategies.abstractions.AFormValidationBehavior; + + /** + * @author Ben Smith + */ + public class ConfirmedEmailValidation extends AFormValidationBehavior + { + static protected const ERROR : String = "Emails Must Match" + + public function ConfirmedEmailValidation( form : ContactForm = null ) + { + super( form ); + } + + override public function validate() : void + { + var email : FormObject = this._formContactForm.email + var emailData : FormPacket = email.packet + var emailAddy : String = emailData.data + + var confirmEmail : FormObject = this._formContactForm.confirmEmail + var confirmEmailData : FormPacket = confirmEmail.packet + var confirmEmailAddy : String = confirmEmailData.data + + var match : Boolean = confirmEmailAddy == emailAddy + if (!match) + { + trace( 'error' ) + emailData.hasErrors = true + emailData.addError( ERROR ) + } + } + } +} diff --git a/BookSourceCode/src/chapter_seven/strategy_method/strategies/form_strategies/validations/DefaultProfanityFilter.as b/BookSourceCode/src/chapter_seven/strategy_method/strategies/form_strategies/validations/DefaultProfanityFilter.as new file mode 100644 index 0000000..cb7a840 --- /dev/null +++ b/BookSourceCode/src/chapter_seven/strategy_method/strategies/form_strategies/validations/DefaultProfanityFilter.as @@ -0,0 +1,23 @@ +package chapter_seven.strategy_method.strategies.form_strategies.validations +{ + import chapter_seven.strategy_method.form.ContactForm; + import chapter_seven.strategy_method.strategies.form_strategies.abstractions.AProfanityFilter; + + /** + * @author Ben Smith + */ + public class DefaultProfanityFilter extends AProfanityFilter + { + public function DefaultProfanityFilter( form : ContactForm = null ) + { + super( form ); + } + + override protected function doProfanity() : void + { + // at the request of the publishing company I can only list that profanities go in the area below; + profanityAr = Vector.( [ 'Listing of profanities goes here' ] ); + + } + } +} diff --git a/BookSourceCode/src/chapter_seven/strategy_method/strategies/form_strategies/validations/EmailValidation.as b/BookSourceCode/src/chapter_seven/strategy_method/strategies/form_strategies/validations/EmailValidation.as new file mode 100644 index 0000000..0c0026f --- /dev/null +++ b/BookSourceCode/src/chapter_seven/strategy_method/strategies/form_strategies/validations/EmailValidation.as @@ -0,0 +1,33 @@ +package chapter_seven.strategy_method.strategies.form_strategies.validations +{ + import chapter_seven.strategy_method.form.ContactForm; + import chapter_seven.strategy_method.form.FormPacket; + import chapter_seven.strategy_method.form.abstractions.FormObject; + import chapter_seven.strategy_method.strategies.form_strategies.abstractions.AFormValidationBehavior; + + /** + * @author Ben Smith + */ + public class EmailValidation extends AFormValidationBehavior + { + static protected const Email_Expression : RegExp = /^[a-z][\w.-]+@\w[\w.-]+\.[\w.-]*[a-z][a-z]$/i + static protected const Error : String = "A Valid Email is Required" + + public function EmailValidation( form : ContactForm = null ) + { + super( form ); + } + + override public function validate() : void + { + var email : FormObject = this._formContactForm.email + var emailData : FormPacket = email.packet + var emailAddy : String = emailData.data + + if (!Email_Expression.test( emailAddy )) + { + emailData.hasErrors = true + } + } + } +} diff --git a/BookSourceCode/src/chapter_seven/strategy_method/strategies/form_strategies/validations/RequiredValidation.as b/BookSourceCode/src/chapter_seven/strategy_method/strategies/form_strategies/validations/RequiredValidation.as new file mode 100644 index 0000000..436c8ea --- /dev/null +++ b/BookSourceCode/src/chapter_seven/strategy_method/strategies/form_strategies/validations/RequiredValidation.as @@ -0,0 +1,39 @@ +package chapter_seven.strategy_method.strategies.form_strategies.validations +{ + import chapter_seven.strategy_method.form.ContactForm; + import chapter_seven.strategy_method.form.FormPacket; + import chapter_seven.strategy_method.form.abstractions.FormObject; + import chapter_seven.strategy_method.strategies.form_strategies.abstractions.AFormValidationBehavior; + + /** + * @author Ben Smith + */ + public class RequiredValidation extends AFormValidationBehavior + { + private static const ERROR : String = "All required fields must be filled in"; + + public function RequiredValidation( form : ContactForm = null ) + { + super( form ); + } + + override public function validate() : void + { + for each ( var fObj:FormObject in _formContactForm.formCollections ) + { + var fp : FormPacket = fObj.packet; + if ( fp.isRequired ) + { + var cleanser : RegExp = /\s{1,}/gi; + var clone : String = fp.data.replace( cleanser , '' ); + if ( clone == '' || clone == fp.prompt ) + { + fp.hasErrors = true; + fp.addError( ERROR ); + trace( 'error' ); + } + } + } + } + } +} diff --git a/BookSourceCode/src/chapter_seven/template_method/DocumentClass.as b/BookSourceCode/src/chapter_seven/template_method/DocumentClass.as new file mode 100644 index 0000000..a20ff4a --- /dev/null +++ b/BookSourceCode/src/chapter_seven/template_method/DocumentClass.as @@ -0,0 +1,33 @@ +package chapter_seven.template_method +{ + import chapter_seven.template_method.abstractions.PageContent; + import chapter_seven.template_method.components.HomePage; + import chapter_seven.template_method.components.PortfolioPage; + + import flash.display.Sprite; + + /** + * @author Ben Smith + */ + public class DocumentClass extends Sprite + { + public function DocumentClass() + { + + /*both pages will exhibit the exact sequence of operation calls*/ + var currentPage : PageContent + currentPage = new HomePage( 960 , 492 ); + currentPage.init(); + currentPage.intro(); + currentPage.outro(); + currentPage.destroy(); + + currentPage = new PortfolioPage() + + currentPage.init(); + currentPage.intro(); + currentPage.outro(); + currentPage.destroy(); + } + } +} diff --git a/BookSourceCode/src/chapter_seven/template_method/abstractions/PageContent.as b/BookSourceCode/src/chapter_seven/template_method/abstractions/PageContent.as new file mode 100644 index 0000000..e3efb6c --- /dev/null +++ b/BookSourceCode/src/chapter_seven/template_method/abstractions/PageContent.as @@ -0,0 +1,168 @@ +package chapter_seven.template_method.abstractions +{ + import chapter_seven.template_method.components.utils.Styler; + import chapter_seven.template_method.interfaces.IDestroy; + import chapter_seven.the_observer_pattern.interfaces.IObserve; + import flash.display.DisplayObject; + import flash.display.Sprite; + import flash.display.StageAlign; + import flash.display.StageScaleMode; + import flash.errors.IllegalOperationError; + import flash.events.Event; + import flash.system.Security; + + + /** + * @author Ben Smith + */ + public class PageContent extends Sprite implements IDestroy, IObserve + { + static public const INTRO_COMPLETE : String = "intro_complete"; + static public const OUTRO_COMPLETE : String = "outro_complete"; + + protected var _wide : int; + protected var _tall : int; + protected var _styler : Styler; + + public function PageContent( $w : int = 960 , $h : int = 492 ) + { + _wide = $w; + _tall = $h; + Security.allowDomain( '*' ); + addEventListener( Event.ADDED_TO_STAGE , onStage ); + } + + private function onStage( event : Event ) : void + { + removeEventListener( Event.ADDED_TO_STAGE , onStage ); + this.stage.align = StageAlign.TOP_LEFT; + this.stage.scaleMode = StageScaleMode.NO_SCALE; + /*doStage Found is also a template method + * some subclasses may require stage listeners, and can only be added + * once a stage has been deemed available. Continue with the + * steps of our algorithm and keeping things sequntial, doStageFound + * is called respectfully + */ + trace('doStageFound'); + doStageFound(); + } + + protected function doStageFound() : void + { + } + + /*init posesses an algorithm of templated methods. + *Each method performs a specific step within the algorithm. + *The methods are overriden via the subclasses to perform specifics among + *the algorithms whilst maintaining approproiate order. + */ + + final public function init() : void + { + _styler = new Styler(); + _styler.addEventListener( 'CSSLoaded' , onCSSStyle ); + trace('doBuildComponents'); + doBuildComponents(); + trace('doFetchCSS') + doFetchCSS(); + } + + protected function doGetData() : void + { + /*call the server*/ + throw new IllegalOperationError( 'getData must be overridden' ); + } + + protected function doBuildComponents() : void + { + throw new IllegalOperationError( 'doBuildComponents must be overridden' ); + } + + public function intro() : void + { + dispatchEvent(new Event(INTRO_COMPLETE,false,false)); + } + + public function outro() : void + { + dispatchEvent( new Event( OUTRO_COMPLETE , false , false ) ); + } + + protected function doFetchCSS() : void + { + throw new IllegalOperationError( 'fetchCSS must be overridden' ) + } + + final protected function onCSSStyle( event : Event ) : void + { + _styler.removeEventListener( 'CSSLoaded' , onCSSStyle ); + trace('doGetData') + doGetData(); + } + + /*destroy also triggers the appropriate deconstruction phase + *via the template method of doDestroy. As the base class adds particulars + *which each subclass need not be aware, any attempt to override the destroy + *method can create serious consequences to the retrival of allocated memory. + *Thus, the method is marked final, removes objects localized to this object + *and triggers the doDestroy method. + */ + final public function destroy() : void + { + if (_styler) + { + _styler.removeEventListener( 'CSSLoaded' , onCSSStyle ); + _styler.destroy(); + _styler = null; + } + removeEventListener( Event.ADDED_TO_STAGE , onStage ); + trace('doDestroy') + doDestroy(); + }; + + protected function doDestroy() : void + { + + } + + protected function onDataServed( event : Event ) : void + { + throw new IllegalOperationError( 'onDataServed must be overridden' ); + } + + protected function removeMe( displayObject : DisplayObject ) : void + { + if (displayObject) + { + if (this.contains( displayObject )) + { + removeChild( displayObject ); + } + } + } + + public function notify( str : String ) : void + { + } + + public function get wide() : int + { + return _wide; + } + + public function get tall() : int + { + return _tall; + } + + public override function get width() : Number + { + return _wide; + } + + public override function get height() : Number + { + return _tall; + } + } +} diff --git a/BookSourceCode/src/chapter_seven/template_method/components/HomePage.as b/BookSourceCode/src/chapter_seven/template_method/components/HomePage.as new file mode 100644 index 0000000..c254c05 --- /dev/null +++ b/BookSourceCode/src/chapter_seven/template_method/components/HomePage.as @@ -0,0 +1,44 @@ +package chapter_seven.template_method.components +{ + import flash.events.Event; + + import chapter_seven.template_method.abstractions.PageContent; + + /** + * @author Ben Smith + */ + public class HomePage extends PageContent + { + public function HomePage( $w : int = 960 , $h : int = 492 ) + { + super( $w , $h ); + } + + override protected function doBuildComponents() : void + { + trace( this + ' is implementing the doBuildComponents method' ) + } + + override protected function doFetchCSS() : void + { + trace( this + ' is implementing the doFetchCSS method' ) + _styler.loadCSS( '../css/Generic.css' ); + } + + override protected function doGetData() : void + { + trace( this + ' is implementing the doGetData method' ) + } + + override protected function onDataServed( event : Event ) : void + { + trace( this + ' is implementing the onDataServed method' ) + } + + override protected function doDestroy() : void + { + super.doDestroy(); + trace( this + ' is implementing the doDestroy method' ) + } + } +} diff --git a/BookSourceCode/src/chapter_seven/template_method/components/PortfolioPage.as b/BookSourceCode/src/chapter_seven/template_method/components/PortfolioPage.as new file mode 100644 index 0000000..808b8d7 --- /dev/null +++ b/BookSourceCode/src/chapter_seven/template_method/components/PortfolioPage.as @@ -0,0 +1,43 @@ +package chapter_seven.template_method.components +{ + import flash.events.Event; + import chapter_seven.template_method.abstractions.PageContent; + + /** + * @author Ben Smith + */ + public class PortfolioPage extends PageContent + { + public function PortfolioPage( $w : int = 960 , $h : int = 492 ) + { + super( $w , $h ); + } + + override protected function doBuildComponents() : void + { + trace( this + ' is implementing the doBuildComponents method' ) + } + + override protected function doFetchCSS() : void + { + trace( this + ' is implementing the doFetchCSS method' ) + _styler.loadCSS( '../css/Generic.css' ); + } + + override protected function doGetData() : void + { + trace( this + ' is implementing the doGetData method' ) + } + + override protected function onDataServed( event : Event ) : void + { + trace( this + ' is implementing the onDataServed method' ) + } + + override protected function doDestroy() : void + { + super.doDestroy(); + trace( this + ' is implementing the doDestroy method' ) + } + } +} \ No newline at end of file diff --git a/BookSourceCode/src/chapter_seven/template_method/components/utils/Styler.as b/BookSourceCode/src/chapter_seven/template_method/components/utils/Styler.as new file mode 100644 index 0000000..3bb87fd --- /dev/null +++ b/BookSourceCode/src/chapter_seven/template_method/components/utils/Styler.as @@ -0,0 +1,59 @@ +package chapter_seven.template_method.components.utils +{ + import flash.events.ProgressEvent; + + import chapter_seven.template_method.interfaces.IDestroy; + + import flash.events.Event; + import flash.events.EventDispatcher; + import flash.events.IEventDispatcher; + import flash.net.URLLoader; + import flash.net.URLRequest; + import flash.text.StyleSheet; + + /** + * @author Ben Smith + */ + public class Styler extends EventDispatcher implements IDestroy + { + [Event(name="CSSLoaded", type="flash.events.Event")] + protected var _style : StyleSheet; + protected var _ldr : URLLoader; + + public function Styler( target : IEventDispatcher = null ) + { + super( target ); + _style = new StyleSheet(); + } + + public function loadCSS( path : String ) : void + { + _ldr = new URLLoader(); + + _ldr.addEventListener( Event.COMPLETE , onCSSLoaded ); + _ldr.load( new URLRequest( path ) ); + } + + private function onCSSLoaded( event : Event ) : void + { + _ldr.removeEventListener( Event.COMPLETE , onCSSLoaded ); + _style.parseCSS( _ldr.data ); + _ldr.close(); + _ldr = null; + dispatchEvent( new Event( 'CSSLoaded' , false , false ) ); + } + + public function get style() : StyleSheet + { + return _style; + } + + public function destroy() : void + { + _ldr.removeEventListener( Event.COMPLETE , onCSSLoaded ); + _ldr.close(); + _ldr = null; + _style = null; + } + } +} diff --git a/BookSourceCode/src/chapter_seven/template_method/interfaces/IDestroy.as b/BookSourceCode/src/chapter_seven/template_method/interfaces/IDestroy.as new file mode 100644 index 0000000..08760db --- /dev/null +++ b/BookSourceCode/src/chapter_seven/template_method/interfaces/IDestroy.as @@ -0,0 +1,10 @@ +package chapter_seven.template_method.interfaces +{ + /** + * @author Ben Smith + */ + public interface IDestroy + { + function destroy() : void + } +} diff --git a/BookSourceCode/src/chapter_seven/the_observer_pattern/DocumentClass.as b/BookSourceCode/src/chapter_seven/the_observer_pattern/DocumentClass.as new file mode 100644 index 0000000..7320ffc --- /dev/null +++ b/BookSourceCode/src/chapter_seven/the_observer_pattern/DocumentClass.as @@ -0,0 +1,35 @@ +package chapter_seven.the_observer_pattern +{ + import chapter_seven.the_observer_pattern.interfaces.IObserve; + import chapter_seven.the_observer_pattern.interfaces.ISubject; + import chapter_seven.the_observer_pattern.observers.Observer; + import chapter_seven.the_observer_pattern.subjects.Subject; + import flash.display.Sprite; + + /** + * @author Ben Smith + */ + public class DocumentClass extends Sprite + { + public function DocumentClass() + { + var subject : ISubject = new Subject( "FeZEC" ); + + var observer_1 : IObserve = new Observer( "Andrew" ); + + var observer_2 : IObserve = new Observer( "Mike" ); + + var observer_3 : IObserve = new Observer( "Ed" ); + + var observer_4 : IObserve = new Observer( "Lucas" ); + + var observer_5 : IObserve = new Observer( "Edy" ); + + subject.addObserver( observer_1 , null ); + subject.addObserver( observer_2 , null ); + subject.addObserver( observer_3 , null ); + subject.addObserver( observer_4 , null ); + subject.addObserver( observer_5 , null ); + } + } +} diff --git a/BookSourceCode/src/chapter_seven/the_observer_pattern/abstractions/TwitterUser.as b/BookSourceCode/src/chapter_seven/the_observer_pattern/abstractions/TwitterUser.as new file mode 100644 index 0000000..3dc0717 --- /dev/null +++ b/BookSourceCode/src/chapter_seven/the_observer_pattern/abstractions/TwitterUser.as @@ -0,0 +1,26 @@ +package chapter_seven.the_observer_pattern.abstractions +{ + + /** + * @author Ben Smith + */ + public class TwitterUser extends Object + { + private var _twitterName : String + + public function TwitterUser( userName : String ) + { + _twitterName = userName + } + + public function get twitterName() : String + { + return _twitterName; + } + + public function set twitterName( twitterName : String ) : void + { + _twitterName = twitterName; + } + } +} diff --git a/BookSourceCode/src/chapter_seven/the_observer_pattern/interfaces/IObserve.as b/BookSourceCode/src/chapter_seven/the_observer_pattern/interfaces/IObserve.as new file mode 100644 index 0000000..3f56c45 --- /dev/null +++ b/BookSourceCode/src/chapter_seven/the_observer_pattern/interfaces/IObserve.as @@ -0,0 +1,10 @@ +package chapter_seven.the_observer_pattern.interfaces +{ + /** + * @author Ben Smith + */ + public interface IObserve + { + function notify(str:String):void + } +} diff --git a/BookSourceCode/src/chapter_seven/the_observer_pattern/interfaces/ISubject.as b/BookSourceCode/src/chapter_seven/the_observer_pattern/interfaces/ISubject.as new file mode 100644 index 0000000..047010e --- /dev/null +++ b/BookSourceCode/src/chapter_seven/the_observer_pattern/interfaces/ISubject.as @@ -0,0 +1,12 @@ +package chapter_seven.the_observer_pattern.interfaces +{ + /** + * @author Ben Smith + */ + public interface ISubject + { + + function addObserver( observer : IObserve , aspect : Function ) : Boolean + function removeObserver( observer : IObserve ) : Boolean + } +} diff --git a/BookSourceCode/src/chapter_seven/the_observer_pattern/observers/Observer.as b/BookSourceCode/src/chapter_seven/the_observer_pattern/observers/Observer.as new file mode 100644 index 0000000..a7227ea --- /dev/null +++ b/BookSourceCode/src/chapter_seven/the_observer_pattern/observers/Observer.as @@ -0,0 +1,20 @@ +package chapter_seven.the_observer_pattern.observers +{ + import chapter_seven.the_observer_pattern.abstractions.TwitterUser; + import chapter_seven.the_observer_pattern.interfaces.IObserve; + /** + * @author Ben Smith + */ + public class Observer extends TwitterUser implements IObserve + { + public function Observer( userName : String ) + { + super( userName ) + } + + public function notify( str : String ) : void + { + trace( str ) + } + } +} diff --git a/BookSourceCode/src/chapter_seven/the_observer_pattern/subjects/Subject.as b/BookSourceCode/src/chapter_seven/the_observer_pattern/subjects/Subject.as new file mode 100644 index 0000000..026d5cd --- /dev/null +++ b/BookSourceCode/src/chapter_seven/the_observer_pattern/subjects/Subject.as @@ -0,0 +1,74 @@ +package chapter_seven.the_observer_pattern.subjects +{ + import chapter_seven.the_observer_pattern.abstractions.TwitterUser; + import chapter_seven.the_observer_pattern.interfaces.IObserve; + import chapter_seven.the_observer_pattern.interfaces.ISubject; + import flash.events.TimerEvent; + import flash.utils.Dictionary; + import flash.utils.Timer; + import flash.utils.getTimer; + + /** + * @author Ben Smith + */ + public class Subject extends TwitterUser implements ISubject + { + static const LoremIspum : String = "Lorem ipsum dolor sit amet, consectetur adipiscing elit. Morbi condimentum leo sit amet augue pulvinar non dictum neque vehicula. Morbi feugiat diam consectetur sapien porta mattis. Donec eget felis eget risus pharetra tincidunt. Cras risus tellus, commodo quis tincidunt eget, vulputate et ipsum. Integer nunc felis, vestibulum sed faucibus sit amet, vulputate non lorem. Suspendisse tincidunt accumsan dignissim. Ut felis felis, mollis ac vehicula a, convallis quis nibh. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Etiam vitae dui non tellus laoreet fermentum. Pellentesque porttitor felis id nisi mollis viverra dapibus mauris malesuada. Sed turpis mauris, commodo quis laoreet non, pulvinar tincidunt elit.\n\nEtiam semper vestibulum nulla ut sollicitudin. Vestibulum eget sapien non justo facilisis tempus quis vel est. Aenean pretium risus sit amet lacus eleifend quis rutrum lacus imperdiet. Mauris eget erat mi, in pellentesque orci. Praesent euismod, erat vitae blandit varius, metus neque dignissim massa, sit amet molestie massa magna et libero. Ut consectetur, urna a tempor venenatis, dui augue interdum lorem, vel venenatis tellus risus congue tortor. Aenean id est leo, id fringilla neque. Ut porta, enim non sodales convallis, nunc diam pulvinar tortor, et sollicitudin ante odio a lectus. Cras quam mauris, vulputate at cursus id, vehicula a purus. Aliquam quis lacinia augue. Integer volutpat ullamcorper dolor, ac dignissim erat feugiat vitae. Vestibulum enim nulla, laoreet ut gravida et, pharetra ac lorem. Etiam eget metus at tellus faucibus molestie. Aliquam laoreet scelerisque nisl ac sollicitudin. Sed vitae turpis in elit semper lacinia." + static const LoremIpsumAr : Array = LoremIspum.split( " " ) + protected var _dict : Dictionary + private var timer : Timer + + public function Subject( userName : String ) + { + super( userName ) + _dict = new Dictionary( false ) + timer = new Timer( 550 ) + timer.repeatCount = 1 + timer.addEventListener( TimerEvent.TIMER_COMPLETE , onComplete ) + timer.start() + } + + public function removeObserver( observer : IObserve ) : Boolean + { + _dict[observer] = null + delete _dict[observer] + return true + } + + public function addObserver( observer : IObserve , aspect : Function ) : Boolean + { + _dict[observer] = getTimer() + return true + } + + protected function notifyObservers( Enum : String ) : void + { + for (var observer:* in _dict) + { + observer.notify( Enum ) + } + } + + private function onComplete( event : TimerEvent ) : void + { + timer.stop() + timer.delay = Math.random() * 1000 + timer.reset() + var startIndex : int + var endIndex : int + startIndex = Math.random() * LoremIpsumAr.length + var pool : int = LoremIpsumAr.length - startIndex + endIndex = Math.random() * ((pool < 140) ? pool : 140) + var status : String = "" + var totalIndex:int=startIndex+endIndex + while (startIndex < totalIndex) + { + status += LoremIpsumAr[startIndex] + " " + startIndex++ + } + + notifyObservers( status ) + timer.start() + } + } +} diff --git a/BookSourceCode/src/chapter_six/factories/abstract_factory/DocumentClass.as b/BookSourceCode/src/chapter_six/factories/abstract_factory/DocumentClass.as new file mode 100644 index 0000000..c775db4 --- /dev/null +++ b/BookSourceCode/src/chapter_six/factories/abstract_factory/DocumentClass.as @@ -0,0 +1,31 @@ +package chapter_six.factories.abstract_factory +{ + import chapter_six.factories.abstract_factory.factories.EastCoastOverlays; + import chapter_six.factories.abstract_factory.factories.WestCoastOverlays; + import chapter_six.factories.abstract_factory.factories.abstractions.AbstractFactoryCoastOverlaySets; + + import flash.display.Sprite; + + /** + * @author Ben Smith + */ + public class DocumentClass extends Sprite + { + var factory : AbstractFactoryCoastOverlaySets + + public function DocumentClass() + { + // assume the user came in from the westCoast + factory = new WestCoastOverlays() + trace( factory.createPhotoViewerOverlay() ); + trace( factory.createPhotoViewerOverlay() ); + trace( factory.createTwitterOverlay() ); + + // assume the user came in from the eastCoast + factory = new EastCoastOverlays() + trace( factory.createPhotoViewerOverlay() ); + trace( factory.createPhotoViewerOverlay() ); + trace( factory.createTwitterOverlay() ); + } + } +} diff --git a/BookSourceCode/src/chapter_six/factories/abstract_factory/factories/EastCoastOverlays.as b/BookSourceCode/src/chapter_six/factories/abstract_factory/factories/EastCoastOverlays.as new file mode 100644 index 0000000..3112210 --- /dev/null +++ b/BookSourceCode/src/chapter_six/factories/abstract_factory/factories/EastCoastOverlays.as @@ -0,0 +1,47 @@ +package chapter_six.factories.abstract_factory.factories +{ + import chapter_six.factories.abstract_factory.factories.abstractions.AbstractFactoryCoastOverlaySets; + import chapter_six.factories.abstract_factory.products.audio.EastCoastAudioOverlay; + import chapter_six.factories.abstract_factory.products.audio.abstraction.AudioOverlay; + import chapter_six.factories.abstract_factory.products.form.EastCoastFormOverlay; + import chapter_six.factories.abstract_factory.products.form.abstraction.FormOverlay; + import chapter_six.factories.abstract_factory.products.photo.EastCoastPhotoOverlay; + import chapter_six.factories.abstract_factory.products.photo.abstraction.PhotoOverlay; + import chapter_six.factories.abstract_factory.products.twitter.EastCoastTwitterOverlay; + import chapter_six.factories.abstract_factory.products.twitter.abstraction.TwitterOverlay; + import chapter_six.factories.abstract_factory.products.video.EastCoastVideoOverlay; + import chapter_six.factories.abstract_factory.products.video.abstraction.VideoOverlay; + + /** + * @author Ben Smith + */ + public class EastCoastOverlays extends AbstractFactoryCoastOverlaySets + { + override protected function makePhotoOverlay() : PhotoOverlay + { + return new EastCoastPhotoOverlay() + }; + + protected override function makeVideoOverlay() : VideoOverlay + { + return new EastCoastVideoOverlay() + }; + + protected override function makeAudioOverlay() : AudioOverlay + { + return new EastCoastAudioOverlay() + }; + + protected override function makeTwitterOverlay() : TwitterOverlay + { + return new EastCoastTwitterOverlay() + }; + + protected override function makeFormOverlay() : FormOverlay + { + return new EastCoastFormOverlay() + }; + } +} + + diff --git a/BookSourceCode/src/chapter_six/factories/abstract_factory/factories/WestCoastOverlays.as b/BookSourceCode/src/chapter_six/factories/abstract_factory/factories/WestCoastOverlays.as new file mode 100644 index 0000000..d0f4987 --- /dev/null +++ b/BookSourceCode/src/chapter_six/factories/abstract_factory/factories/WestCoastOverlays.as @@ -0,0 +1,45 @@ +package chapter_six.factories.abstract_factory.factories +{ + import chapter_six.factories.abstract_factory.products.form.WestCoastFormOverlay; + import chapter_six.factories.abstract_factory.products.twitter.WestCoastTwitterOverlay; + import chapter_six.factories.abstract_factory.products.audio.WestCoastAudioOverlay; + import chapter_six.factories.abstract_factory.factories.abstractions.AbstractFactoryCoastOverlaySets; + import chapter_six.factories.abstract_factory.products.audio.abstraction.AudioOverlay; + import chapter_six.factories.abstract_factory.products.form.abstraction.FormOverlay; + import chapter_six.factories.abstract_factory.products.photo.WestCoastPhotoOverlay; + import chapter_six.factories.abstract_factory.products.photo.abstraction.PhotoOverlay; + import chapter_six.factories.abstract_factory.products.twitter.abstraction.TwitterOverlay; + import chapter_six.factories.abstract_factory.products.video.WestCoastVideoOverlay; + import chapter_six.factories.abstract_factory.products.video.abstraction.VideoOverlay; + + /** + * @author Ben Smith + */ + public class WestCoastOverlays extends AbstractFactoryCoastOverlaySets + { + override protected function makePhotoOverlay() : PhotoOverlay + { + return new WestCoastPhotoOverlay() + }; + + protected override function makeVideoOverlay() : VideoOverlay + { + return new WestCoastVideoOverlay() + }; + + protected override function makeAudioOverlay() : AudioOverlay + { + return new WestCoastAudioOverlay() + }; + + protected override function makeTwitterOverlay() : TwitterOverlay + { + return new WestCoastTwitterOverlay() + }; + + protected override function makeFormOverlay() : FormOverlay + { + return new WestCoastFormOverlay() + }; + } +} diff --git a/BookSourceCode/src/chapter_six/factories/abstract_factory/factories/abstractions/AbstractFactoryCoastOverlaySets.as b/BookSourceCode/src/chapter_six/factories/abstract_factory/factories/abstractions/AbstractFactoryCoastOverlaySets.as new file mode 100644 index 0000000..7dbb59b --- /dev/null +++ b/BookSourceCode/src/chapter_six/factories/abstract_factory/factories/abstractions/AbstractFactoryCoastOverlaySets.as @@ -0,0 +1,92 @@ +package chapter_six.factories.abstract_factory.factories.abstractions +{ + import chapter_six.factories.abstract_factory.products.audio.abstraction.AudioOverlay; + import chapter_six.factories.abstract_factory.products.form.abstraction.FormOverlay; + import chapter_six.factories.abstract_factory.products.photo.abstraction.PhotoOverlay; + import chapter_six.factories.abstract_factory.products.twitter.abstraction.TwitterOverlay; + import chapter_six.factories.abstract_factory.products.video.abstraction.VideoOverlay; + + import flash.display.DisplayObject; + import flash.display.Sprite; + + + /** + * @author Ben Smith + */ + public class AbstractFactoryCoastOverlaySets extends Sprite + { + public function AbstractFactoryCoastOverlaySets() + + public function createPhotoViewerOverlay() : PhotoOverlay + { + var photoViewer : PhotoOverlay = makePhotoOverlay() + return photoViewer; + } + + public function createVideoOverlay() : VideoOverlay + { + var video : VideoOverlay = makeVideoOverlay() + return video; + } + + protected function makeVideoOverlay() : VideoOverlay + { + return null; + } + + public function createAudioOverlay() : AudioOverlay + { + var audio : AudioOverlay = makeAudioOverlay() + return audio; + } + + protected function makeAudioOverlay() : AudioOverlay + { + return null; + } + + public function createTwitterOverlay() : TwitterOverlay + { + var tweet : TwitterOverlay = makeTwitterOverlay() + return tweet + } + + public function createFormOverlay() : FormOverlay + { + var form : FormOverlay = makeFormOverlay() + return form + } + + private function commonDisplayObjectPrep( dO : DisplayObject ) : DisplayObject + { + var currentOverlay : DisplayObject = dO as DisplayObject; + + /*currentOverlay.addEventListener( OverlayEvent.CLOSE_OVERLAY , handleEvent ); + currentOverlay.addEventListener( OverlayEvent.INTRO_COMPLETE , handleEvent ); + currentOverlay.addEventListener( OverlayEvent.OUTRO_COMPLETE , handleEvent ); + currentOverlay.addEventListener( OverlayEvent.PLAY , handleEvent ); + currentOverlay.addEventListener( OverlayEvent.SUBMIT_TWEET , handleEvent ); + currentOverlay.addEventListener( OverlayEvent.TWITTER_SUBMIT_OVERLAY , handleEvent ); + */ + + return currentOverlay + } + + protected function makePhotoOverlay() : PhotoOverlay + { + return null + } + + protected function makeTwitterOverlay() : TwitterOverlay + { + return null + } + + protected function makeFormOverlay() : FormOverlay + { + return null; + } + + + } +} diff --git a/BookSourceCode/src/chapter_six/factories/abstract_factory/products/abstractions/Overlay.as b/BookSourceCode/src/chapter_six/factories/abstract_factory/products/abstractions/Overlay.as new file mode 100644 index 0000000..578f288 --- /dev/null +++ b/BookSourceCode/src/chapter_six/factories/abstract_factory/products/abstractions/Overlay.as @@ -0,0 +1,14 @@ +package chapter_six.factories.abstract_factory.products.abstractions +{ + import flash.display.Sprite; + + /** + * @author Ben Smith + */ + public class Overlay extends Sprite + { + public function Overlay() + { + } + } +} diff --git a/BookSourceCode/src/chapter_six/factories/abstract_factory/products/audio/EastCoastAudioOverlay.as b/BookSourceCode/src/chapter_six/factories/abstract_factory/products/audio/EastCoastAudioOverlay.as new file mode 100644 index 0000000..52b2adb --- /dev/null +++ b/BookSourceCode/src/chapter_six/factories/abstract_factory/products/audio/EastCoastAudioOverlay.as @@ -0,0 +1,15 @@ +package chapter_six.factories.abstract_factory.products.audio +{ + import chapter_six.factories.abstract_factory.products.audio.abstraction.AudioOverlay; + + /** + * @author Ben Smith + */ + public class EastCoastAudioOverlay extends AudioOverlay + { + public function EastCoastAudioOverlay() + { + super(); + } + } +} diff --git a/BookSourceCode/src/chapter_six/factories/abstract_factory/products/audio/WestCoastAudioOverlay.as b/BookSourceCode/src/chapter_six/factories/abstract_factory/products/audio/WestCoastAudioOverlay.as new file mode 100644 index 0000000..dbf5b94 --- /dev/null +++ b/BookSourceCode/src/chapter_six/factories/abstract_factory/products/audio/WestCoastAudioOverlay.as @@ -0,0 +1,15 @@ +package chapter_six.factories.abstract_factory.products.audio +{ + import chapter_six.factories.abstract_factory.products.audio.abstraction.AudioOverlay; + + /** + * @author Ben Smith + */ + public class WestCoastAudioOverlay extends AudioOverlay + { + public function WestCoastAudioOverlay() + { + super(); + } + } +} diff --git a/BookSourceCode/src/chapter_six/factories/abstract_factory/products/audio/abstraction/AudioOverlay.as b/BookSourceCode/src/chapter_six/factories/abstract_factory/products/audio/abstraction/AudioOverlay.as new file mode 100644 index 0000000..6b1c70f --- /dev/null +++ b/BookSourceCode/src/chapter_six/factories/abstract_factory/products/audio/abstraction/AudioOverlay.as @@ -0,0 +1,14 @@ +package chapter_six.factories.abstract_factory.products.audio.abstraction +{ + import chapter_six.factories.abstract_factory.products.abstractions.Overlay; + + /** + * @author Ben Smith + */ + public class AudioOverlay extends Overlay + { + public function AudioOverlay() + { + } + } +} diff --git a/BookSourceCode/src/chapter_six/factories/abstract_factory/products/form/EastCoastFormOverlay.as b/BookSourceCode/src/chapter_six/factories/abstract_factory/products/form/EastCoastFormOverlay.as new file mode 100644 index 0000000..39017b6 --- /dev/null +++ b/BookSourceCode/src/chapter_six/factories/abstract_factory/products/form/EastCoastFormOverlay.as @@ -0,0 +1,15 @@ +package chapter_six.factories.abstract_factory.products.form +{ + import chapter_six.factories.abstract_factory.products.form.abstraction.FormOverlay; + + /** + * @author Ben Smith + */ + public class EastCoastFormOverlay extends FormOverlay + { + public function EastCoastFormOverlay() + { + super(); + } + } +} diff --git a/BookSourceCode/src/chapter_six/factories/abstract_factory/products/form/WestCoastFormOverlay.as b/BookSourceCode/src/chapter_six/factories/abstract_factory/products/form/WestCoastFormOverlay.as new file mode 100644 index 0000000..0fac49f --- /dev/null +++ b/BookSourceCode/src/chapter_six/factories/abstract_factory/products/form/WestCoastFormOverlay.as @@ -0,0 +1,15 @@ +package chapter_six.factories.abstract_factory.products.form +{ + import chapter_six.factories.abstract_factory.products.form.abstraction.FormOverlay; + + /** + * @author Ben Smith + */ + public class WestCoastFormOverlay extends FormOverlay + { + public function WestCoastFormOverlay() + { + super(); + } + } +} diff --git a/BookSourceCode/src/chapter_six/factories/abstract_factory/products/form/abstraction/FormOverlay.as b/BookSourceCode/src/chapter_six/factories/abstract_factory/products/form/abstraction/FormOverlay.as new file mode 100644 index 0000000..8855694 --- /dev/null +++ b/BookSourceCode/src/chapter_six/factories/abstract_factory/products/form/abstraction/FormOverlay.as @@ -0,0 +1,14 @@ +package chapter_six.factories.abstract_factory.products.form.abstraction +{ + import chapter_six.factories.abstract_factory.products.abstractions.Overlay; + + /** + * @author Ben Smith + */ + public class FormOverlay extends Overlay + { + public function FormOverlay() + { + } + } +} diff --git a/BookSourceCode/src/chapter_six/factories/abstract_factory/products/photo/EastCoastPhotoOverlay.as b/BookSourceCode/src/chapter_six/factories/abstract_factory/products/photo/EastCoastPhotoOverlay.as new file mode 100644 index 0000000..440edf1 --- /dev/null +++ b/BookSourceCode/src/chapter_six/factories/abstract_factory/products/photo/EastCoastPhotoOverlay.as @@ -0,0 +1,15 @@ +package chapter_six.factories.abstract_factory.products.photo +{ + import chapter_six.factories.abstract_factory.products.photo.abstraction.PhotoOverlay; + + /** + * @author Ben Smith + */ + public class EastCoastPhotoOverlay extends PhotoOverlay + { + public function EastCoastPhotoOverlay() + { + super(); + } + } +} diff --git a/BookSourceCode/src/chapter_six/factories/abstract_factory/products/photo/WestCoastPhotoOverlay.as b/BookSourceCode/src/chapter_six/factories/abstract_factory/products/photo/WestCoastPhotoOverlay.as new file mode 100644 index 0000000..e20f9d4 --- /dev/null +++ b/BookSourceCode/src/chapter_six/factories/abstract_factory/products/photo/WestCoastPhotoOverlay.as @@ -0,0 +1,15 @@ +package chapter_six.factories.abstract_factory.products.photo +{ + import chapter_six.factories.abstract_factory.products.photo.abstraction.PhotoOverlay; + + /** + * @author Ben Smith + */ + public class WestCoastPhotoOverlay extends PhotoOverlay + { + public function WestCoastPhotoOverlay() + { + super(); + } + } +} diff --git a/BookSourceCode/src/chapter_six/factories/abstract_factory/products/photo/abstraction/PhotoOverlay.as b/BookSourceCode/src/chapter_six/factories/abstract_factory/products/photo/abstraction/PhotoOverlay.as new file mode 100644 index 0000000..6d0c355 --- /dev/null +++ b/BookSourceCode/src/chapter_six/factories/abstract_factory/products/photo/abstraction/PhotoOverlay.as @@ -0,0 +1,14 @@ +package chapter_six.factories.abstract_factory.products.photo.abstraction +{ + import chapter_six.factories.abstract_factory.products.abstractions.Overlay; + + /** + * @author Ben Smith + */ + public class PhotoOverlay extends Overlay + { + public function PhotoOverlay() + { + } + } +} diff --git a/BookSourceCode/src/chapter_six/factories/abstract_factory/products/twitter/EastCoastTwitterOverlay.as b/BookSourceCode/src/chapter_six/factories/abstract_factory/products/twitter/EastCoastTwitterOverlay.as new file mode 100644 index 0000000..25f5ae8 --- /dev/null +++ b/BookSourceCode/src/chapter_six/factories/abstract_factory/products/twitter/EastCoastTwitterOverlay.as @@ -0,0 +1,15 @@ +package chapter_six.factories.abstract_factory.products.twitter +{ + import chapter_six.factories.abstract_factory.products.twitter.abstraction.TwitterOverlay; + + /** + * @author Ben Smith + */ + public class EastCoastTwitterOverlay extends TwitterOverlay + { + public function EastCoastTwitterOverlay() + { + super(); + } + } +} diff --git a/BookSourceCode/src/chapter_six/factories/abstract_factory/products/twitter/WestCoastTwitterOverlay.as b/BookSourceCode/src/chapter_six/factories/abstract_factory/products/twitter/WestCoastTwitterOverlay.as new file mode 100644 index 0000000..2abaa42 --- /dev/null +++ b/BookSourceCode/src/chapter_six/factories/abstract_factory/products/twitter/WestCoastTwitterOverlay.as @@ -0,0 +1,15 @@ +package chapter_six.factories.abstract_factory.products.twitter +{ + import chapter_six.factories.abstract_factory.products.twitter.abstraction.TwitterOverlay; + + /** + * @author Ben Smith + */ + public class WestCoastTwitterOverlay extends TwitterOverlay + { + public function WestCoastTwitterOverlay() + { + super(); + } + } +} diff --git a/BookSourceCode/src/chapter_six/factories/abstract_factory/products/twitter/abstraction/TwitterOverlay.as b/BookSourceCode/src/chapter_six/factories/abstract_factory/products/twitter/abstraction/TwitterOverlay.as new file mode 100644 index 0000000..2457d1b --- /dev/null +++ b/BookSourceCode/src/chapter_six/factories/abstract_factory/products/twitter/abstraction/TwitterOverlay.as @@ -0,0 +1,15 @@ +package chapter_six.factories.abstract_factory.products.twitter.abstraction +{ + import chapter_six.factories.abstract_factory.products.abstractions.Overlay; + import flash.display.Sprite; + + /** + * @author Ben Smith + */ + public class TwitterOverlay extends Overlay + { + public function TwitterOverlay() + { + } + } +} diff --git a/BookSourceCode/src/chapter_six/factories/abstract_factory/products/video/EastCoastVideoOverlay.as b/BookSourceCode/src/chapter_six/factories/abstract_factory/products/video/EastCoastVideoOverlay.as new file mode 100644 index 0000000..909445b --- /dev/null +++ b/BookSourceCode/src/chapter_six/factories/abstract_factory/products/video/EastCoastVideoOverlay.as @@ -0,0 +1,15 @@ +package chapter_six.factories.abstract_factory.products.video +{ + import chapter_six.factories.abstract_factory.products.video.abstraction.VideoOverlay; + + /** + * @author Ben Smith + */ + public class EastCoastVideoOverlay extends VideoOverlay + { + public function EastCoastVideoOverlay() + { + super(); + } + } +} diff --git a/BookSourceCode/src/chapter_six/factories/abstract_factory/products/video/WestCoastVideoOverlay.as b/BookSourceCode/src/chapter_six/factories/abstract_factory/products/video/WestCoastVideoOverlay.as new file mode 100644 index 0000000..44b2ed2 --- /dev/null +++ b/BookSourceCode/src/chapter_six/factories/abstract_factory/products/video/WestCoastVideoOverlay.as @@ -0,0 +1,15 @@ +package chapter_six.factories.abstract_factory.products.video +{ + import chapter_six.factories.abstract_factory.products.video.abstraction.VideoOverlay; + + /** + * @author Ben Smith + */ + public class WestCoastVideoOverlay extends VideoOverlay + { + public function WestCoastVideoOverlay() + { + super(); + } + } +} diff --git a/BookSourceCode/src/chapter_six/factories/abstract_factory/products/video/abstraction/VideoOverlay.as b/BookSourceCode/src/chapter_six/factories/abstract_factory/products/video/abstraction/VideoOverlay.as new file mode 100644 index 0000000..83fb6ba --- /dev/null +++ b/BookSourceCode/src/chapter_six/factories/abstract_factory/products/video/abstraction/VideoOverlay.as @@ -0,0 +1,15 @@ +package chapter_six.factories.abstract_factory.products.video.abstraction +{ + import chapter_six.factories.abstract_factory.products.abstractions.Overlay; + import flash.display.Sprite; + + /** + * @author Ben Smith + */ + public class VideoOverlay extends Overlay + { + public function VideoOverlay() + { + } + } +} diff --git a/BookSourceCode/src/chapter_six/factories/factory_method/DocumentClass.as b/BookSourceCode/src/chapter_six/factories/factory_method/DocumentClass.as new file mode 100644 index 0000000..9181154 --- /dev/null +++ b/BookSourceCode/src/chapter_six/factories/factory_method/DocumentClass.as @@ -0,0 +1,23 @@ +package chapter_six.factories.factory_method +{ + import chapter_six.factories.factory_method.factories.HomePage; + import chapter_six.factories.factory_method.factories.PortfolioPage; + import chapter_six.factories.factory_method.factories.abstraction.WebPage; + + import flash.display.Sprite; + + /** + * @author Ben Smith + */ + public class DocumentClass extends Sprite + { + public function DocumentClass() + { + var somePage : WebPage = new PortfolioPage() + addChild( somePage ); + + removeChild( somePage ) + somePage = WebPage(addChild( new HomePage() ) ); + } + } +} diff --git a/BookSourceCode/src/chapter_six/factories/factory_method/factories/HomePage.as b/BookSourceCode/src/chapter_six/factories/factory_method/factories/HomePage.as new file mode 100644 index 0000000..2b9b1ec --- /dev/null +++ b/BookSourceCode/src/chapter_six/factories/factory_method/factories/HomePage.as @@ -0,0 +1,22 @@ +package chapter_six.factories.factory_method.factories +{ + import chapter_six.factories.factory_method.product.abstraction.PageContent; + import chapter_six.factories.factory_method.factories.abstraction.WebPage; + + /** + * @author Ben Smith + */ + public class HomePage extends WebPage + { + public function HomePage() + { + super(); + } + + override protected function createVisualRepresentation() : PageContent + { + return new HomePageVisual(); + } + + } +} diff --git a/BookSourceCode/src/chapter_six/factories/factory_method/factories/PortfolioPage.as b/BookSourceCode/src/chapter_six/factories/factory_method/factories/PortfolioPage.as new file mode 100644 index 0000000..d090ae0 --- /dev/null +++ b/BookSourceCode/src/chapter_six/factories/factory_method/factories/PortfolioPage.as @@ -0,0 +1,21 @@ +package chapter_six.factories.factory_method.factories +{ + import chapter_six.factories.factory_method.factories.abstraction.WebPage; + import chapter_six.factories.factory_method.product.abstraction.PageContent; + + /** + * @author Ben Smith + */ + public class PortfolioPage extends WebPage + { + public function PortfolioPage() + { + super(); + } + + override protected function createVisualRepresentation() : PageContent + { + return new PortfolioPageVisual(); + } + } +} diff --git a/BookSourceCode/src/chapter_six/factories/factory_method/factories/abstraction/WebPage.as b/BookSourceCode/src/chapter_six/factories/factory_method/factories/abstraction/WebPage.as new file mode 100644 index 0000000..dce8904 --- /dev/null +++ b/BookSourceCode/src/chapter_six/factories/factory_method/factories/abstraction/WebPage.as @@ -0,0 +1,27 @@ +package chapter_six.factories.factory_method.factories.abstraction +{ + import chapter_six.factories.factory_method.product.abstraction.PageContent; + import flash.display.Sprite; + + /** + * @author Ben Smith + */ + public class WebPage extends Sprite + { + + public var visualRepresentation:PageContent + public function WebPage() + { + visualRepresentation= createVisualRepresentation() + visualRepresentation.x=0; + visualRepresentation.y=0; + addChild(visualRepresentation) + } + + /* factory method*/ + protected function createVisualRepresentation() : PageContent + { + return new PageContent(); + } + } +} diff --git a/BookSourceCode/src/chapter_six/factories/factory_method/product/abstraction/PageContent.as b/BookSourceCode/src/chapter_six/factories/factory_method/product/abstraction/PageContent.as new file mode 100644 index 0000000..4de6b94 --- /dev/null +++ b/BookSourceCode/src/chapter_six/factories/factory_method/product/abstraction/PageContent.as @@ -0,0 +1,17 @@ +package chapter_six.factories.factory_method.product.abstraction +{ + import flash.display.Sprite; + + /** + * @author Ben Smith + */ + public class PageContent extends Sprite + { + + + public function PageContent() + { + + } + } +} diff --git a/BookSourceCode/src/chapter_six/singleton/DocumentClass.as b/BookSourceCode/src/chapter_six/singleton/DocumentClass.as new file mode 100644 index 0000000..4f2eab1 --- /dev/null +++ b/BookSourceCode/src/chapter_six/singleton/DocumentClass.as @@ -0,0 +1,27 @@ +package chapter_six.singleton +{ + import chapter_six.singleton.components.Singleton; + import chapter_six.singleton.components.factories.FaceBookExtendedFactory; + import chapter_six.singleton.components.interfaces.IFacebookFactory; + + import flash.display.Sprite; + + /** + * @author Ben Smith + */ + public class DocumentClass extends Sprite + { + var factory : IFacebookFactory + var _passableSingletonReference : Singleton + + public function DocumentClass() + { + factory = new FaceBookExtendedFactory() + // FaceBookFactory(); + _passableSingletonReference = new Singleton(); + _passableSingletonReference.setFactory( factory ) + + trace( _passableSingletonReference.getInstance() ) + } + } +} diff --git a/BookSourceCode/src/chapter_six/singleton/components/Singleton.as b/BookSourceCode/src/chapter_six/singleton/components/Singleton.as new file mode 100644 index 0000000..68bae22 --- /dev/null +++ b/BookSourceCode/src/chapter_six/singleton/components/Singleton.as @@ -0,0 +1,33 @@ +package chapter_six.singleton.components +{ + import chapter_six.singleton.components.abstractions.Facebook; + import chapter_six.singleton.components.interfaces.IFacebookFactory; + + /** + * @author Ben Smith + */ + public class Singleton extends Object + { + var _factory : IFacebookFactory; + var _singletonProduct : Facebook; + + public function Singleton() + { + } + + public function getInstance() : Facebook + { + if (!_singletonProduct) + { + _singletonProduct = _factory.makeFaceBook(); + } + + return _singletonProduct; + } + + public function setFactory( FBFactory : IFacebookFactory ) : void + { + _factory = FBFactory; + } + } +} diff --git a/BookSourceCode/src/chapter_six/singleton/components/abstractions/Facebook.as b/BookSourceCode/src/chapter_six/singleton/components/abstractions/Facebook.as new file mode 100644 index 0000000..cc3be6b --- /dev/null +++ b/BookSourceCode/src/chapter_six/singleton/components/abstractions/Facebook.as @@ -0,0 +1,18 @@ +package chapter_six.singleton.components.abstractions +{ + import flash.events.EventDispatcher; + import flash.events.IEventDispatcher; + + /** + * @author Ben Smith + */ + public class Facebook extends EventDispatcher + { + public function Facebook( target : IEventDispatcher = null ) + { + super( target ); + } + + + } +} diff --git a/BookSourceCode/src/chapter_six/singleton/components/concretes/FacebookExtended.as b/BookSourceCode/src/chapter_six/singleton/components/concretes/FacebookExtended.as new file mode 100644 index 0000000..8c501c5 --- /dev/null +++ b/BookSourceCode/src/chapter_six/singleton/components/concretes/FacebookExtended.as @@ -0,0 +1,17 @@ +package chapter_six.singleton.components.concretes +{ + import chapter_six.singleton.components.abstractions.Facebook; + import flash.events.IEventDispatcher; + + + /** + * @author Ben Smith + */ + public class FacebookExtended extends Facebook + { + public function FacebookExtended( target : IEventDispatcher = null ) + { + super( target ); + } + } +} diff --git a/BookSourceCode/src/chapter_six/singleton/components/factories/FaceBookExtendedFactory.as b/BookSourceCode/src/chapter_six/singleton/components/factories/FaceBookExtendedFactory.as new file mode 100644 index 0000000..057be19 --- /dev/null +++ b/BookSourceCode/src/chapter_six/singleton/components/factories/FaceBookExtendedFactory.as @@ -0,0 +1,21 @@ +package chapter_six.singleton.components.factories +{ + import chapter_six.singleton.components.abstractions.Facebook; + import chapter_six.singleton.components.concretes.FacebookExtended; + import chapter_six.singleton.components.factories.abstractions.FaceBookFactory; + + /** + * @author Ben Smith + */ + public class FaceBookExtendedFactory extends FaceBookFactory + { + public function FaceBookExtendedFactory() + { + } + + override public function makeFaceBook() : Facebook + { + return new FacebookExtended(); + } + } +} diff --git a/BookSourceCode/src/chapter_six/singleton/components/factories/abstractions/FaceBookFactory.as b/BookSourceCode/src/chapter_six/singleton/components/factories/abstractions/FaceBookFactory.as new file mode 100644 index 0000000..a81c155 --- /dev/null +++ b/BookSourceCode/src/chapter_six/singleton/components/factories/abstractions/FaceBookFactory.as @@ -0,0 +1,17 @@ +package chapter_six.singleton.components.factories.abstractions +{ + import chapter_six.singleton.components.abstractions.Facebook; + import chapter_six.singleton.components.interfaces.IFacebookFactory; + + /** + * @author Ben Smith + */ + public class FaceBookFactory extends Object implements IFacebookFactory + { + + public function makeFaceBook() : Facebook + { + return new Facebook(); + } + } +} diff --git a/BookSourceCode/src/chapter_six/singleton/components/interfaces/IFacebookFactory.as b/BookSourceCode/src/chapter_six/singleton/components/interfaces/IFacebookFactory.as new file mode 100644 index 0000000..cd42563 --- /dev/null +++ b/BookSourceCode/src/chapter_six/singleton/components/interfaces/IFacebookFactory.as @@ -0,0 +1,11 @@ +package chapter_six.singleton.components.interfaces +{ + import chapter_six.singleton.components.abstractions.Facebook; + /** + * @author Ben Smith + */ + public interface IFacebookFactory + { + function makeFaceBook() : Facebook; + } +} diff --git a/BookSourceCode/src/chapter_six/the_builder_pattern/DocumentClass.as b/BookSourceCode/src/chapter_six/the_builder_pattern/DocumentClass.as new file mode 100644 index 0000000..6bceb6b --- /dev/null +++ b/BookSourceCode/src/chapter_six/the_builder_pattern/DocumentClass.as @@ -0,0 +1,33 @@ +package chapter_six.the_builder_pattern +{ + import chapter_six.the_builder_pattern.builders.marioesque.MarioLevelEditor; + import chapter_six.the_builder_pattern.builders.marioesque.abstraction.AbstractMarioEsqueLevelEditor; + import chapter_six.the_builder_pattern.directors.marioesque.StageTwo; + import chapter_six.the_builder_pattern.directors.marioesque.abstraction.AbstractMarioLevelDirector; + import flash.display.Bitmap; + import flash.display.Sprite; + import flash.display.Stage; + import flash.display.StageAlign; + import flash.display.StageScaleMode; + + + /** + * @author Ben Smith + */ + public class DocumentClass extends Sprite + { + private var _bitmap : Bitmap; + + public function DocumentClass() + { + var stg : Stage = this.stage; + stg.scaleMode = StageScaleMode.NO_SCALE; + stg.align = StageAlign.TOP_LEFT; + var levelEditor : AbstractMarioEsqueLevelEditor = new MarioLevelEditor(); + var director : AbstractMarioLevelDirector = new StageTwo( levelEditor ); + // LevelOne(levelEditor) + _bitmap = new Bitmap( director.getLevel() ); + addChild( _bitmap ); + } + } +} \ No newline at end of file diff --git a/BookSourceCode/src/chapter_six/the_builder_pattern/builders/marioesque/MarioLevelEditor.as b/BookSourceCode/src/chapter_six/the_builder_pattern/builders/marioesque/MarioLevelEditor.as new file mode 100644 index 0000000..6d58da0 --- /dev/null +++ b/BookSourceCode/src/chapter_six/the_builder_pattern/builders/marioesque/MarioLevelEditor.as @@ -0,0 +1,58 @@ +package chapter_six.the_builder_pattern.builders.marioesque +{ + import chapter_six.the_builder_pattern.builders.marioesque.abstraction.AbstractMarioEsqueLevelEditor; + import flash.display.DisplayObject; + + + /** + * @author Ben Smith + */ + + public class MarioLevelEditor extends AbstractMarioEsqueLevelEditor + { + public function MarioLevelEditor() + { + super(); + } + + override protected function doCreateSolidBrick() : DisplayObject + { + return new SolidBrick(); + } + + override protected function doCreateBreakableBrick() : DisplayObject + { + return new BreakableBrick(); + } + + override protected function doCreateStone() : DisplayObject + { + return new Stone(); + } + + override protected function doCreateMoneyBox() : DisplayObject + { + return new MoneyBox(); + } + + override protected function doCreateCloud() : DisplayObject + { + return new Cloud(); + } + + override protected function doCreateHill() : DisplayObject + { + return new Hill(); + } + + override protected function doCreatePipe() : DisplayObject + { + return new Pipe(); + } + + override protected function doCreateBush() : DisplayObject + { + return new Shrubs(); + } + } +} diff --git a/BookSourceCode/src/chapter_six/the_builder_pattern/builders/marioesque/abstraction/AbstractMarioEsqueLevelEditor.as b/BookSourceCode/src/chapter_six/the_builder_pattern/builders/marioesque/abstraction/AbstractMarioEsqueLevelEditor.as new file mode 100644 index 0000000..4004db0 --- /dev/null +++ b/BookSourceCode/src/chapter_six/the_builder_pattern/builders/marioesque/abstraction/AbstractMarioEsqueLevelEditor.as @@ -0,0 +1,214 @@ +package chapter_six.the_builder_pattern.builders.marioesque.abstraction +{ + import flash.display.BitmapData; + import flash.display.DisplayObject; + import flash.display.Graphics; + import flash.display.Shape; + import flash.errors.IllegalOperationError; + import flash.geom.Point; + import flash.geom.Rectangle; + + /** + * @author Ben Smith + */ + + public class AbstractMarioEsqueLevelEditor + { + private var _bitmap : BitmapData; + private var _backgroundColor : uint; + private var _width : int; + private var _height : int; + private var _pt : Point; + private var _tile : Shape; + + public function AbstractMarioEsqueLevelEditor() + { + _tile = new Shape(); + _pt = new Point( 0 , 0 ); + } + + final public function createMap() : void + { + bitmap = doCreateMap(); + } + + final public function getLevel() : BitmapData + { + return _bitmap; + } + + final public function createStone( rect : Rectangle ) : void + { + addTile( doCreateStone() , rect ); + } + + final public function createSolidBrick( rect : Rectangle ) : void + { + addTile( doCreateSolidBrick() , rect ); + } + + final public function createBreakableBrick( rect : Rectangle ) : void + { + addTile( doCreateBreakableBrick() , rect ); + } + + final public function createMoneyBox( rect : Rectangle ) : void + { + addTile( doCreateMoneyBox() , rect ); + } + + final public function createCloud( rect : Rectangle ) : void + { + addTile( doCreateCloud() , rect ); + } + + final public function createHill( rect : Rectangle ) : void + { + addTile( doCreateHill() , rect ); + } + + final public function createBush( rect : Rectangle ) : void + { + addTile( doCreateBush() , rect ); + } + + final public function createCastle( rect : Rectangle ) : void + { + addTile( doCreateCastle() , rect ); + } + + final public function createPipe( rect : Rectangle ) : void + { + addTile( doCreatePipe() , rect ); + } + + final public function get width() : int + { + return _width; + } + + final public function set width( width : int ) : void + { + _width = width; + } + + final public function get height() : int + { + return _height; + } + + final public function set height( height : int ) : void + { + _height = height; + } + + final public function get backgroundColor() : uint + { + return _backgroundColor; + } + + final public function set backgroundColor( backgroundColor : uint ) : void + { + _backgroundColor = backgroundColor; + } + + final public function get bitmap() : BitmapData + { + return _bitmap; + } + + final public function set bitmap( bitmap : BitmapData ) : void + { + _bitmap = bitmap; + } + + protected function doCreateMap() : BitmapData + { + return new BitmapData( width , height , false , backgroundColor ); + } + + protected function doCreateStone() : DisplayObject + { + throw new IllegalOperationError( 'doCreateStone must be overridden' ); + return null; + } + + protected function doCreateSolidBrick() : DisplayObject + { + throw new IllegalOperationError( 'doCreateSolidBrick must be overridden' ); + return null; + } + + protected function doCreateBreakableBrick() : DisplayObject + { + throw new IllegalOperationError('doCreateBreakableBrick must be overridden'); + return null; + } + + protected function doCreateMoneyBox() : DisplayObject + { + throw new IllegalOperationError( 'doCreateMoneyBox must be overridden' ); + return null; + } + + protected function doCreateCloud() : DisplayObject + { + throw new IllegalOperationError( 'doCreateCloud must be overridden' ); + return null; + } + + protected function doCreateHill() : DisplayObject + { + throw new IllegalOperationError( 'doCreateHill must be overridden' ); + return null; + } + + protected function doCreateBush() : DisplayObject + { + throw new IllegalOperationError( 'doCreateBush must be overridden' ); + return null; + } + + protected function doCreateCastle() : DisplayObject + { + throw new IllegalOperationError( 'doCreateCastle must be overridden' ); + return null; + } + + protected function doCreatePipe() : DisplayObject + { + throw new IllegalOperationError( 'doCreatePipe must be overridden' ); + return null; + } + + private function addTile( dO : DisplayObject , rect : Rectangle ) : void + { + var sprite : BitmapData = snapShot( dO ); + _pt.x = rect.x; + _pt.y = rect.y; + if (rect.width > 0 || rect.height > 0) + { + sprite = tile( sprite , rect ); + } + bitmap.copyPixels( sprite , sprite.rect , _pt ); + } + + private function snapShot( dO : DisplayObject ) : BitmapData + { + var snapshot : BitmapData = new BitmapData( dO.width, dO.height, true, 0 ); + snapshot.draw( dO ); + return snapshot; + } + + private function tile( bmpd : BitmapData , rect : Rectangle ) : BitmapData + { + var _t : Shape = _tile; + var g : Graphics = _t.graphics; + g.clear(); + g.beginBitmapFill( bmpd , null , true , false ); + g.drawRect( 0 , 0 , rect.width , rect.height ); + g.endFill(); + return snapShot( _t ); + } + } +} diff --git a/BookSourceCode/src/chapter_six/the_builder_pattern/directors/marioesque/LevelOne.as b/BookSourceCode/src/chapter_six/the_builder_pattern/directors/marioesque/LevelOne.as new file mode 100644 index 0000000..9eac7a2 --- /dev/null +++ b/BookSourceCode/src/chapter_six/the_builder_pattern/directors/marioesque/LevelOne.as @@ -0,0 +1,87 @@ +package chapter_six.the_builder_pattern.directors.marioesque +{ + import chapter_six.the_builder_pattern.builders.marioesque.abstraction.AbstractMarioEsqueLevelEditor; + import chapter_six.the_builder_pattern.directors.marioesque.abstraction.AbstractMarioLevelDirector; + import flash.display.BitmapData; + import flash.geom.Rectangle; + + + /** + * @author Ben Smith + */ + public class LevelOne extends AbstractMarioLevelDirector + { + private const _width : int = 400; + private const _height : int = 300; + private var rect : Rectangle = new Rectangle( 0 , 0 , 0 , 0 ); + + public function LevelOne( builder : AbstractMarioEsqueLevelEditor ) + { + super( builder ); + } + + public override function getLevel() : BitmapData + { + _builder.width = _width; + _builder.height = _height; + _builder.backgroundColor = 0x0000FF; + _builder.createMap(); + buildPipes(); + buildFloor(); + buildScenicBushes(); + buildClouds(); + + buildMoneyBox(); + buildScenicBricks(); + return _builder.getLevel(); + } + + private function buildScenicBushes() : void + { + assignRect( 100 , _height - 28 * 2 - 32 ); + _builder.createBush( rect ); + } + + private function buildMoneyBox() : void + { + assignRect( 50 , _height - 51.25 - 95 ); + _builder.createMoneyBox( rect ); + } + + private function buildScenicBricks() : void + { + assignRect( 50 - 28 , _height - 51.25 - 95 ); + _builder.createBreakableBrick( rect ); + assignRect( 50 + 28 , _height - 51.25 - 95 ); + _builder.createBreakableBrick( rect ); + } + + private function buildPipes() : void + { + assignRect( 250 , _height - 28 * 2 - 65 ); + _builder.createPipe( rect ); + } + + private function buildFloor() : void + { + assignRect( 0 , _height - 56 , _width , _height - 56 ); + _builder.createSolidBrick( rect ); + } + + private function buildClouds() : void + { + assignRect( 0 , 40 ); + _builder.createCloud( rect ); + assignRect( 200 ); + _builder.createCloud( rect ); + } + + private function assignRect( x : int = 0 , y : int = 0 , w : int = 0 , h : int = 0 ) : void + { + rect.x = x; + rect.y = y; + rect.width = w; + rect.height = h; + } + } +} diff --git a/BookSourceCode/src/chapter_six/the_builder_pattern/directors/marioesque/StageTwo.as b/BookSourceCode/src/chapter_six/the_builder_pattern/directors/marioesque/StageTwo.as new file mode 100644 index 0000000..6e0bfa5 --- /dev/null +++ b/BookSourceCode/src/chapter_six/the_builder_pattern/directors/marioesque/StageTwo.as @@ -0,0 +1,86 @@ +package chapter_six.the_builder_pattern.directors.marioesque +{ + import chapter_six.the_builder_pattern.builders.marioesque.abstraction.AbstractMarioEsqueLevelEditor; + import chapter_six.the_builder_pattern.directors.marioesque.abstraction.AbstractMarioLevelDirector; + import flash.display.BitmapData; + import flash.geom.Rectangle; + + + + /** + * @author Ben Smith + */ + public class StageTwo extends AbstractMarioLevelDirector + { + private const _width : int = 400; + private const _height : int = 300; + private var rect : Rectangle = new Rectangle( 0 , 0 , 0 , 0 ); + + public function StageTwo( builder : AbstractMarioEsqueLevelEditor ) + { + super( builder ); + } + + public override function getLevel() : BitmapData + { + _builder.width = _width; + _builder.height = _height; + _builder.backgroundColor = 0x0000FF; + + _builder.createMap(); + buildPipes(); + buildFloor(); + + buildClouds(); + buildStairs(); + return _builder.getLevel(); + } + + + + private function buildStairs() : void + { + var totalWide : int = _width; + var floorTall : int = _height - 28 * 2; + var row : int = 6; + var col : int = 1; + while (--row) + { + var dist : int = totalWide - row * 28; + assignRect( dist , floorTall - col * 28 , row * 28 , 28 ); + _builder.createStone( rect ); + col++; + } + } + + private function buildPipes() : void + { + assignRect( 50 , _height - 28 * 2 - 65 ); + _builder.createPipe( rect ); + } + + private function buildFloor() : void + { + assignRect( 0 , _height - 56 , _width , _height - 56 ); + _builder.createSolidBrick( rect ); + } + + private function buildClouds() : void + { + assignRect( 0 , 40 ); + _builder.createCloud( rect ); + assignRect( 40 , 40 ); + _builder.createCloud( rect ); + assignRect( 400 , 30 ); + _builder.createCloud( rect ); + } + + private function assignRect( x:int = 0, y:int = 0, w:int = 0, h:int = 0 ) : void + { + rect.x = x; + rect.y = y; + rect.width = w; + rect.height = h; + } + } +} diff --git a/BookSourceCode/src/chapter_six/the_builder_pattern/directors/marioesque/abstraction/AbstractMarioLevelDirector.as b/BookSourceCode/src/chapter_six/the_builder_pattern/directors/marioesque/abstraction/AbstractMarioLevelDirector.as new file mode 100644 index 0000000..f7147c5 --- /dev/null +++ b/BookSourceCode/src/chapter_six/the_builder_pattern/directors/marioesque/abstraction/AbstractMarioLevelDirector.as @@ -0,0 +1,24 @@ +package chapter_six.the_builder_pattern.directors.marioesque.abstraction +{ + import chapter_six.the_builder_pattern.builders.marioesque.abstraction.AbstractMarioEsqueLevelEditor; + import flash.display.BitmapData; + + + /** + * @author Ben Smith + */ + public class AbstractMarioLevelDirector + { + protected var _builder : AbstractMarioEsqueLevelEditor + + public function AbstractMarioLevelDirector( builder : AbstractMarioEsqueLevelEditor ) + { + _builder = builder; + } + + public function getLevel() : BitmapData + { + return _builder.getLevel(); + } + } +} diff --git a/LICENSE.txt b/LICENSE.txt new file mode 100644 index 0000000..d6f4cb4 --- /dev/null +++ b/LICENSE.txt @@ -0,0 +1,27 @@ +Freeware License, some rights reserved + +Copyright (c) 2011 Ben Smith + +Permission is hereby granted, free of charge, to anyone obtaining a copy +of this software and associated documentation files (the "Software"), +to work with the Software within the limits of freeware distribution and fair use. +This includes the rights to use, copy, and modify the Software for personal use. +Users are also allowed and encouraged to submit corrections and modifications +to the Software for the benefit of other users. + +It is not allowed to reuse, modify, or redistribute the Software for +commercial use in any way, or for a user’s educational materials such as books +or blog articles without prior permission from the copyright holder. + +The above copyright notice and this permission notice need to be included +in all copies or substantial portions of the software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS OR APRESS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. + + diff --git a/README.md b/README.md new file mode 100644 index 0000000..d0fce66 --- /dev/null +++ b/README.md @@ -0,0 +1,15 @@ +#Apress Source Code + +This repository accompanies [*AdvancED ActionScript 3.0*](http://www.apress.com/9781430236146) by Ben Smith (Apress, 2011). + +![Cover image](9781430236146.jpg) + +Download the files as a zip using the green button, or clone the repository to your machine using Git. + +##Releases + +Release v1.0 corresponds to the code in the published book, without corrections or updates. + +##Contributions + +See the file Contributing.md for more information on how you can contribute to this repository. diff --git a/contributing.md b/contributing.md new file mode 100644 index 0000000..f6005ad --- /dev/null +++ b/contributing.md @@ -0,0 +1,14 @@ +# Contributing to Apress Source Code + +Copyright for Apress source code belongs to the author(s). However, under fair use you are encouraged to fork and contribute minor corrections and updates for the benefit of the author(s) and other readers. + +## How to Contribute + +1. Make sure you have a GitHub account. +2. Fork the repository for the relevant book. +3. Create a new branch on which to make your change, e.g. +`git checkout -b my_code_contribution` +4. Commit your change. Include a commit message describing the correction. Please note that if your commit message is not clear, the correction will not be accepted. +5. Submit a pull request. + +Thank you for your contribution! \ No newline at end of file