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
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]
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]
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()
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()
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
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
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
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()
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