From: Andrey C. <sku...@us...> - 2006-06-06 02:23:16
|
Update of /cvsroot/eas-dev/ocmng/components/ocmng/forms In directory sc8-pr-cvs5.sourceforge.net:/tmp/cvs-serv23450/components/ocmng/forms Modified Files: form.prg form.xml Log Message: Set components for successful E/AS work Index: form.prg =================================================================== RCS file: /cvsroot/eas-dev/ocmng/components/ocmng/forms/form.prg,v retrieving revision 1.1 retrieving revision 1.2 diff -u -d -r1.1 -r1.2 --- form.prg 2 Jun 2006 14:44:46 -0000 1.1 +++ form.prg 5 Jun 2006 12:23:09 -0000 1.2 @@ -1,9 +1,9 @@ /*-------------------------------------------------------------------------*/ -/* E/AS Component (part of E/AS project) */ -/* */ -/* Copyright (C) 2005 by E/AS Software Foundation */ -/* Author: Andrey Cherepanov <sk...@ea...> */ -/* */ +/* E/AS Component (part of E/AS project) */ +/* */ +/* Copyright (C) 2005 by E/AS Software Foundation */ +/* Author: Andrey Cherepanov <sk...@ea...> */ +/* */ /* This program is free software; you can redistribute it and/or modify */ /* it under the terms of the GNU General Public License as */ /* published by the Free Software Foundation; either version 2 of the */ @@ -11,39 +11,40 @@ /*-------------------------------------------------------------------------*/ /*--------------------------------------------------------------------------/ -/ / -/ Name: UI form center / -/ System name: form / -/ Description: Get UI form for object / -/ Version: 0.1 / -/ Author: Andrey Cherepanov <sk...@ea...> / -/ / -/ Available commands: / -/ GET Get form content / -/ <name> form name / -/ [<type>] type of form (optional) / -/ object get the XFL form for edit object content / -/ list get the XFL form with list of objects / -/ select get the XFL form for select object from list / -/ print_object get the XPL card for object / -/ print_list get the XPL form for print object list / -/ / -/ GETVIEW Get object with view (object list) / -/ <name> view name / -/ / +/ / +/ Name: UI form center / +/ System name: form / +/ Description: Get UI form for object / +/ Version: 0.1 / +/ Author: Andrey Cherepanov <sk...@ea...> / +/ / +/ Available commands: / +/ GET Get form content / +/ <name> form name / +/ [<type>] type of form (optional) / +/ object get the XFL form for edit object content / +/ list get the XFL form with list of objects / +/ select get the XFL form for select object from list / +/ print_object get the XPL card for object / +/ print_list get the XPL form for print object list / +/ / +/ GETVIEW Get object with view (object list) / +/ <name> view name / +/ / /--------------------------------------------------------------------------*/ /** Component: form */ #define DEFAULT_TITLE_MAIN_WINDOW 'E/AS' -#define DEFAULT_FORM_CLASS '__form' +#define DEFAULT_FORM_DB 'ETC0101' +#define DEFAULT_FORM_CLASS 'mng_form' #define DEFAULT_ENCODING 'koi8-r' parameters cMethod, params local cContent:='' -local oErr, i, err:='' +local oErr, i, err:='', view eDebug(12, "FORM method:", cMethod) oErr := ErrorBlock({|e| break(e) }) @@ -85,7 +86,9 @@ /*=========================================================================*/ // GETVIEW() elseif lower(cMethod) == 'getview' - return get_View(params) + view := get_View(params) + eDebug( 17, "FORM.getView:", view:data ) + return view else eDebug(3, "FORM has not method '"+cMethod+"'") endif @@ -97,7 +100,7 @@ i++ end - eDebug(5, "Component internal error:", errorMessage(oErr)) + eDebug(5, "FORM component internal error:", errorMessage(oErr)) return NIL end sequence @@ -106,58 +109,78 @@ /* Generate main window */ static function get_MainForm(params) local f:='', title:=DEFAULT_TITLE_MAIN_WINDOW, l, i, ent, aIgnoreClasses + local deps, edep, dep, list_all:={} - if "DB" $ params - title := params:db - endif + title += " " + EASGetVersion() f := '<?xml version="1.0" encoding="'+DEFAULT_ENCODING+'" ?>&\n' + ; '<!-- Main window interface form -->&\n' + ; '<!-- Web: http://eas.lrn.ru -->&\n&\n' + ; ; '<form>&\n' + ; - '<head>&\n' + ; - '</head>&\n' + ; - '<interface>&\n' + ; - '<widget class="mainWindow" name="mainWindow" label="'+title+'">&\n&\n' + ; + '<head>&\n' + ; + '</head>&\n' + ; + '<interface>&\n' + ; + '<widget class="mainWindow" name="mainWindow" label="'+title+'">&\n&\n' + ; ; - ' <!-- Menu -->&\n' + ; - ' <widget class="menuBar">&\n' + ; - ' <widget class="popupMenu" name="file_menu" label="&File">&\n' + ' <!-- Menu -->&\n' + ; + ' <widget class="menuBar">&\n' + ; + ' <widget class="popupMenu" name="file_menu" label="&File">&\n' // Show classes - aIgnoreClasses := { 'void', '__component', '__form' } - - l := lquery(params, 'show classes') - if valtype(l) == 'A' - asort(l,,,{|a,b| a[2] < b[2]}) - for i in l - if ascan(aIgnoreClasses, lower(i[2])) == 0 - f += '&\t<widget class="menuItem" label="'+i[2]+'" name="'+i[2]+'.list"/>&\n' + aIgnoreClasses := { "void" } // TODO: get from configuration file + deps := lquery(params, 'show databases') + asort(deps,,,{|a,b| a[1] < b[1]}) + for edep in deps + dep := edep[1] + params:db := dep + l := lquery(params, 'show classes') + i := 1 + while i <= len(l) + if ascan(aIgnoreClasses, lower(l[i][2])) != 0 + adel( l, i ) + asize( l, len(l)-1 ) endif - next - endif + i++ + enddo + eDebug(12, 'FORM', dep, ':', len(l), 'class(es)' ) + if len(l) == 0 + loop + endif + f += '&\t<widget class="popupMenu" label="'+dep+'">&\n' + if valtype(l) == 'A' + asort(l,,,{|a,b| a[2] < b[2]}) + for i in l + f += '&\t&\t<widget class="menuItem" label="'+i[2]+'" name="'+dep+':'+i[2]+'.list"/>&\n' + aadd( list_all, dep+':'+i[2] ) + next + endif + + f += '&\t</widget>&\n' + + next + eDebug(12, 'FORM: finish append classes' ) f += ' <widget class="menuSeparator"/>&\n' + ; ' <widget class="menuItem" label="&Exit" name="Menu.Quit"/>&\n' + ; - ' </widget>&\n' + ; - ' </widget>&\n&\n' + ; - ' <!-- Statusbar -->&\n' + ; - ' <widget class="statusBar" name="main_statusBar" label="Done." />&\n' + ; + ' </widget>&\n' + ; + ' </widget>&\n&\n' + ; + ' <!-- Statusbar -->&\n' + ; + ' <widget class="statusBar" name="main_statusBar" label="Done." />&\n' + ; ; - '</widget>&\n' + ; - '</interface>&\n&\n' + ; + '</widget>&\n' + ; + '</interface>&\n&\n' + ; ; - '<!-- Widgets properties -->&\n' + ; - '<style>&\n' + ; - ' <property widget="mainWindow" name="geometry" value="600,450,35,15" />&\n' + ; - ' <property widget="mainWindow" name="position" value="center" />&\n' + ; - ' <property widget="mainWindow" name="MDI" value="true" />&\n' + ; - '</style>&\n&\n' + '<!-- Widgets properties -->&\n' + ; + '<style>&\n' + ; + ' <property widget="mainWindow" name="geometry" value="600,450,35,15" />&\n' + ; + ' <property widget="mainWindow" name="position" value="center" />&\n' + ; + ' <property widget="mainWindow" name="MDI" value="true" />&\n' + ; + '</style>&\n&\n' - // TODO: translation - - f += '<actions>&\n' + ; + // TODO: translation + + f += '<actions>&\n' + ; ' <!-- System actions -->&\n' + ; ' <rule>&\n' + ; ' <event widget="Menu.Quit" signal="activate"/>&\n' + ; @@ -165,18 +188,13 @@ ' </rule>&\n' // Actions - if valtype(l) == 'A' - for i in l - if ascan(aIgnoreClasses, lower(i[2])) == 0 - ent := i[2] - f += '<rule>&\n' - f += ' <event widget="'+ent+'.list" signal="activate"/>&\n' - f += ' <action><call method="openForm"><param value="'+ent+'"/><param value="list"/>' - f += '</call></action>&\n' - f += '</rule>&\n' - endif - next - endif + for i in list_all + f += '<rule>&\n' + f += ' <event widget="'+i+'.list" signal="activate"/>&\n' + f += ' <action><call method="openForm"><param value="'+i+'"/><param value="list"/>' + f += '</call></action>&\n' + f += '</rule>&\n' + next f += '</actions>&\n' + ; '</form>&\n' @@ -185,45 +203,46 @@ // Generate form with list of all class object static function get_UIList(params) - local f, ent:=params:name, fields, i + local f, ent:=params:name, fields, i, pclass f := '<?xml version="1.0" encoding="'+DEFAULT_ENCODING+'" ?>&\n' + ; '<!-- '+ent+' list form -->&\n' + ; '<!-- Web: http://eas.lrn.ru -->&\n&\n' + ; ; '<form>&\n' + ; - ' <head>&\n' + ; // TODO: fill table with autoreloading (see openView() ) + ' <head>&\n' + ; // TODO: fill table with autoreloading (see openView() ) ' <call method="openView">&\n' + ; ' <param><property widget="list" name="object"/></param>&\n' + ; ' <param value="'+ent+'"/>&\n' + ; - ' <param value="10" />&\n' + ; // 10 seconds by default - ' <param><property widget="form" name="object"/></param>&\n' + ; + ' <param value="60" />&\n' + ; // 60 seconds by default + ' <param><property widget="__form" name="object"/></param>&\n' + ; ' </call>&\n' + ; - ' </head>&\n' + ; - ' <interface>&\n' + ; - ' <widget class="childWindow" name="form" label="'+ent+' list">&\n&\n' + ; - ; - ' <!-- Toolbar -->&\n' + ; - ' <widget class="toolBar" name="main_tbar">&\n' + ; - ; + ' </head>&\n' + ; + ' <interface>&\n' + ; + ' <widget class="childWindow" name="__form" label="'+ent+' list">&\n&\n' + ; + ; + ' <!-- Toolbar -->&\n' + ; + ' <widget class="toolBar" name="main_tbar">&\n' + ; + ; ' <widget name="create" class="toolButton" label="New">&\n' + ; - ' <property name="icon" value="create.xpm"/>&\n' + ; - ' </widget>&\n' + ; - ' <widget name="edit" class="toolButton" label="Edit">&\n' + ; - ' <property name="icon" value="edit.xpm"/>&\n' + ; - ' </widget>&\n' + ; - ' <widget name="delete" class="toolButton" label="Delete">&\n' + ; - ' <property name="icon" value="delete.xpm"/>&\n' + ; - ' </widget>&\n' + ; + ' <property name="icon" value="create.xpm"/>&\n' + ; + ' </widget>&\n' + ; + ' <widget name="edit" class="toolButton" label="Edit">&\n' + ; + ' <property name="icon" value="edit.xpm"/>&\n' + ; + ' </widget>&\n' + ; + ' <widget name="delete" class="toolButton" label="Delete">&\n' + ; + ' <property name="icon" value="delete.xpm"/>&\n' + ; + ' </widget>&\n' + ; ' </widget>&\n' + ; - ; - ' <widget name="list" class="table">&\n' + ; - ' <column name="id" title="id"/>&\n' + ; + ' <widget name="list" class="table">&\n' - fields := lquery(params, 'describe '+ent) + pclass := form_splitClass( ent ) + params:db := pclass[1] + fields := lquery(params, 'describe '+pclass[2]) if valtype(fields) == 'A' for i in fields - if i[2] $ 'CNDLXRS' + if i[2] $ 'CNDLXRS' .and. i[1] != 'id' f += ' <column name="'+i[1]+'" title="'+i[1]+'"/>&\n' endif next @@ -231,13 +250,13 @@ f += ' </widget>&\n' + ; ' <widget class="buttonBar">&\n' + ; - ' <widget class="button" label="&Close" name="close" />&\n' + ; + ' <widget class="button" label="&Close" name="close" />&\n' + ; ' </widget>&\n' + ; ' </widget>&\n' + ; ' </interface>&\n&\n' + ; - ' <style>&\n' + ; - ' </style>&\n&\n' + ; - ' <actions>&\n' + ; + ' <style>&\n' + ; + ' </style>&\n&\n' + ; + ' <actions>&\n' + ; ; ' <rule label="&Create">&\n' + ; ' <event widget="create" signal="clicked"/>&\n' + ; @@ -254,7 +273,7 @@ ' <rule label="&Delete...">&\n' + ; ' <event widget="delete" signal="clicked"/>&\n' + ; ' <action>&\n' + ; - ' <call widget="form" method="dialogBox">&\n' + ; + ' <call widget="__form" method="dialogBox">&\n' + ; ' <param value="Confirmation"/>&\n' + ; ' <param value="Delete item?"/>&\n' @@ -280,9 +299,9 @@ f += ' <rule label="-C&lose">&\n' + ; ' <event widget="close" signal="clicked"/>&\n' + ; - ' <action><call widget="form" method="close"/></action>&\n' + ; + ' <action><call widget="__form" method="close"/></action>&\n' + ; ' </rule>&\n' + ; - ' </actions>&\n' + ; + ' </actions>&\n' + ; '</form>' return f @@ -292,6 +311,7 @@ fClass := DEFAULT_FORM_CLASS fName := params:name + params:db := DEFAULT_FORM_DB if "TYPE" $ params fName := params:type+"/"+fName endif @@ -306,37 +326,41 @@ /* Get filled view for table */ // TODO: using TVIEW if exists static function get_View(params) - local query + local query, a if assertParameters( params, { 'name:C', 'fields:C' } ) return NIL endif - query := 'select '+params:fields+' from '+params:name + a := form_splitClass( params:name ) + query := 'select '+params:fields+' from '+a[2] -return lcomponent('sys.db', 'executeExt', 'db', iif(valtype(params)=='O' .and. 'DB' $ params, params:db,''), 'query', query) +return lcomponent('sys.db', 'executeExt', 'db', a[1], 'query', query) /* Generate visial form for show class object */ static function get_UIObject(params) - local class:=params:name, f:="", attr, i, a, t, name, chooseElem:={} + local class:=params:name, f:="", attr, i, a, t, name, chooseElem:={}, pclass + pclass := form_splitClass( class ) + params:db := pclass[1] /* XML head */ f += '<?xml version="1.0" encoding="'+DEFAULT_ENCODING+'" ?>&\n' f += '<!-- "'+class+'" dialog interface form -->&\n&\n' /* Form head */ f += '<form>&\n<head>' + ; - ' <call method="setFormObject"><param><property widget="form" name="object"/></param></call>&\n'+ ; + ' <class name="'+class+'"/>&\n' + ; + ' <call method="setFormObject"><param><property widget="__form" name="object"/></param></call>&\n'+ ; '</head>&\n' /* Interface definition */ f += '<interface>&\n' - f += '<widget class="document" name="form" label="'+class+'">&\n'+ ; - '<widget name="title" class="label" label="'+class+'"/>&\n' + f += '<widget class="document" name="__form" label="'+pclass[2]+'">&\n'+ ; + '<widget name="title" class="label" label="'+pclass[2]+'"/>&\n' // Get fields list - attr := lquery(params, 'describe '+class) + attr := lquery(params, 'describe '+pclass[2]) if valtype(attr) != 'A' attr := array(0) endif @@ -352,27 +376,30 @@ for i=1 to len(attr) a := attr[i] name := a[1] + if name == 'id' + loop + endif t := a[2] switch t - case 'L' - f += ' <widget class="combobox" name="'+name+'" pos="'+alltrim(str(i))+',1-2" label="&'+name+'"/>&\n' - case 'D' + case 'L' + f += ' <widget class="combobox" name="'+name+'" pos="'+alltrim(str(i))+',1-2+" label="&'+name+'"/>&\n' + case 'D' f += ' <widget class="label" pos="'+alltrim(str(i))+',1" label="&'+name+':" accel="'+name+'"/>&\n' - f += ' <widget class="editdate" name="'+name+':date" pos="'+alltrim(str(i))+',2" />&\n' - case 'N' + f += ' <widget class="editdate" name="'+name+':date" pos="'+alltrim(str(i))+',2+" />&\n' + case 'N' f += ' <widget class="label" pos="'+alltrim(str(i))+',1" label="&'+name+':" accel="'+name+'"/>&\n' - f += ' <widget class="editdate" name="'+name+':number" pos="'+alltrim(str(i))+',2" />&\n' - case 'S' + f += ' <widget class="edit" name="'+name+':number" pos="'+alltrim(str(i))+',2+" />&\n' + case 'M' f += ' <widget class="label" pos="'+alltrim(str(i))+',1" label="&'+name+':" accel="'+name+'"/>&\n' - f += ' <widget class="edittext" name="'+name+'" pos="'+alltrim(str(i))+',2" />&\n' + f += ' <widget class="edittext" name="'+name+'" pos="'+alltrim(str(i))+'+,2+" />&\n' // TODO: widget for choosing object with button // case 'R' // f += ' <widget class="label" pos="'+alltrim(str(i))+',1" label="&'+name+'" accel="'+name+"_choose"+'"/>&\n' // f += ' <widget class="edit" name="'+name+'" pos="'+alltrim(str(i))+',2" />&\n' // TODO: file uploading for blob - otherwise + otherwise f += ' <widget class="label" pos="'+alltrim(str(i))+',1" label="&'+name+':" accel="'+name+'"/>&\n' - f += ' <widget class="edit" name="'+name+'" pos="'+alltrim(str(i))+',2" />&\n' + f += ' <widget class="edit" name="'+name+'" pos="'+alltrim(str(i))+',2+" />&\n' endswitch next @@ -382,33 +409,34 @@ // Bottom bar f += '<widget class="buttonBar">&\n'+ ; - ' <widget class="button" label="&Ok" name="save" />&\n' - ' <widget class="button" label="&Print" name="print" />&\n'+ ; - f += ' <widget class="button" label="&Close" name="close" />&\n'+ ; + ' <widget class="button" label="&Ok" name="save" />&\n' + ' <widget class="button" label="&Print" name="print" />&\n'+ ; + f += ' <widget class="button" label="&Close" name="close" />&\n'+ ; '</widget>&\n'+ ; '</widget>&\n' // Footer f += '</interface>&\n' f += '<!-- Widget properties -->&\n'+ ; - '<style>&\n'+ ; - ' <property widget="form" name="spacing" value="2"/>&\n'+ ; - ' <property widget="title" name="font.style" value="BOLD"/>&\n'+ ; + '<style>&\n'+ ; + ' <property widget="__form" name="spacing" value="2"/>&\n'+ ; + ' <property widget="title" name="font.style" value="BOLD"/>&\n'+ ; + ' <property widget="title" name="font.size" value="+2"/>&\n'+ ; '</style>&\n' f += '<!-- Actions -->&\n'+ ; - '<actions>&\n'+ ; + '<actions>&\n'+ ; ' <rule label="&OK">&\n'+ ; ' <event widget="save" signal="clicked"/>&\n'+ ; ' <action>&\n'+ ; - ' <call method="saveForm"><param><property widget="form" name="object"/></param><param value="'+class+'" /></call>&\n'+ ; - ' <call widget="form" method="close"/>&\n'+ ; + ' <call method="saveForm"><param><property widget="__form" name="object"/></param><param value="'+class+'" /></call>&\n'+ ; + ' <call widget="__form" method="close"/>&\n'+ ; ' </action>&\n'+ ; ' </rule>&\n'+ ; ' <rule label="-&Close">&\n'+ ; ' <event widget="close" signal="clicked"/>&\n'+ ; ' <action>&\n'+ ; - ' <call method="dialogBoxConfirmClose"><param><property widget="form" name="object"/></param><param value="'+class+'" /></call>&\n'+ ; + ' <call method="dialogBoxConfirmClose"><param><property widget="__form" name="object"/></param><param value="'+class+'" /></call>&\n'+ ; ' </action>&\n'+ ; ' </rule>&\n' @@ -416,7 +444,7 @@ /* <rule> <event widget="payer" signal="clicked"/> - <action><call widget="form" method="open"> + <action><call widget="__form" method="open"> <param value="Partner.Choice.xfl"/> <return> <call widget="payer" method="setValue"> @@ -433,7 +461,7 @@ </rule> */ - f += '</actions>&\n' + f += '</actions>&\n' f += '</form>' return f Index: form.xml =================================================================== RCS file: /cvsroot/eas-dev/ocmng/components/ocmng/forms/form.xml,v retrieving revision 1.1 retrieving revision 1.2 diff -u -d -r1.1 -r1.2 --- form.xml 2 Jun 2006 14:44:46 -0000 1.1 +++ form.xml 5 Jun 2006 12:23:09 -0000 1.2 @@ -1,4 +1,4 @@ -<?xml version="1.0" encoding="utf-8" standalone="no" ?> +<?xml version="1.0" encoding="koi8-r" standalone="no" ?> <component> <name>form</name> @@ -7,36 +7,25 @@ <description>Interface and print form support: get from database or generate</description> <license>GNU/GPL</license> <created>2006-05-01</created> - <modified>2006-05-19</modified> + <modified>2006-06-04</modified> <requires> - <dependence type="component">../ocmng/components</dependence> + <dependence type="component">../component.xml</dependence> </requires> - <author> - <name>Andrey Cherepanov</name> - <email>sk...@ea...</email> - <copyright>2006</copyright> - </author> + <author>Skull</author> - <files> - <file name="form.po">Form plugin</file> - <file name="create.xpm">Create icon</file> - <file name="edit.xpm">Edit icon</file> - <file name="delete.xpm">Delete icon</file> - </files> - <meta dictionary="ETC01"> + <!-- mng_form --> <attribute name="type" type="string" len="50" lenType="rtrim" /> <attribute name="content" type="text" lenType="alltrim" /> - <attribute name="size" type="number" lenType="ignore" /> <class name="mng_form" extent="component" essence="name" uniqueKey="name" - attributes="name,type,description,content,size" + attributes="name,type,description,content" indices="name" mainIdx="name" findAttrs="name" @@ -46,22 +35,48 @@ <attribute name="form" type="ref" len="12" refTo="ETC01:mng_form" lenType="ignore" /> <class name="mng_command" - extent="component" - essence="name" - uniqueKey="name" - attributes="name,component,form,description,enabled" - indices="name" - mainIdx="name" - findAttrs="name" - /> - + extent="component" + essence="name" + uniqueKey="name" + attributes="name,component_name,form,description" + indices="name,component_name" + mainIdx="name" + findAttrs="name" + /> + </meta> <data> + <objects depository="ETC0101" class="mng_form"> + <object> + <attr name="name">form.po</attr> + <attr name="type">application/x-clip-plugin</attr> + <attr name="description">Form plugin</attr> + <attr name="content">form.po</attr> + </object> + <object> + <attr name="name">create.xpm</attr> + <attr name="type">image/x-xpm</attr> + <attr name="description">Create icon</attr> + <attr name="content">create.xpm</attr> + </object> + <object> + <attr name="name">edit.xpm</attr> + <attr name="type">image/x-xpm</attr> + <attr name="description">Edit icon</attr> + <attr name="content">edit.xpm</attr> + </object> + <object> + <attr name="name">delete.xpm</attr> + <attr name="type">image/x-xpm</attr> + <attr name="description">Delete icon</attr> + <attr name="content">delete.xpm</attr> + </object> + </objects> <objects depository="ETC0101" class="mng_command"> <object> <attr name="name">get</attr> - <attr name="component" refTo="ETC0101:mng_component">form</attr> + <attr name="component_name">form</attr> <attr name="form" refTo="ETC0101:mng_form">form.po</attr> <attr name="description"><![CDATA[Get/generate form. Arguments: @@ -76,11 +91,10 @@ Returns: String. Form contents.]]></attr> - <attr name="enabled">true</attr> </object> <object> <attr name="name">getview</attr> - <attr name="component" refTo="ETC0101:mng_component">form</attr> + <attr name="component_name">form</attr> <attr name="form" refTo="ETC0101:mng_form">form.po</attr> <attr name="description"><![CDATA[Get view content. Arguments: @@ -88,14 +102,13 @@ fields - String. Comma separated list of object fields. Returns: Array. View content.]]></attr> - <attr name="enabled">true</attr> </object> </objects> </data> <locale lang="ru"> <name>form</name> - <description>ÐоддеÑжка инÑеÑÑейÑнÑÑ Ð¸ пеÑаÑнÑÑ ÑоÑм: полÑÑение из Ð±Ð°Ð·Ñ Ð¸Ð»Ð¸ генеÑаÑиÑ</description> + <description>ðÏÄÄÅÒÖËÁ ÉÎÔÅÒÆÅÊÓÎÙÈ É ÐÅÞÁÔÎÙÈ ÆÏÒÍ: ÐÏÌÕÞÅÎÉÅ ÉÚ ÂÁÚÙ ÉÌÉ ÇÅÎÅÒÁÃÉÑ</description> </locale> </component> |