Ejemplo n.º 1
0
    def SetValue(self, value):
        """
        Функция преобразует входное значение в одно из значений списка (если это возможно)
        и установит его в качестве текущего. Преобразование производится через словарь
        замен _dictRepl.

        @type value: C{string}
        @param value: Устанавливаемое значение.
        """
        ret = False
        if self._itemsLst:
            for i, el in enumerate(self._itemsLst):
                if el[0] == value:
                    self.SetSelection(i)
                    return True
        elif self._dictRepl:
            try:
                val = self._dictRepl[value]
                ret = self.SetRealValue(val)
            except:
                self.SetSelection(-1)
                io_prnt.outLastErr(
                    'KeyError in icchoice.SetValue(val), val=%s' % value)
        else:
            ret = self.SetRealValue(value)

        return ret
Ejemplo n.º 2
0
    def __init__(self, parent, id=-1, component={}, logType=0, evalSpace={},
                 bCounter=False, progressDlg=None, sizer=None):
        """
        Конструктор для создания объекта icGridBagSizer.
        @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 sizer: C{icSizer}
        @param sizer: Ссылка на родительский сайзер.
        """
        icSpcDefStruct(SPC_IC_GRID_BAGSIZER, component)
        #   Кортеж задающий вид прокутки (bHoriz, bVert)
        self.enableScr = None
        icSizer.__init__(self, parent, id, component, logType, evalSpace, sizer=sizer)
        self.vgap = component['vgap']
        self.hgap = component['hgap']
        wx.GridBagSizer.__init__(self, component['vgap'], component['hgap'])

        self.minCellWidth = w = component['minCellWidth']
        self.minCellHeight = h = component['minCellHeight']

        self.SetEmptyCellSize((w, h))

        #   Максимальный номер строки и колонки
        self.maxRow = 0
        self.maxCol = 0

        #   Размеры колонок и рядов
        self.sizeCols = []
        self.sizeRows = []
        #   Создаем дочерние компоненты
        if 'child' in component:
            self.childCreator(bCounter, progressDlg)

        #   Устанавливаем колонки и ряды, которые подстраивают
        #   свои размеры под размеры родительского окна
        #   ВНИМАНИЕ! Эту операцию необходимо выполнять после
        #   добавления объектов в сайзер
        for col in component['flexCols']:
            try:
                self.AddGrowableCol(col)
            except:
                io_prnt.outLastErr('flexCols col=<%s>' % col)

        for row in component['flexRows']:
            self.AddGrowableRow(row)

        if parent:
            import ic.utils.graphicUtils as grph
            parent_bgr = parent.GetBackgroundColour()
            self.shape_clr = grph.AdjustColour2(parent_bgr, 7)
        else:
            self.shape_clr = icSizer.DESIGN_SHAPE_COLOR
Ejemplo n.º 3
0
    def OnLeftDown(self, evt):
        if self.bButton:
            self._buttonPress = True
            self.Refresh()

        if self.CanSort():
            if self.sortDirection == 0:
                self.sortDirection = -1
            elif self.sortDirection == -1:
                self.sortDirection = 1
            else:
                self.sortDirection = -1

            if self.GetParent().grid:
                try:
                    col = self.position[1]
                    self.GetParent().grid.SortCol(col, self.sortDirection)
                except:
                    io_prnt.outLastErr(u'Error in icheadergrid')

            self.Refresh()

            # Убираем признак сортировки у других колонок
            for obj in self.GetParent().parAddList:
                if obj.CanSort() and obj != self:
                    obj.sortDirection = 0
                    obj.Refresh()

        # --- onLeftDown
        self.evalSpace['evt'] = evt
        self.evalSpace['self'] = self
        if self.evalSpace['__runtime_mode'] != util.IC_RUNTIME_MODE_EDITOR:
            self.eval_attr('onLeftDown')
Ejemplo n.º 4
0
def doFilterBuilder(Parent_, Environment_, Default_=None):
    """
    Запустить редактор критериев выборки/фильтров.
    @param Parent_: Родительское окно редактора.
    @param Environment_: Структура окружения редактора.
    @param Default_: Структура по умолчанию.
    @return: Возвращает результат редактирования.    
    """
    try:
        dlg = icFilterBuilderDialog(Parent_,
                                    -1,
                                    style=wx.DEFAULT_DIALOG_STYLE
                                    | wx.RESIZE_BORDER)
        dlg.setEnvironment(Environment_)
        dlg.setEditResult(Default_)
        result = dlg.ShowModal()
        if result == wx.ID_OK:
            # Нажата кнопка OK в редакторе
            return dlg.getEditResult()
        else:
            # Нажата кнопка "Отмена"
            return None
    except:
        io_prnt.outLastErr(u'Ошибка запуска редактора критериев выбора.')
        return None
Ejemplo n.º 5
0
    def Add(self, obj, pos, span=(1, 1), flag = 0, border = 0):
        """
        Функция добавления в сайзер. Она переопределена для того, чтобы контролировать
        комопненты, которые добавляются, т. к. стандартные сайзеры этого делать не позволяют.
        """
        row, col = pos

        if row == -1:
            row = len(self.objectList)
            
        if col == -1:
            col = 0

        pos = (row, col)
        
        if obj.type == 'SizerSpace':
            bret = wx.GridBagSizer.Add(self, obj.size, pos, span, flag, border)
        else:
            bret = wx.GridBagSizer.Add(self, obj, pos, span, flag, border)

        if bret:
            obj.contaningSizer = self
            obj.span = span
            obj.position = pos
            obj.flag = flag
            obj.border = border
            obj.pt_dw = 0
            obj.pt_dh = 0
            
            self.objectList.append(obj)
        else:
            io_prnt.outLastErr('Error Add obj: <%s>' % obj)

        return bret
Ejemplo n.º 6
0
 def setLimitLabel(self, limit=None, over_limit=None):
     """
     Вывести сообщение об ограничении количества записей.
     @param limit: Ограничение количества записей.
     @param over_limit: Количество записей при привышении ограничения.
     """
     if over_limit:
         try:
             label = ERROR_LIMIT_LABEL_FMT % int(over_limit)
             self.limit_staticText.SetLabel(label)
             self.limit_staticText.SetForegroundColour(wx.RED)
             return
         except:
             io_prnt.outLastErr(u'Ошибка в setLimitLabel')
     if limit:
         # Есть ограничение, но не превышено
         try:
             label = DEFAULT_LIMIT_LABEL_FMT % int(limit)
             self.limit_staticText.SetLabel(label)
             fg = wx.SystemSettings.GetColour(wx.SYS_COLOUR_WINDOWTEXT)
             self.limit_staticText.SetForegroundColour(fg)
             return
         except:
             io_prnt.outLastErr(u'Ошибка в setLimitLabel')
     # Нет ограничений
     self.limit_staticText.SetLabel(u'')
Ejemplo n.º 7
0
 def GetTitle(self, indx):
     """
     Возвращет ссылку на нужную закладку.
     @type indx: C{int}
     @param indx: Индекс закладки.
     """
     try:
         return self.GetTitlesList()[indx]
     except:
         io_prnt.outLastErr('##?: GetTitle ERROR')
         return None
Ejemplo n.º 8
0
 def ConnectObjToTitle(self, indx, obj):
     """
     Привязывает объект к нужной странице.
     @type indx: C{int}
     @param indx: Индекс закладки.
     """
     try:
         titleObj = self.GetTitlesList()[indx]
         titleObj.ConnectObj(obj)
         if obj not in self._connectedObjList:
             self._connectedObjList.append(obj)
     except:
         io_prnt.outLastErr('###?: ConnectObjToTitle() ERROR')
Ejemplo n.º 9
0
def icFilterConstructorDlg(ParentWin_=None,
                           DefaultFilterData_=None,
                           Env_=None):
    """
    Функция вызова диалогового окна конструктора фильтров.
    @param ParentWin_: Родительское окно диалога конструктора фильтров.
    @param DefaultFilterData_: Фильтр по умолчанию.
    @param Env_: Окружение работы конструктора фильтров.
    """
    if Env_ is None:
        io_prnt.outWarning(
            u'Не определено окружение для конструктора фильтров')

        # Окружение должно быть обязательно
        try:
            Env_ = filter_builder_env.FILTER_ENVIRONMENT
        except:
            from . import filter_builder_env
            Env_ = filter_builder_env.FILTER_ENVIRONMENT

    dlg = None
    try:
        win_clear = False
        if ParentWin_ is None:
            id_ = wx.NewId()
            ParentWin_ = wx.Frame(None, id_, '')
            win_clear = True

        dlg = icFilterConstructorDialog(ParentWin_, DefaultFilterData_, Env_)
        if dlg.ShowModal() in (wx.ID_OK, ):
            result = dlg.getFilterData()
            dlg.Destroy()
            # Удаляем созданное родительское окно
            if win_clear:
                ParentWin_.Destroy()
            return result

    except:
        io_prnt.outLastErr(u'Ошибка конструктора фильтра')

    finally:
        if dlg:
            dlg.Destroy()

        # Удаляем созданное родительское окно
        if win_clear:
            ParentWin_.Destroy()

    return None
Ejemplo n.º 10
0
 def getChoiceSelectedCode(self, choice_ctrl, item=-1):
     """
     Получить выбранный код из контрола wx.Choice.
     @param choice_ctrl: Объект контрола.
     @param item: Индекс пункта, есл не определен, то
         имеется в виду выбранный пункт.
     @return: Строковый выбранный код.
     """
     if item < 0:
         item = choice_ctrl.GetSelection()
     try:
         return choice_ctrl.GetClientData(item)
     except:
         io_prnt.outLastErr(u'Не данных узла <%d>' % item)
     return None
Ejemplo n.º 11
0
    def GetCellRBPoint(self, row, col):
        """
        Возвращает координаты верхнего левого угла заданой ячейки.
        """
        if col < 0 or row < 0:
            return None

        dx, dy = self.GetPosition()
        try:
            for i in range(row):
                dy += wx.GridBagSizer.GetCellSize(self, i, col)
            for i in range(col):
                dx += wx.GridBagSizer.GetCellSize(self, row, i)
        except:
            io_prnt.outLastErr('icGridBagSizer.GetCellRBPoint')
                
        return wx.Point(dx, dy)
Ejemplo n.º 12
0
    def OnPreSelect(self, evt):
        """
        Обработчик события wx.EVT_LEFT_DOWN.
        """
        pos = evt.GetPosition()
        sx, sy = self.GetSize()

        # Определяем номер страницы, которая будет выбранна
        findx = self.GetTitleIndx(pos)

        # Обработчик пользователя
        rectList = wx.Rect(sx - IC_NB_SERV_ZONE + 2,
                           (IC_NB_HEIGHT - 8) / 2 - 1, 13, 12)
        rectNext = wx.Rect(sx - IC_NB_SERV_ZONE + 26, (IC_NB_HEIGHT - 8) / 2,
                           8, 8)
        rectPrev = wx.Rect(sx - IC_NB_SERV_ZONE + 17, (IC_NB_HEIGHT - 8) / 2,
                           8, 8)
        if findx >= 0 and self.SelectTitle(findx):
            pass
        elif rectNext.Inside(pos) and self.CanPressNext():
            self.SetFirstVisible(self.GetFirstVisible() + 1)

        elif rectPrev.Inside(pos) and self.CanPressPrev():
            self.SetFirstVisible(self.GetFirstVisible() - 1)

        elif rectList.Inside(pos) and (self.CanPressPrev()
                                       or self.CanPressNext()):
            menu = wx.Menu()
            id = 10000
            for indx, obj in enumerate(self.GetTitlesList()):
                if indx < self.GetFirstVisible() or indx > self.GetLastVisible(
                ):
                    item = wx.MenuItem(menu, id, obj.title)
                    if obj.bitmap:
                        try:
                            item.SetBitmap(obj.bitmap)
                        except:
                            io_prnt.outLastErr('')

                    menu.AppendItem(item)
                    self.Bind(wx.EVT_MENU, self.OnMenu, id=id)
                id += 1
            self.PopupMenu(menu, evt.GetPosition())
        else:
            evt.Skip()
Ejemplo n.º 13
0
 def design(self):
     """
     Запуск режима конструирования отчетов.
     """
     if os.path.exists(self._report_exec_filename):
         cmd = 'python2 %s --editor --path=%s &' % (
             self._report_exec_filename, self.getReportDir())
         try:
             io_prnt.outLog(u'Запуск внешней программы <%s>' % cmd)
             os.system(cmd)
         except:
             io_prnt.outLastErr(
                 u'Запуск программы <icReport> в режиме конструктора отчетов: <%s>'
                 % cmd)
     else:
         io_prnt.outWarning(
             u'Запускаемый модуль программы <icReport> : <%s> не найден' %
             self._report_exec_filename)
Ejemplo n.º 14
0
 def Show(self, bShow=True, activeTitle=None):
     """
     Показывает или скрывает компоненты привязанные к закладке.
     @type bShow: C{bool}
     @param bShow: Призка, который определяет скрывать или показывать компоненты.
     @type activeTitle: C{icTitle}
     @param activeTitle: Указывает на активную страницу. Это необходимо для того, чтобы
         не скрыть компонент активной страницы, в случае если компонент одновременно
         привязан к нескольким страницам.
     """
     for obj in self._objList:
         try:
             if not bShow and activeTitle and obj in activeTitle.GetConnectedObj(
             ):
                 pass
             else:
                 obj.Show(bShow)
         except:
             io_prnt.outLastErr('##?: Show Error')
Ejemplo n.º 15
0
 def post_select_action(self,
                        report_filename,
                        parent=None,
                        db_url=None,
                        sql=None,
                        command=None,
                        stylelib_filename=None,
                        variables=None):
     """
     Выбрать действие, которое хотим сделать с отчетом, после генерации отчета.
     @param report_filename: Имя файла шаблона отчета.
         Пути задаются относительно папки отчетов.
     @param parent: Родительское wxWindow окно для диалога.
         Если не указано, то береться wx.GetAppt().GetTopWindow().
     @param db_url: Connection string в виде url. Например
         postgresql+psycopg2://postgres:[email protected]:5432/realization.
     @param sql: Запрос SQL.
     @param command: Комманда после генерации. print/preview/export.
     @param stylelib_filename: Файл библиотеки стилей.
     @param variables: Словарь дополнительных переменных.
     @return: True/False.
     """
     if os.path.exists(self._report_exec_filename):
         cmd = 'python2 %s --select=%s --path=%s' % (
             self._report_exec_filename, report_filename,
             self.getReportDir())
         cmd = self._addCmdExtArgs(cmd, db_url, sql, command,
                                   stylelib_filename, variables)
         if isinstance(cmd, unicode):
             cmd = cmd.encode(config.DEFAULT_ENCODING)
         msg_cmd = ic_str.toUnicode(cmd, config.DEFAULT_ENCODING)
         try:
             io_prnt.outLog(u'Запуск внешней программы <%s>' % msg_cmd)
             os.system(cmd)
         except:
             io_prnt.outLastErr(
                 u'Запуск программы <icReport> в режиме выбора действия над отчетом отчета: <%s>'
                 % msg_cmd)
     else:
         io_prnt.outWarning(
             u'Запускаемый модуль программы <icReport> : <%s> не найден' %
             self._report_exec_filename)
Ejemplo n.º 16
0
    def AddCell(self, cell):
        """
        Функция добавляет ячейку заголовока.

        @type cell: C{string}
        @param cell: Компонент ячейки.
        """

        if cell.position == (-1, -1):
            pos = (0, len(self.parAddList))
        else:
            pos = cell.position

        try:
            self.sz.Add(cell, pos, cell.span, cell.add_style)
        except:
            io_prnt.outLastErr(u'ADD ERROR')

        self.parAddList.append(cell)
        self.parAddList.sort(sortCell)
        self.sz.Layout()
Ejemplo n.º 17
0
 def report_export(self,
                   report_filename,
                   db_url=None,
                   sql=None,
                   command=None,
                   stylelib_filename=None,
                   variables=None):
     """
     Запуск генерации отчета с конвертацией в офисную программу.
     @param report_filename: Имя файла шаблона отчета.
         Пути задаются относительно папки отчетов.
     @param db_url: Connection string в виде url. Например
         postgresql+psycopg2://postgres:[email protected]:5432/realization.
     @param sql: Запрос SQL.
     @param command: Комманда после генерации. print/preview/export.
     @param stylelib_filename: Файл библиотеки стилей.
     @param variables: Словарь дополнительных переменных.
     @return: True/False.
     """
     if os.path.exists(self._report_exec_filename):
         cmd = 'python2 %s --export=%s --path=%s' % (
             self._report_exec_filename, report_filename,
             self.getReportDir())
         cmd = self._addCmdExtArgs(cmd, db_url, sql, command,
                                   stylelib_filename, variables)
         if isinstance(cmd, unicode):
             cmd = cmd.encode(config.DEFAULT_ENCODING)
         msg_cmd = ic_str.toUnicode(cmd, config.DEFAULT_ENCODING)
         try:
             io_prnt.outLog(u'Запуск внешней программы <%s>' % msg_cmd)
             os.system(cmd)
         except:
             io_prnt.outLastErr(
                 u'Запуск программы <icReport> в режиме экспорта отчета: <%s>'
                 % msg_cmd)
     else:
         io_prnt.outWarning(
             u'Запускаемый модуль программы <icReport> : <%s> не найден' %
             self._report_exec_filename)
Ejemplo n.º 18
0
 def Draw(renderer, grid, cell_attr, dc, rect, row, col, isSelected):
     """
     Функция отрисовки значения данного типа в режиме просмотра в гриде.
     """
     bgr = renderer.backgroundColor
     icCombineEdt.Clear(dc, rect, bgr)
     style = grid.GetTable().GetValue(row, col)
     attr = grid.GetTable().GetValue(row, 0)
     attr = attr.strip()
     try:
         if attr in grid._styles_attr:
             styles = grid._styles_attr[attr]
             dict = basefuncs.getStyleDict(int(style), styles)
             text = ''
             for indx, key in enumerate(dict.keys()):
                 if dict[key] == 1:
                     text = text + ' | ' + key
             icCombineEdt.DrawText(renderer, grid, text[3:], dc, rect)
         else:
             icCombineEdt.DrawText(renderer, grid, style, dc, rect)
     except:
         io_prnt.outLastErr(u'ERROR')
         icCombineEdt.DrawText(renderer, grid, style, dc, rect)
Ejemplo n.º 19
0
    def AddToLoadMenu(self, MenuItems_):
        """
        Догрузить меню.
        @param MenuItems_: список имен пунктов меню.
        @return: Возвращает ссылку на объект меню или None в случае ошибки.
        """
        try:
            # Обработка всех пунктов по порядку
            for item_name in MenuItems_:
                # Загрузить структуру пункта
                if isinstance(self._ResData, str):
                    item_struct = ic_res.LoadObjStruct(
                        ic_res.RES_IDX_POPUP_ITEM, item_name, self._ResData)
                elif isinstance(self._ResData, dict):
                    item_struct = self._ResData[item_name]
                else:
                    io_prnt.outWarning(u'Ошибка загрузки меню:')
                    return None

                self.AppendMenuItem(self, item_name, item_struct)
            return self
        except:
            io_prnt.outLastErr(u'Ошибка загрузки меню:')
            return None
Ejemplo n.º 20
0
def setResAttr(res, typRes, name, attr, value, uuidLink=None, prntRes=None):
    """
    Функция ищет в ресурсе ресурс заданного типа и имени и устанавливает значение
    заданного атрибута. При этом генерируется новый UUID ресурса - половинка старого UUID
    складывается с половинкой ссылки.
    
    @type res: C{dictionary}
    @param res: Ресурсное описание, где происходить поиск.
    @type typRes: C{string}
    @param typRes: Тип ресурса, который ищется.
    @type name: C{string}
    @param name: Имя ресурного описаия компонента.
    @type attr: C{string}
    @param attr: Имя атрибута.
    @type value: C{...}
    @param value: Новое значение атрибута.
    @type uuidLink: C{string}
    @param uuidLink: Универсальный идентификатор ссылки.
    @type prntRes: C{dictionary}
    @param prntRes: Ресурсное описание родительского компонента-контейнера.
    @rtype: C{bool}
    @return: Признак того, что нужный атрибут найден и установлен. None означает,
        что компонет не имеет нужного атрибута.
    """
    if not isinstance(res, dict) or not res:
        return False

    #   Если нужный компонент нашли пытаемся установить атрибут
    res_name = None

    if 'type' in res and 'name' in res and res['type'] == typRes:
        if 'alias' in res and not res['alias'] in [None, '', 'None']:
            res_name = res['alias']
        else:
            res_name = res['name']

    if res_name == name:
        try:
            res[attr] = value

            if res['type'] == 'GridCell' and prntRes and uuidLink and '_uuid' in prntRes:
                nf = len(uuidLink) / 2
                prntRes['_uuid'] = prntRes['_uuid'][:nf] + uuidLink[nf:]

            elif uuidLink and '_uuid' in res:
                nf = len(uuidLink) / 2
                res['_uuid'] = res['_uuid'][:nf] + uuidLink[nf:]

            return True
        except:
            io_prnt.outLastErr(u'setResAttr ERROR')
            return None
    else:
        for key in res:
            #   Если значение атрибута словарь
            if isinstance(res[key], dict):
                bret = setResAttr(res[key], typRes, name, attr, value,
                                  uuidLink, res)

                if bret is None or bret:
                    return bret

            #   Если значение атрибута список
            elif isinstance(res[key], list):

                for r in res[key]:
                    if isinstance(r, dict):
                        bret = setResAttr(r, typRes, name, attr, value,
                                          uuidLink, res)

                        if bret is None or bret:
                            return bret
    return False
Ejemplo n.º 21
0
    def HlpDlg(parent,
               attr,
               value,
               pos=wx.DefaultPosition,
               size=wx.DefaultSize,
               style=0,
               *arg,
               **par):
        """
        Диалоговое окно для редактирования словаря в текстовом редакторе.
        @type parent: C{wx.Window}
        @param parent: Указатель на родительское окно (грид).
        @type attr: C{string}
        @param attr: Имя текущего атрибута.
        @type value: C{string}
        @param value: Текущее значение.
        @type pos: C{wx.Point}
        @param pos: Расположение диалога на гриде.
        @type size: C{wx.Size}
        @param size: Размер диалогового окна.
        @type style: C{int}
        @param style: Стиль диалогового окна.
        @type par: C{dictionary}
        @param par: Словарь дополнительных именованных параметров. <attr> - имя атрибута,
            <uuid_attr> - старый UUID атрибута, <bEnable=True> - признак режима редактирования.
        @rtype: C{tuplpe}
        @return: Первый элемент признак редактирования, второй текст, третий новый uuid.
        """
        from ic.PropertyEditor import ic_pyed
        text = value
        uuid_attr = par['uuid_attr']

        if 'bEnable' in par:
            bEnable = par['bEnable']
        else:
            bEnable = True

        try:
            # Определяем смещение видимой части окна
            old = text
            x, y = pos
            sx, sy = size
            if sx < 450:
                size = (450, sy)

            pos = parent.ClientToScreenXY(x, y)
            dlg = ic_pyed.icPyEditorDlg(parent, text, pos, size, style=style)
            if not bEnable:
                dlg.editor.SetReadOnlyMode()

            ret = dlg.ShowModal()
            prz = False
            if ret == wx.ID_OK:
                # Генерируем новый UUID
                old_uuid = uuid_attr
                if bEnable:
                    text = dlg.editor.GetText()
                    # Если текст изменился генерируем новый uuid
                    if old != text:
                        prz = True
                        uuid_attr = ic_uuid.get_uuid()
            if dlg:
                dlg.Destroy()
        except:
            io_prnt.outLastErr(u'icTextDictEdt HlpDlg ERROR')

        return prz, text, uuid_attr
Ejemplo n.º 22
0
    def GenerateModText(self):
        """
        Генерирует текст модуля.
        """
        first = self.GetPrev().GetPrev()
        dct = first.sizer.evalSpace['_dict_obj']
        spc = {}
        spc['__events__'] = {}
        spc['__attr_types__'] = {}
        spc['__parent__'] = 'icwidget.SPC_IC_WIDGET'

        #   Читаем атрибуты пользовательского класса
        attrGrid = self.GetPrev().sizer.evalSpace['_dict_obj']['AttrGrid']
        lr = attrGrid.GetDataset().getRecordCount()

        for row in range(lr):
            key = attrGrid.getNameValue('name', row)
            typ = attrGrid.getNameValue('type', row)
            val = attrGrid.getNameValue('defaultVal', row)
            spc[key] = value = icDefInf.strToVal(typ, val)

            try:
                id_type = getattr(icDefInf, typ)
                if id_type in spc['__attr_types__']:
                    spc['__attr_types__'][id_type].append(key)
                else:
                    spc['__attr_types__'][id_type] = [key]
            except:
                io_prnt.outLastErr(u'Set Attribute Type')

        #   Читаем атрибуты обработчиков сообщений
        msgGrid = self.sizer.evalSpace['_dict_obj']['MsgGrid']
        lr = msgGrid.GetDataset().getRecordCount()

        for row in range(lr):
            key = msgGrid.getNameValue('name', row)
            typ = msgGrid.getNameValue('type', row)
            func = msgGrid.getNameValue('function', row)
            prz = msgGrid.getNameValue('przCommand', row)

            if not func:
                func = None

            spc['__events__'][key] = (typ, func, prz)
            if icDefInf.EDT_PY_SCRIPT in spc['__attr_types__']:
                spc['__attr_types__'][icDefInf.EDT_PY_SCRIPT].append(key)
            else:
                spc['__attr_types__'][icDefInf.EDT_PY_SCRIPT] = [key]

            spc[key] = None

        #   Если установлен признак контейнера
        if self.GetPrev(
        ).sizer.evalSpace['_dict_obj']['przContainer'].IsChecked():
            spc['child'] = []

        discr = {
            'module_name': dct['TextModulName'].GetValue(),
            'class_name': dct['TextClassName'].GetValue(),
            'purpose': dct['TextDiscr'].GetValue(),
            'author': dct['TextAuthor'].GetValue(),
            'created': 'class:',
            'Id': '',
            'copyright': dct['TextCopyright'].GetValue(),
            'import': dct['TextParentModule'].GetValue(),
            'parent_class': dct['TextParentClass'].GetValue(),
            'icon': dct['TextIcon'].GetValue(),
            'doc': '\'%s\'' % dct['TextDoc'].GetValue(),
            'contain': '[]',
            'not_contain': 'None',
            'spc_description': None,
            'spc': spc,
            'styles': '{\'DEFAULT\':0}',
            'init_arg': '*args, **kwargs',
            'bind_events': None,
            'events_function': None
        }

        text_mod = CreatUserClass(discr)
        return text_mod
Ejemplo n.º 23
0
    def __init__(self,
                 parent,
                 id,
                 component,
                 logType=0,
                 evalSpace=None,
                 bCounter=False,
                 progressDlg=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: Указатель на идикатор создания формы.
        """
        component = util.icSpcDefStruct(self.component_spc, component)
        icwidget.icWidget.__init__(self, parent, id, component, logType,
                                   evalSpace)

        #   По спецификации создаем соответствующие атрибуты (кроме служебных атрибутов)
        lst_keys = [x for x in component.keys() if x.find('__') != 0]
        for key in lst_keys:
            setattr(self, key, component[key])

        #   Локализуем подписи закладок
        if self.isLocaleTitles:
            self.titles = [_(el) for el in self.titles]
        #   Цвета текста и фона
        self.bgr = bgr = component['backgroundColor'] or (100, 100, 100)
        self.fgr = fgr = component['foregroundColor']

        # -----------------------------------------------------------
        style = wx.ST_NO_AUTORESIZE | wx.NO_BORDER
        parentModule.PyControl.__init__(self,
                                        parent,
                                        id,
                                        self.position,
                                        self.size,
                                        style,
                                        name=self.name)
        # -----------------------------------------------------------
        self.SetAutoLayout(True)

        #   Устанавливаем шрифт
        if not self.font:
            font = parent.GetFont()
            if not font.Ok():
                font = wx.SystemSettings.GetFont(wx.SYS_DEFAULT_GUI_FONT)
            self.passiveFont = font
        else:
            self.passiveFont = icfont.icFont(self.font)

        parentModule.PyControl.SetFont(self, self.passiveFont)
        #   Устанавливаем цвета
        if bgr:
            self.SetBackgroundColour(bgr)
        if fgr:
            self.SetForegroundColour(fgr)

        #   Размер
        rw, rh = self.size
        self.SetSize(wx.Size(rw, IC_NB_HEIGHT + 3))

        # ----------------------------------------------
        #   Регистрация обработчиков событий
        self.Bind(wx.EVT_LEFT_UP, self.OnSelectTitle)
        self.Bind(wx.EVT_LEFT_DOWN, self.OnPreSelect)
        self.Bind(wx.EVT_MOTION, self.OnMove)
        self.Bind(wx.EVT_PAINT, self.OnPaint)
        self.Bind(wx.EVT_LEAVE_WINDOW, self.OnLeave)
        self.BindICEvt()
        # ----------------------------------------------
        self.clientPanel = self

        #   Признаки, определяющие можно нажать кнопки Next, Prev
        self._canNext = False
        self._canPrev = False
        #   Список закладок
        self._tilesObjList = []
        #   Индекс первой видимой закладки
        self._firstVisible = 0
        #   Индекс последней видимой закладки
        self._lastVisible = -1
        #   Индекс активной закладки
        self._selected = 0
        #   Список присоединеных объектов
        self._connectedObjList = []
        #   Указатель на окно подсказки
        self._helpWin = None
        self._lastHelp = -1

        self.path = self.getICAttr('path')
        if not self.path:
            self.path = os.getcwd()

        self.path = self.path.replace('\\', '/')
        if self.path[-1] != '/':
            self.path += '/'

        #   Наполняем панель закладками
        for indx, title in enumerate(self.titles):
            img = None
            if indx < len(self.images):
                filename = self.path + self.images[indx]
                bmptype = icbitmap.icBitmapType(filename)
                if bmptype is not None and os.path.isfile(filename):
                    img = wx.Image(filename, bmptype).ConvertToBitmap()

            self.AddTitle(title, img=img)

        #   Создаем дочерние компоненты
        if 'child' in component:
            self.childCreator(bCounter, progressDlg)
            #   Привязвыаем объекты к панели закладок
            for indx, spc in enumerate(self.child):
                try:
                    #   Если описанием подключаемого объекта является группа,
                    #   то к закладке подключаются объекты из группы
                    if spc['type'] == 'Group':
                        for spc_grp in spc['child']:
                            obj = self.evalSpace['_dict_obj'][spc_grp['name']]
                            if obj not in self.GetConnectedObjLst():
                                self.ConnectObjToTitle(indx, obj)
                    else:
                        obj = self.evalSpace['_dict_obj'][spc['name']]
                        if obj not in self.GetConnectedObjLst():
                            self.ConnectObjToTitle(indx, obj)
                except:
                    io_prnt.outLastErr('')
        self.SelectTitle()