вівторок, 3 лютого 2009 р.

Робота в Adobe AIR з іконкою в треї

Вивчаючи AIR від Adobe вирішив написати невеличку програмку для своїх потреб. Мені необхідно було зробити так, щоб вона могла ховатися в трей при закритті головного вікна, або його мінімізації. Виявилось що в AIR це досить не тривіальна задача. Далі невеличкий приклад моєї реалізації роботи з треєм.
Створюємо змінну для роботи з системним треєм:
private var sysTrayIcon:SystemTrayIcon = NativeApplication.nativeApplication.icon as SystemTrayIcon;
Далі необхідно створити змінні самого меню і завантажувача малюнка:
private var trayIconMenu:NativeMenu = new NativeMenu();
private var trayIconMenuShow:NativeMenuItem = trayIconMenu.addItem(new NativeMenuItem("Show"));
private var trayIconMenuExit:NativeMenuItem = trayIconMenu.addItem(new NativeMenuItem("Exit"));
private var iconLoader:Loader = new Loader();
У функції яка викликається відразу після того, як створилося вікно (реакція на подію windowComplete) реалізуються механізми взаємодії з системним треєм:
public function Init():void {
// Перевіряємо чи підтримується робота з системним треєм
if (NativeApplication.supportsSystemTrayIcon)
{
// Налаштовуємо реакцію на шиглик по іконці в треї: виклик clickTrayIconHandler()
NativeApplication.nativeApplication.icon.addEventListener(MouseEvent.CLICK, clickTrayIconHandler);

// Налаштовуємо реакцію на завершення завантаження малюнку
iconLoader.contentLoaderInfo.addEventListener(Event.COMPLETE, function (event:Event):void {
// Встановлюємо завантажений малюнок у трей
NativeApplication.nativeApplication.icon.bitmaps = new Array(event.target.content.bitmapData);
});

// Підказка, що відображається при наведенні миші на іконку в треї
sysTrayIcon.tooltip = "Systrayicon example";

// Налаштовуємо реакцію на вибір пункту меню Exit у меню
trayIconMenuExit.addEventListener(Event.SELECT, function (event:Event):void {
NativeApplication.nativeApplication.icon.bitmaps = [];
NativeApplication.nativeApplication.exit();
});

// Налаштовуємо реакцію на мінімізацію вікна: виклик minimizeHandler()
stage.nativeWindow.addEventListener(NativeWindowDisplayStateEvent.DISPLAY_STATE_CHANGING, minimizeHandler);

// Налаштовуємо реакцію на вибір пункту меню Show у меню
trayIconMenuShow.addEventListener(Event.SELECT, clickTrayIconHandler);

// Встановлюємо меню
sysTrayIcon.menu = trayIconMenu;
}
}
Функція-реакція на закриття вікна:
// Реакція на закриття вікна        
protected function closingHandler(event:Event):void
{
// Забороняємо стандартну реакцію
event.preventDefault();

// Ховаємо вікно
this.visible = false;

// Завантажуємо і відображаємо іконку в треї
iconLoader.load(new URLRequest("images/systrayicon.png"));
}
Функція-реакція на щиглик по іконці в треї:
// Реакція на щиглик по іконці в треї, або вибір пункту меню Show
protected function clickTrayIconHandler(event:Event):void
{
// Прибираємо іконку з трею
NativeApplication.nativeApplication.icon.bitmaps = [];

// Відображаємо вікно
this.visible = true;

// Переводимо фокус на вікно
this.activate();
}
Функція-реакція на мінімізацію вікна:
// Реакція на мінімізацію вікна
protected function minimizeHandler(event:Event):void
{
// Перевіряємо, чи дійсно ми мінімізуємо вікно
if ((event as NativeWindowDisplayStateEvent).afterDisplayState == NativeWindowDisplayState.MINIMIZED)
{
// Забороняємо стандартну реакцію
(event as NativeWindowDisplayStateEvent).preventDefault();

// Ховаємо вікно
this.visible = false;

// Завантажуємо і відображаємо іконку в треї
iconLoader.load(new URLRequest("images/systrayicon.png"));
}
}
Завантажити вихідні коди проекту.

неділю, 1 лютого 2009 р.

Встановлення і налаштування Subversion

Для власних проектів виникла необхідність використовувати систему контролю версій.Но роботі довго і успішно використовується CVS. Вирішив не встановлювати всілякі екзотичні системи і зупинив свій вибір на Subversion, як логічного продовження CVS. Проаналізувавши різноманітні інструкції про встановлення і налаштування Subversion, побачив що у всіх якийсь нездоровий інтерес до встановлення системи зверху на Apache (припускаю що це може бути зручно для різноманітних web-проектів). Я вирішив встановити Subversion у вигляді окремого демону. Інформацію брав з відкритої книги Version control with Subversion.
Встановлюємо безпосередньо Subversion:
apt-get install subversion
Створюємо теку для сховища (далі всі налаштування ведуться з препущенням що сховище знаходиться в /home/sasha/Develop/repos):
mkdir /home/sasha/Develop/repos
Створюємо сховище:
svnadmin create /home/sasha/Develop/repos
Відредагуємо деякі файли налаштувань нашого сховища.
Файл /home/sasha/Develop/repos/conf/passwd
[users]
sasha = password
Файл /home/sasha/Develop/repos/conf/svnserve.conf
[general]
anon-access = none
auth-access = write
password-db = passwd
# authz-db = authz
realm = My Repository

[sasl]
# use-sasl = true
# min-encryption = 0
# max-encryption = 256
Налаштування сховища завершене. Subversion будемо запускати через inetd. Для цього до файлу /etc/inetd.conf додамо наступний запис:
svn     stream  tcp     nowait root     /usr/bin/svnserve svnserve -i -r /home/sasha/Develop/repos

Демон inetd тепер потрібно перезапустити:
/etc/init.d/openbsd-inetd restart
Тепер підключаємося до серверу зручним клієнтом за адресою svn://адреса_серверу.