AsWing и модальные окна

В этом простом туториале мы научимся получать данные из модальных (и не только) окон AsWing

Создадим простой класс, показывающий модальное окно...

class ModalWindow extends Sprite
{
        public var frame : JFrame;  //окно AsWing, понадобится извне
       
        public function new()  {
                super();
        }

        public function Show() {
               
                var frame = new JFrame(this, "MyDialog", true);   //parent, caption, is_modal
                frame.setSize(new IntDimension( 400, 50 );    //размер

                //сделаем кнопки ОК и Cancel           
                var buttonOK = new JButton("OK");
                var buttonCancel = new JButton("Cancel");
               
                //у JFrame две области - title (заголовок окна) и content, мы добавляем компоненты ко второй
                frame.getContentPane().setLayout(new GridLayout(1, 2));     //в две колонки на всю ширину
                frame.getContentPane().append(buttonOK);   //добавим к окну кнопки
                frame.getContentPane().append(buttonCancel);

                //здесь надо сделать обработчики нажатия кнопок
                //добавим их чуть позже

                //отобразим окно
                Lib.current.stage.addChild(this);
                frame.show();
       }
}

Теперь, если мы попробуем запустить код, приведенный выше, например так:

var modalDialog = new ModalWindow();
modalDialog.Show();
trace("hello, world");

то обнаружим, что модальные окна в AsWing - не совсем модальные.
На экране будет создано окошко с двумя кнопками (и кнопкой "закрыть" сверху), которое заблокирует все, что под ним, до того, как его закроют. Тем не менее, trace() выполнится сразу, чтобы вернуть управление обработкой событий, и чтобы узнать, какая кнопка нажата, нужно немного потрудиться.

Для начала, нам понадобится обработчик нажатия кнопок:

//в переменные-члены класса
var dialogResult : Bool;

//в конструктор
dialogResult = false;

//в функцию Show()

var self = this; //разыменовать для замыкания
buttonOK.addActionListener(function(e) {       //обработчик нажатия кнопки (действие по умолчанию)
        self.dialogResult = true;   //установить возвращаемое значение
        self.frame.tryToClose();                //закрыть диалоговое окно
} );
       
buttonCancel.addActionListener(function(e) { fr.tryToClose(); } );

Когда кнопки стали работать, в основной программе нам нужно получить значение из диалогового окна.
Для этого поймаем событие org.aswing.events.PopupEvent.POPUP_CLOSED

var modalDialog = new ModalWindow();
modalDialog.Show();
modalDialog.frame.addEventListener(PopupEvent.POPUP_CLOSED, function(e) {
        trace (modalDialog.dialogResult);    //здесь и только здесь мы можем использовать результат
} );

Теперь у нас есть модальное окно, возвращающее значение.