zoukankan      html  css  js  c++  java
  • 导出的MF_ToolBar文件xpo

    Exportfile for AOT version 1.0 or later
    Formatversion: 1

    ***Element: FTM

    ; Microsoft Dynamics AX MENUITEM : MF_QueryBrowser unloaded
    ; --------------------------------------------------------------------------------
      VERSION 1
      MENUITEM #MF_QueryBrowser
        Type: 1
        PROPERTIES
          Name                #MF_QueryBrowser
          Label               #Browse query
          HelpText            #Browse query
          ObjectType          #Class
          Object              #MF_QueryBrowser
        ENDPROPERTIES
      ENDMENUITEM

    ***Element: FTM

    ; Microsoft Dynamics AX MENUITEM : MF_showField unloaded
    ; --------------------------------------------------------------------------------
      VERSION 1
      MENUITEM #MF_showField
        Type: 1
        PROPERTIES
          Name                #MF_showField
          Object              #MF_ShowField
        ENDPROPERTIES
      ENDMENUITEM

    ***Element: FTM

    ; Microsoft Dynamics AX MENUITEM : MF_CopyFieldsToClipboard unloaded
    ; --------------------------------------------------------------------------------
      VERSION 1
      MENUITEM #MF_CopyFieldsToClipboard
        Type: 3
        PROPERTIES
          Name                #MF_CopyFieldsToClipboard
          Label               #Copy Table FieldList
          HelpText            #Copy Table FieldList to Clipboard
          ObjectType          #Class
          Object              #MF_CopyFieldsToClipboard
          ConfigurationKey    #SysDevelopmentXPP
        ENDPROPERTIES
      ENDMENUITEM

    ***Element: FTM

    ; Microsoft Dynamics AX MENUITEM : MF_CreateNewProject unloaded
    ; --------------------------------------------------------------------------------
      VERSION 1
      MENUITEM #MF_CreateNewProject
        Type: 3
        PROPERTIES
          Name                #MF_CreateNewProject
          Label               #Create new project (hold Ctrl to edit/duplicate the selected project)
          HelpText            #Create a new project with selected project groups or Update an existing project
          ObjectType          #Class
          Object              #MF_CreateNewProject
          SecurityKey         #SysDevelopment
        ENDPROPERTIES
      ENDMENUITEM

    ***Element: FRM

    ; Microsoft Dynamics AX Forms unloaded
    ; --------------------------------------------------------------------------------
    FRMVERSION 5

    FORM #MF_TabBar2009
      PROPERTIES
        Name                #MF_TabBar2009
      ENDPROPERTIES
      METHODS
        Version: 3
        SOURCE #classDeclaration
          #// http://www.axaptapedia.com/index.php/Tabax
          #public class FormRun extends ObjectRun
          #{
          #    #define.v('0.3.2')
          #    #localmacro.tabax_license
          #@'Copyright (c) 2006-2007, Max Belugin
          #All rights reserved.
          #
          #Redistribution and use in source and binary forms, with or without modification, are permitted provided
          #that the following conditions are met:
          #
          #  *Redistributions of source code must retain the above copyright notice, this list of conditions
          #   and the following disclaimer.
          #
          #  *Redistributions in binary form must reproduce the above copyright notice,
          #   this list of conditions and the following
          #   disclaimer in the documentation and/or other materials provided with the distribution.
          #
          #  *Neither the name of the Max Belugin nor the names of its contributors may be used to endorse or
          #   promote products derived from this software without specific prior written permission.
          #
          #THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING,
          #BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO
          #EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY,
          #OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
          #OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
          #OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
          #ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
          #'
          #    #endmacro
          #
          #// =========== configuration ==============
          #    // prefixes of widow titles whist have
          #    // to have project icon.
          #    // add your prefix if you use localization other
          #    // than russian and english
          #    #localmacro.projectPrefixes
          #        #prefix("Projects\\Shared")
          #        #prefix("Проект ")
          #        #prefix("Development project ")
          #        #prefix("Project ")
          #    #endmacro
          #    // timer interval in milliseconds for active windows scanning
          #    #define.windowsScanTimer(300)
          #//========= configuration end =========
          #    Map windows;
          #    Map titles;
          #    #resAppl
          #    #winAPI
          #    HWND topmost;
          #    HWND second;
          #    ObjectIdent currentFormRun;
          #    HWND currentFormRun_hwnd;
          #    imageListAppl_AOT imgApp;
          #    container p;
          #    DLL user32;
          #    DLLFunction isWindowVisibleFun;
          #    DLLFunction isIconicFun;
          #    DLLFunction isZoomedFun;
          #    DLLFunction openIconFun;
          #    DLLFunction getDesktopWindow;
          #    DLLFunction lockWindowUpdate;
          #    DLLFunction peekMessage;
          #    DLLFunction TranslateMessage;
          #    DLLFunction dispatchMessage;
          #    List mainMenu;
          #    Map mainMenuItems;
          #    boolean menuTree_notOpen;
          #    container MRUProjects;
          #    container editorSuffixes;
          #    int hand;
          #    HWND MdiClient;
          #    boolean fitMaximized;
          #
          #    boolean collapsed;
          #    Set maximized;
          #    container maximizedIdentities;
          #    FormTreeItem loadingMenuItem;
          #    str windowToolTip;
          #    str menuToolTip;
          #    str historyToolTip;
          #    FormButtonControl activeBut;
          #    FormTabPageControl activeTab;
          #    str v;
          #    Map openedProjects;
          #    // iteration:
          #        TreeNode current;
          #        Array iterators;
          #        Array lists;
          #        TreeNodeIterator tniterator;
          #        int sp, lists_sp;
          #        List currentList;
          #    //Map menuUsageStatistics;
          #    container packedMenuUsageStatistics;
          #    boolean menuOnlyPopular;
          #    boolean inDeletion;
          #    int maxCaptionSize;
          #    int windowsScanTimer;
          #    boolean paused;
          #    int heightDecrement;
          #     // Normal sizes for restore after maximization
          #    Map normalPositions;
          #    // Map hWnd --> FormName, MenuItemname
          #    Map formIdentity;
          #    // Map identity -> normal position;
          #    Map identityNormalPositions;
          #    Set retoreIfRestored;
          #    Map oldWindows;
          #    // Windows which probably have fixed size
          #    Map fixedWindows;
          #// === tabs parameters
          #    boolean sameTabSize;
          #    int maxTabSize;
          #    int minTabSize;
          #    int desktopWindow;
          #
          #    #define.SWP_NOACTIVATE(0x10)
          #
          #
          #    #define.CurrentVersion(8)
          #    #localmacro.List5
          #        maxCaptionSize
          #    #endmacro
          #    #localmacro.List6
          #        maxCaptionSize, fitMaximized
          #    #endmacro
          #    #localmacro.List7
          #        maxCaptionSize, fitMaximized, maximizedIdentities
          #    #endmacro
          #    #localmacro.List8
          #        maxCaptionSize, fitMaximized, maximizedIdentities, minTabSize, maxTabSize, sameTabSize
          #    #endmacro
          #    #localmacro.CurrentList
          #        #List8
          #    #endmacro
          #    #define.TCM_FIRST(0x1300)
          #    #define.TCM_GETIMAGELIST(#TCM_FIRST + 2)
          #    #define.TCM_SETIMAGELIST(#TCM_FIRST + 3)
          #    #define.TCM_GETITEMCOUNT(#TCM_FIRST + 4)
          #    #define.TCM_SETITEM(#TCM_FIRST + 6)
          #    #define.TCM_GETITEMRECT(#TCM_FIRST + 10)
          #    #define.TCM_SETITEMSIZE(#TCM_FIRST + 41)
          #    #define.TCM_SETMINTABWIDTH(#TCM_FIRST + 49)
          #    #define.TCM_GETCURSEL(#TCM_FIRST + 11)
          #    #define.TCM_SETCURSEL(#TCM_FIRST + 12)
          #    #define.TCM_HITTEST(#TCM_FIRST + 13)
          #    #define.TCS_FIXEDWIDTH(0x0400)
          #    #define.TCS_TOOLTIPS(0x4000)
          #    #define.TCS_FORCELABELLEFT(0x0020)
          #    #define.TCIF_IMAGE(0x0002)
          #    #define.GWL_STYLE(-16)
          #// === axPath
          #    #define.AxPath_Prefix('AxPath')
          #    #define.AxPath_AOTName('AOT')
          #    #define.AxPath_MenuItemName('MenuItem')
          #    #define.URL_PART_NONE(0)
          #    #define.URL_PART_SCHEME(1)
          #    #define.URL_PART_HOSTNAME(2)
          #    #define.URL_PART_USERNAME(3)
          #    #define.URL_PART_PASSWORD(4)
          #    #define.URL_PART_PORT(5)
          #    #define.URL_PART_QUERY(6)
          #    #define.WM_GETMINMAXINFO(0x24)
          #    #AOT
          #
          #
          #    #if.ReferencesPath
          #        #define.PaneWindowCL("AxPaneWnd")
          #        #define.ImageExt('png')
          #        #localmacro.recID2str
          #            int642str(%1)
          #        #endmacro
          #        #localmacro.str2recID
          #            str2int64(%1)
          #        #endmacro
          #        #define.Ax4
          #    #endif
          #
          #    #ifnot.ReferencesPath
          #        #define.PaneWindowCL("PaneWindowCL")
          #        #define.ImageExt('bmp')
          #        #localmacro.recID2str
          #            uint2str(%1)
          #        #endmacro
          #        #localmacro.str2recID
          #            str2int(%1)
          #        #endmacro
          #        #define.Ax3
          #    #endif
          #
          #// === i18n
          #    Session session;
          #    Map translations;
          #    #localmacro._
          #        element.getText(%1)
          #    #endmacro
          #
          #    #localmacro.language
          #        if (session.interfaceLanguage()=="%1")
          #        {
          #            translations=new Map(Types::String, Types::String);
          #    #endmacro
          #    #localmacro.endLanguage
          #        }
          #    #endmacro
          #// === events
          #    Map events;
          #    #localmacro.fireEvent
          #        __eventHandlersEnumerator__ = element.getEvent(identifierStr(%1)).getEnumerator();
          #        while(__eventHandlersEnumerator__.moveNext())
          #            __eventHandlersEnumerator__.current().%1%2;
          #    #endMacro
          #    SetEnumerator __eventHandlersEnumerator__;
          #}
        ENDSOURCE
        SOURCE #WinApi_GetClassName
          #str WinApi_getClassName(int _hWnd)
          #{
          #    DLL         _Userdll        = new DLL("User32.dll");
          #    DLLFunction _getClassName   = new DLLFunction(_Userdll, "GetClassNameA");
          #    Binary      className       = new Binary(100);
          #    ;
          #    _getClassName.arg(ExtTypes::DWord, ExtTypes::Pointer, ExtTypes::DWord);
          #    _getClassName.returns(ExtTypes::DWord);
          #    if (_getClassName.call(_hWnd, className, 100))
          #        return className.string(0);
          #    else
          #        return "";
          #}
          #
        ENDSOURCE
        SOURCE #window_isContentPane
          #boolean window_isContentPane(HWND _hwnd)
          #{
          #    return element.WinApi_getClassName(_hwnd) == 'ContentFrame';
          #}
        ENDSOURCE
        SOURCE #window_close
          #void window_close(HWnd _hWnd)
          #{
          #;
          #    if (!element.window_isContentPane(_hWnd))
          #        WinAPI::sendMessageEx(_hWnd, #WM_SYSCOMMAND, #SC_CLOSE, 0);
          #}
        ENDSOURCE
        SOURCE #AxPath_findCommon
          #Common AxPath_findCommon(TableID _tableID, container _params)
          #{
          #    Query q=new Query();
          #    QueryBuildDataSource ds = q.addDataSource(_tableID);
          #    Common ret;
          #    QueryRun qr;
          #;
          #    if (this.AxPath_filterFromParams(ds, _params))
          #    {
          #        qr = new QueryRun(q);
          #        qr.next();
          #        ret = qr.get(_tableID);
          #    }
          #    return ret;
          #}
        ENDSOURCE
        SOURCE #AxPath_real2str
          #str AxPath_real2str(real _value)
          #{
          #    str ret = num2str(_value, 0, 16, 1, 0);
          #    int pointPos = strFind(ret, '.', 1, strLen(ret));
          #    int nonZeroPos;
          #;
          #    if (pointPos)
          #    {
          #        nonZeroPos = strNFind(ret, '0', strLen(ret), -strLen(ret));
          #        ret = nonZeroPos ? subStr(ret, 1, nonZeroPos) : '0';
          #        if (this.strEndsWith(ret, '.'))
          #            ret = subStr(ret, 1, strLen(ret) - 1);
          #    }
          #    return ret;
          #}
        ENDSOURCE
        SOURCE #AxPath_valueFromString
          #AnyType AxPath_valueFromString(Types _type, str _asString)
          #{
          #    switch (_type)
          #    {
          #        case Types::Date:
          #            return str2date(_asString, 321);
          #        case Types::Real:
          #            return str2num(_asString);
          #        case Types::Integer:
          #            return str2int(_asString);
          #        #if.ax4
          #            case Types::Int64:
          #                return str2int64(_asString);
          #        #endif
          #        default:
          #            return _asString;
          #    }
          #}
          #
        ENDSOURCE
        SOURCE #AxPath_filterFromParams
          #boolean AxPath_filterFromParams(QueryBuildDataSource _ds, container _params)
          #{
          #    int i;
          #    str name;
          #    str value;
          #    RecID recID;
          #    FieldID field;
          #    SysDictTable table = SysDictTable::newTableId(_ds.table());
          #    boolean ret;
          #;
          #    for (i=1; i<=conLen(_params); i++)
          #    {
          #        [name, value] = conPeek(_params, i);
          #        if (name != fieldStr(Common, dataAreaId))
          #        {
          #            field = fieldName2ID(_ds.table(), name);
          #
          #            if (!field)
          #                throw error(strFmt(this.getText("Field '%2' is not found in the table '%1'"), tableID2Name(_ds.table()), name));
          #
          #            _ds.addRange(field).value(
          #                queryValue(this.AxPath_valueFromString(
          #                    table.fieldObject(field).type(),
          #                    value
          #                ))
          #            );
          #            ret = true;
          #        }
          #    }
          #    return ret;
          #}
          #
        ENDSOURCE
        SOURCE #AxPath_keyFields
          #container AxPath_keyFields(TableID _table)
          #{
          #    SysDictTable table = SysDictTable::newTableId(_table);
          #    container ret;
          #    IndexID primaryIndexID = table.primaryIndex();
          #    SysDictIndex primaryIndex;
          #    int i;
          #;
          #    if (primaryIndexID)
          #    {
          #        primaryIndex = table.indexObject(primaryIndexID);
          #        for (i=1; i<=primaryIndex.numberOfFields(); i++)
          #            ret += primaryIndex.field(i);
          #    }
          #    else
          #        ret += fieldName2ID(_table, 'RecID');
          #    return ret;
          #}
        ENDSOURCE
        SOURCE #AxPath_keyByCommon
          #str AxPath_keyByCommon(Common _record)
          #{
          #    container fields = element.AxPath_keyFields(_record.TableId);
          #    int i;
          #    str ret;
          #    FieldID field;
          #    str strValue()
          #    {
          #        AnyType value = _record.(field);
          #        Types type = typeOf(value);
          #    ;
          #        switch(type)
          #        {
          #            case Types::Date:
          #                return date2str(value, 321, 2, 0, 2, 0, 4);
          #            case Types::Real:
          #                return this.AxPath_real2str(value);
          #            case Types::Enum, Types::Integer:
          #                return int2str(value);
          #
          #            default:
          #                return strFmt('%1', value);
          #        }
          #    }
          #;
          #    for (i=1; i<=conLen(fields); i++)
          #    {
          #        if (ret)
          #            ret += '&';
          #        field = conPeek(fields, i);
          #        ret += fieldId2name(_record.TableId, field) + '=' + this.urlEscape(strValue());
          #    }
          #    return ret;
          #}
        ENDSOURCE
        SOURCE #resourceName
          #str resourceName(str _subPath)
          #{
          #    return 'Tabax_' + strReplace(strReplace(_subPath, '.', '_'), '\\', '_');
          #}
        ENDSOURCE
        SOURCE #getResourcePath
          #str getResourcePath(str _subPath)
          #{
          #    str ret = this.fullInculdePath(_subPath);
          #    if (WinApi::fileExists(ret))
          #        return ret;
          #    return this.filePathFromResource(_subPath);
          #}
        ENDSOURCE
        SOURCE #fullInculdePath
          #str fullInculdePath(str _subpath)
          #{
          #    return this.pathCombine(XInfo::directory(DirectoryType::Include), 'tabax\\' + _subpath);
          #}
        ENDSOURCE
        SOURCE #filePathFromResource
          #str filePathFromResource(str _subPath)
          #{
          #    return SysResource::getImagePath(this.resourceName(_subPath));
          #}
        ENDSOURCE
        SOURCE #getDataFieldTreeNode
          #TreeNode getDataFieldTreeNode(FormRun _form)
          #{
          #    TreeNode ret;
          #    Object formControlEditField = _form.selectedControl();
          #    TreeNode getDataSourceNode()
          #    {
          #        int         dataSourceId;
          #        int         fieldExtId;
          #        str         dataMethodName;
          #        TreeNode    fieldNode;
          #    ;
          #        dataSourceId    = formControlEditField.dataSource();
          #        fieldExtId      = formControlEditField.dataField();
          #        dataMethodName  = formControlEditField.dataMethod();
          #        if (dataSourceId)
          #        {
          #            if (fieldExtId)
          #            {
          #                fieldNode = TreeNode::findNode(#TablesPath + #AOTRootPath + tableId2Name(_form.form().dataSource(dataSourceId).table()) + "\\Fields");
          #                if (fieldNode)
          #                    fieldNode = fieldNode.AOTfindChild(fieldId2Name(_form.form().dataSource(dataSourceId).table(), fieldExt2Id(fieldExtId)));
          #                return fieldNode;
          #            }
          #            else
          #            {
          #                if (dataMethodName)
          #                {
          #                    fieldNode = TreeNode::findNode(strFmt(#DataSourceMethodPath, #FormsPath + #AOTRootPath + _form.name(), _form.form().dataSource(dataSourceId).name(), dataMethodName));
          #                    if (!fieldNode)
          #                    {
          #                        fieldNode = TreeNode::findNode(strFmt(#MethodPath, #TablesPath + #AOTRootPath + tableId2Name(_form.form().dataSource(dataSourceId).table()), dataMethodName));
          #                        return fieldNode;
          #                    }
          #                }
          #            }
          #        }
          #        return null;
          #    }
          #;
          #    switch (formControlEditField.handle())
          #    {
          #        case classNum(FormStringControl):
          #        case classNum(FormRealControl):
          #        case classNum(FormIntControl):
          #        case classNum(FormDateControl):
          #        case classNum(FormComboBoxControl):
          #        case classNum(FormRadioControl):
          #        case classNum(FormTimeControl):
          #            if (formControlEditField.extendedDataType())
          #                ret = new SysDictType(formControlEditField.extendedDataType()).treeNode();
          #            else
          #                ret = getDataSourceNode();
          #            break;
          #        case classNum(FormCheckBoxControl):
          #            ret = getDataSourceNode();
          #            break;
          #    }
          #    return ret;
          #}
        ENDSOURCE
        SOURCE #showControlInfo
          #public void showControlInfo(FormRun _form)
          #{
          #    #define.taskCtrlQ(264)
          #    SysDictField        dictField;
          #    FormControl         formControl = _form.selectedControl();
          #    FormStringControl   formStringControl;
          #    FormButtonControl   formButtonControl;
          #    SysDictEnum         dictEnum = new SysDictEnum(enumNum(Types));
          #    SysDictEnum         dictEnums;
          #    FormDataSource      formDataSource =  _form.objectSet();
          #    TreeNode node;
          #;
          #
          #    if(formControl && formDataSource)
          #    {
          #        node = element.controlByName(element.formByName(_form.name()), formControl.name());
          #        switch(SysFormRun::controlType(classIdGet(formControl)))
          #        {
          #            case FormControlType::CheckBox :
          #            case FormControlType::ComboBox :
          #            case FormControlType::Date :
          #            case FormControlType::Grid :
          #            case FormControlType::Group :
          #            case FormControlType::Integer :
          #            case FormControlType::RadioButton :
          #            case FormControlType::Real :
          #            case FormControlType::StaticText :
          #            case FormControlType::String :
          #            case FormControlType::Time :
          #                formStringControl = formControl;
          #                if(formStringControl.dataField() && formDataSource.table())
          #                {
          #                    info(strfmt("Control Name   -> %1", formStringControl.name()), '', new SysInfoAction_Properties(node.treeNodePath()));
          #                    dictField = new SysDictField(formDataSource.table(), fieldExt2Id(formStringControl.dataField()));
          #                    info(strfmt('Table.Field       -> %2.%1',
          #                        fieldId2Name(formDataSource.table(), fieldExt2Id(formStringControl.dataField())),
          #                        tableId2Name(formDataSource.table())), '',
          #                        dictField ?  new SysInfoAction_Properties(dictField.treeNode().treeNodePath()): null);
          #
          #                    if(dictField)
          #                    {
          #                        info(strfmt('Type                -> %1', dictEnum.index2Symbol(dictField.baseType())));
          #
          #                        if(dictField.baseType() == typeOf(Types::Enum))
          #                        {
          #                            dictEnums = new SysDictEnum(dictField.enumId());
          #                            info(strfmt('Base Enum       -> %1', dictEnums.name()));
          #                        }
          #
          #                        info(strfmt('Ext Data Type -> %1', extendedTypeId2name(dictField.typeId())));
          #                        info(strfmt('Size                  ->  %1', int2str(dictField.stringLen())));
          #                        info(strfmt('Max Right        -> %1', dictField.rights()));
          #                        info(strfmt('Label                -> %1:  %2', dictField.labelLabel(), dictField.label()));
          #                        info(strfmt('Help                 -> %1:  %2', dictField.helpLabelId(),dictField.help()));
          #                    }
          #                }
          #
          #                if(formStringControl.dataMethod())
          #                {
          #                    info(strfmt('Method %1.%2', tableId2Name(formDataSource.table()), formStringControl.dataMethod()));
          #                }
          #                break;
          #            }
          #        }
          #}
        ENDSOURCE
        SOURCE #AxPath_getDataAreaId
          #//+ Dcs 04.04.2007 СБРFI-200703_02 KC
          #DataAreaId AxPath_getDataAreaId(str _extra)
          #{
          #    container params=this.AxPath_parseParams(_extra);
          #    int line;
          #    int pos;
          #    int i;
          #    str name;
          #    str value;
          #    DataAreaId DataAreaId;
          #;
          #    for (i=1; i<=conLen(params); i++)
          #    {
          #        [name, value] = conPeek(params, i);
          #        if (name=='Area')
          #            DataAreaId = value;
          #    }
          #    return DataAreaId;
          #}
          #//- Dcs 04.04.2007 СБРFI-200703_02 KC
        ENDSOURCE
        SOURCE #fitAndRemember
          #void fitAndRemember(HWND _child)
          #{
          #    boolean fixedWidth;
          #    boolean fixedHeight;
          #;
          #    [fixedWidth, fixedHeight] = this.fitWindow(_child);
          #    if (fixedWidth || fixedHeight)
          #        fixedWindows.insert(_child, [fixedWidth, fixedHeight]);
          #
          #}
        ENDSOURCE
        SOURCE #GetMaxSize
          #container getMaxSize(HWnd _hwnd)
          #{
          #//typedef struct {
          #//    POINT ptReserved; 0 (x:0, y:4)
          #//    POINT ptMaxSize;  8 (x:8, y:12)
          #//    POINT ptMaxPosition; 16 (x:16, y:20)
          #//    POINT ptMinTrackSize; 24 (x:24, y:28)
          #//    POINT ptMaxTrackSize; 32 (x:32, y:36)
          #//} MINMAXINFO; 40
          #    Binary ret=new Binary(4*2*5);
          #    Binary ptr=new Binary(4);
          #    int msx;
          #    int msy;
          #    int mpx;
          #    int mpy;
          #    int mtx;
          #    int mty;
          #    int mxtx;
          #    int mxty;
          #;
          #    ptr.binary(0, ret);
          #
          #//        WinApi::sendMessageEx(tabPageControl.hWnd(), #TCM_GETITEMRECT, 0, ptr.dWord(0));
          #    WinApi::sendMessageEx(_hwnd, #WM_GETMINMAXINFO,  0, ptr.dWord(0));
          #    msx = ret.dWord(8);
          #    msy = ret.dWord(12);
          #    mpx = ret.dWord(16);
          #    mpy = ret.dWord(20);
          #    mtx = ret.dWord(24);
          #    mty = ret.dWord(28);
          #    mxtx = ret.dWord(32);
          #    mxty = ret.dWord(36);
          #    return [ret.dWord(32), ret.dWord(36)];
          #}
        ENDSOURCE
        SOURCE #pathCombine
          #str pathCombine(str _path, str _part)
          #{
          #    return  _path + (this.strEndsWith(_path, '\\') ? '' : '\\') + _part;
          #}
        ENDSOURCE
        SOURCE #loadLanguageFile
          #void loadLanguageFile(str _fileName)
          #{
          #    AsciiIO io=new AsciiIO(_fileName, 'r');
          #    container data;
          #;
          #    if (!translations)
          #        translations=new Map(Types::String, Types::String);
          #    io.inFieldDelimiter('\r\n\r\n');
          #    io.inRecordDelimiter('\r\n---\r\n');
          #    data = io.read();
          #    while (data)
          #    {
          #        data = io.read();
          #        this.translate(conPeek(data, 1), conPeek(data, 2));
          #    }
          #}
        ENDSOURCE
        SOURCE #editConfiguration
          #void editConfiguration()
          #{
          #    boolean successful;
          #    Dialog d=new Dialog(#_('Tabax ')+v+#_(' preferences'));
          #    DialogField dialogMaxCaptionSize=d.addFieldValue(typeID(MaximumLength), maxCaptionSize,
          #        #_('Maximal caption size'));
          #    DialogField dialogFitMaximized=d.addFieldValue(typeID(NoYes), fitMaximized,
          #        #_('Fit maximized windows'), #_('Fit maximized windows to the client area'));
          #    DialogField dialogSameSize = d.addFieldValue(typeID(NoYes), sameTabSize, #_("Tabs have same size"));
          #    DialogField dialogMinTabSize = d.addFieldValue(typeID(Integer), minTabSize, #_("Minimal tab size"));
          #    DialogField dialogMaxTabSize = d.addFieldValue(typeID(Integer), maxTabSize, #_("Maximal tab size"));
          #    #fireEvent(beforeSetupDialog, (element, d))
          #    successful = d.run();
          #    if(successful)
          #    {
          #        maxCaptionSize = dialogMaxCaptionSize.value();
          #        fitMaximized = dialogFitMaximized.value();
          #        minTabSize = dialogMinTabSize.value();
          #        maxTabSize = dialogMaxTabSize.value();
          #        maxTabSize = max(0, maxTabSize);
          #        minTabSize = max(0, minTabSize);
          #        if (maxTabSize)
          #            minTabSize = min(minTabSize, maxTabSize);
          #        sameTabSize = dialogSameSize.value();
          #    }
          #    #fireEvent(afterSetupDialog, (element, d, successful))
          #}
        ENDSOURCE
        SOURCE #rememberOldWindow
          #void rememberOldWindow(Hwnd _hwnd)
          #{
          #;
          #    oldWindows.insert(_hwnd, [this.isIconic(_hwnd), this.getMdiClientRelativeRect(_hwnd)]);
          #}
        ENDSOURCE
        SOURCE #wasIconic
          #boolean wasIconic(HWnd _hwnd)
          #{
          #    boolean wasIconic;
          #    container oldPosition;
          #;
          #    if (oldWindows.exists(_hwnd))
          #    {
          #        [wasIconic, oldPosition] = oldWindows.lookup(_hwnd);
          #        return wasIconic;
          #    }
          #    return false;
          #}
        ENDSOURCE
        SOURCE #positionChanged
          #boolean positionChanged(HWnd _hwnd)
          #{
          #    boolean wasIconic;
          #    container oldPosition;
          #;
          #    if (oldWindows.exists(_hwnd))
          #    {
          #        [wasIconic, oldPosition] = oldWindows.lookup(_hwnd);
          #        return oldPosition!=this.getMdiClientRelativeRect(_hwnd);
          #    }
          #    return false;
          #}
        ENDSOURCE
        SOURCE #restoreNormalPosition
          #void restoreNormalPosition(Hwnd _hwnd)
          #{
          #    int x1;
          #    int y1;
          #    int x2;
          #    int y2;
          #    container normal;
          #;
          #    if (normalPositions.exists(_hwnd))
          #    {
          #        normal = normalPositions.lookup(_hwnd);
          #        [x1, y1, x2, y2] = normal;
          #        element.prepareToSide(_hwnd);
          #        WinApi::setWindowPos(_hwnd, x1, y1, x2-x1+1, y2-y1+1);
          #    }
          #}
        ENDSOURCE
        SOURCE #rememberNormalPosition
          #void rememberNormalPosition(Hwnd _hwnd)
          #{
          #    container position;
          #;
          #    position = element.getMdiClientRelativeRect(_hwnd);
          #    normalPositions.insert(_hwnd, position);
          #}
        ENDSOURCE
        SOURCE #openIcon
          #boolean openIcon(int _handle)
          #{
          #    return openIconFun.call(_handle)? true:false;
          #}
        ENDSOURCE
        SOURCE #loadDictionary
          #void loadDictionary()
          #{
          #    str lngFilePath;
          #;
          #    session = new Session();
          #    lngFilePath = this.getResourcePath('lang\\' + session.interfaceLanguage() + '.txt');
          #    if (lngFilePath)
          #        this.loadLanguageFile(lngFilePath);
          #}
        ENDSOURCE
        SOURCE #getText
          #str getText(str _s)
          #{
          #    return (translations && translations.exists(_s)) ? translations.lookup(_s) : _s;
          #}
        ENDSOURCE
        SOURCE #processMaximizations
          #void processMaximizations(HWnd _child)
          #{
          #    int idx;
          #    boolean wasIconic;
          #    container oldPosition;
          #    boolean fixedWidth;
          #    boolean fixedHeight;
          #    void deleteFromMaximized()
          #    {
          #    ;
          #        maximized.remove(_child);
          #        if (formIdentity.exists(_child))
          #        {
          #            idx = conFind(maximizedIdentities, formIdentity.lookup(_child));
          #            if (idx)
          #                maximizedIdentities = conDel(maximizedIdentities, idx, 1);
          #        }
          #    }
          #    if (this.isZoomed(_child))
          #    {
          #        if (maximized.in(_child) && !this.wasIconic(_child))
          #        {
          #            this.restoreNormalPosition(_child);
          #            deleteFromMaximized();
          #        }
          #        else
          #        {
          #            maximized.add(_child);
          #            if (formIdentity.exists(_child))
          #            {
          #                idx = conFind(maximizedIdentities, formIdentity.lookup(_child));
          #                if (!idx)
          #                    maximizedIdentities += formIdentity.lookup(_child);
          #                if (normalPositions.exists(_child))
          #                    identityNormalPositions.insert(formIdentity.lookup(_child), normalPositions.lookup(_child));
          #            }
          #            this.fitAndRemember(_child);
          #        }
          #    }
          #    else
          #    {
          #        if (maximized.in(_child))
          #        {
          #            if (!this.isIconic(_child))
          #            {
          #                if(this.positionChanged(_child))
          #                {
          #                    deleteFromMaximized();
          #                    this.rememberNormalPosition(_child);
          #                }
          #                else
          #                {
          #                    fixedWidth = false;
          #                    fixedHeight = false;
          #                    if (fixedWindows.exists(_child))
          #                    {
          #                        [fixedWidth, fixedHeight] = fixedWindows.lookup(_child);
          #                        this.fitWindow(_child, true, fixedWidth, fixedHeight);
          #                    }
          #                    else
          #                        this.fitAndRemember(_child);
          #                }
          #            }
          #            else
          #            {
          #                retoreIfRestored.add(_child);
          #                deleteFromMaximized();
          #            }
          #        }
          #        else
          #        {
          #            if (!this.isIconic(_child))
          #            {
          #                if (retoreIfRestored.in(_child))
          #                {
          #                    this.restoreNormalPosition(_child);
          #                    retoreIfRestored.remove(_child);
          #                }
          #                else
          #                {
          #                    this.rememberNormalPosition(_child);
          #                }
          #            }
          #        }
          #    }
          #    if (this.isIconic(_child))
          #        this.processIconic(_child);
          #    this.rememberOldWindow(_child);
          #}
          #
        ENDSOURCE
        SOURCE #processFormIdentity
          #void processFormIdentity()
          #{
          #    FormRun formRun;
          #;
          #    if (infolog.parmLastActivatedForm() && infolog.parmLastActivatedForm().object())
          #    {
          #        formRun = infolog.parmLastActivatedForm().object();
          #        if (formRun && formRun.args())
          #            formIdentity.insert(formRun.hWnd(), enum2str(formRun.args().menuItemType()) + ' ' + formRun.args().menuItemName() + ' ' + formRun.name());
          #    }
          #}
        ENDSOURCE
        SOURCE #getMdiClientRelativeRect
          #// returns rectangle relative to mdiClient
          #container getMdiClientRelativeRect(HWND _hwnd)
          #{
          #    int x1;
          #    int y1;
          #    int x2;
          #    int y2;
          #;
          #    [x1, y1, x2, y2] = this.getWindowRect(_hwnd);
          #    [x1, y1] = WinApi::screenToClient(mdiClient, x1, y1);
          #    [x2, y2] = WinApi::screenToClient(mdiClient, x2, y2);
          #    return [x1, y1, x2, y2];
          #}
        ENDSOURCE
        SOURCE #processFormIdentity_closing
          #void processFormIdentity_closing(HWnd _hwnd)
          #{
          #    FormRun formRun;
          #;
          #    if (formIdentity.exists(_hwnd))
          #        formIdentity.remove(_hwnd);
          #}
        ENDSOURCE
        SOURCE #getEvent
          #Set getEvent(str _id)
          #{
          #    Set ret;
          #    if (!events)
          #        events = new Map(Types::String, Types::Class);
          #    if (events.exists(_id))
          #        ret = events.lookup(_id);
          #    else
          #    {
          #        ret = new Set(Types::Class);
          #        events.insert(_id, ret);
          #    }
          #    return ret;
          #}
        ENDSOURCE
        SOURCE #processWindowAdd
          #void processWindowAdd(Hwnd _hwnd)
          #{
          #    int idx;
          #    str identity;
          #    if (formIdentity.exists(_hwnd))
          #    {
          #        idx = conFind(maximizedIdentities, formIdentity.lookup(_hwnd));
          #        if (idx)
          #        {
          #            //maximizedIdentities = conDel(maximizedIdentities, idx, 1);
          #            this.fitAndRemember(_hwnd);
          #            this.rememberOldWindow(_hwnd);
          #            maximized.add(_hwnd);
          #            identity = conPeek(maximizedIdentities, idx);
          #            if (identityNormalPositions.exists(identity))
          #                normalPositions.insert(_hwnd, identityNormalPositions.lookup(identity));
          #
          #        }
          #    }
          #}
        ENDSOURCE
        SOURCE #translate
          #void translate(str _en, str _local)
          #{
          #    ;
          #    translations.insert(_en, _local);
          #}
        ENDSOURCE
        SOURCE #subscribe
          #void subscribe(str _eventID, Object _o)
          #{
          #    this.getEvent(_eventID).add(_o);
          #}
        ENDSOURCE
        SOURCE #autoheight
          #void autoHeight()
          #{
          #    int x,y,w,h;
          #    int xt,yt,wt,ht;
          #    int h2;
          #    ;
          #    [xt,yt,wt,ht]=element.getWindowRect(tabs.Hwnd());
          #    [x,y,w,h]=element.getWindowRect(this.Hwnd());
          #    //ht = tabs.heightValue();
          #//    this.moveWindow(this.resizeHwnd(),x,y,_value,h-5,true);
          #    ht -= heightDecrement;
          #    if (ht!=h)
          #    {
          #        WINAPI::setWindowPos(this.Hwnd(),0,0, w - x, ht - y, true,false,
          #            32 //#SWP_FRAMECHANGED
          #            +
          #            256 //#SWP_NOCOPYBITS
          #        );
          #    }
          #}
        ENDSOURCE
        SOURCE #confirm
          #boolean confirm(str _message)
          #{
          #    return Box::yesNo(_message,
          #                DialogButton::No, 'tabax') == DialogButton::Yes;
          #}
        ENDSOURCE
        SOURCE #isZoomed
          #boolean isZoomed(int _handle)
          #{
          #    return isZoomedFun.call(_handle)? true:false;
          #}
        ENDSOURCE
        SOURCE #isAltButtonDown
          # // returns true if the shift button is pressed at the time of invocation
          ##define.VK_ALT(0x12)
          #static boolean isAltButtonDown()
          #{
          #    DLL         _winApiDLL      = new DLL('USER32');
          #    DLLFunction _getKeyState    = new DLLFunction(_winApiDLL, 'GetKeyState');
          #    int retval;
          #
          #    _getKeyState.returns(ExtTypes::Word);
          #    _getKeyState.arg(ExtTypes::DWord);
          #
          #    retval = _getKeyState.call(#VK_ALT);
          #
          #    return retval > 0x7FFF;
          #}
        ENDSOURCE
        SOURCE #license
          #str license()
          #{
          #    return #tabax_license;
          #}
        ENDSOURCE
        SOURCE #topmost
          #HWND topmost()
          #{
          #    return topmost;
          #}
        ENDSOURCE
        SOURCE #formByName
          #TreeNode formByName(str _name)
          #{
          #    return TreeNode::findNode(@'\Forms\'+_name);
          #}
        ENDSOURCE
        SOURCE #controlByName
          #/// returns control from form _form with the name _name
          #TreeNode controlByName(TreeNode _form, str _name)
          #{
          #    TreeNodeTraverser i = new TreeNodeTraverser(_form);
          #    TreeNode node = i.next();
          #    while (node)
          #    {
          #        if (match(@": +name: +#"+_name+': +', node.AOTgetProperties()))
          #            return node;
          #        node = i.next();
          #    }
          #    return null;
          #}
        ENDSOURCE
        SOURCE #tabIsSelected
          #boolean tabIsSelected(FormTabPageControl _page)
          #{
          #    return this.tabIndex(_page) ==
          #            WinApi::sendMessageEx(this.getParent(_page.hWnd()), #TCM_GETCURSEL, 0, 0);
          #}
        ENDSOURCE
        SOURCE #tabIndex
          #int tabIndex(FormTabPageControl tabPageControl)
          #{
          #    int hWnd;
          #    int i;
          #    int pos;
          #    str GetClassName(int _hWnd)
          #    {
          #        DLL         _Userdll        = new DLL("User32.dll");
          #        DLLFunction _getClassName   = new DLLFunction(_Userdll, "GetClassNameA");
          #        Binary      className       = new Binary(100);
          #        ;
          #        _getClassName.arg(ExtTypes::DWord, ExtTypes::Pointer, ExtTypes::DWord);
          #        _getClassName.returns(ExtTypes::DWord);
          #        if (_getClassName.call(_hWnd, className, 100))
          #            return className.string(0);
          #        else
          #            return "";
          #    }
          #    ;
          #    if (tabPageControl && tabPageControl.hWnd())
          #    {
          #        pos = 0;
          #        hWnd = tabPageControl.hWnd();
          #        while (hWnd)
          #        {
          #            hWnd = winapi::getWindow(hWnd, #GW_HWNDPREV);
          #            if (hWnd && GetClassName(hWnd) == #PaneWindowCL)
          #                pos++;
          #        }
          #    }
          #    return pos;
          #}
        ENDSOURCE
        SOURCE #setTabSelected
          #int setTabSelected(FormTabPageControl _page)
          #{
          #    int ret = WinApi::sendMessageEx(this.getParent(_page.hWnd()), #TCM_SETCURSEL, this.tabIndex(_page), 0);
          #    return ret;
          #}
        ENDSOURCE
        SOURCE #asserthasAccess
          #void assertHasAccess(SecurityKeyID _key, AccessType _type=AccessType::Edit, str _message='')
          #{
          #    DictSecurityKey key=new DictSecurityKey(_key);
          #    ;
          #    if (!hasSecuritykeyAccess(_key, _type))
          #        throw new error(
          #            _message ? _message :
          #            strFmt(
          #                element.getText('There is no access to "%1"'),
          #                key.label()
          #            )
          #         );
          #}
        ENDSOURCE
        SOURCE #assertDevelopment
          #void assertDevelopment()
          #{
          #;
          #    this.assertHasAccess(securityKeyNum(SysDevelopment));
          #}
        ENDSOURCE
        SOURCE #processEditBox
          #void processEditBox(str _s)
          #{
          #    TreeNode node = TreeNode::findNode(_s);
          #    boolean  skipDefault;
          #    str restOfString()
          #    {
          #        return subStr(_s, 2, strLen(_s)-1);
          #    }
          #;
          #    __eventHandlersEnumerator__                  = element.getEvent(identifierStr(beforeStringInput)).getEnumerator();
          #    while(__eventHandlersEnumerator__.moveNext() && !skipDefault)
          #        skipDefault                              = __eventHandlersEnumerator__.current().beforeStringInput(this, _s);
          #    if         (!skipDefault)
          #    {
          #        if     (node)
          #        {
          #            if (node.handle() == classNum(MemberFunction))
          #                node.AOTedit();
          #            else
          #                node.AOTnewWindow();
          #        }
          #        else   if (this.AxPath_accepts(_s))
          #            this.AxPath_go(_s);
          #        else   if (this.strStartsWith(_s, '?'))
          #            this.eval(restOfString());
          #        else   if (this.strStartsWith(_s, '!'))
          #            this.runScript(restOfString());
          #        //else
          #           //  this.axSearch(searchEd.text());
          #    }
          #}
        ENDSOURCE
        SOURCE #AxPath_fromFormRun
          #str AxPath_fromFormRun(FormRun _form, Args _args = _form.args())
          #{
          #    str ret;
          #    SysDictEnum menuItemTypeEnum;
          #    RecID recID;
          #;
          #    if (!_args.caller())
          #    {
          #        menuItemTypeEnum = new SysDictEnum(enumNum(MenuItemType));
          #        ret = #AxPath_prefix + '://' + #AxPath_MenuItemName + '/' +
          #            menuItemTypeEnum.value2Symbol(_args.menuItemType())
          #            + '/' + _args.menuItemName();
          #
          #        ret += '?' + fieldStr(Common, dataAreaId) + '=' + curext(); // Dcs 04.04.2007 СБРFI-200703_02 KC
          #
          #        if (_form.dataSourceCount())
          #        {
          #            recID = _form.dataSource(1).cursor().RecId;
          #            if (recID)
          #                ret += '&' + this.AxPath_keyByCommon(_form.dataSource(1).cursor());
          #        }
          #    }
          #    return ret;
          #}
        ENDSOURCE
        SOURCE #AxPath_getLineAndPos
          #container AxPath_getLineAndPos(str _extra)
          #{
          #    container params=this.AxPath_parseParams(_extra);
          #    int line;
          #    int pos;
          #    int i;
          #    str name;
          #    str value;
          #;
          #    for (i=1; i<=conLen(params); i++)
          #    {
          #        [name, value] = conPeek(params, i);
          #        if (name=='line')
          #            line=str2int(value);
          #        if (name=='pos')
          #            pos=str2int(value);
          #    }
          #    return [line, pos];
          #}
        ENDSOURCE
        SOURCE #menuItemTypeBySymbol
          #MenuItemType menuItemTypeBySymbol(str _symbol)
          #{
          #    return new SysDictEnum(enumNum(MenuItemType)).symbol2Value(_symbol);
          #}
        ENDSOURCE
        SOURCE #strStartsWith
          #boolean strStartsWith(str _s, str _possiblePrefix)
          #{
          #    return subStr(_s, 1, strLen(_possiblePrefix)) == _possiblePrefix;
          #}
        ENDSOURCE
        SOURCE #treeNode2TableID
          #TableID treeNode2TableID(TreeNode _node)
          #{
          #    TreeNode currentNode=_node;
          #    TableID ret;
          #    while (currentNode &&  !ret)
          #    {
          #        ret = SysTableBrowser::treeNode2TableId(currentNode);
          #        currentNode = currentNode.AOTparent();
          #    }
          #    return ret;
          #}
        ENDSOURCE
        SOURCE #currentSysContextMenu
          #SysContextMenu currentSysContextMenu()
          #{
          #    SysContextMenu ret;
          #    TreeNode node;
          #;
          #    if (this.isEditor(topmost))
          #        node = this.getCurMethod(topmost);
          #
          #    if (node)
          #        ret = new SysContextMenuTreeNode(node);
          #    else
          #        ret = new SysContextMenuAOT();
          #
          #    return ret;
          #}
        ENDSOURCE
        SOURCE #strEndsWith
          #boolean strEndsWith(str _sourceText, str _possibleSuffix)
          #{
          #    return subStr(_sourceText, strLen(_sourceText), -strLen(_possibleSuffix)) == _possibleSuffix;
          #}
          #
        ENDSOURCE
        SOURCE #isEditor
          #boolean isEditor(HWND _hwnd)
          #{
          #    str name = winapi::getWindowText(_hWnd);
          #    int i;
          #;
          #    for(i=1; i<=conLen(editorSuffixes); i++)
          #        if (this.strEndsWith(name, conPeek(editorSuffixes, i)))
          #            return true;
          #    return false;
          #}
        ENDSOURCE
        SOURCE #urlEscape
          #str urlEscape(str _s)
          #{
          #    DLL             dll = new DLL("shlwapi.dll");
          #    DLLFunction     URLEscape = new DLLFunction(dll, "UrlEscapeA");
          #    Binary          escaped = new Binary(strlen(_s)+1);
          #    Binary          cnt = new Binary(4);
          #    #define.E_POINTER(0x80004003)
          #    ;
          #    URLEscape.arg(ExtTypes::String, ExtTypes::Pointer, ExtTypes::Pointer, ExtTypes::DWord);
          #    URLEscape.returns(ExtTypes::DWord);
          #    cnt.dWord(0, strlen(_s)+1);
          #    if (URLEscape.call(_s, escaped, cnt, 0) == #E_POINTER)
          #    {
          #        escaped = new Binary(cnt.dWord(0)+1);
          #        URLEscape.call(_s, escaped, cnt, 0);
          #    }
          #    return escaped.string(0);
          #}
        ENDSOURCE
        SOURCE #axSearch
          #void axSearch(str _text)
          #{
          #;
          #    WinApi::shellExecute(
          #    @'http://www.google.com/custom?cx=017570198198700603454%3A2g4miqgpmoe&q='
          #    +
          #    this.urlEscape(_text)
          #    +
          #    @'&cof=CX%3AAxSearch%3BFORID%3A0'
          #    );
          #}
        ENDSOURCE
        SOURCE #task
          #public int task(int _taskId)
          #{
          #    #task
          #    int ret;
          #
          #    if (_taskId != #taskEsc)
          #        ret = super(_taskId);
          #
          #    //if (_taskID==#taskEnter)
          #    //    this.processEditBox(searchEd.text());
          #
          #    return ret;
          #}
        ENDSOURCE
        SOURCE #currentTable
          #tableID currentTable()
          #{
          #    #TreeNodeSysNodeType
          #    SysFormRun formRun;
          #    FormDataSource ds;
          #    TableID tableID;
          #    SysContextMenu context;
          #    TreeNode node;
          #;
          #    formRun=element.currentFormRun();
          #    if (!formRun)
          #        formRun=Infolog.setLastActivatedForm().object();
          #
          #    if(formRun && formRun.dataSourceCount()>0)
          #    {
          #        ds=formRun.objectSet();
          #        if (ds)
          #            tableID=ds.table();
          #    }
          #    if (!tableID)
          #    {
          #        context = this.currentSysContextMenu();
          #        if (context)
          #        {
          #            node = context.first();
          #            while (node && !tableID)
          #            {
          #                tableID = this.treeNode2TableID(node);
          #                if (tableID)
          #                    tableID = this.treeNode2TableID(node);
          #                node = context.next();
          #            }
          #        }
          #    }
          #    return tableID;
          #}
        ENDSOURCE
        SOURCE #installPlugs
          #void installPlugs()
          #{
          #    #File
          #    container parseName(str _s)
          #    {
          #        int pos=strscan(_s, '_', 1, strLen(_s));
          #        return [subStr(_s, 1, pos-1), subStr(_s, pos+1, strLen(_s) - pos)];
          #    }
          #
          #    void addButton(str _path, str _fileName)
          #    {
          #        str name = subStr(_fileName, 1, strLen(_fileName) - 4);
          #        FormFunctionButtonControl   button;
          #        str type;
          #        str itemName;
          #        ;
          #        [type, itemName] = parseName(name);
          #        //button = plugTools.addControl(FormControlType::MenuFunctionButton, name+'_button');
          #        if (type=='action')
          #            button.menuItemType(MenuItemType::Action);
          #
          #        if (type=='display')
          #            button.menuItemType(MenuItemType::Display);
          #
          #        if (type=='output')
          #            button.menuItemType(MenuItemType::Output);
          #
          #        button.menuItemName(itemName);
          #        button.buttonDisplay(FormButtonDisplay::ImageOnly);
          #        button.border(FormButtonBorder::Flat);
          #        button.backStyle(FormBackStyle::Transparent);
          #        button.normalImage(_path);
          #    }
          #    FileName fullFileName(FileName _path, FileName _fileName)
          #    {
          #        FileName    pathName;
          #        FileName    fileName;
          #        FileName    fileExtension;
          #        ;
          #        [pathName,fileName,fileExtension] = fileNameSplit(_fileName);
          #        return _path + '\\' + fileName + fileExtension;
          #    }
          #
          #    void findFiles(FileName _path, FileName _fileName)
          #    {
          #        FileName    fileName;
          #        int         hdl;
          #        ;
          #        if (WinAPI::folderExists(_path))
          #        {
          #            [hdl, fileName] = WinApi::findFirstFile(fullFileName(_path,_fileName));
          #            while (fileName)
          #            {
          #                if (WinAPI::fileExists(fullFileName(_path,fileName)))
          #                    addButton(fullFileName(_path, fileName), fileName);
          #                fileName = WinApi::findNextFile(hdl);
          #            }
          #            WinApi::findClose(hdl);
          #        }
          #    }
          #;
          #    findFiles(xInfo::directory(DirectoryType::Include)+'Tabax\\Plugs', '*.'+#imageExt);
          #}
        ENDSOURCE
        SOURCE #toStr
          #/// returns the string representation of given argument
          #str toStr(AnyType _value)
          #{
          #    Object o;
          #    int i;
          #    str ret;
          #;
          #    if(typeOf(_value)==Types::AnyType && !_value)
          #        return '<NoResult>';
          #    if(typeOf(_value)==Types::Class)
          #    {
          #        o=_value;
          #        return strFmt('%1', o.toString());
          #    }
          #    if(typeOf(_value)==Types::Container)
          #    {
          #        for(i=1;i<=conLen(_value);i++)
          #        {
          #            if(ret)
          #                ret+=", ";
          #            ret += this.toStr(conPeek(_value, i));
          #        }
          #        return "["+ret+"]";
          #    }
          #    if(typeOf(_value)==Types::String || typeOf(_value)==Types::VarString)
          #    {
          #        return strFmt("'%1'", _value);
          #    }
          #    return strFmt('%1', _value);
          #}
          #
        ENDSOURCE
        SOURCE #run
          #public void run()
          #{
          #    SysGlobalCache cache=infolog.globalCache();
          #    FormRun        formRun;
          #;
          #    cache.set(this.name(), 'instance', this);
          #    super();
          #    this.buildButtons();
          #    //this.play();
          #}
        ENDSOURCE
        SOURCE #isIconic
          #boolean isIconic(int _handle)
          #{
          #    return isIconicFun.call(_handle)? true:false;
          #}
        ENDSOURCE
        SOURCE #runSysContextMenu
          #void runSysContextMenu(identifiername _menuItemName, MenuItemType _menuItemType, SysContextMenu _context = this.currentSysContextMenu())
          #{
          #    MenuFunction menuFunction;
          #    Args         args;
          #;
          #    if (_context)
          #    {
          #        args = new Args();
          #        if(_context.verifyItem(_menuItemName, _menuItemType))
          #        {
          #            menuFunction = new MenuFunction(_menuItemName, _menuItemType);
          #            args.parmObject(_context);
          #            args.caller(this);
          #            menuFunction.run(args);
          #        }
          #    }
          #}
        ENDSOURCE
        SOURCE #truncHeader
          #str truncHeader(str _h)
          #{
          #    if (maxCaptionSize && (strlen (_h) > maxCaptionSize))
          #    {
          #        _h = strdel (_h, maxCaptionSize, strlen(_h));
          #        _h +=  "...";
          #    }
          #    return _h;
          #}
          #
        ENDSOURCE
        SOURCE #resize
          #public void resize(int _width, int _height)
          #{
          #    super(_width, _height);
          #    element.adjustTabPageSize(tabs);
          #}
        ENDSOURCE
        SOURCE #currentFormRun
          #FormRun currentFormRun()
          #{
          #    return currentFormRun ? currentFormRun.object() : null;
          #}
        ENDSOURCE
        SOURCE #loadImage
          #void loadImage(FormButtonControl _but, str _name)
          #{
          #    str imgDir=XInfo::directory(DirectoryType::Include);
          #    str subPath = _name+'.' + #imageExt;
          #    str imageFilePath = this.getResourcePath(subPath);
          #;
          #    if (!imageFilePath)
          #        warning("Tabax: Image not found: '" + this.fullInculdePath(subPath) + "' or resource '"+ this.resourceName(subPath)+"'");
          #    _but.normalImage(imageFilePath);
          #}
        ENDSOURCE
        SOURCE #isWindowVisible
          #boolean isWindowVisible(int _handle)
          #{
          #    return isWindowVisibleFun.call(_handle)? true:false;
          #}
        ENDSOURCE
        SOURCE #moveWindow
          #boolean moveWindow(HWND _handle, int _x, int _y, int _w, int _h, boolean _repaint)
          #{
          #  boolean ret;
          #    DLL         _DLL             = new DLL('USER32');
          #    DLLFunction _setwPos         = new DLLFunction(_DLL, 'MoveWindow');
          #    int         _dllret;
          #    ;
          #    ret = FALSE;
          #
          #    _setwPos.returns(ExtTypes::DWord); // BOOL
          #    _setwPos.arg(ExtTypes::DWord);     // handle window
          #    _setwPos.arg(ExtTypes::DWord);     // x
          #    _setwPos.arg(ExtTypes::DWord);     // y
          #    _setwPos.arg(ExtTypes::DWord);     // cx
          #    _setwPos.arg(ExtTypes::DWord);     // cy
          #    _setwPos.arg(ExtTypes::DWord);     // repaint;
          #
          #    _dllRet = _setwPos.call(_handle,  _x, _y, _w, _h, _repaint);
          #
          #    return _dllRet?true:false;
          #}
        ENDSOURCE
        SOURCE #setWPos
          #int setWPos(
          #                           int              _handle,
          #                           int              _hWndInsertAfter,
          #                           int              _left,
          #                           int              _top,
          #                           int              _width,
          #                           int              _height,
          #                           int              _flags    = 0     )
          #
          #{
          #  boolean ret;
          #    DLL         _DLL             = new DLL('USER32');
          #    DLLFunction _setwPos         = new DLLFunction(_DLL, 'SetWindowPos');
          #    int         _dllret;
          #    ;
          #    ret = FALSE;
          #
          #    _setwPos.returns(ExtTypes::DWord); // BOOL
          #    _setwPos.arg(ExtTypes::DWord);     // handle window
          #    _setwPos.arg(ExtTypes::DWord);     // handle to Z Order window
          #    _setwPos.arg(ExtTypes::DWord);     // x
          #    _setwPos.arg(ExtTypes::DWord);     // y
          #    _setwPos.arg(ExtTypes::DWord);     // cx
          #    _setwPos.arg(ExtTypes::DWord);     // cy
          #    _setwPos.arg(ExtTypes::DWord);     // flags;
          #
          #    _dllRet = _setwPos.call(_handle, _hWndInsertAfter, _left, _top, _width, _height, _flags );
          #    if (_dllRet) {
          #        ret = TRUE;
          #    }
          #
          #  return ret;
          #}
        ENDSOURCE
        SOURCE #openedProjects
          #Map openedProjects()
          #{
          #    if(!openedProjects)
          #        openedProjects=new Map(Types::String, Types::Integer);
          #    return openedProjects;
          #}
        ENDSOURCE
        SOURCE #setCap
          #void setCap(str _txt)
          #{
          #    this.design().caption('tabax '+v+'\\'+_txt);
          #}
        ENDSOURCE
        SOURCE #fitWindow
          #container fitWindow(hwnd _w, boolean _skipPrepare = false, boolean _skipWidth = false, boolean _skipHeight=false)
          #{
          #    int x1;
          #    int y1;
          #    int x2;
          #    int y2;
          #
          #    int wx1;
          #    int wy1;
          #    int wx2;
          #    int wy2;
          #    int maxw;
          #    int maxh;
          #    int w;
          #    int h;
          #    Binary msg = new Binary(30);
          #    int                 i;
          #    boolean ret;
          #    boolean fixedWidth;
          #    boolean fixedHeight;
          #;
          #    if (this.isIconic(_w))
          #        this.openIcon(_w);
          #
          #    if (!_skipPrepare)
          #    {
          #        this.prepareToSide(_w);
          #
          #        for (i=1;i<=4;i++)
          #           if (peekMessage.call(msg, 0, 0, 0, 1))
          #           {
          #               TranslateMessage.call(msg);
          #               dispatchMessage.call(msg);
          #           }
          #    }
          #
          #    [x1,y1,x2,y2]=element.getClientRect(MdiClient);
          #
          #    [wx1,wy1,wx2,wy2] = element.getMdiClientRelativeRect(_w);
          #    [maxw, maxh] = this.getMaxSize(_w);
          #    //w=min(x2-x1, maxw);
          #    //h=min(y2-y1, maxh);
          #    w=x2-x1;
          #    h=y2-y1;
          #    if (_skipWidth)
          #        w = wx2 - wx1;
          #    if (_skipHeight)
          #        h = wy2 - wy1;
          #    if ([wx1,wy1,wx2,wy2]!=[0, 0, w, h])
          #    {
          #        ret = WinApi::setWindowPos(_w, 0, 0, w, h, false, false, #SWP_NOACTIVATE);
          #        [wx1,wy1,wx2,wy2] = element.getMdiClientRelativeRect(_w);
          #
          #        for (i=1;i<=4;i++)
          #           if (peekMessage.call(msg, 0, 0, 0, 1))
          #           {
          #               TranslateMessage.call(msg);
          #               dispatchMessage.call(msg);
          #           }
          #        [x1,y1,x2,y2]=element.getClientRect(MdiClient);
          #        w=x2-x1;
          #        h=y2-y1;
          #        if (_skipWidth)
          #            w = wx2 - wx1 + 1;
          #        if (_skipHeight)
          #            h = wy2 - wy1 + 1;
          #
          #        ret = WinApi::setWindowPos(_w, 0, 0, w, h, false, false, #SWP_NOACTIVATE);
          #        [wx1,wy1,wx2,wy2] = element.getMdiClientRelativeRect(_w);
          #        fixedWidth = wx2 != (x2-x1);
          #        fixedHeight = wy2 != (y2-y1);
          #    }
          #    return [fixedWidth, fixedHeight];
          #}
        ENDSOURCE
        SOURCE #saveAll
          #void saveAll()
          #{
          #    ;
          #    xSysLastValue::saveLast(this);
          #}
        ENDSOURCE
        SOURCE #addMRUProject
          #void addMRUProject(str _name)
          #{
          #    int idx=conFind(mruProjects, _name);
          #    if(idx)
          #        mruProjects=conDel(mruProjects, idx, 1);
          #    mruProjects=[_name]+mruProjects;
          #}
        ENDSOURCE
        SOURCE #bottomSide
          #void bottomSide(hwnd _w)
          #{
          #    int x1,y1,x2,y2;
          #    ;
          #    [x1,y1,x2,y2]=this.prepareToSide(_w);
          #    WinApi::setWindowPos(_w,0,(y2-y1)/2+1,x2-x1, (y2-y1)/2-2);
          #}
        ENDSOURCE
        SOURCE #topSide
          #void topSide(hwnd _w)
          #{
          #    int x1,y1,x2,y2;
          #    ;
          #    [x1,y1,x2,y2]=this.prepareToSide(_w);
          #    WinApi::setWindowPos(_w,0,0,x2-x1, (y2-y1)/2);
          #}
        ENDSOURCE
        SOURCE #getParent
          #hwnd getParent(hwnd _window=this.hWnd())
          #{
          #    DLL         _winApiDLL      = new DLL('user32');
          #    DLLFunction fun  = new DLLFunction(_winApiDLL, 'GetParent');
          #
          #    fun.returns(ExtTypes::DWord);
          #
          #    fun.arg(ExtTypes::DWord);
          #
          #    return fun.call(_window);
          #}
        ENDSOURCE
        SOURCE #lists_top
          #private List lists_top()
          #{
          #    return lists.value(lists_sp);
          #}
        ENDSOURCE
        SOURCE #newIterator
          #void newIterator(TreeNode _node)
          #{
          #    iterators=new Array(Types::Class);
          #    lists=new Array(Types::Class);
          #    tniterator=_node.AOTiterator();
          #}
        ENDSOURCE
        SOURCE #canClose
          #public boolean canClose()
          #{
          #//    if(!collapsed)
          #//    {
          #//        this.collapse();
          #//        return false;
          #//    }
          #    return true;
          #}
        ENDSOURCE
        SOURCE #prepareToSide
          #container prepareToSide(HWND _w)
          #{
          #    //hWnd MdiClient = WinAPI::FindWindowEx(infolog.hWnd(), 0, 'MDIClient', '');
          #;
          #    WinAPI::sendMessageEx(_w, #WM_SYSCOMMAND, #SC_RESTORE, 0);
          #    return this.getClientRect(MdiClient);
          #}
        ENDSOURCE
        SOURCE #getClientRect
          #container getClientRect(hwnd _window)
          #{
          #    Binary      data            = new Binary(32);
          #    DLL         _winApiDLL      = new DLL('user32');
          #    DLLFunction fun  = new DLLFunction(_winApiDLL, 'GetClientRect');
          #
          #    fun.returns(ExtTypes::DWord);
          #
          #    fun.arg(ExtTypes::DWord, ExtTypes::Pointer);
          #    fun.call(_window, data);
          #
          #    return [data.dWord(0), data.dWord(4), data.dWord(8), data.dWord(12)];
          #}
        ENDSOURCE
        SOURCE #leftSide
          #void leftSide(hwnd _w)
          #{
          #    int x1,y1,x2,y2;
          #    ;
          #    [x1,y1,x2,y2]=this.prepareToSide(_w);
          #    WinApi::setWindowPos(_w,0,0,(x2-x1)/2, y2-y1);
          #}
        ENDSOURCE
        SOURCE #rightSide
          #void rightSide(hwnd _w)
          #{
          #    int x1,y1,x2,y2;
          #    ;
          #    [x1,y1,x2,y2]=this.prepareToSide(_w);
          #    WinApi::setWindowPos(_w,(x2-x1)/2+1,0,(x2-x1)-((x2-x1)/2+1)-2, y2-y1);
          #}
        ENDSOURCE
        SOURCE #getWindowRect
          #container getWindowRect(hwnd _window)
          #{
          #    Binary      data            = new Binary(32);
          #    DLL         _winApiDLL      = new DLL('user32');
          #    DLLFunction fun  = new DLLFunction(_winApiDLL, 'GetWindowRect');
          #
          #    fun.returns(ExtTypes::DWord);
          #
          #    fun.arg(ExtTypes::DWord, ExtTypes::Pointer);
          #    fun.call(_window, data);
          #
          #    return [data.dWord(0), data.dWord(4), data.dWord(8), data.dWord(12)];
          #}
        ENDSOURCE
        SOURCE #close
          #public void close()
          #{
          #    str name=this.name();
          #    SysGlobalCache cache=infolog.globalCache();
          #;
          #    #fireEvent(beforeClose, (this))
          #    cache.remove(name, 'instance');
          #   // this.pause();
          #    super();
          #    element.removeTabPageImageList(tabs);
          #    this.saveAll();
          #}
        ENDSOURCE
        SOURCE #applyChanges
          #void applyChanges()
          #{
          #    container          forRemove;
          #    container          forUpd;
          #    container          forAdd;
          #    FormDesign         fd = element.design();
          #    int                i;
          #    int                id;
          #                       // FormTreeItem item;
          #    HWnd               handle;
          #    int                image;
          #    str                title;
          #    FormTabPageControl itemHandle;
          #    FormTabPageControl activePage;
          #    int                selected;
          #    boolean            updated;
          #    boolean            historyChanged;
          #    str                windowText;
          #    int                tabsCount;
          #    ;
          #    [forRemove, forUpd, forAdd, selected]=this.changes();
          #    if(conLen(forRemove)>0 || conLen(forAdd)>0 || conLen(forUpd)>0)
          #    {
          #        //tabs.lockWindowUpdate(true);
          #        updated=true;
          #
          #        for(i=1;i<=conLen(forUpd);i++)
          #        {
          #            handle=conPeek(forUpd, i);
          #            itemHandle=windows.lookup(handle);
          #            windowText=WinApi::getWindowText(handle);
          #            [image, title]=this.getImageAndTitle(windowText);
          #            itemHandle.caption(element.truncHeader(title));
          #            itemHandle.helpText(title);
          #            titles.insert(handle, windowText);
          #            #fireEvent(afterWindowUpdated, (this, handle, title))
          #        }
          #
          #        //itemHandle=lastAdded;
          #        for(i=1;i<=conLen(forAdd);i++)
          #        {
          #            handle=conPeek(forAdd, i);
          #            windowText=WinApi::getWindowText(handle);
          #            [image, title]=this.getImageAndTitle(windowText);
          #            if(image==imgApp.image(#ImageProject))
          #            {
          #                this.addMRUProject(title);
          #                if(!this.openedProjects().exists(title))
          #                    this.openedProjects().insert(title, handle);
          #                historyChanged=true;
          #            }
          #            //item = new FormTreeItem(title,image,0, handle);
          #            //itemHandle=tree.addItem(0, itemHandle, item);
          #            itemHandle=tabs.addControl(FormControlType::TabPage, 't'+int2str(handle));
          #            #if.ax4
          #                itemHandle.scrollbars(false);
          #            #endif
          #            itemHandle.caption(element.truncHeader(title));
          #            itemHandle.helpText(title);
          #            itemHandle.verticalSpacing(0, AutoMode::Fixed);
          #            itemHandle.topMargin(0, AutoMode::Fixed);
          #            itemHandle.bottomMargin(0, AutoMode::Fixed);
          #            //itemHandle.
          #            //heightDecrement = itemHandle.topMargin() + itemHandle.bottomMargin() / 2;
          #            element.setTabPageImageIndex(itemHandle, image+1);
          #
          #            //itemHandle=tree.addItem(0, 0, item);
          #            //lastAdded=itemHandle;
          #            windows.insert(handle, itemHandle);
          #            titles.insert(handle, windowText);
          #            this.processWindowAdd(handle);
          #            #fireEvent(afterWindowOpened, (this, handle, title))
          #        }
          #        //tabs.lockWindowUpdate(false);
          #    }
          #    if(conLen(forRemove))
          #    {
          #        if(tabs.tabs())
          #        {
          #            inDeletion=true;
          #            itemHandle=tabs.controlNum(1);
          #            itemHandle.activatePage();
          #            inDeletion=false;
          #        }
          #    }
          #
          #    for(i=1;i<=conLen(forRemove);i++)
          #    {
          #        handle=conPeek(forRemove, i);
          #        itemHandle=windows.lookup(handle);
          #        tabsCount = tabs.controlCount();
          #        if (maximized.in(handle))
          #        {
          #//            if (formIdentity.exists(handle))
          #//                maximizedIdentities += formIdentity.lookup(handle);
          #            maximized.remove(handle);
          #        }
          #        this.processFormIdentity_closing(handle);
          #        if (oldWindows.exists(handle))
          #            oldWindows.remove(handle);
          #
          #        if (!itemHandle.isActivePage() || tabsCount==1)
          #        {
          #            windows.remove(handle);
          #            id = itemHandle.id();
          #            if (desktopWindow)
          #                this.apiLockWindowUpdate(desktopWindow);
          #            try
          #            {
          #                element.design().removeControl(id);
          #            }
          #            catch
          #            {
          #            }
          #            if (desktopWindow)
          #                this.apiLockWindowUpdate(0);
          #           titles.remove(handle);
          #        }
          #        if (fixedWindows.exists(handle))
          #            fixedWindows.remove(handle);
          #        #fireEvent(afterWindowClosed, (this, handle))
          #    }
          #    if(updated)
          #        element.adjustTabPageSize(tabs);
          #
          #    if(selected)
          #    {
          #        itemHandle=windows.lookup(selected);
          #        if(!this.tabIsSelected(itemHandle))
          #        {
          #            this.setTabSelected(itemHandle);
          #            itemHandle.activatePage();
          #            updated=true;
          #        }
          #    }
          #    //tabs.lockWindowUpdate(false);
          #    element.autoHeight();
          #}
        ENDSOURCE
        SOURCE #Changes
          #container changes()
          #{
          #    MapIterator i=new MapIterator(windows);
          #    container actual=this.getWindows();
          #    container existing;
          #    int j;
          #    container forRemove;
          #    container forUpd;
          #    container forAdd;
          #    hwnd selected;
          #    ;
          #    [selected]=actual;
          #    while(i.more())
          #    {
          #        if(conFind(actual, i.key()))
          #        {
          #            if(titles.lookup(i.key())!=WinApi::getWindowText(i.key()))
          #                forUpd+=i.key();
          #            existing+=i.key();
          #        }
          #        else
          #        {
          #            forRemove+=i.key();
          #        }
          #        i.next();
          #    }
          #
          #    for(j=1;j<=conLen(actual);j++)
          #    {
          #        if(!conFind(existing, conPeek(actual, j)))
          #            forAdd+=[conPeek(actual, j)];
          #    }
          #    return [forRemove, forUpd, forAdd, selected];
          #}
        ENDSOURCE
        SOURCE #getImageAndTitle
          #container getImageAndTitle(str _header)
          #{
          #    str path;
          #    int i, img;
          #    boolean startsWith(str _s1, str _s2){
          #        return strScan(_s1, _s2, 1, strLen(_s1))==1;
          #    }
          #    ;
          #    for(i=1;i<=conlen(this.pathes());i++)
          #    {
          #        [path, img]=conPeek(this.pathes(),i);
          #        if(startsWith(_header, path))
          #            return [imgApp.image(img),
          #                strDel(_header, 1, strLen(path))];
          #
          #        if (!path)
          #            switch (_header)
          #            {
          #                case "Репозитарий прикладных объектов":
          #                    return [imgApp.image(#ImageAOT), _header];
          #                case @"\Projects":
          #                    return [imgApp.image(#ImageProjects), _header];
          #            }
          #    }
          #
          #    return [0, _header];
          #}
        ENDSOURCE
        SOURCE #pathes
          #container pathes()
          #{
          #    if(!p)
          #        p=
          #        [
          #            ["\\Data Dictionary\\Tables\\", #imageTable],
          #            ["\\Data Dictionary\\Maps\\", #imageTableMap],
          #            ["\\Data Dictionary\\Views\\", #imageView],
          #            ["\\Data Dictionary\\Extended Data Types\\", #imageEDT],
          #            ["\\Data Dictionary\\Base Enums\\", #imageBaseEnum],
          #            #if.imageFeatureKey
          #            ["\\Data Dictionary\\Feature Keys\\", #imageFeatureKey],
          #            #endif
          #            ["\\Data Dictionary\\License Codes\\", #imageLicenseCode],
          #            ["\\Data Dictionary\\Configuration Keys\\", #imageConfigurationKeys],
          #            ["\\Data Dictionary\\Security Keys\\", #imageSecurityKeys],
          #            ["\\Data Dictionary\\Table Collections\\", #imageTableCollections],
          #            ["\\Macros\\", #imageMacros],
          #            ["\\Classes\\", #imageClass],
          #            ["\\Forms\\", #imageForm],
          #            ["\\Reports\\", #imageReport],
          #            ["\\Queries\\", #imageQuery],
          #            ["\\Jobs\\", #imageJob],
          #            ["\\Menus\\", #imageMenu],
          #            ["@SYS71148", #imageMenuMain],
          #            ["\\Menu Items\\Display\\", #ImageMenuDisplayItems],
          #            ["\\Menu Items\\Output\\", #imageMenuActionItems],
          #            ["\\Menu Items\\Action\\", #imageMenuOutputItems],
          #            ["\\System Documentation\\Classes\\", #ImageDocumentationItem],
          #            ["\\System Documentation\\Functions\\", #ImageDocumentationItemBlue],
          #            ["\\System Documentation\\Property\\", #ImageDocumentationItem],
          #            ["\\System Documentation\\Tables\\", #ImageDocumentationItem],
          #            ["\\System Documentation\\Types\\", #ImageDocumentationItem],
          #            ["\\System Documentation\\Enums\\", #ImageDocumentationItem],
          #            ["\\System Documentation\\Feature Keys\\", #ImageDocumentationItem],
          #            #if.ImageReference
          #            ["\\References\\", #ImageReference],
          #            #endif
          #            #if.imageHelpFile
          #            ["\\HTML Help Files\\", #imageHelpFile],
          #            #endif
          #            #localmacro.prefix
          #                [%1, #ImageProject],
          #            #endmacro
          #            #projectPrefixes
          #            ["", #ImagePlay]
          #        ];
          #    return p;
          #}
        ENDSOURCE
        SOURCE #getWindows
          #container getWindows()
          #{
          #    container ret;
          #    //hWnd MdiClient = WinAPI::FindWindowEx(infolog.hWnd(), 0, 'MDIClient', '');
          #    hWnd child;
          #    str windowText;
          #    map     children = new map(Types::Integer, Types::String);
          #    int c;
          #    FormRun activeFormRun;
          #    boolean isActiveForm(HWnd _hwnd)
          #    {
          #        return _hwnd == WinApi::getForegroundWindow() || _hwnd == topmost;
          #    }
          #;
          #    topmost=0;
          #    second=0;
          #
          #    for (child = WinAPI::FindWindowEx(MdiClient, 0, '', '');
          #         child && !children.exists(child);
          #         child = WinAPI::FindWindowEx(MdiClient, child, '', ''))
          #    {
          #        if (Child != 0)
          #        {
          #            if (Children.exists(Child))
          #                break;
          #
          #            WindowText = WinAPI::getWindowText(child);
          #
          #            //if (WindowText != "" && isWindowVisible(child))
          #            if(this.isWindowVisible(child))
          #            {
          #                if (fitMaximized)
          #                    this.processMaximizations(child);
          #                if(!topmost)
          #                {
          #                    topmost=Child;
          #                    if(infolog.setLastActivatedForm())
          #                        activeFormRun=infolog.setLastActivatedForm().object();
          #                    //if(activeFormRun && activeFormRun.hWnd()==topmost)
          #                    if(activeFormRun && isActiveForm(activeFormRun.hWnd()))
          #                    {
          #                        currentFormRun=new ObjectIdent(activeFormRun);
          #                        currentFormRun_hwnd = topmost;
          #                    }
          #                    else
          #                    {
          #                        if(this.currentFormRun() && currentFormRun_hwnd!=topmost)
          #                        {
          #                            currentFormRun_hwnd = 0;
          #                            currentFormRun=null;
          #                        }
          #                    }
          #                }
          #                else
          #                    if(!second)
          #                        second=Child;
          #                children.insert(Child, WindowText);
          #                ret+=[Child];
          #            }
          #        }
          #
          #        c ++;
          #        if (c > 1000)
          #            throw error("deadlock interrupted");
          #    }
          #    return ret;
          #}
        ENDSOURCE
        SOURCE #BuildButtons
          #void buildButtons()
          #{
          #;
          #    this.processFormIdentity();
          #    this.applyChanges();
          #    #fireEvent(tick, (this))
          #    windowsScanTimer = this.setTimeOut(identifierStr(buildButtons), #windowsScanTimer);
          #}
        ENDSOURCE
        SOURCE #init
          #public void init()
          #{
          #    str dummy;
          #    int i;
          #    int img;
          #;
          #    v=#v;
          #    super();
          #    this.attachPlugins();
          #    editorSuffixes = [
          #        ' - Редактор',
          #        ' - Editor'
          #    ];
          #    oldWindows = new Map(Types::Integer, Types::Container);
          #    fixedWindows = new Map(Types::Integer, Types::Container);
          #    //menuUsageStatistics=new Map(Types::String, Types::Container);
          #    maximized = new Set(Types::Integer);
          #    this.loadDictionary();
          #    normalPositions = new Map(Types::Integer, Types::Container);
          #    formIdentity = new Map(Types::Integer, Types::String);
          #    identityNormalPositions = new Map(Types::String, Types::Container);
          #    retoreIfRestored  = new Set(Types::Integer);
          #
          #    this.setCap('windows');
          #    //vtxt.text('sidax v'+v);
          #    /*aboutBut.border(
          #    tableBrowserBut.border(
          #    editBut.border(
          #    tileHorBut.border(
          #        tileVerBut.border(
          #        leftBut.border(
          #        rightBut.border(
          #        topBut.border(
          #        bottomBut.border(
          #                FormButtonBorder::Flat
          #            ))))))))); */
          #    this.installPlugs();
          #    hand=WinApi::loadStdCursor(#IDC_CROSS);
          #    //this.loadImages();
          #
          #    user32             = new DLL('USER32');
          #
          #    isIconicFun = new DLLFunction(user32, 'IsIconic');
          #    isIconicFun.returns(ExtTypes::DWord);
          #    isIconicFun.arg(ExtTypes::DWord);
          #
          #    isZoomedFun = new DLLFunction(user32, 'IsZoomed');
          #    isZoomedFun.returns(ExtTypes::DWord);
          #    isZoomedFun.arg(ExtTypes::DWord);
          #
          #
          #    isWindowVisibleFun = new DLLFunction(user32, 'IsWindowVisible');
          #    isWindowVisibleFun.returns(ExtTypes::DWord);
          #    isWindowVisibleFun.arg(ExtTypes::DWord);
          #
          #    OpenIconFun = new DLLFunction(user32, 'OpenIcon');
          #    OpenIconFun.returns(ExtTypes::DWord);
          #    OpenIconFun.arg(ExtTypes::DWord);
          #
          #   peekMessage     = new DLLFunction(user32, 'PeekMessageA');
          #   TranslateMessage= new DLLFunction(user32, 'TranslateMessage');
          #   dispatchMessage = new DLLFunction(user32, 'DispatchMessageA');
          #    peekMessage.arg(ExtTypes::POINTER, ExtTypes::DWORD, ExtTypes::DWORD, ExtTypes::DWORD, ExtTypes::DWORD);
          #    peekMessage.returns(ExtTypes::DWord);
          #
          #    TranslateMessage.arg(ExtTypes::Pointer);
          #    TranslateMessage.returns(ExtTypes::DWORD);
          #
          #    dispatchMessage.arg(ExtTypes::Pointer);
          #    dispatchMessage.returns(ExtTypes::DWord);
          #
          #    GetDesktopWindow = new DllFunction(user32, 'GetDesktopWindow');
          #    GetDesktopWindow.returns(ExtTypes::DWord);
          #
          #    LockWindowUpdate = new DllFunction(user32, 'LockWindowUpdate');
          #    LockWindowUpdate.returns(ExtTypes::DWord);
          #    LockWindowUpdate.arg(ExtTypes::DWord);
          #
          #    desktopWindow = this.GetDesktopWindow();
          #
          #    mdiClient = WinAPI::findWindowEx(infolog.hWnd(), 0, 'MDIClient', '');
          #
          #    imgApp = new ImageListAppl_AOT();
          #    for(i=1;i<=conlen(this.pathes());i++)
          #    {
          #        [dummy, img]=conPeek(this.pathes(), i);
          #        imgApp.add(img);
          #    }
          #    //Tree.setImagelist(imgApp.imageList());
          #    //Tree.setStateImagelist(imgApp.imageList());
          #    element.setTabPageImageList(Tabs, imgApp.imageList());
          #
          #    windows=new Map(Types::Integer, Types::Class);
          #    titles=new Map(Types::Integer, Types::String);
          #    xSysLastValue::getLast(this);
          #}
          #
        ENDSOURCE
        SOURCE #initParmDefault
          #/*MAN
          #This method is called when no SysLastValue record can be found in xSysLastValue.GetLast()
          #*/
          #public void initParmDefault()
          #{
          #;
          #}
        ENDSOURCE
        SOURCE #unpack
          #public boolean unpack(container packedClass)
          #{
          #    int version     = RunBase::getVersion(packedClass);
          #
          #    switch (version)
          #    {
          #        case 5:
          #            [version, #List5] = packedClass;
          #            return true;
          #        case 6:
          #            [version, #List6] = packedClass;
          #            return true;
          #        case 7:
          #            [version, #List7] = packedClass;
          #            return true;
          #        case #CurrentVersion:
          #            [version, #CurrentList] = packedClass;
          #            return true;
          #        default :
          #            return false;
          #    }
          #
          #    return false;
          #}
        ENDSOURCE
        SOURCE #getDesktopWindow
          #HWnd getDesktopWindow()
          #{
          #    return GetDesktopWindow.call();
          #}
        ENDSOURCE
        SOURCE #apiLockWindowUpdate
          #boolean apiLockWindowUpdate(HWND _hwnd)
          #{
          #    return LockWindowUpdate.call(_hwnd);
          #}
        ENDSOURCE
        SOURCE #pack
          #public container pack()
          #{
          #;
          #    return [#CurrentVersion, #CurrentList];
          #}
        ENDSOURCE
        SOURCE #lastValueDataAreaId
          #public dataAreaId lastValueDataAreaId()
          #{
          #    //TODO:return 'dat';
          #    return curExt();
          #}
        ENDSOURCE
        SOURCE #lastValueDesignName
          #public identifiername lastValueDesignName()
          #{
          #    return '';
          #}
        ENDSOURCE
        SOURCE #lastValueElementName
          #public identifiername lastValueElementName()
          #{
          #    return this.name();
          #}
        ENDSOURCE
        SOURCE #lastValueType
          #public UtilElementType lastValueType()
          #{
          #    return UtilElementType::Form;
          #}
        ENDSOURCE
        SOURCE #lastValueUserId
          #public userId lastValueUserId()
          #{
          #    return curUserId();
          #}
        ENDSOURCE
        SOURCE #pop
          #private TreeNodeIterator pop()
          #{
          #    TreeNodeIterator ret=iterators.value(sp);
          #    ;
          #    //iterators.value(sp, null);
          #    sp--;
          #    return ret;
          #}
        ENDSOURCE
        SOURCE #lists_pop
          #private List lists_pop()
          #{
          #    List ret=lists.value(lists_sp);
          #    ;
          #    //lists.value(lists_sp, null);
          #    lists_sp--;
          #    return ret;
          #}
        ENDSOURCE
        SOURCE #push
          #private void push(TreeNodeIterator _iterator)
          #{
          #    ;
          #    sp++;
          #    iterators.value(sp, _iterator);
          #}
        ENDSOURCE
        SOURCE #Lists_push
          #private void lists_push(List _list)
          #{
          #    ;
          #    lists_sp++;
          #    lists.value(lists_sp, _list);
          #}
        ENDSOURCE
        SOURCE #nextNode
          #private TreeNode nextNode()
          #{
          #    return tniterator.next();
          #}
        ENDSOURCE
        SOURCE #next
          #boolean next()
          #{
          #    current=this.nextNode();
          #    while(!current && this.hasIterators())
          #    {
          #        tniterator=this.pop();
          #        currentList=this.lists_pop();
          #        current=this.nextNode();
          #    }
          #    if(current)
          #    {
          #        this.push(tniterator);
          #        this.lists_push(currentList);
          #        currentList=new List(Types::Class);
          #        tniterator=current.AOTiterator();
          #    }
          #    return current? true:false;
          #}
        ENDSOURCE
        SOURCE #hasIterators
          #private boolean hasIterators()
          #{
          #    return sp ? true:false;
          #}
        ENDSOURCE
        SOURCE #AdjustTabPageSize
          ##winapi
          #void adjustTabPageSize(FormTabControl tabPageControl)
          #{
          #    Binary  rect = new Binary(16);
          #    Binary  ptr = new Binary(4);
          #    int     size;
          #    int     style;
          #    int     width;
          #    int     w;
          #    int maxWidth;
          #    int minWidth;
          #    int     i;
          #    int     cnt;
          #    int GetWindowRect(int hWnd, Binary lpRect)
          #    {
          #        DLL             _Userdll            = new DLL('User32.dll');
          #        DLLFunction     _getWindowRect      = new DLLFunction(_Userdll, 'GetWindowRect');
          #        ;
          #        _getWindowRect.arg(ExtTypes::DWord, ExtTypes::Pointer);
          #        _getWindowRect.returns(ExtTypes::DWord);
          #        return _getWindowRect.call(hWnd, lpRect);
          #    }
          #    int setWindowLong(HWND _HWND, int _nIndex, int _dwNewLong)
          #    {
          #        DLL             _Userdll            = new DLL("User32.dll");
          #        DLLFunction     DLLFunction;
          #        ;
          #        DLLFunction = new DLLFunction(_Userdll,'SetWindowLongA');
          #        DLLFunction.arg(ExtTypes::DWord, ExtTypes::DWord, ExtTypes::DWord);
          #        DLLFunction.returns(ExtTypes::DWord);
          #
          #        return DLLFunction.call(_HWND, _nIndex, _dwNewLong);
          #    }
          #;
          #    if (tabPageControl && tabPageControl.hWnd())
          #    {
          #        ptr.binary(0, rect);
          #
          #        GetWindowRect(tabPageControl.hWnd() , rect);
          #        width = rect.dWord(8) - rect.dWord(0) - 4;
          #        cnt = 0;
          #        for (i=1;i<=tabPageControl.controlCount();i++)
          #            if (tabPageControl.controlNum(i).visible())
          #                cnt++;
          #        if (!cnt)
          #            cnt = 1;
          #
          #        WinApi::sendMessageEx(tabPageControl.hWnd(), #TCM_GETITEMRECT, 0, ptr.dWord(0));
          #
          #        style = winapi::getWindowLong(tabPageControl.hWnd(), #GWL_STYLE);
          #        style = style & ~ #TCS_FIXEDWIDTH;
          #        style = style | #TCS_TOOLTIPS | #TCS_FORCELABELLEFT;
          #
          #        SetWindowLong(tabPageControl.hWnd(), #GWL_STYLE, style);
          #        cnt = WinApi::sendMessageEx(tabPageControl.hWnd(), #TCM_GETITEMCOUNT, 0, size);
          #
          #        w = 0;
          #        for (i=0;i<cnt;i++)
          #        {
          #            winapi::sendMessageEx(tabPageControl.hWnd(), #TCM_GETITEMRECT, i, ptr.dWord(0));
          #            w += rect.dWord(8) - rect.dWord(0);
          #            maxWidth = max(maxWidth, rect.dWord(8) - rect.dWord(0));
          #            minWidth = min(minWidth, rect.dWord(8) - rect.dWord(0));
          #//            if (w > width)
          #//                break;
          #        }
          #
          #        cnt = max(1, cnt);
          #        size = width div cnt;
          #        if (maxTabSize)
          #            size=min(size, maxTabSize);
          #        if (minTabSize)
          #            size=max(size, minTabSize);
          #        if (sameTabSize && (maxTabSize * cnt)<=width)
          #            size = maxTabSize ? maxTabSize : min(maxWidth, w);
          #        size = min(size, width);
          #        size = (size & 0xffff) | ((rect.dWord(12) - rect.dWord(4)) << 16);
          #
          #        if (minTabSize)
          #            Winapi::SendMessageEx(tabPageControl.hWnd(), #TCM_SETMINTABWIDTH, 0, minTabSize);
          #        if (w > width || (maxTabSize && maxWidth > maxTabSize) || sameTabSize)
          #        {
          #            WinApi::SendMessageEx(tabPageControl.hWnd(), #TCM_SETITEMSIZE, 0, size);
          #
          #            style = style | #TCS_FIXEDWIDTH;
          #            SetWindowLong(tabPageControl.hWnd(), #GWL_STYLE, style);
          #        }
          #    }
          #}
          #
        ENDSOURCE
        SOURCE #HitTestTabPage
          #int hitTestTabPage(FormTabControl formTabControl)
          #{
          #    int cx, cy;
          #    Binary  TCHITTESTINFO = new Binary(12);
          #    Binary  ptr = new Binary(4);
          #    ;
          #    if (formTabControl && formTabControl.hWnd())
          #    {
          #        [cx, cy] = winapi::getCursorPos();
          #        [cx, cy] = winapi::screenToClient(FormTabControl.hWnd(), cx, cy);
          #        ptr.binary(0, TCHITTESTINFO);
          #        TCHITTESTINFO.dWord(0, cx);
          #        TCHITTESTINFO.dWord(4, cy);
          #        return winapi::sendMessageEx(FormTabControl.hWnd(), #TCM_HITTEST, 0, ptr.dWord(0)) + 1;
          #    }
          #    else return 0;
          #}
        ENDSOURCE
        SOURCE #RemoveTabPageImageList
          #void removeTabPageImageList(FormTabControl tabPageControl)
          #{
          #    int             hImageList;
          #    DLL             _dll                = new DLL("comctl32.dll");
          #    DLLFunction     ImageList_Destroy   = new DLLFunction(_dll, "ImageList_Destroy");
          #
          #    ;
          #    if (tabPageControl && tabPageControl.hWnd())
          #    {
          #        hImageList = winapi::sendMessageEx(tabPageControl.hWnd(), #TCM_GETIMAGELIST, 0, 0);
          #        if (hImageList)
          #        {
          #            winapi::sendMessageEx(tabPageControl.hWnd(), #TCM_SETIMAGELIST, 0, 0);
          #
          #            ImageList_Destroy.arg(ExtTypes::DWord);
          #            ImageList_Destroy.returns(ExtTypes::DWord);
          #            ImageList_Destroy.call(hImageList);
          #        }
          #    }
          #}
        ENDSOURCE
        SOURCE #SetTabPageImageIndex
          ##winapi
          #void setTabPageImageIndex(FormTabPageControl tabPageControl, int idx)
          #{
          #    int             hWnd;
          #    Binary          TCITEM;
          #    Binary          pointer;
          #    int             i, pos;
          #    int GetParent(int _hWnd)
          #    {
          #        DLL         _Userdll        = new DLL("User32.dll");
          #        DLLFunction _getParent      = new DLLFunction(_Userdll, "GetParent");
          #        ;
          #        _getParent.arg(ExtTypes::DWord);
          #        _getParent.returns(ExtTypes::DWord);
          #        return _getParent.call(_hWnd);
          #    }
          #
          #    ;
          #    if (tabPageControl && tabPageControl.hWnd())
          #    {
          #        pos = 0;
          #        hWnd = tabPageControl.hWnd();
          #        while (hWnd)
          #        {
          #            hWnd = winapi::getWindow(hWnd, #GW_HWNDPREV);
          #            if (hWnd && element.WinApi_getClassName(hWnd) == #PaneWindowCL)
          #                pos++;
          #        }
          #
          #        TCITEM = new Binary(28);
          #        pointer = new Binary(4);
          #        pointer.binary(0, TCITEM);
          #        TCITEM.dWord(0, #TCIF_IMAGE);
          #        TCITEM.dWord(20, idx < 0 ? -1 : idx-1);
          #        winapi::sendMessageEx(GetParent(tabPageControl.hWnd()), #TCM_SETITEM, pos, pointer.dWord(0));
          #    }
          #}
        ENDSOURCE
        SOURCE #SetTabPageImageList
          #void setTabPageImageList(FormTabControl FormTabControl, ImageList imageList, int colorKey = winapi::rgb2int(134, 183, 115))
          #{
          #// colorKey - цвет, который будет заменен на цвет фона окна.
          #// Если в ваших иконках будет присутствовать цевет, предлагаемый по умолчанию,
          #// то подставьте при вызове метода любой другой, которого нет
          #
          #    DLL             _dll                = new DLL("comctl32.dll");
          #    DLL             _Userdll            = new DLL("User32.dll");
          #    DLL             _GDIdll             = new DLL("Gdi32.dll");
          #
          #
          #    DLLFunction     ImageList_Create        = new DLLFunction(_dll, "ImageList_Create");
          #    DLLFunction     ImageList_AddMasked     = new DLLFunction(_dll, "ImageList_AddMasked");
          #    DLLFunction     ImageList_Destroy       = new DLLFunction(_dll, "ImageList_Destroy");
          #
          #
          #    int             i, k;
          #    int             hImageList;
          #    int             hImageListOld;
          #    Image           image;
          #    int             wDC;
          #    int             newDC;
          #    int             hBitmap;
          #    int             hWnd;
          #    Binary          TCITEM;
          #    Binary          pointer;
          #
          #    int GetDC(int _hWnd)
          #    {
          #        DLLFunction     _getDC    = new DLLFunction(_Userdll, "GetDC");
          #        ;
          #        _getDC.arg(ExtTypes::DWord);
          #        _getDC.returns(ExtTypes::DWord);
          #        return _getDC.call(_hWnd);
          #    }
          #    int CreateCompatibleDC(int hdc)
          #    {
          #        DLLFunction     _createCompatibleDC    = new DLLFunction(_GDIdll, "CreateCompatibleDC");
          #        ;
          #        _createCompatibleDC.arg(ExtTypes::DWord);
          #        _createCompatibleDC.returns(ExtTypes::DWord);
          #        return _createCompatibleDC.call(hdc);
          #    }
          #    int CreateCompatibleBitmap(int hdc, int nWidth, int nHeight)
          #    {
          #        DLLFunction     _createCompatibleBitmap = new DLLFunction(_GDIdll, "CreateCompatibleBitmap");
          #        ;
          #        _createCompatibleBitmap.arg(ExtTypes::DWord, ExtTypes::DWord, ExtTypes::DWord);
          #        _createCompatibleBitmap.returns(ExtTypes::DWord);
          #        return _createCompatibleBitmap.call(hdc, nWidth, nHeight);
          #    }
          #    int SelectObject(int hdc, int hgdiobj)
          #    {
          #        DLLFunction     _selectObject = new DLLFunction(_GDIdll, "SelectObject");
          #        ;
          #        _selectObject.arg(ExtTypes::DWord, ExtTypes::DWord);
          #        _selectObject.returns(ExtTypes::DWord);
          #        return _selectObject.call(hdc, hgdiobj);
          #    }
          #    int DeleteObject(int hgdiobj)
          #    {
          #        DLLFunction     _deleteObject = new DLLFunction(_GDIdll, "DeleteObject");
          #        ;
          #        _deleteObject.arg(ExtTypes::DWord);
          #        _deleteObject.returns(ExtTypes::DWord);
          #        return _deleteObject.call(hgdiobj);
          #    }
          #    int DeleteDC(int hDc)
          #    {
          #        DLLFunction     _deleteDC = new DLLFunction(_GDIdll, "DeleteDC");
          #        ;
          #        _deleteDC.arg(ExtTypes::DWord);
          #        _deleteDC.returns(ExtTypes::DWord);
          #        return _deleteDC.call(hDc);
          #    }
          #    int FillRect(int hDC, container Rect, int hbr)
          #    {
          #        DLLFunction     _fillRect = new DLLFunction(_Userdll, "FillRect");
          #        Binary          _rect   = new Binary(16);
          #        ;
          #        _fillRect.arg(ExtTypes::DWord, ExtTypes::Pointer, ExtTypes::DWord);
          #        _fillRect.returns(ExtTypes::DWord);
          #        _rect.dword(0, conpeek(Rect, 1));
          #        _rect.dword(4, conpeek(Rect, 2));
          #        _rect.dword(8, conpeek(Rect, 3));
          #        _rect.dword(12, conpeek(Rect, 4));
          #        return _fillRect.call(hDc, _rect, hbr);
          #    }
          #    int CreateSolidBrush(int _Color)
          #    {
          #        DLLFunction     _CreateSolidBrush = new DLLFunction(_GDIdll, "CreateSolidBrush");
          #        Binary           LOGBRUSH = new Binary(12);
          #        ;
          #        _CreateSolidBrush.arg(ExtTypes::DWord);
          #        _CreateSolidBrush.returns(ExtTypes::DWord);
          #        return _CreateSolidBrush.call(_Color);
          #    }
          #
          #    #define.ILC_COLOR(0x00000000)
          #    #define.ILC_COLOR24(0x00000018)
          #    #define.ILC_MASK(0x00000001)
          #    #define.TCM_FIRST(0x1300)
          #    #define.TCM_GETIMAGELIST(#TCM_FIRST + 2)
          #    #define.TCM_SETIMAGELIST(#TCM_FIRST + 3)
          #    #define.TCM_GETITEM(#TCM_FIRST + 5)
          #    #define.TCM_SETITEM(#TCM_FIRST + 6)
          #
          #    #define.TCIF_IMAGE(0x0002)
          #    ;
          #    if (formTabControl && formTabControl.hWnd() && imageList)
          #    {
          #        hWnd = formTabControl.hWnd();
          #        ImageList_Create.arg(ExtTypes::DWord, ExtTypes::DWord, ExtTypes::DWord, ExtTypes::DWord, ExtTypes::DWord);
          #        ImageList_Create.returns(ExtTypes::DWord);
          #        hImageList = ImageList_Create.call(imageList.width(), imageList.height(), #ILC_COLOR24 | #ILC_MASK, imageList.count(), 0);
          #
          #        ImageList_AddMasked.arg(ExtTypes::DWord, ExtTypes::DWord, ExtTypes::DWord);
          #        ImageList_AddMasked.returns(ExtTypes::DWord);
          #
          #        wDC = GetDC(0);
          #        newDC = CreateCompatibleDC(wDC);
          #        if (newDC)
          #        {
          #            hBitmap = CreateCompatibleBitmap(wDC, imageList.width()*imageList.count(), imageList.height());
          #            if (hBitmap && SelectObject(newDC, hBitmap))
          #            {
          #                i = CreateSolidBrush(colorKey);
          #                FillRect(newDC, [0, 0, imageList.width()*imageList.count(), imageList.height()], i);
          #                deleteObject(i);
          #
          #                for (i=0;i<imageList.count();i++)
          #                    imageList.draw(newDC, i, i * imageList.width(), 0, true);
          #
          #                DeleteDC(newDC);
          #
          #                ImageList_AddMasked.call(hImageList, hBitmap, colorKey);
          #                DeleteObject(hBitmap);
          #                hImageListOld = winapi::sendMessageEx(hWnd, #TCM_SETIMAGELIST, 0, hImageList);
          #                if (hImageListOld)
          #                {
          #                    ImageList_Destroy.arg(ExtTypes::DWord);
          #                    ImageList_Destroy.returns(ExtTypes::DWord);
          #                    ImageList_Destroy.call(hImageList);
          #                }
          #
          #                TCITEM = new Binary(28);
          #                pointer = new Binary(4);
          #                pointer.binary(0, TCITEM);
          #                TCITEM.dWord(0, #TCIF_IMAGE);
          #
          #                for (i = 0; i < min(formTabControl.controlCount(), imageList.count()); i++)
          #                {
          #                    TCITEM.dWord(20, i);
          #                    winapi::sendMessageEx(hWnd, #TCM_SETITEM, i, pointer.dWord(0));
          #                }
          #            }
          #            else
          #                DeleteDC(newDC);
          #        }
          #        //winapi::releaseDC(hWnd, wDC);
          #        winapi::releaseDC(0, wDC);
          #    }
          #}
        ENDSOURCE
        SOURCE #getCurMethod
          #/// Thanx to AndyD
          #TreeNode getCurMethod(HWND _editorHWnd)
          #{
          #    int hWnd = _editorHWnd;
          #    int hWndChild;
          #    str name = WinApi::getWindowText(_editorHWnd);
          #    int pos;
          #    boolean editor;
          #    str className;
          #    int childPos;
          #
          #
          #    int listView;
          #    int selectedItem;
          #    str itemName;
          #    str nodeName;
          #    int i;
          #    TreeNode fromMethods(TreeNode _parent, str _name)
          #    {
          #        TreeNode ret = _parent;
          #    ;
          #        if (ret)
          #            ret = ret.AOTfindChild('methods');
          #        if (ret)
          #            ret = ret.AOTfindChild(_name);
          #        return ret;
          #    }
          #    boolean pref(str _prefix, str _name)
          #    {
          #    ;
          #        _prefix = '\\'+_prefix+'\\';
          #        if (subStr(_name, 1, strLen(_prefix)) == _prefix)
          #        {
          #            nodeName = subStr(_name, strLen(_prefix) + 1, strLen(_name) - strLen(_prefix));
          #            return true;
          #        }
          #        return false;
          #    }
          #    #localmacro.pref
          #        pref(@'%1', _name)
          #    #endmacro
          #    TreeNode toTreeNode(str _name, str _methodName)
          #    {
          #        TreeNode parent = TreeNode::findNode(_name);
          #        str controlName;
          #        str controlMethodName;
          #        int delimiterPos;
          #        if (!parent)
          #            return null;
          #        if (#pref(Classes) || #pref(Jobs) || #pref(Macros))
          #            return parent.AOTfindChild(_methodName);
          #        if (#pref(Data Dictionary\Tables) || #pref(Data Dictionary\Maps) || #pref(Data Dictionary\Views))
          #            return fromMethods(parent, _methodName);
          #        if (#pref(Forms) || #pref(Reports))
          #        {
          #            delimiterPos = strFind(_methodName, ':', 1, strLen(_methodName));
          #            if (delimiterPos)
          #            {
          #                controlName = strRTrim(strLTrim(subStr(_methodName, 1, delimiterPos - 1)));
          #                controlMethodName = strRTrim(strLTrim(subStr(_methodName, delimiterPos + 1, strLen(_methodName) - delimiterPos)));
          #                return fromMethods(this.controlByName(parent, controlName), controlMethodName);
          #            }
          #            else
          #                return fromMethods(parent, _methodName);
          #        }
          #        return null;
          #    }
          #    str GetClassName(int _hWnd)
          #    {
          #        DLL             dll = new Dll("user32.dll");
          #        DLLFunction     getCalssName = new DLLFunction(dll, "GetClassNameA");
          #        Binary  classNamePtr = new Binary(256);
          #        ;
          #        getCalssName.arg(ExtTypes::DWord, ExtTypes::Pointer, ExtTypes::DWord);
          #        getCalssName.returns(ExtTypes::DWord);
          #        if (getCalssName.call(_hWnd, classNamePtr, 255))
          #            return classNamePtr.string(0);
          #        else
          #            return "";
          #    }
          #    #define.LVM_FIRST(0x1000)
          #    #define.LVM_GETNEXTITEM(#LVM_FIRST + 12)
          #    #define.LVM_GETITEMTEXT(#LVM_FIRST + 45)
          #
          #    #define.LVNI_SELECTED(0x0002)
          #
          #    str getItemText(int     _hWnd, int _item)
          #    {
          #        DLL         _winApiDLL      = new DLL('USER32');
          #        DLLFunction _sendMessage    = new DLLFunction(_winApiDLL, 'SendMessageA');
          #        Binary      LVItem = new Binary(52);
          #        Binary      itemText = new Binary(256);
          #        #define.LVIF_TEXT(0x0001)
          #        ;
          #        LVItem.dWord(0, #LVIF_TEXT); // mask
          #        LVItem.dWord(4, _item); // iItem
          #        LVItem.dWord(8, 0); // iSubItem
          #        LVItem.Binary(20, itemText); // pszText
          #        LVItem.dWord(24, 255); // cchTextMax
          #        _sendMessage.returns(ExtTypes::DWord);
          #        _sendMessage.arg(ExtTypes::DWord,
          #                         ExtTypes::DWord,
          #                         ExtTypes::DWord,
          #                         ExtTypes::Pointer);
          #
          #        return _sendMessage.call(_hWnd, #LVM_GETITEMTEXT, _item, LVItem) ? itemText.string(0) : '';
          #    }
          #
          #
          #    ;
          #    for(i=1; i<=conLen(editorSuffixes) &&  !pos; i++)
          #        if (this.strEndsWith(name, conPeek(editorSuffixes, i)))
          #            pos = strLen(name) - strLen(conPeek(editorSuffixes, i)) + 1;
          #
          #    name = subStr(name, 1, pos-1);
          #    editor = true;
          #    hWndChild = winapi::getWindow(hWnd, #GW_CHILD);
          #    childPos = 1;
          #    ListView = 0;
          #    while (hWndChild && _editorHWnd)
          #    {
          #        className = GetClassName(hWndChild);
          #        switch (childPos)
          #        {
          #            case 1:
          #                #if.ax3
          #                    editor = className == "MDImarginCL";
          #                #endif
          #                #if.ax4
          #                    editor = className == "AxEdTabCtrl";
          #                #endif
          #                childPos++;
          #                break;
          #            case 2:
          #                #if.ax3
          #                    editor = className == "SysListView32";
          #                #endif
          #                #if.ax4
          #                    editor = className == "AxListViewCtrl";
          #                #endif
          #                ListView = hWndChild;
          #                childPos++;
          #                break;
          #            case 3:
          #                #if.ax3
          #                    editor = className == #PaneWindowCL;
          #                #endif
          #                #if.ax4
          #                    editor = className == "AxChidFrame";
          #                #endif
          #                childPos++;
          #                break;
          #            case 4:
          #                #if.ax4
          #                    editor = className == "AxPaneWnd";
          #                #endif
          #                #if.ax3
          #                    editor = className == "SysTabControl32";
          #                #endif
          #                childPos++;
          #                break;
          #            default:
          #                editor = false;
          #                break;
          #        }
          #        hWndChild = winapi::getWindow(hWndChild, #GW_HWNDNEXT);
          #    }
          #    if (editor && listView)
          #    {
          #        selectedItem = winapi::sendMessageEx(listView, #LVM_GETNEXTITEM, -1, #LVNI_SELECTED);
          #        if (selectedItem >= 0)
          #        {
          #            itemName = getItemText(ListView, selectedItem);
          #            if (itemName)
          #            {
          #                return toTreeNode(name, itemName);
          #            }
          #        }
          #    }
          #    return null;
          #}
        ENDSOURCE
        SOURCE #AxPath_goMenuItemForm
          #void AxPath_goMenuItemForm(MenuItemType _itemType, MenuItemName _itemName, str _extra)
          #{
          #    Args args=new Args();
          #    FormRun formRun ;
          #    Common record;
          #    TableID tableID;
          #;
          #    args.menuItemType(_itemType);
          #    args.menuItemName(_itemName);
          #    formRun = new MenuFunction(_itemName, _itemType).create(args);
          #    if (formRun)
          #    {
          #        formRun.run();
          #        if (formRun.dataSourceCount())
          #        {
          #            tableID = formRun.dataSource(1).cursor().TableId;
          #            record = this.AxPath_findCommon(tableID, this.AxPath_parseParams(_extra));
          #            if (record)
          #                formRun.dataSource(1).findRecord(record);
          #        }
          #        formRun.detach();
          #    }
          #}
        ENDSOURCE
        SOURCE #AxPath_parseParams
          #container AxPath_parseParams(str _params)
          #{
          #    container ret;
          #    container pairs;
          #    int i;
          #;
          #    if (subStr(_params, 1, 1)=='?')
          #    {
          #        pairs = this.str2con(subStr(_params, 2, strLen(_params)-1) , '&');
          #        for(i=1; i<=conLen(pairs); i++)
          #            ret += [this.str2con(conPeek(pairs, i), '=')];
          #    }
          #    return ret;
          #}
        ENDSOURCE
        SOURCE #AxPath_accepts
          #boolean AxPath_accepts(str _s)
          #{
          #    return this.urlGetPart(_s, 1)==#AxPath_prefix;
          #}
        ENDSOURCE
        SOURCE #AxPath_fromTreeNode
          #str AxPath_fromTreeNode(TreeNode _node)
          #{
          #    return #AxPath_prefix+'://'+#AxPath_AOTName+this.urlEscape(strReplace(_node.treeNodePath(), '\\', '/'));
          #}
        ENDSOURCE
        SOURCE #internetCrackUrl
          #container internetCrackUrl(str _url, boolean _decode=false, boolean _escape=false)
          #{
          #//    typedef struct {
          #//      DWORD dwStructSize; 0
          #//      LPTSTR lpszScheme;   4
          #//      DWORD dwSchemeLength; 8
          #//      INTERNET_SCHEME nScheme; 12
          #//      LPTSTR lpszHostName; 16
          #//      DWORD dwHostNameLength; 20
          #//      INTERNET_PORT nPort; 24
          #//      LPTSTR lpszUserName; 28
          #//      DWORD dwUserNameLength; 32
          #//      LPTSTR lpszPassword; 36
          #//      DWORD dwPasswordLength; 40
          #//      LPTSTR lpszUrlPath; 44
          #//      DWORD dwUrlPathLength; 48
          #//      LPTSTR lpszExtraInfo; 52
          #//      DWORD dwExtraInfoLength; 56
          #//    } URL_COMPONENTS, 60
          #//
          #//     *LPURL_COMPONENTS;
          #    int maxLen = strLen(_url)+1;
          #    DLL             dll = new DLL('wininet.dll');
          #    DLLFunction     function = new DLLFunction(dll, 'InternetCrackUrlA');
          #    Binary          result = new Binary(60);
          #    Binary          cnt = new Binary(4);
          #    int ret;
          #    #define.E_POINTER(0x80004003)
          #//      LPTSTR lpszScheme;   4
          #    Binary scheme = new Binary(maxLen);
          #//      LPTSTR lpszHostName; 24
          #    Binary hostName = new Binary(maxLen);
          #//      LPTSTR lpszUserName; 36
          #    Binary userName = new Binary(maxLen);
          #//      LPTSTR lpszPassword; 44
          #    Binary password = new Binary(maxLen);
          #//      LPTSTR lpszUrlPath; 52
          #    Binary urlPath = new Binary(maxLen);
          #//      LPTSTR lpszExtraInfo; 60
          #    Binary extraInfo = new Binary(maxLen);
          #;
          #//    BOOL InternetCrackUrl(
          #//      LPCTSTR lpszUrl,
          #//      DWORD dwUrlLength,
          #//      DWORD dwFlags,
          #//      LPURL_COMPONENTS lpUrlComponents
          #//    );
          #
          #
          #//      DWORD dwStructSize; 0
          #    result.dWord(0, 60);
          #//      LPTSTR lpszScheme;   4
          #    result.binary(4, scheme);
          #//      DWORD dwSchemeLength; 8
          #    result.dWord(8, maxLen);
          #//      INTERNET_SCHEME nScheme; 12
          #//      LPTSTR lpszHostName; 16
          #    result.binary(16, hostName);
          #//      DWORD dwHostNameLength; 20
          #    result.dWord(20, maxLen);
          #//      INTERNET_PORT nPort; 24
          #//      LPTSTR lpszUserName; 28
          #    result.binary(28, userName);
          #//      DWORD dwUserNameLength; 32
          #    result.dWord(32, maxLen);
          #//      LPTSTR lpszPassword; 36
          #    result.binary(36, password);
          #//      DWORD dwPasswordLength; 40
          #    result.dWord(40, maxLen);
          #//      LPTSTR lpszUrlPath; 44
          #    result.binary(44, urlPath);
          #//      DWORD dwUrlPathLength; 48
          #    result.dWord(48, maxLen);
          #//      LPTSTR lpszExtraInfo; 52
          #    result.binary(52, extraInfo);
          #//      DWORD dwExtraInfoLength; 56
          #    result.dWord(56, maxLen);
          #    function.arg(ExtTypes::String, ExtTypes::DWord, ExtTypes::DWord, ExtTypes::Pointer);
          #    function.returns(ExtTypes::DWord);
          #    ret = function.call(_url, strlen(_url), (_decode ? 0x10000000 : 0) +  (_escape ? 0x080000000: 0), result);
          #    if (!ret)
          #        throw error(WinApi::formatMessage(WinApi::getLastError()));
          #    return [scheme.string(0), hostName.string(0), result.dWord(24), userName.string(0), password.string(0), urlPath.string(0), extrainfo.string(0)];
          #}
        ENDSOURCE
        SOURCE #str2con
          #container str2con(str _string, str _separator = ",")
          #{
          #    container   con;
          #    int         pos, oldPos = 1;
          #
          #    do
          #    {
          #        pos    =  strScan(_string, _separator, pos ? pos + strLen(_separator) : 1, strLen(_string));
          #        con    += subStr(_string, oldPos, pos ? pos - oldPos : strLen(_string) + 1 - oldPos);
          #        oldPos =  pos + strLen(_separator);
          #    }
          #    while (pos);
          #
          #    return con;
          #}
        ENDSOURCE
        SOURCE #urlGetPart
          #//URL_PART_HOSTNAME
          #//The host name.
          #//URL_PART_PASSWORD
          #//The password.
          #//URL_PART_PORT
          #//The port number.
          #//URL_PART_QUERY
          #//The query portion of the URL.
          #//URL_PART_SCHEME
          #//The URL scheme.
          #//URL_PART_USERNAME
          #//The username.
          #//URL_PART_NONE    = 0,
          #// URL_PART_SCHEME  = 1,
          #// URL_PART_HOSTNAME,
          #// URL_PART_USERNAME,
          #// URL_PART_PASSWORD,
          #// URL_PART_PORT,
          #// URL_PART_QUERY
          #//HRESULT UrlGetPart(
          #//    LPCTSTR pszIn,
          #//    LPTSTR pszOut,
          #//    LPDWORD pcchOut,
          #//    DWORD dwPart,
          #//    DWORD dwFlags
          #//);
          #str urlGetPart(str _in, int _part)
          #{
          #    DLL             dll = new DLL("shlwapi.dll");
          #    DLLFunction     function = new DLLFunction(dll, "UrlGetPartA");
          #    Binary          out = new Binary(strlen(_in)+1);
          #    Binary          cnt = new Binary(4);
          #    #define.E_POINTER(0x80004003)
          #    ;
          #    function.arg(
          #        //    LPCTSTR pszIn,
          #        ExtTypes::String,
          #        //    LPTSTR pszOut,
          #        ExtTypes::Pointer,
          #        //    LPDWORD pcchOut,
          #        ExtTypes::Pointer,
          #        //    DWORD dwPart,
          #        ExtTypes::DWord,
          #        //    DWORD dwFlags
          #        ExtTypes::DWord);
          #    function.returns(ExtTypes::DWord);
          #    cnt.dWord(0, strlen(_in)+1);
          #    function.call(_in, out, cnt, _part, 0);
          #    return out.string(0);
          #}
        ENDSOURCE
        SOURCE #AxPath_go
          #void AxPath_go(str _url)
          #{
          #    str scheme;
          #    str host;
          #    int port;
          #    str user;
          #    str password;
          #    str urlPath;
          #    str extra;
          #    TreeNode node;
          #    int line;
          #    int pos;
          #    container steps;
          #    MenuItemType itemType;
          #    MenuItemName itemName;
          #    //RecID recID;
          #    DataAreaId  dataAreaID  ;  // Dcs 04.04.2007 СБРFI-200703_02 KC
          #;
          #
          #    [scheme, host, port, user, password, urlPath, extra] = this.internetCrackUrl(_url, true);
          #    switch (host)
          #    {
          #        case #AxPath_AOTName:
          #            this.assertDevelopment();
          #            node = TreeNode::findNode(strReplace(urlPath, '/', '\\'));
          #            if (!node)
          #                throw error('Node not found');
          #            [line, pos] = this.AxPath_getLineAndPos(extra);
          #            if (node.handle() == classNum(MemberFunction) || node.handle() == classNum(Job) )
          #                node.AOTedit(line, pos);
          #            else
          #                node.AOTnewWindow();
          #
          #        break;
          #        case #AxPath_MenuItemName:
          #            steps = this.str2con(urlPath, '/');
          #            itemType = this.menuItemTypeBySymbol(conPeek(steps, 2));
          #            itemName = conPeek(steps, 3);
          #            //recID = this.AxPath_getRecID(extra);
          #            //+ Dcs 04.04.2007 СБРFI-200703_02 KC
          #            // orig
          #            // this.goMenuItemForm(itemType, itemName, recID );
          #
          #            dataAreaID = this.AxPath_getDataAreaId(extra);
          #            if(dataAreaID && curExt() != dataAreaID)
          #            {
          #                changeCompany (dataAreaID)
          #                {
          #                    this.AxPath_goMenuItemForm(itemType, itemName, extra);
          #                }
          #            }
          #            else
          #                this.AxPath_goMenuItemForm(itemType, itemName, extra);
          #            //- Dcs 04.04.2007 СБРFI-200703_02 KC
          #        break;
          #        default:
          #            throw error('Unknown host '+host);
          #    }
          #}
        ENDSOURCE
        SOURCE #AxPath_getRecID
          #RecID AxPath_getRecID(str _extra)
          #{
          #    container params=this.AxPath_parseParams(_extra);
          #    int i;
          #    str name;
          #    str value;
          #    RecID recID;
          #;
          #    for (i=1; i<=conLen(params); i++)
          #    {
          #        [name, value] = conPeek(params, i);
          #        if (name=='recID')
          #           recID=#str2recID(value);
          #    }
          #    return recID;
          #}
        ENDSOURCE
        SOURCE #runIt
          #void runIt(str _src, boolean _doWrite=true)
          #{
          #    XPPCompiler comp=new XPPCompiler();
          #    ;
          #    if(comp.compile(_src))
          #        if (_doWrite)
          #            this.write(runBuf(_src, element));
          #        else
          #            runBuf(_src, element);
          #    else
          #        info(comp.errorText());
          #}
        ENDSOURCE
        SOURCE #eval
          #void eval(str _s)
          #{
          #    ;
          #    this.assertDevelopment();
          #    this.runIt('AnyType mainFun(Object tabax){return '+_s+";}");
          #}
        ENDSOURCE
        SOURCE #runScript
          #void runScript(str _s)
          #{
          #    ;
          #    this.assertDevelopment();
          #    this.runIt('AnyType mainFun(Object tabax){AnyType ret;  ' + _s + " return ret;}", false);
          #}
        ENDSOURCE
        SOURCE #write
          #/// Prints its arguments on calculator result pane
          #void write(AnyType _p1=0, AnyType _p2=0, AnyType _p3=0, AnyType _p4=0, AnyType _p5=0)
          #{
          #    str s; //=resultEd.text() ? "\n" : "";
          #;
          #    if(!prmIsDefault(_p1))
          #        s+=this.toStr(_p1);
          #    if(!prmIsDefault(_p2))
          #    {
          #        if(s)
          #            s+=", ";
          #        s+=this.toStr(_p2);
          #    }
          #    if(!prmIsDefault(_p3))
          #    {
          #        if(s)
          #            s+=", ";
          #        s+=this.toStr(_p3);
          #    }
          #    if(!prmIsDefault(_p4))
          #    {
          #        if(s)
          #            s+=", ";
          #        s+=this.toStr(_p4);
          #    }
          #    if(!prmIsDefault(_p5))
          #    {
          #        if(s)
          #            s+=", ";
          #        s+=this.toStr(_p5);
          #    }
          #    info(s);
          #}
        ENDSOURCE
        SOURCE #processIconic
          #void processIconic(HWnd _child)
          #{
          #    int x1; int y1;
          #    int x2; int y2;
          #    int dx; int dy;
          #;
          #    [x1, y1, x2, y2] = element.getMdiClientRelativeRect(_child);
          #    dx = max(0, -x1);
          #    dy = max(0, -y1);
          #    if (dx || dy)
          #    {
          #        x1 += dx; x2 +=dx;
          #        y1 += dy; y2 +=dy;
          #        WinApi::setWindowPos(_child, x1, y1, x2-x1+1, y2-y1+1, false, false, #SWP_NOACTIVATE);
          #    }
          #}
        ENDSOURCE
        SOURCE #attachPlugins
          #void attachPlugins()
          #{
          #    UtilElements ue;
          #    Object plugin;
          #;
          #    while select name from ue group by name
          #        where ue.recordType == UtilElementType::Class
          #              &&
          #              ue.name like 'TabaxPlugin_*'
          #    {
          #        plugin = new DictClass(className2ID(ue.name)).makeObject();
          #        plugin.tabax(element);
          #    }
          #}
        ENDSOURCE
      ENDMETHODS
      OBJECTBANK
        PROPERTIES
        ENDPROPERTIES
      ENDOBJECTBANK
      JOINS
      ENDJOINS
      DESIGN
        PROPERTIES
          Top                 #Top edge
          Width               #Column width
          Height              #50
          Caption             #Tabax 0.1
          Frame               #None
          WindowResize        #Dynamic
          WindowType          #Workspace
          SaveSize            #Yes
          AllowDocking        #Yes
          TopMargin           #0
          BottomMargin        #0
          LeftMargin          #0
          RightMargin         #0
          Columnspace         #0
        ENDPROPERTIES
        CONTAINER
          CONTROL TAB
            PROPERTIES
              Name                #Tabs
              AutoDeclaration     #Yes
              Width               #Column width
              VerticalSpacing     #0
              TabLayout           #Tunnel
              Columns             #1
              Columnspace         #0
              HideIfEmpty         #No
            ENDPROPERTIES
            METHODS
              Version: 3
              SOURCE #beginDrag
                #public int beginDrag(int _x, int _y)
                #{
                #    int ret;
                #
                #    ret = super(_x, _y);
                #
                #    ret = element.hitTestTabPage(this);
                #
                #    return ret;
                #}
              ENDSOURCE
              SOURCE #dragOver
                #public FormDrag dragOver(FormControl _dragSource, FormDrag _dragMode, int _x, int _y)
                #{
                #    FormDrag ret;
                #
                #    ret = super(_dragSource, _dragMode, _x, _y);
                #
                #    return FormDrag::Move;
                #}
              ENDSOURCE
              SOURCE #mouseDblClick
                #public int mouseDblClick(int _x, int _y, int _button, boolean _Ctrl, boolean _Shift)
                #{
                #    int                 ret;
                #    FormTabPageControl  page;
                #    int                 tabNo;
                #    HWND                hwnd;
                #    ;
                #    ret = super(_x, _y, _button, _Ctrl, _Shift);
                #
                #    tabNo = element.HitTestTabPage(this);
                #
                #    if(tabNo)
                #    {
                #        page = this.controlNum(tabNo);
                #        hwnd = this.pageToHwnd(page);
                #
                #        element.window_close(hwnd);
                #    }
                #    return ret;
                #}
              ENDSOURCE
              SOURCE #pageToHwnd
                #HWND pageToHwnd(FormTabPageControl _page)
                #{
                #    HWnd hwnd;
                #    str hwndStr;
                #;
                #    if(_page)
                #    {
                #        hwndStr=_page.name();
                #        hwnd=str2int(subStr(hwndStr, 2, strLen(hwndStr)-1));
                #    }
                #    return hwnd;
                #}
              ENDSOURCE
              SOURCE #tabChanged
                #public void tabChanged(int _FromTab, int _ToTab)
                #{
                #
                #    FormTabPageControl page;
                #    HWND hwnd;
                #    super(_FromTab, _ToTab);
                #    if(!inDeletion)
                #    {
                #        page=this.controlNum(_ToTab);
                #        if(page)
                #        {
                #            hwnd = this.pageToHwnd(page);
                #            if (element.isIconic(hwnd))
                #                WinAPI::sendMessageEx(hwnd, #WM_SYSCOMMAND, #SC_RESTORE, 0);
                #            infolog.activateWindow(hwnd);
                #        }
                #    }
                #}
              ENDSOURCE
              SOURCE #toolTip
                #public str toolTip()
                #{
                #    int tabNo=element.hitTestTabPage(this);
                #    FormTabPageControl page=tabNo ? this.controlNum(tabNo) : null;
                #;
                #    return page ? page.helpText():'';
                #}
              ENDSOURCE
              SOURCE #closeAllExcept
                #void closeAllExcept(container _hwnds)
                #{
                #    MapIterator i=new MapIterator(windows);
                #    ;
                #    while(i.more())
                #    {
                #        if(!conFind(_hwnds, i.key()))
                #            element.window_close(i.key());
                #        i.next();
                #    }
                #}
              ENDSOURCE
              SOURCE #context
                #public void context()
                #{
                #    FormTabPageControl page;
                #    int tabNo;
                #    PopupMenu menu = new PopupMenu(this.hWnd());
                #    container winList;
                #    int close, toleft, toright, maximize, minimize, copy, totop, tobottom,
                #        fitWindow, sendBack;
                #    int closeAllExceptSelected;
                #    int selection;
                #    int i;
                #    str forCopy;
                #    TextBuffer buf=new TextBuffer();
                #    HWND hwnd;
                #;
                #    tabNo=element.HitTestTabPage(this);
                #    if(tabNo)
                #    {
                #        page=this.controlNum(tabNo);
                #        close = menu.insertItem(#_("Close (doubleclick tab to close)"));
                #        closeAllExceptSelected = menu.insertItem(#_("Close all except selected"));
                #        menu.insertBreak();
                #        fitWindow=menu.insertItem(#_("Fit window"));
                #        toleft=menu.insertItem(#_("To left"));
                #        toright=menu.insertItem(#_("To right"));
                #        totop=menu.insertItem(#_("To top"));
                #        tobottom=menu.insertItem(#_("To bottom"));
                #        maximize=menu.insertItem(#_("Maximize"));
                #        minimize=menu.insertItem(#_("Minimize"));
                #        sendBack=menu.insertItem(#_("Send to back"));
                #        menu.insertBreak();
                #        copy=menu.insertItem(#_("copy title"));
                #        selection = menu.draw();
                #        hwnd=this.pageToHwnd(page);
                #        if(selection!=closeAllExceptSelected)
                #        {
                #                switch (selection)
                #                {
                #                    case close:
                #                        element.window_close(hwnd);
                #                    break;
                #                    case toLeft:
                #                        element.leftSide(hwnd);
                #                    break;
                #                    case toRight:
                #                        element.rightSide(hwnd);
                #                    break;
                #                    case toTop:
                #                        element.topSide(hwnd);
                #                    break;
                #                    case toBottom:
                #                        element.bottomSide(hwnd);
                #                    break;
                #                    case maximize:
                #                        WinAPI::maximizeWindow(hwnd);
                #                    break;
                #                    case minimize:
                #                        WinAPI::minimizeWindow(hwnd);
                #                    break;
                #                    case fitWindow:
                #                        element.fitWindow(hwnd);
                #                    break;
                #                    case sendBack:
                #                        element.setWPos(hwnd,
                #                            1, //#HWND_BOTTOM,
                #                            0,0,0,0,#SWP_NOMOVE + #SWP_NOSIZE);
                #                    break;
                #                    case copy:
                #                        if(forCopy)
                #                            forCopy+="\r\n";
                #                        forCopy+=page.helpText();
                #                    break;
                #                }
                #            if(selection==copy)
                #            {
                #                buf.setText(forCopy);
                #                buf.toClipboard();
                #            }
                #        }
                #        else
                #        {
                #            if (element.confirm(strFmt(element.getText('Close all windows except "%1"'), WinApi::getWindowText(hwnd))))
                #                this.closeAllExcept([hwnd]);
                #        }
                #    }
                #    else
                #        super();
                #}
              ENDSOURCE
              SOURCE #mouseDown
                #public int mouseDown(int _x, int _y, int _button, boolean _Ctrl, boolean _Shift)
                #{
                #    int ret;
                #    int i;
                #    int hwnd;
                #
                #    ret = super(_x, _y, _button, _Ctrl, _Shift);
                #    //this.mouseUp(_x, _y, _button, _Ctrl, _Shift);
                #    return ret;
                #}
              ENDSOURCE
              SOURCE #mouseUp
                #public int mouseUp(int _x, int _y, int _button, boolean _Ctrl, boolean _Shift)
                #{
                #    int ret;
                #    int i;
                #    int hwnd;
                #
                #    ret = super(_x, _y, _button, _Ctrl, _Shift);
                #//    if(_Shift||_Ctrl)
                #//        return ret;
                #//    if(_button==1)
                #//    {
                #//        i=Tree.getFirstSelected();
                #//        while(i)
                #//        {
                #//            hwnd=tree.getItem(i).data();
                #//            infolog.activateWindow(hWnd);
                #//            i=Tree.getNextSelected(i);
                #//        }
                #//    }
                #    return ret;
                #}
              ENDSOURCE
            ENDMETHODS
            CONTAINER
            ENDCONTAINER
          ENDCONTROL
          CONTROL MENUBUTTON
            PROPERTIES
              Name                #MenuButton
              AutoDeclaration     #Yes
              Left                #Right edge
              Width               #15
              NormalResource      #3400
              Border              #Flat
              ShowShortCut        #No
              MultiSelect         #Yes
            ENDPROPERTIES
            METHODS
              Version: 3
              SOURCE #toolTip
                #public str toolTip()
                #{
                #    return "Toolbar Menus";
                #}
              ENDSOURCE
              SOURCE #showContextMenu
                #public int showContextMenu(int _menuHandle)
                #{
                #    int ret;
                #
                #    ret = super(_menuHandle);
                #
                #    return ret;
                #}
              ENDSOURCE
            ENDMETHODS
            CONTAINER
              CONTROL BUTTON
                PROPERTIES
                  Name                #Close
                  Text                #Close toolbar
                  ButtonDisplay       #Text & Image left
                  NormalResource      #7671
                  DisabledResource    #7671
                  Border              #Flat
                ENDPROPERTIES
                METHODS
                  Version: 3
                  SOURCE #clicked
                    #void clicked()
                    #{
                    #    ;
                    #    if (element.confirm(#_('Really wanna close Tabax?')))
                    #        element.close();
                    #        MenuButton.showContextMenu(this.handle());
                    #}
                  ENDSOURCE
                  SOURCE #toolTip
                    #public str toolTip()
                    #{
                    #  return #_('Close tabax');
                    #}
                  ENDSOURCE
                ENDMETHODS
              ENDCONTROL
              CONTROL BUTTON
                PROPERTIES
                  Name                #newProject
                  Text                #Create New Project
                  ButtonDisplay       #Text & Image left
                  NormalResource      #1090
                  DisabledResource    #1090
                  Border              #Flat
                ENDPROPERTIES
                METHODS
                  Version: 3
                  SOURCE #toolTip
                    #public str toolTip()
                    #{
                    #    return #_('Create New Project');
                    #}
                  ENDSOURCE
                  SOURCE #clicked
                    #void clicked()
                    #{
                    #    Args    args;
                    #    ;
                    #
                    #    args = new Args();
                    #    new MenuFunction(menuitemactionstr("MF_CreateNewProject"),MenuItemType::Action).run(args);
                    #
                    #}
                  ENDSOURCE
                ENDMETHODS
              ENDCONTROL
              CONTROL BUTTON
                PROPERTIES
                  Name                #CopyFields
                  Text                #Copy Fields To Clipboard
                ENDPROPERTIES
                METHODS
                  Version: 3
                  SOURCE #clicked
                    #void clicked()
                    #{
                    #    Args args;
                    #    ;
                    #    super();
                    #    args = new Args();
                    #    new MenuFunction(menuitemactionstr("MF_CopyFieldsToClipboard"),MenuItemType::Action).run(args);
                    #
                    #}
                  ENDSOURCE
                ENDMETHODS
              ENDCONTROL
            ENDCONTAINER
          ENDCONTROL
        ENDCONTAINER
      ENDDESIGN
    ENDFORM

    ***Element: FRM

    ; Microsoft Dynamics AX Forms unloaded
    ; --------------------------------------------------------------------------------
    FRMVERSION 5

    FORM #MF_QueryBrowser
      PROPERTIES
        Name                #MF_QueryBrowser
      ENDPROPERTIES
      METHODS
        Version: 3
        SOURCE #classDeclaration
          #// Created by GRR for QueryBrowser on 28.10.2007
          #public class FormRun extends ObjectRun
          #{
          #    Query                   query;
          #    container               cGrayFields;
          #
          #    FormStringControl       stringEditQuery,
          #                            stringEditXML;
          #
          #    FormGroupControl        _ctrlSplitVertical;
          #    SysFormSplitter_Y       _formSplitterVertical;
          #
          #    FormGroupControl        _ctrlGroupSQl;
          #
          #    FormStaticTextControl   fieldNameText;
          #}
        ENDSOURCE
        SOURCE #linkDS
          #void linkDS()
          #{
          #    int     i;
          #    int     dsCnt = query.dataSourceCount();
          #
          #    void joinDS(int _parentDS, int _childDS, int _joinMode, int _fetchMode)
          #    {
          #        FormDataSource      datasource;
          #        FormLinkType        linkType;
          #        ;
          #        datasource = element.dataSource(_childDS);
          #        datasource.joinSource(element.dataSource(_parentDS).id());
          #
          #        switch(_joinMode)
          #        {
          #            case JoinMode::InnerJoin :
          #                linkType = FormLinkType::InnerJoin;
          #            break;
          #
          #            case JoinMode::OuterJoin :
          #                linkType = FormLinkType::OuterJoin;
          #            break;
          #
          #            case JoinMode::ExistsJoin :
          #                linkType = FormLinkType::ExistJoin;
          #            break;
          #
          #            case JoinMode::NoExistsJoin :
          #                linkType = FormLinkType::NotExistJoin;
          #            break;
          #        }
          #        datasource.linktype(linkType);
          #        datasource.onlyFetchActive(_fetchMode);
          #    }
          #    ;
          #
          #    for (i=2; i<=dsCnt; i++)
          #        joinDS(query.dataSourceNo(i).parentDataSource().id(), i, query.dataSourceNo(i).joinMode(), query.dataSourceNo(i).fetchMode());
          #}
        ENDSOURCE
        SOURCE #parmGrayFields
          #container parmGrayFields(container _cGrayFields = cGrayFields)
          #{
          #    ;
          #    cGrayFields = _cGrayFields;
          #
          #    return cGrayFields;
          #}
        ENDSOURCE
        SOURCE #RunTimeControl_gotFocus
          #public void RunTimeControl_gotFocus()
          #{
          #    FormControl     formControl = element.controlCallingMethod();
          #    ;
          #    formControl.gotFocus();
          #    fieldNameText.text(formControl.helpText());
          #
          #    return;
          #}
        ENDSOURCE
        SOURCE #run
          #public void run()
          #{
          #    ;
          #    if(query)
          #    {
          #        element.doQuery();
          #        element.linkDS();
          #
          #        stringEditQuery.text(query.dataSourceNo(1).toString());
          #        stringEditXML.text  (query.xml());
          #    }
          #
          #    super();
          #}
        ENDSOURCE
        SOURCE #doQuery
          #void doQuery()
          #{
          #    if(query)
          #    {
          #        ds_ds.query(query);
          #        ds_ds.executeQuery();
          #    }
          #}
        ENDSOURCE
        SOURCE #parmQuery
          #Query parmQuery(Query _query = query)
          #{
          #    ;
          #    query = _query;
          #
          #    return query;
          #}
        ENDSOURCE
        SOURCE #init
          #public void init()
          #{
          #    super();
          #    this.controlMethodOverload(TRUE);
          #
          #    stringEditQuery    = element.control(control::StringEditQueryStr);
          #    stringEditXML      = element.control(control::StringEditXMLStr);
          #
          #    fieldNameText      = element.control(control::StaticTextFieldName);
          #    _ctrlSplitVertical = element.control(control::ctrlSplitVertical);
          #    _ctrlGroupSQL      = element.control(control::GroupSQL);
          #
          #    _formSplitterVertical   = new SysFormSplitter_Y(_ctrlSplitVertical, _ctrlGroupSQL, this);
          #    _ctrlSplitVertical.left(0);
          #}
        ENDSOURCE
      ENDMETHODS
      OBJECTBANK
        PROPERTIES
        ENDPROPERTIES
        DATASOURCE
          OBJECTPOOL
            PROPERTIES
              Name                #ds
              Table               #Common
              AllowEdit           #No
              AllowCreate         #No
              AllowDelete         #No
              InsertIfEmpty       #No
            ENDPROPERTIES
            FIELDLIST
            ENDFIELDLIST
          ENDOBJECTPOOL
          METHODS
            Version: 3
            SOURCE #displayOption
              #public void displayOption(Common _common, FormRowDisplayOption _options)
              #{
              #    int     len, i;
              #    ;
              #
              #    len = conLen(cGrayFields);
              #    if(len)
              #    {
              #        _options.backColor(winapi::RGB2int(192, 192, 192));
              #        for (i=1; i<=len; i++)
              #            _options.affectedElementsByControl(conpeek(cGrayFields, i));
              #    }
              #
              #    super(_common, _options);
              #}
            ENDSOURCE
            SOURCE #init
              #public void init()
              #{
              #    if(query)
              #        this.query(query);
              #
              #    super();
              #}
            ENDSOURCE
          ENDMETHODS
        ENDDATASOURCE
      ENDOBJECTBANK
      JOINS
      ENDJOINS
      DESIGN
        PROPERTIES
          Caption             #Analyzer
          TopMargin           #0
          BottomMargin        #0
          LeftMargin          #0
          RightMargin         #0
        ENDPROPERTIES
        CONTAINER
          CONTROL GROUP
            PROPERTIES
              Name                #GroupSQL
              Width               #Column width
              Height              #Column height
              VerticalSpacing     #0
              FrameType           #None
              TopMargin           #0
              BottomMargin        #0
              LeftMargin          #0
              RightMargin         #0
            ENDPROPERTIES
              CONTAINER
                CONTROL STATICTEXT
                  PROPERTIES
                    Name                #StaticTextFieldName
                    Visible             #No
                    Text                #
                  ENDPROPERTIES
                ENDCONTROL
                CONTROL TAB
                  PROPERTIES
                    Name                #Tab
                    Width               #Column width
                    Height              #Column height
                    VerticalSpacing     #0
                  ENDPROPERTIES
                  CONTAINER
                    CONTROL TABPAGE
                      PROPERTIES
                        Name                #TabPageSQL
                        Width               #Column width
                        Height              #Column height
                        VerticalSpacing     #0
                        HelpText            #@SYS57539
                        Caption             #@SYS57539
                        TopMargin           #0
                        BottomMargin        #0
                        LeftMargin          #0
                        RightMargin         #0
                      ENDPROPERTIES
                      CONTAINER
                        CONTROL STRINGEDIT
                          PROPERTIES
                            Name                #StringEditQueryStr
                            AllowEdit           #No
                            Width               #Column width
                            Height              #Column height
                            VerticalSpacing     #0
                            HelpText            #@SYS57539
                            MultiLine           #Yes
                            Font                #Courier New
                            FontSize            #9
                            Bold                #Normal
                            ShowLabel           #No
                            LabelAlignment      #Right
                          ENDPROPERTIES
                        ENDCONTROL
                      ENDCONTAINER
                    ENDCONTROL
                    CONTROL TABPAGE
                      PROPERTIES
                        Name                #TabPageXML
                        Top                 #Top edge
                        Width               #Column width
                        VerticalSpacing     #0
                        HelpText            #XML
                        Caption             #XML
                        TopMargin           #0
                        BottomMargin        #0
                        LeftMargin          #0
                        RightMargin         #0
                      ENDPROPERTIES
                      CONTAINER
                        CONTROL STRINGEDIT
                          PROPERTIES
                            Name                #StringEditXMLStr
                            AllowEdit           #No
                            Width               #Column width
                            Height              #Column height
                            VerticalSpacing     #0
                            HelpText            #XML
                            MultiLine           #Yes
                            Font                #Courier New
                            FontSize            #9
                            Bold                #Normal
                            ShowLabel           #No
                            LabelAlignment      #Right
                          ENDPROPERTIES
                        ENDCONTROL
                        CONTROL BUTTON
                          PROPERTIES
                            Name                #ButtonXML
                            VerticalSpacing     #0
                            HelpText            #XML
                            Text                #XML
                          ENDPROPERTIES
                          METHODS
                            Version: 3
                            SOURCE #clicked
                              #void clicked()
                              #{
                              #    TextBuffer  buf      = new TextBuffer();
                              #    str         fileName =  WinApi::getTempPath() + 'query.xml';
                              #    ;
                              #
                              #    super();
                              #
                              #    buf.setText(query.xml());
                              #    buf.ToFile(fileName);
                              #    WinApi::shellExecute(fileName);
                              #}
                            ENDSOURCE
                          ENDMETHODS
                        ENDCONTROL
                      ENDCONTAINER
                    ENDCONTROL
                  ENDCONTAINER
                ENDCONTROL
              ENDCONTAINER
          ENDCONTROL
          CONTROL GROUP
            PROPERTIES
              Name                #CtrlSplitVertical
              Width               #Column width
              Height              #5
              VerticalSpacing     #0
              AlignControl        #Yes
              FrameType           #Raised 3D
              BackgroundColor     #Window background
              TopMargin           #0
              BottomMargin        #0
              LeftMargin          #0
              RightMargin         #0
              HideIfEmpty         #No
              AlignChild          #No
            ENDPROPERTIES
            METHODS
              Version: 3
              SOURCE #mouseDown
                #int mouseDown(int x, int y, int button, Boolean Ctrl, Boolean Shift)
                #{
                #    int ret;
                #
                #    ret = super(x, y, button, Ctrl, Shift);
                #
                #    Return _formSplitterVertical.mouseDown(x, y, button, Ctrl, Shift);
                #}
              ENDSOURCE
              SOURCE #mouseMove
                #int mouseMove(int x, int y, int button, Boolean Ctrl, Boolean Shift)
                #{
                #    int ret;
                #
                #    ret = super(x, y, button, Ctrl, Shift);
                #
                #    Return _formSplitterVertical.mouseMove(x,y,button,ctrl,shift);
                #}
              ENDSOURCE
              SOURCE #mouseUp
                #int mouseUp(int x, int y, int button, Boolean Ctrl, Boolean Shift)
                #{
                #    int ret;
                #
                #    ret = super(x, y, button, Ctrl, Shift);
                #
                #    Return _formSplitterVertical.mouseUp(x, y, button, Ctrl, Shift);
                #}
              ENDSOURCE
            ENDMETHODS
              CONTAINER
              ENDCONTAINER
          ENDCONTROL
        ENDCONTAINER
      ENDDESIGN
    ENDFORM

    ***Element: FRM

    ; Microsoft Dynamics AX Forms unloaded
    ; --------------------------------------------------------------------------------
    FRMVERSION 5

    FORM #MF_CopyFieldsToClipboard
      PROPERTIES
        Name                #MF_CopyFieldsToClipboard
      ENDPROPERTIES
      METHODS
        Version: 3
        SOURCE #classDeclaration
          ##define.defaultIndentLevel(4)
          ##define.autoColWidth(-2)
          #public class FormRun extends ObjectRun
          #{
          #    MF_CopyFieldsToClipboard        axCopyTableFieldList;
          #    Source                          sourcePreviewText;
          #
          #    ImageListAppl_Query             imageListSmall;
          #
          #    SourceLine                      tableVariableName;
          #    TableName                       tableName;
          #    NoYes                           insertDeclarationValue;
          #    NoYes                           insertClearMethodValue;
          #    Integer                         NoneInsertUpdateMethodValue;
          #    Set                             fieldListSet;
          #
          #    FieldName                       firstFieldName;
          #    FieldName                       lastFieldName;
          #// > georg, 11.03.2008, Get the table from parameters,  -->
          #    str                             firstFieldValue;
          #    str                             lastFieldValue;
          #    boolean                         firstNeedQuotes;
          #    boolean                         lastNeedQuotes;
          #// < georg, 11.03.2008, Get the table from parameters,  <--
          #
          #    SysDictTable                    dictTable;
          #
          #    #localMacro.FormControlList
          #        tableVariableName,
          #        tableName,
          #        insertDeclarationValue,
          #        insertClearMethodValue,
          #        NoneInsertUpdateMethodValue
          #    #endMacro}
        ENDSOURCE
        SOURCE #indent
          #SourceLine indent()
          #{
          #    return strRep(" ", #defaultIndentLevel);
          #}
        ENDSOURCE
        SOURCE #getFieldsSelectedText
          #Description getFieldsSelectedText()
          #{
          #    return strFmt("%1 out of %2 fields selected", fieldListSet.elements(), ListViewFields.getCount());
          #}
        ENDSOURCE
        SOURCE #resetFieldsListViewChecked
          #void resetFieldsListViewChecked()
          #{
          #    Integer         iField;
          #    int             idx;
          #    FormListItem    item;
          #    SysDictField    dictField;
          #    ;
          #    ListViewFields.deleteAll();
          #    for (iField = 1; iField <= dictTable.fieldCnt(); iField++)
          #    {
          #        dictField = dictTable.fieldObject(dictTable.fieldCnt2Id(iField));
          #        if (this.fieldOK(dictField))
          #        {
          #            item = new FormListItem(dictField.name(), imageListSmall.image(imageListSmall.findFieldImage(dictField.baseType())));
          #            item.idx(iField);
          #            item.stateChecked(true);
          #            item.data(dictField.id());
          #            idx = ListViewFields.addItem(item);
          #            ListViewFields.setText(idx, dictField.label(), 1);
          #
          #            if (fieldListSet.elements() > 0 && fieldListSet.in(dictField.id()))
          #            {
          #                item = ListViewFields.getItem(idx);
          #                item.stateChecked(true);
          #                ListViewFields.setItem(item);
          #            }
          #        }
          #    }
          #    FieldsSelectedText.text(this.getFieldsSelectedText());
          #}
        ENDSOURCE
        SOURCE #runBase
          #RunBase runBase()
          #{
          #    return axCopyTableFieldList;
          #}
          #
        ENDSOURCE
        SOURCE #fieldOK
          #boolean fieldOK(SysDictField _dictField)
          #{
          #    return !_dictField.isSystem() && !match("DEL_+", _dictField.name());
          #}
        ENDSOURCE
        SOURCE #getFirstLastFields
          #void getFirstLastFields()
          #{
          #    SysDictField    dictField;
          #    Integer         iField;
          #    boolean         firstField = true;
          #
          #    ;
          #
          #    for (iField = 1; iField <= dictTable.fieldCnt(); iField++)
          #    {
          #        dictField = dictTable.fieldObject(dictTable.fieldCnt2Id(iField));
          #        if (this.fieldOK(dictField))
          #        {
          #            if (firstField)
          #            {
          #                firstFieldName = dictField.name();
          #// > georg, 11.03.2008, Get the table from parameters,  -->
          #                //firstFieldValue = strfmt('%1',axCopyTableFieldList.RecordBuffer().(dictField.extendedFieldId()));
          #                firstNeedQuotes = ((dictField.baseType()==Types::String) ||
          #                                   (dictField.baseType()==Types::RString) ||
          #                                   (dictField.baseType()==Types::VarString));
          #// < georg, 11.03.2008, Get the table from parameters,  <--
          #                firstField = false;
          #            }
          #// > georg, 11.03.2008, Get the table from parameters,  -->
          #            lastFieldName = dictField.name();
          #            if(dictField.arraySize()==1){
          #                //lastFieldValue = strfmt('%1',axCopyTableFieldList.RecordBuffer().(dictField.extendedFieldId()));
          #                lastNeedQuotes = ((dictField.baseType()==Types::String) ||
          #                                  (dictField.baseType()==Types::RString) ||
          #                                  (dictField.baseType()==Types::VarString));
          #            } else {
          #                lastFieldValue = '[]';
          #                lastNeedQuotes = true;
          #            }
          #// < georg, 11.03.2008, Get the table from parameters,  <--
          #        }
          #    }
          #}
        ENDSOURCE
        SOURCE #run
          #public void run()
          #{
          #    ;
          #    ListViewFields.setColumnWidth(0, #autoColWidth);
          #    ListViewFields.setColumnWidth(1, #autoColWidth);
          #
          #    super();
          #}
        ENDSOURCE
        SOURCE #initFieldsListView
          ##resAppl
          #void initFieldsListView()
          #{
          #    ;
          #    ListViewFields.addColumn(1, new FormListColumn("Field Name", 1,  #autoColWidth));
          #    ListViewFields.addColumn(2, new FormListColumn("Field Label", 2, #autoColWidth));
          #
          #    imageListSmall = new ImageListAppl_Query();
          #    imageListSmall.build();
          #    ListViewFields.setImagelist(imageListSmall.imageList(), false);
          #
          #    this.resetFieldsListViewChecked();
          #}
        ENDSOURCE
        SOURCE #simpleLine
          #void simpleLine(str _simpleStr)
          #{
          #    ;
          #    sourcePreviewText += this.indent() + _simpleStr + "\n";
          #}
        ENDSOURCE
        SOURCE #reBuildSourcePreview
          #void reBuildSourcePreview(str _varName = szTableVariableName.valueStr())
          #{
          #    Integer     maxFieldNameIndent()
          #    {
          #        return (max(strLen(firstFieldName), strLen(lastFieldName)) div #defaultIndentLevel + 1) * #defaultIndentLevel;
          #    }
          #    SourceLine  neededIndentLevel(FieldName _fieldName)
          #    {
          #        return strRep(" ", maxFieldNameIndent() - strLen(_fieldName));
          #    }
          #    ;
          #    sourcePreviewText = "";
          #    this.simpleLine(InsertTableDeclaration.value() ? strFmt("%1%3%2;", tableName, _varName, this.indent()) : "");
          #
          #    this.simpleLine(sourcePreviewText == this.indent() + "\n" ? "" : ";");
          #    this.simpleLine(InsertClearMethod.value() ? strFmt("%1.clear();", _varName) : "");
          #
          #    this.getFirstLastFields();
          #
          #// > georg, 11.03.2008, Get the table from parameters,  -->
          #if(!InsertValues.value()){
          #// < georg, 11.03.2008, Get the table from parameters,  <--
          #        this.simpleLine(strFmt("%1.%2%3=", _varName, firstFieldName, neededIndentLevel(firstFieldName)));
          #        this.simpleLine("...");
          #        this.simpleLine(strFmt("%1.%2%3=", _varName, lastFieldName, neededIndentLevel(lastFieldName)));
          #// > georg, 11.03.2008, Get the table from parameters,  -->
          #    } else {
          #        this.simpleLine(strFmt("%1.%2%3=%3%5%4%5", _varName, firstFieldName, neededIndentLevel(firstFieldName),firstFieldValue,firstNeedQuotes?'"':''));
          #        this.simpleLine("...");
          #        this.simpleLine(strFmt("%1.%2%3=%3%5%4%5", _varName, lastFieldName, neededIndentLevel(lastFieldName),lastFieldValue,lastNeedQuotes?'"':''));
          #    }
          #// < georg, 11.03.2008, Get the table from parameters,  <--
          #
          #    switch (InsertUpdateInsertmethod.selection())
          #    {
          #        case 0: this.simpleLine("");                                break;
          #        case 1: this.simpleLine(strFmt("%1.insert();", _varName));  break;
          #        case 2: this.simpleLine(strFmt("%1.update();", _varName));  break;
          #    }
          #
          #    SourcePreview.text(sourcePreviewText);
          #}
        ENDSOURCE
        SOURCE #validateVarName
          #boolean validateVarName(str _varName = szTableVariableName.valueStr())
          #{
          #    if (match('<[a-z_][a-z0-9_]', _varname))
          #    {
          #        VariableNameValid.imageResource(1030);
          #        return true;
          #    }
          #    else
          #    {
          #        VariableNameValid.imageResource(1031);
          #    }
          #    return false;
          #}
        ENDSOURCE
        SOURCE #initDataFromClass
          #void initDataFromClass()
          #{
          #    container   fieldListSetPacked;
          #    ;
          #    [#FormControlList] = axCopyTableFieldList.parmFormControlValues();
          #    fieldListSetPacked = axCopyTableFieldList.parmFieldListSet();
          #
          #    szTableVariableName.text(tableVariableName);
          #    insertTableDeclaration.value(insertDeclarationValue);
          #    insertClearMethod.value(insertClearMethodValue);
          #    InsertUpdateInsertmethod.selection(NoneInsertUpdateMethodValue);
          #    fieldListSet = Set::create(fieldListSetPacked);
          #
          #    dictTable = new SysDictTable(tableName2Id(tableName));
          #    if (!dictTable)
          #        throw error(strFmt("An unexpected error occured. Table '%1' not recognized", tableName));
          #
          #    element.design().caption(strFmt("Copy FieldList of '%1' table", tableName));
          #    InsertValues.visible(axCopyTableFieldList.RecordBuffer().RecId!=0);
          #}
        ENDSOURCE
        SOURCE #sendDataToClass
          #void sendDataToClass()
          #{
          #    ;
          #    tableVariableName           = szTableVariableName.valueStr();
          #    insertDeclarationValue      = insertTableDeclaration.value();
          #    insertClearMethodValue      = insertClearMethod.value();
          #    NoneInsertUpdateMethodValue = InsertUpdateInsertmethod.selection();
          #
          #    axCopyTableFieldList.parmFormControlValues([#FormControlList]);
          #    axCopyTableFieldList.parmFieldListSet(fieldListSet.pack());
          #    axCopyTableFieldList.parmUseRecordBuffer(InsertValues.value());
          #}
        ENDSOURCE
        SOURCE #closeOk
          #void closeOk()
          #{
          #    DialogRunbase dialog = element.args().caller();
          #    ;
          #    if (!element.validateVarName(szTableVariableName.valueStr()))
          #    {
          #        warning(strFmt("Variable name '%1' is not valid", szTableVariableName.valueStr()));
          #        return;
          #    }
          #    element.sendDataToClass();
          #
          #    dialog.updateServer();
          #
          #    if (axCopyTableFieldList.checkCloseDialog())
          #        super();
          #}
          #
        ENDSOURCE
        SOURCE #init
          #public void init()
          #{
          #    ;
          #    if (!element.args().caller())
          #        throw error(strFmt("Method '%1.%2()' has been incorrectly called", this.name(), funcName()));
          #
          #    axCopyTableFieldList =  element.args().caller().runbase();
          #    fieldListSet = new Set(Types::Integer);
          #
          #    super();
          #
          #    this.initDataFromClass();
          #    this.validateVarName();
          #    this.initFieldsListView();
          #    this.reBuildSourcePreview();
          #}
        ENDSOURCE
      ENDMETHODS
      OBJECTBANK
        PROPERTIES
        ENDPROPERTIES
      ENDOBJECTBANK
      JOINS
      ENDJOINS
      DESIGN
        PROPERTIES
          Caption             #Copy Table FieldList to Cllipboard
          Frame               #Dialog
          WindowType          #Popup
          SaveSize            #Yes
          HideToolbar         #Yes
          Columns             #2
          ArrangeGuide       
            ARRAY INDEX Columns
              #0
              #0
            ENDARRAY
          AllowUserSetup      #No
        ENDPROPERTIES
        CONTAINER
          CONTROL TAB
            PROPERTIES
              Name                #Tab
              Width               #Column width
              Height              #Column height
              Tabs                #1
              ShowTabs            #No
            ENDPROPERTIES
            CONTAINER
              CONTROL TABPAGE
                PROPERTIES
                  Name                #TabPage
                  Caption             #@SYS2952
                ENDPROPERTIES
                CONTAINER
                  CONTROL GROUP
                    PROPERTIES
                      Name                #dialogStartGrp
                      Visible             #No
                      FrameType           #None
                    ENDPROPERTIES
                      CONTAINER
                      ENDCONTAINER
                  ENDCONTROL
                  CONTROL GROUP
                    PROPERTIES
                      Name                #PreviewGrp
                      Width               #Column width
                      FrameType           #Edged 3D Line
                      Caption             #Code Preview
                      HideIfEmpty         #No
                    ENDPROPERTIES
                      CONTAINER
                        CONTROL STRINGEDIT
                          PROPERTIES
                            Name                #SourcePreview
                            AutoDeclaration     #Yes
                            Width               #Column width
                            Height              #110
                            Skip                #Yes
                            AlignControl        #No
                            LookupButton        #Never
                            ReplaceOnLookup     #No
                            ChangeCase          #None
                            MultiLine           #Yes
                            ShowLabel           #No
                            LabelPosition       #Above
                            LabelAlignment      #Right
                            ExtendedDataType   
                              ARRAY
                                #Source
                                #
                              ENDARRAY
                          ENDPROPERTIES
                          METHODS
                            Version: 3
                            SOURCE #gotFocus
                              #public void gotFocus()
                              #{
                              #    //Prevent Preview modificatoin, but keep the BackGroundColor of the window
                              #    #define.EM_SETREADONLY          (0x00CF)
                              #
                              #    ;
                              #    super();
                              #
                              #    winapi::SendMessageEx(SourcePreview.hWnd(), #EM_SETREADONLY, true, 0);
                              #}
                            ENDSOURCE
                          ENDMETHODS
                        ENDCONTROL
                      ENDCONTAINER
                  ENDCONTROL
                  CONTROL GROUP
                    PROPERTIES
                      Name                #SettingsGrp
                      Width               #Column width
                      FrameType           #Edged 3D Line
                      Caption             #Settings
                    ENDPROPERTIES
                      CONTAINER
                        CONTROL GROUP
                          PROPERTIES
                            Name                #VariableNameGrp
                            FrameType           #None
                            Columns             #2
                            ArrangeGuide       
                              ARRAY INDEX Columns
                                #0
                                #0
                              ENDARRAY
                          ENDPROPERTIES
                            CONTAINER
                              CONTROL STRINGEDIT
                                PROPERTIES
                                  Name                #szTableVariableName
                                  AutoDeclaration     #Yes
                                  DisplayLength       #50
                                  Label               #Variable Name
                                  LabelAlignment      #Right
                                  ExtendedDataType   
                                    ARRAY
                                      #SourceLine
                                      #
                                    ENDARRAY
                                ENDPROPERTIES
                                METHODS
                                  Version: 3
                                  SOURCE #textChange
                                    #public void textChange()
                                    #{
                                    #    super();
                                    #
                                    #    element.validateVarName(szTableVariableName.valueStr());
                                    #    element.reBuildSourcePreview(szTableVariableName.valueStr());
                                    #}
                                  ENDSOURCE
                                ENDMETHODS
                              ENDCONTROL
                              CONTROL WINDOW
                                PROPERTIES
                                  Name                #VariableNameValid
                                  AutoDeclaration     #Yes
                                  Height              #Column height
                                  Skip                #Yes
                                  ImageResource       #1031
                                  Imagemode           #Size to fit
                                  BackStyle           #Transparent
                                  BackgroundColor     #Button face (3D)
                                  ForegroundColor     #Button text
                                  ShowLabel           #No
                                ENDPROPERTIES
                              ENDCONTROL
                            ENDCONTAINER
                        ENDCONTROL
                        CONTROL GROUP
                          PROPERTIES
                            Name                #ExtraLinesGrp
                            Width               #Column width
                            FrameType           #None
                            Columns             #2
                            ArrangeGuide       
                              ARRAY INDEX Columns
                                #0
                                #0
                              ENDARRAY
                          ENDPROPERTIES
                            CONTAINER
                              CONTROL CHECKBOX
                                PROPERTIES
                                  Name                #InsertTableDeclaration
                                  AutoDeclaration     #Yes
                                  Label               #Insert Declaration
                                  LabelAlignment      #Right
                                ENDPROPERTIES
                                METHODS
                                  Version: 3
                                  SOURCE #clicked
                                    #public void clicked()
                                    #{
                                    #    super();
                                    #
                                    #    element.reBuildSourcePreview(szTableVariableName.valueStr());
                                    #}
                                  ENDSOURCE
                                ENDMETHODS
                              ENDCONTROL
                              CONTROL CHECKBOX
                                PROPERTIES
                                  Name                #InsertClearMethod
                                  AutoDeclaration     #Yes
                                  Label               #Insert Clear() method
                                  LabelAlignment      #Right
                                ENDPROPERTIES
                                METHODS
                                  Version: 3
                                  SOURCE #clicked
                                    #public void clicked()
                                    #{
                                    #    super();
                                    #
                                    #    element.reBuildSourcePreview(szTableVariableName.valueStr());
                                    #}
                                  ENDSOURCE
                                ENDMETHODS
                              ENDCONTROL
                              CONTROL CHECKBOX
                                PROPERTIES
                                  Name                #InsertValues
                                  AutoDeclaration     #Yes
                                  Label               #InsertValues
                                  LabelAlignment      #Right
                                ENDPROPERTIES
                                METHODS
                                  Version: 3
                                  SOURCE #clicked
                                    #public void clicked()
                                    #{
                                    #    super();
                                    #    element.reBuildSourcePreview(szTableVariableName.valueStr());
                                    #}
                                  ENDSOURCE
                                ENDMETHODS
                              ENDCONTROL
                              CONTROL COMBOBOX
                                PROPERTIES
                                  Name                #InsertUpdateInsertmethod
                                  AutoDeclaration     #Yes
                                  Left                #Auto (right)
                                  Text               
                                    ARRAY INDEX Items
                                      #Do not paste any methods
                                      #Paste Insert() method
                                      #Paste Update() method
                                    ENDARRAY
                                  Items               #3
                                  Label               #Insert Update() / Insert() method
                                  LabelPosition       #Above
                                  LabelAlignment      #Right
                                ENDPROPERTIES
                                METHODS
                                  Version: 3
                                  SOURCE #selectionChange
                                    #public int selectionChange()
                                    #{
                                    #    int ret;
                                    #
                                    #    ret = super();
                                    #
                                    #    element.reBuildSourcePreview(szTableVariableName.valueStr());
                                    #
                                    #    return ret;
                                    #}
                                  ENDSOURCE
                                ENDMETHODS
                              ENDCONTROL
                              CONTROL BUTTONGROUP
                                PROPERTIES
                                  Name                #RightButtonGrp
                                ENDPROPERTIES
                                CONTAINER
                                ENDCONTAINER
                              ENDCONTROL
                            ENDCONTAINER
                        ENDCONTROL
                      ENDCONTAINER
                  ENDCONTROL
                  CONTROL GROUP
                    PROPERTIES
                      Name                #ButtonsGrp
                      Width               #Column width
                      VerticalSpacing     #0
                      FrameType           #None
                      Columns             #3
                      ArrangeGuide       
                        ARRAY INDEX Columns
                          #0
                          #0
                          #0
                        ENDARRAY
                    ENDPROPERTIES
                      CONTAINER
                        CONTROL BUTTON
                          PROPERTIES
                            Name                #SelectAllBtn
                            Text                #Select All
                          ENDPROPERTIES
                          METHODS
                            Version: 3
                            SOURCE #clicked
                              #void clicked()
                              #{
                              #    Integer         iField;
                              #    SysDictField    dictField;
                              #    ;
                              #
                              #    super();
                              #
                              #    fieldListSet = new Set(Types::Integer);
                              #    for (iField = 1; iField <= dictTable.fieldCnt(); iField++)
                              #    {
                              #        dictField = dictTable.fieldObject(dictTable.fieldCnt2Id(iField));
                              #        if (element.fieldOK(dictField))
                              #        {
                              #            fieldListSet.add(dictField.id());
                              #        }
                              #    }
                              #
                              #    element.resetFieldsListViewChecked();
                              #}
                            ENDSOURCE
                          ENDMETHODS
                        ENDCONTROL
                        CONTROL BUTTON
                          PROPERTIES
                            Name                #SelectNoneBtn
                            Text                #Select None
                          ENDPROPERTIES
                          METHODS
                            Version: 3
                            SOURCE #clicked
                              #void clicked()
                              #{
                              #    super();
                              #
                              #    fieldListSet = new Set(Types::Integer);
                              #    element.resetFieldsListViewChecked();
                              #}
                            ENDSOURCE
                          ENDMETHODS
                        ENDCONTROL
                      ENDCONTAINER
                  ENDCONTROL
                  CONTROL GROUP
                    PROPERTIES
                      Name                #FieldListGrp
                      Width               #Column width
                      Height              #Column height
                      FrameType           #None
                    ENDPROPERTIES
                      CONTAINER
                        CONTROL LISTVIEW
                          PROPERTIES
                            Name                #ListViewFields
                            Width               #Column width
                            Height              #Column height
                            ViewType            #Report
                            CheckBox            #Yes
                          ENDPROPERTIES
                          METHODS
                            Version: 3
                            SOURCE #keyDown
                              #public boolean keyDown(int _vKey, boolean _Ctrl, boolean _Shift)
                              #{
                              #    #define.VK_SPACE(32)
                              #    FormListItem    item;
                              #    boolean         ret;
                              #    ;
                              #    ret = super(_vKey, _Ctrl, _Shift);
                              #
                              #    if (_vKey == #VK_SPACE)
                              #    {
                              #        item = this.getItem(ListViewFields.getNextItem(FormListNext::Selected));
                              #
                              #        if (item.stateChecked())
                              #            fieldListSet.remove(item.data());
                              #        else
                              #            fieldListSet.add(item.data());
                              #
                              #        FieldsSelectedText.text(element.getFieldsSelectedText());
                              #    }
                              #
                              #    return ret;
                              #}
                            ENDSOURCE
                            SOURCE #mouseDown
                              #public int mouseDown(int _x, int _y, int _button, boolean _Ctrl, boolean _Shift)
                              #{
                              #    #FormListControl
                              #    int             ret;
                              #    int             focus;
                              #    int             idx;
                              #    FormListItem    item;
                              #    ;
                              #    ret = super(_x, _y, _button, _Ctrl, _Shift);
                              #
                              #    [idx, focus] = this.hitTest(_x, _y);
                              #
                              #    if (focus & #FLCHT_ONITEMSTATEICON && this.getItem(idx))
                              #    {
                              #        item = this.getItem(idx);
                              #
                              #        if (item.stateChecked())
                              #            fieldListSet.remove(item.data());
                              #        else
                              #            fieldListSet.add(item.data());
                              #
                              #        FieldsSelectedText.text(element.getFieldsSelectedText());
                              #    }
                              #
                              #    return ret;
                              #}
                            ENDSOURCE
                          ENDMETHODS
                        ENDCONTROL
                        CONTROL STATICTEXT
                          PROPERTIES
                            Name                #FieldsSelectedText
                            AutoDeclaration     #Yes
                            Left                #Auto (right)
                            Text                #
                          ENDPROPERTIES
                        ENDCONTROL
                      ENDCONTAINER
                  ENDCONTROL
                ENDCONTAINER
              ENDCONTROL
            ENDCONTAINER
          ENDCONTROL
          CONTROL GROUP
            PROPERTIES
              Name                #BottomGrp
              Top                 #Bottom edge
              Width               #Column width
              FrameType           #Edged 3D Line
              Columns             #2
              ArrangeGuide       
                ARRAY INDEX Columns
                  #0
                  #0
                ENDARRAY
            ENDPROPERTIES
              CONTAINER
                CONTROL BUTTONGROUP
                  PROPERTIES
                    Name                #BottomButtonGrp
                    Left                #Auto (right)
                    SizeWidth           #No
                    ArrangeMethod       #Horizontal, flush right
                  ENDPROPERTIES
                  CONTAINER
                    CONTROL COMMANDBUTTON
                      PROPERTIES
                        Name                #CommandButtonOK
                        ShowShortCut        #No
                        DefaultButton       #Yes
                        Command             #263
                      ENDPROPERTIES
                    ENDCONTROL
                    CONTROL COMMANDBUTTON
                      PROPERTIES
                        Name                #CommandButtonCancel
                        ShowShortCut        #No
                        Command             #264
                      ENDPROPERTIES
                    ENDCONTROL
                  ENDCONTAINER
                ENDCONTROL
              ENDCONTAINER
          ENDCONTROL
        ENDCONTAINER
      ENDDESIGN
    ENDFORM

    ***Element: FRM

    ; Microsoft Dynamics AX Forms unloaded
    ; --------------------------------------------------------------------------------
    FRMVERSION 5

    FORM #MF_TabBar
      PROPERTIES
        Name                #MF_TabBar
      ENDPROPERTIES
      METHODS
        Version: 3
        SOURCE #classDeclaration
          #
          #public class FormRun extends ObjectRun
          #{
          #    #define.v('0.3.2')
          #    #localmacro.tabax_license
          #    #endmacro
          #
          #// =========== configuration ==============
          #    // prefixes of widow titles whist have
          #    // to have project icon.
          #    // add your prefix if you use localization other
          #    // than russian and english
          #    #localmacro.projectPrefixes
          #        #prefix("Projects\\Shared")
          #        #prefix("Ïðîåêò ")
          #        #prefix("Development project ")
          #        #prefix("Project ")
          #    #endmacro
          #    // timer interval in milliseconds for active windows scanning
          #    #define.windowsScanTimer(300)
          #//========= configuration end =========
          #    Map windows;
          #    Map titles;
          #    #resAppl
          #    #winAPI
          #    HWND topmost;
          #    HWND second;
          #    ObjectIdent currentFormRun;
          #    HWND currentFormRun_hwnd;
          #    imageListAppl_AOT imgApp;
          #    container p;
          #    DLL user32;
          #    DLLFunction isWindowVisibleFun;
          #    DLLFunction isIconicFun;
          #    DLLFunction isZoomedFun;
          #    DLLFunction openIconFun;
          #    DLLFunction getDesktopWindow;
          #    DLLFunction lockWindowUpdate;
          #    DLLFunction peekMessage;
          #    DLLFunction TranslateMessage;
          #    DLLFunction dispatchMessage;
          #    List mainMenu;
          #    Map mainMenuItems;
          #    boolean menuTree_notOpen;
          #    container MRUProjects;
          #    container editorSuffixes;
          #    int hand;
          #    HWND MdiClient;
          #    boolean fitMaximized;
          #
          #    boolean collapsed;
          #    Set maximized;
          #    container maximizedIdentities;
          #    FormTreeItem loadingMenuItem;
          #    str windowToolTip;
          #    str menuToolTip;
          #    str historyToolTip;
          #    FormButtonControl activeBut;
          #    FormTabPageControl activeTab;
          #    str v;
          #    Map openedProjects;
          #    // iteration:
          #        TreeNode current;
          #        Array iterators;
          #        Array lists;
          #        TreeNodeIterator tniterator;
          #        int sp, lists_sp;
          #        List currentList;
          #    //Map menuUsageStatistics;
          #    container packedMenuUsageStatistics;
          #    boolean menuOnlyPopular;
          #    boolean inDeletion;
          #    int maxCaptionSize;
          #    int windowsScanTimer;
          #    boolean paused;
          #    int heightDecrement;
          #     // Normal sizes for restore after maximization
          #    Map normalPositions;
          #    // Map hWnd --> FormName, MenuItemname
          #    Map formIdentity;
          #    // Map identity -> normal position;
          #    Map identityNormalPositions;
          #    Set retoreIfRestored;
          #    Map oldWindows;
          #    // Windows which probably have fixed size
          #    Map fixedWindows;
          #// === tabs parameters
          #    boolean sameTabSize;
          #    int maxTabSize;
          #    int minTabSize;
          #    int desktopWindow;
          #
          #    #define.SWP_NOACTIVATE(0x10)
          #
          #
          #    #define.CurrentVersion(8)
          #    #localmacro.List5
          #        maxCaptionSize
          #    #endmacro
          #    #localmacro.List6
          #        maxCaptionSize, fitMaximized
          #    #endmacro
          #    #localmacro.List7
          #        maxCaptionSize, fitMaximized, maximizedIdentities
          #    #endmacro
          #    #localmacro.List8
          #        maxCaptionSize, fitMaximized, maximizedIdentities, minTabSize, maxTabSize, sameTabSize
          #    #endmacro
          #    #localmacro.CurrentList
          #        #List8
          #    #endmacro
          #    #define.TCM_FIRST(0x1300)
          #    #define.TCM_GETIMAGELIST(#TCM_FIRST + 2)
          #    #define.TCM_SETIMAGELIST(#TCM_FIRST + 3)
          #    #define.TCM_GETITEMCOUNT(#TCM_FIRST + 4)
          #    #define.TCM_SETITEM(#TCM_FIRST + 6)
          #    #define.TCM_GETITEMRECT(#TCM_FIRST + 10)
          #    #define.TCM_SETITEMSIZE(#TCM_FIRST + 41)
          #    #define.TCM_SETMINTABWIDTH(#TCM_FIRST + 49)
          #    #define.TCM_GETCURSEL(#TCM_FIRST + 11)
          #    #define.TCM_SETCURSEL(#TCM_FIRST + 12)
          #    #define.TCM_HITTEST(#TCM_FIRST + 13)
          #    #define.TCS_FIXEDWIDTH(0x0400)
          #    #define.TCS_TOOLTIPS(0x4000)
          #    #define.TCS_FORCELABELLEFT(0x0020)
          #    #define.TCIF_IMAGE(0x0002)
          #    #define.GWL_STYLE(-16)
          #// === axPath
          #    #define.AxPath_Prefix('AxPath')
          #    #define.AxPath_AOTName('AOT')
          #    #define.AxPath_MenuItemName('MenuItem')
          #    #define.URL_PART_NONE(0)
          #    #define.URL_PART_SCHEME(1)
          #    #define.URL_PART_HOSTNAME(2)
          #    #define.URL_PART_USERNAME(3)
          #    #define.URL_PART_PASSWORD(4)
          #    #define.URL_PART_PORT(5)
          #    #define.URL_PART_QUERY(6)
          #    #define.WM_GETMINMAXINFO(0x24)
          #    #AOT
          #
          #
          #    #if.ReferencesPath
          #        #define.PaneWindowCL("AxPaneWnd")
          #        #define.ImageExt('png')
          #        #localmacro.recID2str
          #            int642str(%1)
          #        #endmacro
          #        #localmacro.str2recID
          #            str2int64(%1)
          #        #endmacro
          #        #define.Ax4
          #    #endif
          #
          #    #ifnot.ReferencesPath
          #        #define.PaneWindowCL("PaneWindowCL")
          #        #define.ImageExt('bmp')
          #        #localmacro.recID2str
          #            uint2str(%1)
          #        #endmacro
          #        #localmacro.str2recID
          #            str2int(%1)
          #        #endmacro
          #        #define.Ax3
          #    #endif
          #
          #// === i18n
          #    Session session;
          #    Map translations;
          #    #localmacro._
          #        element.getText(%1)
          #    #endmacro
          #
          #    #localmacro.language
          #        if (session.interfaceLanguage()=="%1")
          #        {
          #            translations=new Map(Types::String, Types::String);
          #    #endmacro
          #    #localmacro.endLanguage
          #        }
          #    #endmacro
          #// === events
          #    Map events;
          #    #localmacro.fireEvent
          #        __eventHandlersEnumerator__ = element.getEvent(identifierStr(%1)).getEnumerator();
          #        while(__eventHandlersEnumerator__.moveNext())
          #            __eventHandlersEnumerator__.current().%1%2;
          #    #endMacro
          #    SetEnumerator __eventHandlersEnumerator__;
          #}
        ENDSOURCE
        SOURCE #AxPath_findCommon
          #Common AxPath_findCommon(TableID _tableID, container _params)
          #{
          #    Query q=new Query();
          #    QueryBuildDataSource ds = q.addDataSource(_tableID);
          #    Common ret;
          #    QueryRun qr;
          #;
          #    if (this.AxPath_filterFromParams(ds, _params))
          #    {
          #        qr = new QueryRun(q);
          #        qr.next();
          #        ret = qr.get(_tableID);
          #    }
          #    return ret;
          #}
        ENDSOURCE
        SOURCE #AxPath_real2str
          #str AxPath_real2str(real _value)
          #{
          #    str ret = num2str(_value, 0, 16, 1, 0);
          #    int pointPos = strFind(ret, '.', 1, strLen(ret));
          #    int nonZeroPos;
          #;
          #    if (pointPos)
          #    {
          #        nonZeroPos = strNFind(ret, '0', strLen(ret), -strLen(ret));
          #        ret = nonZeroPos ? subStr(ret, 1, nonZeroPos) : '0';
          #        if (this.strEndsWith(ret, '.'))
          #            ret = subStr(ret, 1, strLen(ret) - 1);
          #    }
          #    return ret;
          #}
        ENDSOURCE
        SOURCE #AxPath_valueFromString
          #AnyType AxPath_valueFromString(Types _type, str _asString)
          #{
          #    switch (_type)
          #    {
          #        case Types::Date:
          #            return str2date(_asString, 321);
          #        case Types::Real:
          #            return str2num(_asString);
          #        case Types::Integer:
          #            return str2int(_asString);
          #        #if.ax4
          #            case Types::Int64:
          #                return str2int64(_asString);
          #        #endif
          #        default:
          #            return _asString;
          #    }
          #
          #    return null;
          #}
          #
        ENDSOURCE
        SOURCE #AxPath_filterFromParams
          #boolean AxPath_filterFromParams(QueryBuildDataSource _ds, container _params)
          #{
          #    int i;
          #    str name;
          #    str value;
          #    RecID recID;
          #    FieldID field;
          #    SysDictTable table = SysDictTable::newTableId(_ds.table());
          #    boolean ret;
          #;
          #    for (i=1; i<=conLen(_params); i++)
          #    {
          #        [name, value] = conPeek(_params, i);
          #        if (name != fieldStr(Common, dataAreaId))
          #        {
          #            field = fieldName2ID(_ds.table(), name);
          #
          #            if (!field)
          #                throw error(strFmt(this.getText("Field '%2' is not found in the table '%1'"), tableID2Name(_ds.table()), name));
          #
          #            _ds.addRange(field).value(
          #                queryValue(this.AxPath_valueFromString(
          #                    table.fieldObject(field).type(),
          #                    value
          #                ))
          #            );
          #            ret = true;
          #        }
          #    }
          #    return ret;
          #}
          #
        ENDSOURCE
        SOURCE #AxPath_keyFields
          #container AxPath_keyFields(TableID _table)
          #{
          #    SysDictTable table = SysDictTable::newTableId(_table);
          #    container ret;
          #    IndexID primaryIndexID = table.primaryIndex();
          #    SysDictIndex primaryIndex;
          #    int i;
          #;
          #    if (primaryIndexID)
          #    {
          #        primaryIndex = table.indexObject(primaryIndexID);
          #        for (i=1; i<=primaryIndex.numberOfFields(); i++)
          #            ret += primaryIndex.field(i);
          #    }
          #    else
          #        ret += fieldName2ID(_table, 'RecID');
          #    return ret;
          #}
        ENDSOURCE
        SOURCE #AxPath_keyByCommon
          #str AxPath_keyByCommon(Common _record)
          #{
          #    container fields = element.AxPath_keyFields(_record.TableId);
          #    int i;
          #    str ret;
          #    FieldID field;
          #    str strValue()
          #    {
          #        AnyType value = _record.(field);
          #        Types type = typeOf(value);
          #    ;
          #        switch(type)
          #        {
          #            case Types::Date:
          #                return date2str(value, 321, 2, 0, 2, 0, 4);
          #            case Types::Real:
          #                return this.AxPath_real2str(value);
          #            case Types::Enum, Types::Integer:
          #                return int2str(value);
          #
          #            default:
          #                return strFmt('%1', value);
          #        }
          #    }
          #;
          #    for (i=1; i<=conLen(fields); i++)
          #    {
          #        if (ret)
          #            ret += '&';
          #        field = conPeek(fields, i);
          #        ret += fieldId2name(_record.TableId, field) + '=' + this.urlEscape(strValue());
          #    }
          #    return ret;
          #}
        ENDSOURCE
        SOURCE #resourceName
          #str resourceName(str _subPath)
          #{
          #    return 'Tabax_' + strReplace(strReplace(_subPath, '.', '_'), '\\', '_');
          #}
        ENDSOURCE
        SOURCE #getResourcePath
          #str getResourcePath(str _subPath)
          #{
          #    str ret = this.fullInculdePath(_subPath);
          #    if (WinApi::fileExists(ret))
          #        return ret;
          #    return this.filePathFromResource(_subPath);
          #}
        ENDSOURCE
        SOURCE #fullInculdePath
          #str fullInculdePath(str _subpath)
          #{
          #    return this.pathCombine(XInfo::directory(DirectoryType::Include), 'tabax\\' + _subpath);
          #}
        ENDSOURCE
        SOURCE #filePathFromResource
          #str filePathFromResource(str _subPath)
          #{
          #    return SysResource::getImagePath(this.resourceName(_subPath));
          #}
        ENDSOURCE
        SOURCE #getDataFieldTreeNode
          #TreeNode getDataFieldTreeNode(FormRun _form)
          #{
          #    TreeNode ret;
          #    Object formControlEditField = _form.selectedControl();
          #    TreeNode getDataSourceNode()
          #    {
          #        int         dataSourceId;
          #        int         fieldExtId;
          #        str         dataMethodName;
          #        TreeNode    fieldNode;
          #    ;
          #        dataSourceId    = formControlEditField.dataSource();
          #        fieldExtId      = formControlEditField.dataField();
          #        dataMethodName  = formControlEditField.dataMethod();
          #        if (dataSourceId)
          #        {
          #            if (fieldExtId)
          #            {
          #                fieldNode = TreeNode::findNode(#TablesPath + #AOTRootPath + tableId2Name(_form.form().dataSource(dataSourceId).table()) + "\\Fields");
          #                if (fieldNode)
          #                    fieldNode = fieldNode.AOTfindChild(fieldId2Name(_form.form().dataSource(dataSourceId).table(), fieldExt2Id(fieldExtId)));
          #                return fieldNode;
          #            }
          #            else
          #            {
          #                if (dataMethodName)
          #                {
          #                    fieldNode = TreeNode::findNode(strFmt(#DataSourceMethodPath, #FormsPath + #AOTRootPath + _form.name(), _form.form().dataSource(dataSourceId).name(), dataMethodName));
          #                    if (!fieldNode)
          #                    {
          #                        fieldNode = TreeNode::findNode(strFmt(#MethodPath, #TablesPath + #AOTRootPath + tableId2Name(_form.form().dataSource(dataSourceId).table()), dataMethodName));
          #                        return fieldNode;
          #                    }
          #                }
          #            }
          #        }
          #        return null;
          #    }
          #;
          #    switch (formControlEditField.handle())
          #    {
          #        case classNum(FormStringControl):
          #        case classNum(FormRealControl):
          #        case classNum(FormIntControl):
          #        case classNum(FormDateControl):
          #        case classNum(FormComboBoxControl):
          #        case classNum(FormRadioControl):
          #        case classNum(FormTimeControl):
          #            if (formControlEditField.extendedDataType())
          #                ret = new SysDictType(formControlEditField.extendedDataType()).treeNode();
          #            else
          #                ret = getDataSourceNode();
          #            break;
          #        case classNum(FormCheckBoxControl):
          #            ret = getDataSourceNode();
          #            break;
          #    }
          #    return ret;
          #}
        ENDSOURCE
        SOURCE #showControlInfo
          #public void showControlInfo(FormRun _form)
          #{
          #    #define.taskCtrlQ(264)
          #    SysDictField        dictField;
          #    FormControl         formControl = _form.selectedControl();
          #    FormStringControl   formStringControl;
          #    FormButtonControl   formButtonControl;
          #    SysDictEnum         dictEnum = new SysDictEnum(enumNum(Types));
          #    SysDictEnum         dictEnums;
          #    FormDataSource      formDataSource =  _form.objectSet();
          #    TreeNode node;
          #;
          #
          #    if(formControl && formDataSource)
          #    {
          #        node = element.controlByName(element.formByName(_form.name()), formControl.name());
          #        switch(SysFormRun::controlType(classIdGet(formControl)))
          #        {
          #            case FormControlType::CheckBox :
          #            case FormControlType::ComboBox :
          #            case FormControlType::Date :
          #            case FormControlType::Grid :
          #            case FormControlType::Group :
          #            case FormControlType::Integer :
          #            case FormControlType::RadioButton :
          #            case FormControlType::Real :
          #            case FormControlType::StaticText :
          #            case FormControlType::String :
          #            case FormControlType::Time :
          #                formStringControl = formControl;
          #                if(formStringControl.dataField() && formDataSource.table())
          #                {
          #                    info(strfmt("Control Name   -> %1", formStringControl.name()), '', new SysInfoAction_Properties(node.treeNodePath()));
          #                    dictField = new SysDictField(formDataSource.table(), fieldExt2Id(formStringControl.dataField()));
          #                    info(strfmt('Table.Field       -> %2.%1',
          #                        fieldId2Name(formDataSource.table(), fieldExt2Id(formStringControl.dataField())),
          #                        tableId2Name(formDataSource.table())), '',
          #                        dictField ?  new SysInfoAction_Properties(dictField.treeNode().treeNodePath()): null);
          #
          #                    if(dictField)
          #                    {
          #                        info(strfmt('Type                -> %1', dictEnum.index2Symbol(dictField.baseType())));
          #
          #                        if(dictField.baseType() == typeOf(Types::Enum))
          #                        {
          #                            dictEnums = new SysDictEnum(dictField.enumId());
          #                            info(strfmt('Base Enum       -> %1', dictEnums.name()));
          #                        }
          #
          #                        info(strfmt('Ext Data Type -> %1', extendedTypeId2name(dictField.typeId())));
          #                        info(strfmt('Size                  ->  %1', int2str(dictField.stringLen())));
          #                        info(strfmt('Max Right        -> %1', dictField.rights()));
          #                        info(strfmt('Label                -> %1:  %2', dictField.labelLabel(), dictField.label()));
          #                        info(strfmt('Help                 -> %1:  %2', dictField.helpLabelId(),dictField.help()));
          #                    }
          #                }
          #
          #                if(formStringControl.dataMethod())
          #                {
          #                    info(strfmt('Method %1.%2', tableId2Name(formDataSource.table()), formStringControl.dataMethod()));
          #                }
          #                break;
          #            }
          #        }
          #}
        ENDSOURCE
        SOURCE #AxPath_getDataAreaId
          #//+ Dcs 04.04.2007 ÑÁÐFI-200703_02 KC
          #DataAreaId AxPath_getDataAreaId(str _extra)
          #{
          #    container params=this.AxPath_parseParams(_extra);
          #    int line;
          #    int pos;
          #    int i;
          #    str name;
          #    str value;
          #    DataAreaId DataAreaId;
          #;
          #    for (i=1; i<=conLen(params); i++)
          #    {
          #        [name, value] = conPeek(params, i);
          #        if (name=='Area')
          #            DataAreaId = value;
          #    }
          #    return DataAreaId;
          #}
          #//- Dcs 04.04.2007 ÑÁÐFI-200703_02 KC
        ENDSOURCE
        SOURCE #fitAndRemember
          #void fitAndRemember(HWND _child)
          #{
          #    boolean fixedWidth;
          #    boolean fixedHeight;
          #;
          #    [fixedWidth, fixedHeight] = this.fitWindow(_child);
          #    if (fixedWidth || fixedHeight)
          #        fixedWindows.insert(_child, [fixedWidth, fixedHeight]);
          #
          #}
        ENDSOURCE
        SOURCE #GetMaxSize
          #container getMaxSize(HWnd _hwnd)
          #{
          #//typedef struct {
          #//    POINT ptReserved; 0 (x:0, y:4)
          #//    POINT ptMaxSize;  8 (x:8, y:12)
          #//    POINT ptMaxPosition; 16 (x:16, y:20)
          #//    POINT ptMinTrackSize; 24 (x:24, y:28)
          #//    POINT ptMaxTrackSize; 32 (x:32, y:36)
          #//} MINMAXINFO; 40
          #    Binary ret=new Binary(4*2*5);
          #    Binary ptr=new Binary(4);
          #    int msx;
          #    int msy;
          #    int mpx;
          #    int mpy;
          #    int mtx;
          #    int mty;
          #    int mxtx;
          #    int mxty;
          #;
          #    ptr.binary(0, ret);
          #
          #//        WinApi::sendMessageEx(tabPageControl.hWnd(), #TCM_GETITEMRECT, 0, ptr.dWord(0));
          #    WinApi::sendMessageEx(_hwnd, #WM_GETMINMAXINFO,  0, ptr.dWord(0));
          #    msx = ret.dWord(8);
          #    msy = ret.dWord(12);
          #    mpx = ret.dWord(16);
          #    mpy = ret.dWord(20);
          #    mtx = ret.dWord(24);
          #    mty = ret.dWord(28);
          #    mxtx = ret.dWord(32);
          #    mxty = ret.dWord(36);
          #    return [ret.dWord(32), ret.dWord(36)];
          #}
        ENDSOURCE
        SOURCE #pathCombine
          #str pathCombine(str _path, str _part)
          #{
          #    return  _path + (this.strEndsWith(_path, '\\') ? '' : '\\') + _part;
          #}
        ENDSOURCE
        SOURCE #loadLanguageFile
          #void loadLanguageFile(str _fileName)
          #{
          #    AsciiIO io=new AsciiIO(_fileName, 'r');
          #    container data;
          #;
          #    if (!translations)
          #        translations=new Map(Types::String, Types::String);
          #    io.inFieldDelimiter('\r\n\r\n');
          #    io.inRecordDelimiter('\r\n---\r\n');
          #    data = io.read();
          #    while (data)
          #    {
          #        data = io.read();
          #        this.translate(conPeek(data, 1), conPeek(data, 2));
          #    }
          #}
        ENDSOURCE
        SOURCE #editConfiguration
          #void editConfiguration()
          #{
          #    boolean successful;
          #    Dialog d=new Dialog(#_('Tabax ')+v+#_(' preferences'));
          #    DialogField dialogMaxCaptionSize=d.addFieldValue(typeID(MaximumLength), maxCaptionSize,
          #        #_('Maximal caption size'));
          #    DialogField dialogFitMaximized=d.addFieldValue(typeID(NoYes), fitMaximized,
          #        #_('Fit maximized windows'), #_('Fit maximized windows to the client area'));
          #    DialogField dialogSameSize = d.addFieldValue(typeID(NoYes), sameTabSize, #_("Tabs have same size"));
          #    DialogField dialogMinTabSize = d.addFieldValue(typeID(Integer), minTabSize, #_("Minimal tab size"));
          #    DialogField dialogMaxTabSize = d.addFieldValue(typeID(Integer), maxTabSize, #_("Maximal tab size"));
          #    #fireEvent(beforeSetupDialog, (element, d))
          #    successful = d.run();
          #    if(successful)
          #    {
          #        maxCaptionSize = dialogMaxCaptionSize.value();
          #        fitMaximized = dialogFitMaximized.value();
          #        minTabSize = dialogMinTabSize.value();
          #        maxTabSize = dialogMaxTabSize.value();
          #        maxTabSize = max(0, maxTabSize);
          #        minTabSize = max(0, minTabSize);
          #        if (maxTabSize)
          #            minTabSize = min(minTabSize, maxTabSize);
          #        sameTabSize = dialogSameSize.value();
          #    }
          #    #fireEvent(afterSetupDialog, (element, d, successful))
          #}
        ENDSOURCE
        SOURCE #rememberOldWindow
          #void rememberOldWindow(Hwnd _hwnd)
          #{
          #;
          #    oldWindows.insert(_hwnd, [this.isIconic(_hwnd), this.getMdiClientRelativeRect(_hwnd)]);
          #}
        ENDSOURCE
        SOURCE #wasIconic
          #boolean wasIconic(HWnd _hwnd)
          #{
          #    boolean wasIconic;
          #    container oldPosition;
          #;
          #    if (oldWindows.exists(_hwnd))
          #    {
          #        [wasIconic, oldPosition] = oldWindows.lookup(_hwnd);
          #        return wasIconic;
          #    }
          #    return false;
          #}
        ENDSOURCE
        SOURCE #positionChanged
          #boolean positionChanged(HWnd _hwnd)
          #{
          #    boolean wasIconic;
          #    container oldPosition;
          #;
          #    if (oldWindows.exists(_hwnd))
          #    {
          #        [wasIconic, oldPosition] = oldWindows.lookup(_hwnd);
          #        return oldPosition!=this.getMdiClientRelativeRect(_hwnd);
          #    }
          #    return false;
          #}
        ENDSOURCE
        SOURCE #restoreNormalPosition
          #void restoreNormalPosition(Hwnd _hwnd)
          #{
          #    int x1;
          #    int y1;
          #    int x2;
          #    int y2;
          #    container normal;
          #;
          #    if (normalPositions.exists(_hwnd))
          #    {
          #        normal = normalPositions.lookup(_hwnd);
          #        [x1, y1, x2, y2] = normal;
          #        element.prepareToSide(_hwnd);
          #        WinApi::setWindowPos(_hwnd, x1, y1, x2-x1+1, y2-y1+1);
          #    }
          #}
        ENDSOURCE
        SOURCE #rememberNormalPosition
          #void rememberNormalPosition(Hwnd _hwnd)
          #{
          #    container position;
          #;
          #    position = element.getMdiClientRelativeRect(_hwnd);
          #    normalPositions.insert(_hwnd, position);
          #}
        ENDSOURCE
        SOURCE #openIcon
          #boolean openIcon(int _handle)
          #{
          #    return openIconFun.call(_handle)? true:false;
          #}
        ENDSOURCE
        SOURCE #loadDictionary
          #void loadDictionary()
          #{
          #    str lngFilePath;
          #;
          #    session = new Session();
          #    lngFilePath = this.getResourcePath('lang\\' + session.interfaceLanguage() + '.txt');
          #    if (lngFilePath)
          #        this.loadLanguageFile(lngFilePath);
          #}
        ENDSOURCE
        SOURCE #getText
          #str getText(str _s)
          #{
          #    return (translations && translations.exists(_s)) ? translations.lookup(_s) : _s;
          #}
        ENDSOURCE
        SOURCE #processMaximizations
          #void processMaximizations(HWnd _child)
          #{
          #    int idx;
          #    boolean wasIconic;
          #    container oldPosition;
          #    boolean fixedWidth;
          #    boolean fixedHeight;
          #    void deleteFromMaximized()
          #    {
          #    ;
          #        maximized.remove(_child);
          #        if (formIdentity.exists(_child))
          #        {
          #            idx = conFind(maximizedIdentities, formIdentity.lookup(_child));
          #            if (idx)
          #                maximizedIdentities = conDel(maximizedIdentities, idx, 1);
          #        }
          #    }
          #    if (this.isZoomed(_child))
          #    {
          #        if (maximized.in(_child) && !this.wasIconic(_child))
          #        {
          #            this.restoreNormalPosition(_child);
          #            deleteFromMaximized();
          #        }
          #        else
          #        {
          #            maximized.add(_child);
          #            if (formIdentity.exists(_child))
          #            {
          #                idx = conFind(maximizedIdentities, formIdentity.lookup(_child));
          #                if (!idx)
          #                    maximizedIdentities += formIdentity.lookup(_child);
          #                if (normalPositions.exists(_child))
          #                    identityNormalPositions.insert(formIdentity.lookup(_child), normalPositions.lookup(_child));
          #            }
          #            this.fitAndRemember(_child);
          #        }
          #    }
          #    else
          #    {
          #        if (maximized.in(_child))
          #        {
          #            if (!this.isIconic(_child))
          #            {
          #                if(this.positionChanged(_child))
          #                {
          #                    deleteFromMaximized();
          #                    this.rememberNormalPosition(_child);
          #                }
          #                else
          #                {
          #                    fixedWidth = false;
          #                    fixedHeight = false;
          #                    if (fixedWindows.exists(_child))
          #                    {
          #                        [fixedWidth, fixedHeight] = fixedWindows.lookup(_child);
          #                        this.fitWindow(_child, true, fixedWidth, fixedHeight);
          #                    }
          #                    else
          #                        this.fitAndRemember(_child);
          #                }
          #            }
          #            else
          #            {
          #                retoreIfRestored.add(_child);
          #                deleteFromMaximized();
          #            }
          #        }
          #        else
          #        {
          #            if (!this.isIconic(_child))
          #            {
          #                if (retoreIfRestored.in(_child))
          #                {
          #                    this.restoreNormalPosition(_child);
          #                    retoreIfRestored.remove(_child);
          #                }
          #                else
          #                {
          #                    this.rememberNormalPosition(_child);
          #                }
          #            }
          #        }
          #    }
          #    if (this.isIconic(_child))
          #        this.processIconic(_child);
          #    this.rememberOldWindow(_child);
          #}
          #
        ENDSOURCE
        SOURCE #processFormIdentity
          #void processFormIdentity()
          #{
          #    FormRun formRun;
          #;
          #    if (infolog.parmLastActivatedForm() && infolog.parmLastActivatedForm().object())
          #    {
          #        formRun = infolog.parmLastActivatedForm().object();
          #        if (formRun && formRun.args())
          #            formIdentity.insert(formRun.hWnd(), enum2str(formRun.args().menuItemType()) + ' ' + formRun.args().menuItemName() + ' ' + formRun.name());
          #    }
          #}
        ENDSOURCE
        SOURCE #getMdiClientRelativeRect
          #// returns rectangle relative to mdiClient
          #container getMdiClientRelativeRect(HWND _hwnd)
          #{
          #    int x1;
          #    int y1;
          #    int x2;
          #    int y2;
          #;
          #    [x1, y1, x2, y2] = this.getWindowRect(_hwnd);
          #    [x1, y1] = WinApi::screenToClient(mdiClient, x1, y1);
          #    [x2, y2] = WinApi::screenToClient(mdiClient, x2, y2);
          #    return [x1, y1, x2, y2];
          #}
        ENDSOURCE
        SOURCE #processFormIdentity_closing
          #void processFormIdentity_closing(HWnd _hwnd)
          #{
          #    FormRun formRun;
          #;
          #    if (formIdentity.exists(_hwnd))
          #        formIdentity.remove(_hwnd);
          #}
        ENDSOURCE
        SOURCE #getEvent
          #Set getEvent(str _id)
          #{
          #    Set ret;
          #    if (!events)
          #        events = new Map(Types::String, Types::Class);
          #    if (events.exists(_id))
          #        ret = events.lookup(_id);
          #    else
          #    {
          #        ret = new Set(Types::Class);
          #        events.insert(_id, ret);
          #    }
          #    return ret;
          #}
        ENDSOURCE
        SOURCE #processWindowAdd
          #void processWindowAdd(Hwnd _hwnd)
          #{
          #    int idx;
          #    str identity;
          #    if (formIdentity.exists(_hwnd))
          #    {
          #        idx = conFind(maximizedIdentities, formIdentity.lookup(_hwnd));
          #        if (idx)
          #        {
          #            //maximizedIdentities = conDel(maximizedIdentities, idx, 1);
          #            this.fitAndRemember(_hwnd);
          #            this.rememberOldWindow(_hwnd);
          #            maximized.add(_hwnd);
          #            identity = conPeek(maximizedIdentities, idx);
          #            if (identityNormalPositions.exists(identity))
          #                normalPositions.insert(_hwnd, identityNormalPositions.lookup(identity));
          #
          #        }
          #    }
          #}
        ENDSOURCE
        SOURCE #translate
          #void translate(str _en, str _local)
          #{
          #    ;
          #    translations.insert(_en, _local);
          #}
        ENDSOURCE
        SOURCE #subscribe
          #void subscribe(str _eventID, Object _o)
          #{
          #    this.getEvent(_eventID).add(_o);
          #}
        ENDSOURCE
        SOURCE #autoheight
          #void autoHeight()
          #{
          #    int x,y,w,h;
          #    int xt,yt,wt,ht;
          #    int h2;
          #    ;
          #    [xt,yt,wt,ht]=element.getWindowRect(tabs.Hwnd());
          #    [x,y,w,h]=element.getWindowRect(this.Hwnd());
          #    //ht = tabs.heightValue();
          #//    this.moveWindow(this.resizeHwnd(),x,y,_value,h-5,true);
          #    ht -= heightDecrement;
          #    if (ht!=h)
          #    {
          #        WINAPI::setWindowPos(this.Hwnd(),0,0, w - x, ht - y, true,false,
          #            32 //#SWP_FRAMECHANGED
          #            +
          #            256 //#SWP_NOCOPYBITS
          #        );
          #    }
          #}
        ENDSOURCE
        SOURCE #confirm
          #boolean confirm(str _message)
          #{
          #    return Box::yesNo(_message,
          #                DialogButton::No, 'tabax') == DialogButton::Yes;
          #}
        ENDSOURCE
        SOURCE #isZoomed
          #boolean isZoomed(int _handle)
          #{
          #    return isZoomedFun.call(_handle)? true:false;
          #}
        ENDSOURCE
        SOURCE #isAltButtonDown
          # // returns true if the shift button is pressed at the time of invocation
          ##define.VK_ALT(0x12)
          #static boolean isAltButtonDown()
          #{
          #    DLL         _winApiDLL      = new DLL('USER32');
          #    DLLFunction _getKeyState    = new DLLFunction(_winApiDLL, 'GetKeyState');
          #    int retval;
          #
          #    _getKeyState.returns(ExtTypes::Word);
          #    _getKeyState.arg(ExtTypes::DWord);
          #
          #    retval = _getKeyState.call(#VK_ALT);
          #
          #    return retval > 0x7FFF;
          #}
        ENDSOURCE
        SOURCE #topmost
          #HWND topmost()
          #{
          #    return topmost;
          #}
        ENDSOURCE
        SOURCE #formByName
          #TreeNode formByName(str _name)
          #{
          #    return TreeNode::findNode(@'\Forms\'+_name);
          #}
        ENDSOURCE
        SOURCE #controlByName
          #/// returns control from form _form with the name _name
          #TreeNode controlByName(TreeNode _form, str _name)
          #{
          #    TreeNodeTraverser i = new TreeNodeTraverser(_form);
          #    TreeNode node = i.next();
          #    while (node)
          #    {
          #        if (match(@": +name: +#"+_name+': +', node.AOTgetProperties()))
          #            return node;
          #        node = i.next();
          #    }
          #    return null;
          #}
        ENDSOURCE
        SOURCE #tabIsSelected
          #boolean tabIsSelected(FormTabPageControl _page)
          #{
          #    return this.tabIndex(_page) ==
          #            WinApi::sendMessageEx(this.getParent(_page.hWnd()), #TCM_GETCURSEL, 0, 0);
          #}
        ENDSOURCE
        SOURCE #tabIndex
          #int tabIndex(FormTabPageControl tabPageControl)
          #{
          #    int hWnd;
          #    int i;
          #    int pos;
          #    str GetClassName(int _hWnd)
          #    {
          #        DLL         _Userdll        = new DLL("User32.dll");
          #        DLLFunction _getClassName   = new DLLFunction(_Userdll, "GetClassNameA");
          #        Binary      className       = new Binary(100);
          #        ;
          #        _getClassName.arg(ExtTypes::DWord, ExtTypes::Pointer, ExtTypes::DWord);
          #        _getClassName.returns(ExtTypes::DWord);
          #        if (_getClassName.call(_hWnd, className, 100))
          #            return className.string(0);
          #        else
          #            return "";
          #    }
          #    ;
          #    if (tabPageControl && tabPageControl.hWnd())
          #    {
          #        pos = 0;
          #        hWnd = tabPageControl.hWnd();
          #        while (hWnd)
          #        {
          #            hWnd = winapi::getWindow(hWnd, #GW_HWNDPREV);
          #            if (hWnd && GetClassName(hWnd) == #PaneWindowCL)
          #                pos++;
          #        }
          #    }
          #    return pos;
          #}
        ENDSOURCE
        SOURCE #setTabSelected
          #int setTabSelected(FormTabPageControl _page)
          #{
          #    int ret = WinApi::sendMessageEx(this.getParent(_page.hWnd()), #TCM_SETCURSEL, this.tabIndex(_page), 0);
          #    return ret;
          #}
        ENDSOURCE
        SOURCE #asserthasAccess
          #void assertHasAccess(SecurityKeyID _key, AccessType _type=AccessType::Edit, str _message='')
          #{
          #    DictSecurityKey key=new DictSecurityKey(_key);
          #    ;
          #    if (!hasSecuritykeyAccess(_key, _type))
          #        throw new error(
          #            _message ? _message :
          #            strFmt(
          #                element.getText('There is no access to "%1"'),
          #                key.label()
          #            )
          #         );
          #}
        ENDSOURCE
        SOURCE #assertDevelopment
          #void assertDevelopment()
          #{
          #;
          #    this.assertHasAccess(securityKeyNum(SysDevelopment));
          #}
        ENDSOURCE
        SOURCE #processEditBox
          #void processEditBox(str _s)
          #{
          #    TreeNode node = TreeNode::findNode(_s);
          #    boolean skipDefault;
          #    str restOfString()
          #    {
          #        return subStr(_s, 2, strLen(_s)-1);
          #    }
          #;
          #    __eventHandlersEnumerator__ = element.getEvent(identifierStr(beforeStringInput)).getEnumerator();
          #    while(__eventHandlersEnumerator__.moveNext() && !skipDefault)
          #        skipDefault = __eventHandlersEnumerator__.current().beforeStringInput(this, _s);
          #    if (!skipDefault)
          #    {
          #        if (node)
          #        {
          #            if (node.handle() == classNum(MemberFunction))
          #                node.AOTedit();
          #            else
          #                node.AOTnewWindow();
          #        }
          #        else if (this.AxPath_accepts(_s))
          #            this.AxPath_go(_s);
          #        else if (this.strStartsWith(_s, '?'))
          #            this.eval(restOfString());
          #        else if (this.strStartsWith(_s, '!'))
          #            this.runScript(restOfString());
          #        //else
          #            //this.axSearch(searchEd.text());
          #    }
          #}
        ENDSOURCE
        SOURCE #AxPath_fromFormRun
          #str AxPath_fromFormRun(FormRun _form, Args _args = _form.args())
          #{
          #    str ret;
          #    SysDictEnum menuItemTypeEnum;
          #    RecID recID;
          #;
          #    if (!_args.caller())
          #    {
          #        menuItemTypeEnum = new SysDictEnum(enumNum(MenuItemType));
          #        ret = #AxPath_prefix + '://' + #AxPath_MenuItemName + '/' +
          #            menuItemTypeEnum.value2Symbol(_args.menuItemType())
          #            + '/' + _args.menuItemName();
          #
          #        ret += '?' + fieldStr(Common, dataAreaId) + '=' + curext(); // Dcs 04.04.2007 ÑÁÐFI-200703_02 KC
          #
          #        if (_form.dataSourceCount())
          #        {
          #            recID = _form.dataSource(1).cursor().RecId;
          #            if (recID)
          #                ret += '&' + this.AxPath_keyByCommon(_form.dataSource(1).cursor());
          #        }
          #    }
          #    return ret;
          #}
        ENDSOURCE
        SOURCE #AxPath_getLineAndPos
          #container AxPath_getLineAndPos(str _extra)
          #{
          #    container params=this.AxPath_parseParams(_extra);
          #    int line;
          #    int pos;
          #    int i;
          #    str name;
          #    str value;
          #;
          #    for (i=1; i<=conLen(params); i++)
          #    {
          #        [name, value] = conPeek(params, i);
          #        if (name=='line')
          #            line=str2int(value);
          #        if (name=='pos')
          #            pos=str2int(value);
          #    }
          #    return [line, pos];
          #}
        ENDSOURCE
        SOURCE #menuItemTypeBySymbol
          #MenuItemType menuItemTypeBySymbol(str _symbol)
          #{
          #    return new SysDictEnum(enumNum(MenuItemType)).symbol2Value(_symbol);
          #}
        ENDSOURCE
        SOURCE #strStartsWith
          #boolean strStartsWith(str _s, str _possiblePrefix)
          #{
          #    return subStr(_s, 1, strLen(_possiblePrefix)) == _possiblePrefix;
          #}
        ENDSOURCE
        SOURCE #treeNode2TableID
          #TableID treeNode2TableID(TreeNode _node)
          #{
          #    TreeNode currentNode=_node;
          #    TableID ret;
          #    while (currentNode &&  !ret)
          #    {
          #        ret = SysTableBrowser::treeNode2TableId(currentNode);
          #        currentNode = currentNode.AOTparent();
          #    }
          #    return ret;
          #}
        ENDSOURCE
        SOURCE #currentSysContextMenu
          #SysContextMenu currentSysContextMenu()
          #{
          #    SysContextMenu ret;
          #    TreeNode node;
          #;
          #    if (this.isEditor(topmost))
          #        node = this.getCurMethod(topmost);
          #
          #    if (node)
          #        ret = new SysContextMenuTreeNode(node);
          #    else
          #        ret = new SysContextMenuAOT();
          #
          #    return ret;
          #}
        ENDSOURCE
        SOURCE #strEndsWith
          #boolean strEndsWith(str _sourceText, str _possibleSuffix)
          #{
          #    return subStr(_sourceText, strLen(_sourceText), -strLen(_possibleSuffix)) == _possibleSuffix;
          #}
          #
        ENDSOURCE
        SOURCE #isEditor
          #boolean isEditor(HWND _hwnd)
          #{
          #    str name = winapi::getWindowText(_hWnd);
          #    int i;
          #;
          #    for(i=1; i<=conLen(editorSuffixes); i++)
          #        if (this.strEndsWith(name, conPeek(editorSuffixes, i)))
          #            return true;
          #    return false;
          #}
        ENDSOURCE
        SOURCE #togglePause
          #void togglePause()
          #{
          #    if (paused)
          #        this.play();
          #    else
          #        this.pause();
          #}
        ENDSOURCE
        SOURCE #pause
          #/// Stop all backround tasks
          #void pause()
          #{
          #;
          #    if (windowsScanTimer)
          #    {
          #        this.cancelTimeOut(windowsScanTimer);
          #        windowsScanTimer = 0;
          #    }
          #    paused = true;
          #
          #}
        ENDSOURCE
        SOURCE #play
          #/// start all background tasks
          #void play()
          #{
          #    if (!windowsScanTimer)
          #        this.buildButtons();
          #
          #    paused = false;
          #    //this.loadImage(PlayPauseBtn, 'pauseBut');
          #}
        ENDSOURCE
        SOURCE #urlEscape
          #str urlEscape(str _s)
          #{
          #    DLL             dll = new DLL("shlwapi.dll");
          #    DLLFunction     URLEscape = new DLLFunction(dll, "UrlEscapeA");
          #    Binary          escaped = new Binary(strlen(_s)+1);
          #    Binary          cnt = new Binary(4);
          #    #define.E_POINTER(0x80004003)
          #    ;
          #    URLEscape.arg(ExtTypes::String, ExtTypes::Pointer, ExtTypes::Pointer, ExtTypes::DWord);
          #    URLEscape.returns(ExtTypes::DWord);
          #    cnt.dWord(0, strlen(_s)+1);
          #    if (URLEscape.call(_s, escaped, cnt, 0) == #E_POINTER)
          #    {
          #        escaped = new Binary(cnt.dWord(0)+1);
          #        URLEscape.call(_s, escaped, cnt, 0);
          #    }
          #    return escaped.string(0);
          #}
        ENDSOURCE
        SOURCE #axSearch
          #void axSearch(str _text)
          #{
          #;
          #    WinApi::shellExecute(
          #    @'http://www.google.com/custom?cx=017570198198700603454%3A2g4miqgpmoe&q='
          #    +
          #    this.urlEscape(_text)
          #    +
          #    @'&cof=CX%3AAxSearch%3BFORID%3A0'
          #    );
          #}
        ENDSOURCE
        SOURCE #task
          #public int task(int _taskId)
          #{
          #    #task
          #    int ret;
          #    if (_taskId != #taskEsc)
          #    ret = super(_taskId);
          #
          #    //if (_taskID==#taskEnter)
          #        //this.processEditBox(searchEd.text());
          #
          #    return ret;
          #}
        ENDSOURCE
        SOURCE #currentTable
          #tableID currentTable()
          #{
          #    #TreeNodeSysNodeType
          #    SysFormRun formRun;
          #    FormDataSource ds;
          #    TableID tableID;
          #    SysContextMenu context;
          #    TreeNode node;
          #;
          #    formRun=element.currentFormRun();
          #    if (!formRun)
          #        formRun=Infolog.setLastActivatedForm().object();
          #
          #    if(formRun && formRun.dataSourceCount()>0)
          #    {
          #        ds=formRun.objectSet();
          #        if (ds)
          #            tableID=ds.table();
          #    }
          #    if (!tableID)
          #    {
          #        context = this.currentSysContextMenu();
          #        if (context)
          #        {
          #            node = context.first();
          #            while (node && !tableID)
          #            {
          #                tableID = this.treeNode2TableID(node);
          #                if (tableID)
          #                    tableID = this.treeNode2TableID(node);
          #                node = context.next();
          #            }
          #        }
          #    }
          #    return tableID;
          #}
        ENDSOURCE
        SOURCE #installPlugs
          #void installPlugs()
          #{
          #    #File
          #    container parseName(str _s)
          #    {
          #        int pos=strscan(_s, '_', 1, strLen(_s));
          #        return [subStr(_s, 1, pos-1), subStr(_s, pos+1, strLen(_s) - pos)];
          #    }
          #
          #    void addButton(str _path, str _fileName)
          #    {
          #        str name = subStr(_fileName, 1, strLen(_fileName) - 4);
          #        FormFunctionButtonControl   button;
          #        str type;
          #        str itemName;
          #        ;
          #        [type, itemName] = parseName(name);
          #        /*button = plugTools.addControl(FormControlType::MenuFunctionButton, name+'_button');
          #        if (type=='action')
          #            button.menuItemType(MenuItemType::Action);
          #
          #        if (type=='display')
          #            button.menuItemType(MenuItemType::Display);
          #
          #        if (type=='output')
          #            button.menuItemType(MenuItemType::Output);
          #
          #        button.menuItemName(itemName);
          #        button.buttonDisplay(FormButtonDisplay::ImageOnly);
          #        button.border(FormButtonBorder::Flat);
          #        button.backStyle(FormBackStyle::Transparent);
          #        button.normalImage(_path); */
          #    }
          #    FileName fullFileName(FileName _path, FileName _fileName)
          #    {
          #        FileName    pathName;
          #        FileName    fileName;
          #        FileName    fileExtension;
          #        ;
          #        [pathName,fileName,fileExtension] = fileNameSplit(_fileName);
          #        return _path + '\\' + fileName + fileExtension;
          #    }
          #
          #    void findFiles(FileName _path, FileName _fileName)
          #    {
          #        FileName    fileName;
          #        int         hdl;
          #        ;
          #        if (WinAPI::folderExists(_path))
          #        {
          #            [hdl, fileName] = WinApi::findFirstFile(fullFileName(_path,_fileName));
          #            while (fileName)
          #            {
          #                if (WinAPI::fileExists(fullFileName(_path,fileName)))
          #                    addButton(fullFileName(_path, fileName), fileName);
          #                fileName = WinApi::findNextFile(hdl);
          #            }
          #            WinApi::findClose(hdl);
          #        }
          #    }
          #    findFiles(xInfo::directory(DirectoryType::Include)+'Tabax\\Plugs', '*.'+#imageExt);
          #
          #}
        ENDSOURCE
        SOURCE #toStr
          #/// returns the string representation of given argument
          #str toStr(AnyType _value)
          #{
          #    Object o;
          #    int i;
          #    str ret;
          #;
          #    if(typeOf(_value)==Types::AnyType && !_value)
          #        return '<NoResult>';
          #    if(typeOf(_value)==Types::Class)
          #    {
          #        o=_value;
          #        return strFmt('%1', o.toString());
          #    }
          #    if(typeOf(_value)==Types::Container)
          #    {
          #        for(i=1;i<=conLen(_value);i++)
          #        {
          #            if(ret)
          #                ret+=", ";
          #            ret += this.toStr(conPeek(_value, i));
          #        }
          #        return "["+ret+"]";
          #    }
          #    if(typeOf(_value)==Types::String || typeOf(_value)==Types::VarString)
          #    {
          #        return strFmt("'%1'", _value);
          #    }
          #    return strFmt('%1', _value);
          #}
          #
        ENDSOURCE
        SOURCE #run
          #public void run()
          #{
          #    SysGlobalCache cache=infolog.globalCache();
          #    FormRun formRun;
          #;
          #    cache.set(this.name(), 'instance', this);
          #    super();
          #    this.buildButtons();
          #    this.play();
          #}
        ENDSOURCE
        SOURCE #isIconic
          #boolean isIconic(int _handle)
          #{
          #    return isIconicFun.call(_handle)? true:false;
          #}
        ENDSOURCE
        SOURCE #runSysContextMenu
          #void runSysContextMenu(identifiername _menuItemName, MenuItemType _menuItemType, SysContextMenu _context = this.currentSysContextMenu())
          #{
          #    MenuFunction menuFunction;
          #    Args         args;
          #;
          #    if (_context)
          #    {
          #        args = new Args();
          #        if(_context.verifyItem(_menuItemName, _menuItemType))
          #        {
          #            menuFunction = new MenuFunction(_menuItemName, _menuItemType);
          #            args.parmObject(_context);
          #            args.caller(this);
          #            menuFunction.run(args);
          #        }
          #    }
          #}
        ENDSOURCE
        SOURCE #truncHeader
          #str truncHeader(str _h)
          #{
          #    if (maxCaptionSize && (strlen (_h) > maxCaptionSize))
          #    {
          #        _h = strdel (_h, maxCaptionSize, strlen(_h));
          #        _h +=  "...";
          #    }
          #    return _h;
          #}
          #
        ENDSOURCE
        SOURCE #resize
          #public void resize(int _width, int _height)
          #{
          #    super(_width, _height);
          #    element.adjustTabPageSize(tabs);
          #}
        ENDSOURCE
        SOURCE #currentFormRun
          #FormRun currentFormRun()
          #{
          #    return currentFormRun ? currentFormRun.object() : null;
          #}
        ENDSOURCE
        SOURCE #loadImage
          #void loadImage(FormButtonControl _but, str _name)
          #{
          #    str imgDir=XInfo::directory(DirectoryType::Include);
          #    str subPath = _name+'.' + #imageExt;
          #    str imageFilePath = this.getResourcePath(subPath);
          #;
          #    if (!imageFilePath)
          #       // warning("Tabax: Image not found: '" + this.fullInculdePath(subPath) + "' or resource '"+ this.resourceName(subPath)+"'");
          #    _but.normalImage(imageFilePath);
          #}
        ENDSOURCE
        SOURCE #isWindowVisible
          #boolean isWindowVisible(int _handle)
          #{
          #    return isWindowVisibleFun.call(_handle)? true:false;
          #}
        ENDSOURCE
        SOURCE #moveWindow
          #boolean moveWindow(HWND _handle, int _x, int _y, int _w, int _h, boolean _repaint)
          #{
          #  boolean ret;
          #    DLL         _DLL             = new DLL('USER32');
          #    DLLFunction _setwPos         = new DLLFunction(_DLL, 'MoveWindow');
          #    int         _dllret;
          #    ;
          #    ret = FALSE;
          #
          #    _setwPos.returns(ExtTypes::DWord); // BOOL
          #    _setwPos.arg(ExtTypes::DWord);     // handle window
          #    _setwPos.arg(ExtTypes::DWord);     // x
          #    _setwPos.arg(ExtTypes::DWord);     // y
          #    _setwPos.arg(ExtTypes::DWord);     // cx
          #    _setwPos.arg(ExtTypes::DWord);     // cy
          #    _setwPos.arg(ExtTypes::DWord);     // repaint;
          #
          #    _dllRet = _setwPos.call(_handle,  _x, _y, _w, _h, _repaint);
          #
          #    return _dllRet?true:false;
          #}
        ENDSOURCE
        SOURCE #setWPos
          #int setWPos(
          #                           int              _handle,
          #                           int              _hWndInsertAfter,
          #                           int              _left,
          #                           int              _top,
          #                           int              _width,
          #                           int              _height,
          #                           int              _flags    = 0     )
          #
          #{
          #  boolean ret;
          #    DLL         _DLL             = new DLL('USER32');
          #    DLLFunction _setwPos         = new DLLFunction(_DLL, 'SetWindowPos');
          #    int         _dllret;
          #    ;
          #    ret = FALSE;
          #
          #    _setwPos.returns(ExtTypes::DWord); // BOOL
          #    _setwPos.arg(ExtTypes::DWord);     // handle window
          #    _setwPos.arg(ExtTypes::DWord);     // handle to Z Order window
          #    _setwPos.arg(ExtTypes::DWord);     // x
          #    _setwPos.arg(ExtTypes::DWord);     // y
          #    _setwPos.arg(ExtTypes::DWord);     // cx
          #    _setwPos.arg(ExtTypes::DWord);     // cy
          #    _setwPos.arg(ExtTypes::DWord);     // flags;
          #
          #    _dllRet = _setwPos.call(_handle, _hWndInsertAfter, _left, _top, _width, _height, _flags );
          #    if (_dllRet) {
          #        ret = TRUE;
          #    }
          #
          #  return ret;
          #}
        ENDSOURCE
        SOURCE #openedProjects
          #Map openedProjects()
          #{
          #    if(!openedProjects)
          #        openedProjects=new Map(Types::String, Types::Integer);
          #    return openedProjects;
          #}
        ENDSOURCE
        SOURCE #setCap
          #void setCap(str _txt)
          #{
          #    this.design().caption('tabax '+v+'\\'+_txt);
          #}
        ENDSOURCE
        SOURCE #fitWindow
          #container fitWindow(hwnd _w, boolean _skipPrepare = false, boolean _skipWidth = false, boolean _skipHeight=false)
          #{
          #    int x1;
          #    int y1;
          #    int x2;
          #    int y2;
          #
          #    int wx1;
          #    int wy1;
          #    int wx2;
          #    int wy2;
          #    int maxw;
          #    int maxh;
          #    int w;
          #    int h;
          #    Binary msg = new Binary(30);
          #    int                 i;
          #    boolean ret;
          #    boolean fixedWidth;
          #    boolean fixedHeight;
          #;
          #    if (this.isIconic(_w))
          #        this.openIcon(_w);
          #
          #    if (!_skipPrepare)
          #    {
          #        this.prepareToSide(_w);
          #
          #        for (i=1;i<=4;i++)
          #           if (peekMessage.call(msg, 0, 0, 0, 1))
          #           {
          #               TranslateMessage.call(msg);
          #               dispatchMessage.call(msg);
          #           }
          #    }
          #
          #    [x1,y1,x2,y2]=element.getClientRect(MdiClient);
          #
          #    [wx1,wy1,wx2,wy2] = element.getMdiClientRelativeRect(_w);
          #    [maxw, maxh] = this.getMaxSize(_w);
          #    //w=min(x2-x1, maxw);
          #    //h=min(y2-y1, maxh);
          #    w=x2-x1;
          #    h=y2-y1;
          #    if (_skipWidth)
          #        w = wx2 - wx1;
          #    if (_skipHeight)
          #        h = wy2 - wy1;
          #    if ([wx1,wy1,wx2,wy2]!=[0, 0, w, h])
          #    {
          #        ret = WinApi::setWindowPos(_w, 0, 0, w, h, false, false, #SWP_NOACTIVATE);
          #        [wx1,wy1,wx2,wy2] = element.getMdiClientRelativeRect(_w);
          #
          #        for (i=1;i<=4;i++)
          #           if (peekMessage.call(msg, 0, 0, 0, 1))
          #           {
          #               TranslateMessage.call(msg);
          #               dispatchMessage.call(msg);
          #           }
          #        [x1,y1,x2,y2]=element.getClientRect(MdiClient);
          #        w=x2-x1;
          #        h=y2-y1;
          #        if (_skipWidth)
          #            w = wx2 - wx1 + 1;
          #        if (_skipHeight)
          #            h = wy2 - wy1 + 1;
          #
          #        ret = WinApi::setWindowPos(_w, 0, 0, w, h, false, false, #SWP_NOACTIVATE);
          #        [wx1,wy1,wx2,wy2] = element.getMdiClientRelativeRect(_w);
          #        fixedWidth = wx2 != (x2-x1);
          #        fixedHeight = wy2 != (y2-y1);
          #    }
          #    return [fixedWidth, fixedHeight];
          #}
        ENDSOURCE
        SOURCE #saveAll
          #void saveAll()
          #{
          #    ;
          #    xSysLastValue::saveLast(this);
          #}
        ENDSOURCE
        SOURCE #addMRUProject
          #void addMRUProject(str _name)
          #{
          #    int idx=conFind(mruProjects, _name);
          #    if(idx)
          #        mruProjects=conDel(mruProjects, idx, 1);
          #    mruProjects=[_name]+mruProjects;
          #}
        ENDSOURCE
        SOURCE #bottomSide
          #void bottomSide(hwnd _w)
          #{
          #    int x1,y1,x2,y2;
          #    ;
          #    [x1,y1,x2,y2]=this.prepareToSide(_w);
          #    WinApi::setWindowPos(_w,0,(y2-y1)/2+1,x2-x1, (y2-y1)/2-2);
          #}
        ENDSOURCE
        SOURCE #topSide
          #void topSide(hwnd _w)
          #{
          #    int x1,y1,x2,y2;
          #    ;
          #    [x1,y1,x2,y2]=this.prepareToSide(_w);
          #    WinApi::setWindowPos(_w,0,0,x2-x1, (y2-y1)/2);
          #}
        ENDSOURCE
        SOURCE #loadImages
          #void loadImages()
          #{
          #    #localmacro.but
          #        this.loadImage(%1,"%1");
          #    #endmacro
          #;
          #   // #but(leftbut)
          #    //#but(rightbut)
          #    //#but(tilehorbut)
          #    //#but(topbut)
          #    //#but(bottombut)
          #    //#but(tileverbut)
          #    //#but(xrefBut)
          #    //#but(compareBut)
          #    //#but(preferencesBut)
          #    //#but(addinsBut)
          #    //#but(editFieldBut)
          #    //#but(openApplObjBut)
          #}
        ENDSOURCE
        SOURCE #getParent
          #hwnd getParent(hwnd _window=this.hWnd())
          #{
          #    DLL         _winApiDLL      = new DLL('user32');
          #    DLLFunction fun  = new DLLFunction(_winApiDLL, 'GetParent');
          #
          #    fun.returns(ExtTypes::DWord);
          #
          #    fun.arg(ExtTypes::DWord);
          #
          #    return fun.call(_window);
          #}
        ENDSOURCE
        SOURCE #lists_top
          #private List lists_top()
          #{
          #    return lists.value(lists_sp);
          #}
        ENDSOURCE
        SOURCE #newIterator
          #void newIterator(TreeNode _node)
          #{
          #    iterators=new Array(Types::Class);
          #    lists=new Array(Types::Class);
          #    tniterator=_node.AOTiterator();
          #}
        ENDSOURCE
        SOURCE #canClose
          #public boolean canClose()
          #{
          #//    if(!collapsed)
          #//    {
          #//        this.collapse();
          #//        return false;
          #//    }
          #    return true;
          #}
        ENDSOURCE
        SOURCE #prepareToSide
          #container prepareToSide(HWND _w)
          #{
          #    //hWnd MdiClient = WinAPI::FindWindowEx(infolog.hWnd(), 0, 'MDIClient', '');
          #;
          #    WinAPI::sendMessageEx(_w, #WM_SYSCOMMAND, #SC_RESTORE, 0);
          #    return this.getClientRect(MdiClient);
          #}
        ENDSOURCE
        SOURCE #getClientRect
          #container getClientRect(hwnd _window)
          #{
          #    Binary      data            = new Binary(32);
          #    DLL         _winApiDLL      = new DLL('user32');
          #    DLLFunction fun  = new DLLFunction(_winApiDLL, 'GetClientRect');
          #
          #    fun.returns(ExtTypes::DWord);
          #
          #    fun.arg(ExtTypes::DWord, ExtTypes::Pointer);
          #    fun.call(_window, data);
          #
          #    return [data.dWord(0), data.dWord(4), data.dWord(8), data.dWord(12)];
          #}
        ENDSOURCE
        SOURCE #leftSide
          #void leftSide(hwnd _w)
          #{
          #    int x1,y1,x2,y2;
          #    ;
          #    [x1,y1,x2,y2]=this.prepareToSide(_w);
          #    WinApi::setWindowPos(_w,0,0,(x2-x1)/2, y2-y1);
          #}
        ENDSOURCE
        SOURCE #rightSide
          #void rightSide(hwnd _w)
          #{
          #    int x1,y1,x2,y2;
          #    ;
          #    [x1,y1,x2,y2]=this.prepareToSide(_w);
          #    WinApi::setWindowPos(_w,(x2-x1)/2+1,0,(x2-x1)-((x2-x1)/2+1)-2, y2-y1);
          #}
        ENDSOURCE
        SOURCE #getWindowRect
          #container getWindowRect(hwnd _window)
          #{
          #    Binary      data            = new Binary(32);
          #    DLL         _winApiDLL      = new DLL('user32');
          #    DLLFunction fun  = new DLLFunction(_winApiDLL, 'GetWindowRect');
          #
          #    fun.returns(ExtTypes::DWord);
          #
          #    fun.arg(ExtTypes::DWord, ExtTypes::Pointer);
          #    fun.call(_window, data);
          #
          #    return [data.dWord(0), data.dWord(4), data.dWord(8), data.dWord(12)];
          #}
        ENDSOURCE
        SOURCE #close
          #public void close()
          #{
          #    str name=this.name();
          #    SysGlobalCache cache=infolog.globalCache();
          #;
          #    #fireEvent(beforeClose, (this))
          #    cache.remove(name, 'instance');
          #    this.pause();
          #    super();
          #    element.removeTabPageImageList(tabs);
          #    this.saveAll();
          #}
        ENDSOURCE
        SOURCE #applyChanges
          #void applyChanges()
          #{
          #    container forRemove;
          #    container forUpd;
          #    container forAdd;
          #    FormDesign fd = element.design();
          #    int i;
          #    int id;
          #//    FormTreeItem item;
          #    HWnd handle;
          #    int image;
          #    str title;
          #    FormTabPageControl itemHandle;
          #    FormTabPageControl activePage;
          #    int selected;
          #    boolean updated;
          #    boolean historyChanged;
          #    str windowText;
          #    int tabsCount;
          #    ;
          #    [forRemove, forUpd, forAdd, selected]=this.changes();
          #    if(conLen(forRemove)>0 || conLen(forAdd)>0 || conLen(forUpd)>0)
          #    {
          #        //tabs.lockWindowUpdate(true);
          #        updated=true;
          #
          #        for(i=1;i<=conLen(forUpd);i++)
          #        {
          #            handle=conPeek(forUpd, i);
          #            itemHandle=windows.lookup(handle);
          #            windowText=WinApi::getWindowText(handle);
          #            [image, title]=this.getImageAndTitle(windowText);
          #            itemHandle.caption(element.truncHeader(title));
          #            itemHandle.helpText(title);
          #            titles.insert(handle, windowText);
          #            #fireEvent(afterWindowUpdated, (this, handle, title))
          #        }
          #
          #        //itemHandle=lastAdded;
          #        for(i=1;i<=conLen(forAdd);i++)
          #        {
          #            handle=conPeek(forAdd, i);
          #            windowText=WinApi::getWindowText(handle);
          #            [image, title]=this.getImageAndTitle(windowText);
          #            if(image==imgApp.image(#ImageProject))
          #            {
          #                this.addMRUProject(title);
          #                if(!this.openedProjects().exists(title))
          #                    this.openedProjects().insert(title, handle);
          #                historyChanged=true;
          #            }
          #            //item = new FormTreeItem(title,image,0, handle);
          #            //itemHandle=tree.addItem(0, itemHandle, item);
          #            itemHandle=tabs.addControl(FormControlType::TabPage, 't'+int2str(handle));
          #            #if.ax4
          #                itemHandle.scrollbars(false);
          #            #endif
          #            itemHandle.caption(element.truncHeader(title));
          #            itemHandle.helpText(title);
          #            itemHandle.verticalSpacing(0, AutoMode::Fixed);
          #            itemHandle.topMargin(0, AutoMode::Fixed);
          #            itemHandle.bottomMargin(0, AutoMode::Fixed);
          #            //itemHandle.
          #            //heightDecrement = itemHandle.topMargin() + itemHandle.bottomMargin() / 2;
          #            element.setTabPageImageIndex(itemHandle, image+1);
          #
          #            //itemHandle=tree.addItem(0, 0, item);
          #            //lastAdded=itemHandle;
          #            windows.insert(handle, itemHandle);
          #            titles.insert(handle, windowText);
          #            this.processWindowAdd(handle);
          #            #fireEvent(afterWindowOpened, (this, handle, title))
          #        }
          #        //tabs.lockWindowUpdate(false);
          #    }
          #    if(conLen(forRemove))
          #    {
          #        if(tabs.tabs())
          #        {
          #            inDeletion=true;
          #            itemHandle=tabs.controlNum(1);
          #            itemHandle.activatePage();
          #            inDeletion=false;
          #        }
          #    }
          #
          #    for(i=1;i<=conLen(forRemove);i++)
          #    {
          #        handle=conPeek(forRemove, i);
          #        itemHandle=windows.lookup(handle);
          #        tabsCount = tabs.controlCount();
          #        if (maximized.in(handle))
          #        {
          #//            if (formIdentity.exists(handle))
          #//                maximizedIdentities += formIdentity.lookup(handle);
          #            maximized.remove(handle);
          #        }
          #        this.processFormIdentity_closing(handle);
          #        if (oldWindows.exists(handle))
          #            oldWindows.remove(handle);
          #
          #        if (!itemHandle.isActivePage() || tabsCount==1)
          #        {
          #            windows.remove(handle);
          #            id = itemHandle.id();
          #            if (desktopWindow)
          #                this.apiLockWindowUpdate(desktopWindow);
          #            try
          #            {
          #                element.design().removeControl(id);
          #            }
          #            catch
          #            {
          #            }
          #            if (desktopWindow)
          #                this.apiLockWindowUpdate(0);
          #           titles.remove(handle);
          #        }
          #        if (fixedWindows.exists(handle))
          #            fixedWindows.remove(handle);
          #        #fireEvent(afterWindowClosed, (this, handle))
          #    }
          #    if(updated)
          #        element.adjustTabPageSize(tabs);
          #
          #    if(selected)
          #    {
          #        itemHandle=windows.lookup(selected);
          #        if(!this.tabIsSelected(itemHandle))
          #        {
          #            this.setTabSelected(itemHandle);
          #            itemHandle.activatePage();
          #            updated=true;
          #        }
          #    }
          #    //tabs.lockWindowUpdate(false);
          #    element.autoHeight();
          #}
        ENDSOURCE
        SOURCE #Changes
          #container changes()
          #{
          #    MapIterator i=new MapIterator(windows);
          #    container actual=this.getWindows();
          #    container existing;
          #    int j;
          #    container forRemove;
          #    container forUpd;
          #    container forAdd;
          #    hwnd selected;
          #    ;
          #    [selected]=actual;
          #    while(i.more())
          #    {
          #        if(conFind(actual, i.key()))
          #        {
          #            if(titles.lookup(i.key())!=WinApi::getWindowText(i.key()))
          #                forUpd+=i.key();
          #            existing+=i.key();
          #        }
          #        else
          #        {
          #            forRemove+=i.key();
          #        }
          #        i.next();
          #    }
          #
          #    for(j=1;j<=conLen(actual);j++)
          #    {
          #        if(!conFind(existing, conPeek(actual, j)))
          #            forAdd+=[conPeek(actual, j)];
          #    }
          #    return [forRemove, forUpd, forAdd, selected];
          #}
        ENDSOURCE
        SOURCE #getImageAndTitle
          #container getImageAndTitle(str _header)
          #{
          #    str path;
          #    int i, img;
          #    boolean startsWith(str _s1, str _s2){
          #        return strScan(_s1, _s2, 1, strLen(_s1))==1;
          #    }
          #    ;
          #    for(i=1;i<=conlen(this.pathes());i++)
          #    {
          #        [path, img]=conPeek(this.pathes(),i);
          #        if(startsWith(_header, path))
          #            return [imgApp.image(img),
          #                strDel(_header, 1, strLen(path))];
          #
          #        if (!path)
          #            switch (_header)
          #            {
          #                case "Ðåïîçèòàðèé ïðèêëàäíûõ îáúåêòîâ":
          #                    return [imgApp.image(#ImageAOT), _header];
          #                case @"\Projects":
          #                    return [imgApp.image(#ImageProjects), _header];
          #            }
          #    }
          #
          #    return [0, _header];
          #}
        ENDSOURCE
        SOURCE #pathes
          #container pathes()
          #{
          #    if(!p)
          #        p=
          #        [
          #            ["\\Data Dictionary\\Tables\\", #imageTable],
          #            ["\\Data Dictionary\\Maps\\", #imageTableMap],
          #            ["\\Data Dictionary\\Views\\", #imageView],
          #            ["\\Data Dictionary\\Extended Data Types\\", #imageEDT],
          #            ["\\Data Dictionary\\Base Enums\\", #imageBaseEnum],
          #            #if.imageFeatureKey
          #            ["\\Data Dictionary\\Feature Keys\\", #imageFeatureKey],
          #            #endif
          #            ["\\Data Dictionary\\License Codes\\", #imageLicenseCode],
          #            ["\\Data Dictionary\\Configuration Keys\\", #imageConfigurationKeys],
          #            ["\\Data Dictionary\\Security Keys\\", #imageSecurityKeys],
          #            ["\\Data Dictionary\\Table Collections\\", #imageTableCollections],
          #            ["\\Macros\\", #imageMacros],
          #            ["\\Classes\\", #imageClass],
          #            ["\\Forms\\", #imageForm],
          #            ["\\Reports\\", #imageReport],
          #            ["\\Queries\\", #imageQuery],
          #            ["\\Jobs\\", #imageJob],
          #            ["\\Menus\\", #imageMenu],
          #            ["@SYS71148", #imageMenuMain],
          #            ["\\Menu Items\\Display\\", #ImageMenuDisplayItems],
          #            ["\\Menu Items\\Output\\", #imageMenuActionItems],
          #            ["\\Menu Items\\Action\\", #imageMenuOutputItems],
          #            ["\\System Documentation\\Classes\\", #ImageDocumentationItem],
          #            ["\\System Documentation\\Functions\\", #ImageDocumentationItemBlue],
          #            ["\\System Documentation\\Property\\", #ImageDocumentationItem],
          #            ["\\System Documentation\\Tables\\", #ImageDocumentationItem],
          #            ["\\System Documentation\\Types\\", #ImageDocumentationItem],
          #            ["\\System Documentation\\Enums\\", #ImageDocumentationItem],
          #            ["\\System Documentation\\Feature Keys\\", #ImageDocumentationItem],
          #            #if.ImageReference
          #            ["\\References\\", #ImageReference],
          #            #endif
          #            #if.imageHelpFile
          #            ["\\HTML Help Files\\", #imageHelpFile],
          #            #endif
          #            #localmacro.prefix
          #                [%1, #ImageProject],
          #            #endmacro
          #            #projectPrefixes
          #            ["", #ImagePlay]
          #        ];
          #    return p;
          #}
        ENDSOURCE
        SOURCE #getWindows
          #container getWindows()
          #{
          #    container ret;
          #    //hWnd MdiClient = WinAPI::FindWindowEx(infolog.hWnd(), 0, 'MDIClient', '');
          #    hWnd child;
          #    str windowText;
          #    map     children = new map(Types::Integer, Types::String);
          #    int c;
          #    FormRun activeFormRun;
          #;
          #    topmost=0;
          #    second=0;
          #
          #    for (child = WinAPI::FindWindowEx(MdiClient, 0, '', '');
          #         child && !children.exists(child);
          #         child = WinAPI::FindWindowEx(MdiClient, child, '', ''))
          #    {
          #        if (Child != 0)
          #        {
          #            if (Children.exists(Child))
          #                break;
          #
          #            WindowText = WinAPI::getWindowText(child);
          #
          #            //if (WindowText != "" && isWindowVisible(child))
          #            if(this.isWindowVisible(child))
          #            {
          #                if (fitMaximized)
          #                    this.processMaximizations(child);
          #                if(!topmost)
          #                {
          #                    topmost=Child;
          #                    if(infolog.setLastActivatedForm())
          #                        activeFormRun=infolog.setLastActivatedForm().object();
          #                    if(activeFormRun && activeFormRun.hWnd()==topmost)
          #                    {
          #                        currentFormRun=new ObjectIdent(activeFormRun);
          #                        currentFormRun_hwnd = topmost;
          #                    }
          #                    else
          #                    {
          #                        if(this.currentFormRun() && currentFormRun_hwnd!=topmost)
          #                        {
          #                            currentFormRun_hwnd = 0;
          #                            currentFormRun=null;
          #                        }
          #                    }
          #                }
          #                else
          #                    if(!second)
          #                        second=Child;
          #                children.insert(Child, WindowText);
          #                ret+=[Child];
          #            }
          #        }
          #
          #        c ++;
          #        if (c > 1000)
          #            throw error("deadlock interrupted");
          #    }
          #    return ret;
          #}
        ENDSOURCE
        SOURCE #BuildButtons
          #void buildButtons()
          #{
          #;
          #    this.processFormIdentity();
          #    this.applyChanges();
          #    #fireEvent(tick, (this))
          #    windowsScanTimer = this.setTimeOut(identifierStr(buildButtons), #windowsScanTimer);
          #}
        ENDSOURCE
        SOURCE #init
          #public void init()
          #{
          #    str dummy;
          #    int i;
          #    int img;
          #;
          #    v=#v;
          #    super();
          #    this.attachPlugins();
          #    editorSuffixes = [
          #        ' - Ðåäàêòîð',
          #        ' - Editor'
          #    ];
          #    oldWindows = new Map(Types::Integer, Types::Container);
          #    fixedWindows = new Map(Types::Integer, Types::Container);
          #    //menuUsageStatistics=new Map(Types::String, Types::Container);
          #    maximized = new Set(Types::Integer);
          #    this.loadDictionary();
          #    normalPositions = new Map(Types::Integer, Types::Container);
          #    formIdentity = new Map(Types::Integer, Types::String);
          #    identityNormalPositions = new Map(Types::String, Types::Container);
          #    retoreIfRestored  = new Set(Types::Integer);
          #
          #    this.setCap('windows');
          #    //vtxt.text('sidax v'+v);
          #    /*aboutBut.border(
          #    tableBrowserBut.border(
          #    editBut.border(
          #    tileHorBut.border(
          #        tileVerBut.border(
          #        leftBut.border(
          #        rightBut.border(
          #        topBut.border(
          #        bottomBut.border(
          #                FormButtonBorder::Flat
          #            ))))))))); */
          #    this.installPlugs();
          #    hand=WinApi::loadStdCursor(#IDC_CROSS);
          #    this.loadImages();
          #
          #    user32             = new DLL('USER32');
          #
          #    isIconicFun = new DLLFunction(user32, 'IsIconic');
          #    isIconicFun.returns(ExtTypes::DWord);
          #    isIconicFun.arg(ExtTypes::DWord);
          #
          #    isZoomedFun = new DLLFunction(user32, 'IsZoomed');
          #    isZoomedFun.returns(ExtTypes::DWord);
          #    isZoomedFun.arg(ExtTypes::DWord);
          #
          #
          #    isWindowVisibleFun = new DLLFunction(user32, 'IsWindowVisible');
          #    isWindowVisibleFun.returns(ExtTypes::DWord);
          #    isWindowVisibleFun.arg(ExtTypes::DWord);
          #
          #    OpenIconFun = new DLLFunction(user32, 'OpenIcon');
          #    OpenIconFun.returns(ExtTypes::DWord);
          #    OpenIconFun.arg(ExtTypes::DWord);
          #
          #   peekMessage     = new DLLFunction(user32, 'PeekMessageA');
          #   TranslateMessage= new DLLFunction(user32, 'TranslateMessage');
          #   dispatchMessage = new DLLFunction(user32, 'DispatchMessageA');
          #    peekMessage.arg(ExtTypes::POINTER, ExtTypes::DWORD, ExtTypes::DWORD, ExtTypes::DWORD, ExtTypes::DWORD);
          #    peekMessage.returns(ExtTypes::DWord);
          #
          #    TranslateMessage.arg(ExtTypes::Pointer);
          #    TranslateMessage.returns(ExtTypes::DWORD);
          #
          #    dispatchMessage.arg(ExtTypes::Pointer);
          #    dispatchMessage.returns(ExtTypes::DWord);
          #
          #    GetDesktopWindow = new DllFunction(user32, 'GetDesktopWindow');
          #    GetDesktopWindow.returns(ExtTypes::DWord);
          #
          #    LockWindowUpdate = new DllFunction(user32, 'LockWindowUpdate');
          #    LockWindowUpdate.returns(ExtTypes::DWord);
          #    LockWindowUpdate.arg(ExtTypes::DWord);
          #
          #    desktopWindow = this.GetDesktopWindow();
          #
          #    mdiClient = WinAPI::findWindowEx(infolog.hWnd(), 0, 'MDIClient', '');
          #
          #    imgApp = new ImageListAppl_AOT();
          #    for(i=1;i<=conlen(this.pathes());i++)
          #    {
          #        [dummy, img]=conPeek(this.pathes(), i);
          #        imgApp.add(img);
          #    }
          #    //Tree.setImagelist(imgApp.imageList());
          #    //Tree.setStateImagelist(imgApp.imageList());
          #    element.setTabPageImageList(Tabs, imgApp.imageList());
          #
          #    windows=new Map(Types::Integer, Types::Class);
          #    titles=new Map(Types::Integer, Types::String);
          #    xSysLastValue::getLast(this);
          #}
          #
        ENDSOURCE
        SOURCE #initParmDefault
          #/*MAN
          #This method is called when no SysLastValue record can be found in xSysLastValue.GetLast()
          #*/
          #public void initParmDefault()
          #{
          #;
          #}
        ENDSOURCE
        SOURCE #unpack
          #public boolean unpack(container packedClass)
          #{
          #    int version     = RunBase::getVersion(packedClass);
          #
          #    switch (version)
          #    {
          #        case 5:
          #            [version, #List5] = packedClass;
          #            return true;
          #        case 6:
          #            [version, #List6] = packedClass;
          #            return true;
          #        case 7:
          #            [version, #List7] = packedClass;
          #            return true;
          #        case #CurrentVersion:
          #            [version, #CurrentList] = packedClass;
          #            return true;
          #        default :
          #            return false;
          #    }
          #
          #    return false;
          #}
        ENDSOURCE
        SOURCE #getDesktopWindow
          #HWnd getDesktopWindow()
          #{
          #    return GetDesktopWindow.call();
          #}
        ENDSOURCE
        SOURCE #apiLockWindowUpdate
          #boolean apiLockWindowUpdate(HWND _hwnd)
          #{
          #    return LockWindowUpdate.call(_hwnd);
          #}
        ENDSOURCE
        SOURCE #pack
          #public container pack()
          #{
          #;
          #    return [#CurrentVersion, #CurrentList];
          #}
        ENDSOURCE
        SOURCE #lastValueDataAreaId
          #public dataAreaId lastValueDataAreaId()
          #{
          #    //TODO:return 'dat';
          #    return curExt();
          #}
        ENDSOURCE
        SOURCE #lastValueDesignName
          #public identifiername lastValueDesignName()
          #{
          #    return '';
          #}
        ENDSOURCE
        SOURCE #lastValueElementName
          #public identifiername lastValueElementName()
          #{
          #    return this.name();
          #}
        ENDSOURCE
        SOURCE #lastValueType
          #public UtilElementType lastValueType()
          #{
          #    return UtilElementType::Form;
          #}
        ENDSOURCE
        SOURCE #lastValueUserId
          #public userId lastValueUserId()
          #{
          #    return curUserId();
          #}
        ENDSOURCE
        SOURCE #pop
          #private TreeNodeIterator pop()
          #{
          #    TreeNodeIterator ret=iterators.value(sp);
          #    ;
          #    //iterators.value(sp, null);
          #    sp--;
          #    return ret;
          #}
        ENDSOURCE
        SOURCE #lists_pop
          #private List lists_pop()
          #{
          #    List ret=lists.value(lists_sp);
          #    ;
          #    //lists.value(lists_sp, null);
          #    lists_sp--;
          #    return ret;
          #}
        ENDSOURCE
        SOURCE #push
          #private void push(TreeNodeIterator _iterator)
          #{
          #    ;
          #    sp++;
          #    iterators.value(sp, _iterator);
          #}
        ENDSOURCE
        SOURCE #Lists_push
          #private void lists_push(List _list)
          #{
          #    ;
          #    lists_sp++;
          #    lists.value(lists_sp, _list);
          #}
        ENDSOURCE
        SOURCE #nextNode
          #private TreeNode nextNode()
          #{
          #    return tniterator.next();
          #}
        ENDSOURCE
        SOURCE #next
          #boolean next()
          #{
          #    current=this.nextNode();
          #    while(!current && this.hasIterators())
          #    {
          #        tniterator=this.pop();
          #        currentList=this.lists_pop();
          #        current=this.nextNode();
          #    }
          #    if(current)
          #    {
          #        this.push(tniterator);
          #        this.lists_push(currentList);
          #        currentList=new List(Types::Class);
          #        tniterator=current.AOTiterator();
          #    }
          #    return current? true:false;
          #}
        ENDSOURCE
        SOURCE #hasIterators
          #private boolean hasIterators()
          #{
          #    return sp ? true:false;
          #}
        ENDSOURCE
        SOURCE #AdjustTabPageSize
          ##winapi
          #void adjustTabPageSize(FormTabControl tabPageControl)
          #{
          #    Binary  rect = new Binary(16);
          #    Binary  ptr = new Binary(4);
          #    int     size;
          #    int     style;
          #    int     width;
          #    int     w;
          #    int maxWidth;
          #    int minWidth;
          #    int     i;
          #    int     cnt;
          #    int GetWindowRect(int hWnd, Binary lpRect)
          #    {
          #        DLL             _Userdll            = new DLL('User32.dll');
          #        DLLFunction     _getWindowRect      = new DLLFunction(_Userdll, 'GetWindowRect');
          #        ;
          #        _getWindowRect.arg(ExtTypes::DWord, ExtTypes::Pointer);
          #        _getWindowRect.returns(ExtTypes::DWord);
          #        return _getWindowRect.call(hWnd, lpRect);
          #    }
          #    int setWindowLong(HWND _HWND, int _nIndex, int _dwNewLong)
          #    {
          #        DLL             _Userdll            = new DLL("User32.dll");
          #        DLLFunction     DLLFunction;
          #        ;
          #        DLLFunction = new DLLFunction(_Userdll,'SetWindowLongA');
          #        DLLFunction.arg(ExtTypes::DWord, ExtTypes::DWord, ExtTypes::DWord);
          #        DLLFunction.returns(ExtTypes::DWord);
          #
          #        return DLLFunction.call(_HWND, _nIndex, _dwNewLong);
          #    }
          #;
          #    if (tabPageControl && tabPageControl.hWnd())
          #    {
          #        ptr.binary(0, rect);
          #
          #        GetWindowRect(tabPageControl.hWnd() , rect);
          #        width = rect.dWord(8) - rect.dWord(0) - 4;
          #        cnt = 0;
          #        for (i=1;i<=tabPageControl.controlCount();i++)
          #            if (tabPageControl.controlNum(i).visible())
          #                cnt++;
          #        if (!cnt)
          #            cnt = 1;
          #
          #        WinApi::sendMessageEx(tabPageControl.hWnd(), #TCM_GETITEMRECT, 0, ptr.dWord(0));
          #
          #        style = winapi::getWindowLong(tabPageControl.hWnd(), #GWL_STYLE);
          #        style = style & ~ #TCS_FIXEDWIDTH;
          #        style = style | #TCS_TOOLTIPS | #TCS_FORCELABELLEFT;
          #
          #        SetWindowLong(tabPageControl.hWnd(), #GWL_STYLE, style);
          #        cnt = WinApi::sendMessageEx(tabPageControl.hWnd(), #TCM_GETITEMCOUNT, 0, size);
          #
          #        w = 0;
          #        for (i=0;i<cnt;i++)
          #        {
          #            winapi::sendMessageEx(tabPageControl.hWnd(), #TCM_GETITEMRECT, i, ptr.dWord(0));
          #            w += rect.dWord(8) - rect.dWord(0);
          #            maxWidth = max(maxWidth, rect.dWord(8) - rect.dWord(0));
          #            minWidth = min(minWidth, rect.dWord(8) - rect.dWord(0));
          #//            if (w > width)
          #//                break;
          #        }
          #
          #        cnt = max(1, cnt);
          #        size = width div cnt;
          #        if (maxTabSize)
          #            size=min(size, maxTabSize);
          #        if (minTabSize)
          #            size=max(size, minTabSize);
          #        if (sameTabSize && (maxTabSize * cnt)<=width)
          #            size = maxTabSize ? maxTabSize : min(maxWidth, w);
          #        size = min(size, width);
          #        size = (size & 0xffff) | ((rect.dWord(12) - rect.dWord(4)) << 16);
          #
          #        if (minTabSize)
          #            Winapi::SendMessageEx(tabPageControl.hWnd(), #TCM_SETMINTABWIDTH, 0, minTabSize);
          #        if (w > width || (maxTabSize && maxWidth > maxTabSize) || sameTabSize)
          #        {
          #            WinApi::SendMessageEx(tabPageControl.hWnd(), #TCM_SETITEMSIZE, 0, size);
          #
          #            style = style | #TCS_FIXEDWIDTH;
          #            SetWindowLong(tabPageControl.hWnd(), #GWL_STYLE, style);
          #        }
          #    }
          #}
          #
        ENDSOURCE
        SOURCE #HitTestTabPage
          #int hitTestTabPage(FormTabControl formTabControl)
          #{
          #    int cx, cy;
          #    Binary  TCHITTESTINFO = new Binary(12);
          #    Binary  ptr = new Binary(4);
          #    ;
          #    if (formTabControl && formTabControl.hWnd())
          #    {
          #        [cx, cy] = winapi::getCursorPos();
          #        [cx, cy] = winapi::screenToClient(FormTabControl.hWnd(), cx, cy);
          #        ptr.binary(0, TCHITTESTINFO);
          #        TCHITTESTINFO.dWord(0, cx);
          #        TCHITTESTINFO.dWord(4, cy);
          #        return winapi::sendMessageEx(FormTabControl.hWnd(), #TCM_HITTEST, 0, ptr.dWord(0)) + 1;
          #    }
          #    else return 0;
          #}
        ENDSOURCE
        SOURCE #RemoveTabPageImageList
          #void removeTabPageImageList(FormTabControl tabPageControl)
          #{
          #    int             hImageList;
          #    DLL             _dll                = new DLL("comctl32.dll");
          #    DLLFunction     ImageList_Destroy   = new DLLFunction(_dll, "ImageList_Destroy");
          #
          #    ;
          #    if (tabPageControl && tabPageControl.hWnd())
          #    {
          #        hImageList = winapi::sendMessageEx(tabPageControl.hWnd(), #TCM_GETIMAGELIST, 0, 0);
          #        if (hImageList)
          #        {
          #            winapi::sendMessageEx(tabPageControl.hWnd(), #TCM_SETIMAGELIST, 0, 0);
          #
          #            ImageList_Destroy.arg(ExtTypes::DWord);
          #            ImageList_Destroy.returns(ExtTypes::DWord);
          #            ImageList_Destroy.call(hImageList);
          #        }
          #    }
          #}
        ENDSOURCE
        SOURCE #SetTabPageImageIndex
          ##winapi
          #void setTabPageImageIndex(FormTabPageControl tabPageControl, int idx)
          #{
          #    int             hWnd;
          #    Binary          TCITEM;
          #    Binary          pointer;
          #    int             i, pos;
          #    str GetClassName(int _hWnd)
          #    {
          #        DLL         _Userdll        = new DLL("User32.dll");
          #        DLLFunction _getClassName   = new DLLFunction(_Userdll, "GetClassNameA");
          #        Binary      className       = new Binary(100);
          #        ;
          #        _getClassName.arg(ExtTypes::DWord, ExtTypes::Pointer, ExtTypes::DWord);
          #        _getClassName.returns(ExtTypes::DWord);
          #        if (_getClassName.call(_hWnd, className, 100))
          #            return className.string(0);
          #        else
          #            return "";
          #    }
          #    int GetParent(int _hWnd)
          #    {
          #        DLL         _Userdll        = new DLL("User32.dll");
          #        DLLFunction _getParent      = new DLLFunction(_Userdll, "GetParent");
          #        ;
          #        _getParent.arg(ExtTypes::DWord);
          #        _getParent.returns(ExtTypes::DWord);
          #        return _getParent.call(_hWnd);
          #    }
          #
          #    ;
          #    if (tabPageControl && tabPageControl.hWnd())
          #    {
          #        pos = 0;
          #        hWnd = tabPageControl.hWnd();
          #        while (hWnd)
          #        {
          #            hWnd = winapi::getWindow(hWnd, #GW_HWNDPREV);
          #            if (hWnd && GetClassName(hWnd) == #PaneWindowCL)
          #                pos++;
          #        }
          #
          #        TCITEM = new Binary(28);
          #        pointer = new Binary(4);
          #        pointer.binary(0, TCITEM);
          #        TCITEM.dWord(0, #TCIF_IMAGE);
          #        TCITEM.dWord(20, idx < 0 ? -1 : idx-1);
          #        winapi::sendMessageEx(GetParent(tabPageControl.hWnd()), #TCM_SETITEM, pos, pointer.dWord(0));
          #    }
          #}
        ENDSOURCE
        SOURCE #SetTabPageImageList
          #void setTabPageImageList(FormTabControl FormTabControl, ImageList imageList, int colorKey = winapi::rgb2int(134, 183, 115))
          #{
          #// colorKey - öâåò, êîòîðûé áóäåò çàìåíåí íà öâåò ôîíà îêíà.
          #// Åñëè â âàøèõ èêîíêàõ áóäåò ïðèñóòñòâîâàòü öåâåò, ïðåäëàãàåìûé ïî óìîë÷àíèþ,
          #// òî ïîäñòàâüòå ïðè âûçîâå ìåòîäà ëþáîé äðóãîé, êîòîðîãî íåò
          #
          #    DLL             _dll                = new DLL("comctl32.dll");
          #    DLL             _Userdll            = new DLL("User32.dll");
          #    DLL             _GDIdll             = new DLL("Gdi32.dll");
          #
          #
          #    DLLFunction     ImageList_Create        = new DLLFunction(_dll, "ImageList_Create");
          #    DLLFunction     ImageList_AddMasked     = new DLLFunction(_dll, "ImageList_AddMasked");
          #    DLLFunction     ImageList_Destroy       = new DLLFunction(_dll, "ImageList_Destroy");
          #
          #
          #    int             i, k;
          #    int             hImageList;
          #    int             hImageListOld;
          #    Image           image;
          #    int             wDC;
          #    int             newDC;
          #    int             hBitmap;
          #    int             hWnd;
          #    Binary          TCITEM;
          #    Binary          pointer;
          #
          #    int GetDC(int _hWnd)
          #    {
          #        DLLFunction     _getDC    = new DLLFunction(_Userdll, "GetDC");
          #        ;
          #        _getDC.arg(ExtTypes::DWord);
          #        _getDC.returns(ExtTypes::DWord);
          #        return _getDC.call(_hWnd);
          #    }
          #    int CreateCompatibleDC(int hdc)
          #    {
          #        DLLFunction     _createCompatibleDC    = new DLLFunction(_GDIdll, "CreateCompatibleDC");
          #        ;
          #        _createCompatibleDC.arg(ExtTypes::DWord);
          #        _createCompatibleDC.returns(ExtTypes::DWord);
          #        return _createCompatibleDC.call(hdc);
          #    }
          #    int CreateCompatibleBitmap(int hdc, int nWidth, int nHeight)
          #    {
          #        DLLFunction     _createCompatibleBitmap = new DLLFunction(_GDIdll, "CreateCompatibleBitmap");
          #        ;
          #        _createCompatibleBitmap.arg(ExtTypes::DWord, ExtTypes::DWord, ExtTypes::DWord);
          #        _createCompatibleBitmap.returns(ExtTypes::DWord);
          #        return _createCompatibleBitmap.call(hdc, nWidth, nHeight);
          #    }
          #    int SelectObject(int hdc, int hgdiobj)
          #    {
          #        DLLFunction     _selectObject = new DLLFunction(_GDIdll, "SelectObject");
          #        ;
          #        _selectObject.arg(ExtTypes::DWord, ExtTypes::DWord);
          #        _selectObject.returns(ExtTypes::DWord);
          #        return _selectObject.call(hdc, hgdiobj);
          #    }
          #    int DeleteObject(int hgdiobj)
          #    {
          #        DLLFunction     _deleteObject = new DLLFunction(_GDIdll, "DeleteObject");
          #        ;
          #        _deleteObject.arg(ExtTypes::DWord);
          #        _deleteObject.returns(ExtTypes::DWord);
          #        return _deleteObject.call(hgdiobj);
          #    }
          #    int DeleteDC(int hDc)
          #    {
          #        DLLFunction     _deleteDC = new DLLFunction(_GDIdll, "DeleteDC");
          #        ;
          #        _deleteDC.arg(ExtTypes::DWord);
          #        _deleteDC.returns(ExtTypes::DWord);
          #        return _deleteDC.call(hDc);
          #    }
          #    int FillRect(int hDC, container Rect, int hbr)
          #    {
          #        DLLFunction     _fillRect = new DLLFunction(_Userdll, "FillRect");
          #        Binary          _rect   = new Binary(16);
          #        ;
          #        _fillRect.arg(ExtTypes::DWord, ExtTypes::Pointer, ExtTypes::DWord);
          #        _fillRect.returns(ExtTypes::DWord);
          #        _rect.dword(0, conpeek(Rect, 1));
          #        _rect.dword(4, conpeek(Rect, 2));
          #        _rect.dword(8, conpeek(Rect, 3));
          #        _rect.dword(12, conpeek(Rect, 4));
          #        return _fillRect.call(hDc, _rect, hbr);
          #    }
          #    int CreateSolidBrush(int _Color)
          #    {
          #        DLLFunction     _CreateSolidBrush = new DLLFunction(_GDIdll, "CreateSolidBrush");
          #        Binary           LOGBRUSH = new Binary(12);
          #        ;
          #        _CreateSolidBrush.arg(ExtTypes::DWord);
          #        _CreateSolidBrush.returns(ExtTypes::DWord);
          #        return _CreateSolidBrush.call(_Color);
          #    }
          #
          #    #define.ILC_COLOR(0x00000000)
          #    #define.ILC_COLOR24(0x00000018)
          #    #define.ILC_MASK(0x00000001)
          #    #define.TCM_FIRST(0x1300)
          #    #define.TCM_GETIMAGELIST(#TCM_FIRST + 2)
          #    #define.TCM_SETIMAGELIST(#TCM_FIRST + 3)
          #    #define.TCM_GETITEM(#TCM_FIRST + 5)
          #    #define.TCM_SETITEM(#TCM_FIRST + 6)
          #
          #    #define.TCIF_IMAGE(0x0002)
          #    ;
          #    if (formTabControl && formTabControl.hWnd() && imageList)
          #    {
          #        hWnd = formTabControl.hWnd();
          #        ImageList_Create.arg(ExtTypes::DWord, ExtTypes::DWord, ExtTypes::DWord, ExtTypes::DWord, ExtTypes::DWord);
          #        ImageList_Create.returns(ExtTypes::DWord);
          #        hImageList = ImageList_Create.call(imageList.width(), imageList.height(), #ILC_COLOR24 | #ILC_MASK, imageList.count(), 0);
          #
          #        ImageList_AddMasked.arg(ExtTypes::DWord, ExtTypes::DWord, ExtTypes::DWord);
          #        ImageList_AddMasked.returns(ExtTypes::DWord);
          #
          #        wDC = GetDC(0);
          #        newDC = CreateCompatibleDC(wDC);
          #        if (newDC)
          #        {
          #            hBitmap = CreateCompatibleBitmap(wDC, imageList.width()*imageList.count(), imageList.height());
          #            if (hBitmap && SelectObject(newDC, hBitmap))
          #            {
          #                i = CreateSolidBrush(colorKey);
          #                FillRect(newDC, [0, 0, imageList.width()*imageList.count(), imageList.height()], i);
          #                deleteObject(i);
          #
          #                for (i=0;i<imageList.count();i++)
          #                    imageList.draw(newDC, i, i * imageList.width(), 0, true);
          #
          #                DeleteDC(newDC);
          #
          #                ImageList_AddMasked.call(hImageList, hBitmap, colorKey);
          #                DeleteObject(hBitmap);
          #                hImageListOld = winapi::sendMessageEx(hWnd, #TCM_SETIMAGELIST, 0, hImageList);
          #                if (hImageListOld)
          #                {
          #                    ImageList_Destroy.arg(ExtTypes::DWord);
          #                    ImageList_Destroy.returns(ExtTypes::DWord);
          #                    ImageList_Destroy.call(hImageList);
          #                }
          #
          #                TCITEM = new Binary(28);
          #                pointer = new Binary(4);
          #                pointer.binary(0, TCITEM);
          #                TCITEM.dWord(0, #TCIF_IMAGE);
          #
          #                for (i = 0; i < min(formTabControl.controlCount(), imageList.count()); i++)
          #                {
          #                    TCITEM.dWord(20, i);
          #                    winapi::sendMessageEx(hWnd, #TCM_SETITEM, i, pointer.dWord(0));
          #                }
          #            }
          #            else
          #                DeleteDC(newDC);
          #        }
          #        //winapi::releaseDC(hWnd, wDC);
          #        winapi::releaseDC(0, wDC);
          #    }
          #}
        ENDSOURCE
        SOURCE #getCurMethod
          #/// Thanx to AndyD
          #TreeNode getCurMethod(HWND _editorHWnd)
          #{
          #    int hWnd = _editorHWnd;
          #    int hWndChild;
          #    str name = WinApi::getWindowText(_editorHWnd);
          #    int pos;
          #    boolean editor;
          #    str className;
          #    int childPos;
          #
          #
          #    int listView;
          #    int selectedItem;
          #    str itemName;
          #    str nodeName;
          #    int i;
          #    TreeNode fromMethods(TreeNode _parent, str _name)
          #    {
          #        TreeNode ret = _parent;
          #    ;
          #        if (ret)
          #            ret = ret.AOTfindChild('methods');
          #        if (ret)
          #            ret = ret.AOTfindChild(_name);
          #        return ret;
          #    }
          #    boolean pref(str _prefix, str _name)
          #    {
          #    ;
          #        _prefix = '\\'+_prefix+'\\';
          #        if (subStr(_name, 1, strLen(_prefix)) == _prefix)
          #        {
          #            nodeName = subStr(_name, strLen(_prefix) + 1, strLen(_name) - strLen(_prefix));
          #            return true;
          #        }
          #        return false;
          #    }
          #    #localmacro.pref
          #        pref(@'%1', _name)
          #    #endmacro
          #    TreeNode toTreeNode(str _name, str _methodName)
          #    {
          #        TreeNode parent = TreeNode::findNode(_name);
          #        str controlName;
          #        str controlMethodName;
          #        int delimiterPos;
          #        if (!parent)
          #            return null;
          #        if (#pref(Classes) || #pref(Jobs) || #pref(Macros))
          #            return parent.AOTfindChild(_methodName);
          #        if (#pref(Data Dictionary\Tables) || #pref(Data Dictionary\Maps) || #pref(Data Dictionary\Views))
          #            return fromMethods(parent, _methodName);
          #        if (#pref(Forms) || #pref(Reports))
          #        {
          #            delimiterPos = strFind(_methodName, ':', 1, strLen(_methodName));
          #            if (delimiterPos)
          #            {
          #                controlName = strRTrim(strLTrim(subStr(_methodName, 1, delimiterPos - 1)));
          #                controlMethodName = strRTrim(strLTrim(subStr(_methodName, delimiterPos + 1, strLen(_methodName) - delimiterPos)));
          #                return fromMethods(this.controlByName(parent, controlName), controlMethodName);
          #            }
          #            else
          #                return fromMethods(parent, _methodName);
          #        }
          #        return null;
          #    }
          #    str GetClassName(int _hWnd)
          #    {
          #        DLL             dll = new Dll("user32.dll");
          #        DLLFunction     getCalssName = new DLLFunction(dll, "GetClassNameA");
          #        Binary  classNamePtr = new Binary(256);
          #        ;
          #        getCalssName.arg(ExtTypes::DWord, ExtTypes::Pointer, ExtTypes::DWord);
          #        getCalssName.returns(ExtTypes::DWord);
          #        if (getCalssName.call(_hWnd, classNamePtr, 255))
          #            return classNamePtr.string(0);
          #        else
          #            return "";
          #    }
          #    #define.LVM_FIRST(0x1000)
          #    #define.LVM_GETNEXTITEM(#LVM_FIRST + 12)
          #    #define.LVM_GETITEMTEXT(#LVM_FIRST + 45)
          #
          #    #define.LVNI_SELECTED(0x0002)
          #
          #    str getItemText(int     _hWnd, int _item)
          #    {
          #        DLL         _winApiDLL      = new DLL('USER32');
          #        DLLFunction _sendMessage    = new DLLFunction(_winApiDLL, 'SendMessageA');
          #        Binary      LVItem = new Binary(52);
          #        Binary      itemText = new Binary(256);
          #        #define.LVIF_TEXT(0x0001)
          #        ;
          #        LVItem.dWord(0, #LVIF_TEXT); // mask
          #        LVItem.dWord(4, _item); // iItem
          #        LVItem.dWord(8, 0); // iSubItem
          #        LVItem.Binary(20, itemText); // pszText
          #        LVItem.dWord(24, 255); // cchTextMax
          #        _sendMessage.returns(ExtTypes::DWord);
          #        _sendMessage.arg(ExtTypes::DWord,
          #                         ExtTypes::DWord,
          #                         ExtTypes::DWord,
          #                         ExtTypes::Pointer);
          #
          #        return _sendMessage.call(_hWnd, #LVM_GETITEMTEXT, _item, LVItem) ? itemText.string(0) : '';
          #    }
          #
          #
          #    ;
          #    for(i=1; i<=conLen(editorSuffixes) &&  !pos; i++)
          #        if (this.strEndsWith(name, conPeek(editorSuffixes, i)))
          #            pos = strLen(name) - strLen(conPeek(editorSuffixes, i)) + 1;
          #
          #    name = subStr(name, 1, pos-1);
          #    editor = true;
          #    hWndChild = winapi::getWindow(hWnd, #GW_CHILD);
          #    childPos = 1;
          #    ListView = 0;
          #    while (hWndChild && _editorHWnd)
          #    {
          #        className = GetClassName(hWndChild);
          #        switch (childPos)
          #        {
          #            case 1:
          #                #if.ax3
          #                    editor = className == "MDImarginCL";
          #                #endif
          #                #if.ax4
          #                    editor = className == "AxEdTabCtrl";
          #                #endif
          #                childPos++;
          #                break;
          #            case 2:
          #                #if.ax3
          #                    editor = className == "SysListView32";
          #                #endif
          #                #if.ax4
          #                    editor = className == "AxListViewCtrl";
          #                #endif
          #                ListView = hWndChild;
          #                childPos++;
          #                break;
          #            case 3:
          #                #if.ax3
          #                    editor = className == #PaneWindowCL;
          #                #endif
          #                #if.ax4
          #                    editor = className == "AxChidFrame";
          #                #endif
          #                childPos++;
          #                break;
          #            case 4:
          #                #if.ax4
          #                    editor = className == "AxPaneWnd";
          #                #endif
          #                #if.ax3
          #                    editor = className == "SysTabControl32";
          #                #endif
          #                childPos++;
          #                break;
          #            default:
          #                editor = false;
          #                break;
          #        }
          #        hWndChild = winapi::getWindow(hWndChild, #GW_HWNDNEXT);
          #    }
          #    if (editor && listView)
          #    {
          #        selectedItem = winapi::sendMessageEx(listView, #LVM_GETNEXTITEM, -1, #LVNI_SELECTED);
          #        if (selectedItem >= 0)
          #        {
          #            itemName = getItemText(ListView, selectedItem);
          #            if (itemName)
          #            {
          #                return toTreeNode(name, itemName);
          #            }
          #        }
          #    }
          #    return null;
          #}
        ENDSOURCE
        SOURCE #AxPath_goMenuItemForm
          #void AxPath_goMenuItemForm(MenuItemType _itemType, MenuItemName _itemName, str _extra)
          #{
          #    Args args=new Args();
          #    FormRun formRun ;
          #    Common record;
          #    TableID tableID;
          #;
          #    args.menuItemType(_itemType);
          #    args.menuItemName(_itemName);
          #    formRun = new MenuFunction(_itemName, _itemType).create(args);
          #    if (formRun)
          #    {
          #        formRun.run();
          #        if (formRun.dataSourceCount())
          #        {
          #            tableID = formRun.dataSource(1).cursor().TableId;
          #            record = this.AxPath_findCommon(tableID, this.AxPath_parseParams(_extra));
          #            if (record)
          #                formRun.dataSource(1).findRecord(record);
          #        }
          #        formRun.detach();
          #    }
          #}
        ENDSOURCE
        SOURCE #AxPath_parseParams
          #container AxPath_parseParams(str _params)
          #{
          #    container ret;
          #    container pairs;
          #    int i;
          #;
          #    if (subStr(_params, 1, 1)=='?')
          #    {
          #        pairs = this.str2con(subStr(_params, 2, strLen(_params)-1) , '&');
          #        for(i=1; i<=conLen(pairs); i++)
          #            ret += [this.str2con(conPeek(pairs, i), '=')];
          #    }
          #    return ret;
          #}
        ENDSOURCE
        SOURCE #AxPath_accepts
          #boolean AxPath_accepts(str _s)
          #{
          #    return this.urlGetPart(_s, 1)==#AxPath_prefix;
          #}
        ENDSOURCE
        SOURCE #AxPath_fromTreeNode
          #str AxPath_fromTreeNode(TreeNode _node)
          #{
          #    return #AxPath_prefix+'://'+#AxPath_AOTName+this.urlEscape(strReplace(_node.treeNodePath(), '\\', '/'));
          #}
        ENDSOURCE
        SOURCE #internetCrackUrl
          #container internetCrackUrl(str _url, boolean _decode=false, boolean _escape=false)
          #{
          #//    typedef struct {
          #//      DWORD dwStructSize; 0
          #//      LPTSTR lpszScheme;   4
          #//      DWORD dwSchemeLength; 8
          #//      INTERNET_SCHEME nScheme; 12
          #//      LPTSTR lpszHostName; 16
          #//      DWORD dwHostNameLength; 20
          #//      INTERNET_PORT nPort; 24
          #//      LPTSTR lpszUserName; 28
          #//      DWORD dwUserNameLength; 32
          #//      LPTSTR lpszPassword; 36
          #//      DWORD dwPasswordLength; 40
          #//      LPTSTR lpszUrlPath; 44
          #//      DWORD dwUrlPathLength; 48
          #//      LPTSTR lpszExtraInfo; 52
          #//      DWORD dwExtraInfoLength; 56
          #//    } URL_COMPONENTS, 60
          #//
          #//     *LPURL_COMPONENTS;
          #    int maxLen = strLen(_url)+1;
          #    DLL             dll = new DLL('wininet.dll');
          #    DLLFunction     function = new DLLFunction(dll, 'InternetCrackUrlA');
          #    Binary          result = new Binary(60);
          #    Binary          cnt = new Binary(4);
          #    int ret;
          #    #define.E_POINTER(0x80004003)
          #//      LPTSTR lpszScheme;   4
          #    Binary scheme = new Binary(maxLen);
          #//      LPTSTR lpszHostName; 24
          #    Binary hostName = new Binary(maxLen);
          #//      LPTSTR lpszUserName; 36
          #    Binary userName = new Binary(maxLen);
          #//      LPTSTR lpszPassword; 44
          #    Binary password = new Binary(maxLen);
          #//      LPTSTR lpszUrlPath; 52
          #    Binary urlPath = new Binary(maxLen);
          #//      LPTSTR lpszExtraInfo; 60
          #    Binary extraInfo = new Binary(maxLen);
          #;
          #//    BOOL InternetCrackUrl(
          #//      LPCTSTR lpszUrl,
          #//      DWORD dwUrlLength,
          #//      DWORD dwFlags,
          #//      LPURL_COMPONENTS lpUrlComponents
          #//    );
          #
          #
          #//      DWORD dwStructSize; 0
          #    result.dWord(0, 60);
          #//      LPTSTR lpszScheme;   4
          #    result.binary(4, scheme);
          #//      DWORD dwSchemeLength; 8
          #    result.dWord(8, maxLen);
          #//      INTERNET_SCHEME nScheme; 12
          #//      LPTSTR lpszHostName; 16
          #    result.binary(16, hostName);
          #//      DWORD dwHostNameLength; 20
          #    result.dWord(20, maxLen);
          #//      INTERNET_PORT nPort; 24
          #//      LPTSTR lpszUserName; 28
          #    result.binary(28, userName);
          #//      DWORD dwUserNameLength; 32
          #    result.dWord(32, maxLen);
          #//      LPTSTR lpszPassword; 36
          #    result.binary(36, password);
          #//      DWORD dwPasswordLength; 40
          #    result.dWord(40, maxLen);
          #//      LPTSTR lpszUrlPath; 44
          #    result.binary(44, urlPath);
          #//      DWORD dwUrlPathLength; 48
          #    result.dWord(48, maxLen);
          #//      LPTSTR lpszExtraInfo; 52
          #    result.binary(52, extraInfo);
          #//      DWORD dwExtraInfoLength; 56
          #    result.dWord(56, maxLen);
          #    function.arg(ExtTypes::String, ExtTypes::DWord, ExtTypes::DWord, ExtTypes::Pointer);
          #    function.returns(ExtTypes::DWord);
          #    ret = function.call(_url, strlen(_url), (_decode ? 0x10000000 : 0) +  (_escape ? 0x080000000: 0), result);
          #    if (!ret)
          #        throw error(WinApi::formatMessage(WinApi::getLastError()));
          #    return [scheme.string(0), hostName.string(0), result.dWord(24), userName.string(0), password.string(0), urlPath.string(0), extrainfo.string(0)];
          #}
        ENDSOURCE
        SOURCE #str2con
          #container str2con(str _string, str _separator = ",")
          #{
          #    container   con;
          #    int         pos, oldPos = 1;
          #
          #    do
          #    {
          #        pos    =  strScan(_string, _separator, pos ? pos + strLen(_separator) : 1, strLen(_string));
          #        con    += subStr(_string, oldPos, pos ? pos - oldPos : strLen(_string) + 1 - oldPos);
          #        oldPos =  pos + strLen(_separator);
          #    }
          #    while (pos);
          #
          #    return con;
          #}
        ENDSOURCE
        SOURCE #urlGetPart
          #//URL_PART_HOSTNAME
          #//The host name.
          #//URL_PART_PASSWORD
          #//The password.
          #//URL_PART_PORT
          #//The port number.
          #//URL_PART_QUERY
          #//The query portion of the URL.
          #//URL_PART_SCHEME
          #//The URL scheme.
          #//URL_PART_USERNAME
          #//The username.
          #//URL_PART_NONE    = 0,
          #// URL_PART_SCHEME  = 1,
          #// URL_PART_HOSTNAME,
          #// URL_PART_USERNAME,
          #// URL_PART_PASSWORD,
          #// URL_PART_PORT,
          #// URL_PART_QUERY
          #//HRESULT UrlGetPart(
          #//    LPCTSTR pszIn,
          #//    LPTSTR pszOut,
          #//    LPDWORD pcchOut,
          #//    DWORD dwPart,
          #//    DWORD dwFlags
          #//);
          #str urlGetPart(str _in, int _part)
          #{
          #    DLL             dll = new DLL("shlwapi.dll");
          #    DLLFunction     function = new DLLFunction(dll, "UrlGetPartA");
          #    Binary          out = new Binary(strlen(_in)+1);
          #    Binary          cnt = new Binary(4);
          #    #define.E_POINTER(0x80004003)
          #    ;
          #    function.arg(
          #        //    LPCTSTR pszIn,
          #        ExtTypes::String,
          #        //    LPTSTR pszOut,
          #        ExtTypes::Pointer,
          #        //    LPDWORD pcchOut,
          #        ExtTypes::Pointer,
          #        //    DWORD dwPart,
          #        ExtTypes::DWord,
          #        //    DWORD dwFlags
          #        ExtTypes::DWord);
          #    function.returns(ExtTypes::DWord);
          #    cnt.dWord(0, strlen(_in)+1);
          #    function.call(_in, out, cnt, _part, 0);
          #    return out.string(0);
          #}
        ENDSOURCE
        SOURCE #AxPath_go
          #void AxPath_go(str _url)
          #{
          #    str scheme;
          #    str host;
          #    int port;
          #    str user;
          #    str password;
          #    str urlPath;
          #    str extra;
          #    TreeNode node;
          #    int line;
          #    int pos;
          #    container steps;
          #    MenuItemType itemType;
          #    MenuItemName itemName;
          #    //RecID recID;
          #    DataAreaId  dataAreaID  ;  // Dcs 04.04.2007 ÑÁÐFI-200703_02 KC
          #;
          #
          #    [scheme, host, port, user, password, urlPath, extra] = this.internetCrackUrl(_url, true);
          #    switch (host)
          #    {
          #        case #AxPath_AOTName:
          #            this.assertDevelopment();
          #            node = TreeNode::findNode(strReplace(urlPath, '/', '\\'));
          #            if (!node)
          #                throw error('Node not found');
          #            [line, pos] = this.AxPath_getLineAndPos(extra);
          #            if (node.handle() == classNum(MemberFunction) || node.handle() == classNum(Job) )
          #                node.AOTedit(line, pos);
          #            else
          #                node.AOTnewWindow();
          #
          #        break;
          #        case #AxPath_MenuItemName:
          #            steps = this.str2con(urlPath, '/');
          #            itemType = this.menuItemTypeBySymbol(conPeek(steps, 2));
          #            itemName = conPeek(steps, 3);
          #            //recID = this.AxPath_getRecID(extra);
          #            //+ Dcs 04.04.2007 ÑÁÐFI-200703_02 KC
          #            // orig
          #            // this.goMenuItemForm(itemType, itemName, recID );
          #
          #            dataAreaID = this.AxPath_getDataAreaId(extra);
          #            if(dataAreaID && curExt() != dataAreaID)
          #            {
          #                changeCompany (dataAreaID)
          #                {
          #                    this.AxPath_goMenuItemForm(itemType, itemName, extra);
          #                }
          #            }
          #            else
          #                this.AxPath_goMenuItemForm(itemType, itemName, extra);
          #            //- Dcs 04.04.2007 ÑÁÐFI-200703_02 KC
          #        break;
          #        default:
          #            throw error('Unknown host '+host);
          #    }
          #}
        ENDSOURCE
        SOURCE #AxPath_getRecID
          #RecID AxPath_getRecID(str _extra)
          #{
          #    container params=this.AxPath_parseParams(_extra);
          #    int i;
          #    str name;
          #    str value;
          #    RecID recID;
          #;
          #    for (i=1; i<=conLen(params); i++)
          #    {
          #        [name, value] = conPeek(params, i);
          #        if (name=='recID')
          #           recID=#str2recID(value);
          #    }
          #    return recID;
          #}
        ENDSOURCE
        SOURCE #runIt
          #void runIt(str _src, boolean _doWrite=true)
          #{
          #    XPPCompiler comp=new XPPCompiler();
          #    ;
          #    if(comp.compile(_src))
          #        if (_doWrite)
          #            this.write(runBuf(_src, element));
          #        else
          #            runBuf(_src, element);
          #    else
          #        info(comp.errorText());
          #}
        ENDSOURCE
        SOURCE #eval
          #void eval(str _s)
          #{
          #    ;
          #    this.assertDevelopment();
          #    this.runIt('AnyType mainFun(Object tabax){return '+_s+";}");
          #}
        ENDSOURCE
        SOURCE #runScript
          #void runScript(str _s)
          #{
          #    ;
          #    this.assertDevelopment();
          #    this.runIt('AnyType mainFun(Object tabax){AnyType ret;  ' + _s + " return ret;}", false);
          #}
        ENDSOURCE
        SOURCE #write
          #/// Prints its arguments on calculator result pane
          #void write(AnyType _p1=0, AnyType _p2=0, AnyType _p3=0, AnyType _p4=0, AnyType _p5=0)
          #{
          #    str s; //=resultEd.text() ? "\n" : "";
          #;
          #    if(!prmIsDefault(_p1))
          #        s+=this.toStr(_p1);
          #    if(!prmIsDefault(_p2))
          #    {
          #        if(s)
          #            s+=", ";
          #        s+=this.toStr(_p2);
          #    }
          #    if(!prmIsDefault(_p3))
          #    {
          #        if(s)
          #            s+=", ";
          #        s+=this.toStr(_p3);
          #    }
          #    if(!prmIsDefault(_p4))
          #    {
          #        if(s)
          #            s+=", ";
          #        s+=this.toStr(_p4);
          #    }
          #    if(!prmIsDefault(_p5))
          #    {
          #        if(s)
          #            s+=", ";
          #        s+=this.toStr(_p5);
          #    }
          #    info(s);
          #}
        ENDSOURCE
        SOURCE #processIconic
          #void processIconic(HWnd _child)
          #{
          #    int x1; int y1;
          #    int x2; int y2;
          #    int dx; int dy;
          #;
          #    [x1, y1, x2, y2] = element.getMdiClientRelativeRect(_child);
          #    dx = max(0, -x1);
          #    dy = max(0, -y1);
          #    if (dx || dy)
          #    {
          #        x1 += dx; x2 +=dx;
          #        y1 += dy; y2 +=dy;
          #        WinApi::setWindowPos(_child, x1, y1, x2-x1+1, y2-y1+1, false, false, #SWP_NOACTIVATE);
          #    }
          #}
        ENDSOURCE
        SOURCE #attachPlugins
          #void attachPlugins()
          #{
          #    UtilElements ue;
          #    Object plugin;
          #;
          #    while select name from ue group by name
          #        where ue.recordType == UtilElementType::Class
          #              &&
          #              ue.name like 'TabaxPlugin_*'
          #    {
          #        plugin = new DictClass(className2ID(ue.name)).makeObject();
          #        plugin.tabax(element);
          #    }
          #}
        ENDSOURCE
      ENDMETHODS
      OBJECTBANK
        PROPERTIES
        ENDPROPERTIES
      ENDOBJECTBANK
      JOINS
      ENDJOINS
      DESIGN
        PROPERTIES
          Top                 #Top edge
          Width               #Column width
          Height              #50
          Caption             #Tabax 0.1
          Frame               #None
          WindowResize        #Dynamic
          SaveSize            #Yes
          AllowDocking        #Yes
          TopMargin           #0
          BottomMargin        #0
          LeftMargin          #0
          RightMargin         #0
          Columnspace         #0
        ENDPROPERTIES
        CONTAINER
          CONTROL TAB
            PROPERTIES
              Name                #Tabs
              AutoDeclaration     #Yes
              Width               #Column width
              Height              #27
              VerticalSpacing     #0
              BackStyle           #Transparent
              TabLayout           #Tunnel
              Columns             #1
              Columnspace         #0
              HideIfEmpty         #No
            ENDPROPERTIES
            METHODS
              Version: 3
              SOURCE #beginDrag
                #public int beginDrag(int _x, int _y)
                #{
                #    int ret;
                #
                #    ret = super(_x, _y);
                #
                #    ret = element.hitTestTabPage(this);
                #
                #    return ret;
                #}
              ENDSOURCE
              SOURCE #dragOver
                #public FormDrag dragOver(FormControl _dragSource, FormDrag _dragMode, int _x, int _y)
                #{
                #    FormDrag ret;
                #
                #    ret = super(_dragSource, _dragMode, _x, _y);
                #
                #    return FormDrag::Move;
                #}
              ENDSOURCE
              SOURCE #mouseDblClick
                #public int mouseDblClick(int _x, int _y, int _button, boolean _Ctrl, boolean _Shift)
                #{
                #    int                 ret;
                #    FormTabPageControl  page;
                #    int                 tabNo;
                #    HWND                hwnd;
                #    ;
                #
                #    ret = super(_x, _y, _button, _Ctrl, _Shift);
                #
                #    tabNo = element.HitTestTabPage(this);
                #
                #    if(tabNo)
                #    {
                #        page = this.controlNum(tabNo);
                #        hwnd = this.pageToHwnd(page);
                #
                #        WinAPI::sendMessageEx(hwnd, #WM_SYSCOMMAND, #SC_CLOSE, 0);
                #    }
                #    return ret;
                #}
              ENDSOURCE
              SOURCE #pageToHwnd
                #HWND pageToHwnd(FormTabPageControl _page)
                #{
                #    HWnd hwnd;
                #    str hwndStr;
                #;
                #    if(_page)
                #    {
                #        hwndStr=_page.name();
                #        hwnd=str2int(subStr(hwndStr, 2, strLen(hwndStr)-1));
                #    }
                #    return hwnd;
                #}
              ENDSOURCE
              SOURCE #tabChanged
                #public void tabChanged(int _FromTab, int _ToTab)
                #{
                #
                #    FormTabPageControl page;
                #    HWND hwnd;
                #    super(_FromTab, _ToTab);
                #    if(!inDeletion)
                #    {
                #        page=this.controlNum(_ToTab);
                #        if(page)
                #        {
                #            hwnd = this.pageToHwnd(page);
                #            if (element.isIconic(hwnd))
                #                WinAPI::sendMessageEx(hwnd, #WM_SYSCOMMAND, #SC_RESTORE, 0);
                #            infolog.activateWindow(hwnd);
                #        }
                #    }
                #}
              ENDSOURCE
              SOURCE #toolTip
                #public str toolTip()
                #{
                #    int tabNo=element.hitTestTabPage(this);
                #    FormTabPageControl page=tabNo ? this.controlNum(tabNo) : null;
                #;
                #    return page ? page.helpText():'';
                #}
              ENDSOURCE
              SOURCE #closeAllExcept
                #void closeAllExcept(container _hwnds)
                #{
                #    MapIterator i=new MapIterator(windows);
                #    ;
                #    while(i.more())
                #    {
                #        if(!conFind(_hwnds, i.key()))
                #            WinAPI::sendMessageEx(i.key(), #WM_SYSCOMMAND, #SC_CLOSE, 0);
                #        i.next();
                #    }
                #}
              ENDSOURCE
              SOURCE #context
                #public void context()
                #{
                #    FormTabPageControl page;
                #    int tabNo;
                #    PopupMenu menu = new PopupMenu(this.hWnd());
                #    container winList;
                #    int close, toleft, toright, maximize, minimize, copy, totop, tobottom,
                #        fitWindow, sendBack;
                #    int closeAllExceptSelected;
                #    int selection;
                #    int i;
                #    str forCopy;
                #    TextBuffer buf=new TextBuffer();
                #    HWND hwnd;
                #;
                #    tabNo=element.HitTestTabPage(this);
                #    if(tabNo)
                #    {
                #        page=this.controlNum(tabNo);
                #        close = menu.insertItem(#_("Close (doubleclick tab to close)"));
                #        closeAllExceptSelected = menu.insertItem(#_("Close all except selected"));
                #        menu.insertBreak();
                #        fitWindow=menu.insertItem(#_("Fit window"));
                #        toleft=menu.insertItem(#_("To left"));
                #        toright=menu.insertItem(#_("To right"));
                #        totop=menu.insertItem(#_("To top"));
                #        tobottom=menu.insertItem(#_("To bottom"));
                #        maximize=menu.insertItem(#_("Maximize"));
                #        minimize=menu.insertItem(#_("Minimize"));
                #        sendBack=menu.insertItem(#_("Send to back"));
                #        menu.insertBreak();
                #        copy=menu.insertItem(#_("copy title"));
                #        selection = menu.draw();
                #        hwnd=this.pageToHwnd(page);
                #        if(selection!=closeAllExceptSelected)
                #        {
                #                switch (selection)
                #                {
                #                    case close:
                #                        WinAPI::sendMessageEx(hwnd, #WM_SYSCOMMAND, #SC_CLOSE, 0);
                #                    break;
                #                    case toLeft:
                #                        element.leftSide(hwnd);
                #                    break;
                #                    case toRight:
                #                        element.rightSide(hwnd);
                #                    break;
                #                    case toTop:
                #                        element.topSide(hwnd);
                #                    break;
                #                    case toBottom:
                #                        element.bottomSide(hwnd);
                #                    break;
                #                    case maximize:
                #                        WinAPI::maximizeWindow(hwnd);
                #                    break;
                #                    case minimize:
                #                        WinAPI::minimizeWindow(hwnd);
                #                    break;
                #                    case fitWindow:
                #                        element.fitWindow(hwnd);
                #                    break;
                #                    case sendBack:
                #                        element.setWPos(hwnd,
                #                            1, //#HWND_BOTTOM,
                #                            0,0,0,0,#SWP_NOMOVE + #SWP_NOSIZE);
                #                    break;
                #                    case copy:
                #                        if(forCopy)
                #                            forCopy+="\r\n";
                #                        forCopy+=page.helpText();
                #                    break;
                #                }
                #            if(selection==copy)
                #            {
                #                buf.setText(forCopy);
                #                buf.toClipboard();
                #            }
                #        }
                #        else
                #        {
                #            if (element.confirm(strFmt(element.getText('Close all windows except "%1"'), WinApi::getWindowText(hwnd))))
                #                this.closeAllExcept([hwnd]);
                #        }
                #    }
                #    else
                #        super();
                #}
              ENDSOURCE
              SOURCE #mouseDown
                #public int mouseDown(int _x, int _y, int _button, boolean _Ctrl, boolean _Shift)
                #{
                #    int ret;
                #    int i;
                #    int hwnd;
                #
                #    ret = super(_x, _y, _button, _Ctrl, _Shift);
                #    //this.mouseUp(_x, _y, _button, _Ctrl, _Shift);
                #    return ret;
                #}
              ENDSOURCE
              SOURCE #mouseUp
                #public int mouseUp(int _x, int _y, int _button, boolean _Ctrl, boolean _Shift)
                #{
                #    int ret;
                #    int i;
                #    int hwnd;
                #
                #    ret = super(_x, _y, _button, _Ctrl, _Shift);
                #//    if(_Shift||_Ctrl)
                #//        return ret;
                #//    if(_button==1)
                #//    {
                #//        i=Tree.getFirstSelected();
                #//        while(i)
                #//        {
                #//            hwnd=tree.getItem(i).data();
                #//            infolog.activateWindow(hWnd);
                #//            i=Tree.getNextSelected(i);
                #//        }
                #//    }
                #    return ret;
                #}
              ENDSOURCE
            ENDMETHODS
            CONTAINER
            ENDCONTAINER
          ENDCONTROL
          CONTROL MENUBUTTON
            PROPERTIES
              Name                #MenuButton
              AutoDeclaration     #Yes
              Left                #Right edge
              Width               #15
              NormalResource      #3400
              Border              #Flat
              ShowShortCut        #No
              MultiSelect         #Yes
            ENDPROPERTIES
            METHODS
              Version: 3
              SOURCE #toolTip
                #public str toolTip()
                #{
                #    return "Toolbar Menus";
                #}
              ENDSOURCE
              SOURCE #showContextMenu
                #public int showContextMenu(int _menuHandle)
                #{
                #    int ret;
                #
                #    ret = super(_menuHandle);
                #
                #    return ret;
                #}
              ENDSOURCE
            ENDMETHODS
            CONTAINER
              CONTROL BUTTON
                PROPERTIES
                  Name                #Close
                  Text                #Close toolbar
                  ButtonDisplay       #Text & Image left
                  NormalResource      #7671
                  DisabledResource    #7671
                  Border              #Flat
                ENDPROPERTIES
                METHODS
                  Version: 3
                  SOURCE #clicked
                    #void clicked()
                    #{
                    #    ;
                    #    if (element.confirm(#_('Really wanna close Tabax?')))
                    #        element.close();
                    #        MenuButton.showContextMenu(this.handle());
                    #}
                  ENDSOURCE
                  SOURCE #toolTip
                    #public str toolTip()
                    #{
                    #  return #_('Close tabax');
                    #}
                  ENDSOURCE
                ENDMETHODS
              ENDCONTROL
              CONTROL BUTTON
                PROPERTIES
                  Name                #newProject
                  Text                #Create New Project
                  ButtonDisplay       #Text & Image left
                  NormalResource      #1090
                  DisabledResource    #1090
                  Border              #Flat
                ENDPROPERTIES
                METHODS
                  Version: 3
                  SOURCE #toolTip
                    #public str toolTip()
                    #{
                    #    return #_('Create New Project');
                    #}
                  ENDSOURCE
                  SOURCE #clicked
                    #void clicked()
                    #{
                    #    Args    args;
                    #    ;
                    #
                    #    args = new Args();
                    #    new MenuFunction(menuitemactionstr("MF_CreateNewProject"),MenuItemType::Action).run(args);
                    #
                    #}
                  ENDSOURCE
                ENDMETHODS
              ENDCONTROL
              CONTROL BUTTON
                PROPERTIES
                  Name                #CopyFields
                  Text                #Copy Fields To Clipboard
                ENDPROPERTIES
                METHODS
                  Version: 3
                  SOURCE #clicked
                    #void clicked()
                    #{
                    #    Args args;
                    #    ;
                    #    super();
                    #    args = new Args();
                    #    new MenuFunction(menuitemactionstr("MF_CopyFieldsToClipboard"),MenuItemType::Action).run(args);
                    #
                    #}
                  ENDSOURCE
                ENDMETHODS
              ENDCONTROL
            ENDCONTAINER
          ENDCONTROL
        ENDCONTAINER
      ENDDESIGN
    ENDFORM

    ***Element: FRM

    ; Microsoft Dynamics AX Forms unloaded
    ; --------------------------------------------------------------------------------
    FRMVERSION 5

    FORM #MF_showField
      PROPERTIES
        Name                #MF_showField
      ENDPROPERTIES
      METHODS
        Version: 3
        SOURCE #classDeclaration
          #public class FormRun extends ObjectRun
          #{
          #    str formName;
          #    str formFieldName;
          #    str formDataSourceName;
          #    str tableName;
          #    str fieldName;
          #    str methodName;
          #    str EDTName;
          #    MF_fieldInfo    fieldInfo;
          #
          #
          #}
        ENDSOURCE
        SOURCE #showEDTName
          #display notes showEDTName()
          #{
          #    str rRet;
          #    SysDictField    df;
          #    dictTable       dt;
          #    TableId         tableId;
          #
          #    ;
          #
          #    tableId = tablename2id(tablename);
          #    dt=new Dicttable(tableid);
          #    if(fieldname == "")
          #    {
          #       rRet = "From Method";
          #    }
          #    else
          #    {
          #       df = new SysDictField(dt.id(),dt.fieldname2id(fieldname));
          #       switch (df.baseType())
          #       {
          #            case Types::Date:
          #                rRet  = '['+extendedTypeId2name(df.typeid())+
          #                    '] Data Type: '+'Date'+'  size:'+int2str(df.fieldSize());
          #                break;
          #            case Types::Real:
          #                rRet  = '['+extendedTypeId2name(df.typeid())+
          #                    '] Data Type: '+ 'Real'+'  size:'+int2str(df.fieldSize());
          #                break;
          #            case Types::Integer:
          #                rRet  = '['+extendedTypeId2name(df.typeid())+
          #                    '] Data Type: '+ 'Integer'+'  size:'+int2str(df.fieldSize());
          #                break;
          #            case Types::String:
          #                rRet  = '['+extendedTypeId2name(df.typeid())+
          #                    '] Data Type: '+'String'+'  size:'+int2str(df.fieldSize());
          #                break;
          #            case Types::Integer:
          #                rRet  = '['+extendedTypeId2name(df.typeid())+
          #                    '] Data Type: '+'String'+'  size:'+int2str(df.fieldSize());
          #                break;
          #            case Types::DateTime:
          #                rRet  = '['+extendedTypeId2name(df.typeid())+
          #                    '] Data Type: '+'String'+'  size:'+int2str(df.fieldSize());
          #                break;
          #            case Types::Enum:
          #                rRet  = '['+EnumId2name(df.enumId())+
          #                    '] Data Type: '+'Enum'+'  size:'+int2str(df.fieldSize());
          #                break;
          #            default :
          #                rRet  = '['+extendedTypeId2name(df.typeid())+
          #                    '] Data Type: '+'Other'+'  size:'+int2str(df.fieldSize());
          #                break;
          #
          #         }
          #     }
          #
          #    return rRet;
          #}
        ENDSOURCE
        SOURCE #showFormDataSourceName
          #display str 80 showFormDataSourceName()
          #{
          #    return formDataSourceName;
          #}
        ENDSOURCE
        SOURCE #setPos
          #void setPos(int x, int y)
          #{
          #    container pos;
          #    ;
          #    pos = WinApi::clientToScreen(infolog.hWnd(), x, y);
          #    element.design().left(conPeek(pos, 1));
          #    element.design().top(conPeek(pos, 2));
          #    element.design().visible(true);
          #}
          #
          #
        ENDSOURCE
        SOURCE #init
          #public void init()
          #{
          #
          #    ;
          #    super();
          #
          #    if (element.args().caller())
          #    {
          #        fieldInfo           = element.args().caller();
          #        formName            = fieldInfo.getFormName();
          #        formFieldName       = fieldInfo.getFormFieldName();
          #        formDataSourceName  = fieldInfo.getFormDataSourceName();
          #        tableName           = fieldInfo.getTableName();
          #        fieldName           = fieldInfo.getFieldName();
          #        methodName          = fieldInfo.getMethodName();
          #
          #    }
          #    else
          #        throw error("@SYS59200");
          #
          #    element.setPos(conpeek(winAPI::getCursorPos(),1) , conpeek(winAPI::getCursorPos(),2)-30);
          #}
        ENDSOURCE
        SOURCE #closeSelect
          #public void closeSelect(str _selectString)
          #{
          #    super(_selectString);
          #    element.closeOk();
          #}
        ENDSOURCE
        SOURCE #task
          #public int task(int _taskId)
          #{
          #   #keypressed
          #   int i;
          #   ;
          #
          #   if (_taskId == 1313)
          #        element.closeOk();
          #
          #    return true;
          #}
        ENDSOURCE
        SOURCE #showFormName
          #display str 80 showFormName()
          #{
          #    return formName;
          #}
        ENDSOURCE
        SOURCE #showMethodName
          #display str 80 showMethodName()
          #{
          #    return methodName;
          #}
        ENDSOURCE
        SOURCE #showFieldName
          #display str 80 showFieldName()
          #{
          #    return fieldName;
          #}
        ENDSOURCE
        SOURCE #showTableName
          #display str 80 showTableName()
          #{
          #    return tableName;
          #}
        ENDSOURCE
        SOURCE #showFormFieldName
          #display str 80 showFormFieldName()
          #{
          #    return formFieldName;
          #}
        ENDSOURCE
      ENDMETHODS
      OBJECTBANK
        PROPERTIES
        ENDPROPERTIES
      ENDOBJECTBANK
      JOINS
      ENDJOINS
      DESIGN
        PROPERTIES
          Left                #0
          Top                 #0
          Width               #300
          Height              #230
          Frame               #Border
          WindowType          #Popup
          AlwaysOnTop         #Yes
          BackgroundColor     #Tooltip background
          ArrangeWhen         #Startup
          Columns             #2
          ArrangeGuide       
            ARRAY INDEX Columns
              #0
              #0
            ENDARRAY
        ENDPROPERTIES
        CONTAINER
          CONTROL BUTTON
            PROPERTIES
              Name                #Close
              Left                #Left edge
              ButtonDisplay       #Image only
              NormalResource      #3112
              BackStyle           #Transparent
              BackgroundColor     #Tooltip background
            ENDPROPERTIES
            METHODS
              Version: 3
              SOURCE #clicked
                #void clicked()
                #{
                #    super();
                #    element.closeOk();
                #}
              ENDSOURCE
            ENDMETHODS
          ENDCONTROL
          CONTROL WINDOW
            PROPERTIES
              Name                #Window
              Visible             #No
              Left                #Left edge
              Width               #53
              Height              #69
              ImageResource       #3112
              BackStyle           #Transparent
            ENDPROPERTIES
          ENDCONTROL
          CONTROL GROUP
            PROPERTIES
              Name                #FieldGrp
              Left                #3
              Top                 #20
              FrameType           #None
              FramePosition       #Inside
              BackStyle           #Transparent
              BackgroundColor     #Tooltip background
            ENDPROPERTIES
              CONTAINER
                CONTROL STRINGEDIT
                  PROPERTIES
                    Name                #showFormName
                    AllowEdit           #No
                    Left                #90
                    Height              #15
                    Border              #None
                    Alignment           #Left
                    BackgroundColor     #Tooltip background
                    ForegroundColor     #Tooltip text
                    Bold                #Bold
                    Label               #Form name
                    LabelWidth          #50
                    DataMethod          #showFormName
                  ENDPROPERTIES
                ENDCONTROL
                CONTROL STRINGEDIT
                  PROPERTIES
                    Name                #showFormFieldName
                    AllowEdit           #No
                    Left                #90
                    Height              #15
                    Border              #None
                    Alignment           #Left
                    BackgroundColor     #Tooltip background
                    ForegroundColor     #Tooltip text
                    Bold                #Bold
                    Label               #Form fieldname
                    LabelWidth          #50
                    DataMethod          #showFormFieldName
                  ENDPROPERTIES
                ENDCONTROL
                CONTROL STRINGEDIT
                  PROPERTIES
                    Name                #showFormDataSourceName
                    AllowEdit           #No
                    Left                #90
                    Height              #15
                    Border              #None
                    Alignment           #Left
                    BackgroundColor     #Tooltip background
                    ForegroundColor     #Tooltip text
                    Bold                #Bold
                    Label               #Form datasource
                    LabelWidth          #50
                    DataMethod          #showFormDataSourceName
                  ENDPROPERTIES
                ENDCONTROL
                CONTROL STRINGEDIT
                  PROPERTIES
                    Name                #showTableName
                    AllowEdit           #No
                    Left                #90
                    Top                 #70
                    Height              #15
                    Border              #None
                    Alignment           #Left
                    BackgroundColor     #Tooltip background
                    ForegroundColor     #Tooltip text
                    Bold                #Bold
                    Label               #TableName
                    LabelWidth          #50
                    DataMethod          #showTableName
                  ENDPROPERTIES
                ENDCONTROL
                CONTROL STRINGEDIT
                  PROPERTIES
                    Name                #showFieldName
                    AllowEdit           #No
                    Left                #90
                    Top                 #90
                    Height              #15
                    Border              #None
                    Alignment           #Left
                    BackgroundColor     #Tooltip background
                    ForegroundColor     #Tooltip text
                    Bold                #Bold
                    Label               #FieldName
                    LabelWidth          #50
                    DataMethod          #showFieldName
                  ENDPROPERTIES
                ENDCONTROL
                CONTROL STRINGEDIT
                  PROPERTIES
                    Name                #showMethodName
                    AllowEdit           #No
                    Left                #90
                    Top                 #110
                    Height              #15
                    Border              #None
                    Alignment           #Left
                    BackgroundColor     #Tooltip background
                    ForegroundColor     #Tooltip text
                    Bold                #Bold
                    Label               #MethodName
                    LabelWidth          #50
                    DataMethod          #showMethodName
                  ENDPROPERTIES
                ENDCONTROL
                CONTROL STRINGEDIT
                  PROPERTIES
                    Name                #showEDTName
                    AllowEdit           #No
                    DataMethod          #showEDTName
                  ENDPROPERTIES
                ENDCONTROL
              ENDCONTAINER
          ENDCONTROL
        ENDCONTAINER
      ENDDESIGN
    ENDFORM

    ***Element: FRM

    ; Microsoft Dynamics AX Forms unloaded
    ; --------------------------------------------------------------------------------
    FRMVERSION 5

    FORM #MF_CreateNewProjectDlg
      PROPERTIES
        Name                #MF_CreateNewProjectDlg
      ENDPROPERTIES
      METHODS
        Version: 3
        SOURCE #classDeclaration
          ##AOT
          ##ResAppl
          #public class FormRun extends ObjectRun
          #{
          #    MF_CreateNewProject        axCreateNewProject;
          #    ImageListAppl_Aot           imageListSmallAOT;
          #    ImageListAppl_Checkbox      imageListAppl_Checkbox;
          #    container                   aotPathes;
          #    int                         maxNameLen;
          #
          #    ProjectSharedPrivate        projectType;
          #    TreeNodeName                projectPrefix;
          #    TreeNodeName                projectName;
          #    container                   selectedProjectNodes;
          #    NoYes                       usePrefixValue;
          #    NoYes                       warnAboutNameDuplicates;
          #    NoYes                       updateExistingProject;
          #    Map                         objectTypeName;
          #
          #    TreeNodeName                projectPrefixOrig;
          #    TreeNodeName                projectNameOrig;
          #    ProjectSharedPrivate        projectTypeOrig;
          #    NoYes                       usePrefixOrig;
          #
          #    #localmacro.FormControlValues
          #        projectType,
          #        projectPrefix,
          #        projectName,
          #        selectedProjectNodes,
          #        usePrefixValue,
          #        warnAboutNameDuplicates,
          #        updateExistingProject
          #    #endmacro
          #}
        ENDSOURCE
        SOURCE #addObject2Tree
          #void addObject2Tree(TreeNode _treeNode)
          #{
          #    TreeNodePath    treeNodePath;
          #    int             i;
          #    container       con;
          #    int             nItem, nChild, nIndex, nChildLevel2;
          #    FormTreeItem    formTreeItem;
          #
          #    ;
          #    treeNodePath = subStr(_treeNode.treeNodePath(), 1, strLen(_treeNode.treeNodePath()) - strLen(_treeNode.treeNodeName()) - 1);
          #
          #    for (i = 1; i <= conlen(this.pathes()); i++)
          #    {
          #        con = conPeek(this.pathes(), i);
          #        if (conPeek(con, 1) == treeNodePath)
          #        {
          #            nIndex = i;
          #            break;
          #        }
          #    }
          #    if (nIndex < 1) //means, that the group node name with the selected object is not found in pathes
          #        return;
          #
          #    nItem = TreeSettings.getChild(TreeSettings.getRoot());
          #    while (nItem)
          #    {
          #        if (typeOf(TreeSettings.getItem(nItem).data()) == Types::String && TreeSettings.getItem(nItem).data() == treeNodePath)
          #        {
          #            SysFormTreeControl::addTreeItem(TreeSettings, _treeNode.treeNodeName(), nItem, _treeNode.applObjectType(),//_treeNode.treeNodePath(),
          #                                            imageListSmallAOT.image(ImageListAppl_Aot::utilElementType2Image(_treeNode.applObjectType())), false, this.getNodeStateImage(nIndex));
          #
          #            formTreeItem = TreeSettings.getItem(nItem);
          #            formTreeItem.children(true);
          #            TreeSettings.setItem(formTreeItem);
          #            return;
          #        }
          #        nChild = TreeSettings.getChild(nItem);
          #        while (nChild)
          #        {
          #            if (typeOf(TreeSettings.getItem(nChild).data()) == Types::String && TreeSettings.getItem(nChild).data() == treeNodePath)
          #            {
          #                SysFormTreeControl::addTreeItem(TreeSettings, _treeNode.treeNodeName(), nChild, _treeNode.applObjectType(),//_treeNode.treeNodePath(),
          #                                                imageListSmallAOT.image(ImageListAppl_Aot::utilElementType2Image(_treeNode.applObjectType())), false, this.getNodeStateImage(nIndex));
          #                formTreeItem = TreeSettings.getItem(nChild);
          #                formTreeItem.children(true);
          #                TreeSettings.setItem(formTreeItem);
          #                return;
          #            }
          #            nChildLevel2 = TreeSettings.getChild(nChild);
          #            while (nChildLevel2)
          #            {
          #                if (typeOf(TreeSettings.getItem(nChildLevel2).data()) == Types::String && TreeSettings.getItem(nChildLevel2).data() == treeNodePath)
          #                {
          #                    SysFormTreeControl::addTreeItem(TreeSettings, _treeNode.treeNodeName(), nChildLevel2, _treeNode.applObjectType(),//_treeNode.treeNodePath(),
          #                                                    imageListSmallAOT.image(ImageListAppl_Aot::utilElementType2Image(_treeNode.applObjectType())), false, this.getNodeStateImage(nIndex));
          #                    formTreeItem = TreeSettings.getItem(nChildLevel2);
          #                    formTreeItem.children(true);
          #                    TreeSettings.setItem(formTreeItem);
          #                    return;
          #                }
          #                nChildLevel2 = TreeSettings.getNextSibling(nChildLevel2);
          #            }
          #            nChild = TreeSettings.getNextSibling(nChild);
          #        }
          #        nItem = TreeSettings.getNextSibling(nItem);
          #    }
          #}
        ENDSOURCE
        SOURCE #addProjectObjects2Tree
          ##TreeNodeSysNodeType
          #void addProjectObjects2Tree()
          #{
          #    TreeNodeName        findProjectName;
          #    Object              prjListNode;
          #    ProjectNode         prjNode;
          #    TreeNode            treeNode;
          #    TreeNodeIterator    treeNodeIterator;
          #
          #    void    GetProjectGroup(ProjectGroupNode parentNode)
          #    {
          #        TreeNode                treeNodeLocal;
          #        TreeNodeIterator        treeNodeIteratorLocal;
          #        ;
          #        treeNodeIteratorLocal = parentNode.AOTIterator();
          #        treeNodeLocal = treeNodeIteratorLocal.next();
          #        while (treeNodeLocal)
          #        {
          #            if (treeNodeLocal.sysNodeType() == #NT_PROJECT_GROUP)
          #                GetProjectGroup(treeNodeLocal);
          #            else
          #            {
          #                element.addObject2Tree(treeNodeLocal);
          #            }
          #            treeNodeLocal = treeNodeIteratorLocal.next();
          #        }
          #    }
          #    ;
          #    prjListNode = projectTypeOrig == ProjectSharedPrivate::ProjPrivate ?
          #        SysTreeNode::getPrivateProject() : SysTreeNode::getSharedProject();
          #
          #    if (usePrefixOrig)
          #        findProjectName = axCreateNewProject.convertProjectPrefix(projectPrefixOrig);
          #    findProjectName += projectNameOrig;
          #
          #    prjNode = prjListNode.AOTfindChild(findProjectName);
          #
          #    if (!prjNode)
          #    {
          #        error(strFmt(@"A %1 project %2 was not found", cbProjectType.selection() == ProjectSharedPrivate::ProjPrivate ?
          #            @"Private" : @"Shared", projectNameOrig));
          #        return;
          #    }
          #
          #    prjNode = prjNode.loadForInspection();
          #    startLengthyOperation();
          #    treeNodeIterator = prjNode.AOTiterator();
          #
          #    treeNode = treeNodeIterator.next();
          #    while (treeNode)
          #    {
          #        if (treeNode.sysNodeType() == #NT_PROJECT_GROUP)
          #        {
          #            GetProjectGroup(treeNode);
          #        }
          #        else
          #        {
          #            element.addObject2Tree(treeNode);
          #        }
          #        treeNode = treeNodeIterator.next();
          #    }
          #    endLengthyOperation();
          #    ButtonCopyProjectObjects.enabled(NoYes::No);
          #}
        ENDSOURCE
        SOURCE #setCaptionText
          #void setCaptionText()
          #{
          #    ;
          #    if (warnAboutNameDuplicates)
          #    {
          #        if (cbProjectType.selection() == ProjectSharedPrivate::ProjPrivate)
          #            element.design().caption(@"Create a new Private project");
          #        else
          #            element.design().caption(@"Create a new Shared project");
          #    }
          #    else
          #    {
          #        element.design().caption(@"Update an existing project");
          #    }
          #}
        ENDSOURCE
        SOURCE #sendDataToClass
          #void sendDataToClass()
          #{
          #    ;
          #    selectedProjectNodes = element.readSelectedNodes(conNull(), TreeSettings.getRoot());
          #
          #    projectType          = cbProjectType.selection();
          #    projectName          = szProjectName.valueStr();
          #    projectPrefix        = szProjectNamePrefix.valueStr();
          #    usePrefixValue       = usePrefix.value();
          #
          #    axCreateNewProject.parmFormControlValues([#FormControlValues]);
          #
          #    if (updateExistingProject && warnAboutNameDuplicates && objectTypeName.elements() > 0)
          #    {
          #        axCreateNewProject.setObjectTypeName(objectTypeName.pack());
          #    }
          #}
        ENDSOURCE
        SOURCE #getRootStateImage
          #int getRootStateImage()
          #{
          #    ;
          #    if (!conFind(selectedProjectNodes, UnknownNoYes::No))
          #        return imageListAppl_checkbox.image(#ImageCheckAll);
          #
          #    if (!conFind(selectedProjectNodes, UnknownNoYes::Yes))
          #        return imageListAppl_checkbox.image(#ImageCheckNone);
          #
          #    return imageListAppl_checkbox.image(#ImageCheckSome);
          #}
        ENDSOURCE
        SOURCE #validateProjectName
          #void validateProjectName(str _projectPrefix, str _projectName)
          #{
          #    str             validateName;
          #    FormTreeItem    rootNode;
          #    ;
          #    if (usePrefix.value())
          #        validateName = axCreateNewProject.convertProjectPrefix(_projectPrefix);
          #    validateName += _projectName;
          #
          #    if ((maxNameLen < strLen(validateName)) ||
          #        (!TreeNode::isValidObjectName(validateName)))
          #    {
          #        ProjectNameValid.imageResource(1031);
          #    }
          #    else
          #    {
          #        if (warnAboutNameDuplicates &&
          #            ((cbProjectType.selection() == ProjectSharedPrivate::ProjShared && SysTreeNode::getSharedProject().AOTfindChild(validateName)) ||
          #            (cbProjectType.selection() == ProjectSharedPrivate::ProjPrivate && SysTreeNode::getPrivateProject().AOTfindChild(validateName))))
          #        {
          #            ProjectNameValid.imageResource(1031);
          #        }
          #        else
          #        {
          #            ProjectNameValid.imageResource(1030);
          #        }
          #    }
          #    rootNode = TreeSettings.getItem(TreeSettings.getRoot());
          #    rootNode.text(validateName);
          #    TreeSettings.setItem(rootNode);
          #}
        ENDSOURCE
        SOURCE #initFromCallerClass
          #void initFromCallerClass()
          #{
          #    ;
          #    [#FormControlValues] = axCreateNewProject.parmFormControlValues();
          #
          #    szProjectNamePrefix.text(projectPrefix);
          #    cbProjectType.selection(projectType);
          #    szProjectName.text(projectName);
          #    usePrefix.value(usePrefixValue);
          #    szProjectNamePrefix.enabled(usePrefixValue);
          #
          #    element.setCaptionText();
          #
          #    if (updateExistingProject && !warnAboutNameDuplicates)
          #    {
          #        projectPrefixOrig = projectPrefix;
          #        projectNameOrig = projectName;
          #        projectTypeOrig = projectType;
          #        usePrefixOrig   = usePrefixValue;
          #    }
          #
          #    this.initImageLists();
          #    this.fillTree();
          #}
        ENDSOURCE
        SOURCE #getNodeStateValue
          #int getNodeStateValue(int _nIndex)
          #{
          #    FormTreeItem formTreeItem = TreeSettings.getItem(_nIndex);
          #    ;
          #
          #    switch (formTreeItem.stateImage())
          #    {
          #        case imageListAppl_checkbox.image(#ImageCheckAll) :
          #            return UnknownNoYes::Yes;
          #
          #        case imageListAppl_checkbox.image(#ImageCheckNone) :
          #            return UnknownNoYes::No;
          #    }
          #    return UnknownNoYes::Unknown;
          #}
        ENDSOURCE
        SOURCE #readSelectedNodes
          #container readSelectedNodes(container _selectedNodes, int _item)
          #{
          #    FormTreeItem    formTreeItem;
          #    container       conSelected = _selectedNodes;
          #    container       conObjects;
          #    int             nItem;
          #    int             nIndex;
          #    ;
          #    nItem = TreeSettings.getChild(_item);
          #    while (nItem)
          #    {
          #        formTreeItem = TreeSettings.getItem(nItem);
          #        if (typeOf(formTreeItem.data()) == Types::String)
          #            conSelected += [element.getNodeStateValue(nItem)];
          #        else if (formTreeItem.stateImage() == imageListAppl_checkbox.image(#ImageCheckAll))
          #        {
          #            nIndex = conLen(conSelected);
          #            if (objectTypeName.exists(nIndex))
          #                conObjects = objectTypeName.lookup(nIndex);
          #            conObjects += formTreeItem.text();
          #            conObjects += formTreeItem.data();
          #
          #            objectTypeName.insert(nIndex, conObjects);
          #        }
          #        if (TreeSettings.getChild(nItem))
          #            conSelected = element.readSelectedNodes(conSelected, nItem);
          #
          #        nItem = TreeSettings.getNextSibling(nItem);
          #    }
          #    return conSelected;
          #}
        ENDSOURCE
        SOURCE #initImageLists
          #void initImageLists()
          #{
          #    int i;
          #    int img;
          #    str dummy;
          #    ;
          #
          #    imageListSmallAOT       = new ImageListAppl_Aot();
          #    imageListAppl_Checkbox  = new ImageListAppl_Checkbox();
          #
          #    if (updateExistingProject && !warnAboutNameDuplicates)
          #    {
          #        imageListSmallAOT.build();
          #        objectTypeName = new Map(Types::Integer, Types::Container);
          #    }
          #    else
          #    {
          #        imageListSmallAOT.add(#ImageProject);
          #        for(i = 1; i <= conlen(this.pathes()); i++)
          #        {
          #            [dummy, img] = conPeek(this.pathes(), i);
          #            imageListSmallAOT.add(img);
          #        }
          #    }
          #    dummy = dummy; //BP Deviation Fix
          #    TreeSettings.setImagelist(imageListSmallAOT.imageList());
          #    TreeSettings.setStateImagelist(imageListAppl_Checkbox.imageList());
          #}
        ENDSOURCE
        SOURCE #getNodeStateImage
          #int getNodeStateImage(int _nIndex)
          #{
          #    ;
          #    switch (conPeek(selectedProjectNodes, _nIndex))
          #    {
          #        case UnknownNoYes::Unknown  :
          #            return imageListAppl_checkbox.image(#ImageCheckSome);
          #
          #        case UnknownNoYes::Yes      :
          #            return imageListAppl_checkbox.image(#ImageCheckAll);
          #    }
          #    return imageListAppl_checkbox.image(#ImageCheckNone);
          #}
        ENDSOURCE
        SOURCE #addTreeNode
          #TreeItemIdx addTreeNode(str _nodePath, int _nIndex, int _parentIdx, boolean _hasChildren = false)
          #{
          #    int     img;
          #    int     dummy;
          #    ;
          #    [dummy, img] = conPeek(this.pathes(), _nIndex);
          #    dummy = dummy; //BP Deviation Fix
          #    return SysFormTreeControl::addTreeItem(TreeSettings,                        //FormTreeControl
          #                                           SysTreeNode::pathName(_nodePath),    //Item Name
          #                                           _parentIdx,                          //Parent Index
          #                                           _nodePath,                           //Item Data
          #                                           imageListSmallAOT.image(img),        //Item Image
          #                                           _hasChildren,                        //has Child nodes?
          #                                           element.getNodeStateImage(_nIndex)); //Item checkbox image
          #}
        ENDSOURCE
        SOURCE #CloseOk
          #void closeOk()
          #{
          #    DialogRunbase dialog = element.args().caller();
          #    ;
          #    element.sendDataToClass();
          #
          #    dialog.updateServer();
          #
          #    if (axCreateNewProject.checkCloseDialog())
          #        super();
          #}
          #
        ENDSOURCE
        SOURCE #init
          #public void init()
          #{
          #    ;
          #    if (!element.args().caller())
          #        throw error(strFmt(@"Method '%1.%2()' was called incorrectly", this.name(), funcName()));
          #
          #    axCreateNewProject =  element.args().caller().runbase();
          #
          #    super();
          #
          #    maxNameLen = new SysDictType(extendedTypeNum(TreeNodeName)).stringLen();
          #    this.initFromCallerClass();
          #    this.validateProjectName(szProjectNamePrefix.valueStr(), szProjectName.valueStr());
          #}
        ENDSOURCE
        SOURCE #runBase
          #RunBase runBase()
          #{
          #    return axCreateNewProject;
          #}
          #
        ENDSOURCE
        SOURCE #pathes
          #container pathes()
          #{
          #    ;
          #    if (!aotPathes)
          #    {
          #        aotPathes =
          #        [
          #            [#DataDictionaryPath,       #imageDataDictionary],
          #            [#TablesPath,               #imageTables],
          #            [#TableMapsPath,            #imageTableMaps],
          #            [#ViewsPath,                #ImageViews],
          #            [#ExtendedDataTypesPath,    #imageEDTs],
          #            [#BaseEnumsPath,            #imageBaseEnums],
          #            [#DataDictionaryPath,       #imageDataDictionary],
          #            #ifnot.ReferencesPath
          #            [#FeatureKeysPath,          #ImageFeaturekeys],
          #            #endIf
          #            [#LicenseCodesPath,         #ImageLicenseCodes],
          #            [#ConfigurationKeysPath,    #ImageConfigurationKeys],
          #            [#SecurityKeysPath,         #ImageSecurityKeys],
          #            [#TableCollectionsPath,     #ImageTableCollections],
          #            #if.ReferencesPath
          #            [#PerspectivesPath,         #ImagePerspectiveList],
          #            #endIf
          #            [#MacrosPath,               #imageMacros],
          #            [#ClassesPath,              #imageClasses],
          #            [#FormsPath,                #imageForms],
          #            [#ReportsPath,              #imageReports],
          #            [#QueriesPath,              #imageQueries],
          #            [#JobsPath,                 #imageJobs],
          #            [#MenusPath,                #imageMenus],
          #            [#MenuItemsPath,            #imageMenuItems],
          #            [#MenuItemsDisplayPath,     #ImageMenuDisplayItems],
          #            [#MenuItemsOutputPath,      #imageMenuOutputItems],
          #            [#MenuItemsActionPath,      #imageMenuActionItems]
          #        ];
          #    }
          #    return aotPathes;
          #}
        ENDSOURCE
        SOURCE #fillTree
          #void fillTree()
          #{
          #    TreeItemIdx     rootIdx;
          #    TreeItemIdx     dataDictionaryIdx;
          #    TreeItemIdx     menuItemsIdx;
          #    TreeItemIdx     moreIdx;
          #    Line            curLine = 8;
          #    ;
          #    TreeSettings.deleteAll();
          #
          #    rootIdx = SysFormTreeControl::addTreeItem(TreeSettings, @"Project", FormTreeAdd::Root, @"Project",
          #        imageListSmallAOT.image(#ImageProject), true, element.getRootStateImage());
          #
          #    dataDictionaryIdx   = element.addTreeNode(#DataDictionaryPath,      1, rootIdx, true);
          #    element.addTreeNode(#TablesPath,              2, dataDictionaryIdx);
          #    element.addTreeNode(#TableMapsPath,           3, dataDictionaryIdx);
          #    element.addTreeNode(#ViewsPath,               4, dataDictionaryIdx);
          #    element.addTreeNode(#ExtendedDataTypesPath,   5, dataDictionaryIdx);
          #    element.addTreeNode(#BaseEnumsPath,           6, dataDictionaryIdx);
          #
          #    moreIdx = SysFormTreeControl::addTreeItem(TreeSettings, @"More...", dataDictionaryIdx, @"More...",
          #        imageListSmallAOT.image(#ImageDataDictionary), true, element.getNodeStateImage(7));
          #
          #    #ifnot.ReferencesPath   //AX3
          #    element.addTreeNode(#FeatureKeysPath,         curLine, moreIdx);    curLine++;
          #    #endIf
          #    element.addTreeNode(#LicenseCodesPath,        curLine, moreIdx);    curLine++;
          #    element.addTreeNode(#ConfigurationKeysPath,   curLine, moreIdx);    curLine++;
          #    element.addTreeNode(#SecurityKeysPath,        curLine, moreIdx);    curLine++;
          #    element.addTreeNode(#TableCollectionsPath,    curLine, moreIdx);    curLine++;
          #    #if.ReferencesPath      //AX4
          #    element.addTreeNode(#PerspectivesPath,        curLine, moreIdx);    curLine++;
          #    #endIf
          #
          #    element.addTreeNode(#MacrosPath,              13, rootIdx);
          #    element.addTreeNode(#ClassesPath,             14, rootIdx);
          #    element.addTreeNode(#FormsPath,               15, rootIdx);
          #    element.addTreeNode(#ReportsPath,             16, rootIdx);
          #    element.addTreeNode(#QueriesPath,             17, rootIdx);
          #    element.addTreeNode(#JobsPath,                18, rootIdx);
          #    element.addTreeNode(#MenusPath,               19, rootIdx);
          #
          #    menuItemsIdx        = element.addTreeNode(#MenuItemsPath, 20, rootIdx, true);
          #    element.addTreeNode(#MenuItemsDisplayPath,    21, menuItemsIdx);
          #    element.addTreeNode(#MenuItemsOutputPath,     22, menuItemsIdx);
          #    element.addTreeNode(#MenuItemsActionPath,     23, menuItemsIdx);
          #
          #    SysFormTreeControl::expandTree(TreeSettings, rootIdx);
          #    SysFormTreeControl::expandTree(TreeSettings, dataDictionaryIdx);
          #    SysFormTreeControl::expandTree(TreeSettings, menuItemsIdx);
          #    SysFormTreeControl::collapseTree(TreeSettings, moreIdx);
          #
          #    TreeSettings.select(rootIdx);
          #}
        ENDSOURCE
      ENDMETHODS
      OBJECTBANK
        PROPERTIES
        ENDPROPERTIES
      ENDOBJECTBANK
      JOINS
      ENDJOINS
      DESIGN
        PROPERTIES
          Caption             #Create a new Shared/Private Project
          Frame               #Dialog
          WindowType          #Popup
          SaveSize            #Yes
          HideToolbar         #Yes
          Columns             #2
          ArrangeGuide       
            ARRAY INDEX Columns
              #0
              #0
            ENDARRAY
          AllowUserSetup      #Restricted
        ENDPROPERTIES
        CONTAINER
          CONTROL TAB
            PROPERTIES
              Name                #Tab
              Width               #Column width
              Height              #Column height
              Tabs                #1
              ShowTabs            #No
            ENDPROPERTIES
            CONTAINER
              CONTROL TABPAGE
                PROPERTIES
                  Name                #TabPage
                  Caption             #@SYS2952
                ENDPROPERTIES
                CONTAINER
                  CONTROL GROUP
                    PROPERTIES
                      Name                #dialogStartGrp
                      Visible             #No
                      FrameType           #None
                    ENDPROPERTIES
                      CONTAINER
                      ENDCONTAINER
                  ENDCONTROL
                  CONTROL GROUP
                    PROPERTIES
                      Name                #ProjectNameGrp
                      FrameType           #None
                      Columns             #2
                      ArrangeGuide       
                        ARRAY INDEX Columns
                          #0
                          #0
                        ENDARRAY
                      AlignChildren       #No
                      AlignChild          #No
                    ENDPROPERTIES
                      CONTAINER
                        CONTROL STRINGEDIT
                          PROPERTIES
                            Name                #szProjectName
                            AutoDeclaration     #Yes
                            Width               #150
                            Label               #Project name
                            LabelAlignment      #Right
                            ExtendedDataType   
                              ARRAY
                                #TreeNodeName
                                #
                              ENDARRAY
                          ENDPROPERTIES
                          METHODS
                            Version: 3
                            SOURCE #textChange
                              #public void textChange()
                              #{
                              #    super();
                              #
                              #    if (updateExistingProject && !warnAboutNameDuplicates)
                              #    {
                              #        warnAboutNameDuplicates = NoYes::Yes;
                              #        ButtonCopyProjectObjects.enabled(NoYes::Yes);
                              #    }
                              #    element.setCaptionText();
                              #
                              #    element.validateProjectName(szProjectNamePrefix.valueStr(), szProjectName.valueStr());
                              #}
                            ENDSOURCE
                          ENDMETHODS
                        ENDCONTROL
                        CONTROL WINDOW
                          PROPERTIES
                            Name                #ProjectNameValid
                            AutoDeclaration     #Yes
                            Height              #Column height
                            Skip                #Yes
                            ImageResource       #1031
                            Imagemode           #Size to fit
                            BackStyle           #Transparent
                            BackgroundColor     #Button face (3D)
                            ForegroundColor     #Button text
                            ShowLabel           #No
                          ENDPROPERTIES
                          METHODS
                            Version: 3
                            SOURCE #toolTip
                              #public str toolTip()
                              #{
                              #    str validateName;
                              #    ;
                              #    if (usePrefix.value())
                              #    {
                              #        validateName = axCreateNewProject.convertProjectPrefix(szProjectNamePrefix.valueStr());
                              #        if (validateName && !TreeNode::isValidObjectName(validateName))
                              #            return @"The Project prefix contains illegal characters";
                              #    }
                              #    validateName += szProjectName.valueStr();
                              #
                              #    if (maxNameLen < strLen(validateName))
                              #        return @"The name of the project is too long";
                              #
                              #    if (warnAboutNameDuplicates &&
                              #        ((cbProjectType.selection() == ProjectSharedPrivate::ProjShared && SysTreeNode::getSharedProject().AOTfindChild(validateName)) ||
                              #        (cbProjectType.selection() == ProjectSharedPrivate::ProjPrivate && SysTreeNode::getPrivateProject().AOTfindChild(validateName))))
                              #        return @"Project with such name already exists";
                              #
                              #    if (!TreeNode::isValidObjectName(validateName))
                              #        return @"The name of the project contains illegal characters";
                              #
                              #    return @"The Project Name is valid";
                              #}
                            ENDSOURCE
                          ENDMETHODS
                        ENDCONTROL
                      ENDCONTAINER
                  ENDCONTROL
                  CONTROL GROUP
                    PROPERTIES
                      Name                #SettingsMainGrp
                      AutoDeclaration     #Yes
                      Width               #Column width
                      Height              #Column height
                      Skip                #Yes
                      FrameType           #Edged 3D Line
                      Caption             #Project Settings
                    ENDPROPERTIES
                      CONTAINER
                        CONTROL GROUP
                          PROPERTIES
                            Name                #ProjectTypePrefixGrp
                            FrameType           #None
                            Columns             #2
                            ArrangeGuide       
                              ARRAY INDEX Columns
                                #0
                                #0
                              ENDARRAY
                            AlignChild          #No
                          ENDPROPERTIES
                            CONTAINER
                              CONTROL GROUP
                                PROPERTIES
                                  Name                #ProjectNamePrefix
                                  FrameType           #None
                                  Columns             #2
                                  Columnspace         #0
                                  ArrangeGuide       
                                    ARRAY INDEX Columns
                                      #0
                                      #0
                                    ENDARRAY
                                  AlignChildren       #No
                                ENDPROPERTIES
                                  CONTAINER
                                    CONTROL CHECKBOX
                                      PROPERTIES
                                        Name                #UsePrefix
                                        AutoDeclaration     #Yes
                                        Skip                #Yes
                                        Value               #1
                                        ShowLabel           #No
                                        LabelAlignment      #Right
                                      ENDPROPERTIES
                                      METHODS
                                        Version: 3
                                        SOURCE #modified
                                          #public boolean modified()
                                          #{
                                          #    boolean ret;
                                          #
                                          #    ret = super();
                                          #
                                          #    szProjectNamePrefix.enabled(this.value());
                                          #
                                          #    if (updateExistingProject && !warnAboutNameDuplicates)
                                          #    {
                                          #        warnAboutNameDuplicates = NoYes::Yes;
                                          #        ButtonCopyProjectObjects.enabled(NoYes::Yes);
                                          #    }
                                          #    element.setCaptionText();
                                          #
                                          #    element.validateProjectName(szProjectNamePrefix.valueStr(), szProjectName.valueStr());
                                          #
                                          #    return ret;
                                          #}
                                        ENDSOURCE
                                      ENDMETHODS
                                    ENDCONTROL
                                    CONTROL STRINGEDIT
                                      PROPERTIES
                                        Name                #szProjectNamePrefix
                                        AutoDeclaration     #Yes
                                        HelpText            #Input a prefix that will be automatically added to the name of the project
                                        LimitText           #20
                                        DisplayLength       #10
                                        Label               #Prefix
                                        LabelAlignment      #Right
                                      ENDPROPERTIES
                                      METHODS
                                        Version: 3
                                        SOURCE #textChange
                                          #public void textChange()
                                          #{
                                          #    super();
                                          #
                                          #    if (updateExistingProject && !warnAboutNameDuplicates)
                                          #    {
                                          #        warnAboutNameDuplicates = NoYes::Yes;
                                          #        ButtonCopyProjectObjects.enabled(NoYes::Yes);
                                          #    }
                                          #    element.setCaptionText();
                                          #
                                          #    element.validateProjectName(szProjectNamePrefix.valueStr(), szProjectName.valueStr());
                                          #}
                                        ENDSOURCE
                                      ENDMETHODS
                                    ENDCONTROL
                                  ENDCONTAINER
                              ENDCONTROL
                              CONTROL COMBOBOX
                                PROPERTIES
                                  Name                #cbProjectType
                                  AutoDeclaration     #Yes
                                  HelpText            #Create a shared or a private project?
                                  Text               
                                    ARRAY INDEX Items
                                      #Shared
                                      #Private
                                    ENDARRAY
                                  Item                #1
                                  Items               #2
                                  Label               #Project type
                                  LabelAlignment      #Right
                                ENDPROPERTIES
                                METHODS
                                  Version: 3
                                  SOURCE #selectionChange
                                    #public int selectionChange()
                                    #{
                                    #    int ret;
                                    #
                                    #    ret = super();
                                    #
                                    #    if (updateExistingProject && !warnAboutNameDuplicates)
                                    #    {
                                    #        warnAboutNameDuplicates = NoYes::Yes;
                                    #        ButtonCopyProjectObjects.enabled(NoYes::Yes);
                                    #    }
                                    #    element.setCaptionText();
                                    #
                                    #    element.validateProjectName(szProjectNamePrefix.valueStr(), szProjectName.valueStr());
                                    #
                                    #    return ret;
                                    #}
                                  ENDSOURCE
                                ENDMETHODS
                              ENDCONTROL
                            ENDCONTAINER
                        ENDCONTROL
                        CONTROL GROUP
                          PROPERTIES
                            Name                #SettingsGrp
                            Width               #Column width
                            Height              #Column height
                            FrameType           #None
                            AlignChild          #No
                          ENDPROPERTIES
                            CONTAINER
                              CONTROL TREE
                                PROPERTIES
                                  Name                #TreeSettings
                                  Width               #Column width
                                  Height              #Column height
                                  LinesAtRoot         #No
                                  Bold                #Normal
                                ENDPROPERTIES
                                METHODS
                                  Version: 3
                                  SOURCE #mouseDblClick
                                    #public int mouseDblClick(int _x, int _y, int _button, boolean _Ctrl, boolean _Shift)
                                    #{
                                    #    #define.FOCUS_CHECKBOX(64)
                                    #    int             ret;
                                    #    int             idx;
                                    #    int             focus;
                                    #    FormTreeItem    formTreeItem;
                                    #    ;
                                    #    if (_Shift || _Ctrl || _button != 1)
                                    #        return 1;
                                    #
                                    #    ret = super(_x, _y, _button, _ctrl, _shift);
                                    #
                                    #    [idx, focus] = this.hitTest(_x, _y);
                                    #
                                    #    if (focus & #FOCUS_CHECKBOX && this.getItem(idx))
                                    #    {
                                    #        formTreeItem = this.getItem(idx);
                                    #
                                    #        SysFormTreeControl::changeStateImage_CheckBox(this, formTreeItem.idx());
                                    #    }
                                    #
                                    #    return ret;
                                    #}
                                  ENDSOURCE
                                  SOURCE #mouseDown
                                    #public int mouseDown(int _x, int _y, int _button, boolean _Ctrl, boolean _Shift)
                                    #{
                                    #    #define.FOCUS_CHECKBOX(64)
                                    #        #FormListControl
                                    #    int             ret;
                                    #    int             focus;
                                    #    TreeItemIdx     idx;
                                    #    FormTreeItem    formTreeItem;
                                    #    ;
                                    #    ret = super(_x, _y, _button, _Ctrl, _Shift);
                                    #
                                    #    [idx, focus] = this.hitTest(_x, _y);
                                    #
                                    #    if (focus & #FOCUS_CHECKBOX && this.getItem(idx))
                                    #    {
                                    #        formTreeItem = this.getItem(idx);
                                    #
                                    #        SysFormTreeControl::changeStateImage_CheckBox(this, formTreeItem.idx());
                                    #    }
                                    #
                                    #    return ret;
                                    #}
                                  ENDSOURCE
                                ENDMETHODS
                              ENDCONTROL
                            ENDCONTAINER
                        ENDCONTROL
                      ENDCONTAINER
                  ENDCONTROL
                  CONTROL BUTTONGROUP
                    PROPERTIES
                      Name                #RightButtonGrp
                    ENDPROPERTIES
                    CONTAINER
                    ENDCONTAINER
                  ENDCONTROL
                ENDCONTAINER
              ENDCONTROL
            ENDCONTAINER
          ENDCONTROL
          CONTROL GROUP
            PROPERTIES
              Name                #BottomGrp
              Top                 #Bottom edge
              Width               #Column width
              FrameType           #Edged 3D Line
              Columns             #2
              ArrangeGuide       
                ARRAY INDEX Columns
                  #0
                  #0
                ENDARRAY
            ENDPROPERTIES
              CONTAINER
                CONTROL BUTTONGROUP
                  PROPERTIES
                    Name                #BottomButtonGrp
                    Left                #Auto (right)
                    SizeWidth           #No
                    ArrangeMethod       #Horizontal, flush right
                  ENDPROPERTIES
                  CONTAINER
                    CONTROL BUTTON
                      PROPERTIES
                        Name                #ButtonCopyProjectObjects
                        AutoDeclaration     #Yes
                        Enabled             #No
                        HelpText            #Copy objects from the selected Project
                        Text                #Copy Objects
                        ShowShortCut        #No
                      ENDPROPERTIES
                      METHODS
                        Version: 3
                        SOURCE #clicked
                          #void clicked()
                          #{
                          #    super();
                          #
                          #    element.addProjectObjects2Tree();
                          #}
                        ENDSOURCE
                      ENDMETHODS
                    ENDCONTROL
                    CONTROL COMMANDBUTTON
                      PROPERTIES
                        Name                #CommandButtonOK
                        ShowShortCut        #No
                        DefaultButton       #Yes
                        Command             #263
                      ENDPROPERTIES
                    ENDCONTROL
                    CONTROL COMMANDBUTTON
                      PROPERTIES
                        Name                #CommandButtonCancel
                        ShowShortCut        #No
                        Command             #264
                      ENDPROPERTIES
                    ENDCONTROL
                  ENDCONTAINER
                ENDCONTROL
              ENDCONTAINER
          ENDCONTROL
        ENDCONTAINER
      ENDDESIGN
    ENDFORM

    ***Element: CLS

    ; Microsoft Dynamics AX Class: MF_EditorScripts_ForAxassist 未加载
    ; --------------------------------------------------------------------------------
      CLSVERSION 1
      CLASS #MF_EditorScripts_ForAxassist
        Id 50017
        PROPERTIES
          Name                #MF_EditorScripts_ForAxassist
          Extends             #
          RunOn               #Client
        ENDPROPERTIES
        METHODS
          Version: 3
          SOURCE #classDeclaration
            #// This is a framework class. Customizing this class may cause problems with future upgrades to the software.
            #class MF_EditorScripts_ForAxassist
            #{
            #}
          ENDSOURCE
          SOURCE #getApplicableScripts
            #//
            #// System entry point
            #//
            #public container getApplicableScripts(Editor _editor)
            #{
            #    TreeNode aotNode = EditorScripts::getApplObjectNode(_editor);
            #    DictClass dictClass = new DictClass(classnum(EditorScripts));
            #    DictMethod dictMethod;
            #    int i;
            #    container scripts;
            #
            #    //
            #    // Insert menu items
            #    //
            #    for (i = 1; i <= dictClass.objectMethodCnt(); i++)
            #    {
            #        dictMethod = dictClass.objectMethodObject(i);
            #        if (this.isApplicableMethod(dictMethod, aotNode))
            #        {
            #            scripts += dictMethod.name();
            #        }
            #    }
            #    // Axassist 2009 install begin
            #    if(DEV_AxAssistSingleton::getThisClass().parmAltMEmulate())
            #      {
            #        DEV_AxAssistSingleton::getThisClass().parmEditor(_editor);
            #        DEV_AxAssistSingleton::getThisClass().parmAltMEmulate(false);
            #        return connull();
            #      }
            #    // Axassist 2009 install end
            #
            #    // Axassist 4.0 Install begin
            #      if(DEV_AxAssistSingleton::getThisClass().parmAltMEmulate())
            #      {
            #        DEV_AxAssistSingleton::getThisClass().parmEditor(e);
            #        DEV_AxAssistSingleton::getThisClass().parmAltMEmulate(false);
            #        return connull();
            #      }
            #    // Axassist 4.0 install end
            #
            #    return scripts;
            #}
          ENDSOURCE
        ENDMETHODS
      ENDCLASS

    ***Element: CLS

    ; Microsoft Dynamics AX Class: MF_QueryBrowser 未加载
    ; --------------------------------------------------------------------------------
      CLSVERSION 1
      CLASS #MF_QueryBrowser
        Id 50015
        PROPERTIES
          Name                #MF_QueryBrowser
          Extends             #
          RunOn               #Called from
        ENDPROPERTIES
        METHODS
          Version: 3
          SOURCE #classDeclaration
            #// Created by GRR for QueryBrowser on 28.09.2007
            #class MF_QueryBrowser
            #{
            #    #DEFINE.FormWidth(750)//500
            #    #DEFINE.FormHeight(450)//300
            #}
          ENDSOURCE
          SOURCE #run
            #public void run(Query query)
            #{
            #    TableId                         tableId;
            #    DictTable                       dictTable;
            #    Object                          formRun;
            #
            #    FieldId                         fieldId;
            #    FieldId                         _fieldId;
            #    DictField                       dictField;
            #
            #    Form                            tableBrowser;
            #    FormBuildDesign                 formBuildDesign;
            #    FormBuildDataSource             formBuildDataSource;
            #    FormBuildGridControl            formBuildGridControl;
            #    FormBuildControl                formBuildField;
            #
            #    FormControl                     formControl;
            #    FormBuildStringControl          formBuildStringControl;
            #    Object                          formBuildControl;
            #
            #    FormGridControl                 formGridControl;
            #    int                             idx;
            #
            #    Args                            args;
            #    Args                            browserArgs;
            #
            #    int                             cnt;
            #    int                             dsIdx;
            #    int                             i, j;
            #
            #    container                       cGrayFields;
            #    #DictField
            #    ;
            #
            #    browserArgs     = new Args();
            #    browserArgs.name(formStr(MF_QueryBrowser));
            #    formRun         = classFactory.formRunClass(browserArgs);
            #    tableBrowser    = formRun.form();
            #
            #    formBuildDesign = tableBrowser.design();
            #    formBuildDesign.caption(
            #        "@SYS13579" + (query.name()?(': '+query.name()):''));
            #    formBuildDesign.widthMode(-1);
            #    formBuildDesign.widthValue(#FormWidth);
            #    formBuildDesign.heightMode(-1);
            #    formBuildDesign.heightValue(#FormHeight);
            #
            #    cnt = query.dataSourceCount();
            #
            #    for (dsIdx = 1; dsIdx <= cnt; dsIdx++)
            #    {
            #        tableId         = query.dataSourceNo(dsIdx).table();
            #        dictTable       = new DictTable(tableId);
            #
            #        if(dsIdx == 1)
            #        {
            #            formBuildDataSource = tableBrowser.dataSource(dsIdx);
            #            formBuildDataSource.name(dictTable.name());
            #            formBuildDataSource.table(tableId);
            #
            #            formBuildGridControl = formBuildDesign.addControl(FormControlType::GRID,'Grid');
            #            formBuildGridControl.dataSource(dictTable.name());
            #            formBuildGridControl.widthMode(1);
            #            formBuildGridControl.heightMode(1);
            #            formBuildGridControl.visible(true);
            #            idx = formBuildGridControl.id();
            #        }
            #        else
            #        {
            #            formBuildDataSource = tableBrowser.addDataSource(dictTable.name());
            #            formBuildDataSource.table(tableId);
            #        }
            #
            #        for (i=1; i<=dictTable.fieldCnt(); i++)
            #        {
            #            fieldId = dictTable.fieldCnt2Id(i);
            #            dictField = new DictField(dictTable.id(), fieldId);
            #
            #            if (bitTest(dictField.flags(), #DBF_STORE))
            #            {
            #                for(j = 1;j <= dictField.arraySize(); j++)
            #                {
            #                    _fieldId = fieldId2Ext(fieldId, j);
            #
            #                    if (dictField.baseType() != Types::CONTAINER)
            #                    {
            #                        formBuildField = formBuildGridControl.addDataField(formBuildDataSource.id(), _fieldId);
            #                        formControl = formBuildDesign.control(formBuildField.id());
            #                        formControl.helpText(
            #                            formBuildDataSource.name() + '.' + fieldId2Name(formBuildDataSource.table(), _fieldId) +
            #                            ' ['+ fieldId2pName(formBuildDataSource.table(), _fieldId) + ']');
            #                    }
            #
            #                    if (dictField.baseType() == Types::STRING ||
            #                        dictField.baseType() == Types::RSTRING ||
            #                        dictField.baseType() == Types::VARSTRING)
            #                    {
            #                        formBuildStringControl = formBuildField;
            #
            #                        formBuildStringControl.displayHeightMode(0);
            #                        formBuildStringControl.displayHeightValue(1);
            #                        formBuildStringControl.label(dictField.name());
            #                    }
            #                    else
            #                    {
            #                        if (dictField.baseType() != Types::CONTAINER)
            #                        {
            #                            formBuildControl = formBuildField;
            #                            if (formBuildControl)
            #                            {
            #                                formBuildControl.label(dictField.name());
            #                            }
            #                        }
            #                        else
            #                        {
            #                            formBuildControl = formBuildGridControl.addControl(FormControlType::STRING,'TableBrowserContainer');
            #                            formBuildControl.datasource(formBuildDataSource.id());
            #                            formBuildControl.dataField(fieldId2Ext(fieldId,j));
            #                            formBuildControl.label(dictField.name());
            #                            //formBuildControl.helpText(dictField.label());
            #
            #                            formBuildControl.helpText(
            #                                formBuildDataSource.name() + '.' + fieldId2Name(formBuildDataSource.table(), _fieldId) +
            #                                ' ['+ fieldId2pName(formBuildDataSource.table(), _fieldId) + ']');
            #
            #                            formBuildControl.displayLengthMode(0);
            #                            formBuildControl.displayLengthValue(5);
            #                            formBuildControl.lookupButton(2);
            #                        }
            #                    }
            #
            #                    if(!(dsIdx mod 2))
            #                        cGrayFields += formControl.id();
            #                }
            #            }
            #        }
            #    }
            #
            #    args = new Args();
            #    args.object(tableBrowser);
            #    formRun = classFactory.formRunClass(args);
            #
            #    formRun.init();
            #    formRun.parmQuery(query);
            #    formRun.parmGrayFields(cGrayFields);
            #    formRun.run();
            #
            #    formGridControl = formRun.control(idx);
            #    formGridControl.setFocus();
            #
            #    formRun.detach();
            #}
          ENDSOURCE
          SOURCE #main
            #client static void main(Args _args)
            #{
            #    boolean isRunFromTabax()
            #    {
            #        return _args.caller()
            #               &&
            #               classIdGet(_args.caller())==classNum(SysSetupFormRun)
            #               &&
            #               _args.caller().name()=='Tabax';
            #    }
            #
            #    void processContext(SysContextMenu _context)
            #    {
            #        TreeNode node = _context.first();
            #        Query query = MF_QueryBrowser::treeNode2Query(node);
            #        if(query)
            #            new MF_QueryBrowser().run(query);
            #    }
            #
            #    void processTabax()
            #    {
            #        FormRun currentFormRun = _args.caller().currentFormRun();
            #        FormDataSource ds;
            #        if (currentFormRun)
            #            ds = currentFormRun.dataSource();
            #        if (ds)
            #            new MF_QueryBrowser().run(ds.query());
            #        else
            #            processContext(_args.caller().currentSysContextMenu());
            #    }
            #;
            #    if (isRunFromTabax())
            #        processTabax();
            #    else if (SysContextMenu::startedFrom(_args))
            #        processContext(_args.parmObject());
            #}
            #
            #
          ENDSOURCE
          SOURCE #main_DEL
            #client static void main_DEL(Args args)
            #{
            #    SysContextMenu          sysContextMenu;
            #    TreeNode                treeNode;
            #    MF_QueryBrowser        queryBrowser;
            #    Query                   query;
            #    ;
            #
            #    if (SysContextMenu::startedFrom(args))
            #    {
            #        sysContextMenu  = args.parmObject();
            #        treeNode        = sysContextMenu.first();
            #        query           = MF_QueryBrowser::treeNode2Query(treeNode);
            #
            #        if(Query != null)
            #            new MF_QueryBrowser().run( query );
            #    }
            #}
          ENDSOURCE
          SOURCE #treeNode2Query
            #static Query treeNode2Query(TreeNode treeNode)
            #{
            #    #TreeNodeSysNodeType
            #    Query       query;
            #    str         nodeName;
            #    ;
            #
            #    if (treeNode.sysNodeType() == #NT_QE)                 //Query node
            #    {
            #        query = new Query(treeNode.treeNodeName());
            #    }
            #    else
            #    {
            #        query = null;
            #    }
            #
            #    return query;
            #}
          ENDSOURCE
        ENDMETHODS
      ENDCLASS

    ***Element: CLS

    ; Microsoft Dynamics AX Class: MF_CopyFieldsToClipboard 未加载
    ; --------------------------------------------------------------------------------
      CLSVERSION 1
      CLASS #MF_CopyFieldsToClipboard
        Id 50009
        PROPERTIES
          Name                #MF_CopyFieldsToClipboard
          Extends             #RunBase
          RunOn               #Client
        ENDPROPERTIES
        METHODS
          Version: 3
          SOURCE #classDeclaration
            ##TreeNodeSysNodeType
            ##AOT
            #class MF_CopyFieldsToClipboard extends RunBase
            #{
            #    TextBuffer          textBuffer;
            #    Map                 fieldNamesMap;
            #    TreeNode            selectedTableNode;
            #
            #    SourceLine          tableVariableName;
            #    TableName           tableName;
            #    NoYes               insertDeclaration;
            #    NoYes               insertClearMethod;
            #    Integer             NoneInsertUpdateMethod;
            #    Set                 fieldListSet;
            #
            #
            #    Common              RecordBuffer;
            #    boolean             useRecordBuffer;
            #
            #
            #    #define.CurrentVersion(5)
            #
            #    #localMacro.FormControlList
            #        tableVariableName,
            #        tableName,
            #        insertDeclaration,
            #        insertClearMethod,
            #        NoneInsertUpdateMethod
            #    #endMacro
            #}
          ENDSOURCE
          SOURCE #dialog
            #protected Object dialog(DialogRunbase dialog, boolean forceOnClient)
            #{
            #    DialogRunbase dlg = Dialog::newFormNameRunbase(formstr(MF_CopyFieldsToClipboard), this);
            #    ;
            #
            #    this.processTable(selectedTableNode);
            #    dlg = super(dlg, forceOnClient);
            #
            #    return dlg;
            #}
          ENDSOURCE
          SOURCE #dialogReInit
            #protected void dialogReInit()
            #{
            #    DialogRunbase   dlg;
            #    Object          formRun;
            #    ;
            #    super();
            #
            #    if (dialogModify)
            #    {
            #        dlg = dialogModify.parmDialog();
            #        if (dlg && dlg.formRun())
            #        {
            #            formRun = dlg.formRun();
            #
            #            formRun.initDataFromClass();
            #            formRun.validateVarName();
            #            formRun.resetFieldsListViewChecked();
            #            formRun.reBuildSourcePreview();
            #        }
            #    }
            #}
          ENDSOURCE
          SOURCE #initFromArgs
            #boolean initFromArgs(Args _args)
            #{
            #    SysContextMenu      sysContextMenu;
            #    TreeNode            tableNode;
            #    TableId             tableId;
            #    Object              editor;
            #
            #    LastAOTSelection    lastAOTSelection;
            #    ;
            #    if (_args)
            #    {
            #// > georg, 11.03.2008, Get the table from parameters,  -->
            #        if(_args.record()){
            #            tableId = _args.record().TableId;
            #            if (tableId)
            #            {
            #                selectedTableNode = SysDictTable::newTableId(tableId).treeNode();
            #                RecordBuffer=_args.record();
            #                return true;
            #            }
            #
            #            return false;
            #        }
            #// < georg, 11.03.2008, Get the table from parameters,  <--
            #
            #        if (SysContextMenu::startedFrom(_args))
            #        {
            #            //Called from SysContextMenu
            #            sysContextMenu = _args.parmObject();
            #            tableNode = sysContextMenu.first();
            #            if (tableNode.sysNodeType() == #NT_DBTABLE)
            #            {
            #                selectedTableNode = tableNode;
            #                return true;
            #            }
            #        }
            #        else
            #        {
            #            //called from the Editor
            #            editor = _args.parmObject();
            #            if (editor && editor.handle() == classNum(Editor))
            #            {
            #                tableNode = this.initFromEditor(editor);
            #                if (tableNode && tableNode.sysNodeType() == #NT_DBTABLE)
            #                {
            #                    selectedTableNode = tableNode;
            #                    return true;
            #                }
            #            }
            #            else
            #            {
            #                //Called from ToolBar (Tabax) or SystemMenu (LastAOTSelection)
            #                lastAOTSelection = new LastAOTSelection();
            #                tableNode = lastAOTSelection.first();
            #                if (tableNode && tableNode.sysNodeType() == #NT_DBTABLE)
            #                {
            #                    selectedTableNode = tableNode;
            #                    return true;
            #                }
            #            }
            #        }
            #    }
            #
            #    //No table selected --> Pick a table
            #    tableId = pickTable();
            #    if (tableId)
            #    {
            #        selectedTableNode = SysDictTable::newTableId(tableId).treeNode();
            #        return true;
            #    }
            #
            #    return false;
            #}
          ENDSOURCE
          SOURCE #initFromEditor
            #TreeNode initFromEditor(Editor e)
            #{
            #    str selectedLine;
            #
            #    str getSelectedLine()
            #    {
            #        Char        curSymbol;
            #        Column      iCopyFrom;
            #        Column      iCopyTo;
            #        ;
            #        if (selectedLine)
            #            return selectedLine;
            #
            #        if (e.markMode() != MarkMode::NoMark && e.selectionStartCol() != e.selectionEndCol())
            #        {
            #            selectedLine = strLRTrim(subStr(e.currentLine(), e.selectionStartCol(), e.selectionEndCol() - e.selectionStartCol()));
            #        }
            #        else
            #        {
            #            selectedLine = e.currentLine();
            #            for (iCopyFrom = e.columnNo()+1; iCopyFrom >= 0; iCopyFrom--)
            #            {
            #                curSymbol = subStr(selectedLine, iCopyFrom, 1);
            #                if (!strAlpha(curSymbol))
            #                    break;
            #            }
            #            for (iCopyTo = e.columnNo()+1; iCopyTo <= strLen(selectedLine); iCopyTo++)
            #            {
            #                curSymbol = subStr(selectedLine, iCopyTo, 1);
            #                if (!strAlpha(curSymbol))
            #                    break;
            #            }
            #            selectedLine = (iCopyFrom < iCopyTo) ? subStr(selectedLine, iCopyFrom + 1, iCopyTo - iCopyFrom - 1) : '';
            #        }
            #        return selectedLine;
            #    }
            #
            #    selectedLine = getSelectedLine();
            #    if (selectedLine && tableName2Id(selectedLine))
            #        return TreeNode::findNode(#TablesPath + #AOTRootPath + selectedLine);
            #
            #    return null;
            #}
          ENDSOURCE
          SOURCE #initParmDefault
            #public void initParmDefault()
            #{
            #    super();
            #
            #    if (selectedTableNode)
            #    {
            #        tableVariableName       = selectedTableNode.treeNodeName();
            #        tableName               = selectedTableNode.treeNodeName();
            #
            #        insertDeclaration       = NoYes::No;
            #        insertClearMethod       = NoYes::Yes;
            #        NoneInsertUpdateMethod  = 1;
            #        fieldListSet            = new Set(Types::Integer);
            #    }
            #}
          ENDSOURCE
          SOURCE #pack
            #public container pack()
            #{
            #    return [#CurrentVersion, #FormControlList] + [fieldListSet.pack()];
            #}
          ENDSOURCE
          SOURCE #parmFieldListSet
            #container parmFieldListSet(container _fieldListSetPacked = fieldListSet.pack())
            #{
            #    ;
            #    fieldListSet = Set::create(_fieldListSetPacked);
            #
            #    return fieldListSet.pack();
            #}
          ENDSOURCE
          SOURCE #parmFormControlValues
            #container parmFormControlValues(container _values  = [#FormControlList])
            #{
            #    ;
            #    [#FormControlList] = _values;
            #
            #    return [#FormControlList];
            #}
          ENDSOURCE
          SOURCE #parmUseRecordBuffer
            #boolean parmUseRecordBuffer(boolean _useRecordBuffer  = useRecordBuffer)
            #{
            #    ;
            #    useRecordBuffer = _useRecordBuffer;
            #
            #    return useRecordBuffer;
            #}
          ENDSOURCE
          SOURCE #processTable
            #boolean processTable(TreeNode  _tableNode)
            #{
            #    ;
            #    if (_tableNode)
            #    {
            #        selectedTableNode       = _tableNode;
            #
            #        if (tableName != _tableNode.treeNodeName())
            #        {
            #            tableVariableName   = _tableNode.treeNodeName();
            #            fieldListSet        = new Set(Types::Integer);
            #        }
            #        if (!fieldListSet)
            #            fieldListSet        = new Set(Types::Integer);
            #
            #        tableName               = _tableNode.treeNodeName();
            #        return true;
            #    }
            #    return false;
            #}
          ENDSOURCE
          SOURCE #RecordBuffer
            #common RecordBuffer(){
            # return RecordBuffer;
            # }
          ENDSOURCE
          SOURCE #run
            ##define.defaultIndentLevel(4)
            #void run()
            #{
            #    SysDictTable    dictTable;
            #    Counter         fieldIdCounter;
            #    SysDictField    dictField;
            #    SetIterator     setIterator = new SetIterator(fieldListSet);
            #
            #    SourceLine      varName = tableVariableName ? tableVariableName : dictTable.name();
            #    SourceLine      sourceLine;
            #    Integer         maxFieldNameLength;
            #    int             i;
            #    str             vP;
            #
            #    SourceLine      indent() { return strRep(" ", #defaultIndentLevel); }
            #    Integer         maxFieldNameIndent() { return (maxFieldNameLength div #defaultIndentLevel + 1) * #defaultIndentLevel; }
            #    SourceLine      neededIndentLevel(FieldName _fieldName) { return strRep(" ", maxFieldNameIndent() - strLen(_fieldName)); }
            #    ;
            #    if (!selectedTableNode)
            #        throw error("An unexpected error occured. A table treenode was not selected");
            #
            #    dictTable = SysDictTable::newTreeNode(selectedTableNode);
            #    if (!dictTable)
            #        throw error(strFmt("An unexpected error occured. Table '%1' not recognized", selectedTableNode.treeNodeName()));
            #
            #    setIterator.begin();
            #    while (setIterator.more())
            #    {
            #        dictField = dictTable.fieldObject(setIterator.value());
            #        if (maxFieldNameLength < strLen(dictField.name()))
            #            maxFieldNameLength = strLen(dictField.name());
            #
            #        setIterator.next();
            #    }
            #
            #    textBuffer = new TextBuffer(); //toClipboard works only on client side
            #
            #    if (insertDeclaration)
            #    {
            #        sourceLine = strFmt("%2%1%2%3;\r\n%2;\r\n", dictTable.name(), indent(), varName);
            #        textBuffer.appendText(sourceLine);
            #    }
            #
            #    if (insertClearMethod)
            #    {
            #        sourceLine = strFmt("%1%2.clear();\r\n", indent(), varName);
            #        textBuffer.appendText(sourceLine);
            #    }
            #
            #    //Copying fields
            #    setIterator.begin();
            #    while (setIterator.more())
            #    {
            #        dictField = dictTable.fieldObject(setIterator.value());
            #
            #// > georg, 11.03.2008, Get the table from parameters,  -->
            #        if(RecordBuffer&&useRecordBuffer){
            #            if(dictField.arraySize()>1){
            #            VP='';
            #            for(i=1;i<=dictField.arraySize();i++)
            #             VP+=strfmt('%1%2',RecordBuffer.(fieldId2Ext(dictField.id(), i)),i<dictField.arraySize()?',':'');
            #            VP='{'+VP+'}';
            #            } else
            #            VP=RecordBuffer.(dictField.id());
            #            sourceLine = strFmt("%1%2.%3%4=%4%6%5%6 // %7\r\n", indent(), varName, dictField.name(), neededIndentLevel(dictField.name()),
            #                                   VP,
            #                                   ((dictField.baseType()==Types::String) ||
            #                                    (dictField.baseType()==Types::RString) ||
            #                                    (dictField.baseType()==Types::VarString))?'"':'',dictField.label());
            #                                    }
            #        else
            #// < georg, 11.03.2008, Get the table from parameters,  <--
            #            sourceLine = strFmt("%1%2.%3%4= //%5 \r\n", indent(), varName, dictField.name(), neededIndentLevel(dictField.name()),dictField.label());
            #
            #        textBuffer.appendText(sourceLine);
            #        setIterator.next();
            #    }
            #
            #    switch (NoneInsertUpdateMethod)
            #    {
            #        case 1:
            #            sourceLine = strFmt("%1%2.insert();\r\n", indent(), varName);
            #            textBuffer.appendText(sourceLine);
            #            break;
            #        case 2:
            #            sourceLine = strFmt("%1%2.update();\r\n", indent(), varName);
            #            textBuffer.appendText(sourceLine);
            #            break;
            #    }
            #
            #    textBuffer.toClipboard();
            #}
          ENDSOURCE
          SOURCE #showDefaultButton
            #public boolean showDefaultButton()
            #{
            #    return true;
            #}
          ENDSOURCE
          SOURCE #unpack
            #public boolean unpack(container packedClass)
            #{
            #    version     version = runbase::getVersion(packedClass);
            #    container   fieldListSetPacked;
            #
            #    switch (version)
            #    {
            #        case #CurrentVersion:
            #            [version, #FormControlList, fieldListSetPacked] = packedClass;
            #            fieldListSet = Set::create(fieldListSetPacked);
            #            break;
            #        default:
            #            return false;
            #    }
            #
            #    return true;
            #}
          ENDSOURCE
          SOURCE #main
            #static void main(Args _args)
            #{
            #    MF_CopyFieldsToClipboard engine;
            #    ;
            #    engine = new MF_CopyFieldsToClipboard();
            #
            #    startLengthyOperation();
            #    if (engine.initFromArgs(_args) && engine.prompt())
            #        engine.run();
            #
            #    endLengthyOperation();
            #}
          ENDSOURCE
        ENDMETHODS
      ENDCLASS

    ***Element: CLS

    ; Microsoft Dynamics AX Class: MF_EditorFormat 未加载
    ; --------------------------------------------------------------------------------
      CLSVERSION 1
      CLASS #MF_EditorFormat
        Id 50011
        PROPERTIES
          Name                #MF_EditorFormat
          Extends             #
          RunOn               #Called from
        ENDPROPERTIES
        METHODS
          Version: 3
          SOURCE #classDeclaration
            #class MF_EditorFormat
            #{
            #}
          ENDSOURCE
          SOURCE #InstallGuide
            #void InstallGuide()
            #{
            #/*  //Add Follow Method to EditScript Class
            #    void FormatToColumnLayout(Editor e)
            #    {
            #        ;
            #        MF_EditorFormat::FormatToColumnLayout(e);
            #    }
            #
            #*/
            #}
          ENDSOURCE
          SOURCE #ensureSingleSpaces
            #private static void EnsureSingleSpaces(Editor e, int startLine = e.selectionStartLine(), int endLine = e.selectionEndLine())
            #{
            #    #xppTexts
            #    int i, col;
            #    int delChars = 0;
            #    str line;
            #    str tmp;
            #    int leadingCharIdx = -1;
            #    ;
            #
            #    // ensure only single character spacing
            #    for (i = startLine; i <= endLine; i++)
            #    {
            #        e.gotoLine(i);
            #        e.gotoCol(1);
            #        line = e.currentLine();
            #        leadingCharIdx = -1;
            #        delChars = 0;
            #
            #        // Skip leading white space
            #        for (col = 0; col <= strlen(line); col++)
            #        {
            #            if (leadingCharIdx == -1 && substr(line, col, 1) != ' ')
            #            {
            #                leadingCharIdx = col;
            #                continue;
            #            }
            #
            #            // not found first word yet
            #            if (leadingCharIdx == -1) continue;
            #
            #            // end of line, so finish
            #            if (substr(line, col, 1) == #semicolon) break;
            #
            #            // if we have found a double space
            #            tmp = substr(line, col, 2);
            #            if (tmp == '  ')
            #            {
            #                e.gotoCol(col-delChars);
            #                e.deleteChars(1);
            #                delChars++;
            #                //col--;
            #            }
            #        }
            #    }
            #}
            #
          ENDSOURCE
          SOURCE #FormatToColumnLayout
            #static void FormatToColumnLayout(Editor e)
            #{
            #    List           lineInfoList;
            #    ListIterator   iterator;
            #    MF_EditorLineInfo currLineInfo;
            #    int            startLine = e.selectionStartLine();
            #    int            endLine = e.selectionEndLine();
            #    int            i;
            #    int            lineNumber = startLine;
            #    int            maxVarDeclFirstCharIdx;
            #    str            blankstr;
            #    ;
            #
            #    MF_EditorFormat::EnsureSingleSpaces(e, startLine, endLine);
            #    lineInfoList = MF_EditorFormat::RecordLineInfo(e, startLine, endLine);
            #    iterator = new ListIterator(lineInfoList);
            #    maxVarDeclFirstCharIdx = MF_EditorLineInfo::MaxVarDeclFirstCharIdx(lineInfoList);
            #
            #    e.unmark();
            #
            #    while (iterator.more())
            #    {
            #        blankstr = '';
            #        currLineInfo = iterator.value();
            #        if (currLineInfo != null)
            #        {
            #            e.gotoLine(lineNumber);
            #            if (currLineInfo.parmVarDeclFirstCharIdx() < maxVarDeclFirstCharIdx)
            #            {
            #                e.gotoCol(currLineInfo.parmVarDeclFirstCharIdx());
            #                for(i=0; i < maxVarDeclFirstCharIdx - currLineInfo.parmVarDeclFirstCharIdx(); i++ )
            #                {
            #                    blankstr += ' ';
            #                }
            #                e.insertString(blankstr);
            #            }
            #        }
            #        iterator.next();
            #        lineNumber++;
            #    }
            #}
          ENDSOURCE
          SOURCE #recordLineInfo
            #private static List RecordLineInfo(Editor e, int startLine = e.selectionStartLine(), int endLine = e.selectionEndLine())
            #{
            #    #xppTexts
            #    List lineInfoList = new List(Types::Class);
            #    MF_EditorLineInfo currLineInfo;
            #    int i, col;
            #    str line;
            #    int numWords = 0;
            #    str prevChar = ' ';
            #    str currChar;
            #    ;
            #
            #    for (i = startLine; i <= endLine; i++)
            #    {
            #        currLineInfo = null;
            #        e.gotoLine(i);
            #        e.gotoCol(1);
            #        line = e.currentLine();
            #        numWords = 0;
            #        prevChar = ' ';
            #
            #        // Skip leading white space
            #        for (col = 0; col <= strlen(line); col++)
            #        {
            #            if (col > 1)
            #            {
            #                prevChar = substr(line, col-1, 1);
            #            }
            #            currChar = substr(line, col, 1);
            #            // previous char was blank and this char is non-blank:
            #            if (prevChar == ' ' && currChar != ' ')
            #            {
            #                numWords++;
            #                if (numWords == 2)
            #                {
            #                    currLineInfo = MF_EditorLineInfo::construct(col);
            #                }
            #            }
            #
            #            // end of line, so finish
            #            if (substr(line, col, 1) == #semicolon)
            #            {
            #                break;
            #            }
            #        }
            #
            #        lineInfoList.addEnd(currLineInfo);
            #    }
            #    return lineInfoList;
            #}
            #
          ENDSOURCE
        ENDMETHODS
      ENDCLASS

    ***Element: CLS

    ; Microsoft Dynamics AX Class: MF_EditorLineInfo 未加载
    ; --------------------------------------------------------------------------------
      CLSVERSION 1
      CLASS #MF_EditorLineInfo
        Id 50012
        PROPERTIES
          Name                #MF_EditorLineInfo
          Extends             #
          RunOn               #Called from
        ENDPROPERTIES
        METHODS
          Version: 3
          SOURCE #classDeclaration
            #class MF_EditorLineInfo
            #{
            #    int varDeclFirstCharIdx;
            #}
          ENDSOURCE
          SOURCE #new
            #void new()
            #{
            #    varDeclFirstCharIdx = -1;
            #}
          ENDSOURCE
          SOURCE #parmVarDeclFirstCharIdx
            #int parmVarDeclFirstCharIdx(int _varDeclFirstCharIdx = varDeclFirstCharIdx)
            #{
            #    ;
            #    varDeclFirstCharIdx = _varDeclFirstCharIdx;
            #    return varDeclFirstCharIdx;
            #}
          ENDSOURCE
          SOURCE #construct
            #public static MF_EditorLineInfo construct(int _varDeclFirstCharIdx)
            #{
            #    MF_EditorLineInfo editorLineInfo = new MF_EditorLineInfo();
            #    ;
            #    editorLineInfo.parmVarDeclFirstCharIdx(_varDeclFirstCharIdx);
            #    return editorLineInfo;
            #}
          ENDSOURCE
          SOURCE #MaxVarDeclFirstCharIdx
            #static int MaxVarDeclFirstCharIdx(List lineInfoList)
            #{
            #    ListIterator iter = new ListIterator(lineInfoList);
            #    MF_EditorLineInfo currLineInfo;
            #    int maxIdx = 0;
            #    ;
            #
            #    while (iter.more())
            #    {
            #        currLineInfo = iter.value();
            #        if (currLineInfo != null && currLineInfo.parmVarDeclFirstCharIdx() > maxIdx)
            #        {
            #            maxIdx = currLineInfo.parmVarDeclFirstCharIdx();
            #        }
            #        iter.next();
            #    }
            #
            #    return maxIdx;
            #}
          ENDSOURCE
        ENDMETHODS
      ENDCLASS

    ***Element: CLS

    ; Microsoft Dynamics AX Class: MF_FieldInfo 未加载
    ; --------------------------------------------------------------------------------
      CLSVERSION 1
      CLASS #MF_FieldInfo
        Id 50013
        PROPERTIES
          Name                #MF_FieldInfo
          Extends             #
          RunOn               #Called from
        ENDPROPERTIES
        METHODS
          Version: 3
          SOURCE #classDeclaration
            #class MF_FieldInfo
            #{
            #    str fieldName;
            #    str formFieldName;
            #    str formDataSourceName;
            #    str tableName;
            #    str formName;
            #    str methodName;
            #}
          ENDSOURCE
          SOURCE #getFieldName
            #str getFieldName()
            #{
            #    return fieldName;
            #}
          ENDSOURCE
          SOURCE #getFormDataSourceName
            #str getFormDataSourceName()
            #{
            #    return formDataSourceName;
            #}
          ENDSOURCE
          SOURCE #getFormFieldName
            #str getFormFieldName()
            #{
            #    return formFieldName;
            #}
          ENDSOURCE
          SOURCE #getFormName
            #str getFormName()
            #{
            #    return formName;
            #}
          ENDSOURCE
          SOURCE #getMethodName
            #str getMethodName()
            #{
            #    return methodName;
            #}
          ENDSOURCE
          SOURCE #getTableName
            #str getTableName()
            #{
            #    return tableName;
            #}
          ENDSOURCE
          SOURCE #new
            #void new(str _formName, str _formFieldName, str _formDataSourceName, str _tableName, str _fieldName, str _methodName)
            #{
            #    ;
            #    formName            = _formName;
            #    formFieldName       = _formFieldName;
            #    formDataSourceName  = _formDataSourceName;
            #    tableName           = _tableName;
            #    fieldName           = _fieldName;
            #    methodName          = _methodName;
            #}
          ENDSOURCE
          SOURCE #run
            #void run()
            #{
            #    MenuFunction            form;
            #    args                    args = new args();
            #    ;
            #
            #    args.caller(this);
            #    form = new MenuFunction(menuItemDisplayStr(MF_showField),MenuItemType::Display);
            #    form.run(args);
            #
            #}
          ENDSOURCE
        ENDMETHODS
      ENDCLASS

    ***Element: CLS

    ; Microsoft Dynamics AX Class: MF_CreateNewProject 未加载
    ; --------------------------------------------------------------------------------
      CLSVERSION 1
      CLASS #MF_CreateNewProject
        Id 50010
        PROPERTIES
          Name                #MF_CreateNewProject
          Extends             #RunBase
          RunOn               #Called from
        ENDPROPERTIES
        METHODS
          Version: 3
          SOURCE #classDeclaration
            #/*
            #    <DEV_CreateNewProject_IKash date=2010-05-04 txt='Create a new Project or Update an existing one'>
            #    <Version>2.0.1</Version>
            #    Please feel free to contact me regarding the use of this project or to report a bug
            #    <Contacts>Name='Ivan Kashperuk' Email='ivan.kashperuk@gmail.com'</Contacts>
            #*/
            ##AOT
            #class MF_CreateNewProject extends RunBase
            #{
            #    ProjectSharedPrivate    projectType;
            #    TreeNodeName            projectPrefix;
            #    TreeNodeName            projectName;
            #    container               selectedProjectNodes;
            #    NoYes                   usePrefix;
            #    TreeNodeName            projectPrefixValue;
            #    NoYes                   warnAboutNameDuplicates;
            #    NoYes                   updateExistingProject;
            #    Map                     objectTypeName;
            #    container               currentListOld;
            #
            #    #define.ParamsCount(23)     // The number of project nodes
            #    #define.CurrentVersion(21)
            #
            #    #localmacro.CurrentList
            #        projectType,
            #        projectPrefix,
            #        projectName,
            #        selectedProjectNodes,
            #        usePrefix,
            #        warnAboutNameDuplicates,
            #        updateExistingProject
            #    #endmacro
            #}
          ENDSOURCE
          SOURCE #convertProjectPrefix
            ##define.datePrefix("%d")
            ##define.userPrefix("%u")
            #public TreeNodeName convertProjectPrefix(TreeNodeName _projectPrefix)
            #{
            #    TreeNodeName    projectPrefixNew;
            #    ;
            #    projectPrefixNew = strReplace(_projectPrefix, #datePrefix, date2str(SystemDateGet(), 123, 2, 0, 2, 0, 4));
            #    projectPrefixNew = strReplace(projectPrefixNew, #userPrefix, curUserId());
            #
            #    return projectPrefixNew;
            #}
          ENDSOURCE
          SOURCE #dialog
            #public Object dialog()
            #{
            #    DialogRunbase       dialog = Dialog::newFormNameRunbase(formstr(MF_CreateNewProjectDlg), this);
            #    TreeNode            treeNode;
            #    LastAOTSelection    lastAOTSelection;
            #    ;
            #    dialog = super(dialog);
            #
            #    warnAboutNameDuplicates = NoYes::Yes;
            #    updateExistingProject = NoYes::No;
            #    if (winAPI::isControlButtonDown())
            #    {
            #        lastAOTSelection = new LastAOTSelection();
            #        treeNode = lastAOTSelection.first();
            #        if (treeNode && SysTreeNode::isProject(treeNode))
            #        {
            #            if (this.initFromAOTProject(treeNode))
            #            {
            #                warnAboutNameDuplicates = NoYes::No;
            #                updateExistingProject = NoYes::Yes;
            #            }
            #            else
            #                selectedProjectNodes = conNull();
            #        }
            #    }
            #
            #    if (!selectedProjectNodes || conLen(selectedProjectNodes) != #ParamsCount)
            #        this.initParmDefault();
            #
            #    return dialog;
            #}
          ENDSOURCE
          SOURCE #initFromAOTProject
            #NoYes initFromAOTProject(TreeNode _project)
            #{
            #    ProjectNode     project = _project;
            #    TreeNodeName    projectPrefixNew;
            #    ProjectNode     dataDictNode;
            #    ProjectNode     menuItemNode;
            #    int             totalMenuItems;
            #    int             totalMore;
            #    ;
            #    if (!project)
            #        return checkFailed(@"The selected project could not be initialized. Default settings used");
            #
            #    projectType = project.applObjectType() == UtilElementType::SharedProject ? ProjectSharedPrivate::ProjShared : ProjectSharedPrivate::ProjPrivate;
            #    projectPrefixNew = this.convertProjectPrefix(projectPrefix);
            #    if (projectPrefixNew && subStr(project.treeNodeName(), 1, strLen(projectPrefixNew)) == projectPrefixNew)
            #    {
            #        usePrefix = NoYes::Yes;
            #        projectName = strDel(project.treeNodeName(), 1, strLen(projectPrefixNew));
            #    }
            #    else
            #    {
            #        usePrefix = NoYes::No;
            #        projectName = project.treeNodeName();
            #    }
            #
            #    selectedProjectNodes = conNull();
            #    project = project.loadForInspection();
            #    dataDictNode = project.AOTfindChild(TreeNode::findNode(#DataDictionaryPath).treeNodeName());
            #    if (dataDictNode)
            #    {
            #        selectedProjectNodes += UnknownNoYes::Unknown; //Data Dictionary
            #        selectedProjectNodes += dataDictNode.AOTfindChild(TreeNode::findNode(#TablesPath).treeNodeName())               ? UnknownNoYes::Yes :  UnknownNoYes::No;
            #        selectedProjectNodes += dataDictNode.AOTfindChild(TreeNode::findNode(#TableMapsPath).treeNodeName())            ? UnknownNoYes::Yes :  UnknownNoYes::No;
            #        selectedProjectNodes += dataDictNode.AOTfindChild(TreeNode::findNode(#ViewsPath).treeNodeName())                ? UnknownNoYes::Yes :  UnknownNoYes::No;
            #        selectedProjectNodes += dataDictNode.AOTfindChild(TreeNode::findNode(#ExtendedDataTypesPath).treeNodeName())    ? UnknownNoYes::Yes :  UnknownNoYes::No;
            #        selectedProjectNodes += dataDictNode.AOTfindChild(TreeNode::findNode(#BaseEnumsPath).treeNodeName())            ? UnknownNoYes::Yes :  UnknownNoYes::No;
            #
            #        selectedProjectNodes += UnknownNoYes::Unknown; //More...
            #        #ifnot.ReferencesPath //AX3
            #            selectedProjectNodes += dataDictNode.AOTfindChild(TreeNode::findNode(#FeatureKeysPath).treeNodeName())      ? UnknownNoYes::Yes :  UnknownNoYes::No;
            #            totalMore += conPeek(selectedProjectNodes, conLen(selectedProjectNodes));
            #        #endif
            #        selectedProjectNodes += dataDictNode.AOTfindChild(TreeNode::findNode(#LicenseCodesPath).treeNodeName())         ? UnknownNoYes::Yes :  UnknownNoYes::No;
            #        totalMore += conPeek(selectedProjectNodes, conLen(selectedProjectNodes));
            #        selectedProjectNodes += dataDictNode.AOTfindChild(TreeNode::findNode(#ConfigurationKeysPath).treeNodeName())    ? UnknownNoYes::Yes :  UnknownNoYes::No;
            #        totalMore += conPeek(selectedProjectNodes, conLen(selectedProjectNodes));
            #        selectedProjectNodes += dataDictNode.AOTfindChild(TreeNode::findNode(#SecurityKeysPath).treeNodeName())         ? UnknownNoYes::Yes :  UnknownNoYes::No;
            #        totalMore += conPeek(selectedProjectNodes, conLen(selectedProjectNodes));
            #        selectedProjectNodes += dataDictNode.AOTfindChild(TreeNode::findNode(#TableCollectionsPath).treeNodeName())     ? UnknownNoYes::Yes :  UnknownNoYes::No;
            #        totalMore += conPeek(selectedProjectNodes, conLen(selectedProjectNodes));
            #        #if.ReferencesPath //AX4
            #            selectedProjectNodes += dataDictNode.AOTfindChild(TreeNode::findNode(#PerspectivesPath).treeNodeName())     ? UnknownNoYes::Yes :  UnknownNoYes::No;
            #            totalMore += conPeek(selectedProjectNodes, conLen(selectedProjectNodes));
            #        #endif
            #
            #        if (totalMore == 5) //All five were NoYes::No (value = 1)
            #            selectedProjectNodes = conPoke(selectedProjectNodes, 7, UnknownNoYes::No);
            #        if (totalMore == 10) //All five were NoYes::Yes (value = 2)
            #            selectedProjectNodes = conPoke(selectedProjectNodes, 7, UnknownNoYes::Yes);
            #
            #        if (!conFind(selectedProjectNodes, UnknownNoYes::No))
            #            selectedProjectNodes = conPoke(selectedProjectNodes, 1, UnknownNoYes::Yes);
            #        if (!conFind(selectedProjectNodes, UnknownNoYes::Yes))
            #            selectedProjectNodes = conPoke(selectedProjectNodes, 1, UnknownNoYes::No);
            #    }
            #    else
            #    {
            #        selectedProjectNodes = [UnknownNoYes::No, UnknownNoYes::No, UnknownNoYes::No, UnknownNoYes::No, UnknownNoYes::No, UnknownNoYes::No,
            #                                UnknownNoYes::No, UnknownNoYes::No, UnknownNoYes::No, UnknownNoYes::No, UnknownNoYes::No, UnknownNoYes::No];
            #    }
            #    selectedProjectNodes += project.AOTfindChild(TreeNode::findNode(#MacrosPath).treeNodeName())                        ? UnknownNoYes::Yes :  UnknownNoYes::No;
            #    selectedProjectNodes += project.AOTfindChild(TreeNode::findNode(#ClassesPath).treeNodeName())                       ? UnknownNoYes::Yes :  UnknownNoYes::No;
            #    selectedProjectNodes += project.AOTfindChild(TreeNode::findNode(#FormsPath).treeNodeName())                         ? UnknownNoYes::Yes :  UnknownNoYes::No;
            #    selectedProjectNodes += project.AOTfindChild(TreeNode::findNode(#ReportsPath).treeNodeName())                       ? UnknownNoYes::Yes :  UnknownNoYes::No;
            #    selectedProjectNodes += project.AOTfindChild(TreeNode::findNode(#QueriesPath).treeNodeName())                       ? UnknownNoYes::Yes :  UnknownNoYes::No;
            #    selectedProjectNodes += project.AOTfindChild(TreeNode::findNode(#JobsPath).treeNodeName())                          ? UnknownNoYes::Yes :  UnknownNoYes::No;
            #    selectedProjectNodes += project.AOTfindChild(TreeNode::findNode(#MenusPath).treeNodeName())                         ? UnknownNoYes::Yes :  UnknownNoYes::No;
            #    menuItemNode = project.AOTfindChild(TreeNode::findNode(#MenuItemsPath).treeNodeName());
            #    if (menuItemNode)
            #    {
            #        selectedProjectNodes += UnknownNoYes::Unknown;
            #        selectedProjectNodes += menuItemNode.AOTfindChild(TreeNode::findNode(#MenuItemsDisplayPath).treeNodeName())     ? UnknownNoYes::Yes :  UnknownNoYes::No;
            #        totalMenuItems += conPeek(selectedProjectNodes, conLen(selectedProjectNodes));
            #        selectedProjectNodes += menuItemNode.AOTfindChild(TreeNode::findNode(#MenuItemsOutputPath).treeNodeName())      ? UnknownNoYes::Yes :  UnknownNoYes::No;
            #        totalMenuItems += conPeek(selectedProjectNodes, conLen(selectedProjectNodes));
            #        selectedProjectNodes += menuItemNode.AOTfindChild(TreeNode::findNode(#MenuItemsActionPath).treeNodeName())      ? UnknownNoYes::Yes :  UnknownNoYes::No;
            #        totalMenuItems += conPeek(selectedProjectNodes, conLen(selectedProjectNodes));
            #        if (totalMenuItems == 3)
            #            selectedProjectNodes = conPoke(selectedProjectNodes, 20, UnknownNoYes::No);
            #        if (totalMenuItems == 6)
            #            selectedProjectNodes = conPoke(selectedProjectNodes, 20, UnknownNoYes::Yes);
            #    }
            #    else
            #    {
            #        selectedProjectNodes = conIns(selectedProjectNodes, 20, UnknownNoYes::No, UnknownNoYes::No, UnknownNoYes::No, UnknownNoYes::No);
            #    }
            #
            #    return NoYes::Yes;
            #}
          ENDSOURCE
          SOURCE #initParmDefault
            #public void initParmDefault()
            #{
            #    ;
            #    super();
            #
            #    projectType             = ProjectSharedPrivate::ProjShared;
            #    projectPrefix           = '';
            #    projectName             = SysTreeNode::getSharedProject().newObjectName();
            #    selectedProjectNodes    = [
            #                                UnknownNoYes::Unknown,  //01 - Data Dictionary
            #                                UnknownNoYes::Yes,      //02 - Tables
            #                                UnknownNoYes::No,       //03 - Table Maps
            #                                UnknownNoYes::No,       //04 - Views
            #                                UnknownNoYes::Yes,      //05 - Extended Data Types
            #                                UnknownNoYes::Yes,      //06 - Base Enums
            #                                UnknownNoYes::No,       //07 - More...
            #                                #ifnot.ReferencesPath   //AX3
            #                                UnknownNoYes::No,       //08 - Feature Keys
            #                                #endIf
            #                                UnknownNoYes::No,       //09/08 - License Codes
            #                                UnknownNoYes::No,       //10/09 - Configuration Keys
            #                                UnknownNoYes::No,       //11/10 - Security Keys
            #                                UnknownNoYes::No,       //12/11 - Table Collections
            #                                #if.ReferencesPath
            #                                UnknownNoYes::No,       //12 - Perspectives
            #                                #endIf
            #                                UnknownNoYes::No,       //13 - Macros
            #                                UnknownNoYes::Yes,      //14 - Classes
            #                                UnknownNoYes::Yes,      //15 - Forms
            #                                UnknownNoYes::No,       //16 - Reports
            #                                UnknownNoYes::No,       //17 - Queries
            #                                UnknownNoYes::No,       //18 - Jobs
            #                                UnknownNoYes::Yes,      //19 - Menus
            #                                UnknownNoYes::Yes,      //20 - Menu Items
            #                                UnknownNoYes::Yes,      //21 - Display
            #                                UnknownNoYes::Yes,      //22 - Output
            #                                UnknownNoYes::Yes       //23 - Action,
            #                              ];
            #
            #    usePrefix                 = NoYes::No;
            #    warnAboutNameDuplicates   = NoYes::Yes;
            #    updateExistingProject     = NoYes::No;
            #}
          ENDSOURCE
          SOURCE #pack
            #public container pack()
            #{
            #    if (updateExistingProject)
            #        return currentListOld;
            #    return [#CurrentVersion, #CurrentList];
            #}
          ENDSOURCE
          SOURCE #parmFormControlValues
            #container parmFormControlValues(container _values  = [#CurrentList])
            #{
            #    ;
            #    [#CurrentList] = _values;
            #
            #    projectPrefixValue = this.convertProjectPrefix(projectPrefix);
            #
            #    return [#CurrentList];
            #}
          ENDSOURCE
          SOURCE #run
            #public void run()
            #{
            #    ProjectNode         projNode;
            #    TreeNode            projNodeRoot;
            #    ProjectGroupNode    dataDictNode;
            #    ProjectGroupNode    MenuItemsNode;
            #    container           conObjects;
            #    int                 nIndex;
            #
            #    //Method creates a new Shared/Private project
            #    TreeNode createNewSharedPrivateProject()
            #    {
            #        ProjectNode      upgradeNode;
            #        TreeNode         treeNodeProject;
            #        str              projName;
            #        ;
            #
            #        if (projectType == ProjectSharedPrivate::ProjPrivate)
            #            treeNodeProject = SysTreeNode::getPrivateProject();
            #        else
            #            treeNodeProject = SysTreeNode::getSharedProject();
            #
            #        if (projectName)
            #            projName  = usePrefix ? projectPrefixValue + projectName : projectName;
            #        else
            #        {
            #            projName = treeNodeProject.newObjectName();
            #            warning(strFmt(@"The project was created with a default name: %1", projName));
            #        }
            #
            #        if (!treeNodeProject.AOTfindChild(projName))
            #            treeNodeProject.AOTadd(projName);
            #
            #        upgradeNode = treeNodeProject.AOTfindChild(projName);
            #
            #        return upgradeNode.getRunNode();
            #    }
            #    //Methods creates sub groups in the Project Node
            #    ProjectGroupNode createGroup(int _nIndex, str _nodeName, ProjectGroupNode parent)
            #    {
            #        TreeNodeName     projNodeName = SysTreeNode::pathName(_nodeName);
            #        ProjectGroupNode child;
            #        GroupNodeType    groupNodeType;
            #        boolean          isGroupNode = false;
            #        ;
            #        #if.ReportLibrariesPath
            #        projNodeName = strRem(projNodeName, ' ');
            #        #endif
            #        if (parent)
            #            child = parent.aotFindChild(projNodeName);
            #        if (parent && !child)
            #        {
            #            //Create only selected project nodes
            #            if (conPeek(selectedProjectNodes, _nIndex) == UnknownNoYes::No)
            #                return child;
            #
            #            if (classIdGet(parent) != classNum(ProjectNode))
            #            {
            #                groupNodeType = parent.projectGroupType();
            #                parent.projectGroupType(GroupNodeType::All);
            #                isGroupNode = true;
            #            }
            #
            #            parent.aotAdd(projNodeName);
            #            child = parent.aotFindChild(projNodeName);
            #
            #            if (isGroupNode)
            #                parent.projectGroupType(groupNodeType);
            #        }
            #        if (child)
            #        {
            #            child.projectGroupType(SysTreeNode::path2ProjectGroupNodeType(_nodeName));
            #
            #            if (objectTypeName && objectTypeName.exists(_nIndex))
            #            {
            #                conObjects = objectTypeName.lookup(_nIndex);
            #                for (nIndex = 1; nIndex <= conLen(conObjects); nIndex += 2)
            #                {
            #                    if (!child.findGroupMember(conPeek(conObjects, nIndex), conPeek(conObjects, nIndex + 1), NoYes::No))
            #                        child.addUtilNode(conPeek(conObjects, nIndex + 1), conPeek(conObjects, nIndex));
            #                }
            #            }
            #        }
            #        return child;
            #    }
            #    ;
            #
            #    projNode      = createNewSharedPrivateProject();
            #    projNode.lockUpdate();
            #    projNodeRoot = projNode;
            #
            #    menuItemsNode = createGroup(20, #MenuItemsPath,         projNodeRoot);
            #                    createGroup(23, #MenuItemsActionPath,   menuItemsNode);
            #                    createGroup(22, #MenuItemsOutputPath,   menuItemsNode);
            #                    createGroup(21, #MenuItemsDisplayPath,  menuItemsNode);
            #                    createGroup(19, #MenusPath,             projNodeRoot);
            #                    createGroup(18, #JobsPath,              projNodeRoot);
            #                    createGroup(17, #QueriesPath,           projNodeRoot);
            #                    createGroup(16, #ReportsPath,           projNodeRoot);
            #                    createGroup(15, #FormsPath,             projNodeRoot);
            #                    createGroup(14, #ClassesPath,           projNodeRoot);
            #                    createGroup(13, #MacrosPath,            projNodeRoot);
            #    dataDictNode  = createGroup(01, #DataDictionaryPath,    projNodeRoot);
            #
            #                    #if.ReferencesPath      //AX4
            #                    createGroup(12, #PerspectivesPath,      dataDictNode);
            #                    createGroup(11, #TableCollectionsPath,  dataDictNode);
            #                    createGroup(10, #SecurityKeysPath,      dataDictNode);
            #                    createGroup(09, #ConfigurationKeysPath, dataDictNode);
            #                    createGroup(08, #LicenseCodesPath,      dataDictNode);
            #                    #endIf
            #                    #ifnot.ReferencesPath   //AX3
            #                    createGroup(12, #TableCollectionsPath,  dataDictNode);
            #                    createGroup(11, #SecurityKeysPath,      dataDictNode);
            #                    createGroup(10, #ConfigurationKeysPath, dataDictNode);
            #                    createGroup(09, #LicenseCodesPath,      dataDictNode);
            #                    createGroup(08, #FeatureKeysPath,       dataDictNode);
            #                    #endIf
            #
            #                    createGroup(06, #BaseEnumsPath,         dataDictNode);
            #                    createGroup(05, #ExtendedDataTypesPath, dataDictNode);
            #                    createGroup(04, #ViewsPath,             dataDictNode);
            #                    createGroup(03, #TableMapsPath,         dataDictNode);
            #                    createGroup(02, #TablesPath,            dataDictNode);
            #
            #    projNode.AOTsave();
            #    projNode.unlockUpdate();
            #}
          ENDSOURCE
          SOURCE #setObjectTypeName
            #void setObjectTypeName(container _packedMap)
            #{
            #    ;
            #    objectTypeName = Map::create(_packedMap);
            #}
          ENDSOURCE
          SOURCE #unpack
            #public boolean unpack(container packedClass)
            #{
            #    Version version = runbase::getVersion(packedClass);
            #
            #    switch (version)
            #    {
            #        case #CurrentVersion:
            #            [version, #CurrentList] = packedClass;
            #            currentListOld = packedClass;
            #            break;
            #        default:
            #            return false;
            #    }
            #
            #    return true;
            #}
          ENDSOURCE
          SOURCE #validate
            #public boolean validate(Object calledFrom)
            #{
            #    boolean         ret;
            #    int             lenMax = new SysDictType(extendedTypeNum(TreeNodeName)).stringLen();
            #    TreeNodeName    projName;
            #    ;
            #
            #    ret = super(calledFrom);
            #
            #    if (ret && projectName)
            #    {
            #        projName = usePrefix ? projectPrefixValue + projectName : projectName;
            #
            #        if (strLen(projName) > lenMax)
            #            return checkFailed(strFmt(@"The name of the project is too long. Maximum length, including prefix is %1", lenMax));
            #
            #        if (!TreeNode::isValidObjectName(projName))
            #            return checkFailed(strFmt(@"The name of the project (%1) contains illegal characters", projName));
            #
            #        if (warnAboutNameDuplicates &&
            #            ((projectType == ProjectSharedPrivate::ProjShared && SysTreeNode::getSharedProject().AOTfindChild(projName)) ||
            #            (projectType == ProjectSharedPrivate::ProjPrivate && SysTreeNode::getPrivateProject().AOTfindChild(projName))))
            #        {
            #            if (box::yesNo(strFmt(@"The name of the project you entered (%1) already exists.%2Do you want to update the existing project?", projName, '\n'),
            #                    DialogButton::No, @"Verify the name of the project") == DialogButton::No)
            #            {
            #                return checkFailed(@"Operation cancelled by user");
            #            }
            #        }
            #    }
            #
            #    return ret;
            #}
          ENDSOURCE
          SOURCE #construct
            #public static MF_CreateNewProject construct()
            #{
            #    return new MF_CreateNewProject();
            #}
            #
          ENDSOURCE
          SOURCE #main
            #static void main(Args _args)
            #{
            #    MF_CreateNewProject   axCreateNewProject;
            #    ;
            #    axCreateNewProject = MF_CreateNewProject::construct();
            #
            #    if (axCreateNewProject.prompt())
            #        axCreateNewProject.run();
            #}
          ENDSOURCE
        ENDMETHODS
      ENDCLASS

    ***Element: CLS

    ; Microsoft Dynamics AX Class: MF_SysSetupFormRun 未加载
    ; --------------------------------------------------------------------------------
      CLSVERSION 1
      CLASS #MF_SysSetupFormRun
        Id 50016
        PROPERTIES
          Name                #MF_SysSetupFormRun
          Extends             #FormRun
          RunOn               #Client
        ENDPROPERTIES
        METHODS
          Version: 3
          SOURCE #classDeclaration
            #public class MF_SysSetupFormRun extends FormRun
            #{
            ##if.never
            #    #define.CurrentVersion(1)
            #    #localmacro.CurrentList
            #    #endmacro
            ##endif
            #}
          ENDSOURCE
          SOURCE #task
            #public int task(int _p1)
            #{
            #    #task
            #    FormDataSource formDataSource;
            #    //zcb insert begin
            #    //Use origin class
            #    object         object;
            #    //zcb insert end
            #
            #    //AXAPTA-LINKS
            #    FormControl             formControl;
            #    FormBuildStringControl  fbsc;
            #    MF_FieldInfo            fieldInfo;
            #    str                     fieldName;
            #    //end AXAPTA-LINKS
            #
            #    int ret;
            #
            #    ;
            #
            #    if (_p1 == #taskFilter)
            #    {
            #        formDataSource = this.objectSet();
            #        if (formDataSource &&
            #            formDataSource.queryRun() &&
            #            formDataSource.queryRun().args() &&
            #            !formDataSource.queryRun().args().caller())
            #        {
            #            formDataSource.queryRun().args().caller(this);
            #        }
            #    }
            #
            #    //AXAPTA-LINKS
            #    if (_p1 == #taskShiftEnter) //F10 or ALT
            #    {
            #        formDataSource = this.objectSet();
            #        formControl = this.selectedControl();
            #        if (formDataSource)
            #        {
            #            fbsc = formDataSource.formRun().form().design().control(formControl.id());
            #            fieldName = fieldId2Name(formDataSource.table(), fieldExt2Id((fbsc.dataField())));
            #            fieldInfo = new MF_FieldInfo(formDataSource.formRun().name(), formControl.name(), formDataSource.name(), tableId2Name(formDataSource.table()), fieldName, fbsc.dataMethod());
            #            fieldInfo.run();
            #            return true;
            #        }
            #        else
            #            info("Form has no datasource");
            #    }
            #    //end AXAPTA-LINKS
            #
            #    ret = super(_p1);
            #
            #//Modified by zhangchaobin on 20080628 Begin
            #//Refresh data source after deletting one record or more
            #//You should add a method named 'excuteQuery' on the method node of running form
            #//The deletting taskId is 2832
            #    object = this;
            #    if(_p1 == 2832 && formHasMethod(this,"excuteQuery"))
            #    {
            #
            #       object.excuteQuery();
            #    }
            #
            #//Zhangchaobin modify End
            #
            #    return ret;
            #}
          ENDSOURCE
        ENDMETHODS
      ENDCLASS

    ***Element: CLS

    ; Microsoft Dynamics AX Class: MF_Info 未加载
    ; --------------------------------------------------------------------------------
      CLSVERSION 1
      CLASS #MF_Info
        Id 50014
        PROPERTIES
          Name                #MF_Info
          Extends             #
          RunOn               #Called from
        ENDPROPERTIES
        METHODS
          Version: 3
          SOURCE #classDeclaration
            #final class MF_Info
            #{
            #}
          ENDSOURCE
          SOURCE #startupPost
            #/*
            #No SYS code must exist in this method
            #*/
            #void startupPost()
            #{
            #    FormRun         formRun;
            #    ;
            #    if(curuserid() == "Admin")
            #
            #    {
            #        if(!WinAPI::isControlButtonDown() &&
            #            DEV_AxAssistFunc::checkActiveXRegistered())
            #        {
            #            formRun = new MenuFunction(menuItemDisplayStr(DEV_AxAssistForm),MenuItemType::Display).create();
            #            if(formRun)
            #            {
            #                formRun.run();
            #                formRun.detach();
            #            }
            #        }
            #        if(!WinAPI::isShiftButtonDown())
            #        {
            #        // check for user ID
            #            //if(curUserId()=="MF") // <- change to your loginname
            #            {
            #                // actually run tabax
            #                TreeNode::findNode(@'\\Forms\\'+formStr(MF_TabBar)).AOTrun();
            #            }
            #        }
            #    }
            #
            #}
          ENDSOURCE
        ENDMETHODS
      ENDCLASS

    ***Element: JOB

    ; Microsoft Dynamics AX Job: MF_QueryBrowserJob 未加载
    ; --------------------------------------------------------------------------------
      JOBVERSION 1
      SOURCE #MF_QueryBrowserJob
        #static void MF_QueryBrowserJob(Args _args)
        #{
        #    ;
        #    new MF_QueryBrowser().run( new Query(queryStr(InventSum)) );
        #}
      ENDSOURCE

    ***Element: PRN

    ; Microsoft Dynamics AX Project : MF_ToolProject unloaded
    ; --------------------------------------------------------------------------------
      PROJECTVERSION 2
      PROJECT #MF_ToolProject
       PRIVATE
      PROPERTIES
        Name                #MF_ToolProject
      ENDPROPERTIES
        PROJECTCLASS ProjectNode
        GROUP #Menu Items
          PROPERTIES
            Name                #Menu Items
            ProjectGroupType    #MenuItems
            GroupMask           #
            PreventEditProperties #No
          ENDPROPERTIES
          GROUP #Display
            PROPERTIES
              Name                #Display
              ProjectGroupType    #Display
              GroupMask           #
              PreventEditProperties #No
            ENDPROPERTIES
            BEGINNODE
              FILETYPE 0
              UTILTYPE 1
              UTILOBJECTID 0
              NODETYPE 296
              NAME #MF_QueryBrowser
            ENDNODE
            BEGINNODE
              FILETYPE 0
              UTILTYPE 1
              UTILOBJECTID 0
              NODETYPE 296
              NAME #MF_showField
            ENDNODE
            ENDGROUP
          GROUP #Action
            PROPERTIES
              Name                #Action
              ProjectGroupType    #Action
              GroupMask           #
              PreventEditProperties #No
            ENDPROPERTIES
            BEGINNODE
              FILETYPE 0
              UTILTYPE 3
              UTILOBJECTID 0
              NODETYPE 296
              NAME #MF_CopyFieldsToClipboard
            ENDNODE
            BEGINNODE
              FILETYPE 0
              UTILTYPE 3
              UTILOBJECTID 0
              NODETYPE 296
              NAME #MF_CreateNewProject
            ENDNODE
            ENDGROUP
          ENDGROUP
        GROUP #Forms
          PROPERTIES
            Name                #Forms
            ProjectGroupType    #Forms
            GroupMask           #
            PreventEditProperties #No
          ENDPROPERTIES
          BEGINNODE
            FILETYPE 0
            UTILTYPE 11
            UTILOBJECTID 0
            NODETYPE 201
            NAME #MF_TabBar2009
          ENDNODE
          BEGINNODE
            FILETYPE 0
            UTILTYPE 11
            UTILOBJECTID 0
            NODETYPE 201
            NAME #MF_QueryBrowser
          ENDNODE
          BEGINNODE
            FILETYPE 0
            UTILTYPE 11
            UTILOBJECTID 0
            NODETYPE 201
            NAME #MF_CopyFieldsToClipboard
          ENDNODE
          BEGINNODE
            FILETYPE 0
            UTILTYPE 11
            UTILOBJECTID 0
            NODETYPE 201
            NAME #MF_TabBar
          ENDNODE
          BEGINNODE
            FILETYPE 0
            UTILTYPE 11
            UTILOBJECTID 0
            NODETYPE 201
            NAME #MF_showField
          ENDNODE
          BEGINNODE
            FILETYPE 0
            UTILTYPE 11
            UTILOBJECTID 0
            NODETYPE 201
            NAME #MF_CreateNewProjectDlg
          ENDNODE
          ENDGROUP
        GROUP #Classes
          PROPERTIES
            Name                #Classes
            ProjectGroupType    #Classes
            GroupMask           #
            PreventEditProperties #No
          ENDPROPERTIES
          BEGINNODE
            FILETYPE 0
            UTILTYPE 45
            UTILOBJECTID 50017
            NODETYPE 329
            NAME #MF_EditorScripts_ForAxassist
          ENDNODE
          BEGINNODE
            FILETYPE 0
            UTILTYPE 45
            UTILOBJECTID 50015
            NODETYPE 329
            NAME #MF_QueryBrowser
          ENDNODE
          BEGINNODE
            FILETYPE 0
            UTILTYPE 45
            UTILOBJECTID 50009
            NODETYPE 329
            NAME #MF_CopyFieldsToClipboard
          ENDNODE
          BEGINNODE
            FILETYPE 0
            UTILTYPE 45
            UTILOBJECTID 50011
            NODETYPE 329
            NAME #MF_EditorFormat
          ENDNODE
          BEGINNODE
            FILETYPE 0
            UTILTYPE 45
            UTILOBJECTID 50012
            NODETYPE 329
            NAME #MF_EditorLineInfo
          ENDNODE
          BEGINNODE
            FILETYPE 0
            UTILTYPE 45
            UTILOBJECTID 50013
            NODETYPE 329
            NAME #MF_FieldInfo
          ENDNODE
          BEGINNODE
            FILETYPE 0
            UTILTYPE 45
            UTILOBJECTID 50010
            NODETYPE 329
            NAME #MF_CreateNewProject
          ENDNODE
          BEGINNODE
            FILETYPE 0
            UTILTYPE 45
            UTILOBJECTID 50016
            NODETYPE 329
            NAME #MF_SysSetupFormRun
          ENDNODE
          BEGINNODE
            FILETYPE 0
            UTILTYPE 45
            UTILOBJECTID 50014
            NODETYPE 329
            NAME #MF_Info
          ENDNODE
          ENDGROUP
        BEGINNODE
          FILETYPE 0
          UTILTYPE 5
          UTILOBJECTID 0
          NODETYPE 215
          NAME #MF_QueryBrowserJob
        ENDNODE
      ENDPROJECT

    ***Element: END

  • 相关阅读:
    MySQL之force index和ignore index
    Linux中CPU性能分析工具perf简单使用(亲测可用)
    Linux之SeLinux
    Docker基础
    yum常用命令
    MySQL总结
    MySQL字符集详解
    MySQL5.6的4个自带库详解
    Python操作MySQL
    MySQL索引原理
  • 原文地址:https://www.cnblogs.com/perock/p/2379874.html
Copyright © 2011-2022 走看看