Делать простые приложения с Adobe AIR мы уже научились, делать красивые окошки тоже, а теперь поставим себе реальную задачу и попробуем ее осуществить.
Сегодня будем писать очень простенькую обертку под Типографический веб-сервис.
Как всегда, особо разглагольствовать на эту тему я не буду, а просто приведу код с большим количеством комментариев.
Из кода мы узнаем о том, как посылать запросы через air.URLRequest, работать с буфером обмена и открывать ссылки во внешнем браузере.
Будем считать, что эта статья является продолжением предыдущей Делаем красиво в AdobeAIR с ExtJS, все остается так же, только меняется содержимое application.js:
Пишу второпях, возможно что-то забыл. Не стесняйтесь и спрашивайте, если что.
Для тех, кому не хочется возиться, а посмотреть охота, можете скачать установочный пакет (около 400 кб)
Всем спасибо за внимание.
P.S. обновил статью и air-пакет. Спасибо автору за починку utf-8 режима.
Кросспост из личного блога.
Сегодня будем писать очень простенькую обертку под Типографический веб-сервис.
Как всегда, особо разглагольствовать на эту тему я не буду, а просто приведу код с большим количеством комментариев.
Из кода мы узнаем о том, как посылать запросы через air.URLRequest, работать с буфером обмена и открывать ссылки во внешнем браузере.
Будем считать, что эта статья является продолжением предыдущей Делаем красиво в AdobeAIR с ExtJS, все остается так же, только меняется содержимое application.js:
var app = { _mainWindow: null, _textarea: null, _statusbar: null, /* * инициализация */ init: function() { window.nativeWindow.maximize(); app.doCreateMainWindow(); app.setupListeners(); window.nativeWindow.visible = true; }, /* * обработчики событий */ setupListeners: function() { // события нативного окна window.nativeWindow.addEventListener('displayStateChanging', app.doDisplayStateChanging); // события главного окна this._mainWindow.on('minimize', app.doMinimize); this._mainWindow.on('close', app.doClose); // события в textarea this._textarea.on('specialkey', app.doSpecialKey); }, /* * создание главного окна */ doCreateMainWindow: function() { this._statusbar = new Ext.StatusBar({ // текст по-умолчанию text: 'http://www.typograf.ru', items: [ // разделитель '-', { // кнопка "открыть в браузере" на статусбаре text: 'открыть в браузере', handler: function() { // функция отработает по щелчку на кнопке // смысл ее в том, чтобы открыть ссылку в браузере по-умолчанию var request = new air.URLRequest( 'http://www.typograf.ru' ); air.navigateToURL(request); } } ] } ); this._textarea = new Ext.form.TextArea( { // текст по-умолчанию emptyText: 'Введите текст, который нужно оттипографировать и нажмите Ctrl + Enter', region: 'center' } ); this._mainWindow = new Ext.Window({ width: 800, height: 600, minWidth: 300, minHeight: 200, layout: 'border', x: 100, y: 100, minimizable: true, maximizable: true, title: "Типограф", iconCls: 'icon', // тулбар tbar: [ { text: "вставить из буфера", handler: function() { // а у нас в буфере обмена действительно текст? if ( air.Clipboard.generalClipboard.hasFormat(air.ClipboardFormats.TEXT_FORMAT) ) { // вставляем текст app._textarea.setValue( // из буфера =) air.Clipboard.generalClipboard.getData(air.ClipboardFormats.TEXT_FORMAT) ); } } }, { text: "копировать в буфер", handler: function() { // получаем введенный текст var text = app._textarea.getValue(); // если пусто, то ничего не делаем if (text == '') return; // очищаем буфер обмена air.Clipboard.generalClipboard.clear(); // и копируем туда данные в текстовом (TEXT_FORMAT) формате air.Clipboard.generalClipboard.setData(air.ClipboardFormats.TEXT_FORMAT, text); } }, { text: "очистить", handler: function() { // очищаем поле для ввода app._textarea.reset(); } } ], // статусбар bbar: this._statusbar, // поле для ввода текста items: this._textarea }); this._mainWindow.show(); }, /* * обработка события на изменение состояния окна * @param {Event} событие displayStateChanging */ doDisplayStateChanging: function( e ) { if ( e.afterDisplayState == 'normal' ) { e.preventDefault(); window.nativeWindow.visible = false; window.nativeWindow.maximize(); window.nativeWindow.visible = true; } else if ( e.afterDisplayState == 'minimized' ) { e.preventDefault(); window.nativeWindow.visible = false; window.nativeWindow.minimize(); window.nativeWindow.visible = true; } }, /* * обработка события нажатия служебных клавиш в _textarea * @param {Ext.form.TextField} элемент * @param {Event} событие keypress */ doSpecialKey: function( field, e ) { var keyCode = e.getKey(); if ( keyCode == 13 ) { // не надо в этом случае каретку двигать e.preventDefault(); // обрабатываем текст, если он есть if ( app._textarea.getValue() != '' ) app.doProcess(); } }, /* * обработка события закрытия главного окна * @param {Ext.window} окно */ doClose: function( win ) { air.NativeApplication.nativeApplication.exit(); }, /* * обработка события на сворачивание главного окна * @param {Ext.window} окно */ doMinimize: function( win ) { window.nativeWindow.visible = false; window.nativeWindow.minimize(); window.nativeWindow.visible = true; }, // обработка текста типографом doProcess: function() { this._textarea.disable(); this._statusbar.setStatus( 'Обработка...' ); // загрузчик var loader = new air.URLLoader(); // будем воспринимать полученную информацию в текстовом виде loader.dataFormat = air.URLLoaderDataFormat.TEXT; // указываем обработчик на получение данных loader.addEventListener(air.Event.COMPLETE, app.doGetProcessed); // запрос var request = new air.URLRequest('http://www.typograf.ru/webservice/'); // указываем способ передачи данных в сервис - post request.method = air.URLRequestMethod.POST; // и указываем, собственно, то, что мы передаем в сервис request.data = 'chr=utf-8&text=' + this._textarea.getValue(); // поехали ;) loader.load(request); }, /* * получение данных с сервера * @param {Event} событие air.Event.COMPLETE */ doGetProcessed: function( e ) { // получаем loader var loader = e.target; app._textarea.setValue( loader.data ); app._textarea.enable(); app._statusbar.setStatus('http://www.typograf.ru'); } }
Пишу второпях, возможно что-то забыл. Не стесняйтесь и спрашивайте, если что.
Для тех, кому не хочется возиться, а посмотреть охота, можете скачать установочный пакет (около 400 кб)
Всем спасибо за внимание.
P.S. обновил статью и air-пакет. Спасибо автору за починку utf-8 режима.
Кросспост из личного блога.