From: Andrey C. <sku...@us...> - 2006-06-02 14:44:50
|
Update of /cvsroot/eas-dev/ocmng/components/ocmng/forms In directory sc8-pr-cvs5.sourceforge.net:/tmp/cvs-serv17182/components/ocmng/forms Added Files: create.xpm delete.xpm edit.xpm form.prg form.xml Log Message: Add files --- NEW FILE: create.xpm --- /* XPM */ static char * item_new_xpm[] = { "16 16 31 1", " c None", ". c #6238B6", "+ c #F5E15E", "@ c #183196", "# c #A29EF6", "$ c #C0C000", "% c #152C89", "& c #173093", "* c #000000", "= c #5933A6", "- c #FFFF85", "; c #968200", "> c #FFFFFF", ", c #E1E1E1", "' c #CECECE", ") c #FFFFC0", "! c #FFFF00", "~ c #777777", "{ c #5B5B5B", "] c #C1C1C1", "^ c #010101", "/ c #CDCDCD", "( c #6D6D6D", "_ c #3F3F3F", ": c #E9E9E9", "< c #4A4A4A", "[ c #5F5F5F", "} c #5C5C5C", "| c #838383", "1 c #FAFAFA", "2 c #F9F9F9", " ", " ", " ", " ........... ", " .+@##@@$%&$**$ ", " .......=-;-;-* ", " .>>>>>,';)!);* ", " .>~~~>{$-!>!-$ ", " .>>>>>,];)!);* ", " .>^^^^^*-;-;-* ", " .>^>>>>$/($_*$ ", " ..^>~~~:<[}|* ", " ^>>>>1:12:* ", " ^^^^^^^^^^^ ", " ", " "}; --- NEW FILE: delete.xpm --- /* XPM */ static char * item_delete_xpm[] = { "16 16 25 1", " c None", ". c #6238B6", "+ c #F5E15E", "@ c #183196", "# c #A29EF6", "$ c #382069", "% c #C91B33", "& c #43267D", "* c #6036B2", "= c #FFFFFF", "- c #3C2270", "; c #777777", "> c #525252", ", c #000000", "' c #FAFAFA", ") c #9D9D9D", "! c #010101", "~ c #3F3F3F", "{ c #E9E9E9", "] c #202020", "^ c #303030", "/ c #B1B1B1", "( c #CDCDCD", "_ c #838383", ": c #F4F4F4", " ", " ", " ", " ........... ", " .+@##@@@@@. ", " .......$%&* % ", " .======%%%-%%% ", " .=;;;=;>%%%%%, ", " .======')%%%,, ", " .=!!!!!!%%%%% ", " .=!====%%%~%%% ", " ..!=;;;{%]^/%, ", " !===='(_(:, ", " !!!!!!,,,!, ", " ", " "}; --- NEW FILE: edit.xpm --- /* XPM */ static char * edit_xpm[] = { "16 16 19 1", " c None", ". c #6238B6", "+ c #7F4978", "@ c #F5E15E", "# c #183196", "$ c #A29EF6", "% c #FFA1F3", "& c #FFFFFF", "* c #000000", "= c #777777", "- c #010101", "; c #ADADAD", "> c #FBFBFB", ", c #010000", "' c #707070", ") c #494949", "! c #5B5B5B", "~ c #545454", "{ c #F9F9F9", " ", " ", " ", " ........... + ", " .@#$$#####.+%+ ", " ..........+%+%+", " .&&&&&&&&+%+%+*", " .&===&==+%+%+* ", " .&&&&&&+++%+* ", " .&----*;>++** ", " .&-&&&;,'+);* ", " ..-&==,'!~'&* ", " -&&&&&&&&{- ", " ----****--- ", " ", " "}; --- NEW FILE: form.prg --- /*-------------------------------------------------------------------------*/ /* 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 */ /* License, or (at your option) any later version. */ /*-------------------------------------------------------------------------*/ /*--------------------------------------------------------------------------/ / / / 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_ENCODING 'koi8-r' parameters cMethod, params local cContent:='' local oErr, i, err:='' eDebug(12, "FORM method:", cMethod) oErr := ErrorBlock({|e| break(e) }) begin sequence /*=========================================================================*/ // GET() if lower(cMethod) == 'get' if assertParameters( params, { 'name:C' } ) return NIL endif eDebug(15, "FORM args:", params) // Check if form exist in database and return it if (cContent:=get_StoredForm(params)) != NIL return cContent else cContent := '' endif if 'TYPE' $ params if params:type == 'list' cContent := get_UIList(params) elseif params:type == 'object' cContent := get_UIObject(params) endif else if params:name == 'main' cContent := get_MainForm(params) else eDebug(5, "FORM: Unknown file:", params:name) // TODO: dialog box for unknown form cContent := NIL endif endif return cContent /*=========================================================================*/ // GETVIEW() elseif lower(cMethod) == 'getview' return get_View(params) else eDebug(3, "FORM has not method '"+cMethod+"'") endif recover using oErr i := 1 while ( !empty(ProcName(i)) ) err += "Called from "+allTrim(ProcName(i)) + ; ":" + alltrim(str(ProcLine(i))) + chr(10) i++ end eDebug(5, "Component internal error:", errorMessage(oErr)) return NIL end sequence return NIL /* Generate main window */ static function get_MainForm(params) local f:='', title:=DEFAULT_TITLE_MAIN_WINDOW, l, i, ent, aIgnoreClasses if "DB" $ params title := params:db endif 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' + ; ; ' <!-- 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' endif next endif 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' + ; '</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' // TODO: translation f += '<actions>&\n' + ; ' <!-- System actions -->&\n' + ; ' <rule>&\n' + ; ' <event widget="Menu.Quit" signal="activate"/>&\n' + ; ' <action><call widget="mainWindow" method="close"/></action>&\n' + ; ' </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 f += '</actions>&\n' + ; '</form>&\n' eDebug(17, "FORM getMainForm:", len(f)) return f // Generate form with list of all class object static function get_UIList(params) local f, ent:=params:name, fields, i 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() ) ' <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' + ; ' </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' + ; ; ' <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' + ; ' </widget>&\n' + ; ; ' <widget name="list" class="table">&\n' + ; ' <column name="id" title="id"/>&\n' fields := lquery(params, 'describe '+ent) if valtype(fields) == 'A' for i in fields if i[2] $ 'CNDLXRS' f += ' <column name="'+i[1]+'" title="'+i[1]+'"/>&\n' endif next endif f += ' </widget>&\n' + ; ' <widget class="buttonBar">&\n' + ; ' <widget class="button" label="&Close" name="close" />&\n' + ; ' </widget>&\n' + ; ' </widget>&\n' + ; ' </interface>&\n&\n' + ; ' <style>&\n' + ; ' </style>&\n&\n' + ; ' <actions>&\n' + ; ; ' <rule label="&Create">&\n' + ; ' <event widget="create" signal="clicked"/>&\n' + ; ' <action><call method="openForm"><param value="'+ent+'"/><param value="object"/>&\n' + ; ' </call></action></rule>&\n' + ; ; ' <rule label="&Edit">&\n' + ; ' <event widget="edit" signal="clicked"/>&\n' + ; ' <event widget="list" signal="selected"/>&\n' + ; ' <action><call method="openForm"><param value="'+ent+'"/><param value="object"/>' + ; ' <param><call widget="list" method="getSelectionId"/></param>&\n' + ; ' </call></action></rule>&\n' + ; ; ' <rule label="&Delete...">&\n' + ; ' <event widget="delete" signal="clicked"/>&\n' + ; ' <action>&\n' + ; ' <call widget="form" method="dialogBox">&\n' + ; ' <param value="Confirmation"/>&\n' + ; ' <param value="Delete item?"/>&\n' f += ' <param value="'+"'"+'&Delete'+"','"+'&Cancel'+"'"+'"/>&\n' f += ' <return>&\n' + ; ' <condition>&\n' + ; ' <param><returnedvalue /></param>&\n' + ; ' <case value="true">&\n' + ; ' <call method="deleteObject">&\n' + ; ' <param><call widget="list" method="getSelectionId"/></param>&\n' + ; ' </call>&\n' + ; ' <call method="openView">&\n' + ; ' <param><property widget="list" name="object"/></param>&\n' + ; ' <param value="'+ent+'"/>&\n' + ; ' </call>&\n' + ; ' </case>&\n' + ; ' </condition>&\n' + ; ' </return>' + ; ' </call>&\n' + ; ' </action>&\n' + ; ' </rule>&\n' f += ' <rule label="-C&lose">&\n' + ; ' <event widget="close" signal="clicked"/>&\n' + ; ' <action><call widget="form" method="close"/></action>&\n' + ; ' </rule>&\n' + ; ' </actions>&\n' + ; '</form>' return f /* Lookup form in database */ static function get_StoredForm(params) local fClass, fName, r, c:=NIL, id fClass := DEFAULT_FORM_CLASS fName := params:name if "TYPE" $ params fName := params:type+"/"+fName endif r := lquery(params, 'select content from '+fClass+' where name=="'+fName+'"') if valtype(r) == 'A' .and. len(r) > 0 c := r[1][1] eDebug(15, "FORM:",fName,len(c)) endif return c /* Get filled view for table */ // TODO: using TVIEW if exists static function get_View(params) local query if assertParameters( params, { 'name:C', 'fields:C' } ) return NIL endif query := 'select '+params:fields+' from '+params:name return lcomponent('sys.db', 'executeExt', 'db', iif(valtype(params)=='O' .and. 'DB' $ params, params:db,''), '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:={} /* 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'+ ; '</head>&\n' /* Interface definition */ f += '<interface>&\n' f += '<widget class="document" name="form" label="'+class+'">&\n'+ ; '<widget name="title" class="label" label="'+class+'"/>&\n' // Get fields list attr := lquery(params, 'describe '+class) if valtype(attr) != 'A' attr := array(0) endif // eDebug(5, "ATTR:",var2log(attr,3,.T.)) if len(attr) > 0 f += '<widget class="grid">&\n'+ ; ' <property name="cols" value="2"/>&\n'+ ; ' <property name="rows" value="'+alltrim(str(len(attr)))+'"/>&\n' endif // Add fields by type for i=1 to len(attr) a := attr[i] name := a[1] t := a[2] switch t 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="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="label" pos="'+alltrim(str(i))+',1" label="&'+name+':" accel="'+name+'"/>&\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 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' endswitch next if len(attr) > 0 f += '</widget>&\n' endif // 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>&\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' f += '<!-- 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'+ ; ' </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'+ ; ' </action>&\n'+ ; ' </rule>&\n' /* Add choose action (chooseElem)*/ /* <rule> <event widget="payer" signal="clicked"/> <action><call widget="form" method="open"> <param value="Partner.Choice.xfl"/> <return> <call widget="payer" method="setValue"> <param><returnedvalue /></param> </call> <property widget="payer.name" name="label"> <call method="getObjectAttr"> <param><returnedvalue /></param> <param value="name"/> </call> </property> </return> </call></action> </rule> */ f += '</actions>&\n' f += '</form>' return f --- NEW FILE: form.xml --- <?xml version="1.0" encoding="utf-8" standalone="no" ?> <component> <name>form</name> <category>Core/Forms</category> <version>0.1</version> <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> <requires> <dependence type="component">../ocmng/components</dependence> </requires> <author> <name>Andrey Cherepanov</name> <email>sk...@ea...</email> <copyright>2006</copyright> </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"> <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" indices="name" mainIdx="name" findAttrs="name" /> <!-- mng_command --> <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" /> </meta> <data> <objects depository="ETC0101" class="mng_command"> <object> <attr name="name">get</attr> <attr name="component" refTo="ETC0101:mng_component">form</attr> <attr name="form" refTo="ETC0101:mng_form">form.po</attr> <attr name="description"><![CDATA[Get/generate form. Arguments: name - String. Form name. type - String. Form type. Optional. Form types: object XFL form for edit object content list XFL form with list of objects select XFL form for select object from list print_object XPL card for object print_list XPL form for print object list 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="form" refTo="ETC0101:mng_form">form.po</attr> <attr name="description"><![CDATA[Get view content. Arguments: name - String. Class name. 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> </locale> </component> |