Plugin:Clist modern/ru/Руководство по разработке скинов

From Miranda NG
Jump to navigation Jump to search

Основные понятия

В основу скин-движка модуля положены следующие определения и понятия:

  • Объект (Object) — элемент скина. Все объекты скина создаются при загрузке модуля. Объект описывает что и каким образом необходимо нарисовать на соответствующий запрос.
  • Глиф (Glyph) — некоторый рисунок. В настоящий момент поддерживаются типы изображений: BMP, JPG и PNG (c прозрачностью). Размеры глифа определяются размерами рисунка. Изображение глифа загружается в память только при первой попытке нарисовать его и остается в памяти до выгрузки модуля или загрузки нового скина.
  • Правило (Rule) — строка с запросом (условиями отбора) объекта.
  • Запрос (Request) — требование нарисовать соответствующий объект, который удовлетворяет запрашиваемой строке в соответствии с правилами в определенном месте и с указанными размерами.

Алгоритм работы

Принцип работы следующий:

  1. При необходимости нарисовать некоторый объект окна, модуль формирует запрос. Запрос содержит координаты прямоугольника, в котором необходимо нарисовать объект. Но наиболее важным параметром является «строка запроса».
  2. Получив запрос, движок ищет в списке первое правило, под которое подойдет переданная строка запроса и выбирает соответствующий найденному правилу объект.
  3. Если найденный объект относится к типу Solid (сплошная заливка) то в ответ на запрос указанный рисунок заполняется соответствующим цветом и прозрачностью.
  4. Если же объект относится к типу Image (глиф), то прямоугольник заполняется трансформированным по размерам до размеров требуемого прямоугольника глифом.

Правила и строки запросов, принцип отбора объектов

Правило состоит из следующих частей:

  1. порядковый номер правила;
  2. имя соответствующего правилу объекта;
  3. набор параметров правила, разделённых запятыми.

Каждый параметр состоит из:

  • имени параметра (имя первого параметра не указывается и всегда равно «Module»);
  • условия («=» означает «соответствует», «^» означает «не соответствует»);
  • проверяемого значения параметра.

Строка запроса имеет те же части что и правила, за исключением порядкового номера.

Строка запроса и правило считаются подходящими друг другу если:

  1. Все параметры правила есть в запросе (при этом запрос может содержать параметр, не упомянутый в правиле).
  2. Все значения параметров правила с условием «соответствует (=)» соответствуют значениям этих параметров в запросе, а также все значения параметров правила с условием «не соответствует (^)» не соответствуют значениям этих параметров в запросе.

Значение параметра правила может быть задано в виде маски содержащей символы: «*» — любое количество (в том числе и отсутствие) любых символов и «?» — один любой символ. Длина имён параметров и значений не может превышать 24 символа. Значения не могут содержать запятые (запятые заменяются точками). Имена параметров и их значения чувствительны к регистру букв.

Масштабирование (трансформация) глифов

Рассмотрим следующий пример: необходимо нарисовать глиф размером 70х70 в прямоугольнике размером 100х100.

Зададим ширину четырех полей для глифа: Left (лево), Top (верх), Right (право) и Bottom (низ). Эти поля делят рисунок глифа на 9 частей:

  • 4 угла;
  • 4 края;
  • центр.

Glyph transformation example (before transformation).png

При трансформации:

  1. Угловые части глифа рисуются в прямоугольнике назначения «как есть», без изменений размеров.
  2. Краевые части рисуются масштабированными в соответствии с заданным режимом вдоль своего края. Перпендикулярный к краю размер не изменяется.
  3. Центр масштабируется по обоим направлениям.

После трансформации (режим StretchBoth)

Glyph transformation example (after transformation).png

Существует 4 режима трансформации:

  • StretchBoth — растянуть по обоим направлениям;
  • TileHorz — мозаика по горизонтали, растянуть по вертикали;
  • TileVert — мозаика по вертикали, растянуть по горизонтали;
  • TileBoth — мозаика по обоим направлениям.

Формат скина

Скин представляет собой совокупность файла описания скина (*.msf) и папки с необходимыми графическими ресурсами. Имя папки должно быть таким же, как и имя файла описания, без расширения. Внутри файла описателя ссылки на графические ресурсы идут без указания путей.

Файл описания имеет структуру полностью аналогичную ini-файлам. Все описания могут быть напрямую импортированы в базу. Формат файла следующий:

[имя_секции_базы]
; комментарий
  КлючСекции=#Значение
  КлючСекции2=#Значение

Вместо знака «#» подразумевается указание одного из типов значения ключа:

  • «b» — байт;
  • «w» — слово (два байта);
  • «d» — двойное слово (четыре байта);
  • «s» — произвольная текстовая строка.

Все данные об объектах скина хранятся в секции базы данных [ModernSkin] в ключах строкового типа. Поэтому все ключи в этой секции содержат «s» после «=», например:

$hotopengroup=sGlyph,Image,hotopengroup.png,StretchBoth,2,2,2,2,250
@0=s$window:Main,ID=Background

Пробелы внутри допускаются только для строковых параметров, таких как …,Name=First Name,….

Описание объектов

Итак, скин состоит из нескольких частей. Первая из них описывает объекты.

Объект описывается следующим образом:

$имя_объекта =sGlyph,тип_объекта,параметры,…

имя объекта — собственно имя объекта, используемое при ссылке из правил.

тип_объекта — один из типов: Image или Solid.

параметры,… — перечень параметров порядок которых определяется в зависимости от типа объекта:


для типа Solid:

$object_name =sGlyph,Solid,RedValue,GreenValue,BlueValue,AlphaValue

RedValue, GreenValue, BlueValue, AlphaValue — интенсивности соответственно красного, зеленого, синего и канала прозрачности.


для типа Image:

$object_name =sGlyph,Image,File_Name,Fit_Mode,Left,Top,Right,Bottom,AlphaValue

File_Name — имя файла рисунка с расширением, без пути, сам рисунок должен находится в одноименной с описателем папке.

Fit_Mode — один из режимов трансформации: StretchBoth, TileHorz, TileVert, TileBoth.

Left, Top, Right, Bottom — поля трансформации.


Примеры:

$window=sGlyph,Image,back.bmp,TileBoth,1,1,1,1,150
$closed_miranda_group=sGlyph,Solid,0,0,255,200

Описание правил

Вторая часть описывает правила. Правило описывается следующим образом:

@номер_правила=s$имя_объекта:значение_параметра_Module,имя_параметра=значение,имя_параметра^value,…

номер_правила — число. Номера правил должны начинаться с 0 и идти без пропусков.

Примеры:

@0=s$window:Main,ID=Background
@1=s$closed_miranda_group:CL,ID=Row,Type=Group,Open^True,Name=Mir*a*

Соответственно объект $window (рисунок back.bmp) будет нарисован если строка запроса будет содержать первым параметром «Main» и значение параметра «ID» будет равно «Background».

Объект $closed_miranda_group (заливка синим с прозрачностью 200) будет нарисован если в запросе первый параметр будет «CL», «ID» равен «Row», «Type» равен «Group», параметр «Open» НЕ равен «True», параметр «Name» подходит под маску «Mir*a*» (например Miranda-IM).

Описание кнопок

Buttons can be placed in any area of window (but prefer on margins, otherwise they will be covered by frames.

Buttons can be to types Push and Switch.

Push button description is:

#name=sPush,ServiceNameToCall,fromLeft,fromTop,fromRight,fromBottom,Flags,MinWindowWidth,MinWindowHeigh,HintText

Switch button description is:

#name=sSwitch,ServiceNameToCall,StateDBKey,ValueTypeandDefault,fromLeft,fromTop,fromRight,fromBottom,Flags,MinWindowWidth,MinWindowHeigh,HintText

ServiceNameToCall — name of service to be called on key pressure.

StateDBKey — name of key to be quoted in request to draw.

ValueTypeandDefault — type of parameter (first char (b, w, d or s)) and default value.

fromLeft,fromTop — position of left-top corner relativity to specified in flags.

fromRight,fromBottom — position of right-bottom corner relative to specified in flags.

Flags — relativity and behaviour flags is sequence of chars in next order: "ABCDE": A — relativity of left edge, B — top edge, C — right edge, D — from bottom (value is "R" — from right (for A and C), "B" — from bottom (for B and D), or "-" from left (A&C) and top (B&D)), E — can be "I" immediately call service as user press button, or "-" wait till he release it.

MinWindowWidth, MinWindowHeigh — minimal window size to show button (otherwise hide it).

HintText — tooltip text to show ("," (comma) is not allowed).


Then module is need to paint button it form request like (button was desribed like: #statusmenu=sPush,CList/ShowStatusMenu,24,4,40,20,-----,100,0,Show Status Menu)

MButton,ID=statusmenu,Hovered=1,Down=0

If switch button is specified it add value: Value=0 (database key value instead of ‘0’)

Modern paint request sequence

  1. Paint backgrounds via request
    Main,ID=Background
  2. Paint StatusBar, Frame captions backgrounds via
    Main,ID=StatusBar
    Main,ID=FrameCaption
  3. Paint buttons via request
    MButton,ID=buttonname,Hovered=x,Down=y,Value=z
    MButton,ID=buttonname,Hovered=x,Down=y
  4. Paint contact list in next sequence:
    • a. Paint contact list background
      CL,ID=Background
    • b. Paint row background (request forms according to row content)
      CL,ID=Row,Type=Contact,Selected=True,…
    • c. Paint common selection if selected
      CL,ID=Selection
    • d. Paint common hottracking if hot
      CL,ID=HotTracking
    • e. Draw row content (avatar, text, icons)
    • f. Paint row overlay (request forms according to row content)
      CL,ID=Ovl,Type=Contact,Selected=True,…
    • Repeats b.—f. for each row
  5. Paint scroll bar in next
    • Paint scroll bar background
      Main,ID=ScrollBar,Part=Back
    • Paint scroll bar items
      Main,ID=ScrollBar,Part= UpLineButton
      Main,ID=ScrollBar,Part= DownLineButton
      Main,ID=ScrollBar,Part= Thumb

Table of available params and values

Param Value Description
Module Main Main window parts
ID Background

StatusBar

FrameCaption

Window back

Status bar back

Frame caption back

ID ScrollBar Scrollbar
Part Back

UpLineButton

DownLineButton

Thumb

Scroll bar parts
Module CL Contact list objects
ID Row

Ovl

For each row back is generated with param ID=Row, for overlay with ID=Ovl
Type Group

Contact

MetaContact

SubContact

Divider

Info

Type of row: group name, contact, metacontact etc.
GroupPos


SubPos

First

First-Single

Middle

Last

Position of contact in parent group or position of subcontact in metacontact and its parent meta in group
Open

Selected

Hot

Odd

True

False

Collapse, selection, hot and odd values of row
Index

Indent

Number Number of line in list

Indent of row (0 — in root, 1 — in first leveled group etc.)

Status OFFLINE

ONLINE

AWAY

DND

NA

OCCUPIED

FREECHAT

INVISIBLE

IDLE

Status of contact
Protocol

Name

GroupName

Text Names of protocol, nick (row text), parent group (parent row text)

(commas replace to dots)

ID GreyAlternate

Selection

HotTracking

Common objects for Selection, Hot and Odd
Module MButton Buttons
ID Text Button name (without "#")
Down

Hovered

0

1

Pressure and hot states
Value Text Value of associated with triggered button database key

Example of dump of Crystal skin at real list

Time stamp Request Painted object
120817359: Main,ID=FrameCaption
120817375: Main,ID=StatusBar
120817375: CL,ID=Background
120817375: CL,ID=Row,Type=Group,Open=True,GroupPos=First,Selected=False,Hot=False,Odd=False,Indent=0,Index=0,Name=Friends $normalopengroup
120817375: CL,ID=Ovl,Type=Group,Open=True,GroupPos=First,Selected=False,Hot=False,Odd=False,Indent=0,Index=0,Name=Friends
120817375: CL,ID=Row,Type=Contact,Protocol=ICQ,Status=ONLINE,HasAvatar=True,GroupPos=First,Selected=False,Hot=False,Odd=True,Indent=1,Index=1,Name=Олег,Group=Friends $normalcontact
120817390: CL,ID=Ovl,Type=Contact,Protocol=ICQ,Status=ONLINE,HasAvatar=True,GroupPos=First,Selected=False,Hot=False,Odd=True,Indent=1,Index=1,Name=Олег,Group=Friends
120817390: CL,ID=Row,Type=Contact,Protocol=ICQ,Status=NA,HasAvatar=True,GroupPos=Last,Selected=False,Hot=False,Odd=False,Indent=1,Index=2,Name=Юля,Group=Friends $normalcontact
120817390: CL,ID=Ovl,Type=Contact,Protocol=ICQ,Status=NA,HasAvatar=True,GroupPos=Last,Selected=False,Hot=False,Odd=False,Indent=1,Index=2,Name=Юля,Group=Friends
120817406: CL,ID=Row,Type=Group,Open=True,GroupPos=Mid,Selected=False,Hot=False,Odd=True,Indent=0,Index=3,Name=MIRANDA $normalopengroup
120817406: CL,ID=Ovl,Type=Group,Open=True,GroupPos=Mid,Selected=False,Hot=False,Odd=True,Indent=0,Index=3,Name=MIRANDA
120817406: CL,ID=Row,Type=Group,Open=False,GroupPos=First,Selected=False,Hot=False,Odd=False,Indent=1,Index=4,Name=Bugs reporters,Group=Friends $normalclosedgroup
120817406: CL,ID=Ovl,Type=Group,Open=False,GroupPos=First,Selected=False,Hot=False,Odd=False,Indent=1,Index=4,Name=Bugs reporters,Group=Friends
120817406: CL,ID=Row,Type=Group,Open=True,GroupPos=Mid,Selected=False,Hot=False,Odd=True,Indent=1,Index=5,Name=Developers,Group=Friends $normalopengroup
120817406: CL,ID=Ovl,Type=Group,Open=True,GroupPos=Mid,Selected=False,Hot=False,Odd=True,Indent=1,Index=5,Name=Developers,Group=Friends
120817406: CL,ID=Row,Type=Contact,Protocol=ICQ,Status=NA,HasAvatar=True,GroupPos=First,Selected=False,Hot=False,Odd=False,Indent=2,Index=6,Name=Joe,Group=Bugs reporters $normalcontact
120817421: CL,ID=Ovl,Type=Contact,Protocol=ICQ,Status=NA,HasAvatar=True,GroupPos=First,Selected=False,Hot=False,Odd=False,Indent=2,Index=6,Name=Joe,Group=Bugs reporters
120817421: CL,ID=Row,Type=Contact,Protocol=ICQ,Status=ONLINE,HasAvatar=True,GroupPos=Last,Selected=False,Hot=False,Odd=True,Indent=2,Index=10,Name=Bio,Group=Bugs reporters $normalcontact
120817421: CL,ID=Ovl,Type=Contact,Protocol=ICQ,Status=ONLINE,HasAvatar=True,GroupPos=Last,Selected=False,Hot=False,Odd=True,Indent=2,Index=10,Name=Bio,Group=Bugs reporters
120817421: CL,ID=Row,Type=Contact,Protocol=ICQ,Status=ONLINE,HasAvatar=False,GroupPos=Mid,Selected=False,Hot=False,Odd=False,Indent=1,Index=11,Name=LexSys,Group=Friends $normalcontact
120817421: CL,ID=Ovl,Type=Contact,Protocol=ICQ,Status=ONLINE,HasAvatar=False,GroupPos=Mid,Selected=False,Hot=False,Odd=False,Indent=1,Index=11,Name=LexSys,Group=Friends
120817437: CL,ID=Row,Type=Contact,Protocol=ICQ,Status=ONLINE,HasAvatar=True,GroupPos=Last,Selected=False,Hot=False,Odd=True,Indent=1,Index=12,Name=NullBie,Group=Friends $normalcontact
120817437: CL,ID=Ovl,Type=Contact,Protocol=ICQ,Status=ONLINE,HasAvatar=True,GroupPos=Last,Selected=False,Hot=False,Odd=True,Indent=1,Index=12,Name=NullBie,Group=Friends
120817437: CL,ID=Row,Type=Group,Open=True,GroupPos=Last,Selected=False,Hot=False,Odd=False,Indent=0,Index=13,Name=>Developers $normalopengroup
120817437: CL,ID=Ovl,Type=Group,Open=True,GroupPos=Last,Selected=False,Hot=False,Odd=False,Indent=0,Index=13,Name=>Developers
120817437: CL,ID=Row,Type=Contact,Protocol=ICQ,Status=ONLINE,HasAvatar=True,GroupPos=First,Selected=False,Hot=False,Odd=True,Indent=1,Index=14,Name=Артем,Group=Friends $normalcontact
120817437: CL,ID=Ovl,Type=Contact,Protocol=ICQ,Status=ONLINE,HasAvatar=True,GroupPos=First,Selected=False,Hot=False,Odd=True,Indent=1,Index=14,Name=Артем,Group=Friends
120817437: CL,ID=Row,Type=Contact,Protocol=ICQ,Status=ONLINE,HasAvatar=True,GroupPos=Last,Selected=False,Hot=False,Odd=False,Indent=1,Index=15,Name=Angi,Group=Friends $normalcontact
120817453: CL,ID=Ovl,Type=Contact,Protocol=ICQ,Status=ONLINE,HasAvatar=True,GroupPos=Last,Selected=False,Hot=False,Odd=False,Indent=1,Index=15,Name=Angi,Group=Friends
120817453: MButton,ID=close,Down=0,Focused=0,Hovered=0 $BTNclosenorm
120817453: MButton,ID=minimize,Down=0,Focused=0,Hovered=0 $BTNminnorm
120817453: MButton,ID=hideoffline,Down=0,Focused=0,Hovered=0,Value=1 $BTNstatusDn
120820296: Main,ID=FrameCaption
120820296: Main,ID=Background $window
120820343: Main,ID=FrameCaption
120820343: MButton,ID=close,Down=0,Focused=0,Hovered=0 $BTNclosenorm
120820343: MButton,ID=minimize,Down=0,Focused=0,Hovered=0 $BTNminnorm
120820343: MButton,ID=hideoffline,Down=0,Focused=0,Hovered=0,Value=1 $BTNstatusDn
120820359: Main,ID=Background $window
120820390: Main,ID=FrameCaption
120820406: Main,ID=StatusBar
120820406: CL,ID=Background
120820406: CL,ID=Row,Type=Group,Open=True,GroupPos=First,Selected=False,Hot=False,Odd=False,Indent=0,Index=0,Name=Friends $normalopengroup
120820406: CL,ID=Ovl,Type=Group,Open=True,GroupPos=First,Selected=False,Hot=False,Odd=False,Indent=0,Index=0,Name=Friends
120820406: CL,ID=Row,Type=Contact,Protocol=ICQ,Status=ONLINE,HasAvatar=True,GroupPos=First,Selected=False,Hot=False,Odd=True,Indent=1,Index=1,Name=Олег,Group=Friends $normalcontact
120820421: CL,ID=Ovl,Type=Contact,Protocol=ICQ,Status=ONLINE,HasAvatar=True,GroupPos=First,Selected=False,Hot=False,Odd=True,Indent=1,Index=1,Name=Олег,Group=Friends
120820421: CL,ID=Row,Type=Contact,Protocol=ICQ,Status=NA,HasAvatar=True,GroupPos=Last,Selected=False,Hot=False,Odd=False,Indent=1,Index=2,Name=Юля,Group=Friends $normalcontact
120820421: CL,ID=Ovl,Type=Contact,Protocol=ICQ,Status=NA,HasAvatar=True,GroupPos=Last,Selected=False,Hot=False,Odd=False,Indent=1,Index=2,Name=Юля,Group=Friends
120820421: CL,ID=Row,Type=Group,Open=True,GroupPos=Mid,Selected=False,Hot=False,Odd=True,Indent=0,Index=3,Name=MIRANDA $normalopengroup
120820421: CL,ID=Ovl,Type=Group,Open=True,GroupPos=Mid,Selected=False,Hot=False,Odd=True,Indent=0,Index=3,Name=MIRANDA
120820421: CL,ID=Row,Type=Group,Open=False,GroupPos=First,Selected=False,Hot=False,Odd=False,Indent=1,Index=4,Name=Bugs reporters,Group=Friends $normalclosedgroup
120820437: CL,ID=Ovl,Type=Group,Open=False,GroupPos=First,Selected=False,Hot=False,Odd=False,Indent=1,Index=4,Name=Bugs reporters,Group=Friends
120820437: CL,ID=Row,Type=Group,Open=True,GroupPos=Mid,Selected=False,Hot=False,Odd=True,Indent=1,Index=5,Name=Developers,Group=Friends $normalopengroup
120820437: CL,ID=Ovl,Type=Group,Open=True,GroupPos=Mid,Selected=False,Hot=False,Odd=True,Indent=1,Index=5,Name=Developers,Group=Friends
120820437: CL,ID=Row,Type=Contact,Protocol=ICQ,Status=NA,HasAvatar=True,GroupPos=First,Selected=False,Hot=False,Odd=False,Indent=2,Index=6,Name=Joe,Group=Bugs reporters $normalcontact
120820437: CL,ID=Ovl,Type=Contact,Protocol=ICQ,Status=NA,HasAvatar=True,GroupPos=First,Selected=False,Hot=False,Odd=False,Indent=2,Index=6,Name=Joe,Group=Bugs reporters
120820437: CL,ID=Row,Type=Contact,Protocol=ICQ,Status=ONLINE,HasAvatar=True,GroupPos=Last,Selected=False,Hot=False,Odd=True,Indent=2,Index=10,Name=Bio,Group=Bugs reporters $normalcontact
120820453: CL,ID=Ovl,Type=Contact,Protocol=ICQ,Status=ONLINE,HasAvatar=True,GroupPos=Last,Selected=False,Hot=False,Odd=True,Indent=2,Index=10,Name=Bio,Group=Bugs reporters
120820453: CL,ID=Row,Type=Contact,Protocol=ICQ,Status=ONLINE,HasAvatar=False,GroupPos=Mid,Selected=False,Hot=False,Odd=False,Indent=1,Index=11,Name=LexSys,Group=Friends $normalcontact
120820453: CL,ID=Ovl,Type=Contact,Protocol=ICQ,Status=ONLINE,HasAvatar=False,GroupPos=Mid,Selected=False,Hot=False,Odd=False,Indent=1,Index=11,Name=LexSys,Group=Friends
120820453: CL,ID=Row,Type=Contact,Protocol=ICQ,Status=ONLINE,HasAvatar=True,GroupPos=Last,Selected=False,Hot=False,Odd=True,Indent=1,Index=12,Name=NullBie,Group=Friends $normalcontact
120820453: CL,ID=Ovl,Type=Contact,Protocol=ICQ,Status=ONLINE,HasAvatar=True,GroupPos=Last,Selected=False,Hot=False,Odd=True,Indent=1,Index=12,Name=NullBie,Group=Friends
120820453: CL,ID=Row,Type=Group,Open=True,GroupPos=Last,Selected=False,Hot=False,Odd=False,Indent=0,Index=13,Name=>Developers $normalopengroup
120820468: CL,ID=Ovl,Type=Group,Open=True,GroupPos=Last,Selected=False,Hot=False,Odd=False,Indent=0,Index=13,Name=>Developers
120820468: CL,ID=Row,Type=Contact,Protocol=ICQ,Status=ONLINE,HasAvatar=True,GroupPos=First,Selected=False,Hot=False,Odd=True,Indent=1,Index=14,Name=Артем,Group=Friends $normalcontact
120820468: CL,ID=Ovl,Type=Contact,Protocol=ICQ,Status=ONLINE,HasAvatar=True,GroupPos=First,Selected=False,Hot=False,Odd=True,Indent=1,Index=14,Name=Артем,Group=Friends
120820468: CL,ID=Row,Type=Contact,Protocol=ICQ,Status=ONLINE,HasAvatar=True,GroupPos=Last,Selected=False,Hot=False,Odd=False,Indent=1,Index=15,Name=Angi,Group=Friends $normalcontact
120820468: CL,ID=Ovl,Type=Contact,Protocol=ICQ,Status=ONLINE,HasAvatar=True,GroupPos=Last,Selected=False,Hot=False,Odd=False,Indent=1,Index=15,Name=Angi,Group=Friends
120820468: MButton,ID=close,Down=0,Focused=0,Hovered=0 $BTNclosenorm
120820484: MButton,ID=minimize,Down=0,Focused=0,Hovered=0 $BTNminnorm
120820484: MButton,ID=hideoffline,Down=0,Focused=0,Hovered=0,Value=1 $BTNstatusDn
120820500: Main,ID=FrameCaption
120820500: Main,ID=Background $window
120820546: Main,ID=FrameCaption
120820546: Main,ID=StatusBar
120820546: CL,ID=Background
120820562: CL,ID=Row,Type=Group,Open=True,GroupPos=First,Selected=False,Hot=False,Odd=False,Indent=0,Index=0,Name=Friends $normalopengroup
120820562: CL,ID=Ovl,Type=Group,Open=True,GroupPos=First,Selected=False,Hot=False,Odd=False,Indent=0,Index=0,Name=Friends
120820562: CL,ID=Row,Type=Contact,Protocol=ICQ,Status=ONLINE,HasAvatar=True,GroupPos=First,Selected=False,Hot=False,Odd=True,Indent=1,Index=1,Name=Олег,Group=Friends $normalcontact
120820562: CL,ID=Ovl,Type=Contact,Protocol=ICQ,Status=ONLINE,HasAvatar=True,GroupPos=First,Selected=False,Hot=False,Odd=True,Indent=1,Index=1,Name=Олег,Group=Friends
120820562: CL,ID=Row,Type=Contact,Protocol=ICQ,Status=NA,HasAvatar=True,GroupPos=Last,Selected=False,Hot=False,Odd=False,Indent=1,Index=2,Name=Юля,Group=Friends $normalcontact
120820562: CL,ID=Ovl,Type=Contact,Protocol=ICQ,Status=NA,HasAvatar=True,GroupPos=Last,Selected=False,Hot=False,Odd=False,Indent=1,Index=2,Name=Юля,Group=Friends
120820562: CL,ID=Row,Type=Group,Open=True,GroupPos=Mid,Selected=False,Hot=False,Odd=True,Indent=0,Index=3,Name=MIRANDA $normalopengroup
120820578: CL,ID=Ovl,Type=Group,Open=True,GroupPos=Mid,Selected=False,Hot=False,Odd=True,Indent=0,Index=3,Name=MIRANDA
120820578: CL,ID=Row,Type=Group,Open=False,GroupPos=First,Selected=False,Hot=False,Odd=False,Indent=1,Index=4,Name=Bugs reporters,Group=Friends $normalclosedgroup
120820578: CL,ID=Ovl,Type=Group,Open=False,GroupPos=First,Selected=False,Hot=False,Odd=False,Indent=1,Index=4,Name=Bugs reporters,Group=Friends
120820578: CL,ID=Row,Type=Group,Open=True,GroupPos=Mid,Selected=False,Hot=False,Odd=True,Indent=1,Index=5,Name=Developers,Group=Friends $normalopengroup
120820578: CL,ID=Ovl,Type=Group,Open=True,GroupPos=Mid,Selected=False,Hot=False,Odd=True,Indent=1,Index=5,Name=Developers,Group=Friends
120820578: CL,ID=Row,Type=Contact,Protocol=ICQ,Status=NA,HasAvatar=True,GroupPos=First,Selected=False,Hot=False,Odd=False,Indent=2,Index=6,Name=Joe,Group=Bugs reporters $normalcontact
120820593: CL,ID=Ovl,Type=Contact,Protocol=ICQ,Status=NA,HasAvatar=True,GroupPos=First,Selected=False,Hot=False,Odd=False,Indent=2,Index=6,Name=Joe,Group=Bugs reporters
120820593: CL,ID=Row,Type=Contact,Protocol=ICQ,Status=ONLINE,HasAvatar=True,GroupPos=Last,Selected=False,Hot=False,Odd=True,Indent=2,Index=10,Name=Bio,Group=Bugs reporters $normalcontact
120820593: CL,ID=Ovl,Type=Contact,Protocol=ICQ,Status=ONLINE,HasAvatar=True,GroupPos=Last,Selected=False,Hot=False,Odd=True,Indent=2,Index=10,Name=Bio,Group=Bugs reporters
120820593: CL,ID=Row,Type=Contact,Protocol=ICQ,Status=ONLINE,HasAvatar=False,GroupPos=Mid,Selected=False,Hot=False,Odd=False,Indent=1,Index=11,Name=LexSys,Group=Friends $normalcontact
120820593: CL,ID=Ovl,Type=Contact,Protocol=ICQ,Status=ONLINE,HasAvatar=False,GroupPos=Mid,Selected=False,Hot=False,Odd=False,Indent=1,Index=11,Name=LexSys,Group=Friends
120820593: CL,ID=Row,Type=Contact,Protocol=ICQ,Status=ONLINE,HasAvatar=True,GroupPos=Last,Selected=False,Hot=False,Odd=True,Indent=1,Index=12,Name=NullBie,Group=Friends $normalcontact
120820609: CL,ID=Ovl,Type=Contact,Protocol=ICQ,Status=ONLINE,HasAvatar=True,GroupPos=Last,Selected=False,Hot=False,Odd=True,Indent=1,Index=12,Name=NullBie,Group=Friends
120820609: CL,ID=Row,Type=Group,Open=True,GroupPos=Last,Selected=False,Hot=False,Odd=False,Indent=0,Index=13,Name=>Developers $normalopengroup
120820609: CL,ID=Ovl,Type=Group,Open=True,GroupPos=Last,Selected=False,Hot=False,Odd=False,Indent=0,Index=13,Name=>Developers
120820609: CL,ID=Row,Type=Contact,Protocol=ICQ,Status=ONLINE,HasAvatar=True,GroupPos=First,Selected=False,Hot=False,Odd=True,Indent=1,Index=14,Name=Артем,Group=Friends $normalcontact
120820625: CL,ID=Ovl,Type=Contact,Protocol=ICQ,Status=ONLINE,HasAvatar=True,GroupPos=First,Selected=False,Hot=False,Odd=True,Indent=1,Index=14,Name=Артем,Group=Friends
120820625: CL,ID=Row,Type=Contact,Protocol=ICQ,Status=ONLINE,HasAvatar=True,GroupPos=Last,Selected=False,Hot=False,Odd=False,Indent=1,Index=15,Name=Angi,Group=Friends $normalcontact
120820625: CL,ID=Ovl,Type=Contact,Protocol=ICQ,Status=ONLINE,HasAvatar=True,GroupPos=Last,Selected=False,Hot=False,Odd=False,Indent=1,Index=15,Name=Angi,Group=Friends
120820625: MButton,ID=close,Down=0,Focused=0,Hovered=0 $BTNclosenorm
120820625: MButton,ID=minimize,Down=0,Focused=0,Hovered=0 $BTNminnorm
120820625: MButton,ID=hideoffline,Down=0,Focused=0,Hovered=0,Value=1 $BTNstatusDn
120820640: MButton,ID=close,Down=0,Focused=0,Hovered=0 $BTNclosenorm
120820640: MButton,ID=minimize,Down=0,Focused=0,Hovered=0 $BTNminnorm
120820640: MButton,ID=hideoffline,Down=0,Focused=0,Hovered=0,Value=1 $BTNstatusDn
120820640: Main,ID=StatusBar
120820640: CL,ID=Background
120820640: CL,ID=Row,Type=Group,Open=True,GroupPos=First,Selected=False,Hot=False,Odd=False,Indent=0,Index=0,Name=Friends $normalopengroup
120820656: CL,ID=Ovl,Type=Group,Open=True,GroupPos=First,Selected=False,Hot=False,Odd=False,Indent=0,Index=0,Name=Friends
120820656: CL,ID=Row,Type=Contact,Protocol=ICQ,Status=ONLINE,HasAvatar=True,GroupPos=First,Selected=False,Hot=False,Odd=True,Indent=1,Index=1,Name=Олег,Group=Friends $normalcontact
120820656: CL,ID=Ovl,Type=Contact,Protocol=ICQ,Status=ONLINE,HasAvatar=True,GroupPos=First,Selected=False,Hot=False,Odd=True,Indent=1,Index=1,Name=Олег,Group=Friends
120820656: CL,ID=Row,Type=Contact,Protocol=ICQ,Status=NA,HasAvatar=True,GroupPos=Last,Selected=False,Hot=False,Odd=False,Indent=1,Index=2,Name=Юля,Group=Friends $normalcontact
120820656: CL,ID=Ovl,Type=Contact,Protocol=ICQ,Status=NA,HasAvatar=True,GroupPos=Last,Selected=False,Hot=False,Odd=False,Indent=1,Index=2,Name=Юля,Group=Friends
120820656: CL,ID=Row,Type=Group,Open=True,GroupPos=Mid,Selected=False,Hot=False,Odd=True,Indent=0,Index=3,Name=MIRANDA $normalopengroup
120820671: CL,ID=Ovl,Type=Group,Open=True,GroupPos=Mid,Selected=False,Hot=False,Odd=True,Indent=0,Index=3,Name=MIRANDA
120820671: CL,ID=Row,Type=Group,Open=False,GroupPos=First,Selected=False,Hot=False,Odd=False,Indent=1,Index=4,Name=Bugs reporters,Group=Friends $normalclosedgroup
120820671: CL,ID=Ovl,Type=Group,Open=False,GroupPos=First,Selected=False,Hot=False,Odd=False,Indent=1,Index=4,Name=Bugs reporters,Group=Friends
120820671: CL,ID=Row,Type=Group,Open=True,GroupPos=Mid,Selected=False,Hot=False,Odd=True,Indent=1,Index=5,Name=Developers,Group=Friends $normalopengroup
120820671: CL,ID=Ovl,Type=Group,Open=True,GroupPos=Mid,Selected=False,Hot=False,Odd=True,Indent=1,Index=5,Name=Developers,Group=Friends
120820671: CL,ID=Row,Type=Contact,Protocol=ICQ,Status=NA,HasAvatar=True,GroupPos=First,Selected=False,Hot=False,Odd=False,Indent=2,Index=6,Name=Joe,Group=Bugs reporters $normalcontact
120820687: CL,ID=Ovl,Type=Contact,Protocol=ICQ,Status=NA,HasAvatar=True,GroupPos=First,Selected=False,Hot=False,Odd=False,Indent=2,Index=6,Name=Joe,Group=Bugs reporters
120820687: CL,ID=Row,Type=Contact,Protocol=ICQ,Status=ONLINE,HasAvatar=True,GroupPos=Last,Selected=False,Hot=False,Odd=True,Indent=2,Index=10,Name=Bio,Group=Bugs reporters $normalcontact
120820687: CL,ID=Ovl,Type=Contact,Protocol=ICQ,Status=ONLINE,HasAvatar=True,GroupPos=Last,Selected=False,Hot=False,Odd=True,Indent=2,Index=10,Name=Bio,Group=Bugs reporters
120820703: CL,ID=Row,Type=Contact,Protocol=ICQ,Status=ONLINE,HasAvatar=False,GroupPos=Mid,Selected=False,Hot=False,Odd=False,Indent=1,Index=11,Name=LexSys,Group=Friends $normalcontact
120820703: CL,ID=Ovl,Type=Contact,Protocol=ICQ,Status=ONLINE,HasAvatar=False,GroupPos=Mid,Selected=False,Hot=False,Odd=False,Indent=1,Index=11,Name=LexSys,Group=Friends
120820703: CL,ID=Row,Type=Contact,Protocol=ICQ,Status=ONLINE,HasAvatar=True,GroupPos=Last,Selected=False,Hot=False,Odd=True,Indent=1,Index=12,Name=NullBie,Group=Friends $normalcontact
120820703: CL,ID=Ovl,Type=Contact,Protocol=ICQ,Status=ONLINE,HasAvatar=True,GroupPos=Last,Selected=False,Hot=False,Odd=True,Indent=1,Index=12,Name=NullBie,Group=Friends
120820703: CL,ID=Row,Type=Group,Open=True,GroupPos=Last,Selected=False,Hot=False,Odd=False,Indent=0,Index=13,Name=>Developers $normalopengroup
120820703: CL,ID=Ovl,Type=Group,Open=True,GroupPos=Last,Selected=False,Hot=False,Odd=False,Indent=0,Index=13,Name=>Developers
120820718: CL,ID=Row,Type=Contact,Protocol=ICQ,Status=ONLINE,HasAvatar=True,GroupPos=First,Selected=False,Hot=False,Odd=True,Indent=1,Index=14,Name=Артем,Group=Friends $normalcontact
120820718: CL,ID=Ovl,Type=Contact,Protocol=ICQ,Status=ONLINE,HasAvatar=True,GroupPos=First,Selected=False,Hot=False,Odd=True,Indent=1,Index=14,Name=Артем,Group=Friends
120820718: CL,ID=Row,Type=Contact,Protocol=ICQ,Status=ONLINE,HasAvatar=True,GroupPos=Last,Selected=False,Hot=False,Odd=False,Indent=1,Index=15,Name=Angi,Group=Friends $normalcontact
120820718: CL,ID=Ovl,Type=Contact,Protocol=ICQ,Status=ONLINE,HasAvatar=True,GroupPos=Last,Selected=False,Hot=False,Odd=False,Indent=1,Index=15,Name=Angi,Group=Friends
120820718: MButton,ID=close,Down=0,Focused=0,Hovered=0 $BTNclosenorm
120820734: MButton,ID=minimize,Down=0,Focused=0,Hovered=0 $BTNminnorm
120820734: MButton,ID=hideoffline,Down=0,Focused=0,Hovered=0,Value=1 $BTNstatusDn
120823812: Main,ID=FrameCaption
120823828: Main,ID=StatusBar
120823843: CL,ID=Background
120823843: CL,ID=Row,Type=Group,Open=True,GroupPos=First,Selected=False,Hot=False,Odd=False,Indent=0,Index=0,Name=Friends $normalopengroup
120823843: CL,ID=Ovl,Type=Group,Open=True,GroupPos=First,Selected=False,Hot=False,Odd=False,Indent=0,Index=0,Name=Friends
120823843: CL,ID=Row,Type=Contact,Protocol=ICQ,Status=ONLINE,HasAvatar=True,GroupPos=First,Selected=False,Hot=False,Odd=True,Indent=1,Index=1,Name=Олег,Group=Friends $normalcontact
120823843: CL,ID=Ovl,Type=Contact,Protocol=ICQ,Status=ONLINE,HasAvatar=True,GroupPos=First,Selected=False,Hot=False,Odd=True,Indent=1,Index=1,Name=Олег,Group=Friends
120823843: CL,ID=Row,Type=Contact,Protocol=ICQ,Status=NA,HasAvatar=True,GroupPos=Last,Selected=False,Hot=False,Odd=False,Indent=1,Index=2,Name=Юля,Group=Friends $normalcontact
120823859: CL,ID=Ovl,Type=Contact,Protocol=ICQ,Status=NA,HasAvatar=True,GroupPos=Last,Selected=False,Hot=False,Odd=False,Indent=1,Index=2,Name=Юля,Group=Friends
120823859: CL,ID=Row,Type=Group,Open=True,GroupPos=Mid,Selected=False,Hot=False,Odd=True,Indent=0,Index=3,Name=MIRANDA $normalopengroup
120823859: CL,ID=Ovl,Type=Group,Open=True,GroupPos=Mid,Selected=False,Hot=False,Odd=True,Indent=0,Index=3,Name=MIRANDA
120823859: CL,ID=Row,Type=Group,Open=False,GroupPos=First,Selected=False,Hot=False,Odd=False,Indent=1,Index=4,Name=Bugs reporters,Group=Friends $normalclosedgroup
120823875: CL,ID=Ovl,Type=Group,Open=False,GroupPos=First,Selected=False,Hot=False,Odd=False,Indent=1,Index=4,Name=Bugs reporters,Group=Friends
120823875: CL,ID=Row,Type=Group,Open=True,GroupPos=Mid,Selected=False,Hot=False,Odd=True,Indent=1,Index=5,Name=Developers,Group=Friends $normalopengroup
120823875: CL,ID=Ovl,Type=Group,Open=True,GroupPos=Mid,Selected=False,Hot=False,Odd=True,Indent=1,Index=5,Name=Developers,Group=Friends
120823875: CL,ID=Row,Type=Contact,Protocol=ICQ,Status=NA,HasAvatar=True,GroupPos=First,Selected=False,Hot=False,Odd=False,Indent=2,Index=6,Name=Joe,Group=Bugs reporters $normalcontact
120823890: CL,ID=Ovl,Type=Contact,Protocol=ICQ,Status=NA,HasAvatar=True,GroupPos=First,Selected=False,Hot=False,Odd=False,Indent=2,Index=6,Name=Joe,Group=Bugs reporters
120823890: CL,ID=Row,Type=Contact,Protocol=ICQ,Status=ONLINE,HasAvatar=True,GroupPos=Last,Selected=False,Hot=False,Odd=True,Indent=2,Index=10,Name=Bio,Group=Bugs reporters $normalcontact
120823890: CL,ID=Ovl,Type=Contact,Protocol=ICQ,Status=ONLINE,HasAvatar=True,GroupPos=Last,Selected=False,Hot=False,Odd=True,Indent=2,Index=10,Name=Bio,Group=Bugs reporters
120823890: CL,ID=Row,Type=Contact,Protocol=ICQ,Status=ONLINE,HasAvatar=False,GroupPos=Mid,Selected=False,Hot=False,Odd=False,Indent=1,Index=11,Name=LexSys,Group=Friends $normalcontact
120823890: CL,ID=Ovl,Type=Contact,Protocol=ICQ,Status=ONLINE,HasAvatar=False,GroupPos=Mid,Selected=False,Hot=False,Odd=False,Indent=1,Index=11,Name=LexSys,Group=Friends
120823890: CL,ID=Row,Type=Contact,Protocol=ICQ,Status=ONLINE,HasAvatar=True,GroupPos=Last,Selected=False,Hot=False,Odd=True,Indent=1,Index=12,Name=NullBie,Group=Friends $normalcontact
120823906: CL,ID=Ovl,Type=Contact,Protocol=ICQ,Status=ONLINE,HasAvatar=True,GroupPos=Last,Selected=False,Hot=False,Odd=True,Indent=1,Index=12,Name=NullBie,Group=Friends
120823906: CL,ID=Row,Type=Group,Open=True,GroupPos=Last,Selected=False,Hot=False,Odd=False,Indent=0,Index=13,Name=>Developers $normalopengroup
120823906: CL,ID=Ovl,Type=Group,Open=True,GroupPos=Last,Selected=False,Hot=False,Odd=False,Indent=0,Index=13,Name=>Developers
120823906: CL,ID=Row,Type=Contact,Protocol=ICQ,Status=ONLINE,HasAvatar=True,GroupPos=First,Selected=False,Hot=False,Odd=True,Indent=1,Index=14,Name=Артем,Group=Friends $normalcontact
120823906: CL,ID=Ovl,Type=Contact,Protocol=ICQ,Status=ONLINE,HasAvatar=True,GroupPos=First,Selected=False,Hot=False,Odd=True,Indent=1,Index=14,Name=Артем,Group=Friends
120823906: CL,ID=Row,Type=Contact,Protocol=ICQ,Status=ONLINE,HasAvatar=True,GroupPos=Last,Selected=False,Hot=False,Odd=False,Indent=1,Index=15,Name=Angi,Group=Friends $normalcontact
120823906: CL,ID=Ovl,Type=Contact,Protocol=ICQ,Status=ONLINE,HasAvatar=True,GroupPos=Last,Selected=False,Hot=False,Odd=False,Indent=1,Index=15,Name=Angi,Group=Friends
120823921: MButton,ID=close,Down=0,Focused=0,Hovered=0 $BTNclosenorm
120823921: MButton,ID=minimize,Down=0,Focused=0,Hovered=0 $BTNminnorm
120823921: MButton,ID=hideoffline,Down=0,Focused=0,Hovered=0,Value=1 $BTNstatusDn