def strToVal(text, propEdt=None, *arg, **kwarg): """ Функция преобразования строки в значение ресурса. @type propEdt: C{ic.components.user.objects.PropNotebookEdt} @param propEdt: Указатель на редактор свойств. """ value = text if propEdt and propEdt.getResTree(): typRes = propEdt.getResource()['type'] modl = propEdt.getResTree().GetTypeModule(typRes) try: edtFunc = getattr(modl, 'str_to_val_user_property') return edtFunc(propEdt.GetAttr(), text, propEdt, *arg, **kwarg) except: io_prnt.outErr( u'Ошибка конвертации пользовательского свойства') else: try: value = eval(text) except: return None return value
def makeInstallPackage(self): """ Создание инсталяционного пакета. """ install_dir = ic_dlg.icDirDlg(None, u'Выберите инсталяционную папку', os.getcwd()) if os.path.isdir(install_dir): try: # Создание setup.py файла script = self.setupScript() try: setup_file = None setup_file = open(install_dir+'\setup.nsi', 'w') setup_file.write(script) setup_file.close() except: io_prnt.outErr(u'Ошибка сохранения скрипта инсталятора') if setup_file: setup_file.close() except: io_prnt.outErr(u'Ошибка создания инсталяционного пакета')
def DelOrg(self): """ Удалить органайзер(Объект главного менеджера системных панелей). @return: Возвращает результат выполнения операции True/False. """ if self.content_obj is not None: io_prnt.outWarning( u'Notebook главного окна заменен объектом-содержанием <%s>' % self.content_obj) return None try: if self.area_split: self.delCentralPanel() self._MainNotebook.deleteAllPages() self._MainNotebook.Close() self.RemoveChild(self._MainNotebook) self._MainNotebook.Destroy() self._MainNotebook = None self.Refresh() return True except: io_prnt.outErr(u'Ошибка удаления главного органайзера') return False
def _delPanel(self, Splitter_, Index_): """ Удалить из области панель с указанным индексом. @param Splitter_: Сплиттер, в который устанавленна панель. @param Index_: Индекс в сплиттере. @return: Возвращает True/False. """ try: if Splitter_ is None: return False win_count = len(Splitter_._windows) win = None if Index_ < win_count: win = Splitter_.GetWindow(Index_) if win: Splitter_.DetachWindow(win) win.Destroy() return True except: io_prnt.outErr(u'Ошибка удаления панели из разделителя областей.') return False
def DoMenu(self, MenuItems_): """ Создать меню . @param MenuItems_: список ресурсов пунктов меню. @return: Возвращает ссылку на созданное горизонтальное меню или None в случае ошибки. """ try: # Проверка аргументов if not MenuItems_: io_prnt.outWarning(u'Не определены пункты меню!') return None for item_struct in MenuItems_: if item_struct['type'] == 'MenuItem': self.AppendItemByStruct(item_struct['name'], item_struct) elif item_struct['type'] == 'Menu': self.AppendMenuByStruct(item_struct['name'], item_struct) return self except: io_prnt.outErr(u'Ошибка загрузки выпадающего меню') return None
def getStoreNodeLevel(self, Path_=None, CurStoreLevel_=None): """ Получить узел хранилища по пути. @param Path_: Путь. """ if Path_ is None: Path_ = self.getPath() if CurStoreLevel_ is None: CurStoreLevel_ = self.getStorage() if CurStoreLevel_ is not None: if len(Path_) > 0: try: return self.getStoreNodeLevel(Path_[1:], CurStoreLevel_[Path_[0]]) except: io_prnt.outErr( u'Ошибка определения узла хранилища метаобъекта %s %s %s' % (Path_, CurStoreLevel_.getName(), CurStoreLevel_.keys())) return None else: return CurStoreLevel_ return None
def deletePage(self, Index_): """ Удалить страницу из органайзера. @param Index_: Номер страницы. """ try: # Удалить картинку прикрепленную к этой странице ОБЯЗАТЕЛЬНО!!! # self._img_list.Remove(Index_) # Обязательно поменять выделенную страницу!!! self.AdvanceSelection() # Очистить окно страницы page = self.GetPage(Index_) page.DestroyWin() # Удалить страницу result = self.DeletePage(Index_) # Изменить привязку картинок к страницам for i in range(Index_, self.GetPageCount()): self.SetPageImage(i, i) # Если страниц в органайзере больше не осталось, то ... if self.GetPageCount() <= 0: # Удалить сам объект органайзера c экрана self.Show(False) # Если количество страниц - 0, # тогда считается что ораганайзер только закрылся ic.utils.ic_exec.ExecuteMethod(self.getMainWin()._OnOrgClose, self) # При удалении страницы меняется и текущая выбранная страница self._cur_selected_page = self.GetSelection() # Удалить атрибуты соответствующие этой странице del self._page_attr[Index_] # Обновить объект self.Refresh() return result except: io_prnt.outErr(u'deletePage') return None
def refreshSubSys(self): """ Обновить подсистему. """ try: self._is_build = False sub_systems = self.getParent() prj_dir = os.path.dirname( os.path.dirname(sub_systems.getRoot().getPrjFileName())) sub_sys_dir = os.path.dirname(sub_systems.getSubSysPath(self.name)) # Проверка входных данных if (not os.path.isdir(sub_sys_dir)) or ( not os.path.exists(sub_sys_dir)): ic_dlg.icMsgBox( u'ОШИБКА', u'Не корректный путь к подсистеме <%s>' % sub_sys_dir) return if (not os.path.isdir(prj_dir)) or (not os.path.exists(prj_dir)): ic_dlg.icMsgBox(u'ОШИБКА', u'Не корректный путь к проекту <%s>' % prj_dir) return # Копировать подсистему в текущий проект sub_systems._copySubSysDir(sub_sys_dir, prj_dir) # Обновить дерево пользовательских компонентов ic_user.refreshImports() tree_prj = self.getParentRoot().getParent() tree_prj.res_editor.CloseResource() tree_prj.res_editor.InitObjectsInfo(bRefresh=True) # Обновить дерево проекта sub_systems.getRoot().synchroPrj(True) return True except: io_prnt.outErr(u'Ошибка обновления подсистемы <%s>' % self.name) return False
def gen_precod(self, cod, default_lst=None): """ Генерирут строки родительских кодов. @param cod: Код. @param default_lst: Список словарей (для каждого уровня) значений полей. """ lst = self.StrCode2ListCode(cod) default_lst = default_lst or [] prnt_cod = '' for indx, cd in enumerate(lst[:-1]): if not self.isCod(prnt_cod + cd): if indx < len(default_lst): df = default_lst[indx] else: df = {'name': cd} lev = self.getLevels()[indx] ref = lev.getRefSprav() mngr = self.getSpravManager() ref_sprav = mngr.getSpravByName(ref) if ref and not ref_sprav: io_prnt.outLog(u'ERROR. Not Found referer sprav <%s>' % ref) raise if ref_sprav: try: ref_prnt_cod = ''.join( self._get_refspr_parent_cod(prnt_cod)) ref_cod = ref_prnt_cod + cd name = ref_sprav.Find(ref_cod) df = {'name': name} except: io_prnt.outErr(u'Find <name> in ref sprav ERROR!') else: df = {'name': cd} self.addRec(prnt_cod + cd, df) prnt_cod += cd
def choice_record(self, parent=None, *args, **kwargs): """ Вызов выбора записи из справочника. @param parent: Родительская форма. @return: Выбранную запись или None в случае ошибки. """ try: field_names = tuple(self.getStorage().getSpravFieldNames()) fields = dict([(field_name, field_name) for field_name in field_names]) result = self.Hlp(field=fields, parentForm=parent, *args, **kwargs) if result[0] in (0, coderror.IC_HLP_OK): record = result[2] # Преобразуем запись в словарь # record = dict([(field_name, field_values[i]) for i, field_name in enumerate(field_names)]) return record else: io_prnt.outErr( u'Ошибка выбора справочника <%s>. Результат %s' % (self.getName(), result)) except: io_prnt.outErr(u'Ошибка выбора записи справочника <%s>' % self.getName()) return None
def SetFilterField(self, clsName, fieldName, row): """ Устанавливаем фильтр на объект группы (связь один ко многим). @type clsName: C{string} @param clsName: Имя класса данных, который фильтруется @type fieldName: C{string} @param fieldName: Поле в классе данных, по которому фильтруем. @type row: C{int} @param row: Текущий номер строки в списке. Будут отобраны те строки класса данных, значения полей <fieldName> которых, будут соответствовать идентификатору текущей записи. """ try: dataset = self.evalSpace['_sources'][clsName] # Если буфер заполнен, то необходимо запросить потверждение на # обновление данных и обновить данные. В противном случае изменения # будут потеряны if dataset.isChangeRowBuff() and MsgBox(None, _('Save changes?'), style=wx.YES_NO | wx.ICON_QUESTION) == wx.ID_YES: dataset.update() id = self.dataset.getId(row, True) dataset.FilterField(fieldName, id) # Уведомляем другие компоненты формы о том, что состояние объекта данных могло измениться for key in self.evalSpace['_has_source'].keys(): try: if key != self.name: self.evalSpace['_has_source'][key].UpdateViewFromDB(clsName) # Обновляем связанные гриды self.evalSpace['_has_source'][key].UpdateDataView(clsName) except: pass except KeyError: MsgBox(None, _('Dataclass %s is not defined in context.') % clsName) except: io_prnt.outErr(u'Error in ic.components.iclistdataset.SetFilterField')
def _destroyAreaSplitter(self): """ Удаление разделителя областей. """ try: if self.area_split: if self._h_area_splitter: h_win_count = len(self._h_area_splitter._windows) for i in range(h_win_count): self._delPanel(self._h_area_splitter, i) if self._v_area_splitter: v_win_count = len(self._v_area_splitter._windows) for i in range(v_win_count): self._delPanel(self._v_area_splitter, i) self._v_area_splitter.Destroy() self.left_panel = None self.right_panel = None self.top_panel = None self.bottom_panel = None self.central_panel = None return True except: io_prnt.outErr(u'Ошибка удаления разделителя областей.') return False
def AddToLinkToolBar(self, ToolItem_): """ Создать инструменты в панели инструментов и связать их с существующими пунктами главного меню. @param ToolItem_: Ресурс инструмента. @return: Возвращает ссылку на панель инструментов или None в случае ошибки. """ try: # Проверка аргументов if not ToolItem_: return None item_name = ToolItem_[RES_TOOL_ITEM] item = self._MainMenu.FindItemByAlias(item_name) # Если инструмент с таким именем уже существует, то не создавать его tool = self.FindToolByAlias(item_name) if tool is None: # Проверка на ограничение доступа self.AppendToolByItem(item_name, item) return self except: io_prnt.outErr(u'Ошибка добавления инструментов в панель %s!' % self._Name) return None
def DoMenu(self, MenuItems_): """ Создать меню . @param MenuItems_: список ресурсов пунктов меню. @return: Возвращает ссылку на созданное горизонтальное меню или None в случае ошибки. """ try: # Проверка аргументов if not MenuItems_: io_prnt.outWarning(u'Не определены пункты меню!') return None # Перед загрузкой удалить все self.RemoveAll() self.AddToLoadMenu(MenuItems_) # Привязать, созданное меню к окну # ВНИМАНИЕ: # Без привязки меню к окну, меню будет создано, # но не будет отображатся в окне. return self except: io_prnt.outErr(u'Ошибка загрузки меню') return None
def execFuncStr(FuncStr_, NameSpace_=None, ReImport_=False, *args, **kwargs): """ Выполнение строковой функции в формате: пакеты.модуль.функция(аргументы). @type FuncStr_: C{string} @param FuncStr_: Строковая функция. @type NameSpace_: C{dictionary} @param NameSpace_: Пространство имен. @type ReImport_: C{bool} @param ReImport_: Переимпортировать модуль функции? @return: Вовращает результат выполнения функции или None в случае ошибки. """ result = None try: # Выделить модуль функции func_import = FuncStr_.split('(')[0].split('.') func_mod = '.'.join(func_import[:-1]) # Подготовить пространство имен if NameSpace_ is None or type(NameSpace_) <> type({}): NameSpace_ = {} # Выполнение функции try: try: if ReImport_: ic.utils.util.icUnLoadSource(func_mod) import_str = 'import ' + func_mod exec import_str except: io_prnt.outErr(_('Import module error: %s') % import_str) NameSpace_.update(locals()) result = eval(FuncStr_, globals(), NameSpace_) except: io_prnt.outErr(_('Run module error: %s') % (FuncStr_, func_mod)) except: io_prnt.outErr( _('Error in function ic_exec.execFuncStr, %s') % FuncStr_) return result
def AppendTool(self, ToolName_, ToolStruct_): """ Добавить инструмент. @param ToolName_: Имя-идентификатор инструмента. @param ToolStruct_: Словарь, описывающий инструмент (см формат файла ресурса движка). @return: Возвращает инструмент или None в случае ошибки. """ try: # Расширение структуры до спецификации ToolStruct_ = ic.utils.ic_util.SpcDefStruct( SPC_IC_TOOL, ToolStruct_) # Добавить новый инструмент на панель tool = None tool_id = wx.NewId() if ic_menu.RES_MENU_HINT in ToolStruct_ and ToolStruct_[ ic_menu.RES_MENU_HINT] is not None: tool_hint = ToolStruct_[ic_menu.RES_MENU_HINT] else: tool_hint = '' if ic_menu.RES_MENU_ACTION in ToolStruct_: tool_tools_action = ToolStruct_[ic_menu.RES_MENU_ACTION] else: tool_tools_action = {} if ic_menu.RES_MENU_CHECKON in ToolStruct_: tool_tools_check_on = ToolStruct_[ic_menu.RES_MENU_CHECKON] else: tool_tools_check_on = {} if ic_menu.RES_MENU_CHECKOFF in ToolStruct_: tool_tools_check_off = ToolStruct_[ic_menu.RES_MENU_CHECKOFF] else: tool_tools_check_off = {} # Если новый пункт не разделитель, тогда это обычный пункт if tool_hint == ic_menu.MENU_SEPARATOR: # Новый пункт-разделитель self.AddSeparator() else: # Определить образ # (ЕСЛИ ОБРАЗА НЕТ, ТО ДОБАВЛЕНИЕ ИНСТРУМЕНТА НЕ ПРОИЗОЙДЕТ) if ic_menu.RES_MENU_IMAGE in ToolStruct_: if ToolStruct_[ ic_menu.RES_MENU_IMAGE] != '' and ToolStruct_[ ic_menu.RES_MENU_IMAGE] is not None: if isfile(ToolStruct_[ic_menu.RES_MENU_IMAGE]): tool_image = ic_bmp.icCreateBitmap( ToolStruct_[ic_menu.RES_MENU_IMAGE]) else: return None else: return None else: return None if ic_menu.RES_MENU_CHECKABLE in ToolStruct_ and ToolStruct_[ic_menu.RES_MENU_CHECKABLE] is not None and \ ToolStruct_[ic_menu.RES_MENU_CHECKABLE]: tool = self.AddCheckTool(tool_id, tool_image, wx.NullBitmap, '', tool_hint) # Добавить в список методов if tool_tools_check_on != {}: self._tools_check_on[tool_id] = tool_tools_check_on if tool_tools_check_off != {}: self._tools_check_off[tool_id] = tool_tools_check_off else: if ic_menu.RES_MENU_RADIO in ToolStruct_ and ToolStruct_[ic_menu.RES_MENU_RADIO] is not None and \ ToolStruct_[ic_menu.RES_MENU_RADIO]: tool = self.AddRadioTool(tool_id, tool_image, wx.NullBitmap, '', tool_hint) else: # Создать простой инструмент tool = self.AddSimpleTool(tool_id, tool_image, '', tool_hint) # Проверки на блокировку инструмента tool_enabled = 1 if ic_menu.RES_MENU_ENABLED in ToolStruct_ and ToolStruct_[ic_menu.RES_MENU_ENABLED] is not None and \ not ToolStruct_[ic_menu.RES_MENU_ENABLED]: tool_enabled = 0 # Проверка на ограничение доступа к функциональному ресурсу # if not ic_acc.icCanAuthent(ic_acc.ACCESS_USE, ToolName_, ic_acc.ACC_TOOLITEM, False): # tool_enabled = 0 tool.Enable(tool_enabled) # Добавить в список методов if tool_tools_action != {}: self._tools_action[tool_id] = tool_tools_action # Установить обработчик self.Bind(wx.EVT_TOOL, self.OnToolClick, id=tool_id) # Прописать в реестре self.Register(tool, tool_id, ToolName_) return tool except: io_prnt.outErr(u'Ошибка создания инструмента %s!' % ToolName_) return None
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 Constructor(parent, id, component, logType=0, evalSpace=None, bCounter=False, progressDlg=None, bUserComponent=False, sizer=None): """ Функция вызывает конструктор для создания объекта по ресурсному описанию. @type parent: C{wx.Window} @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} @type bCounter: C{bool} @param bCounter: Признак отображения в ProgressBar-е. Иногда это не нужно - для создания объектов полученных по ссылки. Т. к. они не учтены при подсчете общего количества объектов. @type progressDlg: C{wx.ProgressDialog} @param progressDlg: Указатель на идикатор создания формы. """ log.info(u'Вызов конструктора объекта <%s>' % component['name']) # Вызываем конструктор modl = None try: # Переопределение компонентов if 'component_module' in component and not component[ 'component_module'] in (None, 'None', ''): log.info(u'Импорт модуля <%s>' % component['component_module']) exec('import %s as modl' % component['component_module']) else: modl = GetComponentModulDict()[component['type']] if '_root_obj' not in evalSpace or evalSpace['_root_obj'] is None: isParent = True oRoot = None else: isParent = False oRoot = evalSpace['_root_obj'] # Если в конструкторе есть параметр 'sizer', то передаем его constr = getattr(modl, modl.ic_class_name) if isEditorMode(): try: designer = constr.GetDesigner() if designer: constr = designer except: io_prnt.outErr(_('Designer not found')) designer = None if 'sizer' in constr.__init__.im_func.func_code.co_varnames: wxw = constr(parent, id, component, logType, evalSpace, bCounter=bCounter, progressDlg=progressDlg, sizer=sizer) else: wxw = constr(parent, id, component, logType, evalSpace, bCounter=bCounter, progressDlg=progressDlg) # Некоторые компоненты могут совершать подмену объектов if hasattr(wxw, 'get_replace_object'): wxw = wxw.get_replace_object() # Если компонент является шаблоном, то собираем по шаблону if issubclass(wxw.__class__, ictemplate.icTemplateInterface): # Для сложного компонента создаем новый контекст # Регестрируем интверфейс шаблона if component['alias'] not in ('None', '', None): nm = component['alias'] else: nm = component['name'] res = wxw.GetResource() res['__interface__'] = nm parent = icResourceParser(parent, [res], sizer, logType=logType, evalSpace=evalSpace, bCounter=bCounter) wxw.init_component(evalSpace) wxw = None else: # Определяем корневой элемент. Используем такое хитрое условие # по причине того, что в парсере компонента, ['_root_obj'] может # установить дочерний элемент, поскольку родительский еще не будет # прописан в пространстве имен в качестве корневого. if wxw and isParent: evalSpace['_root_obj'] = wxw return wxw except: io_prnt.outErr('ERROR USER TYPE PARSE: <%s> mod=<%s>' % (component['type'], modl))
def icBuildObject(parent, objRes, logType=0, evalSpace=None, bIndicator=False, id=None): """ Функция собирает объект по ресурсному описанию. @type parent: C{wx.Window} @param parent: Указатель на родительское окно, на котором располагаются другие компоненты. @type objRes: C{Dictionary} @param objRes: Словарь с описанием компонента. @type logType: C{int} @param logType: Тип лога (0 - консоль, 1- файл, 2- окно лога). @param evalSpace: Пространство имен, необходимых для вычисления внешних выражений. @type evalSpace: C{dictionary} @type bIndicator: C{bool} @param bIndicator: Признак отображения в ProgressBar-е. Иногда это не нужно - для создания объектов полученных по ссылки. Т. к. они не учтены при подсчете общего количества объектов. @param id: Идентификатор объекта. Если он не определен, то он генерируется автоматически. """ log.info(u'Сборка объекта <%s>' % objRes['name']) # Подготавливае пространство имен if evalSpace in [None, {}]: evalSpace = icwidget.icResObjContext() # Запоминаем указатель на родительское окно объекта evalSpace['_main_parent'] = parent evalSpace['_root_obj'] = None dlg = None # Устанавливаем режим работы формы # Тестовый режим if isTestMode(): evalSpace.setMode(util.IC_RUNTIME_MODE_TEST) # Признак режима графического редактора elif isEditorMode(): evalSpace.setMode(util.IC_RUNTIME_MODE_EDITOR) # Режим runtime else: evalSpace.setMode(util.IC_RUNTIME_MODE_USUAL) if bIndicator: # ---------------------------------------------------------------------- # Создаем индикатор процесса разбора ресурсного описания max_elements = CountResElements([objRes]) if max_elements > 50: max_elements += 10 progress.icOpenProgressBar( _('Create form: <%s>') % objRes['name'], 0, max_elements + 1) else: log.debug(_('Create form: <%s>') % objRes['name']) if parent: try: parent.type except: parent.type = 'ExternalWin' parent.components = {} # Создаем объект. if id: ids = [id] else: ids = None try: if parent and parent.type == 'ResEditor': obj = icResourceParser(None, [objRes], logType=logType, evalSpace=evalSpace, bCounter=bIndicator, ids=ids) # Корневой интерфейс может вернуть None if not obj: obj = evalSpace['_root_obj'] else: icResourceParser(parent, [objRes], logType=logType, evalSpace=evalSpace, bCounter=bIndicator, ids=ids) obj = evalSpace['_root_obj'] # Организуем очередь табуляции for ob in evalSpace['_dict_obj'].values(): if issubclass(ob.__class__, icwidget.icWidget) and ob.moveAfterInTabOrder: try: if ob.moveAfterInTabOrder in evalSpace['_dict_obj']: after = evalSpace['_dict_obj'][ob.moveAfterInTabOrder] ob.MoveAfterInTabOrder(after) except: io_prnt.outErr('CREATE TAB ORDER ERROR') # Посылаем сообщение о том, что форма создана для обычных объектов # Буфер объектов, которым сообщение onInit послано. Создаем буфер, чтобы # не посылать повторно сообщение из интерфейса post_buff_lst = [] for ob in evalSpace['_dict_obj'].values(): try: res = ob.GetResource() if 'onInit' in res and not res['onInit'] in ['', 'None', None]: ob.PostOnInitEvent() post_buff_lst.append(ob) except AttributeError: io_prnt.outWarning( '### PostOnInitEvent() AttributeError <resource> obj: <%s>' % str(ob)) # Для объектов входящих в составной объект if '_interfaces' in evalSpace: for key, ifs in evalSpace['_interfaces'].items(): for ob in ifs.getRegObjDict().values(): try: res = ob.GetResource() if ('onInit' in res and not res['onInit'] in ['', 'None', None] and ob not in post_buff_lst): ob.PostOnInitEvent() post_buff_lst.append(ob) except AttributeError: io_prnt.outWarning( '### PostOnInitEvent() AttributeError <resource> obj: <%s>' % ob) except: log.fatal(u'Создание формы (icBuildObject):') ic_dlg.icFatalBox(u'ОШИБКА', u'Создание формы (icBuildObject):') obj = None # Уничтожаем индикатор процесса if bIndicator: progress.icCloseProgressBar() else: log.debug(_('End create form: <%s>') % objRes['name']) return obj
def CreateForm(formName, fileRes=None, filter={}, bShow=False, logType=0, evalSpace=None, parent=None, formRes=None, bIndicator=True): """ Функция создает форму по заданому ресурсному описанию. @type formName: C{string} @param formName: Имя подсистемы и имя формы через '/'. Если имя подсистемы не указано, то используется стандартный механизм поиска ресурса. @type fileRes: C{string} @param fileRes: Путь к ресурсному файлу. Если путь указан отностиельный, то это интерпретируется как имя подсистемы. @type filter: C{dictionary} @param filter: Словарь фильтров на объекты данных. В качестве ключей используются алиасы объектов данных, в качестве занчений либо картеж, либо строковое выражение. Если картеж, то фильтрация производится по значению поля, если строка, то по SQL выражению специального вида. @type bShow: C{int} @param bShow: Признак того, что после создания объекта необходимо выполнить ф-ию Show(True). @type logType: C{int} @param logType: Тип лога (0 - консоль, 1- файл, 2- окно лога). @param evalSpace: Пространство имен, необходимых для вычисления внешних выражений. @type evalSpace: C{dictionary} @type parent: C{wx.Window} @param parent: Указатель на родительское окно. @type formRes: C{dictionary} @param formRes: Ресурсное описание формы, если оно задано, то форма строится по этому описанию, а параметр fileRes игнорируется. @type bIndicator: C{bool} @param bIndicator: Признак индикатора процесса на создание формы. @rtype: C{wx.Window} @return: Возвращает форму. """ log.info(u'Создание формы <%s>' % formName) try: frm = None # Если ресурсное описание не задано берем его из ресурсного файла if formRes is None: # По необходимости вычисляем имя ресурса if fileRes: fileRes = fileRes.replace('\\', '/') # Если указан абсолютный путь if ':' in fileRes: pathRes = fileRes # В противном случае интнрпретируем как относительный путь else: # Определяем текущий системный путь sys_path = resource.icGetSubsysResPaths()[0].replace( '\\', '/') pathRes = '/'.join( sys_path.split('/')[:-1]) + '/' + fileRes formRes = resource.icGetRes(formName, ext='frm', pathRes=pathRes, bRefresh=IS_TEST_MODE) else: formRes = resource.icGetRes(formName, ext='frm', bRefresh=IS_TEST_MODE, nameRes=formName) # Заполняем буфер фильтрами setDatasetFilterBuff(filter) frm = icBuildObject(parent, formRes, evalSpace=evalSpace, bIndicator=bIndicator) # Чистим буфер фильтров, чтобы он не влиял на работу icResourceParser в дальнейшем setDatasetFilterBuff({}) if bShow and frm is not None: frm.Show(True) if bShow == 2: return frm return None except KeyError: MsgBox( None, _('Form <%s> is not found in resource: <%s>') % (formName, fileRes)) except: io_prnt.outErr(_('Create form error')) return frm
def icCreateObject(ResName_, ResExt_, parent=None, context=None, subsys=None, className=None, **kwargs): """ Функция создает объект по имени и типу ресурса. @type ResName_: C{string} @param ResName_: Имя ресурса, по которому создается объект. @type ResExt_: C{string} @param ResExt_: Расширения ресурсного файла для данного ресурса. @param parent: Родитель объекта (если необходим). @return: Возвращает объект или None в случае ошибки. """ try: pathRes = None if subsys: pathRes = resource.getSubsysPath(subsys) if not className: className = ResName_ res = resource.icGetRes(className, ResExt_, pathRes=pathRes, nameRes=ResName_) if res: # Если определен словарь замен используем его for attr_name, value in kwargs.get('replace_dct', {}).items(): if attr_name not in ('type', 'style', 'name') and not attr_name.startswith('_'): if attr_name in res: res[attr_name] = value io_prnt.outLog(u'Замена атрибута [%s] ресурса <%s>' % (attr_name, ResName_)) else: # Если нет такого атрибута, значит это замена атрибутов дочернего объекта if isinstance(value, dict): res = resource.update_child_resource( attr_name, res, value) io_prnt.outLog( u'Замена атрибутов дочернего объекта [%s] ресурса <%s>' % (attr_name, ResName_)) else: io_prnt.outWarning( u'Не поддерживаемый тип %s замены ресурса дочернего объекта <%s>' % (type(value), attr_name)) if not context: context = icwidget.icResObjContext() return icBuildObject(parent, res, evalSpace=context, id=kwargs.get('id', None)) return None except: io_prnt.outErr('CREATE OBJECT ERROR: [%s . %s]' % (ResName_, ResExt_)) return None
def spravTable_cellSelect(obj, evt): """ Обработчик смены элемента дерева справочника.""" try: evalSpace = context = obj.GetContext() tree_grid = context.GetObject(SPR_TREE_NAME) sprav=tree_grid.get_sprav() old_cod=sprav.getPrevCode() grid=context.GetObject(SPR_GRID_NAME) grid.ClearSortPrz() #Внесено изменение if grid.GetDataset().isChanged(): if ic_dlg.icAskDlg(u'ВНИМАНИЕ!', u'В справочник были внесены изменения. Сохранить?')==wx.YES: onMouseClickSaveTool(obj) else: #Если отказались от изменений, то сбросить флаг изменения grid.GetDataset().set_change_prz(False) # Сбрасываем признак изменения таблицы #Выбранный код row = evt.GetRow() cod=tree_grid.get_sel_cod(row) or '' sprav.setCurCode(cod) #Сохранение внесенных изменений old_cod=cod level=sprav.getLevelByCod(cod) #Получить таблицу if cod == PREV_LEVEL_COD: level_tab=[] else: level_tab=[list(rec) for rec in sprav.getStorage().getLevelTable(cod)] if level_tab != None: dataset=grid.GetDataset() if dataset: dataset.SetDataBuff(level_tab) #Определение длины кода if level and cod: level_next=level.getNext() if level_next: len_cod=level_next.getCodLen() else: len_cod=-1 else: len_cod=sprav.getLevelByIdx(0).getCodLen() if len_cod>=0: if dataset: dataset.SetStructFilter({'cod':[cod,len_cod]}) #print '***** set filter:', {'cod':[cod,len_cod]} grid.RefreshGrid() grid.SetGridCursor(0,0) wx.CallAfter(tree_grid.SetFocus) lab = context.GetObject(SPR_LABEL_NAME) nms = ' ' for ind, nm in enumerate(tree_grid.cod_name_lst): if ind == 0: nms += u' %s' % nm else: nms += u' -> %s' % nm lab.SetLabel(nms) # row = tree_grid.GetGridCursorRow() # col = tree_grid.GetGridCursorCol() # tree_grid.SetGridCursor(row, col) #Поменять надписи колонок if level: context.GetObject(SPR_TREE_NAME).setColLabels(level.labelsNotice()) is_next_level=(level.isNext() or not cod) and cod != PREV_LEVEL_COD #context.GetObject(SPR_TREE_NAME).isRootSelected() context.GetObject('spravToolBar').enableTool('addTool',is_next_level) context.GetObject('spravToolBar').enableTool('delTool',is_next_level) context.GetObject('spravToolBar').enableTool('saveTool',is_next_level) if is_next_level and cod != PREV_LEVEL_COD: grid.Enable(True) if cod: grid.setColLabels(level.getNext().getNoticeDict()) else: grid.setColLabels(level.getNoticeDict()) else: grid.Enable(False) return old_cod except: io_prnt.outErr(u'Ошибка обработчика смены элемента дерева справочника.')
def onMouseClickFindTool(obj): """ Обработка нажатия кнопки поиск.""" try: return _find(obj) except: io_prnt.outErr(u'Ошибка обработчика конпки поиска в справочнике.')
def AppendToolByItem(self, ItemName_, Item_): """ Создать инструмент по пункту меню. @param ItemName_: Имя-идентификатор пункта меню. @param Item_: Объект пункта меню. @return: Возвращает указатель на инструмент или None в случае ошибки. """ try: # Проверка аргументов if Item_ is None and ItemName_ != '': # Новый пункт-разделитель self.AddSeparator() return None elif Item_ is None: return None tool_kind = Item_.GetKind() # Если новый пункт не разделитель, тогда это обычный пункт if tool_kind != wx.ITEM_SEPARATOR: # Добавить новый инструмент на панель tool_id = wx.NewId() tool_hint = Item_.GetHelp() # Определить образ if tool_kind != wx.ITEM_RADIO: tool_image = Item_.GetBitmap() else: tool_image = wx.ArtProvider_GetBitmap( wx.ART_TICK_MARK, wx.ART_OTHER, (16, 16)) tool = None if tool_kind == wx.ITEM_CHECK: tool = self.AddCheckTool(tool_id, tool_image, wx.NullBitmap, '', tool_hint) # Синхронизировать изображение self.ToggleTool(tool_id, Item_.IsChecked()) else: if tool_kind == wx.ITEM_RADIO: tool = self.AddRadioTool(tool_id, tool_image, wx.NullBitmap, '', tool_hint) # Синхронизировать изображение self.ToggleTool(tool_id, Item_.IsChecked()) else: if tool_kind == wx.ITEM_NORMAL: # Создать простой инструмент tool = self.AddSimpleTool(tool_id, tool_image, '', tool_hint) # Проверки на блокировку инструмента tool_enabled = Item_.IsEnabled() # Проверка на ограничение доступа к функциональному ресурсу # if not ic_acc.icCanAuthent(ic_acc.ACCESS_USE, ItemName_, ic_acc.ACC_MENUITEM, False): # tool_enabled = 0 self.EnableTool(tool_id, tool_enabled) # Установить обработчик self.Bind(wx.EVT_TOOL, self.OnToolItemClick, id=tool_id) # Прописать в реестре self.Register(tool, tool_id, ItemName_) # Установить взаимную связь инструмента и пункта меню self._tool_item[tool_id] = Item_ Item_.LinkTool(self, tool_id) return tool else: # Новый пункт-разделитель self.AddSeparator() return None return tool except: io_prnt.outErr(u'Ошибка создания инструмента %s по пункту меню!' % ItemName_) return None
def setControlValue(self, ctrl, value): """ Установить значение в найденный контрол. @param ctrl: Контрол. @param value: Значение кoнтрола. @return: True/False. """ result = False if hasattr(ctrl, 'setData'): # Обработка методом setData try: io_prnt.outLog( u'Заполнение данных объекта <%s> методом setData.' % ctrl.__class__.__name__) ctrl.setData(value) result = True except: io_prnt.outErr( u'Ошибка заполнения данных объекта <%s> методом setData. Значение <%s : %s>' % (ctrl.__class__.__name__, type(value), value)) result = False elif hasattr(ctrl, 'setValue'): # Обработка методом setValue try: io_prnt.outLog( u'Заполнение данных объекта <%s> методом setValue.' % ctrl.__class__.__name__) ctrl.setValue(value) result = True except: io_prnt.outErr( u'Ошибка заполнения данных объекта <%s> методом setValue. Значение <%s : %s>' % (ctrl.__class__.__name__, type(value), value)) result = False elif hasattr(ctrl, 'SetValue'): # Обработка методом SetValue try: if isinstance(ctrl, wx.DatePickerCtrl): # Преобразование типа для wxDatePickerCtrl if isinstance(value, datetime.date): value = ic_time.pydate2wxdate(value) elif isinstance(value, datetime.datetime): value = ic_time.pydatetime2wxdatetime(value) io_prnt.outLog( u'Заполнение данных объекта <%s> методом SetValue.' % ctrl.__class__.__name__) ctrl.SetValue(value) result = True except: io_prnt.outErr( u'Ошибка заполнения данных объекта <%s> методом SetValue. Значение <%s : %s>' % (ctrl.__class__.__name__, type(value), value)) result = False elif hasattr(ctrl, 'SetLabel'): # Обработка методом SetValue (Только для объектов wxStaticText) try: io_prnt.outLog( u'Заполнение данных объекта <%s> методом SetLabel.' % ctrl.__class__.__name__) value = ic_str.toUnicode(value) ctrl.SetLabel(value) result = True except: io_prnt.outErr( u'Ошибка заполнения данных объекта <%s> методом SetLabel. Значение <%s : %s>' % (ctrl.__class__.__name__, type(value), value)) result = False else: io_prnt.outWarning( u'Не определен метод заполнения данных объекта <%s>' % ctrl.__class__.__name__) return result
def Hlp(self, ParentCode=(None, ), field=None, form=None, parentForm=None, DateTime_=None, default_selected_code=None, view_fields=None, search_fields=None): """ Запуск визуального интерфейса просмотра, поиска и выбора значений поля или группы полей из отмеченной строки указанного справочника. @type ParentCode: C{...} @param ParentCode: Код более верхнего уровня. @param field: Задает поле или группу полей, которые надо вернуть. Полу задается строкой. Поля задаются словарем. @param form: имя формы визуального интерфейса работы со справочником. @param parentForm: Родительская форма. @type DateTime_: C{string} @param DateTime_: Время актуальности кода. @param default_selected_code: Выбранный код по умолчанию. Если None, то ничего не выбирается. @param view_fields: Список имен полей для просмотра. Если не определено то отображаются <Код> и <Наименование>. @param search_fields: Список имен полей для поиска. Если не определено то поиск только по <Код> и <Наименование>. @return: Код ошибки, Результат выбора """ result = IC_HLP_OK res_val = None try: if ParentCode is None: ParentCode = (None, ) # Для обработки необходимо преобразовать в список parent_code = list(ParentCode) # Запрашиваемый уровень x_level = parent_code.index(None) # Если запрашиваемый уровень больше общего количества уровней, то выйти # Нет такого уровня в справочнике if self.getLevelCount() <= x_level: io_prnt.outWarning(u'Не корректный номер уровня %d' % x_level) return IC_HLP_FAILED_LEVEL, res_val # определить длину кода уровня level_len = self.getLevels()[x_level].getCodLen() if level_len is None: ic_dlg.icMsgBox(u'ОШИБКА', u'Не определена длина кода уровня!') return IC_HLP_FAILED_LEVEL, res_val result = IC_HLP_FAILED # Определить форму выбора кода if form is None: form = self.getLevels()[x_level].getHelpFormName() # Если форма не определена в уровне, то # значит взять форму из описания справочник if form is None: form = self.getChoiceFormName() if not form: # Форма выбора не определена # обработка штатной функцией code = icspravchoicetreedlg.choice_sprav_dlg( parent=parentForm, nsi_sprav=self, fields=view_fields, default_selected_code=default_selected_code, search_fields=search_fields) if code: return IC_HLP_OK, code, self.getFields(field, code) return IC_HLP_FAILED_IGNORE, code, None # if form is None: # ic_dlg.icMsgBox(u'ОШИБКА', u'Не определена форма выбора кода!') # return False # Вывести окно и возвратить выбранный код self._hlp_param = { 'sprav_code': parent_code, 'sprav_field': field, } evsp = util.InitEvalSpace({'OBJ': self}) io_prnt.outLog(' .... begin:!!!!!') res_val = icResourceParser.ResultForm( form, evalSpace=evsp, parent=parentForm, bBuff=self.getAutoCacheFrm(), key=self.GetUUID() + '_' + self.ListCode2StrCode(parent_code)) if res_val is None: # Нажали ESC result = IC_HLP_FAILED_IGNORE elif type(res_val) in (list, tuple): return res_val else: result = IC_HLP_OK except: io_prnt.outErr(u'СПРАВОЧНИК [%s] Ошибка в методе Hlp' % self._name) result = IC_HLP_FAILED_TYPE_SPRAV return result, res_val, self.getFields(field, res_val)
def Ctrl(self, val, old=None, field='name', flds=None, bCount=True, cod='', DateTime_=None): """ Функция контроля наличия в справочнике значения поля с указанным значением. @type cod: C{string} @param cod: Начальная подстрока структурного кода, ограничивающая множество возможных кодов. @type val: C{...} @param val: Проверяемое значение. Если тип картеж, то это означает, что проверяем структурное значение (например иерархический код справочника). @type old: C{...} @param old: Старое значение. @type field: C{string} @param filed: Поле, по которому проверяется значение. @type flds: C{dictionary} @param flds: Словарь соответствий между полями определенного класса данных и полями справочника. Если контроль значения пройдет успешно, то соответствующие значения из справочника будут перенесены в поля класса данных. Пример: {'summa':'f1', 'summa2':'f2'} @type DateTime_: C{string} @param DateTime_: Время актуальности кода. @type bCount: C{string} @param bCount: признак того, что необходимо вести количество ссылок. @rtype: C{int} @return: Код возврата функции контроля. """ result = coderror.IC_CTRL_OK res_val = None try: storage = self.getStorage() level_tab = storage.getLevelTable(cod, DateTime_) # Список имен полей field_names = storage.getSpravFieldNames() # Словарь индексов field_indexes = dict([(item[1], item[0]) for item in enumerate(field_names)]) field_idx = field_indexes[field] # Перебор строк for rec in level_tab: if rec[field_idx] == val: # Перебор полей if flds and isinstance(flds, dict): res_val = dict([(item[0], rec[field_indexes[item[1]]]) for item in flds.items()]) else: res_val = None # Нашли запись и заполнили выходной словарь return result, res_val # Не найдено result = coderror.IC_CTRL_FAILED io_prnt.outLog('CTRL: NOT_FOUND val=%s' % val) except: io_prnt.outErr(u'СПРАВОЧНИК [%s] Ошибка контроля' % self.name) result = coderror.IC_CTRL_FAILED_TYPE_SPRAV return result, res_val
def Edit(self, ParentCode_=(None, ), ParentForm_=None): """ Запуск окна редактирования справочника/перечисления. @param ParentCode: Код более верхнего уровня. @param ParentForm_: Родительская форма. @return: Возвращает результат выполнения опереции True/False. """ try: if ParentCode_ is None: ParentCode_ = (None, ) # Для обработки необходимо преобразовать в список parent_code = list(ParentCode_) # Запрашиваемый уровень x_level = parent_code.index(None) parent_code_str = ''.join(parent_code[:x_level]) # Если запрашиваемый уровень больше общего количества уровней, то выйти # Нет такого уровня в справочнике if self.getLevelCount() <= x_level: io_prnt.outWarning(u'Не корректный номер уровня <%d>' % x_level) return False # определить длину кода уровня level_len = self.getLevels()[x_level].getCodLen() if level_len is None: ic_dlg.icMsgBox(u'ОШИБКА', u'Не определена длина кода уровня!') return False parent_len = len(parent_code_str) # Имя таблицы данных tab_name = self.getTableName() # Имя формы редактрования справочника/перечисления form = self.getLevels()[x_level].getEditFormName() # Если форма не определена в уровне, то # значит взять форму из описания справочник if form is None: form = self.getEditFormName() if not form: # Форма не определена return icspraveditdlg.edit_sprav_dlg(parent=ParentForm_, nsi_sprav=self) # if form is None: # ic_dlg.icMsgBox(u'ОШИБКА', u'Не определена форма редактирования уровня!') # return False sql = '''SELECT id FROM %s WHERE SUBSTR(%s.cod,1,%d) LIKE(\'%s\') AND LENGTH(SUBSTR(%s.cod,%d,LENGTH(%s.cod)-%d))=%d''' % ( tab_name, tab_name, parent_len, parent_code_str, tab_name, parent_len + 1, tab_name, parent_len, level_len) # Инициализация пространства имен формы редактирования справочника evsp = util.InitEvalSpace({'OBJ': self}) ok = icResourceParser.ResultForm( form, filter={tab_name: sql}, evalSpace=evsp, parent=ParentForm_, bBuff=self.getAutoCacheFrm(), key=self.GetUUID() + '_' + self.ListCode2StrCode(parent_code)) return ok except: io_prnt.outErr(u'СПРАВОЧНИК [%s] Ошибка редактирования' % self.name) return False
def OnSearchData(self, evt): """ Ищет поле удовлетворяющее запросу и устанавливает курсор на эту запись. """ if self.dataset is not None: try: val = self.nv_text_find.GetValue() rec = self.dataset.Recno() # Сообщение о том, что ведется поиск self.datasize.SetLabel(u' Поиск... ') self.datasize.Refresh() # Определяем поле, по которому будем искать значение objs = self.evalSpace['_has_source'].values() flt = [x for x in objs if x.source == self.source and x.type == 'GridDataset'] fld = None bVirtual = False if flt: col = flt[0].GetGridCursorCol() rec = flt[0].GetGridCursorRow() fields = [flt[0].GetTable().colNames[col]] if flt[0].GetTable().exCols[col]['attr'] in ['C', 'CR']: bVirtual = True else: flt = [x for x in objs if x.source == self.source and x.type == 'ListDataset'] if flt: fields = [flt[0].colNames[0]] rec = -1 if flt[0].exCols[0]['attr'] in ['C', 'CR']: bVirtual = True else: fields = None io_prnt.outLog(u'__# FIELDS IN SEARCH: %s' % fields) # Если определено поле if fields: # Если прошлый раз поиск по данному полю не удался, то поиск # ведем с первой записи if self._lastFindPar and not self._lastFindPar[0] and self._lastFindPar[1] == fields[0]: rec = 0 if self.dataset.dataclass is not None and not bVirtual: if val and val[0] != '%' and val[-1] != '%': val = '%'+val.strip()+'%' fld, cur = self.dataset.FindRowString(val, rec, fields) else: fld, cur = self.FindRowString(flt[0], val, rec, fields) self._lastFindPar = (fld, fields[0], cur) if fld is not None: self.dataset.Move(cur) self.cursor.SetValue(str(self.dataset.Recno())) self.UpdateViewFromDB() self.cursor.Refresh() self.nv_text_find.Refresh() self.datasize.SetLabel(u' из ' + str(self.dataset.getRecordCount() - 1) + u' ') self.datasize.Refresh() except: io_prnt.outErr(u'Error in search')
def __init__(self, Win_, MainMenu_, Name_, ToolBarStruct_, ResData_=None): """ Конструктор. """ icobject.icObject.__init__(self, Name_) # --- Свойства класса --- # Имя объекта self._Name = '' # ИМя ресурсного файла self._ResData = '' # Окно к которому прикриплено меню self._Window = None # Меню, к которой прикреплена панель инструментов self._MainMenu = None # Реестр всех инструментов (доступ можно производить по Id и по имени) self._register = {} # Функции пользователя (доступ можно производить по Id и по имени) # Действие при щелчке на инструменте self._tools_action = {} # Действия при отметке/разметке инструмента self._tools_check_on = {} self._tools_check_off = {} # Словарик связей инструментов с пунктами меню self._tool_item = {} try: # Расширение структуры до спецификации ToolBarStruct_ = ic.utils.ic_util.SpcDefStruct( SPC_IC_TOOLBAR, ToolBarStruct_) self._Name = Name_ self._ResData = ResData_ self._Window = Win_ self._MainMenu = MainMenu_ top = 0 left = 0 if RES_TOOL_POS in ToolBarStruct_ and ToolBarStruct_[RES_TOOL_POS]: left = ToolBarStruct_[RES_TOOL_POS][0] top = ToolBarStruct_[RES_TOOL_POS][1] pos = wx.Point(left, top) width = 0 height = 0 if RES_TOOL_SIZE in ToolBarStruct_ and ToolBarStruct_[ RES_TOOL_SIZE]: width = ToolBarStruct_[RES_TOOL_SIZE][0] height = ToolBarStruct_[RES_TOOL_SIZE][1] if width < 0 and height < 0: size = wx.Size(-1, 20) else: size = wx.Size(width, height) style = wx.TB_FLAT | wx.TB_DOCKABLE if RES_TOOL_ORIENTATION in ToolBarStruct_ and ToolBarStruct_[RES_TOOL_ORIENTATION] is not None and \ ToolBarStruct_[RES_TOOL_ORIENTATION] == VERT_ORIENT: style |= wx.TB_VERTICAL else: style |= wx.TB_HORIZONTAL title = '' if RES_TOOL_TITLE in ToolBarStruct_ and ToolBarStruct_[ RES_TOOL_TITLE] is not None: title = ToolBarStruct_[RES_TOOL_TITLE] # Вызов конструктора предка wx.ToolBar.__init__(self, self._Window, self._Window.GetId(), pos, size, style, self._Name) # Установить размеры картинок по высоте панели инструментов self.SetToolBitmapSize(wx.Size(size[1] - 4, size[1] - 4)) # По умолчанию панель инструментов не плавающая tool_float = 0 if RES_TOOL_FLOAT in ToolBarStruct_ and ToolBarStruct_[ RES_TOOL_FLOAT] is not None: tool_float = ToolBarStruct_[RES_TOOL_FLOAT] # Установить заголовок self.SetTitle(title) self.DoToolBar(ToolBarStruct_) except: io_prnt.outErr(u'Ошибка создания объекта панели инструментов %s!' % self._Name)