topical media & game development

talk show tell print

actionscript-book-PodcastPlayer-com-example-programmingas3-podcastplayer-PodcastPlayer.ax

actionscript-book-PodcastPlayer-com-example-programmingas3-podcastplayer-PodcastPlayer.ax [swf] flex


  package 
  {
          //import com.example.programmingas3.podcastplayer.RSSItem;
          //import com.example.programmingas3.utils.DateUtil;
          //import com.example.programmingas3.podcastplayer.URLService;
          //import com.example.programmingas3.podcastplayer.RSSChannel;
          //import com.example.programmingas3.podcastplayer.PlayButtonRenderer;
          
          import fl.controls.dataGridClasses.DataGridColumn;
          import fl.data.DataProvider;
          import fl.events.DataGridEvent;
          import fl.events.ListEvent;
  
          import flash.display.MovieClip;
          import flash.events.Event;
          import flash.events.DataEvent;
          import flash.events.ErrorEvent;        
          import flash.events.IOErrorEvent;        
          import flash.events.SecurityErrorEvent;        
          
          public class @ax-actionscript-book-PodcastPlayer-com-example-programmingas3-podcastplayer-PodcastPlayer extends MovieClip
          {
                  public var service:actionscript_book_PodcastPlayer_com_example_programmingas3_podcastplayer_URLService;
                  
                  public var feeds:XMLList;
                  public var feedArray:Array;
                  public var articles:XMLList;
                  
                  public var currentFeed:actionscript_book_PodcastPlayer_com_example_programmingas3_podcastplayer_RSSChannel;
                  
                  public const PLAY_COLUMN:int = 2;
                  
                  public function @ax-actionscript-book-PodcastPlayer-com-example-programmingas3-podcastplayer-PodcastPlayer():void
                  {
                          var col1:DataGridColumn = new DataGridColumn("publishDate");
                          col1.headerText = "date";
                          col1.sortOptions = Array.NUMERIC;
                          col1.labelFunction = formatDateColumn;
                          col1.width = 90;
                          
                          var col2:DataGridColumn = new DataGridColumn("title");
                          col2.headerText = "Title";
                          col2.width = 220;
                          
                          var col3:DataGridColumn = new DataGridColumn("Play");
                          col3.cellRenderer = actionscript_book_PodcastPlayer_com_example_programmingas3_podcastplayer_PlayButtonRenderer;
                          col3.width = 70;
                          
                          this.articleGrid.addColumn(col1);
                          this.articleGrid.addColumn(col2);
                          this.articleGrid.addColumn(col3);
                          
                          this.articleGrid.addEventListener(fl.events.ListEvent.ITEM_CLICK , onGridPlay);
                          this.feedList.addEventListener(Event.CHANGE, onFeedSelected); 
                          
                          var configService:actionscript_book_PodcastPlayer_com_example_programmingas3_podcastplayer_URLService = new actionscript_book_PodcastPlayer_com_example_programmingas3_podcastplayer_URLService("playerconfig.xml");
                          configService.addEventListener(DataEvent.DATA, onConfigReceived);
                          configService.addEventListener(IOErrorEvent.IO_ERROR, onFeedError);
                          configService.addEventListener(SecurityErrorEvent.SECURITY_ERROR, onFeedError);
                          configService.send();
                  }
                  
                  public function onConfigReceived(event:DataEvent):void
                  {
                          var result:XML = new XML(event.data);
                          this.feeds = result.feed;
                          trace("feeds.length()=" + this.feeds.length());
                          
                          // convert the XMLList to an array of objects
                          var feedObj:Object;
                          this.feedArray = new Array();
                          for each (var feed:XML in this.feeds)
                          {
                                  feedObj = { label:feed.label, url:feed.url };
                                  this.feedArray.push(feedObj);
                          }
  
                          this.feedList.dataProvider = new DataProvider(this.feedArray);
                          this.feedList.selectedIndex = 0;
                          this.feedList.dispatchEvent(new Event(Event.CHANGE));
                  }
                  
                  public function onFeedSelected(event:Event):void
                  {
                          var url:String = feedList.selectedItem.url.toString();
                          if (url != null)
                          {
                                  service = new actionscript_book_PodcastPlayer_com_example_programmingas3_podcastplayer_URLService(url);
                                  service.addEventListener(DataEvent.DATA, onFeedReceived);
                                  service.addEventListener(IOErrorEvent.IO_ERROR, onFeedError);
                                  service.addEventListener(SecurityErrorEvent.SECURITY_ERROR, onFeedError);
                                  service.send();
                          }
                  }
                  
                  public function onFeedReceived(event:DataEvent):void
                  {
                          var result:XML = new XML(event.data);
                          
                          var channelXML:XMLList = result.child("channel");
                          if (channelXML != null)
                          {
                                  this.currentFeed = actionscript_book_PodcastPlayer_com_example_programmingas3_podcastplayer_RSSChannel.parseFeed(channelXML[0]);
                                  
                                  // massage the data so the DataGrid is happy
                                  for each (var item:actionscript_book_PodcastPlayer_com_example_programmingas3_podcastplayer_RSSItem in this.currentFeed.items)
                                  {
                                          item["Play"] = "Play";
                                          if (item.duration == "null")
                                          {
                                                  item.duration = "";
                                          }
                                  }
                             
                                  if (this.currentFeed != null)
                                  {
                                          this.articleGrid.dataProvider = new DataProvider(this.currentFeed.items);
                                          this.feedImg.source = this.currentFeed.imageUrl;
                                  
                                          this.feedDescriptionTxt.htmlText = this.currentFeed.getDescriptionHTML();
                                  }
                          }
                  }
                  
                  public function onFeedError(event:ErrorEvent):void
                  {
                          showError(new Error(event.text));
                  }
                  
                  
A common method for displaying error messages. Should be enhanced to show a dialog box with an error message.

                  
                  public function showError(e:Error):void
                  {
                          trace("Error: " + e.message);
                  }
                  
                  
Called when the Play button is clicked inside a row of the grid.

  
                  public function onGridPlay(evt:ListEvent):void
                  {
                          trace("onGridPlay col=" + evt.columnIndex + ", url=" + evt.item.soundUrl);
                          if (evt.columnIndex == PLAY_COLUMN)
                          {
                                  var item:Object = evt.item;
                                  var title:String = item.title;
                                  if (item.soundUrl != null)
                                  {
                                          this.player.load(item.soundUrl, title);
                                  }
                          }
                  }
                  
                  public function formatDateColumn(data:Object):String
                  {
                          // remove milliseconds
                          var dateStr:String = actionscript_book_PodcastPlayer_com_example_programmingas3_utils_DateUtil.formatShort(data.publishDate);
                          return dateStr;
                  }
                  
                  public function formatDurationColumn(data:Object):String
                  {
                          var durStr:String = data.duration;
                          return durStr as String;
                  }
          }
  
  }


(C) Æliens 27/08/2009

You may not copy or print any of this material without explicit permission of the author or the publisher. In case of other copyright issues, contact the author.