If you're comfortable looking at the source code for the framework classes, then check out the source of MenuBar.as at line 1574, see the showMenu() method. That has logic that repositions the menu so that it remains on the stage. You could use that code and re-purpose it a little to get it working for your situation. It looks like the key line in there is this:

UIComponentGlobals.layoutManager.validateClient(menu, true);

which will validate the size of the Menu before you then use the width and height to check the x and y position.

Also, see if my Scrollable Menu component might fit your needs: http://dougmccune.com/blog/2007/01/26/even-better-scrollable-menus-for-flex/

-Doug

karlgold wrote:

I want to display a popup menu when the user clicks in a certain spot
in application:

private function showContextMenu(e:MouseEvent):void {

var menuData:Array = new Array();
// populate menuData

var itemMenu:Menu = Menu.createMenu(null, menuData, true);
itemMenu.show(e.stageX, e.stageY);
}

This works fine. However, if the user clicks close to the bottom or
right margin of the application, the menu is cut off.

I'd like to do something like this:

private function showContextMenu(e:MouseEvent):void {

var menuData:Array = new Array();
// populate menuData

var itemMenu:Menu = Menu.createMenu(null, menuData, true);
// how to tell a Menu to measure its width and height before
// displaying it?

var x:Number = e.stageX;
var y:Number = e.stageY;

if (x + itemMenu.width > this.stage.width) {
// show menu to the left of the cursor
x -= itemMenu.width;
}

if (y + itemMenu.height > this.stage.height) {
// show menu above the cursor
y -= itemMenu.height;
}

itemMenu.show(x, y);
}

It appears that the width and height are 0 prior to calling show().
Is there any way to measure the menu before drawing it?

Thanks,

Karl


Reply via email to