Ejemplo n.º 1
0
class GridCellPopupMenu(wx.Menu):

    def __init__(self, header=None):
        wx.Menu.__init__(self)
        self.fileOperations = FileOperations()

        copyItem = wx.MenuItem(self, wx.NewIdRef(), "Copy")
        copyItem.SetBitmap(self.fileOperations.getImageBitmap(imageName="copy_edit_co.png"))
        copyItemMenu = self.Append(copyItem)
        self.Bind(wx.EVT_MENU, lambda e: self.onCopySelection(e), copyItemMenu)

        pasteItem = wx.MenuItem(self, wx.NewIdRef(), "Paste")
        pasteItem.SetBitmap(self.fileOperations.getImageBitmap(imageName="paste_edit.png"))
        pasteItemMenu = self.Append(pasteItem)
        self.Bind(wx.EVT_MENU, lambda e: self.onPasteSelection(e), pasteItemMenu)

        exportItem = wx.MenuItem(self, wx.NewIdRef(), "Export...")
        exportItem.SetBitmap(self.fileOperations.getImageBitmap(imageName="table_export.png"))
        exportItemMenu = self.Append(exportItem)
        self.Bind(wx.EVT_MENU, self.onExport, exportItemMenu)

        resultSetCountItem = wx.MenuItem(self, wx.NewIdRef(), "Count rows")
        resultSetCountItem.SetBitmap(self.fileOperations.getImageBitmap(imageName="resultset_count.png"))
        resultSetCountItemMenu = self.Append(resultSetCountItem)
        self.Bind(wx.EVT_MENU, self.countRows, resultSetCountItemMenu)

    def onPasteSelection(self, event):
        logger.info('onPasteSelection')
        self.GetWindow().paste()
#         print "Item Two selected in the %s window" % self.WinName

    def onCopySelection(self, event):
        logger.info('onCopySelection')
        self.GetWindow().copy()
#         print "Item Two selected in the %s window" % self.WinName

    def onExport(self, event):
        logger.info('onExport')
#         print "Item Two selected in the %s window" % self.WinName
        pass

    def countRows(self, event):
        logger.info(f'countRows: {self.GetWindow().GetNumberRows()}')
        dlg = wx.MessageDialog(self.GetWindow(), f'Row count :  {self.GetWindow().GetNumberRows()}',
                       'Row Count',
                       wx.OK | wx.ICON_INFORMATION
                       # wx.YES_NO | wx.NO_DEFAULT | wx.CANCEL | wx.ICON_INFORMATION
                       )
        dlg.ShowModal()
        dlg.Destroy()
Ejemplo n.º 2
0
class PropertiesBaseTreePanel(ExpansionState, TreeCtrl):
    '''
    Left navigation tree in preferences page
    '''

    def __init__(self, parent):
         
        TreeCtrl.__init__(self, parent, style=wx.TR_DEFAULT_STYLE | 
                               wx.TR_HAS_VARIABLE_ROW_HEIGHT | wx.BORDER_NONE)
        
        self._il = None
        self.BuildTreeImageList()
        
#         if USE_CUSTOMTREECTRL:
#             self.SetSpacing(10)
#             self.SetWindowStyle(self.GetWindowStyle() & ~wx.TR_LINES_AT_ROOT)

        self.SetInitialSize((100, 80))
            
    def AppendItem(self, parent, text, image=-1, wnd=None):

        item = TreeCtrl.AppendItem(self, parent, text, image=image)
        return item
            
    def BuildTreeImageList(self):
#         imgList = wx.ImageList(16, 16)
# 
#         for png in _demoPngs:
#             imgList.Add(catalog[png].GetBitmap())
#             
#         # add the image for modified demos.
#         imgList.Add(catalog["custom"].GetBitmap())
# 
#         self.AssignImageList(imgList)
        if self._il:
            self._il.Destroy()
            self._il = None
        self._il = wx.ImageList(16, 16)
        self.SetImageList(self._il)
        
        self.ImageList.RemoveAll()
        self.iconsDictIndex = {}
        count = 0
        self.fileOperations = FileOperations()
        for imageName in ['preference.png', 'folder.png', 'folder_view.png', 'fileType_filter.png', 'usb.png', 'stop.png',
                          'java.png', 'python_module.png', 'xml.png', 'folderType_filter.png']:
            self.ImageList.Add(self.fileOperations.getImageBitmap(imageName=imageName))
            self.iconsDictIndex[imageName] = count
            count += 1

    def GetItemIdentity(self, item):
        return self.GetItemData(item)

    def Freeze(self):
        if 'wxMSW' in wx.PlatformInfo:
            return super(PropertiesBaseTreePanel, self).Freeze()
                         
    def Thaw(self):
        if 'wxMSW' in wx.PlatformInfo:
            return super(PropertiesBaseTreePanel, self).Thaw()
Ejemplo n.º 3
0
class MySplashScreen(SplashScreen):

    def __init__(self):
#         bmp = wx.Image(opj("../images/splash.png")).ConvertToBitmap()
        self.fileOperations = FileOperations()
        bmp = self.fileOperations.getImageBitmap(imageName="splash.png")
        SplashScreen.__init__(self, bmp,
                                 wx.adv.SPLASH_CENTRE_ON_SCREEN | wx.adv.SPLASH_TIMEOUT,
                                 2000, None, -1)
        self.Bind(wx.EVT_CLOSE, self.OnClose)
        self.fc = wx.CallLater(1, self.ShowMain)

    def OnClose(self, evt):
        # Make sure the default handler runs too so this window gets
        # destroyed
        evt.Skip()
        self.Hide()

        # if the timer is still running then go ahead and show the
        # main frame now
        if self.fc.IsRunning():
            self.fc.Stop()
            self.ShowMain()

    def ShowMain(self):
        frame = EclipseMainFrame(None)
        frame.Show()
        if self.fc.IsRunning():
            self.Raise()
Ejemplo n.º 4
0
class HeaderPanel(wx.Panel):
    def __init__(self,
                 parent,
                 *args,
                 title="Python Project",
                 subTitle='',
                 imageName='python-wizban.png',
                 selectedPath=None,
                 **kw):
        wx.Panel.__init__(self, parent, id=-1)

        vBox = wx.BoxSizer(wx.VERTICAL)
        hBox = wx.BoxSizer(wx.HORIZONTAL)
        self.SetBackgroundColour(wx.WHITE)
        self.fileOperations = FileOperations()
        headerText = wx.StaticText(self, -1, title, (20, 10))
        font = wx.Font(10, wx.FONTFAMILY_SCRIPT, wx.FONTSTYLE_NORMAL,
                       wx.FONTWEIGHT_BOLD)
        headerText.SetFont(font)

        subTitleText = wx.StaticText(self, -1, subTitle, (20, 10))

        bmp = self.fileOperations.getImageBitmap(imageName=imageName)
        rightsImage = wx.StaticBitmap(self, -1, bmp, (80, 150))
        vBox1 = wx.BoxSizer(wx.VERTICAL)
        vBox1.Add(headerText, 1, wx.EXPAND | wx.LEFT, 10)
        vBox1.Add(subTitleText, 1, wx.EXPAND | wx.LEFT, 15)
        hBox.Add(vBox1, 1, wx.EXPAND, 0)
        hBox.Add(rightsImage, 0, wx.EXPAND, 0)
        vBox.Add(hBox, 0, wx.EXPAND, 0)
        vBox.Add(wx.StaticLine(self, -1), 0, wx.EXPAND | wx.ALL, 0)
        self.SetSizer(vBox)
        self.SetAutoLayout(True)
Ejemplo n.º 5
0
class SelectWorkspaceFrame(wx.Frame):
    '''
    This is for select workspace
    '''
    def __init__(self,
                 parent,
                 title,
                 titleHead='',
                 subTitle='',
                 size=(550, 400),
                 style=wx.DEFAULT_FRAME_STYLE | wx.NO_FULL_REPAINT_ON_RESIZE
                 | wx.SUNKEN_BORDER | wx.STAY_ON_TOP):
        style = style & (~wx.MINIMIZE_BOX)
        self.parent = parent
        wx.Frame.__init__(self, None, -1, title, size=size, style=style)
        self.title = title
        self.Bind(wx.EVT_CLOSE, self.OnCloseFrame)
        self.SetMinSize((100, 100))
        self.fileOperations = FileOperations()
        # set frame icon
        icon = wx.Icon()
        icon.CopyFromBitmap(
            self.fileOperations.getImageBitmap(imageName='eclipse16.png'))
        self.SetIcon(icon)
        sizer = wx.BoxSizer(wx.VERTICAL)
        #         self.buttonPanel = CreateButtonPanel(self)
        ####################################################################
        self.newFileFrame = NewFilePanel(self,
                                         title=titleHead,
                                         subTitle=subTitle)
        ####################################################################
        sizer.Add(self.newFileFrame, 1, wx.EXPAND)
        #         sizer.Add(self.buttonPanel, 0, wx.EXPAND)
        self.Bind(wx.EVT_CHAR_HOOK, self.OnKeyUP)
        self.SetSizer(sizer)
        self.Center()
        #         self.createStatusBar()
        self.Show(True)


#         self.Bind(wx.EVT_SIZE, self.OnSize)

    def OnKeyUP(self, event):
        #         print "KEY UP!"
        keyCode = event.GetKeyCode()
        if keyCode == wx.WXK_ESCAPE:
            self.Close()
        event.Skip()

    def OnCloseFrame(self, event):
        self.Destroy()

    def OnSize(self, event):
        hsize = event.GetSize()
        logger.debug(hsize)
Ejemplo n.º 6
0
class NewProjectFrame(wx.Frame):
    '''
    This is for new file and new folder.
    '''

    def __init__(self, parent, title, selectedPath=None, size=(350, 420),
                 style=wx.DEFAULT_FRAME_STYLE | wx.NO_FULL_REPAINT_ON_RESIZE | wx.SUNKEN_BORDER | wx.STAY_ON_TOP):
        style = style & (~wx.MINIMIZE_BOX)
        self.parent = parent
        wx.Frame.__init__(self, None, -1, title, size=size,
                          style=style)
        self.title = title
        self.Bind(wx.EVT_CLOSE, self.OnCloseFrame)
        self.SetMinSize((100, 100))
        self.fileOperations = FileOperations()
        # set frame icon
        icon = wx.Icon()
        icon.CopyFromBitmap(self.fileOperations.getImageBitmap(imageName='eclipse16.png'))
        self.SetIcon(icon)
        sizer = wx.BoxSizer(wx.VERTICAL)
#         self.buttonPanel = CreateButtonPanel(self)
        ####################################################################
        self.newPythonFrame = NewPythonPanel(self, title=title, selectedPath=selectedPath)
        self.buttons = CreateButtonPanel(self)
        ####################################################################
        sizer.Add(self.newPythonFrame, 1, wx.EXPAND)
        sizer.Add(wx.StaticLine(self, -1), 0, wx.EXPAND | wx.ALL, 0)
        sizer.Add(self.buttons, 0, wx.EXPAND | wx.ALL , 0)
        self.Bind(wx.EVT_CHAR_HOOK, self.OnKeyUP)
        self.SetSizer(sizer)
        self.Center()
#         self.createStatusBar()
        self.Show(True)

#         self.Bind(wx.EVT_SIZE, self.OnSize)
    def OnKeyUP(self, event):
#         print "KEY UP!"
        keyCode = event.GetKeyCode()
        if keyCode == wx.WXK_ESCAPE:
            self.Close()
        event.Skip()

    def OnCloseFrame(self, event):
        try:
            self.parent.refreshNode()
        except Exception as e:
            logger.error(e)
        self.Destroy()

    def OnSize(self, event):
        hsize = event.GetSize()
        logger.debug(hsize)
Ejemplo n.º 7
0
class OtherViewTreeFrame(wx.Frame):
    def __init__(self,
                 parent,
                 title,
                 size=(313, 441),
                 style=wx.DEFAULT_FRAME_STYLE | wx.NO_FULL_REPAINT_ON_RESIZE
                 | wx.SUNKEN_BORDER | wx.STAY_ON_TOP):
        style = style & (~wx.MINIMIZE_BOX)
        wx.Frame.__init__(self, parent, -1, title, size=size, style=style)

        self.Bind(wx.EVT_CLOSE, self.OnCloseFrame)
        self.SetMinSize((100, 100))
        self.fileOperations = FileOperations()
        # set frame icon
        icon = wx.Icon()
        icon.CopyFromBitmap(
            self.fileOperations.getImageBitmap(imageName='eclipse16.png'))
        self.SetIcon(icon)

        sizer = wx.BoxSizer(wx.VERTICAL)
        self.buttonPanel = CreateButtonPanel(self)
        ####################################################################

        self.otherViewTreePanel = OtherViewTreePanel(self)
        ####################################################################

        sizer.Add(self.otherViewTreePanel, 1, wx.EXPAND)
        sizer.Add(self.buttonPanel, 0, wx.EXPAND)
        self.Bind(wx.EVT_CHAR_HOOK, self.OnKeyUP)
        self.SetSizer(sizer)
        self.Center()
        #         self.createStatusBar()
        self.Show(True)


#         self.Bind(wx.EVT_SIZE, self.OnSize)

    def OnKeyUP(self, event):
        #         print "KEY UP!"
        keyCode = event.GetKeyCode()
        if keyCode == wx.WXK_ESCAPE:
            self.Close()
        event.Skip()

    def OnCloseFrame(self, event):
        self.Destroy()

    def OnSize(self, event):
        hsize = event.GetSize()
        logger.debug(hsize)
Ejemplo n.º 8
0
class SqlQueryFrame(wx.Frame):
    def __init__(self,
                 parent,
                 Id=wx.ID_ANY,
                 Title="",
                 sqlText=None,
                 pos=wx.DefaultPosition,
                 size=wx.DefaultSize,
                 style=wx.DEFAULT_FRAME_STYLE | wx.SUNKEN_BORDER
                 | wx.STAY_ON_TOP):
        style = style & (~wx.MINIMIZE_BOX)
        wx.Frame.__init__(self, parent, Id, Title, pos, size, style)

        self.fileOperations = FileOperations()
        # set frame icon
        icon = wx.Icon()
        icon.CopyFromBitmap(
            self.fileOperations.getImageBitmap(imageName='eclipse16.png'))
        self.SetIcon(icon)
        sizer = wx.BoxSizer(wx.VERTICAL)
        ####################################################################

        self.sqlQueryPanel = SqlQueryPanel(self, sqlText)
        ####################################################################

        sizer.Add(self.sqlQueryPanel, 1, wx.EXPAND)
        self.BindEvents()
        self.Show(show=True)

    def BindEvents(self):
        #         self.Bind(wx.EVT_BUTTON, self.OnCloseMe, button)
        self.Bind(wx.EVT_CLOSE, self.OnCloseWindow)
        self.Bind(wx.EVT_CHAR_HOOK, self.OnKeyUP)

    def OnCloseWindow(self, event):
        #         self._mgr.UnInit()
        event.Skip()
        self.Destroy()

    def OnKeyUP(self, event):
        #         print "KEY UP!"
        keyCode = event.GetKeyCode()
        if keyCode == wx.WXK_ESCAPE:
            self.Close()
        event.Skip()
Ejemplo n.º 9
0
class CreateButtonPanel(wx.Panel):

    def __init__(self, parent=None, *args, **kw):

        wx.Panel.__init__(self, parent, id=-1)

        self.parent = parent
        self.fileOperations = FileOperations()
        sizer = wx.BoxSizer(wx.VERTICAL)
        hbox = wx.BoxSizer(wx.HORIZONTAL)
        self.openWithButton = wx.Button(self, wx.NewIdRef(), "Open Wit&h", size=(95, 26))
        self.showInButton = wx.Button(self, wx.NewIdRef(), "Show In", size=(95, 26))
        okButton = wx.Button(self, wx.NewIdRef(), "Open", size=(90, 26))
        okButton.SetToolTip("Execute script to create table.")
        self.Bind(wx.EVT_BUTTON, self.onOkClick, okButton)
        self.Bind(wx.EVT_BUTTON, self.onOpenWithButton, self.openWithButton)
        self.Bind(wx.EVT_BUTTON, self.onShowInButton, self.showInButton)

        cancelButton = wx.Button(self, wx.NewIdRef(), "Cancel", size=(90, 26))
        cancelButton.SetToolTip("Execute script to create table.")
        self.Bind(wx.EVT_BUTTON, self.onCancelButtonClick, cancelButton)

        self.openWithButton.SetBitmap(self.fileOperations.getImageBitmap(imageName='button_menu.png'),
#                     wx.LEFT    # Left is the default, the image can be on the other sides too
                    wx.RIGHT
                    # wx.TOP
                    # wx.BOTTOM
                    )
        self.showInButton.SetBitmap(self.fileOperations.getImageBitmap(imageName='button_menu.png'),
#                     wx.LEFT    # Left is the default, the image can be on the other sides too
                    wx.RIGHT
                    # wx.TOP
                    # wx.BOTTOM
                    )
        hbox.Add(self.showInButton)
        hbox.Add(self.openWithButton)
        hbox.Add(okButton)
        hbox.Add(cancelButton)
#         sizer.Add(cancelButton, 0, wx.ALIGN_RIGHT | wx.RIGHT | wx.BOTTOM)
        sizer.Add(hbox, 0, wx.ALIGN_RIGHT | wx.RIGHT | wx.BOTTOM, 5)
#         sizer.Add(vBox, 1, wx.EXPAND , 0)
        self.SetAutoLayout(True)
        self.SetSizer(sizer)

    def onShowInButton(self, event):
        logger.debug('showInButton')
        menu = wx.Menu()
        menu.Append(wx.ID_ANY, "Menu Item 1")
        menu.Append(wx.ID_ANY, "Menu Item 2")
        menu.Append(wx.ID_ANY, "Menu Item 3")
        w, h = self.showInButton.GetSize()
        x, y = self.showInButton.GetPosition()
        self.PopupMenu(menu, (x, y + h))

    def onOpenWithButton(self, event):
        logger.debug('openWithButton')
        menu = wx.Menu()
        menu.Append(wx.ID_ANY, "Menu Item 1")
        menu.Append(wx.ID_ANY, "Menu Item 2")
        menu.Append(wx.ID_ANY, "Menu Item 3")
        self.openWithButton
        w, h = self.openWithButton.GetSize()
        x, y = self.openWithButton.GetPosition()
        self.PopupMenu(menu, (x, y + h))

    def onOkClick(self, event):
        logger.debug('onOkClick')
        # TODO : need to implement
#         sqlExecuter=SQLExecuter()
#         obj=sqlExecuter.getObject()
#         if len(obj[1])==0:
#             sqlExecuter.createOpalTables()
#         sqlExecuter.addNewConnectionRow(self.GetParent().CreateOpenConnectionPanel.filePath, self.GetParent().CreateOpenConnectionPanel.connectionNameText.GetValue())
#         data = self.GetTopLevelParent().createImportingCsvPanel.data
#         tableName = self.GetTopLevelParent().createImportingCsvPanel.tableNameText.GetValue()
#         fileOperations = FileOperations()
# #         data = fileOperations.readCsvFile(filePath=filePath, columnNameFirstRow=True, delimiter=",", quotechar='|')
# #         print(len(data))
# #         print(data)
#         createTableScript = fileOperations.createTableScript(tableName=tableName, columnHeader=data[0])
#         print(createTableScript)
#         sqlList = fileOperations.sqlScript(tableName=tableName, data=data)
#         print(sqlList)
#         connectionName = self.GetTopLevelParent().connectionName
#         importStatus = SQLUtils().importingData(connectionName=connectionName, sqlList=sqlList)
#         dlg = wx.MessageDialog(self, "Some status",
#                        'Importing data status',
#                        wx.OK | wx.ICON_INFORMATION
#                        #wx.YES_NO | wx.NO_DEFAULT | wx.CANCEL | wx.ICON_INFORMATION
#                        )
#         dlg.ShowModal()
#         dlg.Destroy()
        self.GetTopLevelParent().Destroy()

    def onCancelButtonClick(self, event):
        logger.debug('onCancelButtonClick')
        self.GetTopLevelParent().Destroy()
Ejemplo n.º 10
0
class ResourceSearchResultListCtrl(wx.Panel):

    def __init__(self, parent):
        wx.Panel.__init__(self, parent, -1, style=wx.WANTS_CHARS)
        sizer = wx.BoxSizer(wx.VERTICAL)

        self.searchResult = {
#             1 : ["abc1.py", r"c:\1\asdf"],
#             2 : ["abc2.java", r"c:\1\asdf"],
#             3 : ["abcasdfasdfa3.java", r"c:\1\asdf"],
#             4 : ["abc4.java", r"c:\1\asdf"],
#             5 : ["abc5.properties", r"c:\1\asdf"],
#             6 : ["abc5.md", r"c:\1\asdf"],
#             7 : ["abc5.txt", r"c:\1\asdf"],
        }

        self.fileOperations = FileOperations()
        self.list = ImprovedListCtrl(self, wx.NewIdRef(),
                                style=wx.LC_REPORT
                                # | wx.BORDER_SUNKEN
                                | wx.BORDER_NONE
                                | wx.LC_EDIT_LABELS
                                # | wx.LC_SORT_ASCENDING    # disabling initial auto sort gives a
                               | wx.LC_NO_HEADER  # better illustration of col-click sorting
                                | wx.LC_VRULES
                                | wx.LC_HRULES
                                | wx.LC_SINGLE_SEL
                                )
        self.setImageList()
        self.loadData(items={})
        sizer.Add(self.list, 1, wx.EXPAND)
        self.SetSizer(sizer)
        self.SetAutoLayout(True)

        self.Bind(wx.EVT_LIST_ITEM_SELECTED, self.OnItemSelected, self.list)
        self.Bind(wx.EVT_LIST_ITEM_DESELECTED, self.OnItemDeselected, self.list)
        self.Bind(wx.EVT_LIST_ITEM_ACTIVATED, self.OnItemActivated, self.list)
        self.Bind(wx.EVT_LIST_DELETE_ITEM, self.OnItemDelete, self.list)
        self.Bind(wx.EVT_LIST_COL_CLICK, self.OnColClick, self.list)
        self.Bind(wx.EVT_LIST_COL_RIGHT_CLICK, self.OnColRightClick, self.list)
        self.Bind(wx.EVT_LIST_COL_BEGIN_DRAG, self.OnColBeginDrag, self.list)
        self.Bind(wx.EVT_LIST_COL_DRAGGING, self.OnColDragging, self.list)
        self.Bind(wx.EVT_LIST_COL_END_DRAG, self.OnColEndDrag, self.list)
        self.Bind(wx.EVT_LIST_BEGIN_LABEL_EDIT, self.OnBeginEdit, self.list)
        self.Bind(wx.EVT_LIST_END_LABEL_EDIT, self.OnEndEdit, self.list)

        self.list.Bind(wx.EVT_LEFT_DCLICK, self.OnDoubleClick)
        self.list.Bind(wx.EVT_RIGHT_DOWN, self.OnRightDown)

        # for wxMSW
        self.list.Bind(wx.EVT_COMMAND_RIGHT_CLICK, self.OnRightClick)

        # for wxGTK
        self.list.Bind(wx.EVT_RIGHT_UP, self.OnRightClick)

    def getColumnText(self, index, col):
        item = self.list.GetItem(index, col)
        return item.GetText()

    def OnItemSelected(self, event):
        logger.debug('OnItemSelected')
        self.currentItem = event.Index
        logger.debug(f"OnItemSelected: {self.currentItem}, {self.list.GetItemText(self.currentItem)}, {self.getColumnText(self.currentItem, 1)}")

#         if self.currentItem == 10:
#             logger.debug("OnItemSelected: Veto'd selection\n")
#             # event.Veto()  # doesn't work
#             # this does
#             self.list.SetItemState(10, 0, wx.LIST_STATE_SELECTED)

        event.Skip()

    def OnItemDeselected(self, event):
        logger.debug('OnItemDeselected')

    def OnItemActivated(self, event):
        logger.debug('OnItemActivated')
        self.currentItem = event.Index
        logger.debug(f"OnItemActivated: {self.list.GetItemText(self.currentItem)} TopItem: {self.list.GetTopItem()}")
        logger.debug(self.searchResult[self.currentItem])
        fileName, relateName, fileDirPath = self.searchResult[self.currentItem]
        captionName = fileName
        window = EditorWindowManager().getWindow(self.GetTopLevelParent().Parent, os.path.join(fileDirPath, fileName))
#         icon = self.list.OnGetItemImage(self.currentItem)
        self.GetTopLevelParent().Parent._mgr.addTabByWindow(window=window, icon=None, name=f'{relateName}-{captionName}', captionName=captionName, tabDirection=5)
        self.GetTopLevelParent().Destroy()

    def OnItemDelete(self, event):
        logger.debug('OnItemDelete')

    def OnColClick(self, event):
        logger.debug('OnColClick')

    def OnColRightClick(self, event):
        logger.debug('OnColRightClick')

    def OnColBeginDrag(self, event):
        logger.debug('OnColBeginDrag')

    def OnColDragging(self, event):
        logger.debug('OnColDragging')

    def OnColEndDrag(self, event):
        logger.debug('OnColEndDrag')

    def OnBeginEdit(self, event):
        logger.debug('OnBeginEdit')

    def OnEndEdit(self, event):
        logger.debug('OnEndEdit')

    def OnDoubleClick(self, event):
        logger.debug('OnDoubleClick')

    def OnRightDown(self, event):
        logger.debug('OnRightDown')

    def OnRightClick(self, event):
        logger.debug('OnRightClick')

    def setImageList(self):
        self.il = wx.ImageList(16, 16)

        self.imageList = {
            '_':['_', 'fileType_filter.png'],
            'py':['py', 'python_module.png'],
            'java':['java', 'jcu_obj.png'],
            'md':['md', 'markdown.png'],
            'txt':['txt', 'text.png'],
        }
        for imageExtension, item in self.imageList.items():
            imageExtension, imageName = item[0], item[1]
            item.append(self.il.Add(self.fileOperations.getImageBitmap(imageName=imageName)))

        self.list.SetImageList(self.il, wx.IMAGE_LIST_SMALL)

    def getExtension(self, fileName=None):
        return fileName.split('.')[-1]

    def loadData(self, items={}):
        logger.debug('loadData')
        self.list.ClearAll()
        self.list.InsertColumn(0, "Name")
        self.list.InsertColumn(1, "Path")
        self.searchResult = items
#         items = self.searchResult.items()
        for key, data in items.items():
            index = self.list.InsertItem(self.list.GetItemCount(), data[0], self.getImageIndex(extention=self.getExtension(fileName=data[0])))
            self.list.SetItem(index, 1, data[1])
#             self.list.SetItem(index, 2, data[2])
            self.list.SetItemData(index, key)

        self.list.SetColumnWidth(0, wx.LIST_AUTOSIZE)
        self.list.SetColumnWidth(1, wx.LIST_AUTOSIZE)

    def clearData(self):
        logger.debug('clearData')
        self.list.ClearAll()

    def getImageIndex(self, extention='txt'):
        imageIndex = 0
        try:
            if self.imageList[extention]:
                imageIndex = self.imageList[extention][2]
        except:
            pass
        return imageIndex
Ejemplo n.º 11
0
class BookExplorerTreePanel(ExpansionState, TreeCtrl):
    '''
    Left navigation tree in preferences page
    '''
    def __init__(self, parent):

        TreeCtrl.__init__(self,
                          parent,
                          style=wx.TR_HIDE_ROOT | wx.TR_DEFAULT_STYLE
                          | wx.TR_HAS_VARIABLE_ROW_HEIGHT | wx.BORDER_NONE)

        self._il = None
        self.BuildTreeImageList()
        self.SetInitialSize((100, 80))

    def AppendItem(self, parent, text, image=-1, wnd=None):

        item = TreeCtrl.AppendItem(self, parent, text, image=image)
        return item

    def BuildTreeImageList(self):
        if self._il:
            self._il.Destroy()
            self._il = None
        self._il = wx.ImageList(16, 16)
        self.SetImageList(self._il)

        self.ImageList.RemoveAll()
        self.iconsDictIndex = {}
        count = 0
        self.fileOperations = FileOperations()
        imageIconsName = [
            'preference.png', 'folderType_filter.png',
            'eclipse_open_folder.png', 'fileType_filter.png', 'usb.png',
            'stop.png', 'java.png', 'python_module.png', 'xml.png',
            "other_view.png", 'console_view.png', 'register_view.png',
            'debug_view.png', 'history_view.png', 'compare_view.png',
            'breakpoint_view.png', 'watchlist_view.png', 'history_view.png',
            'synch_synch.png', 'variable_view.png', 'internal_browser.png',
            'reflog.png', 'staging.png', 'rebase_interactive.png',
            'repo_rep.png', 'gitrepository.png', 'filenav_nav.png',
            'welcome16.png', 'tasks_tsk.png', 'resource_persp.png',
            'outline_co.png', 'folder_user.png'
        ]
        for item in bookExplorerList:
            imageIconsName.append(item[2])
        for imageName in imageIconsName:
            try:
                self.ImageList.Add(
                    self.fileOperations.getImageBitmap(imageName=imageName))
                self.iconsDictIndex[imageName] = count
                count += 1
            except Exception as e:
                logger.error(e)

    def GetItemIdentity(self, item):
        return self.GetItemData(item)

    def Freeze(self):
        if 'wxMSW' in wx.PlatformInfo:
            return super(BookExplorerTreePanel, self).Freeze()

    def Thaw(self):
        if 'wxMSW' in wx.PlatformInfo:
            return super(BookExplorerTreePanel, self).Thaw()
Ejemplo n.º 12
0
class CreatingTableInfoToolbarPanel(wx.Panel):

    def __init__(self, parent=None, *args, **kw):
        wx.Panel.__init__(self, parent, id=-1)
        self.parent = parent
        self.fileOperations = FileOperations()
        self.tabName = kw['tabName']
        self.dataSourceTreeNode = kw['dataSourceTreeNode']
        self.data = list()
        self.sqlList = dict()
        vBox = wx.BoxSizer(wx.VERTICAL)
        logger.debug(kw)
        ####################################################################
        # adding new rows to the list on click of add button
#         self.newRows={}
        ####################################################################
#         self.topResultToolbar = self.constructTopResultToolBar()
        self.bottomResultToolbar = wx.StatusBar(self)
        self.resultPanel, self.toolbar = self.getPanelByTabName(tableName=kw['tableName'], tabName=kw['tabName'])
#         self.resultPanel = ResultPanel(self, data=None)
        self.bottomResultToolbar.SetStatusText("some text")
#         self.bottomResultToolbar = self.constructBottomResultToolBar()
#         self.resultPanel = ResultDataGrid(self, data=self.getData())
#         bottomResultToolbar = self.constructBottomResultToolBar()
        
        ####################################################################
        vBox.Add(self.toolbar , 0, wx.EXPAND | wx.ALL, 0)
#         vBox.Add(self.resultPanel , 1, wx.EXPAND | wx.ALL, 0)
        vBox.Add(self.resultPanel , 1, wx.EXPAND | wx.ALL)
        vBox.Add(self.bottomResultToolbar , 0, wx.EXPAND | wx.ALL, 0)
#         vBox.Add(bottomResultToolbar , 0, wx.EXPAND | wx.ALL, 0)
        sizer = wx.BoxSizer(wx.VERTICAL)
#         sizer.Add(worksheetToolbar ,.9, wx.EXPAND | wx.ALL, 0)
        sizer.Add(vBox, 1, wx.EXPAND , 0)
        self.SetSizer(sizer)    
        
    def constructTopResultToolBar(self, tabName=None):
        
        # create some toolbars
        tb1 = aui.AuiToolBar(self, -1, wx.DefaultPosition, wx.DefaultSize, agwStyle=aui.AUI_TB_DEFAULT_STYLE | aui.AUI_TB_OVERFLOW)
        
        tb1.SetToolBitmapSize(wx.Size(42, 42))

        if tabName == 'Data':
            tools = [
                (ID_SAVE_ROW, "Save", "save_to_database.png", 'Save (Ctrl+S)', self.onSave),
                (),
                (ID_REFRESH_ROW, "Result refresh", "resultset_refresh.png", 'Result refresh \tF5', self.onRefresh),
                (ID_ADD_ROW, "Add a new row", "row_add.png", 'Add a new row', self.onAddRow),
                (ID_DUPLICATE_ROW, "Duplicate selected row", "row_copy.png", 'Duplicate selected row', self.onDuplicateRow),
                (ID_DELETE_ROW, "Delete selected row", "row_delete.png", 'Delete selected row', self.onDeleteRow),
                ]
            for tool in tools:
                if len(tool) == 0:
                    tb1.AddSeparator()
                else:
                    logger.debug(tool)
                    toolItem = tb1.AddSimpleTool(tool[0], tool[1], self.fileOperations.getImageBitmap(imageName=tool[2]), short_help_string=tool[3])
                    if tool[4]:
                        self.Bind(wx.EVT_MENU, tool[4], id=tool[0])
#             tb1.AddSimpleTool(ID_SAVE_ROW, "Save", fileOperations.getImageBitmap(imageName="save_to_database.png"), short_help_string='Save to database')
#             tb1.AddSeparator()
#             
#             tb1.AddSimpleTool(ID_REFRESH_ROW, "Result refresh", fileOperations.getImageBitmap(imageName="resultset_refresh.png"), short_help_string='Refresh data')
#             tb1.AddSimpleTool(ID_ADD_ROW, "Add a new row", fileOperations.getImageBitmap(imageName="row_add.png"), short_help_string='Add new row')
#             tb1.AddSimpleTool(ID_DUPLICATE_ROW, "Duplicate current row", fileOperations.getImageBitmap(imageName="row_copy.png"), short_help_string='Duplicate current row')
#             tb1.AddSimpleTool(ID_DELETE_ROW, "Delete current row", fileOperations.getImageBitmap(imageName="row_delete.png"), short_help_string='Delete current row')
#             tb1.AddSeparator()
            
#         tb1.AddTool(ID_RUN, "Pin", fileOperations.getImageBitmap(imageName="pin2_green.png"))

        tb1.Realize()
        
        return tb1     

    def onSave(self, event):
        logger.debug('onSave')
        
        # finding rows to be updated
        originalData = self.resultPanel.getData()
        for row in range(self.resultPanel.GetNumberRows()):
            rowMatch = True
            rowPresent = False
            for col in range(self.resultPanel.GetNumberCols()):
                newVal = self.resultPanel.GetCellValue(row, col)
                if row + 1 in originalData:
                    rowPresent = True
                    originalValue = originalData[row + 1][col]
                    if '-______-NULL' == originalValue:
                        originalValue = originalValue.replace('-______-', '')
                    if str(originalValue) != newVal:
                        rowMatch = False
                        break
                else:
                    rowPresent = False
            if rowPresent and not rowMatch:
                newData = [self.resultPanel.GetCellValue(row, col) for col in range(self.resultPanel.GetNumberCols())]
                columnClauseForUpdate = self.getColumnClauseForUpdate(newData=newData)
                whereClause = self.getWhereClause(originalData[row + 1])
                sql = f"UPDATE '{self.dataSourceTreeNode.nodeLabel}' SET {columnClauseForUpdate} WHERE {whereClause} ;"
                self.sqlList[row] = {
                                    'sql':sql,
                                    'dml':'UPDATE',
                                    'tableName':self.dataSourceTreeNode.nodeLabel,
                                    'columns':self.dataSourceTreeNode.sqlType.columns,
                                    'newValues':newData,
                                    'oldValues':originalData[row + 1]
                                    }
            elif not rowPresent:
                newData = [self.resultPanel.GetCellValue(row, col) for col in range(self.resultPanel.GetNumberCols())]
                self.sqlList.get(row)['values']=newData
        db = ManageSqliteDatabase(connectionName=self.dataSourceTreeNode.dataSource.connectionName, databaseAbsolutePath=self.dataSourceTreeNode.dataSource.filePath)
        for row, sqlListRow in self.sqlList.items():
            sql = self.getSql(sqlListRow).get('sql')
            db.executeText(sql)
        self.sqlList = dict()
# #         sqlText = self.generateSql()
#         db = ManageSqliteDatabase(connectionName=self.dataSourceTreeNode.dataSource.connectionName, databaseAbsolutePath=self.dataSourceTreeNode.dataSource.filePath)
# #         db.executeText(sqlText)
#         
#         originalData = self.resultPanel.getData()
#         originalDataSet = set()
#         for k, v in originalData.items():
#             if k > 0:
#                 originalDataSet.add(tuple([str(x) for x in v]))
#         
#         newData = set()
#         
#         for row in range(self.resultPanel.GetNumberRows()):
#             newRow = []
#             for col in range(self.resultPanel.GetNumberCols()):
#                 val = self.resultPanel.GetCellValue(row, col)
#                 if self.resultPanel.GetCellTextColour(row, col) == wx.LIGHT_GREY and val in ('NULL', 'BLOB'):
#                     newRow.append(f'-______-{val}')
#                 else:
#                     newRow.append(self.resultPanel.GetCellValue(row, col))
#             newData.add(tuple(newRow))
#         
#         sql = self.generateSql(oldDataSet=originalDataSet, newDataSet=newData)
#         print(sql)

    def onRefresh(self, event):
        logger.debug('onRefresh')
        self.sqlList = dict()
        db = ManageSqliteDatabase(connectionName=self.dataSourceTreeNode.dataSource.connectionName, databaseAbsolutePath=self.dataSourceTreeNode.dataSource.filePath)
#         result = db.sqlite_select(tableName="sqlite_master")
        data = None
        tableName = self.GetParent().GetParent().tableName
        if tableName:
            data = db.executeText(text=f"SELECT * FROM '{tableName}' LIMIT 500;")
        if data:
            logger.debug('setResultData count: %s', len(data.keys()))
        self.resultPanel.addData(data)
        self.resultPanel.Layout()

    def onAddRow(self, event):
        logger.debug('onAddRow')
        logger.debug(self.resultPanel.GetNumberRows())
#         self.newRows[self.resultPanel.GetNumberRows()+1]=list()
#         data=self.resultPanel.getData()
        columnsName = [column.name for column in self.dataSourceTreeNode.sqlType.columns]
        values = 'null,' * len(columnsName)
        values = values[:-1]
        valuesList = values[:-1].split(',')
        columns = "`,`".join(columnsName)
        sql = f'''INSERT INTO '{self.dataSourceTreeNode.nodeLabel}' (`{columns}`) VALUES ({values});'''
#         self.sqlList[self.resultPanel.GetNumberRows()] = sql
        self.sqlList[self.resultPanel.GetNumberRows()] = {
                                    'sql':sql,
                                    'dml':'INSERT',
                                    'tableName':self.dataSourceTreeNode.nodeLabel,
                                    'columns':columns,
                                    'values':valuesList
                                    }
        self.resultPanel.AppendRows(numRows=1, updateLabels=True)
        
        # TODO : a logic for save insert, update , delete has to go here
    def onDuplicateRow(self, event):
        logger.debug('onDuplicateRow')

    def onDeleteRow(self, event):
        seletedRows = list(self.resultPanel.GetSelectedRows())
        logger.debug(f'onDeleteRow: {seletedRows}')
        seletedRows.sort(reverse=True)
        originalData = self.resultPanel.getData()
        for selectedRow in seletedRows:
            if selectedRow in self.sqlList:
                del self.sqlList[selectedRow]
            elif selectedRow in originalData:
                columnsName = [column.name for column in self.dataSourceTreeNode.sqlType.columns]
                columns = "`,`".join(columnsName)
                data = originalData[selectedRow + 1]
                whereClause = self.getWhereClause(data)
                sql = f"""DELETE FROM '{self.dataSourceTreeNode.nodeLabel}' WHERE {whereClause} ;"""
#                 self.sqlList[selectedRow] = sql
                self.sqlList[selectedRow] = {
                                    'sql':sql,
                                    'dml':'DELETE',
                                    'tableName':self.dataSourceTreeNode.nodeLabel,
                                    'columns':columns,
                                    'values':data
                                    }
#             self.newRows.append(list())
#             if selectedRow+1 in self.newRows: 
#                 del self.newRows[selectedRow+1]
            self.resultPanel.DeleteRows(pos=selectedRow, numRows=1, updateLabels=True)

#         self.resultPanel.DeleteRows(pos=0, numRows=numRows, updateLabels=True)
#         self.resultPanel.dele  
    def getSql(self, sqlListRow): 
        sql=None
        columnsName = [column.name for column in self.dataSourceTreeNode.sqlType.columns]
        columns = "`,`".join(columnsName)
        if sqlListRow.get('dml') == 'DELETE':
            whereClause = self.getWhereClause(sqlListRow.get('values'))
            sql = f"""DELETE FROM '{sqlListRow.get('tableName')}' WHERE {whereClause} ;"""
        elif sqlListRow.get('dml') == 'INSERT':
#             columns = "`,`".join(sqlListRow.get('columns'))
            values="','".join(sqlListRow.get('values'))
            sql = f'''INSERT INTO '{sqlListRow.get('tableName')}' (`{sqlListRow.get('columns')}`) VALUES ('{values}');'''
        elif sqlListRow.get('dml') == 'UPDATE':
            columnClauseForUpdate = self.getColumnClauseForUpdate(newData=sqlListRow.get('newValues'))
            whereClause = self.getWhereClause(sqlListRow.get('oldValues'))
            sql = f"UPDATE '{self.dataSourceTreeNode.nodeLabel}' SET {columnClauseForUpdate} WHERE {whereClause} ;"
        sqlListRow['sql']=sql
        return sqlListRow   
        
    def getColumnClauseForUpdate(self, newData=None):
        columnClauseForUpdate = []
        for idx, column in enumerate(self.dataSourceTreeNode.sqlType.columns):
            dataStr = newData[idx]
            if '-______-NULL' == dataStr:
                dataStr = dataStr.replace('-______-', '')
            if column.primaryKey != 1:
                columnClauseForUpdate.append(f" `{column.name}` = {dataStr}")
        columnClauseForUpdateStr = ",".join(columnClauseForUpdate)     
        
        return columnClauseForUpdateStr

    def getWhereClause(self, data):
        whereClasue = []
        for idx, column in enumerate(self.dataSourceTreeNode.sqlType.columns):
            dataStr = data[idx]
            if '-______-NULL' == dataStr:
                dataStr = dataStr.replace('-______-', '')
                whereClasue.append(f" `{column.name}` is {dataStr}")
            else:
                whereClasue.append(f" `{column.name}`={dataStr}")
        whereClasueStr = " AND".join(whereClasue)
        return whereClasueStr

    def generateSql(self, oldDataSet=None, newDataSet=None):
        logger.debug('generateSql')
        intersect = oldDataSet.intersection(newDataSet)
        insertSqlData = newDataSet - oldDataSet
        oldPKSet = set(self.getPrimaryKeyValue(oldDataSet))
        newPKSet = set(self.getPrimaryKeyValue(newDataSet))
        insertPKSet = set(self.getPrimaryKeyValue(insertSqlData))
        updatePKSet = oldPKSet.intersection(insertPKSet)
        columnsName = [column.name for column in self.dataSourceTreeNode.sqlType.columns]
        columns = "','".join(columnsName)
        updateSqlDataSet = set()
        valuesList = list()
        for insertSqlDataRow in insertSqlData:
            if insertSqlDataRow[0] in updatePKSet:
                updateSqlDataSet.add(insertSqlDataRow)
            else:
                valuesList.append("','".join(insertSqlDataRow))
        sqlList = list()
        for values in valuesList: 
            sqlList.append(f'''INSERT INTO '{self.dataSourceTreeNode.nodeLabel}' ('{columns}') VALUES ('{values}');''')
        return '\n'.join(sqlList)

    def getPrimaryKeyValue(self, oldDataSet):
        return [str(oldData[0]) for oldData in oldDataSet]

    def getPanelByTabName(self, tableName=None, tabName=None):
        toolbar = self.constructTopResultToolBar()
        resultPanel = wx.Panel()
        tableData = None
        sampleData = None
        indexData = None
        referencesData = None
        triggersData = None
        sqlData = None
        db = None
        try:
#             selectedItemText, dbFilePath = self.findingConnectionName()
            db = ManageSqliteDatabase(connectionName=self.dataSourceTreeNode.dataSource.connectionName, databaseAbsolutePath=self.dataSourceTreeNode.dataSource.filePath)
            result = db.sqlite_select(tableName="sqlite_master")
            for row in result:
                # selection of table and table name
                if row[0] == 'table' and row[1] == tableName:
                    tableData = {
                        0:("#", "Name", "Datatype", "PRIMARY KEY", "Nullable", "Unique", "Auto increment", "Default data", "Description")
                    }
                    indexData = None
                    sqlData = row[4]
        except Exception as e:
            logger.error(e, exc_info=True)
            
        if tabName == 'Columns':
            resultPanel = ResultDataGrid(self, data=None)
            if tableName:
                rows = db.executeText(f"pragma table_info('{tableName}');")
                if rows:
                    rows[-1] = ['INTEGER', 'VARCHAR', 'VARCHAR', 'BOOLEAN', 'VARCHAR', 'BOOLEAN' ]
                resultPanel.addData(rows)
        elif tabName == 'Indexes':
            resultPanel = ResultDataGrid(self, data=None)
            
            resultPanel.addData(indexData)
        elif tabName == 'Data':
            toolbar = self.constructTopResultToolBar(tabName=tabName)
            resultPanel = ResultDataGrid(self, data=None)
            data = None
            if tableName:
                data = db.executeText(text=f"SELECT * FROM `{tableName}` LIMIT 500;")
            if data:
                logger.debug('setResultData count: %s', len(data.keys()))
#                 self.bottomResultToolbar.SetStatusText("Count: {}".format(str(len(data.keys()))))
                resultPanel.addData(data)
                resultPanel.Layout()
        elif tabName == 'References':
            resultPanel = ResultDataGrid(self, data=None)
            resultPanel.addData(referencesData)
        elif tabName == 'Triggers':
            resultPanel = ResultDataGrid(self, data=None)
            resultPanel.addData(triggersData)
        elif tabName == 'Triggers':
            resultPanel = ResultDataGrid(self, data=None)
            resultPanel.addData(triggersData)
        elif tabName == 'SQL':
            resultPanel = SqlConsoleOutputPanel(self, data=None)
            try:
                resultPanel.text.SetText(sqlData)
            except Exception as e:
                logger.error(e, exc_info=True)
                
        elif tabName == 'ER diagram':
            resultPanel = wx.Panel()
        
        return resultPanel, toolbar

    def findingConnectionName(self):
        '''
        This method defines connection name based on selected connection in the tree.
        @return: (connectionName, databaseAbsolutePath)
        '''
        ##################################################################################
        sqlExecuter = SQLExecuter(database='_opal.sqlite')
        textCtrl = self.GetTopLevelParent()._ctrl
        connectionName = textCtrl.GetValue()
        databaseAbsolutePath = sqlExecuter.getDbFilePath(connectionName)
        logger.debug("databaseAbsolutePath: %s", databaseAbsolutePath)
        
        ##################################################################################        
        return connectionName, databaseAbsolutePath
Ejemplo n.º 13
0
    def __init__(self, parent, style=wx.TR_DEFAULT_STYLE | wx.BORDER_NONE):
        super(WelcomePanel, self).__init__()
        wx.Panel.__init__(self, parent, style=style)
        if wx.PlatformInformation.Get().GetOperatingSystemIdName() in [
                'Linux', 'Unix', 'OS/2'
        ]:
            pass
        elif wx.PlatformInformation.Get().GetOperatingSystemIdName() in [
                'DOS', 'Windows'
        ]:
            self.startWebHelp()

        fileOperations = FileOperations()
        self.current = "http://localhost:5000"
        self.frame = self.GetTopLevelParent()
        self.titleBase = self.frame.GetTitle()

        sizer = wx.BoxSizer(wx.VERTICAL)
        #         btnSizer = wx.BoxSizer(wx.HORIZONTAL)
        self.wv = webview.WebView.New(self)
        self.Bind(webview.EVT_WEBVIEW_NAVIGATING, self.OnWebViewNavigating,
                  self.wv)
        self.Bind(webview.EVT_WEBVIEW_NAVIGATED, self.OnWebViewNavigated,
                  self.wv)
        self.Bind(webview.EVT_WEBVIEW_LOADED, self.OnWebViewLoaded, self.wv)
        self.Bind(webview.EVT_WEBVIEW_TITLE_CHANGED,
                  self.OnWebViewTitleChanged, self.wv)

        # create some toolbars
        tb1 = aui.AuiToolBar(self,
                             -1,
                             wx.DefaultPosition,
                             wx.DefaultSize,
                             agwStyle=aui.AUI_TB_DEFAULT_STYLE
                             | aui.AUI_TB_OVERFLOW)
        tb1.SetToolBitmapSize(wx.Size(16, 16))
        backButtonId = wx.NewIdRef()
        homeButtonId = wx.NewIdRef()
        forwardButtonId = wx.NewIdRef()
        stopButtonId = wx.NewIdRef()
        refreshButtonId = wx.NewIdRef()
        openButtonId = wx.NewIdRef()

        tb1_back = wx.ArtProvider.GetBitmap(wx.ART_GO_BACK, wx.ART_OTHER,
                                            wx.Size(16, 16))
        backButton = tb1.AddSimpleTool(backButtonId,
                                       "Back",
                                       tb1_back,
                                       short_help_string="Back")
        self.Bind(wx.EVT_MENU, self.OnPrevPageButton, id=backButtonId)
        self.Bind(wx.EVT_UPDATE_UI, self.OnCheckCanGoBack, backButton)

        tb1_home = wx.ArtProvider.GetBitmap(wx.ART_GO_HOME, wx.ART_OTHER,
                                            wx.Size(16, 16))
        tb1.AddSimpleTool(homeButtonId,
                          "Start Page",
                          tb1_home,
                          short_help_string="Start page")
        self.Bind(wx.EVT_MENU, self.OnHomeButton, id=homeButtonId)

        tb1_forward = wx.ArtProvider.GetBitmap(wx.ART_GO_FORWARD, wx.ART_OTHER,
                                               wx.Size(16, 16))
        forwardButton = tb1.AddSimpleTool(forwardButtonId,
                                          "Forword",
                                          tb1_forward,
                                          short_help_string="Forword")
        self.Bind(wx.EVT_MENU, self.OnNextPageButton, id=forwardButtonId)
        self.Bind(wx.EVT_UPDATE_UI, self.OnCheckCanGoForward, forwardButton)

        tb1_stop = wx.ArtProvider.GetBitmap(wx.ART_ERROR, wx.ART_OTHER,
                                            wx.Size(16, 16))
        tb1.AddSimpleTool(stopButtonId,
                          "Stop",
                          tb1_stop,
                          short_help_string="Stop")
        self.Bind(wx.EVT_MENU, self.OnStopButton, id=stopButtonId)

        tb1_refresh = wx.ArtProvider.GetBitmap(wx.ART_REDO, wx.ART_OTHER,
                                               wx.Size(16, 16))
        tb1.AddSimpleTool(refreshButtonId,
                          "Refresh",
                          tb1_refresh,
                          short_help_string="Refresh")
        self.Bind(wx.EVT_MENU, self.OnRefreshPageButton, id=refreshButtonId)

        self.location = wx.ComboBox(tb1,
                                    -1,
                                    "",
                                    size=(400, -1),
                                    style=wx.CB_DROPDOWN | wx.TE_PROCESS_ENTER)
        self.location.AppendItems([
            "http://localhost:5000", 'http://wxPython.org',
            'http://wxwidgets.org', 'http://google.com'
        ])

        for url in [
                "http://localhost:5000", 'http://wxPython.org',
                'http://wxwidgets.org', 'http://google.com'
        ]:
            item = webview.WebViewHistoryItem(url, url)
#             self.wv.LoadHistoryItem(item)

        self.Bind(wx.EVT_COMBOBOX, self.OnLocationSelect, self.location)
        self.location.Bind(wx.EVT_TEXT_ENTER, self.OnLocationEnter)
        tb1.AddControl(self.location, label="Location: ")

        #         tb1_open = wx.ArtProvider.GetBitmap(wx.ART_TICK_MARK, wx.ART_OTHER, wx.Size(16, 16))
        tb1.AddSimpleTool(
            openButtonId,
            "Open",
            bitmap=fileOperations.getImageBitmap(imageName="webinar.png"),
            short_help_string="Open")
        self.Bind(wx.EVT_MENU, self.OnOpenButton, id=openButtonId)

        tb1.Realize()
        #         sizer.Add(btnSizer, 0, wx.EXPAND)
        sizer.Add(tb1, 0, wx.EXPAND)
        sizer.Add(self.wv, 1, wx.EXPAND | wx.ALL, 0)

        self.wv.LoadURL(self.current)
        #         logger.debug("---------------------------------"+ os.getcwd())
        #         htmlData=FileOperations().readFile(filePath='./html/welcome.html')
        #         logger.debug(htmlData)
        #
        #         self.wv.SetPage(htmlData,"http://localhost:5000")
        self.SetSizer(sizer)
Ejemplo n.º 14
0
class PropertiesFrame(wx.Frame):
    
    def __init__(self, parent, title=None, size=(970, 720), depth=None, dataSource=None):
        wx.Frame.__init__(self, parent, -1, title, size=size,
                          style=wx.DEFAULT_FRAME_STYLE | wx.NO_FULL_REPAINT_ON_RESIZE)
        self.fileOperations = FileOperations()
        icon = wx.Icon()
        icon.CopyFromBitmap(self.fileOperations.getImageBitmap(imageName='eclipse16.png'))
        self.SetIcon(icon)
#         self.connectionName = connectionName
        self.SetMinSize((640, 480))
        ####################################################################
        '''
        Footer section
        '''
        vBox = wx.BoxSizer(wx.VERTICAL)        
        self.buttonPanel = CreateButtonPanel(self)
        ####################################################################
        self.splitter = wx.SplitterWindow(self, -1, style=wx.SP_3DBORDER)
        self.splitter.SetMinimumPaneSize(20)
        
        self.createLeftPropertiesTreePanel = CreateLeftPropertiesTreePanel(self.splitter)
        self.rightPanel = RightPanel(self.splitter, name='Resource', dataSource=dataSource)
#         self.resultDataGrid = ResultDataGrid(self.splitter)
        self.splitter.SplitVertically(self.createLeftPropertiesTreePanel, self.rightPanel, sashPosition=210)
        logger.info(self.splitter.GetDefaultSashSize())
        ####################################################################
        
#         sizer.Add(self.createImportingCsvPanel, 1, wx.EXPAND)
#         sizer.Add(self.resultDataGrid, 1, wx.EXPAND)
        vBox.Add(self.splitter, 1, wx.EXPAND | wx.ALL)
        vBox.Add(self.buttonPanel, 0, wx.EXPAND | wx.ALL)
        
        sizer = wx.BoxSizer(wx.VERTICAL)
        sizer.Add(vBox, 1, wx.EXPAND , 0)   
        self.SetSizer(sizer)
#         self.creatingToolbar()
        self.Center()
        self.BindEvents()
        self.Bind(wx.EVT_CLOSE, self.OnCloseFrame)
#         self.createStatusBar()
        self.Show(True)

    def OnKeyUP(self, event):
        logger.info("KEY UP!")
        keyCode = event.GetKeyCode()
        if keyCode == wx.WXK_ESCAPE:
            self.Close()
        event.Skip() 

    def OnCloseFrame(self, event):
        self.Destroy()

    def OnSize(self, event):
        hsize = event.GetSize()
        logger.debug(hsize)
        
    def BindEvents(self):
#         self.Bind(wx.EVT_SIZE, self.OnSize)
        self.Bind(wx.EVT_CHAR_HOOK, self.OnKeyUP)
        
    def createStatusBar(self):
        logger.info('createStatusBar')
        self.statusbar = self.CreateStatusBar(2, wx.STB_SIZEGRIP)
        self.statusbar.SetStatusWidths([-2, -3])
#         self.statusbar.SetStatusText(self.getCurrentCursorPosition(), 0)
        self.statusbar.SetStatusText("Welcome {}".format(""), 1)
Ejemplo n.º 15
0
class CreatingTreePanel(wx.Panel):

    def __init__(self, parent=None, *args, **kw):
        wx.Panel.__init__(self, parent, id=-1)
        self.parent = parent
        self.fileOperations = FileOperations()
        self.connDict = dict()
        vBox = wx.BoxSizer(wx.VERTICAL)
        ####################################################################
        self.sqlExecuter = SQLExecuter()
        self._treeList = self.sqlExecuter.getObject()
        self.treeMap = {}
        self.searchItems = {}
        self.tree = DatabaseNavigationTree(self)
        self.filter = wx.SearchCtrl(self, style=wx.TE_PROCESS_ENTER)
        self.filter.SetDescriptiveText("Type filter table name")
        self.filter.ShowCancelButton(True)
        self.filter.Bind(wx.EVT_TEXT, self.recreateTree)
        self.filter.Bind(wx.EVT_SEARCHCTRL_CANCEL_BTN, lambda e: self.filter.SetValue(''))
        self.filter.Bind(wx.EVT_TEXT_ENTER, self.OnSearch)
        self.recreateTree()
        
        # add drop target
        self.SetDropTarget(MyFileDropTarget(self))
#         self.tree.SetExpansionState(self.expansionState)
        self.tree.Bind(wx.EVT_TREE_ITEM_EXPANDED, self.OnItemExpanded)
        self.tree.Bind(wx.EVT_TREE_ITEM_COLLAPSED, self.OnItemCollapsed)
        self.tree.Bind(wx.EVT_TREE_SEL_CHANGED, self.OnSelChanged)
        self.tree.Bind(wx.EVT_LEFT_DOWN, self.OnTreeLeftDown)
        self.tree.Bind(wx.EVT_LEFT_DCLICK, self.OnTreeDoubleclick)
        self.tree.Bind(wx.EVT_TREE_ITEM_ACTIVATED, self.onTreeItemActivated)
        self.tree.Bind(wx.EVT_TREE_KEY_DOWN, self.onTreeKeyDown)
        self.tree.Bind(wx.EVT_TREE_BEGIN_DRAG, self.onTreeBeginDrag)
        
        self.tree.Bind(wx.EVT_RIGHT_DOWN, self.OnTreeRightDown)
        self.tree.Bind(wx.EVT_RIGHT_UP, self.OnTreeRightUp)
#         self.tree.Bind(wx.EVT_KEY_DOWN, self.OnKeyDown, self)
        ####################################################################
        vBox.Add(self.filter , 0, wx.EXPAND | wx.ALL)
        vBox.Add(self.tree , 1, wx.EXPAND | wx.ALL)
        sizer = wx.BoxSizer(wx.VERTICAL)
        sizer.Add(vBox, 1, wx.EXPAND , 0)
        self.SetSizer(sizer)
        
    def OnSearch(self, event=None):

        value = self.filter.GetValue()
        if not value:
            self.recreateTree()
            return

        wx.BeginBusyCursor()
        try:
            for category, items in self._treeList[1]:
                self.searchItems[category] = []
                for childItem in items:
    #                 if SearchDemo(childItem, value):
                    self.searchItems[category].append(childItem)
        except Exception as e:
            logger.error(e, exc_info=True)
        wx.EndBusyCursor()
        self.recreateTree()   

    #---------------------------------------------    
    def recreateTree(self, evt=None):
        # Catch the search type (name or content)
#         searchMenu = self.filter.GetMenu().GetMenuItems()
#         fullSearch = searchMenu[1].IsChecked()
        fullSearch = False
            
        if evt:
            if fullSearch:
                # Do not`scan all the demo files for every char
                # the user input, use wx.EVT_TEXT_ENTER instead
                return
                    
        self.createDefaultNode()
                    
#         self.tree.Expand(self.root)
        
        self.tree.Thaw()
        self.searchItems = {}
    
    #---------------------------------------------
    def createDefaultNode(self):
        logger.debug("TreePanel.createDefaultNode")
        sqlExecuter = SQLExecuter()
        dbList = sqlExecuter.getListDatabase()

            
        fullSearch = False
        expansionState = self.tree.GetExpansionState()

        current = None
        item = self.tree.GetSelection()
        if item:
            prnt = self.tree.GetItemParent(item)
            if prnt:
                current = (self.tree.GetItemText(item), self.tree.GetItemText(prnt))
        self.tree.Freeze()
        self.tree.DeleteAllItems()
        self.root = self.tree.AddRoot("Connections")
        self.tree.SetItemImage(self.root, 0)
        data = dict()
        data['depth'] = 0
        self.tree.SetItemData(self.root, data)
        treeFont = self.tree.GetFont()
        catFont = self.tree.GetFont()

        # The native treectrl on MSW has a bug where it doesn't draw
        # all of the text for an item if the font is larger than the
        # default.  It seems to be clipping the item's label as if it
        # was the size of the same label in the default font.
        if 'wxMSW' not in wx.PlatformInfo:
            treeFont.SetPointSize(treeFont.GetPointSize() + 2)
            
        treeFont.SetWeight(wx.BOLD)
        catFont.SetWeight(wx.BOLD)
        self.tree.SetItemFont(self.root, treeFont)
        
        firstChild = None
        selectItem = None
        filter = self.filter.GetValue()
        count = 0
        for db in dbList:
            data = dict()
            data['depth'] = 1
            data['connection_name'] = db[1]
            data['db_file_path'] = db[2]
            if db[3] == 3:
                image = 17
            elif db[3] == 1:
                image = 16
#             elif db[3]==1:
#                 image=16
            
            # Appending connections
            item=self.addNode(targetNode=self.root, nodeLabel=db[1], pydata=data, image=image)
#             self.connDict[db[1]]['itemId']=item
            if db[1] in self.connDict.keys():
                self.getNodeOnOpenConnection(selectedItemId=item)
#         for key, value in self.connDict.items():
#             if value['isConnected']:
#                 logger.debug("{}:{}".format(key, value))
        self.tree.Expand(self.root)
        if firstChild:
            self.tree.Expand(firstChild)
#         if filter:
#             self.tree.ExpandAll()
        if expansionState:
            self.tree.SetExpansionState(expansionState)
        if selectItem:
            self.skipLoad = True
            self.tree.SelectItem(selectItem)
            self.skipLoad = False      
            
    def addNode(self, targetNode=None, nodeLabel='label', pydata=None, image=16):  
        nodeCreated = self.tree.AppendItem(targetNode, nodeLabel, image=image)
        self.tree.SetItemFont(nodeCreated, self.tree.GetFont())
        self.tree.SetItemData(nodeCreated, pydata)
        return nodeCreated   
    def deleteChildren(self, itemId):
        self.tree.DeleteChildren(itemId)
    #---------------------------------------------
 
    #---------------------------------------------
    def OnItemExpanded(self, event):
        item = event.GetItem()
        logger.debug("OnItemExpanded: %s" % self.tree.GetItemText(item))
        event.Skip()

    #---------------------------------------------
    def OnItemCollapsed(self, event):
        item = event.GetItem()
#         logger.debug("OnItemCollapsed: %s" % self.tree.GetItemText(item))
        event.Skip()

    #---------------------------------------------
    def onTreeBeginDrag(self, event):
        logger.debug('onTreeBeginDrag')
        event.Skip()
        
    def onTreeItemActivated(self, event):
        logger.debug('onTreeItemActivated')
        self.onConnectDb(event)
        
    def onTreeKeyDown(self, event):
        logger.debug('onTreeKeyDown')
        keypress = self.GetKeyPress(event)
        keycode = event.GetKeyCode()
        keyname = keyMap.get(keycode, None)
        logger.debug('onTreeKeyDown keycode: %s  keyname:%s keypress: %s', keycode, keyname, keypress)
        logger.debug(keypress == 'WXK_F2')
        
        if keypress == 'Ctrl+C':
            self.onTreeCopy(event)
        elif keypress == 'WXK_F2':
            self.onF2KeyPress(event)
        elif keypress == 'WXK_DELETE':
            self.onDeleteKeyPress(event)
        event.Skip()
        
    def GetKeyPress(self, evt):
        keycode = evt.GetKeyCode()
        keyname = keyMap.get(keycode, None)
        modifiers = ""
        for mod, ch in ((evt.GetKeyEvent().ControlDown(), 'Ctrl+'),
                        (evt.GetKeyEvent().AltDown(), 'Alt+'),
                        (evt.GetKeyEvent().ShiftDown(), 'Shift+'),
                        (evt.GetKeyEvent().MetaDown(), 'Meta+')):
            if mod:
                modifiers += ch
    
        if keyname is None:
            if 27 < keycode < 256:
                keyname = chr(keycode)
            else:
                keyname = "(%s)unknown" % keycode
        return modifiers + keyname

    #----------------------------------------------------------------------
    def onDeleteKeyPress(self, event):
        try:
            logger.debug(self.tree.GetItemData(self.tree.GetSelection()))
            depth = self.tree.GetItemData(self.tree.GetSelection())['depth']
            if depth == 1:
                self.onDeleteConnection(event)
            elif depth == 3:
                logger.debug("TODO delete table")
                self.onDeleteTable(event)
            elif depth == 5:
                logger.debug("TODO delete column")
        except Exception as e:
            logger.error(e, exc_info=True)

    #----------------------------------------------------------------------
    def onF2KeyPress(self, event):
        try:
            logger.debug(self.tree.GetItemData(self.tree.GetSelection()))
            depth = self.tree.GetItemData(self.tree.GetSelection())['depth']
            if depth == 3:
                self.onRenameTable(event)
            elif depth == 5:
                self.onRenameColumn(event)
                
        except Exception as e:
            logger.error(e, exc_info=True)
    
    def onTreeCopy(self, event):
        """"""
        self.dataObj = wx.TextDataObject()
        self.dataObj.SetText(self.tree.GetItemText(self.tree.GetSelection()))
        if not wx.TheClipboard.IsOpened():  # may crash, otherwise
            wx.TheClipboard.Open()
        try:
            with wx.Clipboard.Get() as clipboard:
                clipboard.SetData(self.dataObj)
        except TypeError:
            wx.MessageBox("Unable to open the clipboard", "Error")
        
    def OnTreeDoubleclick(self, event):
        logger.info("OnTreeDoubleclick")
        pt = event.GetPosition();
        item, flags = self.tree.HitTest(pt)
        data = self.tree.GetItemData(item)
        rightClickDepth = data['depth']
        logger.info("Depth: {}".format(data['depth']))
        if rightClickDepth == 1:
            self.onConnectDb(event)
        if rightClickDepth == 3:
            # Open a new tab in SQL execution Pane. It is for table info.
            # TODO 
            tableName = self.tree.GetItemText(item)
            self.openWorksheet(sheetName=tableName)
        if self.tree.IsExpanded(item):
            self.tree.Collapse(item)
        else:
            self.tree.Expand(item)
        
    def OnTreeLeftDown(self, event):
        # reset the overview text if the tree item is clicked on again
        pt = event.GetPosition();
        item, flags = self.tree.HitTest(pt)
        if item and item == self.tree.GetSelection():
            logger.debug(self.tree.GetItemText(item) + " Overview")
        event.Skip()

    #---------------------------------------------
    def OnSelChanged(self, event):
        logger.debug('OnSelChanged')
        pass

    #---------------------------------------------
    def OnTreeRightDown(self, event):
        
        pt = event.GetPosition()
        item, flags = self.tree.HitTest(pt)

        if item:
            self.tree.item = item
            self.tree.item
            logger.debug("OnRightClick: %s, %s, %s" % (self.tree.GetItemText(item), type(item), item.__class__) + "\n")
            self.tree.SelectItem(item)
            if self.tree.GetItemText(self.tree.item) != 'Connections':
                logger.debug('parent %s', self.tree.GetItemText(self.tree.GetItemParent(self.tree.item)))

    #---------------------------------------------
    def OnTreeRightUp(self, event):
        event.Skip
       
        item = self.tree.item     
        
        if not item:
            event.Skip()
            return
        logger.debug('OnTreeRightUp')
        
        menu = wx.Menu()
        data = self.tree.GetItemData(item)
        rightClickDepth = data['depth']
        if rightClickDepth == 0:
            rootNewConnection = menu.Append(ID_ROOT_NEW_CONNECTION, "New connection ")
            
            refreshBmp = wx.MenuItem(menu, ID_ROOT_REFERESH, "&Refresh")
            refreshBmp.SetBitmap(wx.Bitmap(self.fileOperations.getImageBitmap(imageName="database_refresh.png")))
            rootRefresh = menu.Append(refreshBmp)
            
            self.Bind(wx.EVT_MENU, self.onRootRefresh, rootRefresh)
            self.Bind(wx.EVT_MENU, self.onRootNewConnection, rootNewConnection)
        elif rightClickDepth == 1:
            if data['connection_name'] in self.connDict and \
                self.connDict[data['connection_name']]['isConnected']:
                item1 = menu.Append(ID_DISCONNECT_DB, "Disconnect")
                self.Bind(wx.EVT_MENU, self.onDisconnectDb, item1)
            else:
                item2 = menu.Append(ID_CONNECT_DB, "Connect")
                self.Bind(wx.EVT_MENU, self.onConnectDb, item2)
            
            sqlEditorBmp = wx.MenuItem(menu, ID_newWorksheet, "SQL Editor in new Tab")
            sqlEditorBmp.SetBitmap(wx.Bitmap(self.fileOperations.getImageBitmap(imageName="script.png")))
            item3 = menu.Append(sqlEditorBmp)
            
            infoMenuItem = wx.MenuItem(menu, ID_CONNECTION_PROPERTIES, "Properties")
            infoBmp = wx.ArtProvider.GetBitmap(wx.ART_INFORMATION, wx.ART_MENU, (16, 16)) 
            infoMenuItem.SetBitmap(infoBmp)     
            item4 = menu.Append(infoMenuItem)    
            
            importBmp = wx.MenuItem(menu, ID_IMPORT, "&Import CSV / Excel")
            importBmp.SetBitmap(wx.Bitmap(self.fileOperations.getImageBitmap(imageName="import.png")))
            importMenu = menu.Append(importBmp)  
            
            refreshBmp = wx.MenuItem(menu, wx.ID_REFRESH, "&Refresh")
            refreshBmp.SetBitmap(wx.Bitmap(self.fileOperations.getImageBitmap(imageName="database_refresh.png")))
            item5 = menu.Append(refreshBmp)
            
#             item6 = menu.Append(wx.ID_ANY, "Properties")
            menu.AppendSeparator()
#             item7 = wx.MenuItem(menu, wx.ID_ANY, "&Smile!\tCtrl+S", "This one has an icon")
#             item7.SetBitmap(wx.Bitmap(os.path.abspath(os.path.join(path, "index.png"))))
#             menu.AppendItem(item7)
            
            deleteMenuItem = wx.MenuItem(menu, wx.ID_DELETE, "Delete reference \t Delete")
            delBmp = wx.ArtProvider.GetBitmap(wx.ART_DELETE, wx.ART_MENU, (16, 16))
            deleteMenuItem.SetBitmap(delBmp)
            delMenu = menu.Append(deleteMenuItem)
            
            deleteWithDatabaseMenuItem = wx.MenuItem(menu, ID_deleteWithDatabase, "Delete with database \t Shift + Delete")
            delBmp = wx.ArtProvider.GetBitmap(wx.ART_DELETE, wx.ART_MENU, (16, 16))
            deleteWithDatabaseMenuItem.SetBitmap(delBmp)
            deleteWithDatabaseMenu = menu.Append(deleteWithDatabaseMenuItem)
#             self.Bind(wx.EVT_MENU, self.OnItemBackground, item1)
            
            self.Bind(wx.EVT_MENU, self.onOpenSqlEditorTab, item3)
            self.Bind(wx.EVT_MENU, self.onProperties, item4)
            self.Bind(wx.EVT_MENU, self.onImport, importMenu)
            self.Bind(wx.EVT_MENU, self.onRefresh, item5)
#             self.Bind(wx.EVT_MENU, self.onEditConnection, item6)
            self.Bind(wx.EVT_MENU, self.onDeleteConnection, delMenu)
            self.Bind(wx.EVT_MENU, self.onDeleteWithDatabaseTable, deleteWithDatabaseMenu)
#             self.Bind(ID_CONNECTION_PROPERTIES, self.onConnectionProperties, deleteWithDatabaseMenu)

        elif rightClickDepth == 2:
            if 'table' in self.tree.GetItemText(item):
                newTableBmp = wx.MenuItem(menu, wx.ID_ANY, "Create new table")
                newTableBmp.SetBitmap(wx.Bitmap(self.fileOperations.getImageBitmap(imageName="table_add.png")))
                newTableItem = menu.Append(newTableBmp)                 
                
#                 newTableItem = menu.Append(wx.ID_ANY, "Create new table")
                erDiagramItem = menu.Append(wx.ID_ANY, "Create ER diagram")
                refreshTableItem = menu.Append(wx.ID_ANY, "Refresh  \tF5")
                
                self.Bind(wx.EVT_MENU, self.onNewTable, newTableItem)
                
                self.Bind(wx.EVT_MENU, self.onCreateErDiagramItem, erDiagramItem)
                
                self.Bind(wx.EVT_MENU, self.onRefreshTable, refreshTableItem)
                
            if 'view' in self.tree.GetItemText(item):
                newViewItem = menu.Append(wx.ID_ANY, "Create new view")
                item2 = menu.Append(wx.ID_ANY, "Refresh \tF5")
                self.Bind(wx.EVT_MENU, self.onNewView, newViewItem)
            if 'index' in self.tree.GetItemText(item) :
                newIndexItem = menu.Append(wx.ID_ANY, "Create new index")
                item2 = menu.Append(wx.ID_ANY, "Refresh \tF5")
                self.Bind(wx.EVT_MENU, self.onNewIndex, newIndexItem)
                
        elif 'Columns' in self.tree.GetItemText(item) :
            newColumnItem = menu.Append(wx.ID_ANY, "Add new column")
            self.Bind(wx.EVT_MENU, self.onNewColumn, newColumnItem)
            
        elif 'table' in self.tree.GetItemText(self.tree.GetItemParent(self.tree.item)) : 
            logger.debug(self.tree.GetItemText(item))

            editTableBmp = wx.MenuItem(menu, wx.ID_ANY, "Edit table")
            editTableBmp.SetBitmap(wx.Bitmap(self.fileOperations.getImageBitmap(imageName="table_edit.png")))
            editTableItem = menu.Append(editTableBmp) 
            
#             editTableItem = menu.Append(wx.ID_ANY, "Edit table ")
            renameTableItem = menu.Append(wx.ID_ANY, "Rename Table ")
            copyCreateTableItem = menu.Append(wx.ID_ANY, "Copy create table statement")

            deleteTableBmp = wx.MenuItem(menu, wx.ID_ANY, "&Delete table ")
            deleteTableBmp.SetBitmap(wx.Bitmap(self.fileOperations.getImageBitmap(imageName="table_delete.png")))
            deleteTableItem = menu.Append(deleteTableBmp)

            self.Bind(wx.EVT_MENU, self.onDeleteTable, deleteTableItem)
            
            self.Bind(wx.EVT_MENU, self.onEditTable, editTableItem)
            self.Bind(wx.EVT_MENU, self.onRenameTable, renameTableItem)
            self.Bind(wx.EVT_MENU, self.onCopyCreateTableStatement, copyCreateTableItem)
            
        elif 'Column' in self.tree.GetItemText(self.tree.GetItemParent(self.tree.item)) : 
            logger.debug(self.tree.GetItemText(item))
            item1 = menu.Append(wx.ID_ANY, "Edit column")
            renameColumnItem = menu.Append(wx.ID_ANY, "Rename Column ")
#             item1 = menu.Append(wx.ID_ANY, "Create new column")
#             self.Bind(wx.EVT_MENU, self.OnItemBackground, item1)
            self.Bind(wx.EVT_MENU, self.onRenameColumn, renameColumnItem)
        
        self.PopupMenu(menu)
        menu.Destroy()

    def onDeleteTable(self, event):
        logger.debug('onDeleteTable')
        try:
#             data = self.tree.GetPyData(self.tree.GetSelection()).Data
            depth = self.tree.GetItemData(self.tree.GetSelection())['depth']
            ##################################################################################
            sqlExecuter = SQLExecuter(database='_opal.sqlite')
            textCtrl = self.GetTopLevelParent()._ctrl
            selectedItemText = textCtrl.GetValue()
            databaseAbsolutePath = sqlExecuter.getDbFilePath(selectedItemText)
            logger.debug("dbFilePath: %s", databaseAbsolutePath)
            
            ##################################################################################
    #         connectionName = data['connection_name']
#             databaseAbsolutePath = data['db_file_path']
            if os.path.isfile(databaseAbsolutePath) and depth == 3:     
                text = "DROP TABLE '{}'".format(self.tree.GetItemText(self.tree.GetSelection()))
                dbObjects = ManageSqliteDatabase(connectionName=selectedItemText , databaseAbsolutePath=databaseAbsolutePath).executeText(text)
                self.recreateTree(event) 
        except Exception as e:
            logger.error(e, exc_info=True)
    
    def onRefreshTable(self, event):
        logger.debug('onRefreshTable')

    def onRootRefresh(self, event):
        logger.debug('onRootRefresh')
        self.recreateTree(event)

    def onRootNewConnection(self, event):
        logger.debug('onRootNewConnection')
        CreateNewConncetionWixard(self).createWizard()
        
        # Refresh tree.
        
    def onCopyCreateTableStatement(self, event):
        logger.debug('onCopyCreateTableStatement')

    def onRenameColumn(self, event):
        logger.debug('onRenameColumn')
        initialColumnName = self.tree.GetItemText(self.tree.GetSelection())
        dlg = wx.TextEntryDialog(self, 'Rename column ' + initialColumnName, 'Rename column ' + initialColumnName, 'Python')
        dlg.SetValue(self.tree.GetItemText(self.tree.GetSelection()))

        if dlg.ShowModal() == wx.ID_OK:
            logger.info('You entered: %s\n', dlg.GetValue())
            if dlg.GetValue() != self.tree.GetItemText(self.tree.GetSelection()):
                logger.info('update table execute')
                data = self.tree.GetItemData(self.tree.GetSelection())
                connectionName = data['connection_name']
                databaseAbsolutePath = data['db_file_path']
                if os.path.isfile(databaseAbsolutePath):     
                    '''
                    First you rename the old table:
                    ALTER TABLE orig_table_name RENAME TO tmp_table_name;
                    Then create the new table, based on the old table but with the updated column name:
                    Then copy the contents across from the original table.
                    

                    '''
                    logger.debug("TODO logic for rename column goes here.")
#                     dbObjects = ManageSqliteDatabase(connectionName=connectionName , databaseAbsolutePath=databaseAbsolutePath).executeText(text) 
        dlg.Destroy()

#     def onDeleteConnection(self, event):
#         logger.debug('onDeleteConnection')
#         logger.debug("TODO delete connection name")
#         data = self.tree.GetItemData(self.tree.GetSelection())
#         connectionName = data['connection_name']
#         databaseAbsolutePath = data['db_file_path']
#         if os.path.isfile(databaseAbsolutePath):
#             sqlExecuter = SQLExecuter()
#             text="DELETE FROM conns WHERE {} "
#             sqlExecuter.executeText(text)
        
    def onRenameTable(self, event):
        logger.debug('onRenameTable')
        oldTableName = initialTableName = self.tree.GetItemText(self.tree.GetSelection())
        dlg = wx.TextEntryDialog(self, 'Rename table {} to'.format(initialTableName), 'Rename table {} '.format(initialTableName), 'Python')
        dlg.SetValue(self.tree.GetItemText(self.tree.GetSelection()))

        if dlg.ShowModal() == wx.ID_OK:
            logger.info('You entered: %s\n', dlg.GetValue())
            if dlg.GetValue() != self.tree.GetItemText(self.tree.GetSelection()):
                logger.info('update table execute')
                newTableName = dlg.GetValue()
                data = self.tree.GetItemData(self.tree.GetSelection())
                connectionName = data['connection_name']
                databaseAbsolutePath = data['db_file_path']
                if os.path.isfile(databaseAbsolutePath):     
                    '''
                    First you rename the old table:
                    '''
                    logger.debug("TODO logic to rename table should go here.")
#                     dropTableSql="DROP TABLE '{}'".format()
                    alterTableSql = "ALTER TABLE '{}' RENAME TO {}".format(oldTableName, newTableName)
                    db = ManageSqliteDatabase(connectionName=connectionName , databaseAbsolutePath=databaseAbsolutePath)
                    try:
                        db.executeText(alterTableSql)
                    except Exception as e:
                        self.consoleOutputLog(e)
            self.recreateTree(event)
        dlg.Destroy()
        
    def consoleOutputLog(self, exception=None):
        now = datetime.datetime.now()
        strftime = now.strftime("%Y-%m-%d %H:%M:%S")
        newline = "\n"
        if self.GetTopLevelParent()._mgr.GetPane("consoleOutput").window.text.Value.strip() == "":
            newline = ""
        self.GetTopLevelParent()._mgr.GetPane("consoleOutput").window.text.AppendText("{}{} {}".format(newline, strftime, exception))
    def onEditTable(self, event):
        logger.debug('onEditTable')

    def OnItemBackground(self, event):
        logger.debug('OnItemBackground')
        try:
            pt = event.GetPosition();
            item, flags = self.tree.HitTest(pt)
            self.tree.EditLabel(item)
        except Exception as e:
            logger.error(e, exc_info=True)

    def onConnectDb(self, event):
        logger.debug('onConnectDb')
#         item = self.tree.GetSelection() 
        try:
            if self.tree.GetItemText(self.tree.GetSelection()) not in self.connDict.keys():
                selectedItemId = self.tree.GetSelection()
                if self.getNodeOnOpenConnection(selectedItemId=selectedItemId):
        #         self.addNode(targetNode=, nodeLabel='got conncted',pydata=data, image=16)
                # Todo change icon to enable
                        selectedItemText = self.tree.GetItemText(self.tree.GetSelection())
                        self.setAutoCompleteText(selectedItemText)
                        pub.sendMessage('onNewWorksheet', event=event)
#                         self.openWorksheet(sheetName="Worksheet")
                self.connDict[self.tree.GetItemText(self.tree.GetSelection())] = {
                    'isConnected':True,
                    'data':self.tree.GetItemData(self.tree.GetSelection())
                    }
        except Exception as e:
            logger.error(e, exc_info=True)
    
    def setAutoCompleteText(self, selectedItemText):
        '''
        This is to set autocomplete text as we connect to database
        '''
        logger.debug(selectedItemText)
        if hasattr(self.GetTopLevelParent(), '_mgr'):
            tb1 = self.GetTopLevelParent()._mgr.GetPane("viewToolbar").window
            choice = self.GetTopLevelParent()._ctrl.GetChoices()
            textCtrl = self.GetTopLevelParent()._ctrl
            textCtrl.SetValue(selectedItemText)
    #         textCtrl.SetSelection(choice.index(selectedItemText))
            textCtrl.SetInsertionPointEnd()
            textCtrl.SetSelection(-1, -1)
            textCtrl._showDropDown(False)
    
    def onDisconnectDb(self, event):
        logger.debug('onDisconnectDb')
        del self.connDict[self.tree.GetItemText(self.tree.GetSelection())]
        selectedItem = self.tree.GetSelection()
        if selectedItem:
            self.tree.DeleteChildren(selectedItem)

            # Todo change icon to dissable
    def onOpenSqlEditorTab(self, event):
        logger.debug('onOpenSqlEditorTab')
#         self.openWorksheet(sheetName="Worksheet")
        pub.sendMessage('onNewWorksheet', event=event, extra1='onJavaPerspective')

    def openWorksheet(self, sheetName="tableName"):
        if hasattr(self.GetTopLevelParent(), '_mgr'):
            tableInfo= CreatingTableInfoPanel(self, -1, style=wx.CLIP_CHILDREN |wx.BORDER_NONE, tableName=sheetName)
            sqlExecutionTab = self.GetTopLevelParent()._mgr.addTabByWindow(window=tableInfo , imageName="script.png", captionName=sheetName, tabDirection=5)
#             if sqlExecutionTab.window:
#                 sqlExecutionTab.window.addTab(name=sheetName)
    
    def onProperties(self, event):
        logger.debug('onProperties')
        if event.Id==ID_CONNECTION_PROPERTIES:
            logger.debug('onProperties')
        
    def onImport(self, event=None):
        logger.debug('onImport')
        selectedItem = self.tree.GetSelection()
        connectionName = self.tree.GetItemText(selectedItem)
        frame = ImportingCsvExcelFrame(None, 'Import CSV Excel', connectionName)
        frame.Show()
        
    def onRefresh(self, event=None):
        logger.debug('onRefresh')
        '''
        1. find current active connection.
        2. refresh only that connection.
        '''
        ##################################################################################
        sqlExecuter = SQLExecuter(database='_opal.sqlite')
        textCtrl = self.GetTopLevelParent()._ctrl
        selectedItemText = textCtrl.GetValue()
        dbFilePath = sqlExecuter.getDbFilePath(selectedItemText)
        logger.debug("dbFilePath: %s", dbFilePath)
        
        ##################################################################################
#         selectedItem = self.tree.GetSelection()
#         if selectedItem:
#             self.tree.DeleteChildren(selectedItem)        
#             self.getNodeOnOpenConnection(selectedItemId)
    def onEditConnection(self, event):
        logger.debug('onEditConnection')
        
    def onDeleteWithDatabaseTable(self, event):
        logger.debug('onDeleteWithDatabaseTable')
#         self.onDeleteConnection(event)
        ##################################################################################
        sqlExecuter = SQLExecuter(database='_opal.sqlite')
        selectedItemId = self.tree.GetSelection()
        selectedItemText = self.tree.GetItemText(self.tree.GetSelection())
        dbFilePath = sqlExecuter.getDbFilePath(selectedItemText)
        logger.debug("dbFilePath: %s", dbFilePath)
        
        ##################################################################################
        fileOperations = FileOperations()
        fileRemoved = fileOperations.removeFile(filename=dbFilePath)
        if selectedItemText and fileRemoved:
            self.sqlExecuter.removeConnctionRow(selectedItemText)
            self.recreateTree()

    def onDeleteConnection(self, event):
        logger.debug('onDeleteConnection')
        selectedItemId = self.tree.GetSelection()
        selectedItemText = self.tree.GetItemText(self.tree.GetSelection())
        logger.debug(selectedItemText)
        if selectedItemText:
            self.sqlExecuter.removeConnctionRow(selectedItemText)
            self.recreateTree()
            
    def onCreateErDiagramItem(self, event):
        logger.debug('onCreateErDiagramItem')
        ##################################################################################
        sqlExecuter = SQLExecuter(database='_opal.sqlite')
        textCtrl = self.GetTopLevelParent()._ctrl
        selectedItemText = textCtrl.GetValue()
        dbFilePath = sqlExecuter.getDbFilePath(selectedItemText)
        logger.debug("dbFilePath: %s", dbFilePath)
        
        ################################################################################## 
        depth = self.tree.GetItemData(self.tree.GetSelection())['depth']   
        if os.path.isfile(dbFilePath):     
            dbObjects = ManageSqliteDatabase(connectionName=selectedItemText , databaseAbsolutePath=dbFilePath).getObject()   
             
        createErDiagramFrame = CreateErDiagramFrame(None)
        createErDiagramFrame.setDbObjects(dbObjects=dbObjects)
        createErDiagramFrame.Show()        

    def onNewTable(self, event):
        logger.debug('onNewTable')
        item = self.tree.item  
        connectionName = self.tree.GetItemText(self.tree.GetItemParent(item))
        
        newTableName = SQLUtils().definingTableName(connectionName)
        
        tableFrame = CreatingTableFrame(None, 'Table creation', connectionName, newTableName)
#         frame = CreateTableFrame(None, 'table creation')
    
#         tableDict = dict()
#         tableFrame.setData(tableDict)
        tableFrame.Show()
#         app.MainLoop()
        
    def onNewView(self, event):
        logger.debug('onNewView')

#         tableFrame = CreateTableFrame(None, 'Table creation')
    def onNewColumn(self, event):
        logger.debug('onNewColumn')
        logger.debug("TODO add a new column")

    def onNewIndex(self, event):
        logger.debug('onNewIndex')
        logger.debug("TODO add a new Index")
#         tableFrame = CreateTableFrame(None, 'Table creation')
        
    def getNodeOnOpenConnection(self, selectedItemId=None, data=None):
        '''
        This method will return database node on open connection
        '''
        isSuccessfullyConnected = False
        logger.debug('getNodeOnOpenConnection')
        if selectedItemId:
            data = self.tree.GetItemData(selectedItemId)
        connectionName = data['connection_name']
        databaseAbsolutePath = data['db_file_path']
        
        self.deleteChildren(selectedItemId)
        
        if os.path.isfile(databaseAbsolutePath):     
            dbObjects = ManageSqliteDatabase(connectionName=connectionName , databaseAbsolutePath=databaseAbsolutePath).getObject() 
            isSuccessfullyConnected = True
            for dbObject in dbObjects[1]:
                for k0, v0 in dbObject.items():
                    logger.debug("k0 : %s, v0: %s", k0, v0)
                    data = dict()
                    data['depth'] = 2
                    data['connection_name'] = connectionName
                    data['db_file_path'] = databaseAbsolutePath
                    image = 2
                    nodeLabel = k0 + ' (' + str(len(v0)) + ')'
                    
                    child0 = self.addNode(targetNode=selectedItemId, nodeLabel=nodeLabel, pydata=data, image=image) 
                    if 'table' == k0 :
                        # setting image for 'table'
                        image = 4
                    elif 'index' == k0 :
                        # setting image for 'index'
                        image = 5
                    elif 'view' == k0 :
                        # setting image for 'view'
                        image = 6
    #                 child = self.tree.AppendItem(selectedItemId, k0 + ' (' + str(len(items)) + ')', image=count)
                    for v00 in v0:
                        for k1, v1 in v00.items():
                            # Listing tables
                            data = dict()
                            data['depth'] = 3
                            data['connection_name'] = connectionName
                            data['db_file_path'] = databaseAbsolutePath
                            nodeLabel = k1 
                            if k0 == 'table':
                                image = 4
                            child1 = self.addNode(targetNode=child0, nodeLabel=nodeLabel, pydata=data, image=image) 
                            
#                             logger.debug("k1 : %s, v1: %s", k1, v1)
                            if k0 == 'table':
                                data = dict()
                                data['depth'] = 4
                                data['connection_name'] = connectionName
                                data['db_file_path'] = databaseAbsolutePath
                                # setting  image for 'Columns', 'Unique Keys', 'Foreign Keys', 'References'
                                image = 11
                                
                                child1_1 = self.addNode(targetNode=child1, nodeLabel='Columns' + ' (' + str(len(v1)) + ')', pydata=data, image=image) 
                                child1_2 = self.addNode(targetNode=child1, nodeLabel='Unique Keys', pydata=data, image=image) 
                                child1_3 = self.addNode(targetNode=child1, nodeLabel='Foreign Keys', pydata=data, image=image) 
                                child1_4 = self.addNode(targetNode=child1, nodeLabel='References', pydata=data, image=image) 
                            for v2 in v1:
                                if k0 == 'table':
                                    data = dict()
                                    data['depth'] = 5
                                    data['connection_name'] = connectionName
                                    data['db_file_path'] = databaseAbsolutePath
    #                                  (cid integer, name text, type text, nn bit, dflt_value, pk bit)
                                    nodeLabel = v2[1]
                                    image = 18
                                    if v2[5] == 1:
                                        # setting primary key image
                                        image = 9
                                    elif v2[5] == 0 and v2[2] in ['INTEGER', 'INT']:
                                        # setting INTEGER image
                                        image = 7
                                    elif v2[5] == 0 :
                                        for datatype in ['VARCHAR', 'CHAR', 'REAL', 'TEXT']:
                                            if v2[2].lower().startswith(datatype.lower()):
                                                # setting VARCHAR image
                                                image = 18
                                                break
                                    child2 = self.addNode(targetNode=child1_1, nodeLabel=nodeLabel, pydata=data, image=image) 
        else:
            updateStatus = "Unable to connect '" + databaseAbsolutePath + ".' No such file. "
            self.consoleOutputLog(updateStatus)
            font = self.GetTopLevelParent().statusbar.GetFont() 
            font.SetWeight(wx.BOLD) 
            self.GetTopLevelParent().statusbar.SetFont(font) 
            self.GetTopLevelParent().statusbar.SetForegroundColour(wx.RED) 
            self.GetTopLevelParent().statusbar.SetStatusText(updateStatus, 1)
            logger.error(updateStatus)
            
        return isSuccessfullyConnected
Ejemplo n.º 16
0
class OtherViewBaseTreePanel(ExpansionState, TreeCtrl):
    '''
    Left navigation tree in preferences page
    '''
    def __init__(self, parent):

        TreeCtrl.__init__(self,
                          parent,
                          style=wx.TR_HIDE_ROOT | wx.TR_DEFAULT_STYLE
                          | wx.TR_HAS_VARIABLE_ROW_HEIGHT | wx.BORDER_NONE)

        self._il = None
        self.BuildTreeImageList()

        #         if USE_CUSTOMTREECTRL:
        #             self.SetSpacing(10)
        #             self.SetWindowStyle(self.GetWindowStyle() & ~wx.TR_LINES_AT_ROOT)

        self.SetInitialSize((100, 80))

    def AppendItem(self, parent, text, image=-1, wnd=None):

        item = TreeCtrl.AppendItem(self, parent, text, image=image)
        return item

    def BuildTreeImageList(self):
        #         imgList = wx.ImageList(16, 16)
        #
        #         for png in _demoPngs:
        #             imgList.Add(catalog[png].GetBitmap())
        #
        #         # add the image for modified demos.
        #         imgList.Add(catalog["custom"].GetBitmap())
        #
        #         self.AssignImageList(imgList)
        if self._il:
            self._il.Destroy()
            self._il = None
        self._il = wx.ImageList(16, 16)
        self.SetImageList(self._il)

        self.ImageList.RemoveAll()
        self.iconsDictIndex = {}
        count = 0
        self.fileOperations = FileOperations()

        for imageName in [
                'preference.png',
                'folder.png',
                'folder_view.png',
                'fileType_filter.png',
                'usb.png',
                'stop.png',
                'java.png',
                'python_module.png',
                'xml.png',
                "other_view.png",
                'gitrepository.png',
                'jperspective.png',
                'javaee_perspective.png',
                'python_perspective.png',
                'database.png',
                'resource_persp.png',
                'debug_persp.png',
                'jpa.png',
                'web_perspective.png',
                'javascript_perspective.png',
                'plugin_perspecitve.png',
                'svn_perspective.png',
                'remote_perspective.png',
                'browse_persp.png',
                'perspective-planning.png',
                'database_debug_perspective.png',
                'java_type_hierarchy.png',
                'xml_perspective.png',
                'synch_synch.png',
        ]:
            try:
                self.ImageList.Add(
                    self.fileOperations.getImageBitmap(imageName=imageName))
                self.iconsDictIndex[imageName] = count
                count += 1
            except Exception as e:
                logger.error(imageName, e)

    def GetItemIdentity(self, item):
        return self.GetItemData(item)

    def Freeze(self):
        if 'wxMSW' in wx.PlatformInfo:
            return super(OtherViewBaseTreePanel, self).Freeze()

    def Thaw(self):
        if 'wxMSW' in wx.PlatformInfo:
            return super(OtherViewBaseTreePanel, self).Thaw()
Ejemplo n.º 17
0
class ThumbnailCtrlPaginationPanel(wx.Panel, WorkspaceHelper):

    def __init__(self, parent):
        wx.Panel.__init__(self, parent)
        WorkspaceHelper.__init__(self)
        pub.subscribe(self.reloadingDatabase, 'reloadingDatabase')
        vBox = wx.BoxSizer(wx.VERTICAL)
        ####################################################################
        self.libraryPath = self.getLibraryPath()
        self.fileDropTarget = FileDropTarget(self, libraryPath=self.libraryPath)
        self.fileOperations = FileOperations()
        self.search = wx.SearchCtrl(self, size=(200, -1), style=wx.TE_PROCESS_ENTER)
        self.search.ShowSearchButton(1)
        self.search.ShowCancelButton(1)
        self.search.SetMenu(None)
        self.search.Bind(wx.EVT_TEXT_ENTER, self.OnSearch)
        self.search.Bind(wx.EVT_TEXT, self.OnSearch)
                
        self.thumbnailCtrl = ThumbnailCtrl(self, -1, imagehandler=NativeImageHandler)
        self.thumbnailCtrl.EnableToolTips(enable=True)
        self.thumbnailCtrl.SetDropTarget(self.fileDropTarget)
#         self.thumbnailCtrl.ShowDir(r'/home/vijay/Pictures')
#         findingBook = FindingBook(libraryPath=r'/docs/new/library')
#         books = findingBook.searchingBook(searchText='head')
        self.page = Page()
        self.loadingBook()
        self.paginationBar = self.constructTopToolBar()
        self.setPaginationBarStatus()
        ####################################################################
        vBox.Add(self.search , 0, wx.EXPAND | wx.ALL)
        vBox.Add(self.thumbnailCtrl , 1, wx.EXPAND | wx.ALL)
        vBox.Add(self.paginationBar , 0, wx.EXPAND | wx.ALL, 0)
#         vBox.Add(self.tree , 1, wx.EXPAND | wx.ALL)
        sizer = wx.BoxSizer(wx.VERTICAL)
        sizer.Add(vBox, 1, wx.EXPAND , 0)
        self.SetSizer(sizer)

    @debounce(1)
    def OnSearch(self, event):
        logger.debug('onSearch')
        self.page.searchText = self.search.GetValue()
        self.loadingBook(searchText=self.search.GetValue())
        self.updatePangnation()

    def loadingBook(self, searchText=None):
        
        books = None
        totalBooks=0
        count = 0
        if self.libraryPath and os.path.exists(self.libraryPath):
            findingBook = FindingBook(libraryPath=self.libraryPath)
            if self.page.searchText:
                books, count = findingBook.searchingBook(searchText=self.page.searchText, pageSize=self.page.pageSize, offset=self.page.pageSize * self.page.currentPage)
            else:
                books, count = findingBook.findAllBooks(pageSize=self.page.pageSize, offset=self.page.pageSize * self.page.currentPage)
            totalBooks=findingBook.countAllBooks()
        self.page.pageData = books
        self.page.total = count
        self.page.pages = int(self.page.total // self.page.pageSize) + 1
        self.page.searchText = searchText
        
        self.thumbnailCtrl.ShowBook(books)
        
        
        
        self.updateStatusBar(text=f'found : {count} of {totalBooks}')
        
        # update pagination toolbar status
        
#         self.setPaginationBarStatus()
    def updateStatusBar(self, text=None):
            if text and str(type(self.GetTopLevelParent())) == "<class 'src.view.TheEclipseView.EclipseMainFrame'>":
                self.GetTopLevelParent().SetStatusText(text, 0)        

    def setPaginationBarStatus(self):
        logger.debug(f'setPaginationBarStatus:{self.page.pages}')
        if self.page.pages == 1:
            self.paginationBar.EnableTool(ID_FIRST_RESULT, False)
            self.paginationBar.EnableTool(ID_PREVIOUS_RESULT, False)
            self.paginationBar.EnableTool(ID_NEXT_RESULT, False)         
            self.paginationBar.EnableTool(ID_LAST_RESULT, False)
        if self.page.pages > 1:
            self.paginationBar.EnableTool(ID_FIRST_RESULT, False)
            self.paginationBar.EnableTool(ID_PREVIOUS_RESULT, False)
            self.paginationBar.EnableTool(ID_NEXT_RESULT, True)         
            self.paginationBar.EnableTool(ID_LAST_RESULT, True)
        self.paginationBar.Realize()

    def updatePangnation(self): 
        pageNumbers = [f'{1+pageNum}' for pageNum in range(self.page.pages)] 
        if hasattr(self, 'pageNumbersCountText'):
            self.pageNumbersCountText.SetLabel(f"/{len(pageNumbers)}")
        self.setPaginationBarStatus()
#         if hasattr(self, 'pageNumberCtrl'):
#             self.pageNumberCtrl.Set(pageNumbers)
#             self.pageNumberCtrl.SetSelection(0)

    def constructTopToolBar(self):

        # create some toolbars
        tb1 = aui.AuiToolBar(self, -1, wx.DefaultPosition, (10, 10), agwStyle=aui.AUI_TB_DEFAULT_STYLE | aui.AUI_TB_OVERFLOW)

#         tb1.SetToolBitmapSize(wx.Size(16, 16))
        # id, name, image, name, method, kind
        pageSizeText = TransparentText(tb1, -1, "Page Size")
#         tb1.AddControl(pageSizeText)
        pageNumber = [f'{pageNum}' for pageNum in range(5, 101, 20)]       
        self.pageSizeCtrl = wx.Choice(tb1, 10, (-1, -1), (50, 25), pageNumber, style=0)
        index = pageNumber.index(f'{self.page.pageSize}')
        self.pageSizeCtrl.SetSelection(index)
        
        pageNumbers = [f'{1+pageNum}' for pageNum in range(self.page.pages)]            
        self.pageNumberCtrl = wx.Choice(tb1, 11, (-1, -1), (50, 25), pageNumbers, style=0)
        self.pageNumberCtrl.SetSelection(0)
        self.pageNumbersCountText = TransparentText(tb1, -1, f"/{len(pageNumbers)}")
#         tb1.AddControl(choice)
        tools = [
            ('control', pageSizeText),
            ('control', self.pageSizeCtrl),
            (ID_FIRST_RESULT, "First", "resultset_first.png", 'First', lambda e:self.onToolButtonClick(e), wx.ITEM_NORMAL),
            (ID_PREVIOUS_RESULT, "Previous", "resultset_previous.png", 'Previous', lambda e:self.onToolButtonClick(e), wx.ITEM_NORMAL),
            ('control', self.pageNumberCtrl),
            ('control', self.pageNumbersCountText),
            (ID_NEXT_RESULT, "Next", "resultset_next.png", 'Next', lambda e:self.onToolButtonClick(e), wx.ITEM_NORMAL),
            (ID_LAST_RESULT, "Last", "resultset_last.png", 'Last', lambda e:self.onToolButtonClick(e), wx.ITEM_CHECK),
            
#             (ID_REFRESH_ROW, "Result refresh", "resultset_refresh.png", 'Result refresh \tF5', self.onRefresh),
#             (ID_ADD_ROW, "Add a new row", "row_add.png", 'Add a new row', self.onAddRow),
#             (ID_DUPLICATE_ROW, "Duplicate selected row", "row_copy.png", 'Duplicate selected row', self.onDuplicateRow),
#             (ID_DELETE_ROW, "Delete selected row", "row_delete.png", 'Delete selected row', self.onDeleteRow),
            ]
        for tool in tools:
            if len(tool) == 0:
                tb1.AddSeparator()
            elif len(tool) == 2:
                tb1.AddControl(tool[1])
            else:
                logger.debug(tool)
                toolItem = tb1.AddSimpleTool(tool[0], tool[1], self.fileOperations.getImageBitmap(imageName=tool[2]), kind=tool[5], short_help_string=tool[3])
                
                if tool[4]:
                    self.Bind(wx.EVT_MENU, tool[4], id=tool[0])

#         tb1.AddControl(choice)
        self.Bind(wx.EVT_CHOICE, self.onPageNumberCtrl, self.pageNumberCtrl)
        self.Bind(wx.EVT_CHOICE, self.onPageSizeCtrl, self.pageSizeCtrl)
        tb1.Realize()

        return tb1

    def onPageNumberCtrl(self, event):
        logger.debug('onPageNumberCtrl')
        self.page.currentPage = int(event.GetString()) - 1
        self.loadingBook()

    def onPageSizeCtrl(self, event):
        logger.debug('onPageSizeCtrl')
        self.page.pageSize = int(event.GetString())
        self.loadingBook()
        if hasattr(self, 'pageNumberCtrl'):
            pageNumbers = [f'{1+pageNum}' for pageNum in range(self.page.pages)] 
            self.pageNumberCtrl.Set(pageNumbers)
            self.pageNumberCtrl.SetSelection(0)
        if hasattr(self, 'pageNumbersCountText'):
            self.pageNumbersCountText.SetLabel(f"/{len(pageNumbers)}")
        
        self.setPaginationBarStatus()

    def onToolButtonClick(self, e):
        if e.Id == ID_FIRST_RESULT:
            logger.debug('ID_FIRST_RESULT')
            self.pageNumberCtrl.SetSelection(self.page.getFirstPageNumber())
            self.paginationBar.EnableTool(ID_FIRST_RESULT, False)
            self.paginationBar.EnableTool(ID_PREVIOUS_RESULT, False)
            self.paginationBar.EnableTool(ID_NEXT_RESULT, True)
        if e.Id == ID_PREVIOUS_RESULT:
            
            logger.debug('ID_PREVIOUS_RESULT')
            if self.page.hasPrevious():
                self.paginationBar.EnableTool(ID_NEXT_RESULT, True)
                self.paginationBar.EnableTool(ID_LAST_RESULT, True)
                self.pageNumberCtrl.SetSelection(self.page.getPreviousPageNumber())
            else:
                self.paginationBar.EnableTool(ID_PREVIOUS_RESULT, False)
                self.paginationBar.EnableTool(ID_FIRST_RESULT, False)
                
        if e.Id == ID_NEXT_RESULT:
            logger.debug('ID_NEXT_RESULT')
            if self.page.hasNext():
                self.paginationBar.EnableTool(ID_PREVIOUS_RESULT, True)
                self.paginationBar.EnableTool(ID_FIRST_RESULT, True)
                self.paginationBar.EnableTool(ID_LAST_RESULT, True)
                nextPageNumber = self.page.getNextPageNumber()
                logger.debug(nextPageNumber)
                self.pageNumberCtrl.SetSelection(nextPageNumber)
            else:
                self.paginationBar.EnableTool(ID_NEXT_RESULT, False)
                self.paginationBar.EnableTool(ID_LAST_RESULT, False)
                
        if e.Id == ID_LAST_RESULT:
            logger.debug('ID_LAST_RESULT')
            self.pageNumberCtrl.SetSelection(self.page.getLastPageNumber())
            self.paginationBar.EnableTool(ID_LAST_RESULT, False)
            self.paginationBar.EnableTool(ID_NEXT_RESULT, False)
            self.paginationBar.EnableTool(ID_FIRST_RESULT, True)
            self.paginationBar.EnableTool(ID_PREVIOUS_RESULT, True)
        self.paginationBar.Realize()
        self.loadingBook()
        self.updatePangnation()

    def reloadingDatabase(self, event):
        logger.debug('reloadingDatabase')
        self.createDatabase = CreateDatabase(libraryPath=self.libraryPath)
        self.createDatabase.creatingDatabase()
        self.createDatabase.addingData()
        self.loadingBook(searchText=self.search.GetValue())
Ejemplo n.º 18
0
class OtherViewBaseTreePanel(ExpansionState, TreeCtrl):
    '''
    Left navigation tree in preferences page
    '''

    def __init__(self, parent):

        TreeCtrl.__init__(self, parent, style=wx.TR_HIDE_ROOT | wx.TR_DEFAULT_STYLE | 
                               wx.TR_HAS_VARIABLE_ROW_HEIGHT | wx.BORDER_NONE)

        self._il = None
        self.BuildTreeImageList()

#         if USE_CUSTOMTREECTRL:
#             self.SetSpacing(10)
#             self.SetWindowStyle(self.GetWindowStyle() & ~wx.TR_LINES_AT_ROOT)

        self.SetInitialSize((100, 80))

    def AppendItem(self, parent, text, image=-1, wnd=None):

        item = TreeCtrl.AppendItem(self, parent, text, image=image)
        return item

    def BuildTreeImageList(self):
#         imgList = wx.ImageList(16, 16)
#
#         for png in _demoPngs:
#             imgList.Add(catalog[png].GetBitmap())
#
#         # add the image for modified demos.
#         imgList.Add(catalog["custom"].GetBitmap())
#
#         self.AssignImageList(imgList)
        if self._il:
            self._il.Destroy()
            self._il = None
        self._il = wx.ImageList(16, 16)
        self.SetImageList(self._il)

        self.ImageList.RemoveAll()
        self.iconsDictIndex = {}
        count = 0
        self.fileOperations = FileOperations()
        imageNameSet = set()
        for data in importProjectDataList:
            for dx in data:
                if type(dx) == type(list()):
                    for d in dx:
                        imageNameSet.add(d[2])
            imageNameSet.add(data[2])
        imageNameList = list(imageNameSet)
        
#         for imageName in ['preference.png', 'folderType_filter.png', 'eclipse_open_folder.png', 'fileType_filter.png', 'usb.png', 'stop.png',
#                           'java.png', 'python_module.png', 'xml.png', "other_view.png", 'console_view.png', 'register_view.png',
#                           'debug_view.png' , 'history_view.png', 'compare_view.png', 'breakpoint_view.png', 'watchlist_view.png',
#                           'history_view.png', 'synch_synch.png', 'variable_view.png', 'internal_browser.png', 'reflog.png', 'staging.png',
#                           'rebase_interactive.png', 'repo_rep.png', 'gitrepository.png','filenav_nav.png','welcome16.png','tasks_tsk.png',
#                           'resource_persp.png','outline_co.png']:
        imageNameList.extend(['other_view.png', 'eclipse_open_folder.png'])
        for imageName in imageNameList: 
            try:
                self.ImageList.Add(self.fileOperations.getImageBitmap(imageName=imageName))
                self.iconsDictIndex[imageName] = count
                count += 1
            except Exception as e:
                logger.error(e)

    def GetItemIdentity(self, item):
        return self.GetItemData(item)

    def Freeze(self):
        if 'wxMSW' in wx.PlatformInfo:
            return super(OtherViewBaseTreePanel, self).Freeze()

    def Thaw(self):
        if 'wxMSW' in wx.PlatformInfo:
            return super(OtherViewBaseTreePanel, self).Thaw()
class RichTextPanel(wx.Panel):
    def __init__(self, parent=None, *args, **kw):
        wx.Panel.__init__(self, parent, id=-1)
        self.parent = parent

        #         self.MakeMenuBar()
        self.tbar = self.MakeToolBar()
        #         self.CreateStatusBar()
        #         self.SetStatusText("Welcome to wx.richtext.RichTextCtrl!")

        self.rtc = rt.RichTextCtrl(self,
                                   -1,
                                   style=wx.VSCROLL | wx.HSCROLL
                                   | wx.NO_BORDER)
        #         handler = rt.RichTextHTMLHandler()
        wx.CallAfter(self.rtc.SetFocus)

        #         self.rtc.Freeze()
        #         self.rtc.BeginSuppressUndo()
        #
        #         self.rtc.EndSuppressUndo()
        #         self.rtc.Thaw()

        sizer = wx.BoxSizer(wx.VERTICAL)
        sizer.Add(self.tbar, 0, wx.EXPAND | wx.ALL, 1)
        sizer.Add(self.rtc, 1, wx.EXPAND | wx.ALL, 1)
        #         sizer.Add(save_button, 1, wx.EXPAND | wx.ALL, 1)

        self.SetSizer(sizer)
        self.book = args[0]
        self.loadFile()
#         self.Show()

    def loadFile(self):
        #         path = os.path.join('/docs/github/Opal/src/ui/view/opalview', 'bookInfo.html')

        out = StringIO()
        htmlhandler = rt.RichTextHTMLHandler()
        buffer = self.rtc.GetBuffer()
        #         htmlhandler.SetFlags(rt.RICHTEXT_HANDLER_SAVE_IMAGES_TO_MEMORY)
        htmlhandler.SetFontSizeMapping([7, 9, 11, 12, 14, 22, 100])
        logger.debug('canload: %s', htmlhandler.CanLoad())
        logger.debug('cansave: %s', htmlhandler.CanSave())
        logger.debug('CanHandle: %s', htmlhandler.CanHandle('bookInfo.html'))
        rt.RichTextBuffer.AddHandler(htmlhandler)
        #         buffer.AddHandler(htmlhandler)
        try:
            if self.book != None:
                out.write(self.book.bookDescription)
            out.seek(0)
        except Exception as e:
            logger.error(e)
#         htmlhandler.LoadStream(buffer, out)
#         htmlhandler.LoadFile(path,'text')
        if self.book != None and self.book.bookDescription != None:
            self.rtc.AppendText(self.book.bookDescription)
#         htmlhandler.LoadStream(buffer, out.getvalue())
        self.rtc.Refresh()
#         buffer = self.rtc.GetBuffer()
# you have to specify the type of data to load and the control
# must already have an instance of the handler to parse it
#         buffer.LoadStream(stream, rt.RICHTEXT_TYPE_HTML)

#         self.rtc.Refresh()
#         self.rtc.LoadFile(path,  type=1)

    def OnFileSave(self, evt):
        #         self.loadFile()
        self.GetParent().save()

#         handler = rt.RichTextHTMLHandler()
#         handler.SetFlags(rt.RICHTEXT_HANDLER_SAVE_IMAGES_TO_MEMORY)
#         handler.SetFontSizeMapping([7, 9, 11, 12, 14, 22, 100])
#
#         import cStringIO
#         stream = cStringIO.StringIO()
#         if not handler.SaveStream(self.rtc.GetBuffer(), stream):
#             return
#         html_content = stream.getvalue()
#         print html_content

    def SetFontStyle(self,
                     fontColor=None,
                     fontBgColor=None,
                     fontFace=None,
                     fontSize=None,
                     fontBold=None,
                     fontItalic=None,
                     fontUnderline=None):
        if fontColor:
            self.textAttr.SetTextColour(fontColor)
        if fontBgColor:
            self.textAttr.SetBackgroundColour(fontBgColor)
        if fontFace:
            self.textAttr.SetFontFaceName(fontFace)
        if fontSize:
            self.textAttr.SetFontSize(fontSize)
        if fontBold != None:
            if fontBold:
                self.textAttr.SetFontWeight(wx.FONTWEIGHT_BOLD)
            else:
                self.textAttr.SetFontWeight(wx.FONTWEIGHT_NORMAL)
        if fontItalic != None:
            if fontItalic:
                self.textAttr.SetFontStyle(wx.FONTSTYLE_ITALIC)
            else:
                self.textAttr.SetFontStyle(wx.FONTSTYLE_NORMAL)
        if fontUnderline != None:
            if fontUnderline:
                self.textAttr.SetFontUnderlined(True)
            else:
                self.textAttr.SetFontUnderlined(False)
        self.rtc.SetDefaultStyle(self.textAttr)

    def OnURL(self, evt):
        wx.MessageBox(evt.GetString(), "URL Clicked")

    def OnFileOpen(self, evt):
        # This gives us a string suitable for the file dialog based on
        # the file handlers that are loaded
        wildcard, types = rt.RichTextBuffer.GetExtWildcard(save=False)
        dlg = wx.FileDialog(
            self,
            "Choose a filename",
            wildcard=wildcard,
        )
        if dlg.ShowModal() == wx.ID_OK:
            path = dlg.GetPath()
            if path:
                fileType = types[dlg.GetFilterIndex()]
                self.rtc.LoadFile(path, fileType)
        dlg.Destroy()

#
#         if not self.rtc.GetFilename():
#             self.OnFileSaveAs(evt)
#             return
#         self.rtc.SaveFile()

    def OnFileSaveAs(self, evt):
        wildcard, types = rt.RichTextBuffer.GetExtWildcard(save=True)

        dlg = wx.FileDialog(
            self,
            "Choose a filename",
            wildcard=wildcard,
        )
        if dlg.ShowModal() == wx.ID_OK:
            path = dlg.GetPath()
            if path:
                fileType = types[dlg.GetFilterIndex()]
                ext = rt.RichTextBuffer.FindHandlerByType(
                    fileType).GetExtension()
                if not path.endswith(ext):
                    path += '.' + ext
                self.rtc.SaveFile(path, fileType)
        dlg.Destroy()

    def OnFileViewHTML(self, evt):
        # Get an instance of the html file handler, use it to save the
        # document to a StringIO stream, and then display the
        # resulting html text in a dialog with a HtmlWindow.
        handler = rt.RichTextHTMLHandler()
        handler.SetFlags(rt.RICHTEXT_HANDLER_SAVE_IMAGES_TO_MEMORY)
        handler.SetFontSizeMapping([7, 9, 11, 12, 14, 22, 100])

        import cStringIO
        stream = cStringIO()
        if not handler.SaveStream(self.rtc.GetBuffer(), stream):
            return

        import wx.html
        dlg = wx.Dialog(self,
                        title="HTML",
                        style=wx.DEFAULT_DIALOG_STYLE | wx.RESIZE_BORDER)
        html = wx.html.HtmlWindow(dlg, size=(500, 400), style=wx.BORDER_SUNKEN)
        html.SetPage(stream.getvalue())
        btn = wx.Button(dlg, wx.ID_CANCEL)
        sizer = wx.BoxSizer(wx.VERTICAL)
        sizer.Add(html, 1, wx.ALL | wx.EXPAND, 5)
        sizer.Add(btn, 0, wx.ALL | wx.CENTER, 10)
        dlg.SetSizer(sizer)
        sizer.Fit(dlg)

        dlg.ShowModal()

        handler.DeleteTemporaryImages()

    def OnFileExit(self, evt):
        self.Close(True)

    def OnBold(self, evt):
        self.rtc.ApplyBoldToSelection()

    def OnItalic(self, evt):
        self.rtc.ApplyItalicToSelection()

    def OnUnderline(self, evt):
        self.rtc.ApplyUnderlineToSelection()

    def OnAlignLeft(self, evt):
        self.rtc.ApplyAlignmentToSelection(wx.TEXT_ALIGNMENT_LEFT)

    def OnAlignRight(self, evt):
        self.rtc.ApplyAlignmentToSelection(wx.TEXT_ALIGNMENT_RIGHT)

    def OnAlignCenter(self, evt):
        self.rtc.ApplyAlignmentToSelection(wx.TEXT_ALIGNMENT_CENTRE)

    def OnIndentMore(self, evt):
        attr = wx.TextAttr()
        attr.SetFlags(wx.TEXT_ATTR_LEFT_INDENT)
        ip = self.rtc.GetInsertionPoint()
        if self.rtc.GetStyle(ip, attr):
            r = rt.RichTextRange(ip, ip)
            if self.rtc.HasSelection():
                r = self.rtc.GetSelectionRange()

            attr.SetLeftIndent(attr.GetLeftIndent() + 100)
            attr.SetFlags(wx.TEXT_ATTR_LEFT_INDENT)
            self.rtc.SetStyle(r, attr)

    def OnIndentLess(self, evt):
        attr = wx.TextAttr()
        attr.SetFlags(wx.TEXT_ATTR_LEFT_INDENT)
        ip = self.rtc.GetInsertionPoint()
        if self.rtc.GetStyle(ip, attr):
            r = rt.RichTextRange(ip, ip)
            if self.rtc.HasSelection():
                r = self.rtc.GetSelectionRange()

        if attr.GetLeftIndent() >= 100:
            attr.SetLeftIndent(attr.GetLeftIndent() - 100)
            attr.SetFlags(wx.TEXT_ATTR_LEFT_INDENT)
            self.rtc.SetStyle(r, attr)

    def OnParagraphSpacingMore(self, evt):
        attr = wx.TextAttr()
        attr.SetFlags(wx.TEXT_ATTR_PARA_SPACING_AFTER)
        ip = self.rtc.GetInsertionPoint()
        if self.rtc.GetStyle(ip, attr):
            r = rt.RichTextRange(ip, ip)
            if self.rtc.HasSelection():
                r = self.rtc.GetSelectionRange()

            attr.SetParagraphSpacingAfter(attr.GetParagraphSpacingAfter() + 20)
            attr.SetFlags(wx.TEXT_ATTR_PARA_SPACING_AFTER)
            self.rtc.SetStyle(r, attr)

    def OnParagraphSpacingLess(self, evt):
        attr = wx.TextAttr()
        attr.SetFlags(wx.TEXT_ATTR_PARA_SPACING_AFTER)
        ip = self.rtc.GetInsertionPoint()
        if self.rtc.GetStyle(ip, attr):
            r = rt.RichTextRange(ip, ip)
            if self.rtc.HasSelection():
                r = self.rtc.GetSelectionRange()

            if attr.GetParagraphSpacingAfter() >= 20:
                attr.SetParagraphSpacingAfter(attr.GetParagraphSpacingAfter() -
                                              20)
                attr.SetFlags(wx.TEXT_ATTR_PARA_SPACING_AFTER)
                self.rtc.SetStyle(r, attr)

    def OnLineSpacingSingle(self, evt):
        attr = wx.TextAttr()
        attr.SetFlags(wx.TEXT_ATTR_LINE_SPACING)
        ip = self.rtc.GetInsertionPoint()
        if self.rtc.GetStyle(ip, attr):
            r = rt.RichTextRange(ip, ip)
            if self.rtc.HasSelection():
                r = self.rtc.GetSelectionRange()

            attr.SetFlags(wx.TEXT_ATTR_LINE_SPACING)
            attr.SetLineSpacing(10)
            self.rtc.SetStyle(r, attr)

    def OnLineSpacingHalf(self, evt):
        attr = wx.TextAttr()
        attr.SetFlags(wx.TEXT_ATTR_LINE_SPACING)
        ip = self.rtc.GetInsertionPoint()
        if self.rtc.GetStyle(ip, attr):
            r = rt.RichTextRange(ip, ip)
            if self.rtc.HasSelection():
                r = self.rtc.GetSelectionRange()

            attr.SetFlags(wx.TEXT_ATTR_LINE_SPACING)
            attr.SetLineSpacing(15)
            self.rtc.SetStyle(r, attr)

    def OnLineSpacingDouble(self, evt):
        attr = wx.TextAttr()
        attr.SetFlags(wx.TEXT_ATTR_LINE_SPACING)
        ip = self.rtc.GetInsertionPoint()
        if self.rtc.GetStyle(ip, attr):
            r = rt.RichTextRange(ip, ip)
            if self.rtc.HasSelection():
                r = self.rtc.GetSelectionRange()

            attr.SetFlags(wx.TEXT_ATTR_LINE_SPACING)
            attr.SetLineSpacing(20)
            self.rtc.SetStyle(r, attr)

    def OnFont(self, evt):
        if not self.rtc.HasSelection():
            return

        r = self.rtc.GetSelectionRange()
        fontData = wx.FontData()
        fontData.EnableEffects(False)
        attr = wx.TextAttr()
        attr.SetFlags(wx.TEXT_ATTR_FONT)
        if self.rtc.GetStyle(self.rtc.GetInsertionPoint(), attr):
            fontData.SetInitialFont(attr.GetFont())

        dlg = wx.FontDialog(self, fontData)
        if dlg.ShowModal() == wx.ID_OK:
            fontData = dlg.GetFontData()
            font = fontData.GetChosenFont()
            if font:
                attr.SetFlags(wx.TEXT_ATTR_FONT)
                attr.SetFont(font)
                self.rtc.SetStyle(r, attr)
        dlg.Destroy()

    def OnColour(self, evt):
        colourData = wx.ColourData()
        attr = wx.TextAttr()
        attr.SetFlags(wx.TEXT_ATTR_TEXT_COLOUR)
        if self.rtc.GetStyle(self.rtc.GetInsertionPoint(), attr):
            colourData.SetColour(attr.GetTextColour())

        dlg = wx.ColourDialog(self, colourData)
        if dlg.ShowModal() == wx.ID_OK:
            colourData = dlg.GetColourData()
            colour = colourData.GetColour()
            if colour:
                if not self.rtc.HasSelection():
                    self.rtc.BeginTextColour(colour)
                else:
                    r = self.rtc.GetSelectionRange()
                    attr.SetFlags(wx.TEXT_ATTR_TEXT_COLOUR)
                    attr.SetTextColour(colour)
                    self.rtc.SetStyle(r, attr)
        dlg.Destroy()

    def OnUpdateBold(self, evt):
        evt.Check(self.rtc.IsSelectionBold())

    def OnUpdateItalic(self, evt):
        evt.Check(self.rtc.IsSelectionItalics())

    def OnUpdateUnderline(self, evt):
        evt.Check(self.rtc.IsSelectionUnderlined())

    def OnUpdateAlignLeft(self, evt):
        evt.Check(self.rtc.IsSelectionAligned(wx.TEXT_ALIGNMENT_LEFT))

    def OnUpdateAlignCenter(self, evt):
        evt.Check(self.rtc.IsSelectionAligned(wx.TEXT_ALIGNMENT_CENTRE))

    def OnUpdateAlignRight(self, evt):
        evt.Check(self.rtc.IsSelectionAligned(wx.TEXT_ALIGNMENT_RIGHT))

    def ForwardEvent(self, evt):
        # The RichTextCtrl can handle menu and update events for undo,
        # redo, cut, copy, paste, delete, and select all, so just
        # forward the event to it.
        self.rtc.ProcessEvent(evt)

#     def MakeMenuBar(self):
#
#         def doBind(item, handler, updateUI=None):
#             self.Bind(wx.EVT_MENU, handler, item)
#             if updateUI is not None:
#                 self.Bind(wx.EVT_UPDATE_UI, updateUI, item)
#
#         fileMenu = wx.Menu()
#         doBind(fileMenu.Append(-1, "&Open\tCtrl+O", "Open a file"),
#                 self.OnFileOpen)
#         doBind(fileMenu.Append(-1, "&Save\tCtrl+S", "Save a file"),
#                 self.OnFileSave)
#         doBind(fileMenu.Append(-1, "&Save As...\tF12", "Save to a new file"),
#                 self.OnFileSaveAs)
#         fileMenu.AppendSeparator()
#         doBind(fileMenu.Append(-1, "&View as HTML", "View HTML"),
#                 self.OnFileViewHTML)
#         fileMenu.AppendSeparator()
#         doBind(fileMenu.Append(-1, "E&xit\tCtrl+Q", "Quit this program"),
#                 self.OnFileExit)
#
#         editMenu = wx.Menu()
#         doBind(editMenu.Append(wx.ID_UNDO, "&Undo\tCtrl+Z"),
#                 self.ForwardEvent, self.ForwardEvent)
#         doBind(editMenu.Append(wx.ID_REDO, "&Redo\tCtrl+Y"),
#                 self.ForwardEvent, self.ForwardEvent)
#         editMenu.AppendSeparator()
#         doBind(editMenu.Append(wx.ID_CUT, "Cu&t\tCtrl+X"),
#                 self.ForwardEvent, self.ForwardEvent)
#         doBind(editMenu.Append(wx.ID_COPY, "&Copy\tCtrl+C"),
#                 self.ForwardEvent, self.ForwardEvent)
#         doBind(editMenu.Append(wx.ID_PASTE, "&Paste\tCtrl+V"),
#                 self.ForwardEvent, self.ForwardEvent)
#         doBind(editMenu.Append(wx.ID_CLEAR, "&Delete\tDel"),
#                 self.ForwardEvent, self.ForwardEvent)
#         editMenu.AppendSeparator()
#         doBind(editMenu.Append(wx.ID_SELECTALL, "Select A&ll\tCtrl+A"),
#                 self.ForwardEvent, self.ForwardEvent)
#
#         # doBind( editMenu.AppendSeparator(),  )
#         # doBind( editMenu.Append(-1, "&Find...\tCtrl+F"),  )
#         # doBind( editMenu.Append(-1, "&Replace...\tCtrl+R"),  )
#
#         formatMenu = wx.Menu()
#         doBind(formatMenu.AppendCheckItem(-1, "&Bold\tCtrl+B"),
#                 self.OnBold, self.OnUpdateBold)
#         doBind(formatMenu.AppendCheckItem(-1, "&Italic\tCtrl+I"),
#                 self.OnItalic, self.OnUpdateItalic)
#         doBind(formatMenu.AppendCheckItem(-1, "&Underline\tCtrl+U"),
#                 self.OnUnderline, self.OnUpdateUnderline)
#         formatMenu.AppendSeparator()
#         doBind(formatMenu.AppendCheckItem(-1, "L&eft Align"),
#                 self.OnAlignLeft, self.OnUpdateAlignLeft)
#         doBind(formatMenu.AppendCheckItem(-1, "&Centre"),
#                 self.OnAlignCenter, self.OnUpdateAlignCenter)
#         doBind(formatMenu.AppendCheckItem(-1, "&Right Align"),
#                 self.OnAlignRight, self.OnUpdateAlignRight)
#         formatMenu.AppendSeparator()
#         doBind(formatMenu.Append(-1, "Indent &More"), self.OnIndentMore)
#         doBind(formatMenu.Append(-1, "Indent &Less"), self.OnIndentLess)
#         formatMenu.AppendSeparator()
#         doBind(formatMenu.Append(-1, "Increase Paragraph &Spacing"), self.OnParagraphSpacingMore)
#         doBind(formatMenu.Append(-1, "Decrease &Paragraph Spacing"), self.OnParagraphSpacingLess)
#         formatMenu.AppendSeparator()
#         doBind(formatMenu.Append(-1, "Normal Line Spacing"), self.OnLineSpacingSingle)
#         doBind(formatMenu.Append(-1, "1.5 Line Spacing"), self.OnLineSpacingHalf)
#         doBind(formatMenu.Append(-1, "Double Line Spacing"), self.OnLineSpacingDouble)
#         formatMenu.AppendSeparator()
#         doBind(formatMenu.Append(-1, "&Font..."), self.OnFont)
#
#         mb = wx.MenuBar()
#         mb.Append(fileMenu, "&File")
#         mb.Append(editMenu, "&Edit")
#         mb.Append(formatMenu, "F&ormat")
#         self.SetMenuBar(mb)

    def MakeToolBar(self):
        def doBind(item, handler, updateUI=None):
            self.Bind(wx.EVT_TOOL, handler, item)
            if updateUI is not None:
                self.Bind(wx.EVT_UPDATE_UI, updateUI, item)

        self.fileOperations = FileOperations()
        tbar = wx.ToolBar(self, style=wx.TB_FLAT)
        doBind(
            tbar.AddTool(
                -1, "Open",
                self.fileOperations.getImageBitmap(
                    imageName='eclipse_open_folder.png'), "Open"),
            self.OnFileOpen)
        doBind(
            tbar.AddTool(
                -1, "Save",
                self.fileOperations.getImageBitmap(imageName='save.png'),
                "Save"), self.OnFileSave)
        tbar.AddSeparator()
        doBind(
            tbar.AddTool(
                wx.ID_CUT, "Cut",
                self.fileOperations.getImageBitmap(imageName='cut_edit.png')),
            self.ForwardEvent, self.ForwardEvent)
        doBind(
            tbar.AddTool(
                wx.ID_COPY, "Copy",
                self.fileOperations.getImageBitmap(
                    imageName='copy_edit_co.png')), self.ForwardEvent,
            self.ForwardEvent)
        doBind(
            tbar.AddTool(
                wx.ID_PASTE, "Paste",
                self.fileOperations.getImageBitmap(
                    imageName='paste_edit.png')), self.ForwardEvent,
            self.ForwardEvent)
        #         doBind(tbar.AddTool(wx.ID_COPY, images._rt_copy.GetBitmap(), shortHelpString="Copy"), self.ForwardEvent, self.ForwardEvent)
        #         doBind(tbar.AddTool(wx.ID_PASTE, images._rt_paste.GetBitmap(), shortHelpString="Paste"), self.ForwardEvent, self.ForwardEvent)
        tbar.AddSeparator()
        doBind(
            tbar.AddTool(
                wx.ID_UNDO, "Undo",
                self.fileOperations.getImageBitmap(imageName='undo_edit.png')),
            self.ForwardEvent, self.ForwardEvent)
        doBind(
            tbar.AddTool(
                wx.ID_REDO, "Redo",
                self.fileOperations.getImageBitmap(imageName='redo_edit.png')),
            self.ForwardEvent, self.ForwardEvent)
        #         doBind(tbar.AddTool(wx.ID_UNDO, images._rt_undo.GetBitmap(), shortHelpString="Undo"), self.ForwardEvent, self.ForwardEvent)
        #         doBind(tbar.AddTool(wx.ID_REDO, images._rt_redo.GetBitmap(), shortHelpString="Redo"), self.ForwardEvent, self.ForwardEvent)
        tbar.AddSeparator()
        doBind(
            tbar.AddTool(
                -1, "Bold",
                self.fileOperations.getImageBitmap(imageName='redo_edit.png')),
            self.OnBold, self.OnUpdateBold)
        doBind(
            tbar.AddTool(
                -1, "Italic",
                self.fileOperations.getImageBitmap(imageName='redo_edit.png')),
            self.OnItalic, self.OnUpdateItalic)
        doBind(
            tbar.AddTool(
                -1, "Underline",
                self.fileOperations.getImageBitmap(imageName='redo_edit.png')),
            self.OnUnderline, self.OnUpdateUnderline)
        #         doBind(tbar.AddTool(-1, images._rt_bold.GetBitmap(), isToggle=True, shortHelpString="Bold"), self.OnBold, self.OnUpdateBold)
        #         doBind(tbar.AddTool(-1, images._rt_italic.GetBitmap(), isToggle=True, shortHelpString="Italic"), self.OnItalic, self.OnUpdateItalic)
        #         doBind(tbar.AddTool(-1, images._rt_underline.GetBitmap(), isToggle=True, shortHelpString="Underline"), self.OnUnderline, self.OnUpdateUnderline)
        tbar.AddSeparator()
        doBind(
            tbar.AddTool(
                -1, "Align Left",
                self.fileOperations.getImageBitmap(imageName='redo_edit.png')),
            self.OnAlignLeft, self.OnUpdateAlignLeft)
        doBind(
            tbar.AddTool(
                -1, "Center",
                self.fileOperations.getImageBitmap(imageName='redo_edit.png')),
            self.OnAlignCenter, self.OnUpdateAlignCenter)
        doBind(
            tbar.AddTool(
                -1, "Align Right",
                self.fileOperations.getImageBitmap(imageName='redo_edit.png')),
            self.OnAlignRight, self.OnUpdateAlignRight)
        #         doBind(tbar.AddTool(-1, images._rt_alignleft.GetBitmap(), isToggle=True, shortHelpString="Align Left"), self.OnAlignLeft, self.OnUpdateAlignLeft)
        #         doBind(tbar.AddTool(-1, images._rt_centre.GetBitmap(), isToggle=True, shortHelpString="Center"), self.OnAlignCenter, self.OnUpdateAlignCenter)
        #         doBind(tbar.AddTool(-1, images._rt_alignright.GetBitmap(), isToggle=True, shortHelpString="Align Right"), self.OnAlignRight, self.OnUpdateAlignRight)
        tbar.AddSeparator()
        doBind(
            tbar.AddTool(
                -1, "Indent Less",
                self.fileOperations.getImageBitmap(imageName='redo_edit.png')),
            self.OnIndentLess)
        doBind(
            tbar.AddTool(
                -1, "Indent More",
                self.fileOperations.getImageBitmap(imageName='redo_edit.png')),
            self.OnIndentMore)
        #         doBind(tbar.AddTool(-1, images._rt_indentless.GetBitmap(), shortHelpString="Indent Less"), self.OnIndentLess)
        #         doBind(tbar.AddTool(-1, images._rt_indentmore.GetBitmap(), shortHelpString="Indent More"), self.OnIndentMore)
        tbar.AddSeparator()
        doBind(
            tbar.AddTool(
                -1, "Font",
                self.fileOperations.getImageBitmap(imageName='redo_edit.png')),
            self.OnFont)
        doBind(
            tbar.AddTool(
                -1, "Font Colour",
                self.fileOperations.getImageBitmap(imageName='redo_edit.png')),
            self.OnColour)
        #         doBind(tbar.AddTool(-1, images._rt_font.GetBitmap(), shortHelpString="Font"), self.OnFont)
        #         doBind(tbar.AddTool(-1, images._rt_colour.GetBitmap(), shortHelpString="Font Colour"), self.OnColour)

        tbar.Realize()
        return tbar
Ejemplo n.º 20
0
class SimpleGrid(wx.grid.Grid):

    def __init__(self, parent):
        wx.grid.Grid.__init__(self, parent, -1, size=(600, 500))

        self.CreateGrid(1, 1)
        self.RowLabelSize = 32
        self.dataTypeList = [("INTEGER", 0), ("VARCHAR", 1), ("TEXT", 2), ("REAL", 3), ("BLOB", 4), ("NUMERIC", 5)]
        self.checkBoxColumns = ['nullable', 'unique', 'primaryKey', 'autoIncrement']
        self.textBoxColumns = ['name', 'defultValue', 'description']
        self.comboBoxList = ['dataType']
        self.iconColumns = [0]
        self.columns = None
        
        self.fileOperations = FileOperations()
        self.addImages()
        
        self.lastSelectedCell = None
        
        self.bindAllEvent()

    def addImages(self):
        self.bmpList = list()

        self.bmpList.append(self.fileOperations.getImageBitmap(imageName="key.png"))  # 0 for primary key
        self.bmpList.append(self.fileOperations.getImageBitmap(imageName="textfield.png"))  # 1 for varchar, char, text column
        self.bmpList.append(self.fileOperations.getImageBitmap(imageName="unique_constraint.png"))  # 2  for unique key column
        self.bmpList.append(self.fileOperations.getImageBitmap(imageName="datetime.png"))  # 3 for datetime field column
        self.bmpList.append(self.fileOperations.getImageBitmap(imageName="column.png"))  #  4 for integer key column
    
    def bindAllEvent(self):
        # test all the events
        self.Bind(wx.grid.EVT_GRID_CELL_LEFT_CLICK, self.OnCellLeftClick)
        self.Bind(wx.grid.EVT_GRID_CELL_RIGHT_CLICK, self.OnCellRightClick)
        self.Bind(wx.grid.EVT_GRID_CELL_LEFT_DCLICK, self.OnCellLeftDClick)
        self.Bind(wx.grid.EVT_GRID_CELL_RIGHT_DCLICK, self.OnCellRightDClick)
 
        self.Bind(wx.grid.EVT_GRID_LABEL_LEFT_CLICK, self.OnLabelLeftClick)
        self.Bind(wx.grid.EVT_GRID_LABEL_RIGHT_CLICK, self.OnLabelRightClick)
        self.Bind(wx.grid.EVT_GRID_LABEL_LEFT_DCLICK, self.OnLabelLeftDClick)
        self.Bind(wx.grid.EVT_GRID_LABEL_RIGHT_DCLICK, self.OnLabelRightDClick)
 
        self.Bind(wx.grid.EVT_GRID_ROW_SIZE, self.OnRowSize)
        self.Bind(wx.grid.EVT_GRID_COL_SIZE, self.OnColSize)
 
        self.Bind(wx.grid.EVT_GRID_RANGE_SELECT, self.OnRangeSelect)
        self.Bind(wx.grid.EVT_GRID_CELL_CHANGED, self.OnCellChange)
        self.Bind(wx.grid.EVT_GRID_SELECT_CELL, self.OnSelectCell)
 
        self.Bind(wx.grid.EVT_GRID_EDITOR_SHOWN, self.OnEditorShown)
        self.Bind(wx.grid.EVT_GRID_EDITOR_HIDDEN, self.OnEditorHidden)
        self.Bind(wx.grid.EVT_GRID_EDITOR_CREATED, self.OnEditorCreated)
        
    ########################### Check box start ###################################    
    def OnCellLeftClick(self, evt):
        logger.debug(f"OnCellLeftClick: ({evt.GetRow()},{evt.GetCol()}) {evt.GetPosition()}")
        row = evt.GetRow()
        col = evt.GetCol()
        if evt.GetCol() in self.checkBoxColumns:
            logger.debug(self.GetCellValue(row, col))
            wx.MilliSleep(100)
#             self.toggleCheckBox(row, col)
            wx.CallLater(100, self.toggleCheckBox, (row, col))
        evt.Skip()

    def toggleCheckBox(self, cell):
        logger.debug(f'toggleCheckBox {cell}')
        try:
            self.cb.Value = not self.cb.Value
            self.afterCheckBox(self.cb.Value, cell)
        except Exception as e:
            logger.error(e, exc_info=True)

    def afterCheckBox(self, isChecked, cell):
        logger.debug(f'afterCheckBox  GridCursorRow:{self.GridCursorRow} , isChecked:{isChecked} , cell:{cell}')
        try:
            self.isChecked = isChecked
            row, col = cell
            if self.isChecked:
                self.SetCellValue(row, col, '1')
                if col == 3:
                    # Setting image icon for primary key
                    self.SetCellValue(row, 0, "0")
            else:
                # setting blank for un-check column
                self.SetCellValue(row, col, '')
                
                dataType = self.GetCellValue(row, 2)
                if dataType == 'INTEGER':
                    # setting image icon for integer column
                    self.SetCellValue(row, 0, "4")
                elif dataType in ['VARCHAR', 'CHAR', 'REAL', 'TEXT']:
                    for d in  ['VARCHAR', 'CHAR', 'REAL', 'TEXT']:
                        if dataType.lower().startswith(d.lower()):
                            self.SetCellValue(row, 0, "1")
                            break
                    # setting image icon for integer column
                
            self.Refresh()
        except Exception as e:
            logger.error(e, exc_info=True)
              
    def OnEditorCreated(self, evt):
        logger.debug(f"OnEditorCreated: ({evt.GetRow()}, {evt.GetCol()}) {evt.GetControl().Value}")
        row = evt.GetRow()
        col = evt.GetCol()
        self.lastSelectedCell = (row, col)
        # In this example, all cells in row 0 are GridCellChoiceEditors,
        # so we need to setup the selection list and bindings. We can't
        # do this in advance, because the ComboBox control is created with
        # the editor.
        if self.GetColLabelValue(col) in self.comboBoxList:
            # Get a reference to the underlying ComboBox control.
            self.comboBox = evt.GetControl()
            
            # Bind the ComboBox events.
            self.comboBox.Bind(wx.EVT_COMBOBOX, self.OnGridComboBox)
            self.comboBox.Bind(wx.EVT_TEXT, self.OnGridComboBoxText)
            
            # Load the initial choice list.
            for (item, data) in self.dataTypeList:
                self.comboBox.Append(item, data)
        elif self.GetColLabelValue(col) in self.checkBoxColumns:
            
            self.cb = evt.Control
            self.cb.WindowStyle |= wx.WANTS_CHARS

            self.cb.Bind(wx.EVT_KEY_DOWN, self.onKeyDown)
            self.cb.Bind(wx.EVT_CHECKBOX, self.onCheckBox)  
            
        logger.debug(f"After change OnEditorCreated: ({evt.GetRow()}, {evt.GetCol()}) {evt.GetControl().Value}")   
        evt.Skip()
        
    def onKeyDown(self, evt):
        if evt.KeyCode == wx.WXK_UP:
            if self.GridCursorRow > 0:
                self.DisableCellEditControl()
                self.MoveCursorUp(False)
        elif evt.KeyCode == wx.WXK_DOWN:
            if self.GridCursorRow < (self.NumberRows - 1):
                self.DisableCellEditControl()
                self.MoveCursorDown(False)
        elif evt.KeyCode == wx.WXK_LEFT:
            if self.GridCursorCol > 0:
                self.DisableCellEditControl()
                self.MoveCursorLeft(False)
        elif evt.KeyCode == wx.WXK_RIGHT:
            if self.GridCursorCol < (self.NumberCols - 1):
                self.DisableCellEditControl()
                self.MoveCursorRight(False)
        else:
            evt.Skip()

    def onCheckBox(self, evt):
        logger.debug('onCheckBox lastSelectedCell:%s', self.lastSelectedCell)
        if self.lastSelectedCell:
            self.afterCheckBox(evt.IsChecked(), cell=self.lastSelectedCell)

    ########################### Check box close ###################################    
                 
    def OnCellRightClick(self, evt):
        logger.debug(f"OnCellRightClick: ({evt.GetRow()},{evt.GetCol()}) {evt.GetPosition()})")
        evt.Skip()
 
    def OnCellLeftDClick(self, evt):
        logger.debug(f"OnCellLeftDClick: ({evt.GetRow()},{evt.GetCol()}) {evt.GetPosition()})")
        evt.Skip()
 
    def OnCellRightDClick(self, evt):
        logger.debug(f"OnCellRightDClick: ({evt.GetRow()},{evt.GetCol()}) {evt.GetPosition()})")
        evt.Skip()
 
    def OnLabelLeftClick(self, evt):
        logger.debug(f"OnLabelLeftClick: ({evt.GetRow()},{evt.GetCol()}) {evt.GetPosition()})")
        evt.Skip()
 
    def OnLabelRightClick(self, evt):
        logger.debug(f"OnLabelRightClick: ({evt.GetRow()},{evt.GetCol()}) {evt.GetPosition()})")
        evt.Skip()
 
    def OnLabelLeftDClick(self, evt):
        logger.debug(f"OnLabelLeftDClick: ({evt.GetRow()},{evt.GetCol()}) {evt.GetPosition()})")
        evt.Skip()
 
    def OnLabelRightDClick(self, evt):
        logger.debug(f"OnLabelRightDClick: ({evt.GetRow()},{evt.GetCol()}) {evt.GetPosition()})")
        evt.Skip()
 
    def OnRowSize(self, evt):
        logger.debug(f"OnRowSize: row {evt.GetRowOrCol()}, {evt.GetPosition()}")
        evt.Skip()
 
    def OnColSize(self, evt):
        logger.debug("OnColSize: col %d, %s" , evt.GetRowOrCol(),
                                           evt.GetPosition())
        evt.Skip()
 
    def OnRangeSelect(self, evt):
        if evt.Selecting():
            msg = 'Selected'
        else:
            msg = 'Deselected'
        logger.debug(f"OnRangeSelect: {msg}  top-left {evt.GetTopLeftCoords()}, bottom-right { evt.GetBottomRightCoords()}")
        evt.Skip()
 
    def updateIconColumn(self, cell=None, cellValue=None):
        row, col = cell
        logger.debug(f'updateIconColumn {cell}, {cellValue}')
        self.columns[row].__setattr__(self.GetColLabelValue(col), cellValue)
        self.GetParent().sqlType.columns = self.columns
        pub.sendMessage('OnCellChange', sqlType=self.GetParent().sqlType)
#         if self.GetColLabelValue(col) == 'dataType':
#         targetRow = row
#         targetCol=0
#         if cellValue in ["INTEGER", "INT"]:
#             self.SetCellValue(targetRow, targetCol, "4")
#         elif cellValue.upper() in ['VARCHAR', 'CHAR', 'REAL', 'TEXT']:
# #                 self.SetCellValue(targetRow, targetCol,"1")
#             isPrimaryKey = self.GetCellValue(row, 3)
#             if not isPrimaryKey == 1:
#                 for d in  ['VARCHAR', 'CHAR', 'REAL', 'TEXT']:
#                     if cellValue.lower().startswith(d.lower()):
#                         self.SetCellValue(targetRow, targetCol, "1")
#                         break 

    def OnCellChange(self, evt):
 
        # Show how to stay in a cell that has bad data.  We can't just
        # call SetGridCursor here since we are nested inside one so it
        # won't have any effect.  Instead, set coordinates to move to in
        # idle time.
        sourceValue = self.GetCellValue(evt.GetRow(), evt.GetCol())
        logger.debug(f"OnCellChange: ({evt.GetRow()},{evt.GetCol()}) {evt.GetPosition()} , cellValue : {sourceValue}")
        sourceRow = evt.GetRow()
        sourceCol = evt.GetCol()
        
        self.updateIconColumn(cell=(evt.GetRow(), evt.GetCol()), cellValue=sourceValue)
        
#         if sourceCol == 2:
#             targetRow = sourceRow
#             targetCol = 0
#             if sourceValue in ["INTEGER", "INT"]:
#                 self.SetCellValue(targetRow, targetCol, "4")
#             elif sourceValue.upper() in ['VARCHAR', 'CHAR', 'REAL', 'TEXT']:
# #                 self.SetCellValue(targetRow, targetCol,"1")
#                 isPrimaryKey = self.GetCellValue(sourceRow, 3)
#                 if not isPrimaryKey == 1:
#                     for d in  ['VARCHAR', 'CHAR', 'REAL', 'TEXT']:
#                         if sourceValue.lower().startswith(d.lower()):
#                             self.SetCellValue(targetRow, targetCol, "1")
#                             break
        self.Refresh()

#         if value == 'no good':
#             self.moveTo = evt.GetRow(), evt.GetCol()
#         #All cells have a value, regardless of the editor.
#         print 'Changed cell: (%u, %u)' % (Row, Col)
#         print 'value: %s' % self.grid1.GetCellValue(Row, Col)
#         
#         #Row 0 means a GridCellChoiceEditor, so we should have associated
#         #an index and client data.
#         if Row == 0:
#             print 'index: %u' % self.index
#             print 'data: %s' % self.data
#         
#         print ''            #blank line to make it pretty.
#         event.Skip()
    def OnSelectCell(self, evt):
        if evt.Selecting():
            msg = 'Selected'
        else:
            msg = 'Deselected'
        logger.debug("OnSelectCell: %s (%d,%d) %s" , msg, evt.GetRow(),
                                                 evt.GetCol(), evt.GetPosition())
#  
        row = self.GetGridCursorRow()
        col = self.GetGridCursorCol()
#  
#         if self.IsCellEditControlEnabled():
#             self.HideCellEditControl()
#             self.DisableCellEditControl()
#         if row > -1 and col > -1:
#             value = self.GetCellValue(row, col)
#      
#             if value == 'no good 2':
#                 return  # cancels the cell selection
     
#         evt.Skip()
        if evt.Col in self.checkBoxColumns:
            wx.CallAfter(self.EnableCellEditControl)
        evt.Skip()
 
    def OnEditorShown(self, evt):
        if evt.GetRow() == 6 and evt.GetCol() == 3 and \
           wx.MessageBox("Are you sure you wish to edit this cell?",
                        "Checking", wx.YES_NO) == wx.NO:
            evt.Veto()
            return
 
        logger.debug("OnEditorShown: (%d,%d) %s" , evt.GetRow(), evt.GetCol(),
                                               evt.GetPosition())
        evt.Skip()
 
    def OnEditorHidden(self, evt):
        if evt.GetRow() == 6 and evt.GetCol() == 3 and \
           wx.MessageBox("Are you sure you wish to  finish editing this cell?",
                        "Checking", wx.YES_NO) == wx.NO:
            evt.Veto()
            return
 
        logger.debug("OnEditorHidden: (%d,%d) %s" , evt.GetRow(),
                                                evt.GetCol(),
                                                evt.GetPosition())
        evt.Skip()

    # This method fires when the underlying GridCellChoiceEditor ComboBox
    # is done with a selection.
    def OnGridComboBox(self, event):
        # Save the index and client data for later use.
        self.index = self.comboBox.GetSelection()
        self.data = self.comboBox.GetClientData(self.index)
        
        logger.debug('ComboBoxChanged: %s' , self.comboBox.GetValue())
        logger.debug('ComboBox index: %u' , self.index)
        logger.debug('ComboBox data: %u' , self.data)
        event.Skip()        
        
    # This method fires when any text editing is done inside the text portion
    # of the ComboBox. This method will fire once for each new character, so
    # the print statements will show the character by character changes.
    def OnGridComboBoxText(self, event):
        # The index for text changes is always -1. This is how we can tell
        # that new text has been entered, as opposed to a simple selection
        # from the drop list. Note that the index will be set for each character,
        # but it will be -1 every time, so the final result of text changes is
        # always an index of -1. The value is whatever text that has been 
        # entered. At this point there is no client data. We will have to add
        # that later, once all of the text has been entered.
        self.index = self.comboBox.GetSelection()
        
        logger.debug('ComboBoxText: %s' , self.comboBox.GetValue())
        logger.debug('ComboBox index: %u' , self.index)
#         self.sql
#         selectedColName = self.GetParent().tableDict['row'][0][self.lastSelectedCell[1]]
#         colName = "".join(selectedColName.split(' ')).lower()
#         columns = self.GetParent().tableDict['rows'][self.lastSelectedCell[0]].keys()
#         for col in columns:
#             if colName in col.lower():
#                 colName = col
#                 break
#         
#         logger.debug("currentValue:%s", self.GetParent().tableDict['rows'][self.lastSelectedCell[0]][colName])
#         self.GetParent().tableDict['rows'][self.lastSelectedCell[0]][colName] = self.comboBox.GetValue()
#         self.GetParent().updateTableEditorPanel()
#         self.updateGridCell()
        event.Skip()
           
    def updateGridCell(self):
        '''
        This method will be called as soon as a comboBox value changes.
        '''
        pass
                     
    def addData(self, columns=None):
        self.columns = columns
#         print(self.GetRowSizes())
#         print(self.GetColSizes())
        self.ClearGrid()
        
        if columns and len(columns) > 0:
            logger.debug('rows:%s', self.GetNumberRows())
            logger.debug('cols:%s', self.GetNumberCols())
    #         self.DeleteRows()
            currentRows, currentCols = (self.GetNumberRows(), self.GetNumberCols())
            newRows = len(columns)
            newCols = len(columns[0].__dict__)
    #         self.AppendRows(numRows=len(data)-1, updateLabels=True)   
    #         if len(data) > 0 :
    #             self.AppendCols(numCols=len(data[0]), updateLabels=True)  
            if newRows < currentRows:
                # - Delete rows:
                self.DeleteRows(0, currentRows - newRows, True)
    
            if newRows > currentRows:
                # - append currentRows:
                self.AppendRows(newRows - currentRows)
                
            if newCols < currentCols:
                # - Delete rows:
                self.DeleteCols(pos=0, numCols=currentCols - newCols, updateLabels=True)
    
            if newCols > currentCols:
                # - append currentRows:
                self.AppendCols(newCols - currentCols)
    
            self.loadGridData(columns)
        else:
            numCols = self.GetNumberCols()
            numRows = self.GetNumberRows()
            if numRows > 0:
                self.DeleteRows(pos=0, numRows=numRows, updateLabels=True)
            if numCols > 0:
                self.DeleteCols(pos=0, numCols=numCols, updateLabels=True)
            
        self.Refresh()
#         self.Update()
    
    def setColumnWidth(self, col):
        if col == 0:
            self.SetColSize(col, 30)  
        elif col == 1:  
            self.SetColSize(col, 140)  
        elif col == 2:  
            self.SetColSize(col, 90)  
        elif col == 3:  
            self.SetColSize(col, 60)  
        elif col == 4:  
            self.SetColSize(col, 100)  
        elif col == 5:  
            self.SetColSize(col, 70)  
        elif col == 6:  
            self.SetColSize(col, 70)  
        elif col == 7:  
            self.SetColSize(col, 150)
        elif col == 8:  
            self.SetColSize(col, 150)
        elif col == 9:  
            self.SetColSize(col, 80)
            
    def getImageIndex(self, column):
        imageIndex = 1
        if column.primaryKey == 1:
            imageIndex = 0
        elif column.dataType in ['VARCHAR', 'TEXT']:
            imageIndex = 1
        elif column.unique == 1:
            imageIndex = 4
        return imageIndex
        
    def loadGridData(self, columns=None):
        logger.debug('loadGridData')
        for row, column in enumerate(columns):
            for col, (k, v) in enumerate(column.__dict__.items()):
                self.setColumnWidth(col)
                logger.debug(f'({row},{col}),{k}:{v}')
                if row == 0 :
                    self.SetColLabelValue(col, str(k))
                if col == 2:
                    #  row == 2 means data type
                    # Create the GridCellChoiceEditor with a blank list. Items will
                    # be added later at runtime. "allowOthers" allows the user to
                    # create new selection items on the fly.
                    tChoiceEditor = wx.grid.GridCellChoiceEditor([], allowOthers=True)
                    self.SetCellEditor(row , col, tChoiceEditor)
                    
                    selectedDataType = None
                    for dataType in self.dataTypeList:
                        if v.upper() == dataType[0]:
                            selectedDataType = k
                            break
                    self.SetCellValue(row, col, str(v))
                    self.SetColSize(col, 100)
                elif k in self.comboBoxList:
                    self.SetCellValue(row, col, str(v))      
                elif k in self.checkBoxColumns:
                    attr = wx.grid.GridCellAttr()
                    attr.SetEditor(wx.grid.GridCellBoolEditor())
                    attr.SetRenderer(wx.grid.GridCellBoolRenderer())
                    self.SetColAttr(col, attr)  
                    self.SetCellValue(row , col, str(v))    
                elif k in self.textBoxColumns:
                    self.SetCellValue(row, col, str(v))  
                elif col in self.iconColumns:
                    logger.debug("self.iconColumns: %s", self.iconColumns)
                    self.SetColLabelValue(col, 'Icon')
                    attr = wx.grid.GridCellAttr()
                    attr.SetRenderer(GridCellIconRenderer(self.bmpList))
                    self.SetColAttr(col, attr)  
                    self.SetCellValue(row, col, str(self.getImageIndex(column)))
                    self.SetColSize(col, 50)
                                               
    def fillTableData(self, data=None):  
        for dataKey, dataValue in data.items():
            logger.debug("dataKey:%s , dataValue: %s", dataKey, dataValue)
            for idx, colValue in enumerate(dataValue):
#                 logger.debug(idx, dataValue)
                if dataKey == 0:
                    self.SetColLabelValue(idx, str(colValue))
                elif dataKey > 0 and idx == 2:
                    #  idx == 2 means data type
                    # Create the GridCellChoiceEditor with a blank list. Items will
                    # be added later at runtime. "allowOthers" allows the user to
                    # create new selection items on the fly.
                    tChoiceEditor = wx.grid.GridCellChoiceEditor([], allowOthers=True)
                    self.SetCellEditor(dataKey - 1, idx, tChoiceEditor)
                    
                    selectedDataType = None
                    for dataType in self.dataTypeList:
                        if dataType[0] == colValue:
                            selectedDataType = dataType
                            break
                    self.SetCellValue(dataKey - 1, idx, selectedDataType[0])
                    self.SetColSize(idx, 100)
                    
                elif dataKey > 0 and idx in self.comboBoxList:
                    self.SetCellValue(dataKey - 1, idx, str(colValue))      
                elif dataKey > 0 and idx in self.checkBoxColumns:
                    attr = wx.grid.GridCellAttr()
                    attr.SetEditor(wx.grid.GridCellBoolEditor())
                    attr.SetRenderer(wx.grid.GridCellBoolRenderer())
                    self.SetColAttr(idx, attr)  
                    self.SetCellValue(dataKey - 1, idx, str(colValue))    
                elif dataKey > 0 and idx in self.textBoxColumns:
                    self.SetCellValue(dataKey - 1, idx, str(colValue))  
                elif dataKey > 0 and idx in self.iconColumns:
                    logger.debug("self.iconColumns: %s", self.iconColumns)
                    attr = wx.grid.GridCellAttr()
                    attr.SetRenderer(GridCellIconRenderer(self.bmpList))
                    self.SetColAttr(idx, attr)  
                    self.SetCellValue(dataKey - 1, idx, str(colValue))
                    self.SetColSize(idx, 50)
                
                if idx == 0:
                    self.SetColSize(idx, 50)  
                elif idx == 1:  
                    self.SetColSize(idx, 140)  
                elif idx == 2:  
                    self.SetColSize(idx, 150)  
                elif idx == 3:  
                    self.SetColSize(idx, 120)  
                elif idx == 4:  
                    self.SetColSize(idx, 100)  
                elif idx == 5:  
                    self.SetColSize(idx, 70)  
                elif idx == 6:  
                    self.SetColSize(idx, 150)  
                elif idx == 7:  
                    self.SetColSize(idx, 150)  
Ejemplo n.º 21
0
class DataSourcePanel(wx.Panel):
    def __init__(self, parent=None, *args, **kw):
        wx.Panel.__init__(self, parent, id=-1)
        self.parent = parent
        vBox = wx.BoxSizer(wx.VERTICAL)
        ####################################################################
        self.fileOperations = FileOperations()
        self.toolbar = self.constructTopToolBar()
        self.tree = DatabaseTree(self)
        self.filter = wx.SearchCtrl(self, style=wx.TE_PROCESS_ENTER)
        self.filter.SetDescriptiveText("Type filter table name")
        self.filter.ShowCancelButton(True)
        #         self.filter.Bind(wx.EVT_TEXT, self.recreateTree)
        self.filter.Bind(wx.EVT_SEARCHCTRL_CANCEL_BTN,
                         lambda e: self.filter.SetValue(''))
        #         self.filter.Bind(wx.EVT_TEXT_ENTER, self.OnSearch)
        #         self.recreateTree()

        # add drop target
        self.SetDropTarget(DatabaseFileDropTarget(self))
        #         self.tree.SetExpansionState(self.expansionState)

        ####################################################################
        ####################################################################
        vBox.Add(self.toolbar, 0, wx.EXPAND | wx.ALL)
        vBox.Add(self.filter, 0, wx.EXPAND | wx.ALL)
        vBox.Add(self.tree, 1, wx.EXPAND | wx.ALL)
        sizer = wx.BoxSizer(wx.VERTICAL)
        sizer.Add(vBox, 1, wx.EXPAND, 0)
        self.SetSizer(sizer)

    def constructTopToolBar(self):

        # create some toolbars
        tb1 = aui.AuiToolBar(self,
                             -1,
                             wx.DefaultPosition, (10, 10),
                             agwStyle=aui.AUI_TB_DEFAULT_STYLE
                             | aui.AUI_TB_OVERFLOW)

        #         tb1.SetToolBitmapSize(wx.Size(16, 16))

        tools = [
            (ID_COLLAPSE_ALL, "Collapse All", "collapseall-small.png",
             'Collapse All', self.onCollapseAll),
            (ID_LINK_WITH_EDITOR, "Link with Editor",
             "icon_link_with_editor.png", 'Link with Editor',
             self.onLinkWithEditor),
            (),
            (ID_VIEW_MENU, "View Menu", "icon_menu.png", 'View Menu',
             self.onViewMenu),
            #             (ID_REFRESH_ROW, "Result refresh", "resultset_refresh.png", 'Result refresh \tF5', self.onRefresh),
            #             (ID_ADD_ROW, "Add a new row", "row_add.png", 'Add a new row', self.onAddRow),
            #             (ID_DUPLICATE_ROW, "Duplicate selected row", "row_copy.png", 'Duplicate selected row', self.onDuplicateRow),
            #             (ID_DELETE_ROW, "Delete selected row", "row_delete.png", 'Delete selected row', self.onDeleteRow),
        ]
        for tool in tools:
            if len(tool) == 0:
                tb1.AddSeparator()
            else:
                logger.debug(tool)
                toolItem = tb1.AddSimpleTool(
                    tool[0],
                    tool[1],
                    self.fileOperations.getImageBitmap(imageName=tool[2]),
                    short_help_string=tool[3])
                if tool[4]:
                    self.Bind(wx.EVT_MENU, tool[4], id=tool[0])

        tb1.Realize()

        return tb1

    def onCollapseAll(self, event):
        logger.debug('onCollapseAll')

    def onLinkWithEditor(self, event):
        logger.debug('onLinkWithEditor')

    def onViewMenu(self, event):
        logger.debug('onViewMenu')
Ejemplo n.º 22
0
class PythonExplorerIconManager():
    def __init__(self):
        self.fileOperations = FileOperations()
        self.fileImageExtensionDict = {
            #             '.exe':'exe.png',
            '.xml': 'xml.png',
            '.java': 'jcu_obj.png',
            '.py': 'python_module.png',
            '.html': 'web.png',
            '.md': 'markdown.png',
            '.jar': 'jar_file.png',
            '.yaml': 'yaml.png',
            '.yml': 'yaml.png',
        }
        pass

    def PopulateImageList(self, imglist):
        """Populate an ImageList with the icons for the file tree
        @param imglist: wx.ImageList instance (16x16)

        """
        imglist.RemoveAll()
        self.iconsDictIndex = {}
        count = 0
        for extensionName in [
                '.pdf',
                '.zip',
                '.xlsx',
                '.xls',
                '.doc',
                '.ppt',
                '.7z',
                '.png',
                '.md',
                '.json',
                '.docx',
                '.css',
                '.js',
                '.bat',
                '.csv',
                '.txt',
                '.emf',
                '.rtf',
                '.chm',
                '.odt',
                '.ini',
                '.rar',
                '.msi',
                '.avi',
                '.mp4',
                '.mov',
                '.flv',
                '.mpg',
                '.gif',
                '.wma',
                '.mp3',
                '.wav',
                '.aac',
                '.m4a',
                '.dmg',
                '.tar',
                '.gz',
        ]:
            try:
                icon = self.getIconByExtension(extensionName)
                if icon:
                    imglist.Add(icon)
                    self.iconsDictIndex[extensionName] = count
                    self.fileImageExtensionDict[extensionName] = extensionName
                    count += 1
                    wx.LogNull()
            except Exception as e:
                logger.error(e, exc_info=True)
        for imageName in [
                'fileType_filter.png', 'folder.png', 'folder_view.png',
                'harddisk.png', 'usb.png', 'stop.png', 'java.png',
                'python_module.png', 'xml.png', 'python.png', 'jcu_obj.png',
                'jar_file.png', 'markdown.png', 'yaml.png', 'package_obj.png',
                'web.png'
        ]:
            imglist.Add(
                self.fileOperations.getImageBitmap(imageName=imageName))
            self.iconsDictIndex[imageName] = count
            count += 1

    def getIconByExtension(self, extension=".txt"):
        icon = None
        noLog = wx.LogNull()
        logger.debug(extension)
        fileType = wx.TheMimeTypesManager.GetFileTypeFromExtension(extension)

        if fileType is None:
            logger.debug("File extension not found.")
        else:
            try:
                icon, file, idx = fileType.GetIconInfo()
                if icon.IsOk():
                    icon = icon
            except:
                logger.error('some error :' + extension)
#        This is to supress warning
        del noLog
        return icon

    def GetImageIndex(self, path, expanded=False):
        """Get the appropriate file index for the given path
        @param path: file name or path

        """
        logger.debug(f'path: {path}')
        imageName = 'fileType_filter.png'
        if not os.access(path, os.R_OK):
            imageName = 'stop.png'

        elif os.path.isdir(path):
            if expanded:
                imageName = 'folder_view.png'
                for fname in os.listdir(path):
                    if fname.endswith('__init__.py'):
                        # do stuff on the file
                        imageName = 'package_obj.png'
                        break
                else:
                    # do stuff if a file .true doesn't exist.
                    pass
            else:
                imageName = 'folder.png'
                for fname in os.listdir(path):
                    if fname.endswith('__init__.py'):
                        # do stuff on the file
                        imageName = 'package_obj.png'
                        break
                else:
                    # do stuff if a file .true doesn't exist.
                    pass
        elif os.path.isfile(path):
            filename, fileExtension = os.path.splitext(path)
            fileExtension = fileExtension.lower()
            if fileExtension and self.getFileImageNameByExtension(
                    fileExtension):
                imageName = self.getFileImageNameByExtension(fileExtension)

        return self.iconsDictIndex[imageName]

    def getFileImageNameByExtension(self, fileExtension=None):
        imageName = None

        if fileExtension in self.fileImageExtensionDict.keys():
            imageName = self.fileImageExtensionDict[fileExtension]

        return imageName
Ejemplo n.º 23
0
class BookExplorerPanel(wx.Panel):
    def __init__(self, parent=None, *args, **kw):
        wx.Panel.__init__(self, parent, id=-1)
        self.parent = parent
        #         self.fileOperations = FileOperations()
        self.connDict = dict()
        vBox = wx.BoxSizer(wx.VERTICAL)
        ####################################################################
        self.treeMap = {}
        self.fileOperations = FileOperations()
        self.topToolbar = self.constructTopToolBar()
        self.tree = BookExplorerTreePanel(self)

        self.tree.Bind(wx.EVT_TREE_ITEM_EXPANDED, self.OnItemExpanded)
        self.tree.Bind(wx.EVT_TREE_ITEM_COLLAPSED, self.OnItemCollapsed)
        self.tree.Bind(wx.EVT_TREE_SEL_CHANGED, self.OnSelChanged)
        self.tree.Bind(wx.EVT_LEFT_DOWN, self.OnTreeLeftDown)

        self.RecreateTree()
        ####################################################################
        vBox.Add(self.topToolbar, 0, wx.EXPAND | wx.ALL)
        vBox.Add(self.tree, 1, wx.EXPAND | wx.ALL)
        sizer = wx.BoxSizer(wx.VERTICAL)
        sizer.Add(vBox, 1, wx.EXPAND, 0)
        self.SetSizer(sizer)

    def OnContextMenu(self, event):
        logger.debug("OnContextMenu\n")

    def constructTopToolBar(self):

        # create some toolbars
        tb1 = aui.AuiToolBar(self,
                             -1,
                             wx.DefaultPosition, (10, 10),
                             agwStyle=aui.AUI_TB_DEFAULT_STYLE
                             | aui.AUI_TB_OVERFLOW)

        #         tb1.SetToolBitmapSize(wx.Size(16, 16))
        # id, name, image, name, method, kind
        tools = [
            (ID_COLLAPSE_ALL, "Collapse All", "collapseall-small.png",
             'Collapse All', self.onCollapseAll, wx.ITEM_NORMAL),
            (ID_LINK_WITH_EDITOR, "Link with Editor",
             "icon_link_with_editor.png", 'Link with Editor',
             self.onLinkWithEditor, wx.ITEM_CHECK),
            (),
            (ID_VIEW_MENU, "View Menu", "icon_menu.png", 'View Menu',
             self.onViewMenu, wx.ITEM_NORMAL),
            #             (ID_REFRESH_ROW, "Result refresh", "resultset_refresh.png", 'Result refresh \tF5', self.onRefresh),
            #             (ID_ADD_ROW, "Add a new row", "row_add.png", 'Add a new row', self.onAddRow),
            #             (ID_DUPLICATE_ROW, "Duplicate selected row", "row_copy.png", 'Duplicate selected row', self.onDuplicateRow),
            #             (ID_DELETE_ROW, "Delete selected row", "row_delete.png", 'Delete selected row', self.onDeleteRow),
        ]
        for tool in tools:
            if len(tool) == 0:
                tb1.AddSeparator()
            else:
                logger.debug(tool)
                toolItem = tb1.AddSimpleTool(
                    tool[0],
                    tool[1],
                    self.fileOperations.getImageBitmap(imageName=tool[2]),
                    kind=tool[5],
                    short_help_string=tool[3])

                if tool[4]:
                    self.Bind(wx.EVT_MENU, tool[4], id=tool[0])

        tb1.Realize()

        return tb1

    def onCollapseAll(self, event):
        logger.debug('onCollapseAll')
        self.tree.CollapseAll()

    def onLinkWithEditor(self, event):
        logger.debug('onLinkWithEditor')
        self.linkWithEditor = event.IsChecked()
        logger.debug(f'{self.linkWithEditor}')
#         event.

    def onViewMenu(self, event):
        logger.debug('onViewMenu')

    #---------------------------------------------
    def constructNode(self, parent=None, treeData=None):
        logger.debug(treeData)
        for treeItem in treeData:
            itemId = self.tree.AppendItem(
                parent,
                treeItem.name,
                image=self.tree.iconsDictIndex[treeItem.imageName])
            self.tree.SetItemData(itemId, treeItem)
            if treeItem.child:
                #                     for childItem in treeItem.child:
                self.constructNode(parent=itemId, treeData=treeItem.child)

    def RecreateTree(self, evt=None):

        expansionState = self.tree.GetExpansionState()

        current = None
        item = self.tree.GetSelection()
        if item:
            prnt = self.tree.GetItemParent(item)
            if prnt:
                current = (self.tree.GetItemText(item),
                           self.tree.GetItemText(prnt))

        self.tree.Freeze()
        self.tree.DeleteAllItems()
        self.root = self.tree.AddRoot("Other View")
        self.tree.SetItemImage(self.root,
                               self.tree.iconsDictIndex['other_view.png'])
        self.tree.SetItemData(self.root, 0)

        treeFont = self.tree.GetFont()
        catFont = self.tree.GetFont()

        # The native treectrl on MSW has a bug where it doesn't draw
        # all of the text for an item if the font is larger than the
        # default.  It seems to be clipping the item's label as if it
        # was the size of the same label in the default font.
        if 'wxMSW' not in wx.PlatformInfo:
            treeFont.SetPointSize(treeFont.GetPointSize() + 2)

        treeFont.SetWeight(wx.BOLD)
        catFont.SetWeight(wx.BOLD)

        firstChild = None
        selectItem = None
        count = 0

        treeSearch = TreeSearch()
        searchText = None
        treeItems = treeSearch.searchedNodes(dataList=bookExplorerList,
                                             searchText=searchText)

        self.constructNode(parent=self.root, treeData=treeItems)

        if firstChild:
            self.tree.Expand(firstChild)


#         if filter:
#             self.tree.ExpandAll()
        elif expansionState:
            self.tree.SetExpansionState(expansionState)
        if selectItem:
            self.skipLoad = True
            self.tree.SelectItem(selectItem)
            self.skipLoad = False

        self.tree.Thaw()
        self.searchItems = {}

    #---------------------------------------------
    def OnItemExpanded(self, event):
        item = event.GetItem()
        logger.debug("OnItemExpanded: %s", self.tree.GetItemText(item))
        imageName = self.tree.GetItemData(item).imageName
        #         explandedImageName = 'eclipse_open_folder.png'
        data = self.tree.GetItemData(item)
        if imageName == 'user.png':
            explandedImageName = 'folder_user.png'
            data = self.tree.GetItemData(item)
            data.imageName = explandedImageName
            self.tree.SetItemData(item, data)
        elif data.imageName:
            explandedImageName = data.imageName

        if self.tree.GetItemParent(item):
            self.tree.SetItemImage(
                item, self.tree.iconsDictIndex[explandedImageName])
        event.Skip()

    #---------------------------------------------
    def OnItemCollapsed(self, event):
        item = event.GetItem()
        logger.debug("OnItemCollapsed: %s", self.tree.GetItemText(item))
        imageName = self.tree.GetItemData(item).imageName
        data = self.tree.GetItemData(item)
        collapsedImageName = 'folderType_filter.png'
        if imageName == 'folder_user.png':
            collapsedImageName = 'user.png'
            data.imageName = collapsedImageName
            self.tree.SetItemData(item, data)
        elif data.imageName:
            collapsedImageName = data.imageName
        if self.tree.GetItemParent(item):
            self.tree.SetItemImage(
                item, self.tree.iconsDictIndex[collapsedImageName])
        event.Skip()

    #---------------------------------------------
    def OnTreeLeftDown(self, event):
        # reset the overview text if the tree item is clicked on again
        pt = event.GetPosition()
        item, flags = self.tree.HitTest(pt)
        if item and item == self.tree.GetSelection():
            print(self.tree.GetItemText(item) + " Overview")
        event.Skip()

    #---------------------------------------------
    def OnSelChanged(self, event):
        #         if self.dying or not self.loaded or self.skipLoad:
        #             return

        #         self.StopDownload()

        item = event.GetItem()
        try:
            itemText = self.tree.GetItemText(item)
            logger.debug(itemText)
            opalPreference = self.GetTopLevelParent()
            if opalPreference:
                pnl_children = list()
                if hasattr(opalPreference, 'png'):
                    pnl_children = opalPreference.pnl.GetChildren()
                for pnl in pnl_children:
                    #             print(pnl)
                    if pnl.GetName() == 'rightPanel':
                        opalPreference = self.GetTopLevelParent()
                        for child in pnl.GetChildren():
                            child.Hide()
                        rightPanelItem = opalPreference.getPreferencePanelObj(
                            pnl, preferenceName=itemText)
                        opalPreference.addPanel(rightPanelItem)
                        pnl.Layout()
                        pnl.Refresh()
                        pnl.Fit()
                opalPreference.Layout()
                if hasattr(opalPreference, 'mgr'):
                    opalPreference.mgr.Update()
        except:
            pass
Ejemplo n.º 24
0
class SearchPanelsFrame(wx.Frame):
    def __init__(self,
                 parent,
                 Id=wx.ID_ANY,
                 Title="",
                 pos=wx.DefaultPosition,
                 size=wx.DefaultSize,
                 style=wx.DEFAULT_FRAME_STYLE | wx.SUNKEN_BORDER
                 | wx.STAY_ON_TOP):
        style = style & (~wx.MINIMIZE_BOX)
        wx.Frame.__init__(self, parent, Id, Title, pos, size, style)

        self.fileOperations = FileOperations()
        #         pub.subscribe(self.__OnCellChange, 'OnCellChange')
        self._mgr = aui.AuiManager()

        # tell AuiManager to manage this frame
        self._mgr.SetManagedWindow(self)

        # set frame icon
        icon = wx.Icon()
        icon.CopyFromBitmap(
            self.fileOperations.getImageBitmap(imageName='eclipse16.png'))
        self.SetIcon(icon)

        # set up default notebook style
        #         self._mgr._autoNBStyle = aui.AUI_NB_DEFAULT_STYLE | aui.AUI_NB_TAB_EXTERNAL_MOVE | wx.NO_BORDER
        self._notebook_theme = 0

        self.BuildPanes()
        self.BindEvents()
        self.Show(show=True)

    def BindEvents(self):
        #         self.Bind(wx.EVT_BUTTON, self.OnCloseMe, button)
        self.Bind(wx.EVT_CLOSE, self.OnCloseWindow)
        self.Bind(wx.EVT_CHAR_HOOK, self.OnKeyUP)

    def OnCloseWindow(self, event):
        self._mgr.UnInit()
        event.Skip()
        self.Destroy()

    def OnKeyUP(self, event):
        #         print "KEY UP!"
        keyCode = event.GetKeyCode()
        if keyCode == wx.WXK_ESCAPE:
            self.Close()
        event.Skip()

    def BuildPanes(self):
        #         self.SetMinSize(wx.Size(400, 300))
        # this is to set tab on top
        self._mgr.SetAutoNotebookStyle(aui.AUI_NB_DEFAULT_STYLE
                                       | wx.BORDER_NONE)

        self.buttonPanel = CreateButtonPanel(self)
        self.fileSearchPanel = CreateFileSearchPanel(self)
        fileSearchPaneInfo = aui.AuiPaneInfo().Name("fileSearch").Icon(self.fileOperations.getImageBitmap(imageName="search_history.png")).Caption("File Search")\
                        .Direction(wx.TOP).Row(0).Center().Layer(0).Position(0).Dockable(True)\
                        .CaptionVisible(False).MinimizeButton(False).CloseButton(False)
        self._mgr.AddPane(self.fileSearchPanel, fileSearchPaneInfo)

        self.fileSearchPanel1 = CreateFileSearchPanel(self)
        self._mgr.AddPane(
            self.fileSearchPanel1,
            aui.AuiPaneInfo().Icon(
                self.fileOperations.getImageBitmap(
                    imageName="search_history.png")
            ).Name(f"taskSearch").Caption(f"Task Search").Dockable(
                False).Center().Layer(0).Position(1).CaptionVisible(
                    False).MinimizeButton(False).CloseButton(False),
            target=fileSearchPaneInfo)

        self._mgr.AddPane(
            self.buttonPanel,
            aui.AuiPaneInfo().Name("button").Caption("Button").Layer(0).Bottom(
            ).CaptionVisible(False).MinimizeButton(True).CloseButton(False))

        self._mgr.Update()
Ejemplo n.º 25
0
class CreatingResultWithToolbarPanel(wx.Panel):
    def __init__(self, parent=None, *args, **kw):
        wx.Panel.__init__(self,
                          parent,
                          id=-1,
                          style=wx.CLIP_CHILDREN | wx.BORDER_NONE)
        self.parent = parent
        self.data = list()
        self.pin = False
        vBox = wx.BoxSizer(wx.VERTICAL)
        self.fileOperations = FileOperations()
        ####################################################################
        self.topResultToolbar = self.constructTopResultToolBar()
        self.bottomResultToolbar = wx.StatusBar(self)
        self.bottomResultToolbar.SetStatusText('Count: {}'.format(
            len(self.getData())))
        #         self.bottomResultToolbar = self.constructBottomResultToolBar()
        #         self.resultPanel = ResultPanel(self, data=self.getData())
        self.resultPanel = ResultDataGrid(self, data=self.getData())
        #         bottomResultToolbar = self.constructBottomResultToolBar()

        ####################################################################
        vBox.Add(self.topResultToolbar, 0, wx.EXPAND | wx.ALL, 0)
        vBox.Add(self.resultPanel, 1, wx.EXPAND | wx.ALL, 0)
        vBox.Add(self.bottomResultToolbar, 0, wx.EXPAND | wx.ALL, 0)
        #         vBox.Add(bottomResultToolbar , 0, wx.EXPAND | wx.ALL, 0)
        #         vBox.Add(resultPanel , 1, wx.EXPAND | wx.ALL)
        sizer = wx.BoxSizer(wx.VERTICAL)
        #         sizer.Add(worksheetToolbar ,.9, wx.EXPAND | wx.ALL, 0)
        sizer.Add(vBox, 1, wx.EXPAND, 0)
        self.SetSizer(sizer)

    def constructBottomResultToolBar(self):
        #         tb2 = wx.ToolBar(self, -1, wx.DefaultPosition, wx.DefaultSize,
        #                  wx.TB_FLAT | wx.TB_NODIVIDER)
        #         str = "This is a different font."
        #         bottomBarText = wx.InfoBar(self)
        #         bottomBarText.ShowMessage("asdf")
        # #         tb2.AddLabelTool('asfd' bitmap=wx.Bitmap(os.path.join(imageLocation, "resultset_last.png")))
        #         tb2.AddTool
        #
        #         tb2.Realize()

        self.statusbar = wx.StatusBar(self).Create(self)
        #         self.statusbar.SetStatusText('This goes in your statusbar')
        return self.statusbar

    def constructTopResultToolBar(self):
        #         path = os.path.abspath(__file__)
        #         tail = None
        # #         head, tail = os.path.split(path)
        # #         print('createAuiManager',head, tail )
        #         try:
        #             while tail != 'src':
        #                 path = os.path.abspath(os.path.join(path, '..',))
        #                 head, tail = os.path.split(path)
        #         except Exception as e:
        #             logger.error(e, exc_info=True)
        #         print('------------------------------------------------------------------------->',path)
        #         path = os.path.abspath(os.path.join(path, "images"))
        # create some toolbars
        tb1 = aui.AuiToolBar(self,
                             -1,
                             wx.DefaultPosition,
                             wx.DefaultSize,
                             agwStyle=aui.AUI_TB_DEFAULT_STYLE
                             | aui.AUI_TB_OVERFLOW)
        tb1.SetToolBitmapSize(wx.Size(42, 42))
        #         tb1 = wx.ToolBar(self, -1, wx.DefaultPosition, wx.DefaultSize,
        #                          wx.TB_FLAT | wx.TB_NODIVIDER)
        #         tb1.SetToolBitmapSize(wx.Size(16, 16))
        #         playImage = None
        #         if "worksheet" == os.path.split(os.getcwd())[-1:][0]:
        #             imageLocation = os.path.join("..", "..", "images")
        #
        #         elif "view" == os.path.split(os.getcwd())[-1:][0]:
        #             imageLocation = os.path.join("..", "images")
        tb1.AddSimpleTool(
            ID_PIN,
            "Pin",
            self.fileOperations.getImageBitmap(imageName="pin2_green.png"),
            short_help_string="Pin",
            kind=ITEM_CHECK)
        tb1.AddSimpleTool(ID_RUN,
                          "Result refresh",
                          self.fileOperations.getImageBitmap(
                              imageName="resultset_refresh.png"),
                          short_help_string="Refresh")
        tb1.AddSimpleTool(
            ID_SQL_TEXT,
            "SQL \t(Ctrl+Q)",
            self.fileOperations.getImageBitmap(imageName="sql_text.png"),
            short_help_string="SQL \t(Ctrl+Q)")

        self.Bind(wx.EVT_MENU, self.onPinClick, id=ID_PIN)
        self.Bind(wx.EVT_MENU, self.onSqlText, id=ID_SQL_TEXT)
        tb1.AddSeparator()

        tb1.Realize()

        return tb1

    def onSqlText(self, event):
        logger.debug(f'onSqlText:{self.resultPanel.sqlText}')

        frame = SqlQueryFrame(self,
                              sqlText=self.resultPanel.sqlText,
                              size=(400, 300))
        frame.CenterOnScreen()

    def onPinClick(self, event):
        logger.debug(f'onPinClick:{self.pin}')
        self.pin = not self.pin

    def getData(self):
        # Get the data from the ListCtrl sample to play with, converting it
        # from a dictionary to a list of lists, including the dictionary key
        # as the first element of each sublist.
        #         self.data=music
        return self.data
Ejemplo n.º 26
0
class DatabaseNavigationTree(ExpansionState, TreeCtrl):
    '''
    Left navigation tree in database page
    '''
    def __init__(self, parent):
        TreeCtrl.__init__(self,
                          parent,
                          style=wx.TR_DEFAULT_STYLE
                          | wx.TR_HAS_VARIABLE_ROW_HEIGHT | wx.TR_HIDE_ROOT)
        self.BuildTreeImageList()
        #         if USE_CUSTOMTREECTRL:
        #             self.SetSpacing(10)
        #             self.SetWindowStyle(self.GetWindowStyle() & ~wx.TR_LINES_AT_ROOT)
        self.eventdict = {
            #                           'EVT_TREE_BEGIN_DRAG': self.OnBeginDrag, 'EVT_TREE_BEGIN_LABEL_EDIT': self.OnBeginEdit,
            #                           'EVT_TREE_BEGIN_RDRAG': self.OnBeginRDrag, 'EVT_TREE_DELETE_ITEM': self.OnDeleteItem,
            #                           'EVT_TREE_END_DRAG': self.OnEndDrag, 'EVT_TREE_END_LABEL_EDIT': self.OnEndEdit,
            #                           'EVT_TREE_ITEM_ACTIVATED': self.OnActivate, 'EVT_TREE_ITEM_CHECKED': self.OnItemCheck,
            #                           'EVT_TREE_ITEM_CHECKING': self.OnItemChecking, 'EVT_TREE_ITEM_COLLAPSED': self.OnItemCollapsed,
            #                           'EVT_TREE_ITEM_COLLAPSING': self.OnItemCollapsing, 'EVT_TREE_ITEM_EXPANDED': self.OnItemExpanded,
            #                           'EVT_TREE_ITEM_EXPANDING': self.OnItemExpanding, 'EVT_TREE_ITEM_GETTOOLTIP': self.OnToolTip,
            #                           'EVT_TREE_ITEM_MENU': self.OnItemMenu, 'EVT_TREE_ITEM_RIGHT_CLICK': self.OnRightDown,
            'EVT_TREE_KEY_DOWN': self.OnKey,
            #                           'EVT_TREE_SEL_CHANGED': self.OnSelChanged,
            #                           'EVT_TREE_SEL_CHANGING': self.OnSelChanging, "EVT_TREE_ITEM_HYPERLINK": self.OnHyperLink
        }
        self.SetInitialSize((100, 80))

    def AppendItem(self, parent, text, image=-1, wnd=None):

        item = TreeCtrl.AppendItem(self, parent, text, image=image)
        return item

    #---------------------------------------------

    def OnKey(self, event):
        logger.debug('onkey')
        keycode = event.GetKeyCode()
        keyname = keyMap.get(keycode, None)

        if keycode == wx.WXK_BACK:
            self.log.write(
                "OnKeyDown: HAHAHAHA! I Vetoed Your Backspace! HAHAHAHA\n")
            return

        if keyname is None:
            if "unicode" in wx.PlatformInfo:
                keycode = event.GetUnicodeKey()
                if keycode <= 127:
                    keycode = event.GetKeyCode()
                keyname = "\"" + event.GetUnicodeKey() + "\""
                if keycode < 27:
                    keyname = "Ctrl-%s" % chr(ord('A') + keycode - 1)

            elif keycode < 256:
                if keycode == 0:
                    keyname = "NUL"
                elif keycode < 27:
                    keyname = "Ctrl-%s" % chr(ord('A') + keycode - 1)
                else:
                    keyname = "\"%s\"" % chr(keycode)
            else:
                keyname = "unknown (%s)" % keycode

        self.log.write("OnKeyDown: You Pressed '" + keyname + "'\n")

        event.Skip()

    def BuildTreeImageList(self):
        imgList = wx.ImageList(16, 16)
        self.fileOperations = FileOperations()
        # add the image for modified demos.
        imgList.Add(
            self.fileOperations.getImageBitmap(imageName="database.png"))  # 0
        imgList.Add(
            self.fileOperations.getImageBitmap(
                imageName="database_category.png"))  # 1
        imgList.Add(
            self.fileOperations.getImageBitmap(
                imageName="folder_view.png"))  # 2
        imgList.Add(
            self.fileOperations.getImageBitmap(imageName="folder.png"))  # 3
        imgList.Add(
            self.fileOperations.getImageBitmap(imageName="table.png"))  # 4
        imgList.Add(
            self.fileOperations.getImageBitmap(imageName="view.png"))  # 5
        imgList.Add(
            self.fileOperations.getImageBitmap(imageName="index.png"))  # 6
        imgList.Add(self.fileOperations.getImageBitmap(
            imageName="column.png"))  # 7 using to show integer column
        imgList.Add(
            self.fileOperations.getImageBitmap(imageName="string.png"))  # 8
        imgList.Add(
            self.fileOperations.getImageBitmap(imageName="key.png"))  # 9
        imgList.Add(
            self.fileOperations.getImageBitmap(
                imageName="foreign_key_column.png"))  # 10
        imgList.Add(
            self.fileOperations.getImageBitmap(imageName="columns.png"))  # 11
        imgList.Add(
            self.fileOperations.getImageBitmap(
                imageName="unique_constraint.png"))  # 12
        imgList.Add(
            self.fileOperations.getImageBitmap(
                imageName="reference.png"))  # 13
        imgList.Add(
            self.fileOperations.getImageBitmap(imageName="datetime.png"))  # 14
        imgList.Add(
            self.fileOperations.getImageBitmap(imageName="columns.png"))  # 15
        imgList.Add(
            self.fileOperations.getImageBitmap(imageName="sqlite.png"))  # 16
        imgList.Add(self.fileOperations.getImageBitmap(
            imageName="h2.png"))  # 17 use to show h2 database icon
        imgList.Add(
            self.fileOperations.getImageBitmap(imageName="textfield.png")
        )  # 18 use to show [varchar, char, text data] type icon

        #         imgList.Add(wx.Bitmap(path2))
        #         for png in _demoPngs:
        #             imgList.Add(catalog[png].GetBitmap())

        self.AssignImageList(imgList)

    def GetItemIdentity(self, item):
        return self.GetPyData(item)

    def Freeze(self):
        if 'wxMSW' in wx.PlatformInfo:
            return super(DatabaseNavigationTree, self).Freeze()

    def Thaw(self):
        if 'wxMSW' in wx.PlatformInfo:
            return super(DatabaseNavigationTree, self).Thaw()
Ejemplo n.º 27
0
class CreateResultSheetTabPanel(wx.Panel):
    def __init__(self, parent=None, *args, **kw):
        wx.Panel.__init__(self, parent, id=-1)
        self.parent = parent
        self.fileOperations = FileOperations()

        # Attributes
        self._nb = aui.AuiNotebook(self)
        #         if "worksheet" == os.path.split(os.getcwd())[-1:][0]:
        #             imageLocation = os.path.join("..", "..", "images")
        #         #             playImage=wx.Bitmap(os.path.join("..","..", "images", "play.png"))
        #         elif "view" == os.path.split(os.getcwd())[-1:][0]:
        #         imageLocation = os.path.join(path)
        imgList = wx.ImageList(16, 16)
        imgList.Add(self.fileOperations.getImageBitmap("sql_script.png"))

        self._nb.AssignImageList(imgList)

        self.addTab()
        #         self._nb.AddPage(worksheetPanel, "2", imageId=0)
        # Layout

        self.__DoLayout()

    def addTab(self, name='Start Page'):
        resultSheetPanel = CreatingResultWithToolbarPanel(
            self._nb, -1, style=wx.CLIP_CHILDREN | wx.BORDER_NONE)
        #             worksheetPanel.worksheetPanel.editorPanel
        name = 'Query Result '
        self._nb.AddPage(resultSheetPanel, name)
        self._nb.SetSelectionToWindow(resultSheetPanel)
        self.Bind(aui.EVT_AUINOTEBOOK_TAB_RIGHT_DOWN, self.onTabRightDown,
                  self._nb)
        self.Bind(aui.EVT_AUINOTEBOOK_BG_DCLICK, self.onBgDoubleClick,
                  self._nb)
        self.Bind(aui.EVT_AUINOTEBOOK_PAGE_CLOSE, self.onCloseClick, self._nb)

    def __DoLayout(self):
        """Layout the panel"""
        sizer = wx.BoxSizer(wx.VERTICAL)
        sizer.Add(self._nb, 1, wx.EXPAND)
        self.SetAutoLayout(True)
        self.SetSizer(sizer)
        self.Layout()

    def SetCurrentPage(self, page):
        """
        Set the current page to the page given
        """
        n = self._nb.GetPageIndex(page)
        if n != -1:
            self._nb.SetSelection(n)
            return True
        return False

    def GetCurrentPage(self):
        """
        Get the current active Page page
        """
        num = self._nb.GetSelection()
        if num == -1:
            page = None
        else:
            page = self._nb.GetPage(num)
        return page

    def GetPages(self, page_type):
        """
        Get all the Page pages of a particular type
        """
        npages = self._nb.GetPageCount()
        res = []
        for n in range(0, npages):
            page = self._nb.GetPage(n)
            if isinstance(page, page_type):
                res.append(page)
        return res

    def onTabRightDown(self, event):
        logger.debug('onTabRightDown')

    def onBgDoubleClick(self, event):
        logger.debug('onBgDoubleClick')

    def onCloseClick(self, event):
        logger.debug('onCloseClick')
        self.GetCurrentPage()
Ejemplo n.º 28
0
class Preference(wx.Frame):
    def __init__(self, parent, title, size=(700, 440)):
        wx.Frame.__init__(self,
                          parent,
                          -1,
                          title,
                          size=size,
                          style=wx.DEFAULT_FRAME_STYLE
                          | wx.NO_FULL_REPAINT_ON_RESIZE)
        self.Center()
        #         self.Bind(wx.EVT_CLOSE, self.OnCloseFrame)
        self.allowAuiFloating = False
        self.SetMinSize((640, 480))
        self.fileOperations = FileOperations()
        icon = wx.Icon()
        icon.CopyFromBitmap(
            self.fileOperations.getImageBitmap(imageName='eclipse16.png'))
        self.SetIcon(icon)
        self._mgr = aui.AuiManager()
        # tell AuiManager to manage this frame
        self._mgr.SetManagedWindow(self)
        self.BuildPanes()
        self.BindEvents()
        self.Show()

    def OnKeyUP(self, event):
        #         print "KEY UP!"
        keyCode = event.GetKeyCode()
        if keyCode == wx.WXK_ESCAPE:
            self.Close()
        event.Skip()

    def OnCloseFrame(self, event):
        self.Destroy()

    def OnSize(self, event):
        hsize = event.GetSize()
        logger.debug(hsize)

    def BindEvents(self):
        self.Bind(wx.EVT_SIZE, self.OnSize)
        self.Bind(wx.EVT_CHAR_HOOK, self.OnKeyUP)

    def BuildPanes(self):
        self.SetMinSize(wx.Size(700, 440))
        # add a bunch of panes
        self._mgr.AddPane(
            self.createPreferenceTree(),
            aui.AuiPaneInfo().Name("left").Caption("Pane Caption").BestSize(
                wx.Size(200, 100)).CaptionVisible(
                    False, left=False).Left().MinimizeButton(True))
        #                           .MinSize(wx.Size(200,100))

        self._mgr.AddPane(
            self.rightPanel(),
            aui.AuiPaneInfo().Name("center").Caption("Client Size Reporter").
            Center().Position(1).CloseButton(True).MaximizeButton(
                True).MinimizeButton(True).CaptionVisible(False, left=False))

        self._mgr.AddPane(
            self.bottomPanel(),
            aui.AuiPaneInfo().Name("bottom").Caption("Client Size Reporter").
            BestSize(wx.Size(200, 40)).MinSize(wx.Size(200, 40)).MaxSize(
                wx.Size(
                    200,
                    40)).Bottom().Position(0).CloseButton(True).MaximizeButton(
                        True).MinimizeButton(True).CaptionVisible(False,
                                                                  left=False))

        self._mgr.Update()

    def createPreferenceTree(self):
        prefrencesTreePanel = PrefrencesTreePanel(self)
        return prefrencesTreePanel

    def CreateSizeReportCtrl(self, width=80, height=80):

        ctrl = SizeReportCtrl(self, -1, wx.DefaultPosition,
                              wx.Size(width, height), self._mgr)
        return ctrl

    def rightPanel(self):
        ctrl = RightPanel(self, -1, wx.DefaultPosition)
        return ctrl

    def bottomPanel(self):
        applyResetButtonPanel = ApplyCloseButtonPanel(self)
        return applyResetButtonPanel
Ejemplo n.º 29
0
class ResultDataGrid(gridlib.Grid):

    def __init__(self, parent, model=None, data=None):
        gridlib.Grid.__init__(self, parent, -1, style=wx.BORDER_NONE)
        self.fileOperations = FileOperations()
        self.CreateGrid(0, 0)
        self.RowLabelSize = 32
        self.Bind(gridlib.EVT_GRID_CELL_RIGHT_CLICK, self.showGridCellPopupMenu)
        self.Bind(gridlib.EVT_GRID_LABEL_RIGHT_CLICK, self.showHeaderPopupMenu)
        self.Bind(wx.EVT_KEY_DOWN, self.OnKey)
        self.Bind(gridlib.EVT_GRID_CELL_CHANGED, self.cellChange) 
        self.data = None
        self.sqlText = ''
#         self.SetCellAlignment(row, col, horiz, vert)

        # Somebody changed the grid so the type registry takes precedence
        # over the default attribute set for editors and renderers, so we
        # have to set null handlers for the type registry before the
        # default editor will get used otherwise...
        # self.RegisterDataType(wxGRID_VALUE_STRING, None, None)
        # self.SetDefaultEditor(MyCellEditor())

        # Or we could just do it like this:
        # self.RegisterDataType(wx.GRID_VALUE_STRING,
        #                      wx.GridCellStringRenderer(),
        #                      MyCellEditor())
        #                       )

        # but for this example, we'll just set the custom editor on one cell
#         self.SetCellEditor(1, 0, MyCellEditor())
#         self.SetCellValue(1, 0, "Try to edit this box")
#
#         # and on a column
#         attr = gridlib.GridCellAttr()
#         attr.SetEditor(MyCellEditor())
#         self.SetColAttr(2, attr)
#         self.SetCellValue(1, 2, "or any in this column")
#
#         self.addData()

    def setSqlText(self, sqlText):
        self.sqlText = sqlText

    def setData(self, data):
        self.data = data

    def getData(self):
        return self.data

    def cellChange(self, evt):
        row = evt.GetRow()
        col = evt.GetCol()
 
        # #print 'Cell changed at', row, col
        value = self.GetTable().GetValue(row, col)
        logger.info(f'cellChange ({row,col}):{value}')
        # #print 'New value', value
        # #print 'Type', type(value)
 
        evt.Skip()
 
        return

    def addData(self, data=None):
        self.data = data
#         logger.info(self.GetRowSizes())
#         logger.info(self.GetColSizes())
        self.ClearGrid()
        try:
            if data and len(data) > 0:
                dataTypeRow = data.get(-1)
#                 logger.info('rows:', self.GetNumberRows())
#                 logger.info('cols:', self.GetNumberCols())
        #         self.DeleteRows()
                currentRows, currentCols = (self.GetNumberRows(), self.GetNumberCols())
                newRows = len(data) - 1
                if dataTypeRow:
                    newRows = newRows - 1
                newCols = len(data[0])
        #         self.AppendRows(numRows=len(data)-1, updateLabels=True)
        #         if len(data) > 0 :
        #             self.AppendCols(numCols=len(data[0]), updateLabels=True)
                if newRows < currentRows:
                    # - Delete rows:
                    self.DeleteRows(0, currentRows - newRows, True)

                if newRows > currentRows:
                    # - append currentRows:
                    self.AppendRows(newRows - currentRows)

                if newCols < currentCols:
                    # - Delete rows:
                    self.DeleteCols(pos=0, numCols=currentCols - newCols, updateLabels=True)

                if newCols > currentCols:
                    # - append currentRows:
                    self.AppendCols(newCols - currentCols)

                for dataKey, dataValue in data.items():
#                     logger.info(dataKey, dataValue)
                    for idx, colValue in enumerate(dataValue):
        #                 logger.info(idx, dataValue)

                        if dataKey == 0:
                            self.SetColLabelValue(idx, str(colValue))
                        elif dataKey > 0:
                            row = dataKey - 1
                            col = idx
                            try:
#                                 if col==3:
#                                     size=self.GetCellSize(row, col)
#                                     data='3.jpg'
#                                     self.SetCellRenderer(row, col, MegaImageRenderer(self.GetTable(), data))
#                                 elif str(colValue).startswith('-______-'):
                                    
                                if str(colValue).startswith('-______-'):
                                    newStringValue = str(colValue).replace('-______-', '')
                                    self.SetCellFont(row, col, wx.Font(10, wx.FONTFAMILY_SCRIPT, wx.FONTSTYLE_ITALIC, wx.FONTWEIGHT_NORMAL))
                                    self.SetCellTextColour(row, col, wx.LIGHT_GREY)
                                    self.SetCellValue(row, col, newStringValue)
                                else:
                                    if dataTypeRow and dataTypeRow[col].lower() == 'blob':
#                                         data='3.jpg'
                                        if str(colValue).startswith('-______-'):
                                            newStringValue = str(colValue).replace('-______-', '')
                                            self.SetCellFont(row, col, wx.Font(10, wx.FONTFAMILY_SCRIPT, wx.FONTSTYLE_ITALIC, wx.FONTWEIGHT_NORMAL))
                                            self.SetCellTextColour(row, col, wx.LIGHT_GREY)
                                            self.SetCellValue(row, col, newStringValue)
                                        else:
                                            self.SetCellRenderer(row, col, MegaImageRenderer(self.GetTable(), colValue))
                                    elif dataTypeRow and dataTypeRow[col].lower() == 'integer':
                                        self.SetCellRenderer(row, col, gridlib.GridCellNumberRenderer())
                                        self.SetCellValue(row, col, str(colValue))
                                    elif dataTypeRow and dataTypeRow[col].lower() == 'datetime':
                                        self.SetCellRenderer(row, col, gridlib.GridCellDateTimeRenderer())
                                        self.SetCellValue(row, col, colValue)
                                    elif dataTypeRow and dataTypeRow[col].lower() == 'boolean':
                                        self.SetCellEditor(row, col, gridlib.GridCellBoolEditor())
                                        self.SetCellRenderer(row, col, CheckBoxCellRenderer(self))
                                        self.SetCellValue(row, col, str(colValue))
                                        self.SetCellAlignment(row, col, wx.ALIGN_RIGHT, wx.ALIGN_CENTRE)
#                                     elif dataTypeRow and dataTypeRow[col] in ['varchar', 'int']:
                                    else:                               
#                                     self.SetCellFont(dataKey - 1, idx,  wx.Font(10, wx.FONTFAMILY_ROMAN, wx.FONTSTYLE_ITALIC, wx.FONTWEIGHT_NORMAL))
#                                     self.SetCellTextColour(dataKey - 1, idx,wx.LIGHT_GREY)
                                        self.SetCellValue(row, col, str(colValue))
#                                 self.SetCellAlignment(dataKey - 1,idx, wx.ALIGN_RIGHT)
                            except Exception as e:
                                logger.error(e, exc_info=True)
            else:
                numCols = self.GetNumberCols()
                numRows = self.GetNumberRows()
                logger.debug("numRows:%s, numCol: %s", numRows, numCols)
                if numRows > 0 and numCols > 0:
                    self.DeleteCols(pos=0, numCols=numCols, updateLabels=True)
                    self.DeleteRows(pos=0, numRows=numRows, updateLabels=True)
        except Exception as e:
            logger.error(e, exc_info=True)
        self.Refresh()
#         self.SetColSize(0, 150)
#         self.SetColSize(1, 150)
#         self.SetColSize(2, 150)

    def selection(self):
        # Show cell selection
        # If selection is cell...
        if self.GetSelectedCells():
            logger.info("Selected cells " + str(self.GetSelectedCells()))
        # If selection is block...
        if self.GetSelectionBlockTopLeft():
            logger.info("Selection block top left " + str(self.GetSelectionBlockTopLeft()))
        if self.GetSelectionBlockBottomRight():
            logger.info("Selection block bottom right " + str(self.GetSelectionBlockBottomRight()))

        # If selection is col...
        if self.GetSelectedCols():
            logger.info("Selected cols " + str(self.GetSelectedCols()))

        # If selection is row...
        if self.GetSelectedRows():
            logger.info("Selected rows " + str(self.GetSelectedRows()))

    def currentcell(self):
        # Show cursor position
        row = self.GetGridCursorRow()
        col = self.GetGridCursorCol()
        cell = (row, col)
        logger.info("Current cell " + str(cell))
        return row, col

    def OnKey(self, event):
        # If Ctrl+C is pressed...
        if event.ControlDown() and event.GetKeyCode() == 67:
            logger.info("Ctrl+C")
            self.selection()
            # Call copy method
            self.copy()

        # If Ctrl+V is pressed...
        if event.ControlDown() and event.GetKeyCode() == 86:
            logger.info("Ctrl+V")
            self.currentcell()
            # Call paste method
            self.paste()

        # If Ctrl+Z is pressed...
        if event.ControlDown() and event.GetKeyCode() == 90:
            if self.data4undo[2] != '':
                self.paste('undo')

        # If Supr is presed
        if event.GetKeyCode() == 127:
            logger.info("Supr")
            # Call delete method
            self.delete()

        # Skip other Key events
        if event.GetKeyCode():
            event.Skip()
            return

    def delete(self):
        '''This method deletes text from selected cells, places a
        copy of the deleted cells on the clipboard for pasting
        (Ctrl+v), and places a copy in the self.data4undo variable
        for undoing (Ctrl+z)
        '''

        # Get number of delete rows and cols
        if self.GetSelectionBlockTopLeft() == []:
            rowstart = self.GetGridCursorRow()
            colstart = self.GetGridCursorCol()
            rowend = rowstart
            colend = colstart
        else:
            rowstart = self.GetSelectionBlockTopLeft()[0][0]
            colstart = self.GetSelectionBlockTopLeft()[0][1]
            rowend = self.GetSelectionBlockBottomRight()[0][0]
            colend = self.GetSelectionBlockBottomRight()[0][1]

        rows = rowend - rowstart + 1
        cols = colend - colstart + 1

        # Save deleted text and clear cells contents
        text4undo = ''
        for r in range(rows):
            for c in range(cols):
                text4undo += \
                    str(self.GetCellValue(rowstart + r, colstart + c)) + '\t'
                self.SetCellValue(rowstart + r, colstart + c, '')

            text4undo = text4undo[:-1] + '\n'

        # Save a copy of deleted text for undo
        self.data4undo = [rowstart, colstart, text4undo]

        # Save a copy of deleted text to clipboard for Ctrl+v
        clipboard = wx.TextDataObject()
        clipboard.SetText(text4undo)
        if wx.TheClipboard.Open():
            wx.TheClipboard.SetData(clipboard)
            wx.TheClipboard.Close()
        else:
            wx.MessageBox("Can't open the clipboard", "Error")

    def copy(self):
        logger.info("Copy method")
        data = None
        # Number of rows and cols
        if len(self.GetSelectionBlockBottomRight()) > 0:
            data = ''
            rows = self.GetSelectionBlockBottomRight()[0][0] - self.GetSelectionBlockTopLeft()[0][0] + 1
            cols = self.GetSelectionBlockBottomRight()[0][1] - self.GetSelectionBlockTopLeft()[0][1] + 1

            # data variable contain text that must be set in the clipboard

            # For each cell in selected range append the cell value in the data variable
            # Tabs '\t' for cols and '\r' for rows
            for r in range(rows):
                for c in range(cols):
                    data = data + str(self.GetCellValue(self.GetSelectionBlockTopLeft()[0][0] + r, self.GetSelectionBlockTopLeft()[0][1] + c))
                    if c < cols - 1:
                        data = data + '\t'
                data = data + '\n'
        else:
            # setting the current cell value
            data = self.GetCellValue(self.GridCursorRow, self.GridCursorCol)        
        if data:
            self.createClipboardData(data)

    def createClipboardData(self, data):
        # Create text data object
        clipboard = wx.TextDataObject()
        # Set data object value
        clipboard.SetText(data)
        # Put the data in the clipboard
        if wx.TheClipboard.Open():
            wx.TheClipboard.SetData(clipboard)
            wx.TheClipboard.Close()
        else:
            wx.MessageBox("Can't open the clipboard", "Error")
        
    def paste(self):
        logger.info("Paste method")
        clipboard = wx.TextDataObject()
        if wx.TheClipboard.Open():
            wx.TheClipboard.GetData(clipboard)
            wx.TheClipboard.Close()
        else:
            wx.MessageBox("Can't open the clipboard", "Error")
        data = clipboard.GetText()
        table = []
        y = -1
        # Convert text in a array of lines
        for r in data.splitlines():
            y = y + 1
            x = -1
            # Convert c in a array of text separated by tab
            for c in r.split('\t'):
                x = x + 1
                self.SetCellValue(self.GetGridCursorRow() + y, self.GetGridCursorCol() + x, c)

    #----------------------------------------------------------------------
    def onCellEdit(self, event):
        '''
        When cell is edited, get a handle on the editor widget
        and bind it to EVT_KEY_DOWN
        '''
        editor = event.GetControl()
        editor.Bind(wx.EVT_KEY_DOWN, self.onEditorKey)
        event.Skip()

    #----------------------------------------------------------------------
    def onEditorKey(self, event):
        '''
        Handler for the wx.grid's cell editor widget's keystrokes. Checks for specific
        keystrokes, such as arrow up or arrow down, and responds accordingly. Allows
        all other key strokes to pass through the handler.
        '''
        keycode = event.GetKeyCode()
        if keycode == wx.WXK_UP:
            logger.info('you pressed the UP key!')
            self.grid.MoveCursorUp(False)
        elif keycode == wx.WXK_DOWN:
            logger.info('you pressed the down key!')
            self.grid.MoveCursorDown(False)
        elif keycode == wx.WXK_LEFT:
            logger.info('you pressed the left key!')
            self.grid.MoveCursorLeft(False)
        elif keycode == wx.WXK_RIGHT:
            logger.info('you pressed the right key')
            self.grid.MoveCursorRight(False)
        else:
            pass
        event.Skip()

#----------------------------------------------------------------------
    def showHeaderPopupMenu(self, event):
        """
        Create and display a popup menu on right-click event
        """
        row, col = event.GetRow(), event.GetCol()
        if row == -1: self.colPopup(col, event)
        elif col == -1: self.rowPopup(row, event)

#         if col>=0:
#             header = self.GetColLabelValue(event.GetCol())
#             menu = GridHeaderPopupMenu(header=header)
#             self.PopupMenu(menu, event.GetPosition())
#             menu.Destroy()

    def rowPopup(self, row, evt):
        """(row, evt) -> display a popup menu when a row label is right clicked"""
        menu = wx.Menu()
        self = self
        copyID = wx.NewIdRef()
        appendID = wx.NewIdRef()
        deleteID = wx.NewIdRef()
        x = self.GetRowSize(row) / 2

        copyRowItem = wx.MenuItem(menu, copyID, "Copy Row")
        copyRowItem.SetBitmap(self.fileOperations.getImageBitmap(imageName="copy_edit_co.png"))
        copyItemMenu = menu.Append(copyRowItem)

        appendRowItem = wx.MenuItem(menu, appendID, "Append Row")
        appendRowItem.SetBitmap(self.fileOperations.getImageBitmap(imageName="row_add.png"))
        appendItemMenu = menu.Append(appendRowItem)
#         self.Bind(wx.EVT_MENU, lambda e: self.onCopySelection(e), copyItemMenu)

        if not self.GetSelectedRows():
            self.SelectRow(row)

        xo, yo = evt.GetPosition()
#         menu.Append(appendID, "Append Row")

        deleteRowsItem = wx.MenuItem(menu, deleteID, "Delete Row(s)")
        deleteRowsItem.SetBitmap(self.fileOperations.getImageBitmap(imageName="row_delete.png"))
        deleteItemMenu = menu.Append(deleteRowsItem)

#         menu.Append(deleteID, "Delete Row(s)")

        def copy(event, self=self, row=row):
            logger.debug(row)
#             self.AppendRows(row)

            selection = self.get_selection()
            if not selection:
                return []
            start_row, start_col, end_row, end_col = selection

            data = u''

            rows = range(start_row, end_row + 1)
            for row in rows:
                columns = range(start_col, end_col + 1)
                for idx, column in enumerate(columns, 1):
                    if idx == len(columns):
                        # if we are at the last cell of the row, add new line instead
                        data += self.GetCellValue(row, column) + "\n"
                    else:
                        data += self.GetCellValue(row, column) + "\t"

            text_data_object = wx.TextDataObject()
            text_data_object.SetText(data)

            if wx.TheClipboard.Open():
                wx.TheClipboard.SetData(text_data_object)
                wx.TheClipboard.Close()
            else:
                wx.MessageBox("Can't open the clipboard", "Warning")

        def append(event, self=self, row=row):
            logger.debug('append')
#             self.AppendRows(row)
            self.AppendRows(numRows=1, updateLabels=True)

        def delete(event, self=self, row=row):
            logger.debug(row)
            rows = self.GetSelectedRows()
            for row in rows:
                self.DeleteRows(pos=row, numRows=1, updateLabels=True)
#             self.DeleteRows(pos=0, numRows=1, updateLabels=True)

        self.Bind(wx.EVT_MENU, lambda e:copy(e, row=1), id=copyID)
        self.Bind(wx.EVT_MENU, lambda e:append(e, row=1), id=appendID)
        self.Bind(wx.EVT_MENU, lambda e:delete(e, row=[0]), id=deleteID)
        self.PopupMenu(menu)
        menu.Destroy()
        return

    def get_selection(self):
        """
        Returns selected range's start_row, start_col, end_row, end_col
        If there is no selection, returns selected cell's start_row=end_row, start_col=end_col
        """
        if not len(self.GetSelectionBlockTopLeft()):
            selected_columns = self.GetSelectedCols()
            selected_rows = self.GetSelectedRows()
            if selected_columns:
                start_col = selected_columns[0]
                end_col = selected_columns[-1]
                start_row = 0
                end_row = self.GetNumberRows() - 1
            elif selected_rows:
                start_row = selected_rows[0]
                end_row = selected_rows[-1]
                start_col = 0
                end_col = self.GetNumberCols() - 1
            else:
                start_row = end_row = self.GetGridCursorRow()
                start_col = end_col = self.GetGridCursorCol()
        elif len(self.GetSelectionBlockTopLeft()) > 1:
            wx.MessageBox("Multiple selections are not supported", "Warning")
            return []
        else:
            start_row, start_col = self.GetSelectionBlockTopLeft()[0]
            end_row, end_col = self.GetSelectionBlockBottomRight()[0]

        return [start_row, start_col, end_row, end_col]

    def get_selected_cells(self):
        # returns a list of selected cells
        selection = self.get_selection()
        if not selection:
            return

        start_row, start_col, end_row, end_col = selection
        for row in range(start_row, end_row + 1):
            for col in range(start_col, end_col + 1):
                yield [row, col]

    def colPopup(self, col, evt):
        """(col, evt) -> display a popup menu when a column label is
        right clicked"""
        x = self.GetColSize(col) / 2
        menu = wx.Menu()
        copyHeaderId = wx.NewIdRef()
        sortID = wx.NewIdRef()

        xo, yo = evt.GetPosition()
        self.SelectCol(col)
        cols = self.GetSelectedCols()
        header = self.GetColLabelValue(col)
        self.Refresh()

        copyHeaderItem = wx.MenuItem(menu, copyHeaderId, "Copy Selected Header")
        copyHeaderItem.SetBitmap(self.fileOperations.getImageBitmap(imageName="copy_edit_co.png"))
        copyHeaderMenu = menu.Append(copyHeaderItem)

        sortHeaderItem = wx.MenuItem(menu, sortID, "Sort Column")
        sortHeaderItem.SetBitmap(self.fileOperations.getImageBitmap(imageName="sort.png"))
        sortHeaderMenu = menu.Append(sortHeaderItem)

#         menu.Append(copyHeaderId, "Copy Selected Header")
#         menu.Append(sortID, "Sort Column")

#         self.header = header
#         item = wx.MenuItem(self, wx.NewIdRef(), "Sort...")
#         self.Append(item)
#         self.Bind(wx.EVT_MENU, self.OnSortColumn, item)
#
#         item = wx.MenuItem(self, wx.NewIdRef(), "Copy Selected Header")
#         self.Append(item)
#         self.Bind(wx.EVT_MENU, self.OnItem3, item)

        def delete(event, self=self, col=col):
            cols = self.GetSelectedCols()
            self._table.DeleteCols(cols)
            logger.info('TODO delete')
            self.Reset()

        def sort(event, self=self, col=col):
            logger.info(f'TODO started sorting{col}: {self.IsSortOrderAscending()} :{self.GetSortingColumn()}')
            self.IsSortOrderAscending()
            self.SetSortingColumn(col, ascending=True)

#             self._table.SortColumn(col)
#             self.Reset()
        def copyColumnName(event, self=self, header=header):
            """"""
            self.dataObj = wx.TextDataObject()
            self.dataObj.SetText(header)
            if wx.TheClipboard.Open():
                wx.TheClipboard.SetData(self.dataObj)
                wx.TheClipboard.Close()
            else:
                wx.MessageBox("Unable to open the clipboard", "Error")
#             self.header = header
            pass

        self.Bind(wx.EVT_MENU, copyColumnName, id=copyHeaderId)

        if len(cols) == 1:
            self.Bind(wx.EVT_MENU, lambda e:sort(e, col=cols[0]), id=sortID)

        self.PopupMenu(menu)
        menu.Destroy()
        return

#----------------------------------------------------------------------
    def showGridCellPopupMenu(self, event):
        """
        Create and display a popup menu on right-click event
        """
        menu = GridCellPopupMenu(self)
        self.PopupMenu(menu, event.GetPosition())
        menu.Destroy()