Esempio n. 1
0
    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
Esempio n. 2
0
 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'Ошибка создания инсталяционного пакета')
Esempio n. 3
0
 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
Esempio n. 4
0
    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
Esempio n. 5
0
    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
Esempio n. 6
0
 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
Esempio n. 7
0
    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
Esempio n. 8
0
    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
Esempio n. 9
0
    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
Esempio n. 10
0
 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
Esempio n. 11
0
 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')
Esempio n. 12
0
 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
Esempio n. 13
0
    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
Esempio n. 14
0
    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
Esempio n. 15
0
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
Esempio n. 16
0
    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
Esempio n. 17
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
Esempio n. 18
0
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))
Esempio n. 19
0
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
Esempio n. 20
0
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
Esempio n. 21
0
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
Esempio n. 22
0
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'Ошибка обработчика смены элемента дерева справочника.')
Esempio n. 23
0
def onMouseClickFindTool(obj):
    """ Обработка нажатия кнопки поиск."""
    try:
        return _find(obj)
    except:
        io_prnt.outErr(u'Ошибка обработчика конпки поиска в справочнике.')
Esempio n. 24
0
    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
Esempio n. 25
0
 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
Esempio n. 26
0
    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)
Esempio n. 27
0
    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
Esempio n. 28
0
    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
Esempio n. 29
0
    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')
Esempio n. 30
0
    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)