Basic usage of Flash’In’App

By writing just a few lines of code using Flash’In’App, you can embed Flash movies directly into your application and enable your users to interact with it.

The code example below assumes you already have a ESFlashView object inside a window that should represent the Flash movie. You can create an ESFlashView object and attach it to a window either programmatically or by using Interface Builder. Using Interface Builder, drag a CustomView and place it into your window and specify Custom Class as ESFlashView. You should also connect the ESFlashView object to an outlet so that you can send messages to it programmatically.

You can add most of Flash’In’App features into your application by assigning delegates to your ESFlashView object and implementing delegate methods. Because the delegate methods are informal protocols, you can choose which methods you want to implement.

By default, Flash’In’App presumes that Flash Player plugin is located in Contents/PlugIns/Flash Player.plugin. In case you would like to use the plugin which is installed in the target system and you don’t want to deploy the one with your application, you should find the plugin in the target system yourself (usually it is located in /Library/Internet Plug-Ins or ~/Library/Internet Plug-Ins). To find the correct plugin, you need to search for “Flash Player.plugin” package in those folders. After that you need to call [ESFlashView setPluginPath:] method and pass the path to the plugin to it. However, in case the installed plugin is of incorrect architecture (PPC when Intel-compatible is needed, and vice versa) or its version is earlier than 8, Flash’In’App will not be able to work. You will have to make sure your application is able to access the needed plugin in this case. You can either warn users, or offer to download it, or whatever you find more suitable in your case.

Here’s Listing 1 which shows you the way of simplest initialization of the framework by just loading a SWF movie:

Listing 1: Simple initialization of ESFlashView 

  /* NSString *strPath - this variable should be defined somewhere; */
  /* it will list the path where the movie is stored locally        */

  /* create URL for strPath */
	NSURL *url = [NSURL fileURLWithPath:strPath];
  /* create base URL for strPath */
	NSURL *baseURL = [NSURL fileURLWithPath:[strPath stringByDeletingLastPathComponent]];
  /* load Flash movie, which is located at strPath with basic URL baseURL */
  [flashView loadMovie:[NSData dataWithContentsOfURL:url] atURL:url withBaseURL:baseURL];

In case you would like to disable standard Flash Player right-click menu or replace it with yours, please, add the following to your code:

Listing 2: Flash Player right-click menu customization: 

  // disable standard Flash Player context menu representation
  [flashView setSendRightClick:NO];
  // set contextualMenu to be context menu for ESFlashView
  //NSMenu *contextualMenu - this variable should be defined somewhere above
  [flashView setMenu:contextualMenu];

In case you would like to make loaded movie’s background transparent, you will need to add the following call:

Listing 3: In the following case the window background will be shown instead of movie’s background (will work correctly on Intel-based Macs only): 

  [flashView setTransparent:YES];

Should you be willing to make the native window completely transparent/invisible and only display the SWF movie, the following conditions and actions should be fulfilled:

  • For PPC & Intel-based Macs: that’s a kind of workaround; you can create a SWF file which will match the size of the window and will not have any custom-shaped areas, so it will fully cover the window. The window should be borderless and opaque, ESFlashView’s frame size should equal the size of the window.
  • For Intel-based Macs only: that’s the best way to implement true transparency, but it has some compatibility issues; you will need to have the SWF movie which you are about to load and ESFlashView to match or be less than the window, make the latter borderless and transparent, and make ESFlashView transparent. In this way you will reach the best transparency effect.

However, don’t forget to code window moving by dragging yourself, as you disabled standard controls. Here’s how you can accomplish this: 

Move window by clicking and dragging

Due to certain logical limitations (e.g. there’s an interactive control in a Flash movie) window moving by clicking and dragging cannot be realized automatically by Flash’In’App, your participation as a developer is required. It’s not that difficult at all, still it provides you with the way to control the dragging areas yourself. To accomplish this you need to assign a delegate to ESFlashView and implement flashView:wasDraggedFrom:to: method in it, in this method you will need to handle moving by clicking and dragging routines. Listing 4 has another simple sample for you.

Listing 4: A sample of flashView:wasDraggedFrom:to: implementation 

  - (void) flashView:(ESFlashView *)flashView wasDraggedFrom:(NSPoint)fromPoint to:(NSPoint)toPoint
    NSRect moveRect = NSMakeRect (70, 0, 310, 40);
    if(NSPointInRect(fromPoint, moveRect) || NSPointInRect(toPoint, moveRect))
      float dx = toPoint.x - fromPoint.x;
      float dy = toPoint.y - fromPoint.y;

      NSPoint newOrigin;
      NSRect  screenFrame = [[NSScreen mainScreen] frame];
      NSRect  windowFrame = [window frame];
      newOrigin.x = windowFrame.origin.x + dx;
      newOrigin.y = windowFrame.origin.y - dy;

      // Don't let window get dragged up under the menu bar
      if( (newOrigin.y+windowFrame.size.height) > (screenFrame.origin.y+screenFrame.size.height) )
        newOrigin.y=screenFrame.origin.y + (screenFrame.size.height-windowFrame.size.height);

      [window setFrameOrigin:newOrigin];

See our GUI Sample sources to see a real-life implementation of the above approach.