Commit 2a8e5724 authored by O'Reilly Media, Inc's avatar O'Reilly Media, Inc
Browse files

Initial commit

parents
BOOK : ActionScript Developer's Guide to PureMVC
AUTHOR : Cliff Hall, Futurescale, Inc.
ISBN : 978-1-449-31456-9
PUBLISHER : O'Reilly Media
PROJECTS : StoryArchitect, StoryArchitectModel, StoryArchitectTests
REQUIRES : Flex 4.5.1, AIR 3 SDKs
INCLUDES : Application project, Model Project, Unit Test Project,
Project files for FlashBuilder 4.5
SEE ASLO : README files in each project explain project dependencies
-----------------------------------------------------------
StoryArchitect
Copyright (c) 2011, Futurescale, Inc., All Rights Reserved.
-----------------------------------------------------------
The source code provided in this project is intended for educational purposes only.
You may not use the entire application in its current or modified form for commercial gain.
FROM THE PREFACE OF ActionScript Developer's Guide to PureMVC...
Using Code Examples
--------------------
This book is here to help you get your job done. In general, you may use the code in
this book in your programs and documentation. You do not need to contact us for
permission unless you’re reproducing a significant portion of the code. For example,
writing a program that uses several chunks of code from this book does not require
permission. Selling or distributing a CD-ROM of examples from O’Reilly books does
require permission. Answering a question by citing this book and quoting example
code does not require permission. Incorporating a significant amount of example code
from this book into your product’s documentation does require permission.
We appreciate, but do not require, attribution. An attribution usually includes the title,
author, publisher, and ISBN. For example: “ActionScript Developer’s Guide to
PureMVC by Cliff Hall (O’Reilly). Copyright 2012 Futurescale, Inc.,
978-1-449-31456-9.”
If you feel your use of code examples falls outside fair use or the permission given above,
feel free to contact us at permissions@oreilly.com.
\ No newline at end of file
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<actionScriptProperties analytics="false" mainApplicationPath="StoryArchitect.mxml" projectUUID="7368b745-76f3-44c8-8d24-7ad50e0db978" version="10">
<compiler additionalCompilerArguments="-locale en_US" autoRSLOrdering="true" copyDependentFiles="true" fteInMXComponents="false" generateAccessible="true" htmlExpressInstall="true" htmlGenerate="false" htmlHistoryManagement="false" htmlPlayerVersionCheck="true" includeNetmonSwc="false" outputFolderPath="bin-debug" removeUnusedRSL="true" sourceFolderPath="src" strict="true" targetPlayerVersion="0.0.0" useApolloConfig="true" useDebugRSLSwfs="true" verifyDigests="true" warn="true">
<compilerSourcePath/>
<libraryPath defaultLinkType="0">
<libraryPathEntry kind="4" path="">
<excludedEntries>
<libraryPathEntry kind="3" linkType="1" path="${PROJECT_FRAMEWORKS}/libs/flex.swc" useDefaultLinkType="false"/>
<libraryPathEntry kind="3" linkType="1" path="${PROJECT_FRAMEWORKS}/libs/core.swc" useDefaultLinkType="false"/>
</excludedEntries>
</libraryPathEntry>
<libraryPathEntry kind="1" linkType="1" path="libs"/>
<libraryPathEntry kind="3" linkType="1" path="/StoryArchitectModel/bin/StoryArchitectModel.swc" useDefaultLinkType="false"/>
</libraryPath>
<sourceAttachmentPath/>
</compiler>
<applications>
<application path="StoryArchitect.mxml">
<airExcludes/>
</application>
</applications>
<modules/>
<buildCSSFiles/>
<flashCatalyst validateFlashCatalystCompatibility="false"/>
<buildTargets>
<buildTarget buildTargetName="default">
<airSettings airCertificatePath="" airTimestamp="true" version="1">
<airExcludes/>
</airSettings>
<actionScriptSettings version="1"/>
</buildTarget>
</buildTargets>
</actionScriptProperties>
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<flexProperties enableServiceManager="false" flexServerFeatures="0" flexServerType="0" toolCompile="true" useServerFlexSDK="false" version="2"/>
<?xml version="1.0" encoding="UTF-8"?>
<projectDescription>
<name>StoryArchitect</name>
<comment></comment>
<projects>
</projects>
<buildSpec>
<buildCommand>
<name>com.adobe.flexbuilder.project.flexbuilder</name>
<arguments>
</arguments>
</buildCommand>
<buildCommand>
<name>com.adobe.flexbuilder.project.apollobuilder</name>
<arguments>
</arguments>
</buildCommand>
</buildSpec>
<natures>
<nature>com.adobe.flexbuilder.project.apollonature</nature>
<nature>com.adobe.flexbuilder.project.flexnature</nature>
<nature>com.adobe.flexbuilder.project.actionscriptnature</nature>
</natures>
</projectDescription>
BOOK : ActionScript Developer's Guide to PureMVC
AUTHOR : Cliff Hall, Futurescale, Inc.
ISBN : 978-1-449-31456-9
PUBLISHER : O'Reilly Media
PROJECT : StoryArchitect - AIR Desktop Application
REQUIRES : StoryArchitectModel Flex Library Project in same workspace
INCLUDES : StoryArchitect Application, View and Controller related classes
-----------------------------------------------------------
StoryArchitect
Copyright (c) 2011, Futurescale, Inc., All Rights Reserved.
-----------------------------------------------------------
The source code provided in this project is intended for educational purposes only.
You may not use the entire application in its current or modified form for commercial gain.
FROM THE PREFACE OF ActionScript Developer's Guide to PureMVC...
Using Code Examples
--------------------
This book is here to help you get your job done. In general, you may use the code in
this book in your programs and documentation. You do not need to contact us for
permission unless you’re reproducing a significant portion of the code. For example,
writing a program that uses several chunks of code from this book does not require
permission. Selling or distributing a CD-ROM of examples from O’Reilly books does
require permission. Answering a question by citing this book and quoting example
code does not require permission. Incorporating a significant amount of example code
from this book into your product’s documentation does require permission.
We appreciate, but do not require, attribution. An attribution usually includes the title,
author, publisher, and ISBN. For example: “ActionScript Developer’s Guide to
PureMVC by Cliff Hall (O’Reilly). Copyright 2012 Futurescale, Inc.,
978-1-449-31456-9.”
If you feel your use of code examples falls outside fair use or the permission given above,
feel free to contact us at permissions@oreilly.com.
\ No newline at end of file
<?xml version="1.0" encoding="utf-8" standalone="no"?>
<application xmlns="http://ns.adobe.com/air/application/2.6">
<!-- Adobe AIR Application Descriptor File Template.
Specifies parameters for identifying, installing, and launching AIR applications.
xmlns - The Adobe AIR namespace: http://ns.adobe.com/air/application/2.6
The last segment of the namespace specifies the version
of the AIR runtime required for this application to run.
minimumPatchLevel - The minimum patch level of the AIR runtime required to run
the application. Optional.
-->
<!-- A universally unique application identifier. Must be unique across all AIR applications.
Using a reverse DNS-style name as the id is recommended. (Eg. com.example.ExampleApplication.) Required. -->
<id>StoryArchitect</id>
<!-- Used as the filename for the application. Required. -->
<filename>StoryArchitect</filename>
<!-- The name that is displayed in the AIR application installer.
May have multiple values for each language. See samples or xsd schema file. Optional. -->
<name>StoryArchitect</name>
<!-- A string value of the format <0-999>.<0-999>.<0-999> that represents application version which can be used to check for application upgrade.
Values can also be 1-part or 2-part. It is not necessary to have a 3-part value.
An updated version of application must have a versionNumber value higher than the previous version. Required for namespace >= 2.5 . -->
<versionNumber>0.0.0</versionNumber>
<!-- A string value (such as "v1", "2.5", or "Alpha 1") that represents the version of the application, as it should be shown to users. Optional. -->
<!-- <versionLabel></versionLabel> -->
<!-- Description, displayed in the AIR application installer.
May have multiple values for each language. See samples or xsd schema file. Optional. -->
<!-- <description></description> -->
<!-- Copyright information. Optional -->
<!-- <copyright></copyright> -->
<!-- Publisher ID. Used if you're updating an application created prior to 1.5.3 -->
<!-- <publisherID></publisherID> -->
<!-- Settings for the application's initial window. Required. -->
<initialWindow>
<!-- The main SWF or HTML file of the application. Required. -->
<!-- Note: In Flash Builder, the SWF reference is set automatically. -->
<content>[This value will be overwritten by Flash Builder in the output app.xml]</content>
<!-- The title of the main window. Optional. -->
<!-- <title></title> -->
<!-- The type of system chrome to use (either "standard" or "none"). Optional. Default standard. -->
<!-- <systemChrome></systemChrome> -->
<!-- Whether the window is transparent. Only applicable when systemChrome is none. Optional. Default false. -->
<!-- <transparent></transparent> -->
<!-- Whether the window is initially visible. Optional. Default false. -->
<!-- <visible></visible> -->
<!-- Whether the user can minimize the window. Optional. Default true. -->
<!-- <minimizable></minimizable> -->
<!-- Whether the user can maximize the window. Optional. Default true. -->
<!-- <maximizable></maximizable> -->
<!-- Whether the user can resize the window. Optional. Default true. -->
<!-- <resizable></resizable> -->
<!-- The window's initial width in pixels. Optional. -->
<width>1000</width>
<!-- The window's initial height in pixels. Optional. -->
<height>600</height>
<!-- The window's initial x position. Optional. -->
<!-- <x></x> -->
<!-- The window's initial y position. Optional. -->
<!-- <y></y> -->
<!-- The window's minimum size, specified as a width/height pair in pixels, such as "400 200". Optional. -->
<!-- <minSize></minSize> -->
<!-- The window's initial maximum size, specified as a width/height pair in pixels, such as "1600 1200". Optional. -->
<!-- <maxSize></maxSize> -->
<!-- The initial aspect ratio of the app when launched (either "portrait" or "landscape"). Optional. Mobile only. Default is the natural orientation of the device -->
<!-- <aspectRatio></aspectRatio> -->
<!-- Whether the app will begin auto-orienting on launch. Optional. Mobile only. Default false -->
<!-- <autoOrients></autoOrients> -->
<!-- Whether the app launches in full screen. Optional. Mobile only. Default false -->
<!-- <fullScreen></fullScreen> -->
<!-- The render mode for the app (either auto, cpu, or gpu). Optional. Mobile only. Default auto -->
<!-- <renderMode></renderMode> -->
<!-- Whether or not to pan when a soft keyboard is raised or lowered (either "pan" or "none"). Optional. Defaults "pan." -->
<!-- <softKeyboardBehavior></softKeyboardBehavior> -->
<autoOrients>false</autoOrients>
<fullScreen>false</fullScreen>
<visible>false</visible>
</initialWindow>
<!-- We recommend omitting the supportedProfiles element, -->
<!-- which in turn permits your application to be deployed to all -->
<!-- devices supported by AIR. If you wish to restrict deployment -->
<!-- (i.e., to only mobile devices) then add this element and list -->
<!-- only the profiles which your application does support. -->
<!-- <supportedProfiles>desktop extendedDesktop mobileDevice extendedMobileDevice</supportedProfiles> -->
<!-- The subpath of the standard default installation location to use. Optional. -->
<!-- <installFolder></installFolder> -->
<!-- The subpath of the Programs menu to use. (Ignored on operating systems without a Programs menu.) Optional. -->
<!-- <programMenuFolder></programMenuFolder> -->
<!-- The icon the system uses for the application. For at least one resolution,
specify the path to a PNG file included in the AIR package. Optional. -->
<!-- <icon>
<image16x16></image16x16>
<image32x32></image32x32>
<image36x36></image36x36>
<image48x48></image48x48>
<image72x72></image72x72>
<image114x114></image114x114>
<image128x128></image128x128>
</icon> -->
<!-- Whether the application handles the update when a user double-clicks an update version
of the AIR file (true), or the default AIR application installer handles the update (false).
Optional. Default false. -->
<!-- <customUpdateUI></customUpdateUI> -->
<!-- Whether the application can be launched when the user clicks a link in a web browser.
Optional. Default false. -->
<!-- <allowBrowserInvocation></allowBrowserInvocation> -->
<!-- Listing of file types for which the application can register. Optional. -->
<!-- <fileTypes> -->
<!-- Defines one file type. Optional. -->
<!-- <fileType> -->
<!-- The name that the system displays for the registered file type. Required. -->
<!-- <name></name> -->
<!-- The extension to register. Required. -->
<!-- <extension></extension> -->
<!-- The description of the file type. Optional. -->
<!-- <description></description> -->
<!-- The MIME content type. -->
<!-- <contentType></contentType> -->
<!-- The icon to display for the file type. Optional. -->
<!-- <icon>
<image16x16></image16x16>
<image32x32></image32x32>
<image48x48></image48x48>
<image128x128></image128x128>
</icon> -->
<!-- </fileType> -->
<!-- </fileTypes> -->
<!-- iOS specific capabilities -->
<!-- <iPhone> -->
<!-- A list of plist key/value pairs to be added to the application Info.plist -->
<!-- <InfoAdditions>
<![CDATA[
<key>UIDeviceFamily</key>
<array>
<string>1</string>
<string>2</string>
</array>
<key>UIStatusBarStyle</key>
<string>UIStatusBarStyleBlackOpaque</string>
<key>UIRequiresPersistentWiFi</key>
<string>YES</string>
]]>
</InfoAdditions> -->
<!-- <requestedDisplayResolution></requestedDisplayResolution> -->
<!-- </iPhone> -->
<!-- Specify Android specific tags that get passed to AndroidManifest.xml file. -->
<!--<android>
<manifestAdditions>
<![CDATA[
<manifest android:installLocation="auto">
<uses-permission android:name="android.permission.INTERNET"/>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>
<uses-configuration android:reqFiveWayNav="true"/>
<supports-screens android:normalScreens="true"/>
<uses-feature android:required="true" android:name="android.hardware.touchscreen.multitouch"/>
<application android:enabled="true">
<activity android:excludeFromRecents="false">
<intent-filter>
<action android:name="android.intent.action.MAIN"/>
<category android:name="android.intent.category.LAUNCHER"/>
</intent-filter>
</activity>
</application>
</manifest>
]]>
</manifestAdditions>
</android> -->
<!-- End of the schema for adding the android specific tags in AndroidManifest.xml file -->
</application>
<?xml version="1.0" encoding="utf-8"?>
<!-- STORY ARCHITECT APPLICATION -->
<s:WindowedApplication xmlns:editor="com.futurescale.sa.view.component.editor.*"
xmlns:chooser="com.futurescale.sa.view.component.chooser.*"
xmlns:s="library://ns.adobe.com/flex/spark"
xmlns:fx="http://ns.adobe.com/mxml/2009" title="Story Architect"
applicationComplete="facade.startup(this); // startup app"
minWidth="800" minHeight="600" closing="onWindowClosing(event)">
<fx:Script>
<![CDATA[
import com.futurescale.sa.view.event.AppEvent;
import com.futurescale.sa.ApplicationFacade;
import com.futurescale.sa.view.context.SelectionContext;
public static const MODE_STARTING:String = "Starting...";
public static const MODE_CHOOSER:String = "Chooser";
public static const MODE_EDITOR:String = "Editor";
// Selection context shared between view components.
[Bindable] public var context:SelectionContext;
// Word Count (displayed on status bar in Editor mode)
[Bindable] public var wordCount:String = "";
// Selected Item (displayed on status bar in Editor mode)
[Bindable] public var selectionDesc:String = "";
// Display Mode (Chooser/Editor)
[Bindable] private var mode:String = MODE_STARTING;
// Initialize the PureMVC Facade
private var facade:ApplicationFacade = ApplicationFacade.getInstance();
/**
* Set the application display mode, and if showing
* the Editor, initialize the word count from the
* selected Story.
*/
public function setMode( mode:String ):void
{
this.mode=mode;
if ( mode == MODE_EDITOR && !context.series ) {
wordCount = context.story.wordCount.toString();
} else {
wordCount = "";
}
}
/**
* Cancel window closing event and send an
* AppEvent.DISCARD_CHANGES if we are in
* editor mode.
*/
private function onWindowClosing( event:Event ):void
{
if ( mode == MODE_EDITOR ) {
event.preventDefault();
dispatchEvent( new AppEvent( AppEvent.EXIT_APP ) );
}
}
]]>
</fx:Script>
<!-- LAYOUT -->
<s:layout>
<s:VerticalLayout horizontalAlign="center"/>
</s:layout>
<!-- STATUS BAR -->
<s:status>{mode}{(wordCount != "")?" | "+wordCount+" words":""}{(mode == MODE_EDITOR &amp;&amp; context.getDescription(context.selectedItem) != "")?" | "+context.getDescription(context.selectedItem) :""}</s:status>
<!-- CHOOSER -->
<chooser:Chooser id="chooser" width="100%" height="100%"
includeInLayout="{mode == MODE_CHOOSER}"
visible="{mode == MODE_CHOOSER}"/>
<!-- EDITOR -->
<editor:Editor id="editor" width="100%" height="100%"
includeInLayout="{mode == MODE_EDITOR}"
visible="{mode == MODE_EDITOR}"
reportWordCount="wordCount=String(event.data)"
context="{context}"/>
</s:WindowedApplication>
\ No newline at end of file
/* CSS file */
@namespace s "library://ns.adobe.com/flex/spark";
@namespace mx "library://ns.adobe.com/flex/mx";
@namespace timeline "com.futurescale.sa.view.component.timeline.*";
@namespace plot "com.futurescale.sa.view.component.plot.*";
@namespace scrap "com.futurescale.sa.view.component.scrapbook.*";
package com.futurescale.sa
{
import com.futurescale.sa.controller.command.startup.StartupCommand;
import com.futurescale.sa.controller.constant.AppConstants;
import org.puremvc.as3.patterns.facade.Facade;
public class ApplicationFacade extends Facade
{
/**
* The singleton instance factory method.
*/
public static function getInstance( ) : ApplicationFacade
{
if ( instance == null ) instance = new ApplicationFacade( );
return instance as ApplicationFacade;
}
/**
* A convenience method for starting up the PureMVC
* apparatus from the application.
*/
public function startup( app:StoryArchitect ):void
{
registerCommand( AppConstants.STARTUP, StartupCommand );
sendNotification( AppConstants.STARTUP, app );
}
}
}
\ No newline at end of file
package com.futurescale.sa.controller.command.edit
{
import com.futurescale.sa.model.vo.ChapterVO;
import com.futurescale.sa.model.vo.DraftVO;
import com.futurescale.sa.model.vo.NoteVO;
import com.futurescale.sa.model.vo.PartVO;
import com.futurescale.sa.model.vo.SceneVO;
import com.futurescale.sa.model.vo.SeasonVO;
import com.futurescale.sa.model.vo.StoryVO;
import com.futurescale.sa.model.vo.ValueObject;
import com.futurescale.sa.view.context.SelectionContext;
import com.futurescale.sa.view.event.AppEvent;
import org.puremvc.as3.interfaces.INotification;
import org.puremvc.as3.interfaces.IProxy;
import org.puremvc.as3.patterns.command.SimpleCommand;
/**
* A request to add some new item has arisen from the
* View in the form of an AppEvent. Here, we will
* interpret the event, add the item, then trigger
* selection of that item.
*/
public class AddItemCommand extends SimpleCommand
{
override public function execute( notification:INotification ):void
{
var event:AppEvent = AppEvent( notification.getBody() );
// Get the SelectionContext
var scProxy:IProxy = facade.retrieveProxy( SelectionContext.NAME );
var context:SelectionContext = SelectionContext( scProxy.getData() );
var season:SeasonVO;
var story:StoryVO;
var part:PartVO;
var chapter:ChapterVO;
var scene:SceneVO;
var draft:DraftVO;
var note:NoteVO;
var vo:ValueObject;
switch ( event.type )
{
case AppEvent.ADD_EPISODE:
break;
case AppEvent.ADD_PART:
// add part to selected story
story = context.story;
part = story.getNewPart();
context.selectStory( story );
break;
case AppEvent.ADD_CHAPTER:
if ( context.part )
{
// add chapter to selected part
part = context.part
chapter = part.getNewChapter( );
context.selectPart( part );
} else {
// add chapter to selected story
story = context.story;
chapter = story.getNewChapter( );
context.selectStory( story );
}
break;
case AppEvent.ADD_SCENE:
if ( context.chapter )