Introduction Welcome to The EnterPage newsletter. We consider our subscribers as part of our extended family, whether we've met you in person at The ToolBook User's Conference / e-Learning Authoring Conference (TBCON), shared ToolBook tips with us on the ToolBook List, purchased one of our products, or signed up via our web site. We wish you all a happy and safe holiday season. We've been busy as always, this time with a major update to TBK Tracker to allow it to track Flash content created with Training Studio or other tools, a companion "Tracker Sync" to synchronize the offline TBK Tracker content with our Tracker.Net, and of course and update to our popular "Learning & Mastering ToolBook Assistant" product. We're also gearing up for the tenth TBCON. With apologies to REO Speedwagon, we might call it "A Decade of ToolBook Rock & Roll." In between all this, we hope this newsletter contains some useful information for you about the latest news in the Platte Canyon and ToolBook worlds and serves as a source of tips and tricks about ToolBook, Flash, and .NET. Enjoy! |
Upgrade ToolBook and Receive a 20% Discount When Purchasing Support/Maintenance We reviewed the new, 32-bit ToolBook Instructor 9 in our last issue - it is a great new release! With Assistant 9.01 and a corresponding Instructor 9.01 update, there has never been a better time to upgrade. Act by December 15th and you can receive 20% when you upgrade either Instructor or Assistant and also purchase support & maintenance. Plus, receive $50 off any of our products or The ToolBook User's Conference / e-Learning Authoring Conference when you upgrade from Platte Canyon. You can order online (just put add a note reminding us of the special pricing as we don't list that on the site), via email (sales@plattecanyon.com), via fax (719-548-1114), or phone (888-866-5251 or 719-548-1110). Here are some links: ToolBook Instructor Information ToolBook Assistant Information Order |
TBK Tracker Provides Offline Tracking for Flash and ToolBook Content
Our TBK Tracker Learning Management System (LMS) has allowed ToolBook developers to track their native ToolBook content deployed via CD or Local Area Network (LAN) since 1998. Over the years, we've had frequent requests for similar functionality for other types of content. But when we released our first Flash-based authoring tool, Training Studio, we realized that we needed a good way for customers not running via a SCORM LMS to track the content. After looking as some commercially-available "projectors," we decided to write our own freely-distributable projector in .NET. This projector reads the database (Access or SQL Server), provides student login, allows the student to select a course, and serves up the Flash content. Training Studio content works right out of the box. Other Flash content needs to make some well-documented calls via FSCommand or ExternalInterface. Licensing is $2,995 ($1,995 if you own the ToolBook version) per developer with free runtime distribution. Here are some links: Information Sample Installation Projector Documentation Order |
Tracker Sync Allows Synchronization Between TBK Tracker and Tracker.Net Another longtime functionality request related to our offline (TBK Tracker) and online (Tracker.Net) LMS's was the ability to allow users to take training offline and then to add that to the online system. The work that we did on our Training Studio comment tracking web service made us realize that we could use a similar approach to pull this off. The result is Tracker Sync. It is a simple client-side application that connects to the TBK Tracker database, authenticates the student, and passes the local TBK Tracker information to the web service, which does the bulk of the heavy lifting. An Access database on the web site stores the mapping between the TBK Tracker and Tracker.Net lessons and courses. Here are some links: Information Editor Help Web Service Documentation Order |
Learning & Mastering ToolBook Assistant 9 Released Coinciding with the upcoming release of Assistant 9, we've completely updated Learning & Mastering Assistant. There is new content on such topics as:
Information Outline Order |
2008 ToolBook User's Conference / e-Learning Authoring Conference Pricing Set
Rates are set for the tenth annual ToolBook User's Conference / e-Learning Authoring Conference. With all the food, drink, comaraderie, great sessions, and lodging (if desired) included, you won't find a better learning opportunity anywhere. Prices rise by $50 on May 15, 2008, but you can sign up today while there is still training money in the budget:). Here are the rates:
Rates Sessions Faculty Preconference Attendee Comments Register |
TBCON Faculty Proposals Now Being Accepted Do you have the "Right Stuff" for being on the 2008 faculty of The ToolBook User's Conference / e-Learning Authoring Conference? Are you not only an expert in the one or more of the technologies listed below but willing and able to explain how and why you make things work?
Session Proposals |
ToolBook SmartStyles Article Available SumTotal has published an initial version of Tim Barham's Create ToolBook SmartStyles article. While it is not totally finished, it is still an excellent reference for this great feature of ToolBook 9. |
Plug-In Pro Spotlight - Importing and Validating Web Graphic Placeholders Many of us use ToolBook's Web Graphic Placeholder for most of our graphics since it grabs the original graphic and uses it for the exported web content rather converting the bitmap stored inside the book itself. But the process for linking up a number of placeholders can be a bit time-consuming:
To learn more, you can follow these links: Help topic Plug-In Pro web page |
Expert Information from the Learning & Mastering ToolBook Series By Jeff Rhodes, Platte Canyon Multimedia Software Corporation Action Methods - Common Elements We created a ToolBook prototype for our Training Studio product that shows the power of Action Methods. The concept behind Training Studio is database-driven training where the Subject Matter Expert (SME) selects a template and then enters associated information into an editor for storage in a database. So the implementation of the templates (pages in ToolBook) needs to be generalized to work with lots of different content, media, etc. The core design feature was to have key operations like playing media and checking completion status accomplished by the Action Methods of a "Common Elements" button on each page. That allowed the methods to be tailored somewhat for each template if needed, copied with each template page, and be isolated to its own script for the OpenScript code [to keep from getting over 64K of code in any single script]. Here is the PlayMedia action: -- Action Method "PlayMedia" --------------------------------------------------- If mediaId <> "" Execute extStop() of MediaPlayer "MediaPlayer" Execute extStop() of ShockwaveFlash "FlashPlayer" Comment: Trigger moves players off the screen, User Event moves them back on If offset(".swf",mediaId) > 0 Trigger MediaPlayer "MediaPlayer" Send User event to ShockwaveFlash "FlashPlayer" Set extMovie of ShockwaveFlash "FlashPlayer" to "media\" & mediaId Else if offset(".wma",mediaId) > 0 or offset(".mp3",mediaId) > 0 Trigger MediaPlayer "MediaPlayer" Trigger ShockwaveFlash "FlashPlayer" Set extFileName of MediaPlayer "MediaPlayer" to "media\" & mediaId Else Trigger ShockwaveFlash "FlashPlayer" Send User event to MediaPlayer "MediaPlayer" Set extFileName of MediaPlayer "MediaPlayer" to "media\" & mediaId End if End ifAs you can guess, there is a Windows Media Player (WMP) and Flash Player on each page. We first stop each in case it is playing. The "mediaId" variable contains the name of the file to play. If it ends in .swf, then we know it is Flash. Otherwise, we use WMP. We "Trigger" the one we don't want to move it off the page (needed in native ToolBook as ActiveX controls have a hard time being hidden) and send a user event to the one we want to move it into position. We then set the appropriate property (extMovie for Flash and extFileName for WMP) to tell the player which file to play. Here is the "DetermineCompletion" Action Method: -- Action Method "DetermineCompletion" ----------------------------------------- Define local variable "allCompleted" (Initial value: "") Define local variable "completionId" (Initial value: "") Define local variable "num" (Initial value: "") Define local variable "numHotspots" (Initial value: "") If completionArray[g_selectionNum] <> "true" Set completionArray[g_selectionNum] to "true" Set numHotspots to text of field "numHotspots" Set allCompleted to true Step num from 1 to numHotspots by 1 Set completionId to completionArray[num] If completionId <> "true" Set allCompleted to false Break out of step loop End if End step loop If allCompleted = true Set visible of Web Graphic "CompletionImage" of This Background to true End if End ifIn this case, we are trying to determine when all of the interactions on the page have been completed. Each "hotspot" sets a global variable (g_selectionNum) to its own number and then calls this method. We have a global array (completionArray) that keeps track of overall completion on the page. We set the corresponding element of that array to "true" and then check to see if all of the interactions have been completed. Notice that we read the number of interactions from a field which in turn got set from the databases. If the page has been completed, we show a "completion image" that is located on a background. These are complicated actions for sure. But consider how much LESS code is involved compared with having all this logic in the actions for each hotspot. And when it comes time to change the code, you can do it one place rather than multiple places. |
OpenScript Tip from the Learning & Mastering ToolBook Series
By Peter Jackson, ToolBookDeveloper.com Setting Action Global Variables from OpenScript Question: For authoring purposes, is there a way to set the initial value of an actions editor global variable through OpenScript? I have a variable which is going to determine how my "exit" button behaves and would like to build a tool in OpenScript that sets this by checking a box while in authoring mode. AE Global variables are OS system variables and they (Global) are assigned after enterBook and after reader. If you add the scripts shown to your book or system book you may change the value of the Global variable. As OpenScript is not exported this will work for Native. to handle enterBook forward get setNativeGlobalVars() of self end enterBook to handle reader forward get setNativeGlobalVars() of self end reader to get setNativeGlobalVars system InternetOn, flashPath -- Use this function to Initialise Global -- variables used in the Action System. -- The Global variables should be created -- using the "Define Variables..." and then -- select the "Global Variables" tab. -- Each variable should have the -- "Initial Value:" assigned for export, -- therefore we use this function to change the -- "Initial Value" for Native deployment. -- InternetOn is a global variable with initial -- value set to true. This is used to stop calls -- to JavaScript function and/or HTTP Posts -- when in TB native mode. InternetOn = false flashPath = ASYM_PathOfFile(name of self) & "flashFiles\" return null end setNativeGlobalVars There is an alternative. Add the actions to your exit button for DHTML only. Now create and assign a sharedScript to the exit button to do what you want for native or development time and include the ASYM_Reset handler shown: notifyBefore ASYM_Reset clear script of self end ASYM_ResetThis will remove (clear) all of the OpenScript that is created from the Actions allowing your sharedScript to take control. As with OpenScript in an object, sharedScripts are also NOT exported. |
Web Hint from the Learning & Mastering ToolBook Series
By Tim Barham, SumTotal Systems, Inc. Testing Locally in IE7 OK, I have a work-around for ToolBook content not working from your local file system in IE7. First, the background: ToolBook uses the JavaScript XMLHTTPRequest object for various forms of communication with the server, including downloading a page's JavaScript. In Mozilla-based browsers, this is implemented as a native browser object. In IE, prior to version 7, it was implemented as an ActiveX control. In IE7, Microsoft has added the XMLHTTPRequest object as a native browser object. Our JavaScript code first looks for the native browser object, and if it doesn't find it, tries to instantiate the ActiveX version. Hence, in IE7, we are using the native browser version rather than the ActiveX version (note that for content running off the server this is actually good news - it means we can use the XMLHTTPRequest object even if ActiveX support is turned off in IE). Anyway... For the most part they function the same, but there is an important difference. When we download a page's JavaScript file, we use a relative path (simply "p0.js", for example). The normal expectation with a relative URL is that the browser would use the same protocol and path as the current document. When running from your local file system, the ActiveX version of the XMLHTTPRequest object is quite happy with that. The Mozilla implementation of the XMLHTTPRequest object is also fine. But the IE7 native browser implementation of the XMLHTTPRequest object is NOT happy with that. It requires that the protocol be specified ("file:p0.js" rather than just "p0.js"). Hence we get an "Access denied" error and we can't download the file. When running from a web server (via HTTP or HTTPS), there is no such requirement (which is why ToolBook content doesn't have this problem when run from a web server). Now for the work-around: It is possible to turn OFF the native XMLHTTPRequest implementation in IE7. To do this, go to Tools \ Internet Options \ Advanced tab. Scroll down to the Security section and clear the "Enable native XMLHTTP support" option. On your machine, the native XMLHTTPRequest object will no longer function in IE7, and ToolBook content will revert to using the ActiveX control version as it does in IE6. |
Flash ActionScript Tip
By Jeff Rhodes, Platte Canyon Multimedia Software Corporation Dynamically Loading Images with ActionScript 3 Here is a sample from my "Flash for Programmers" session at TBCON. In it, we load an image from subdirectory of the Flash movie. Our first tasks is to create some "global" variables to be shared among multiple functions in the Actions layer: var imageMediaLoader:Loader = new Loader(); var imageId:Bitmap;Notice the use of the Loader class, which is used to load images or external Flash files. Our next step is to associate the loadImage function with its associated button: LoadImageButton.addEventListener(MouseEvent.CLICK, loadImage);Here is the loadImage function: function loadImage(event:MouseEvent):void { var moviePath:String = "images/desperado.gif"; var request:URLRequest = new URLRequest(moviePath); imageMediaLoader.contentLoaderInfo.addEventListener(Event.COMPLETE, onLoadImageComplete); imageMediaLoader.load(request); }We create a relative path to the image we want to load. We then create an instance of the URLRequest class, which we use to upload and download information or external files. Notice how the "constructor" of the object is the path of the image we want to import into our movie. Next, we use another event listener to tell Flash what function (onLoadImageComplete) that we want to call when the image has been successfully loaded (using the imageMediaLoader object). Then, we actually start the importing with a call to the Loader's load method. Here is the onLoadImageComplete function: function onLoadImageComplete(event:Event):void { imageId = Bitmap(imageMediaLoader.content); var imageObjectId:Object = addChild(imageId); imageObjectId.x = (LoadImageButton.x + LoadImageButton.width + 10); imageObjectId.y = LoadImageButton.y; statusTextId.text = "Loaded Image."; }The reference to what we loaded is stored as the content property of our loader. We tell Flash that we know is it a Bitmap and assign it to our global imageId variable. We then call the addChild method to add the image to the stage. This step is crucial or the image will never show up. The return value is a reference to the object. We use this to set the x and y coordinates of the image. Why did we need the imageId to be a global variable? That is so we can remove the image when leaving the key frame: if (imageId != null) { removeChild(imageId); } |
VBTrain.Net Nugget
By Jeff Rhodes, Platte Canyon Multimedia Software Corporation User Properties via My.Settings One of the challenges in creating a "projector" for Flash content in .NET was how to allow the user to customize the graphics, settings, look and feel, etc. In ToolBook, we have the user open the "front end book" in author-level ToolBook. But asking the training developer to purchase and use Visual Studio is a bit much. So we needed another mechanism. A nice fit was the new My.Settings capability in .NET 2.0. It allows both application-level and user-level settings to be stored in an external XML file. We can then refer to those "properties" in our code. Here is a simple example for the initial splash screen. The code is from the Load handler for the splash screen form. Dim bitmapId As Bitmap = Training_Graphic(Me) If bitmapId IsNot Nothing Then Me.ClientSize = New Size(bitmapId.Width, bitmapId.Height) Me.BackgroundImage = bitmapId End If The part of interest in this article is the implementation of the Training_Graphic property. It is defined in a Module since it is used elsewhere in the program: Friend ReadOnly Property Training_Graphic(ByVal formId As Form) As Bitmap Get If c_Training_Graphic Is Nothing Then Dim graphicName As String = GetApplicationSetting(My.Settings.Training_Graphic, "") Dim graphicValid As Boolean = False If graphicName <> "" Then Dim graphicPath As String = String.Format("{0}\{1}", Application.StartupPath, graphicName) If File.Exists(graphicPath) Then Try c_Training_Graphic = New Bitmap(graphicPath) graphicValid = True Catch ex As Exception End Try End If End If If graphicValid = False Then Dim streamId As Stream = formId.GetType().Assembly.GetManifestResourceStream("TBKTrackerProjector.trainingstudio.gif") c_Training_Graphic = New Bitmap(streamId) End If End If Return c_Training_Graphic End Get End PropertyWe only want to read in the graphic once, so once we do so, we store the reference in the c_Training_Graphic variable. If that doesn't yet exist, we call the GetApplicationSetting, as shown below. Friend Function GetApplicationSetting(ByVal settingValue As String, ByVal defaultValue As String) As String Dim returnString As String = settingValue If settingValue Is Nothing OrElse settingValue = "" Then returnString = defaultValue End If Return returnString End FunctionThe parameter is the external value, referred to as My.Settings.Training_Graphic. If it is set, it looks like this in the external configuration file: <setting name="Training_Graphic" serializeAs="String"> <value>trainingstudio.gif</value> </setting>If the graphic name is not null, we turn it from a relative path to a complete path and try to create a "new" bitmap. If it is not null or we have a problem, we default to a graphic that is stored as a resource of the executable itself. Notice the use of the GetManifestResourceStream method in this case. Either way, we return the bitmap that we use for the splash graphic. A user can change that graphic by simply editing the configuration file. |
The EnterPage is distributed up to four times per year, with occasional special issues. Individuals who have expressed interest in Platte Canyon Multimedia Software Corporation or its products receive The EnterPage. Suggestions for articles or proposals for article submissions are welcome. Send information to ep@plattecanyon.com. Back issues of the EnterPage are available at: http://www.plattecanyon.com/enterpage.aspx |
Platte Canyon Multimedia Software Corporation, 8870 Edgefield Drive, Colorado Springs, CO 80920, (719) 548-1110 |