예제 #1
0
    def OnGetItemText(self, item, col):
        """
        Определяет текст определенной ячейки.
        @type item: C{int}
        @param item: Номер строки.
        @type col:  C{int}
        @param col: Номер колонки.
        @rtype: C{string}
        @return: Текст нужной ячейки.
        """
        try:
            fld = self.colNames[col]
            value = self.dataset.getNameValue(fld, item)
            #   Если определен аттрибут getvalue колoнки, то пытаемся по нему вычислить значение ячейки
            self.evalSpace['value'] = value
            if (self.exCols[col]['getvalue'] not in [None, '', 'None']) and self.exCols[col]['attr'] in ['C', 'CR']:
                keyExpr = self.GetUUIDAttr('getvalue', fld)
                res, val = util.ic_eval(self.exCols[col]['getvalue'],
                                        0, self.evalSpace,
                                        'Exception icListDataset.OnGetItemText()',
                                        compileKey=keyExpr)
                if res:
                    value = val
            
            templ = self.exCols[col]['pic']
            try:
                value, point = setTempl(templ, value, -1)
            except Exception:
                io_prnt.outErr(u'>> setTempl Error in OnGetItemText col=%d pic=%s' % (col, templ))

        except IndexError:
            io_prnt.outErr(u'>> Key Error in OnGetItemText col=%d pic=%s' % (col, templ))
            value = ''

        return value
예제 #2
0
 def convertColGroupKey(GROUP_KEY):
     """
     Преобразовать данный ключ группы в строку заголовка группы колонки.
     @param GROUP_KEY: Ключ группы.
     """
     result = util.ic_eval(get_grp_title, evalSpace=locals())
     try:
         log.debug(u'Определение заголовка группы колонки <%s>. Результат <%s>' % (column['name'],
                                                                                   result))
     except:
         pass
     return result[1]
예제 #3
0
 def getColGroupKey(RECORD):
     """
     Получить ключ группы колонки.
     @param RECORD: Словарь записи.
     """
     result = util.ic_eval(get_grp_key, evalSpace=locals())
     try:
         log.debug(u'Определение ключа группы колонки <%s>. Результат <%s>' % (column['name'],
                                                                               result))
     except:
         pass
     return result[1]
예제 #4
0
 def On_onButton(self, evt):
     """
     Обработчик события wx.EVT_BUTTON, атрибут=onButton
     """
     self.evalSpace['evt'] = evt
     self.evalSpace['self'] = self
     ret, val = util.ic_eval(self.onButton, 0, self.evalSpace,
                             'EVAL ATTRIBUTE ERROR: attr=onButton')
     if ret and val:
         evt.Skip()
     elif not ret:
         evt.Skip()
예제 #5
0
 def OnLeft_Up(self, evt):
     """
     Обработчик события wx.EVT_LEFT_UP, атрибут=onLeftUp
     """
     self.evalSpace['evt'] = evt
     self.evalSpace['self'] = self
     ret, val = util.ic_eval(self.onLeftUp, 0, self.evalSpace,
                             'EVAL ATTRIBUTE ERROR: attr=onLeftUp')
     if ret and val:
         evt.Skip()
     elif not ret:
         evt.Skip()
예제 #6
0
 def getValue(self):
     """
     Текущее значение.
     """
     if self._driver:
         src_name = self.getSrcName()
         getvalue = self.getGetValueFunc()
         if getvalue:
             #Выполнение функции получения данных
             evs = util.InitEvalSpace({
                 'self': self,
                 'driver': self._driver,
                 'src_name': src_name
             })
             return util.ic_eval(getvalue, evalSpace=evs)[1]
         elif src_name:
             return self._driver.getDataByName(src_name)
         else:
             return self.getDefault()
     return None
예제 #7
0
 def getResourceByLinkExpr(self, component):
     """
     Определить ресурс по выражению.
     Если не определен ресурс и определено выражение, которое возвращает
     ресурс.
     @return:
     """
     res = None
     link_expr = component['link_expr']
     self.evalSpace['self'] = self
     ret, val = ic_eval(link_expr,
                        0,
                        self.evalSpace,
                        'icDataLink <link_expr>',
                        compileKey=ic_uuid.get_uuid_attr(
                            self._uuid, 'link_expr'))
     if ret:
         if isinstance(val, dict) and 'name' in val and 'type' in val:
             res = val
             res['alias'] = component['name']
     return res
예제 #8
0
def icResourceParser(parent,
                     components,
                     sizer=None,
                     logType=0,
                     evalSpace=None,
                     bCounter=True,
                     progressDlg=None,
                     ids=None,
                     **kwargs):
    """
    Парсер. Функция рекурсивного разбора ресурсного описания.
    @type parent: C{wx.Window}
    @param parent: Указатель на родительское окно, на котором располагаются другие компоненты.
    @type components: C{List}
    @param components: Список компонентов.
    @type sizer: C{wx.Sizer}
    @param sizer: Сайзер куда добавляются компоненты.
    @type logType: C{int}
    @param logType: Тип лога (0 - консоль, 1- файл, 2- окно лога).
    @param evalSpace: Пространство имен, необходимых для вычисления внешних выражений.
    @type evalSpace: C{dictionary}
    @type bCounter: C{bool}
    @param bCounter: Признак отображения в ProgressBar-е. Иногда это не нужно -
        для создания объектов полученных по ссылки. Т. к. они не учтены при подсчете
        общего количества объектов.
    @type ids: {list | tuple}
    @param ids: Список идентификаторов объектов.
    """
    log.info(u'Сборка объектов')

    #   Получаем указатель на индикатор и указатель главного окна (Dialog, Frame)
    main_parent = evalSpace.get('_main_parent', None)

    # Создаем компоненты
    for cindx, component in enumerate(components):
        # Определяем идентификатор объекта
        if cindx < len(ids or []):
            component_id = ids[cindx]
        else:
            component_id = None

        #   Компонент создается только если установлен признак активации bActivated = True
        if util.isAcivateRes(component, evalSpace):
            #   Определяем имя родительского интерфейса, если он определен
            try:
                interface = parent.GetInterfaceName()
                if not interface and sizer:
                    interface = sizer.GetInterfaceName()
            except:
                interface = None

            wxw = None
            #   Если у компонета есть алиас, то разбор ведем с алиасным именем.
            #   Как правило алиас появляется при создании объета по ссылке через
            #   объект ссылки DataLink
            if 'alias' in component and not component['alias'] in [
                    None, '', 'None'
            ]:
                name = component['alias']
            else:
                name = component['name']

            #   Прописываем имя родительского интерфеса в специальный ключ ресурса
            if interface and ('__interface__' not in component or
                              ('__interface__' in component
                               and not component['__interface__'])):
                component['__interface__'] = interface
            elif not interface and '__interface__' in component and component[
                    '__interface__']:
                interface = component['__interface__']

            if '__interface__' in component:
                interface = component['__interface__']
            #   Прописываем в пространстве имен имя файла ресурса
            if '__file_res' in component and component['__file_res']:
                evalSpace['__file_res'] = component['__file_res']
            #   Если определен индикатор процесса, то отображаем количество
            #   созданных компонентов ресурса
            if bCounter:
                progress.icUpdateProgressBar(u'Создаем компонент: <%s>' % name)
            else:
                log.debug(u'Создаем компонент: <%s> type: <%s>' %
                          (name, component['type']))

            # Оконные компоненты
            if parent is None and component['type'] in ('Panel', 'Window',
                                                        'ScrolledWindow',
                                                        'SplitterWindow'):
                parent = createFrame(
                    main_parent, component_id or icNewId(), {
                        'title': '',
                        'size': component['size'],
                        'position': component['position']
                    }, logType, evalSpace)

            if component['type'] == 'Frame':
                parent = wxw = createFrame(main_parent, component_id
                                           or icNewId(), component, logType,
                                           evalSpace)
            elif component['type'] == 'Dialog':
                parent = wxw = createDialog(main_parent, component_id
                                            or icNewId(), component, logType,
                                            evalSpace)
            elif component['type'] == 'SizerSpace':
                # В режиме графического редактора заменяем на окно таких-же размеров
                if isEditorMode():
                    component['type'] = 'Panel'
                    wxw = components_lib.icwxpanel.icWXPanel(
                        parent, -1, component, logType, evalSpace)
                    wxw.SetBackgroundColour(wx.Colour(200, 200, 250))
                else:
                    wxw = components_lib.sizers.icspacesizer.icSpaceSizer(
                        parent, icNewId(), component, logType, evalSpace)

            # Служебные компоненты
            elif component['type'] == 'DataLink':
                link = icdataset.icDataLink(component,
                                            logType=logType,
                                            evalSpace=evalSpace,
                                            fltDict=DatasetFilterBuff)
                if isinstance(link.resource, dict):
                    parent = icResourceParser(parent, [link.resource],
                                              logType=logType,
                                              sizer=sizer,
                                              evalSpace=evalSpace,
                                              bCounter=False,
                                              ids=[component_id])

            # Импорт модулей и имен
            elif component['type'] == 'Import':
                imp = components_lib.icimport.icImport(parent,
                                                       component_id
                                                       or icNewId(),
                                                       component,
                                                       0,
                                                       evalSpace,
                                                       isDebug=IS_TEST_MODE)
                wxw = imp.GetObject()

            # Объект группы
            elif component['type'] == 'Group':
                if len(component['child']):
                    # Модуль ресурса грузится конструкторе icSimple, поэтому
                    # передаем имя модуля дочернему компоненту - все остальные
                    # компоненты системы наследники icSimple
                    if 'res_module' in component:
                        component['child'][0]['res_module'] = component[
                            'res_module']
                    parent = icResourceParser(parent,
                                              component['child'],
                                              sizer,
                                              logType=logType,
                                              evalSpace=evalSpace,
                                              bCounter=bCounter,
                                              ids=ids)

            # Стандартные и пользовательские компоненты
            else:
                wxw = Constructor(parent,
                                  component_id or icNewId(),
                                  component,
                                  logType,
                                  evalSpace,
                                  bCounter,
                                  progressDlg,
                                  sizer=sizer)

            # Выполняем выражения инициализации для не визуальных компонентов
            if wxw is None and 'init_expr' in component and not component[
                    'init_expr'] in (None, 'None', ''):
                if component.get('_uuid', None):
                    util.ic_eval(component['init_expr'],
                                 0,
                                 evalSpace,
                                 'icResourceParser()<init_expr>. name:' + name,
                                 compileKey=component['_uuid'] + 'init_expr')
                else:
                    util.ic_eval(component['init_expr'], 0, evalSpace,
                                 'icResourceParser()<init_expr>. name:' + name)

            # Регистрация компонентов
            if wxw:
                # Регестрируем компоненты в родительском интерфейсе
                if interface and interface in evalSpace['_interfaces']:
                    ifc = evalSpace['_interfaces'][interface]
                    ifc.reg_object(wxw, name)
                # Если корневой компонент еще не определен, определяем его
                if evalSpace['_root_obj'] is None:
                    evalSpace['_root_obj'] = wxw
                    parent = wxw
                # Регестрируем компоненты в контексте
                evalSpace['_dict_obj'][name] = wxw
                evalSpace['_list_obj'].append(wxw)
                evalSpace['self'] = wxw
                # В режиме редактирования регестрируем все компоненты в редакторе
                if isEditorMode():
                    edt = evalSpace['_root_obj']
                    if wxw != edt:
                        try:
                            edt.AddObject(wxw)
                        except:
                            io_prnt.outErr('### AddOject Error: <%s> edt=%s' %
                                           (wxw, edt))

            # Заполнение контейнеров
            if wxw is not None and parent is not None and name and component[
                    'type'] != 'Table':
                # Регестрируем компонены в родительском компоненте
                if parent.type != 'ExternalWin':
                    if not sizer:
                        parent.reg_child(wxw, name)
                    # NOTE: 7/05/08. Для того, чтобы можно было объект вставить в сайзер,
                    # который не является компонентом ic - для дизайнера форм
                    elif hasattr(sizer, 'reg_child'):
                        sizer.reg_child(wxw, name)
                elif sizer:
                    sizer.reg_child(wxw, name)
                # Выполняем выражения инициализации для компонентов
                if 'init_expr' in component and not component['init_expr'] in [
                        None, 'None', ''
                ]:
                    evalSpace['evt'] = evalSpace.get('evt', None)
                    evalSpace['self'] = wxw
                    if '_uuid' in component and component['_uuid']:
                        util.ic_eval(
                            component['init_expr'],
                            0,
                            evalSpace,
                            'icResourceParser()<init_expr>. name:' + name,
                            compileKey=component['_uuid'] + 'init_expr')
                    else:
                        util.ic_eval(
                            component['init_expr'], 0, evalSpace,
                            'icResourceParser()<init_expr>. name:' + name)

                if 'source' in component and not component['source'] in [
                        '', None, 'None'
                ]:
                    evalSpace['_has_source'][name] = wxw
                # Обрабатываем атрибут <show> - выражение, которое определяет
                #     показывать компонент или скрыть
                if 'show' in component:
                    bShow = component['show']
                    if bShow in ('1', 'True'):
                        bShow = True
                    elif bShow in ('0', 'False'):
                        bShow = False
                    else:
                        if '_uuid' in component and component['_uuid']:
                            res, val = util.ic_eval(
                                component['show'],
                                0,
                                evalSpace,
                                'icResourceParser()<show>. name:' + name,
                                compileKey=component['_uuid'] + 'show')
                        else:
                            res, val = util.ic_eval(
                                component['show'], 0, evalSpace,
                                'Exception in icResourceParser()')

                        if res:
                            try:
                                bShow = bool(val)
                            except:
                                bShow = True

                    if not bShow:
                        wxw.Show(bShow)
    return parent
예제 #9
0
    def __init__(self, parent=None, id=-1, component={}, logType=0,
                 evalSpace=None, bCounter=False, progressDlg=None, *arg, **kwarg):
        """
        Конструктор для создания icDialog.
        @type parent: C{wxWindow}
        @param parent: Указатель на родительское окно.
        @type id: C{int}
        @param id: Идентификатор окна.
        @type component: C{dictionary}
        @param component: Словарь описания компонента.
        @type logType: C{int}
        @param logType: Тип лога (0 - консоль, 1- файл, 2- окно лога).
        @param evalSpace: Пространство имен, необходимых для вычисления внешних выражений.
        @type evalSpace: C{dictionary}
        """
        #   Атрибуты сайзера
        self.sizer = None
        self.bSizerAdd = False
        self.title = None

        util.icSpcDefStruct(SPC_IC_DIALOG, component)
        icWidget.__init__(self, parent, id, component, logType, evalSpace)

        self.title = self.getTitle()
        pos = component['position']
        self.size = component['size']
        fgr = component['foregroundColor']
        bgr = component['backgroundColor']
        self.style = style = component['style'] | wx.WANTS_CHARS
        self.on_close = component['onClose']
        self.set_focus = component['setFocus']
        self.kill_focus = component['killFocus']
        icon = component['icon']

        #   Флаг, указывающий, что необходимо сохранять изменяющиеся
        #   параметры окна (позицию и размеры).
        self.saveChangeProperty = True

        #   Читаем расположение и размеры диалога из файла настроек пользователя
        _pos = self.LoadUserProperty('position')
        _size = self.LoadUserProperty('size')

        if _pos:
            pos = _pos

        if pos[0] > 1000:
            pos[0] = -1
        if pos[1] > 1000:
            pos[1] = -1

        if _size:
            self.size = _size

        # Буфер результата работы с формой
        self.__result_buff = None

        # wx.Dialog.__init__(self, parent, id, self.title, pos, self.size, style = style, name = self.name)
        # Instead of calling wxDialog.__init__ we precreate the dialog
        # so we can set an extra style that must be set before
        # creation, and then we create the GUI dialog using the Create
        # method.

        pre = wx.PreDialog()
        pre.SetExtraStyle(wx.DIALOG_EX_CONTEXTHELP)
        pre.Create(parent, id, self.title, pos, self.size, style, self.name)

        # This next step is the most important, it turns this Python
        # object into the real wrapper of the dialog (instead of pre)
        # as far as the wxPython extension is concerned.
        self.this = pre.this

        if icon:
            icon_img = util.ic_eval(icon, evalSpace=self.evalSpace)
            if icon_img:
                icon = wx.IconFromBitmap(icon_img)
                self.SetIcon(icon)

        self.Show(False)
        #   Признак разрушения дочерних элементов
        self._bChildsDestroied = False

        if fgr is not None:
            self.SetForegroundColour(wx.Colour(fgr[0], fgr[1], fgr[2]))

        if bgr is not None:
            self.SetBackgroundColour(wx.Colour(bgr[0], bgr[1], bgr[2]))

        self.SetAutoLayout(True)

        self.Bind(wx.EVT_CLOSE, self.OnClose)
        self.Bind(wx.EVT_SIZE, self.OnSize)
        self.Bind(wx.EVT_SET_FOCUS, self.OnSetFocus)
        self.Bind(wx.EVT_KILL_FOCUS, self.OnKillFocus)
        self.BindICEvt()

        #   Создаем дочерние компоненты
        self.Freeze()
        self.childCreator(bCounter, progressDlg)
        self.Thaw()
        
        if component.get('show', '1') in ('True', 'true', 1):
            self.Show(True)

        if component.get('fit', None):
            self.Fit()
예제 #10
0
    def getResourceByFileLink(self, component):
        """
        Собирает ресурсное описание по ссылке.
        Ресурсное описание собирается по ссылке на файл ресурса.
        @type component: C{dictionary}
        @param component: Словарь описания ссылки.
        """
        res = None
        name = component['name']
        source = util.getSpcAttr(component, 'file', self.evalSpace).strip()
        res_query = util.getSpcAttr(component, 'res_query',
                                    self.evalSpace).strip()
        link_expr = component['link_expr']

        #   Если не определен ресурс и определено выражение, которое возвращает
        #   ресурс
        if not source and not res_query and component['link_expr']:
            return self.getResourceByLinkExpr(component)

        _query = res_query.split(':')
        link_key = _query[0]

        try:
            link_type = _query[1].split('.')[0]
            link_name = _query[1].split('.')[1]

            io_prnt.outLog(
                u'ICDATASET: point to object resource: type=<%s>, name=<%s>' %
                (link_type, link_name))
        except:
            link_type = None
            link_name = None

        # Определяем тип и путь до ресурсного файла ---------------
        path, nameRes, res_ext = self.GetExtAndPathSource(source)

        #   Получаем ресурсное описание, где в общем случае ищется
        #   описание нужного компонента
        if link_key:

            try:
                io_prnt.outLog(u'DATA LINK TO key=%s, path=%s, ext=%s' %
                               (link_key, path, res_ext))
                res = resource.icGetRes(link_key,
                                        res_ext,
                                        path,
                                        nameRes=nameRes)

                #   В описание найденого ресурса добавляем атрибуты, которые
                #   описывают файл ресурса
                res['__subsys_path'] = path
                res['__resource_ext'] = res_ext

            except IOError:
                ic_dlg.icWarningBox(u'ОШИБКА',
                                    u'Ошибка открытия файла %s.' % source)

        # ---- В ресурсе ищем описание нужного компанента
        #   (<key_in_fileres>:type.name)
        if link_name and link_type:
            ret = getRes(res, link_type, link_name)

            if ret:
                res = ret
            else:
                res = None

        #   Если определено выражение, возвращающее ресурсное описание,
        # выполняем его
        if link_expr:

            self.evalSpace['self'] = self
            ret, val = ic_eval(link_expr,
                               0,
                               self.evalSpace,
                               'icDataLink <link_expr>',
                               compileKey=ic_uuid.get_uuid_attr(
                                   self._uuid, 'link_expr'))

            if ret:
                if isinstance(val, dict) and 'name' in val and 'type' in val:
                    res = val
                    io_prnt.outLog(u'ICDATASET RCONSTRUCT RES: <%s>' % val)

        # -------------------------------------------------------------
        #   В полученном ресурсном описании ищем ссылки и заменяем их
        #   на ресурсные описания
        if res:
            res = self.doReplacementRes(res, component)

        #   Если ресурсное описание не найдено и выражение изменений не
        #   определено, то сообщаем об этом пльзователю
        else:
            ic_dlg.icWarningBox(
                u'ОШИБКА',
                u'Описание объект \'%s\' в ресурсном файле \'%s\' не найдено.'
                % (res_query, source))

        return res