Пример #1
0
    def __init__(self, **kwargs):
        """

        """

        self.taskserver = kwargs.pop('taskServer')
        self.memDB = kwargs.pop('memdb')

        # Determine the optimal size of the screen resolution
        size = self._obtainScreenResolution()
        kwargs['size'] = size

        wx.Frame.__init__(self, **kwargs)

        self.service_manager = ServiceManager()
        self.record_service = None

        series_service = self._init_database()
        if series_service:
            self._init_ctrls(series_service)
            self._init_aui_manager()
            self._init_sizers()
            self._ribbon.Realize()
            self.Refresh()
            logger.debug("System starting ...")
        else:
            logger.debug("System shutting down... ")
            sys.exit(0)
Пример #2
0
    def setup(self):
        conn_dict = {'engine': 'sqlite', 'address': ':memory:'}
        self.sm = ServiceManager(conn_dict=conn_dict)
        # set up remote Database
        # self.connection_string = "sqlite:///:memory:"

        self.series_service = self.sm.get_series_service(
        )  # SeriesService(connection_string=self.connection_string, debug=False)
        self.session = self.series_service._session_factory.get_session()
        engine = self.series_service._session_factory.engine
        test_util.build_db(engine)

        self.dvs_size = 100
        self.series = test_util.add_series_bulk_data(self.session,
                                                     dvs_size=self.dvs_size)
        assert self.series
        assert len(self.series.data_values) == self.dvs_size

        self.memory_database = MemoryDatabase()
        self.memory_database.set_series_service(self.series_service)
        # self.memory_database.initEditValues(self.series.id)

        self.app = wx.App()
        self.frame = wx.Frame(None)
        self.wizard = wizSave(
            self.frame, self.sm,
            self.sm.get_edit_service(self.series.id, self.memory_database))
Пример #3
0
    def __init__(self, parent, dbservice):

        self.parent = parent
        wx.Panel.__init__(self, name=u'pnlSeriesSelector', parent=parent,
                          size=wx.Size(935, 270), style=wx.TAB_TRAVERSAL)
        self._init_ctrls()
        self.series_service = dbservice
        self.initTableSeries()
        self.initSVBoxes()
        # Subscribe functions
        self.initPubSub()
        self.service_manager = ServiceManager()
        self.export_service = self.service_manager.get_export_service()
        self.selectedIndex = 0
        self.isEditing = False
Пример #4
0
    def __init__(self, **kwargs):
        """

        """

        self.taskserver = kwargs.pop('taskServer')
        self.memDB = kwargs.pop('memdb')

        # Determine the optimal size of the screen resolution
        size = self._obtainScreenResolution()
        kwargs['size'] = size

        wx.Frame.__init__(self, **kwargs)

        self.service_manager = ServiceManager()
        self.record_service = None
        self.scriptcreate = False

        series_service = self._init_database()
        if series_service:
            self._init_ctrls(series_service)
            self._init_aui_manager()
            self._init_sizers()
            self._ribbon.Realize()
            self.Refresh()
            logger.info("System starting ...")
        else:
            logger.info("System shutting down... ")
            sys.exit(0)
Пример #5
0
    def __init__(self, parent, dbservice):

        self.parent = parent
        wx.Panel.__init__(self, name=u'pnlSeriesSelector', parent=parent,
                          size=wx.Size(935, 270), style=wx.TAB_TRAVERSAL)
        self._init_ctrls()
        self.series_service = dbservice
        self.initTableSeries()
        self.initSVBoxes()
        # Subscribe functions
        self.initPubSub()
        self.service_manager = ServiceManager()
        self.export_service = self.service_manager.get_export_service()
        self.selectedIndex = 0
        self.isEditing = False
Пример #6
0
class TestWizSave:
    def setup(self):
        conn_dict = {'engine': 'sqlite', 'address': ':memory:'}
        self.sm = ServiceManager(conn_dict=conn_dict)
        # set up remote Database
        # self.connection_string = "sqlite:///:memory:"

        self.series_service = self.sm.get_series_service()  # SeriesService(connection_string=self.connection_string, debug=False)
        self.session = self.series_service._session_factory.get_session()
        engine = self.series_service._session_factory.engine
        test_util.build_db(engine)

        self.dvs_size = 100
        self.series = test_util.add_series_bulk_data(self.session, dvs_size=self.dvs_size)
        assert self.series
        assert len(self.series.data_values) == self.dvs_size

        self.memory_database = MemoryDatabase()
        self.memory_database.set_series_service(self.series_service)
        # self.memory_database.initEditValues(self.series.id)

        self.app = wx.App()
        self.frame = wx.Frame(None)
        self.wizard = wizSave(self.frame,self.sm, self.sm.get_edit_service(self.series.id, self.memory_database))
Пример #7
0
    def __init__(self, parent):
        size = self._obtainScreenResolution()
        wx.Frame.__init__(self, id=wxID_ODMTOOLS, name=u'ODMTools', parent=parent,
            size=size, style=wx.DEFAULT_FRAME_STYLE, title=u'ODM Tools')

        ## Obtain any existing database connections
        self.service_manager = ServiceManager()
        self.service_manager.extractConnectionInfo()
        self.record_service = None


        ## Initalize database
        self._init_database()
        self._init_ctrls()
        self.Refresh()
Пример #8
0
    def setup(self):
        self.app = wx.App()

        self.service_manager = ServiceManager()
        #self.sc = self.service_manager.get_series_service(conn_dict=conn_dict)
        self.sc = None

        self.wxFrame = wx.Frame(None)
        self.pnlDocking = wx.Panel(self.wxFrame)

        self.frame = FrmSeriesSelector(name=u'pnlSelector',
                                       parent=self.pnlDocking,
                                       size=wx.Size(770, 388),
                                       style=wx.TAB_TRAVERSAL,
                                       dbservice=self.sc,
                                       serviceManager=self.service_manager)
        assert self.frame
Пример #9
0
class ClsSeriesSelector(wx.Panel):

    def __init__(self, parent, dbservice):

        self.parent = parent
        wx.Panel.__init__(self, name=u'pnlSeriesSelector', parent=parent,
                          size=wx.Size(935, 270), style=wx.TAB_TRAVERSAL)
        self._init_ctrls()
        self.series_service = dbservice
        self.initTableSeries()
        self.initSVBoxes()
        # Subscribe functions
        self.initPubSub()
        self.service_manager = ServiceManager()
        self.export_service = self.service_manager.get_export_service()
        self.selectedIndex = 0
        self.isEditing = False
    ## Radio Sizer
    ##    def _init_coll_boxSizer5_Items(self, parent):
    ##        # generated method, don't edit
    ##
    ##        parent.AddWindow(self.rbAll, 0, border=1, flag=wx.ALL)
    ##        parent.AddWindow(self.rbSimple, 0, border=1, flag=wx.ALL)
    ##        parent.AddWindow(self.rbAdvanced, 0, border=1, flag=wx.ALL)


    ## Splitter Sizer
    def _init_coll_boxSizer3_Items(self, parent):
        # generated method, don't edit
        parent.AddWindow(self.cpnlSimple, 0, flag=wx.RIGHT | wx.LEFT | wx.EXPAND)
        parent.AddWindow(self.tblSeries, 100, flag=wx.EXPAND)

    ## Panel Sizer
    def _init_coll_boxSizer1_Items(self, parent):
        # generated method, don't edit
        parent.AddSizer(self.pnlRadio, 0, border=7, flag=wx.LEFT | wx.RIGHT | wx.TOP)
        parent.AddWindow(self.pnlData, 100, border=3, flag=wx.LEFT | wx.RIGHT | wx.EXPAND)

    ## Site Sizer
    def _init_coll_boxSizer4_Items(self, parent):
        # generated method, don't edit
        parent.AddWindow(self.checkSite, 0, border=3, flag=wx.LEFT | wx.RIGHT)
        parent.AddWindow(self.lblSite, 0, border=3, flag=wx.LEFT | wx.RIGHT)
        parent.AddWindow(self.cbSites, 90, border=3, flag=wx.LEFT | wx.RIGHT | wx.EXPAND)

    ## Variable Sizer
    def _init_coll_boxSizer2_Items(self, parent):
        # generated method, don't edit
        parent.AddWindow(self.checkVariable, 0, border=3, flag=wx.LEFT | wx.RIGHT)
        parent.AddWindow(self.lblVariable, 0, border=3, flag=wx.LEFT | wx.RIGHT)
        parent.AddWindow(self.cbVariables, 90, border=3, flag=wx.LEFT | wx.RIGHT | wx.EXPAND)

    ##  Simple Filter Sizer
    def _init_coll_boxSizer6_Items(self, parent):
        parent.AddWindow(self.pnlSite, 50, flag=wx.EXPAND)
        parent.AddWindow(self.pnlVar, 50, flag=wx.EXPAND)
        # parent.AddSizer(self.boxSizer4, 0, border=5, flag=wx.EXPAND)
        # parent.AddSizer(self.boxSizer2, 0, border=5, flag=wx.EXPAND)


    def _init_sizers(self):
        # generated method, don't edit
        self.boxSizer1 = wx.BoxSizer(orient=wx.VERTICAL)
        self.boxSizer2 = wx.BoxSizer(orient=wx.HORIZONTAL)
        self.boxSizer3 = wx.BoxSizer(orient=wx.VERTICAL)
        self.boxSizer4 = wx.BoxSizer(orient=wx.HORIZONTAL)
        ##        self.boxSizer5 = wx.BoxSizer(orient=wx.HORIZONTAL)
        self.boxSizer6 = wx.BoxSizer(orient=wx.VERTICAL)

        self._init_coll_boxSizer1_Items(self.boxSizer1)
        self._init_coll_boxSizer2_Items(self.boxSizer2)
        self._init_coll_boxSizer3_Items(self.boxSizer3)
        self._init_coll_boxSizer4_Items(self.boxSizer4)
        ##        self._init_coll_boxSizer5_Items(self.boxSizer5)
        self._init_coll_boxSizer6_Items(self.boxSizer6)

        self.SetSizer(self.boxSizer1)
        ##        self.pnlRadio.SetSizer(self.boxSizer5)
        ##        self.pnlSite.SetSizer(self.boxSizer4)
        ##        self.pnlVar.SetSizer(self.boxSizer2)
        self.cpnlSimple.SetSizer(self.boxSizer6)
        self.pnlData.SetSizer(self.boxSizer3)
        # self.pnlRadio.SetSizer(self.boxSizer5)

    def _init_ctrls(self):
        # generated method, don't edit


        self.SetClientSize(wx.Size(919, 232))
        self.Enable(True)

        ## Radio panel
        self.pnlRadio = wx.Panel(id=wxID_PNLRADIO, name='pnlRadio', parent=self, pos=wx.Point(3, 3),
                                 size=wx.Size(919, 20), style=wx.TAB_TRAVERSAL)

        self.rbAll = wx.RadioButton(id=wxID_FRAME1RBALL, label=u'All', name=u'rbAll', parent=self.pnlRadio,
                                    pos=wx.Point(0, 0), size=wx.Size(81, 20), style=0)

        self.rbSimple = wx.RadioButton(id=wxID_FRAME1RBSIMPLE, label=u'Simple Filter', name=u'rbSimple',
                                       parent=self.pnlRadio, pos=wx.Point(81, 0), size=wx.Size(112, 20), style=0)

        self.rbAdvanced = wx.RadioButton(id=wxID_FRAME1RBADVANCED, label=u'Advanced Filter', name=u'rbAdvanced',
                                         parent=self.pnlRadio, pos=wx.Point(193, 0), size=wx.Size(104, 20), style=0)

        self.rbAll.SetValue(True)

        self.rbAdvanced.Enable(False)

        ## Splitter panel
        self.pnlData = wx.Panel(id=wxID_PNLSPLITTER, name='pnlData', parent=self, pos=wx.Point(0, -10),
                                size=wx.Size(900, 349), style=wx.TAB_TRAVERSAL)

        self.cpnlSimple = wx.CollapsiblePane(self.pnlData, label="", style=wx.CP_DEFAULT_STYLE | wx.CP_NO_TLW_RESIZE)

        ## Site Panel
        self.pnlSite = wx.Panel(id=wxID_PNLSERIESSELECTORPANEL1, name='pnlSite', parent=self.cpnlSimple.GetPane(),
                                pos=wx.Point(3, 0), size=wx.Size(800, 25), style=wx.TAB_TRAVERSAL)

        self.cbSites = wx.ComboBox(choices=[], id=wxID_PNLSERIESSELECTORCBSITES, name=u'cbSites', parent=self.pnlSite,
                                   pos=wx.Point(100, 0), size=wx.Size(700, 23), style=wx.CB_READONLY, value=u'')

        self.checkSite = wx.CheckBox(id=wxID_PNLSERIESSELECTORCHECKSITE, label=u'', name=u'checkSite',
                                     parent=self.pnlSite, pos=wx.Point(3, 0), size=wx.Size(21, 21), style=0)

        self.lblSite = wx.StaticText(id=wxID_PNLSERIESSELECTORLBLSITE, label=u'Site', name=u'lblSite',
                                     parent=self.pnlSite, pos=wx.Point(30, 0), size=wx.Size(60, 21), style=0)
        self.lblSite.SetToolTipString(u'staticText1')

        self.cbSites.SetLabel(u'')
        #self.checkSite.SetValue(False)

        ### Variable Panel
        self.pnlVar = wx.Panel(id=wxID_PNLSERIESSELECTORPANEL2, name='pnlVar', parent=self.cpnlSimple.GetPane(),
                               pos=wx.Point(3, 26), size=wx.Size(800, 25), style=wx.TAB_TRAVERSAL)

        self.lblVariable = wx.StaticText(id=wxID_PNLSERIESSELECTORLBLVARIABLE, label=u'Variable', name=u'lblVariable',
                                         parent=self.pnlVar, pos=wx.Point(30, 0), size=wx.Size(60, 21), style=0)

        self.checkVariable = wx.CheckBox(id=wxID_PNLSERIESSELECTORCHECKVARIABLE, label=u'', name=u'checkVariable',
                                         parent=self.pnlVar, pos=wx.Point(3, 0), size=wx.Size(21, 21), style=0)

        self.cbVariables = wx.ComboBox(choices=[], id=wxID_PNLSERIESSELECTORCBVARIABLES, name=u'cbVariables',
                                       parent=self.pnlVar, pos=wx.Point(100, 0), size=wx.Size(700, 25), style=wx.CB_READONLY,
                                       value='comboBox4')
        self.cbVariables.SetLabel(u'')
        self.cbVariables.Enable(False)

        #wx.EVT_RADIOBUTTON(self, self.rbAll.Id, self.onRbAllRadiobutton)
        self.rbAll.Bind(wx.EVT_RADIOBUTTON, self.onRbAllRadiobutton, id=wxID_FRAME1RBALL)
        self.rbSimple.Bind(wx.EVT_RADIOBUTTON, self.onRbSimpleRadiobutton, id=wxID_FRAME1RBSIMPLE)
        self.rbAdvanced.Bind(wx.EVT_RADIOBUTTON, self.onRbAdvancedRadiobutton, id=wxID_FRAME1RBADVANCED)

        self.Bind(wx.EVT_COLLAPSIBLEPANE_CHANGED, self.onPaneChanged, self.cpnlSimple)
        self.checkSite.Bind(wx.EVT_CHECKBOX, self.onCheck, id=wxID_PNLSERIESSELECTORCHECKSITE)
        self.checkVariable.Bind(wx.EVT_CHECKBOX, self.onCheck, id=wxID_PNLSERIESSELECTORCHECKVARIABLE)
        self.cbSites.Bind(wx.EVT_COMBOBOX, self.onCbSitesCombobox, id=wxID_PNLSERIESSELECTORCBSITES)
        self.cbVariables.Bind(wx.EVT_COMBOBOX, self.onCbVariablesCombobox, id=wxID_PNLSERIESSELECTORCBVARIABLES)


        ### New Stuff ##################################################################################################

        self.tblSeries = olvSeriesSelector.clsSeriesTable(id=wxID_PNLSERIESSELECTORtableSeries, parent=self.pnlData,
                                               name=u'tblSeries', size=wx.Size(950, 108), pos=wx.Point(5, 5),
                                               style=wx.LC_REPORT | wx.LC_SINGLE_SEL | wx.LC_VIRTUAL)

        self.tblSeries.SetEmptyListMsg("No Database Loaded")

        #self.tblSeries.rowFormatter = self._rowFormatter
        self.tblSeries.Bind(EVT_OVL_CHECK_EVENT, self.onReadyToPlot)
        self.tblSeries.Bind(wx.EVT_LIST_ITEM_FOCUSED, self.getSelectedObject)
        self.tblSeries.Bind(wx.EVT_LIST_ITEM_RIGHT_CLICK, self.OnTableRightDown,
                                   id=wxID_PNLSERIESSELECTORtableSeries)
        self.tblSeries.handleStandardKeys = True
        self.tblSeries.useAlternateBackColors = True
        #self.tblSeries.oddRowsBackColor = wx.Colour(143, 188, 188)
        self.tblSeries.oddRowsBackColor = wx.Colour(191, 217, 217)
        self.cpnlSimple.Collapse(True)
        self._init_sizers()

    ## Virtual Event Handlers
    def onReadyToPlot(self, event):
        event.Skip()

    def onReadyToEdit(self, event):
        event.Skip()

    def stopEdit(self):
        pass

    def getSelectedObject(self, event):
        event.Skip()

    def resetDB(self, dbservice):
        pass

    def initTableSeries(self):
        pass

    def refreshTableSeries(self, db):
        pass

    def refreshSeries(self):
        pass

    def initSVBoxes(self):
        pass

    def initPubSub(self):
        pass

    def OnTableRightDown(self, event):
        event.Skip()

    def onPaneChanged(self, event=None):
        pass

    def onRbAdvancedRadiobutton(self, event):
        event.Skip()

    def onRbAllRadiobutton(self, event):
        event.Skip()

    def onRbSimpleRadiobutton(self, event):
        event.Skip()

    def onRightPlot(self, event):
        event.Skip()

    def onRightEdit(self, event):
        event.Skip()

    def onRightRefresh(self, event):
        event.Skip()

    def onRightClearSelected(self, event):
        event.Skip()

    def onRightExData(self, event):
        event.Skip()

    def onRightExMeta(self, event):
        event.Skip()

    def onCbSitesCombobox(self, event):
        event.Skip()

    def onCbVariablesCombobox(self, event):
        event.Skip()

    def siteAndVariables(self):
        pass

    def siteOnly(self):
        pass

    def variableOnly(self):
        pass

    def onCheck(self, event):
        event.Skip()

    def setFilter(self, site_code='', var_code='', advfilter=''):
        pass

    def isEditing(self):
        return self.isEditing


    def _rowFormatter(self, listItem, object):
        pass
Пример #10
0
class frmODMToolsMain(wx.Frame):
    """

    """

    def __init__(self, **kwargs):
        """

        """

        self.taskserver = kwargs.pop('taskServer')
        self.memDB = kwargs.pop('memdb')

        # Determine the optimal size of the screen resolution
        size = self._obtainScreenResolution()
        kwargs['size'] = size

        wx.Frame.__init__(self, **kwargs)

        self.service_manager = ServiceManager()
        self.record_service = None
        self.scriptcreate = False

        series_service = self._init_database()
        if series_service:
            self._init_ctrls(series_service)
            self._init_aui_manager()
            self._init_sizers()
            self._ribbon.Realize()
            self.Refresh()
            logger.info("System starting ...")
        else:
            logger.info("System shutting down... ")
            sys.exit(0)


    def _obtainScreenResolution(self):
        """ Calculates the size of ODMTools. Prevents ODMTools being larger than the available screen size
            typically a problem on laptops

        :return wx.Size:
        """

        defaultSize = wx.Size(850, 800)
        defaultHeight, defaultWidth = defaultSize
        screenHeight, screenWidth = wx.GetDisplaySize()
        minimumAllowedSize = wx.Size(640, 480)

        '''
        if minimumAllowedSize >= wx.GetDisplaySize():
            logger.fatal("ODMTools cannot be displayed in this resolution: %s \n\tPlease use a larger resolution"
                         % wx.GetDisplaySize())
            print "minimumAllowedsize: ", minimumAllowedSize, "display: ", wx.GetDisplaySize()
            sys.exit(0)
        '''

        newSize = defaultSize
        ## Screen size is greater than ODMTools' default size
        if screenHeight > defaultHeight and screenWidth > defaultWidth:
            pass
        ## Screen size is smaller than ODMTools' default size
        elif screenHeight < defaultHeight and screenWidth < defaultWidth:
            newSize = wx.Size(screenHeight / 1.5, screenWidth / 1.5)
        elif screenHeight < defaultHeight:
            newSize = wx.Size(screenHeight / 1.5, defaultWidth)
        elif screenWidth < defaultWidth:
            newSize = wx.Size(defaultHeight, screenWidth / 1.5)

        logger.debug("ODMTools Window Size: %s" % newSize)
        return newSize


    #############Entire Form Sizers##########

    def _init_sizers(self):
        # generated method, don't edit
        self.s = wx.BoxSizer(wx.VERTICAL)
        self._init_s_Items(self.s)
        self.SetSizer(self.s)

    def _init_s_Items(self, parent):
        # generated method, don't edit
        parent.AddWindow(self._ribbon, 0, wx.EXPAND)
        parent.AddWindow(self.pnlDocking, 85, flag=wx.ALL | wx.EXPAND)

    def _init_database(self, quit_if_cancel=True):
        logger.info("Loading Database...")



        while True:
            ## Database connection is valid, therefore proceed through the rest of the program
            if self.service_manager.is_valid_connection():
                conn_dict = None

                series_service = self.createService()
                conn_dict = self.service_manager.get_current_conn_dict()

                if self.servicesValid(series_service):
                    self.service_manager.add_connection(conn_dict)
                    break

            db_config = frmDBConfig.frmDBConfig(None, self.service_manager, False)
            value = db_config.ShowModal()
            if value == wx.ID_CANCEL and quit_if_cancel:
                logger.fatal("ODMTools is now closing because there is no database connection.")
                sys.exit(0)
            elif not quit_if_cancel:
                return series_service

            newConnection = db_config.panel.getFieldValues()
            self.service_manager.set_current_conn_dict(newConnection)
            db_config.Destroy()

        conn_dict = self.service_manager.get_current_conn_dict()
        msg = '%s://%s@%s/%s' % (
            conn_dict['engine'], conn_dict['user'], conn_dict['address'], conn_dict['db']
        )
        logger.debug("...Connected to '%s'" % msg)

        return series_service

    def onChangeDBConn(self, event):
        db_config = frmDBConfig.frmDBConfig(None, self.service_manager, False)
        value = db_config.ShowModal()
        if value == wx.ID_CANCEL:
            return

        newConnection = db_config.panel.getFieldValues()
        self.service_manager.set_current_conn_dict(newConnection)
        db_config.Destroy()

        if self._init_database(quit_if_cancel=False):
            # if editing, stop editing...
            if self._ribbon.getEditStatus():
                self.stopEdit(event=None)

        if value == wx.ID_OK:

            series_service = self.createService(newConnection)
            self.pnlSelector.resetDB(series_service)
            self.refreshConnectionInfo()
            self.pnlPlot.clear()
            self.dataTable.clear()


    def servicesValid(self, service, displayMsg=True):
        """

        :param displayMsg:
            Option to display a message box if there is an issue with a service. Default: True
        :return:
        """
        valid = True

        ## Test if Series Catalog is empty
        if not service.get_used_sites():
            if displayMsg:
                msg = wx.MessageDialog(None, 'Series Catalog cannot be empty. Please enter in a new database connection',
                                           'Series Catalog is empty', wx.OK | wx.ICON_ERROR )
                msg.ShowModal()
            valid = False

        # @TODO If Jeff runs into other issues with services not being available, we can simply test different services here
        #if not service.get_all_variables():
        #    valid = False

        return valid

    def on_about_request(self, event):
        frmAbout(self)

    def MacReopenApp(self):
        """Called when the doc icon is clicked, and ???"""

        try: # it's possible for this event to come when the frame is closed
            self.GetTopWindow().Raise()
        except:
            pass

    ###################### Frame ################

    def _init_ctrls(self, series_service):
        # generated method, don't edit
        logger.debug("Loading frame...")

        self.SetIcon(gtk_execute.getIcon())

        self.SetFont(wx.Font(9, wx.SWISS, wx.NORMAL, wx.NORMAL,
                             False, u'Tahoma'))

        ############### Ribbon ###################
        logger.debug("Loading Ribbon Menu...")
        self._ribbon = mnuRibbon.mnuRibbon(parent=self, id=wx.ID_ANY, name='ribbon')

        if sys.platform == 'darwin':
            self.menu_bar = wx.MenuBar()
            self.help_menu = wx.Menu()

            self.help_menu.Append(wx.ID_ABOUT, "&About ODMTools")
            self.menu_bar.Append(self.help_menu, "&Help")

            self.SetMenuBar(self.menu_bar)
            self.Bind(wx.EVT_MENU, self.on_about_request, id=wx.ID_ABOUT)

            # self.menu_bar.SetAutoWindowMenu()

        ################ Docking Tools##############
        self.pnlDocking = wx.Panel(name='pnlDocking',
                                   parent=self, size=wx.Size(605, 458),
                                   style=wx.TAB_TRAVERSAL)

        ############# Graph ###############
        logger.debug("Loading Plot ...")
        self.pnlPlot = pnlPlot.pnlPlot(self.pnlDocking, self.taskserver)

        ################ Series Selection Panel ##################
        logger.debug("Loading Series Selector ...")


        self.pnlSelector = FrmSeriesSelector(self.pnlDocking, series_service, plot=self.pnlPlot, taskserver=self.taskserver, memdb = self.memDB)


        ####################grid Table View##################
        logger.debug("Loading DataTable ...")
        self.dataTable = FrmDataTable(self.pnlDocking)

        # self.dataTable.toggleBindings()
        ############# Script & Console ###############
        logger.debug("Loading Python Console ...")
        self.txtPythonConsole = ODMToolsConsole(parent=self.pnlDocking, size=wx.Size(200, 200))
        wx.CallAfter(self._postStartup)



        logger.debug("Loading Python Script ...")
        self.txtPythonScript = pnlScript(name=u'txtPython', parent=self,
                                     size=wx.Size(200, 200))

        self.Bind(wx.EVT_CLOSE, self.onClose)


        Publisher.subscribe(self.onDocking, ("adjust.Docking"))
        Publisher.subscribe(self.onPlotSelection, ("select.Plot"))
        Publisher.subscribe(self.onExecuteScript, ("execute.script"))
        Publisher.subscribe(self.onChangeDBConn, ("change.dbConfig"))
        Publisher.subscribe(self.onSetScriptTitle, ("script.title"))
        Publisher.subscribe(self.onClose, ("onClose"))
        Publisher.subscribe(self.addEdit, ("selectEdit"))
        Publisher.subscribe(self.stopEdit, ("stopEdit"))


    def _init_aui_manager(self):

        ############ Docking ###################
        logger.debug("Loading AuiManager ...")
        self._mgr = aui.AuiManager()
        self._mgr.SetManagedWindow(self.pnlDocking)

        self._mgr.AddPane(self.pnlPlot, aui.AuiPaneInfo().CenterPane()
                          .Name("Plot").Caption("Plot").MaximizeButton(True).DestroyOnClose(False)

        )

        self._mgr.AddPane(self.dataTable, aui.AuiPaneInfo().Right().Name("Table").
                          Show(show=False).Caption('Table View').MinSize(wx.Size(200, 200)).Floatable().Movable().
                          Position(1).MinimizeButton(True).MaximizeButton(True).DestroyOnClose(False)

        )

        self._mgr.AddPane(self.pnlSelector, aui.AuiPaneInfo().Bottom().Name("Selector").MinSize(wx.Size(50, 200)).
                          Movable().Floatable().Position(0).MinimizeButton(True).MaximizeButton(True).CloseButton(True)
                          .DestroyOnClose(False)
        )

        self._mgr.AddPane(self.txtPythonScript, aui.AuiPaneInfo().Caption('Script').
                          Name("Script").Movable().Floatable().Right()
                          .MinimizeButton(True).MaximizeButton(True).FloatingSize(size=(400, 400))
                          .CloseButton(True).Float().FloatingPosition(pos=(self.Position))
                          .Hide().CloseButton(True).DestroyOnClose(False)
        )

        self._mgr.AddPane(self.txtPythonConsole, aui.AuiPaneInfo().Caption('Python Console').
                          Name("Console").FloatingSize(size=(300, 400)).MinimizeButton(
            True).Movable().Floatable().MaximizeButton(True).CloseButton(True).Float()
                          .FloatingPosition(pos=(self.Position)).Show(show=False).DestroyOnClose(False)
        )


        ## TODO Fix loadingDockingSettings as it doesn't load it correctly.
        # self.loadDockingSettings()

        self.refreshConnectionInfo()
        self._mgr.Update()

    def refreshConnectionInfo(self):
        """Updates the Series Selector Connection Information for the user"""

        conn_dict = self.service_manager.get_current_conn_dict()

        msg = 'Series: %s://%s@%s/%s' % (
            conn_dict['engine'], conn_dict['user'], conn_dict['address'], conn_dict['db']
        )

        self._mgr.GetPane('Selector').Caption(msg)
        self._mgr.RefreshCaptions()

    def onDocking(self, value):
        paneDetails = self._mgr.GetPane(self.pnlPlot)

        if value == "Table":
            paneDetails = self._mgr.GetPane(self.dataTable)
            # self.dataTable.toggleBindings()

        elif value == "Selector":
            paneDetails = self._mgr.GetPane(self.pnlSelector)

        elif value == "Script":
            paneDetails = self._mgr.GetPane(self.txtPythonScript)

        elif value == "Console":
            paneDetails = self._mgr.GetPane(self.txtPythonConsole)
            self.txtPythonConsole.crust.OnSashDClick(event=None)

        if paneDetails.IsNotebookPage() or paneDetails.dock_direction == 0:
            paneDetails.FloatingPosition(pos=self.Position)
            paneDetails.Float()

        if paneDetails.IsShown():
            paneDetails.Show(show=False)
        else:
            paneDetails.Show(show=True)
        self._mgr.Update()

    def getDBService(self):
        return self.service_manager

    def onPlotSelection(self, value):
        self.pnlPlot.selectPlot(value)


    def onSetScriptTitle(self, title):
        scriptPane = self._mgr.GetPane(self.txtPythonScript)
        scriptPane.Caption(title)
        if scriptPane.IsFloating():
            scriptPane.Restore()
        self._mgr.Update()

    def addEdit(self, event):

        with wx.BusyInfo("Please wait for a moment while ODMTools fetches the data and stores it in our database", parent=self):
            self.scriptcreate = True
            isSelected, seriesID = self.pnlSelector.onReadyToEdit()
            logger.info("Beginning editing seriesID: %s"%str(seriesID))

            # logger.debug("Initializing DataTable")
            # # tasks = [("dataTable", (memDB.conn, self.dataTable.myOlv))]
            # tasks = [("dataTable", (self.dataTable.myOlv))]
            # self.taskserver.setTasks(tasks)
            # self.taskserver.processTasks()

            if isSelected:
                self.record_service = self.service_manager.get_record_service(self.txtPythonScript, seriesID,
                                                                              connection=self.memDB)
                self._ribbon.toggleEditButtons(True)

                logger.debug("Initializing Plot")
                self.pnlPlot.addEditPlot(self.memDB, seriesID, self.record_service)

                logger.debug("Initializing DataTable")
                self.dataTable.init(self.memDB)

                # set record service for console
                Publisher.sendMessage("setEdit", isEdit=True)
                logger.debug("Enabling Edit")
                self.record_service.toggle_record(True)

                # set the cursor for matplotlib
                selectedObject = self.record_service.get_series()
                Publisher.sendMessage("updateCursor", selectedObject=selectedObject)

            else:
                logger.debug("disabling Edit")
                Publisher.sendMessage("setEdit", isEdit=False)

                self.record_service.toggle_record(False)

                # disable cursor for matplotlib
                selectedObject = self.record_service.get_series()
                Publisher.sendMessage("updateCursor", deselectedObject=selectedObject)


            # self._mgr.Update()

            logger.debug("Recording? %s" % self.record_service._record)


            #self.record_service = None
            self.txtPythonConsole.shell.run("edit_service = app.TopWindow.record_service", prompt=False, verbose=False)
            self.txtPythonConsole.shell.run("series_service = edit_service.get_series_service()", prompt=False,
                                            verbose=False)

            #from meliae import scanner
            #scanner.dump_all_objects("edit_plotting.dat")
            logger.info("Finished Setting up Editing Series: %s " % seriesID)


    def stopEdit(self, event):

        self.pnlSelector.stopEdit()
        self.dataTable.stopEdit()
        self.pnlPlot.stopEdit()
        Publisher.sendMessage("toggleEdit", checked=False)
        self.memDB.reset_edit()
        self.record_service = None
        self._ribbon.toggleEditButtons(False)


    def getRecordService(self):
        return self.record_service



    def createService(self, conn_dict=""):
        """

        :param conn_dict:
            Provides the ability to send in your own conn_dict instead
            of relying on reading one in from connection.config
        :return:
        """

        series_service = self.service_manager.get_series_service(conn_dict=conn_dict)
        return series_service

    def getServiceManager(self):
        return self.service_manager

    def toggleConsoleTools(self):
        self.txtPythonConsole.ToggleTools()

    def onExecuteScript(self, value):
        for i in ('red', 'blue', 'green', 'magenta', 'gold', 'cyan', 'brown', 'lime', 'purple', 'navy'):
            self.txtPythonScript('This is a test\n', i)

    def loadDockingSettings(self):
        # test if there is a perspective to load
        try:
            # TODO Fix resource_path to appdirs
            os.path.join(user_config_dir("ODMTools", "UCHIC"), 'ODMTools.config')
            f = open(os.path.join(user_config_dir("ODMTools", "UCHIC"), 'ODMTools.config'), 'r')
        except:
            # Create the file if it doesn't exist
            open(os.path.join(user_config_dir("ODMTools", "UCHIC"), 'ODMTools.config'), 'w').close()
            f = open(os.path.join(user_config_dir("ODMTools", "UCHIC"), 'ODMTools.config'), 'r')

        self._mgr.LoadPerspective(f.read(), True)

    def onClose(self, event):
        """
            Closes ODMTools Python
            Closes AUI Manager then closes MainWindow
        """

        #check to see if a script has been created
        if self.scriptcreate:
            msg = wx.MessageDialog(None, 'Would you like to save your editing script?',
                                   'Save Script', wx.YES_NO | wx.ICON_QUESTION)
            value = msg.ShowModal()
            if value == wx.ID_YES:
                self.txtPythonScript.OnSaveAs(event)

        # deinitialize the frame manager
        self.pnlPlot.Close()
        try:
            f = open(os.path.join(user_config_dir("ODMTools", "UCHIC"), 'ODMTools.config'), 'w')
            f.write(self._mgr.SavePerspective())
        except:
            print "error saving docking data"
        self._mgr.UnInit()

        
        # Shut down processes running in background
        if self.taskserver.numprocesses > 0 and self.taskserver.anyAlive:
            busy = wx.BusyInfo("Closing ODMTools ...", parent=self)

            # Terminate the processes
            self.taskserver.processTerminate()

        # IMPORTANT! if wx.TaskBarIcons exist, it will keep mainloop running

        windowsRemaining = len(wx.GetTopLevelWindows())
        if windowsRemaining > 0:
            import wx.lib.agw.aui.framemanager as aui
            # logger.debug("Windows left to close: %d" % windowsRemaining)
            for item in wx.GetTopLevelWindows():
                # logger.debug("Windows %s" % item)
                if not isinstance(item, self.__class__):
                    if isinstance(item, aui.AuiFloatingFrame):
                        item.Destroy()
                    elif isinstance(item, aui.AuiSingleDockingGuide):
                        item.Destroy()
                    elif isinstance(item, aui.AuiDockingHintWindow):
                        item.Destroy()
                    elif isinstance(item, wx.Dialog):
                        item.Destroy()
                    item.Close()
        logger.info("Closing ODMTools\n")
        self.Destroy()

        wx.GetApp().ExitMainLoop()

    def _postStartup(self):
        """
            Called after MainLoop is initialized
                Hides Python Console Tools
        """
        if self.txtPythonConsole.ToolsShown():
            self.txtPythonConsole.ToggleTools()
        self.txtPythonConsole.shell.run("import datetime", prompt=False, verbose=False)
        self.txtPythonConsole.shell.run("edit_service = app.TopWindow.record_service", prompt=False, verbose=False)
Пример #11
0
class ClsSeriesSelector(wx.Panel):
    def __init__(self, parent, dbservice):

        self.parent = parent
        wx.Panel.__init__(self,
                          name=u'pnlSeriesSelector',
                          parent=parent,
                          size=wx.Size(935, 270),
                          style=wx.TAB_TRAVERSAL)
        self._init_ctrls()
        self.series_service = dbservice
        self.initTableSeries()
        self.initSVBoxes()
        # Subscribe functions
        self.initPubSub()
        self.service_manager = ServiceManager()
        self.export_service = self.service_manager.get_export_service()
        self.selectedIndex = 0
        self.isEditing = False

    ## Radio Sizer
    ##    def _init_coll_boxSizer5_Items(self, parent):
    ##        # generated method, don't edit
    ##
    ##        parent.AddWindow(self.rbAll, 0, border=1, flag=wx.ALL)
    ##        parent.AddWindow(self.rbSimple, 0, border=1, flag=wx.ALL)
    ##        parent.AddWindow(self.rbAdvanced, 0, border=1, flag=wx.ALL)

    ## Splitter Sizer
    def _init_coll_boxSizer3_Items(self, parent):
        # generated method, don't edit
        parent.AddWindow(self.cpnlSimple,
                         0,
                         flag=wx.RIGHT | wx.LEFT | wx.EXPAND)
        parent.AddWindow(self.tblSeries, 100, flag=wx.EXPAND)

    ## Panel Sizer
    def _init_coll_boxSizer1_Items(self, parent):
        # generated method, don't edit
        parent.AddSizer(self.pnlRadio,
                        0,
                        border=7,
                        flag=wx.LEFT | wx.RIGHT | wx.TOP)
        parent.AddWindow(self.pnlData,
                         100,
                         border=3,
                         flag=wx.LEFT | wx.RIGHT | wx.EXPAND)

    ## Site Sizer
    def _init_coll_boxSizer4_Items(self, parent):
        # generated method, don't edit
        parent.AddWindow(self.checkSite, 0, border=3, flag=wx.LEFT | wx.RIGHT)
        parent.AddWindow(self.lblSite, 0, border=3, flag=wx.LEFT | wx.RIGHT)
        parent.AddWindow(self.cbSites,
                         90,
                         border=3,
                         flag=wx.LEFT | wx.RIGHT | wx.EXPAND)

    ## Variable Sizer
    def _init_coll_boxSizer2_Items(self, parent):
        # generated method, don't edit
        parent.AddWindow(self.checkVariable,
                         0,
                         border=3,
                         flag=wx.LEFT | wx.RIGHT)
        parent.AddWindow(self.lblVariable,
                         0,
                         border=3,
                         flag=wx.LEFT | wx.RIGHT)
        parent.AddWindow(self.cbVariables,
                         90,
                         border=3,
                         flag=wx.LEFT | wx.RIGHT | wx.EXPAND)

    ##  Simple Filter Sizer
    def _init_coll_boxSizer6_Items(self, parent):
        parent.AddWindow(self.pnlSite, 50, flag=wx.EXPAND)
        parent.AddWindow(self.pnlVar, 50, flag=wx.EXPAND)
        # parent.AddSizer(self.boxSizer4, 0, border=5, flag=wx.EXPAND)
        # parent.AddSizer(self.boxSizer2, 0, border=5, flag=wx.EXPAND)

    def _init_sizers(self):
        # generated method, don't edit
        self.boxSizer1 = wx.BoxSizer(orient=wx.VERTICAL)
        self.boxSizer2 = wx.BoxSizer(orient=wx.HORIZONTAL)
        self.boxSizer3 = wx.BoxSizer(orient=wx.VERTICAL)
        self.boxSizer4 = wx.BoxSizer(orient=wx.HORIZONTAL)
        ##        self.boxSizer5 = wx.BoxSizer(orient=wx.HORIZONTAL)
        self.boxSizer6 = wx.BoxSizer(orient=wx.VERTICAL)

        self._init_coll_boxSizer1_Items(self.boxSizer1)
        self._init_coll_boxSizer2_Items(self.boxSizer2)
        self._init_coll_boxSizer3_Items(self.boxSizer3)
        self._init_coll_boxSizer4_Items(self.boxSizer4)
        ##        self._init_coll_boxSizer5_Items(self.boxSizer5)
        self._init_coll_boxSizer6_Items(self.boxSizer6)

        self.SetSizer(self.boxSizer1)
        ##        self.pnlRadio.SetSizer(self.boxSizer5)
        ##        self.pnlSite.SetSizer(self.boxSizer4)
        ##        self.pnlVar.SetSizer(self.boxSizer2)
        self.cpnlSimple.SetSizer(self.boxSizer6)
        self.pnlData.SetSizer(self.boxSizer3)
        # self.pnlRadio.SetSizer(self.boxSizer5)

    def _init_ctrls(self):
        # generated method, don't edit

        self.SetClientSize(wx.Size(919, 232))
        self.Enable(True)

        ## Radio panel
        self.pnlRadio = wx.Panel(id=wxID_PNLRADIO,
                                 name='pnlRadio',
                                 parent=self,
                                 pos=wx.Point(3, 3),
                                 size=wx.Size(919, 20),
                                 style=wx.TAB_TRAVERSAL)

        self.rbAll = wx.RadioButton(id=wxID_FRAME1RBALL,
                                    label=u'All',
                                    name=u'rbAll',
                                    parent=self.pnlRadio,
                                    pos=wx.Point(0, 0),
                                    size=wx.Size(81, 20),
                                    style=0)

        self.rbSimple = wx.RadioButton(id=wxID_FRAME1RBSIMPLE,
                                       label=u'Simple Filter',
                                       name=u'rbSimple',
                                       parent=self.pnlRadio,
                                       pos=wx.Point(81, 0),
                                       size=wx.Size(112, 20),
                                       style=0)

        self.rbAdvanced = wx.RadioButton(id=wxID_FRAME1RBADVANCED,
                                         label=u'Advanced Filter',
                                         name=u'rbAdvanced',
                                         parent=self.pnlRadio,
                                         pos=wx.Point(193, 0),
                                         size=wx.Size(104, 20),
                                         style=0)

        self.rbAll.SetValue(True)

        self.rbAdvanced.Enable(False)

        ## Splitter panel
        self.pnlData = wx.Panel(id=wxID_PNLSPLITTER,
                                name='pnlData',
                                parent=self,
                                pos=wx.Point(0, -10),
                                size=wx.Size(900, 349),
                                style=wx.TAB_TRAVERSAL)

        self.cpnlSimple = wx.CollapsiblePane(self.pnlData,
                                             label="",
                                             style=wx.CP_DEFAULT_STYLE
                                             | wx.CP_NO_TLW_RESIZE)

        ## Site Panel
        self.pnlSite = wx.Panel(id=wxID_PNLSERIESSELECTORPANEL1,
                                name='pnlSite',
                                parent=self.cpnlSimple.GetPane(),
                                pos=wx.Point(3, 0),
                                size=wx.Size(800, 25),
                                style=wx.TAB_TRAVERSAL)

        self.cbSites = wx.ComboBox(choices=[],
                                   id=wxID_PNLSERIESSELECTORCBSITES,
                                   name=u'cbSites',
                                   parent=self.pnlSite,
                                   pos=wx.Point(100, 0),
                                   size=wx.Size(700, 23),
                                   style=wx.CB_READONLY,
                                   value=u'')

        self.checkSite = wx.CheckBox(id=wxID_PNLSERIESSELECTORCHECKSITE,
                                     label=u'',
                                     name=u'checkSite',
                                     parent=self.pnlSite,
                                     pos=wx.Point(3, 0),
                                     size=wx.Size(21, 21),
                                     style=0)

        self.lblSite = wx.StaticText(id=wxID_PNLSERIESSELECTORLBLSITE,
                                     label=u'Site',
                                     name=u'lblSite',
                                     parent=self.pnlSite,
                                     pos=wx.Point(30, 0),
                                     size=wx.Size(60, 21),
                                     style=0)
        self.lblSite.SetToolTipString(u'staticText1')

        self.cbSites.SetLabel(u'')
        #self.checkSite.SetValue(False)

        ### Variable Panel
        self.pnlVar = wx.Panel(id=wxID_PNLSERIESSELECTORPANEL2,
                               name='pnlVar',
                               parent=self.cpnlSimple.GetPane(),
                               pos=wx.Point(3, 26),
                               size=wx.Size(800, 25),
                               style=wx.TAB_TRAVERSAL)

        self.lblVariable = wx.StaticText(id=wxID_PNLSERIESSELECTORLBLVARIABLE,
                                         label=u'Variable',
                                         name=u'lblVariable',
                                         parent=self.pnlVar,
                                         pos=wx.Point(30, 0),
                                         size=wx.Size(60, 21),
                                         style=0)

        self.checkVariable = wx.CheckBox(
            id=wxID_PNLSERIESSELECTORCHECKVARIABLE,
            label=u'',
            name=u'checkVariable',
            parent=self.pnlVar,
            pos=wx.Point(3, 0),
            size=wx.Size(21, 21),
            style=0)

        self.cbVariables = wx.ComboBox(choices=[],
                                       id=wxID_PNLSERIESSELECTORCBVARIABLES,
                                       name=u'cbVariables',
                                       parent=self.pnlVar,
                                       pos=wx.Point(100, 0),
                                       size=wx.Size(700, 25),
                                       style=wx.CB_READONLY,
                                       value='comboBox4')
        self.cbVariables.SetLabel(u'')
        self.cbVariables.Enable(False)

        #wx.EVT_RADIOBUTTON(self, self.rbAll.Id, self.onRbAllRadiobutton)
        self.rbAll.Bind(wx.EVT_RADIOBUTTON,
                        self.onRbAllRadiobutton,
                        id=wxID_FRAME1RBALL)
        self.rbSimple.Bind(wx.EVT_RADIOBUTTON,
                           self.onRbSimpleRadiobutton,
                           id=wxID_FRAME1RBSIMPLE)
        self.rbAdvanced.Bind(wx.EVT_RADIOBUTTON,
                             self.onRbAdvancedRadiobutton,
                             id=wxID_FRAME1RBADVANCED)

        self.Bind(wx.EVT_COLLAPSIBLEPANE_CHANGED, self.onPaneChanged,
                  self.cpnlSimple)
        self.checkSite.Bind(wx.EVT_CHECKBOX,
                            self.onCheck,
                            id=wxID_PNLSERIESSELECTORCHECKSITE)
        self.checkVariable.Bind(wx.EVT_CHECKBOX,
                                self.onCheck,
                                id=wxID_PNLSERIESSELECTORCHECKVARIABLE)
        self.cbSites.Bind(wx.EVT_COMBOBOX,
                          self.onCbSitesCombobox,
                          id=wxID_PNLSERIESSELECTORCBSITES)
        self.cbVariables.Bind(wx.EVT_COMBOBOX,
                              self.onCbVariablesCombobox,
                              id=wxID_PNLSERIESSELECTORCBVARIABLES)

        ### New Stuff ##################################################################################################

        self.tblSeries = olvSeriesSelector.clsSeriesTable(
            id=wxID_PNLSERIESSELECTORtableSeries,
            parent=self.pnlData,
            name=u'tblSeries',
            size=wx.Size(950, 108),
            pos=wx.Point(5, 5),
            style=wx.LC_REPORT | wx.LC_SINGLE_SEL | wx.LC_VIRTUAL)

        self.tblSeries.SetEmptyListMsg("No Database Loaded")

        #self.tblSeries.rowFormatter = self._rowFormatter
        self.tblSeries.Bind(EVT_OVL_CHECK_EVENT, self.onReadyToPlot)
        self.tblSeries.Bind(wx.EVT_LIST_ITEM_FOCUSED, self.getSelectedObject)
        self.tblSeries.Bind(wx.EVT_LIST_ITEM_RIGHT_CLICK,
                            self.OnTableRightDown,
                            id=wxID_PNLSERIESSELECTORtableSeries)
        self.tblSeries.handleStandardKeys = True
        self.tblSeries.useAlternateBackColors = True
        #self.tblSeries.oddRowsBackColor = wx.Colour(143, 188, 188)
        self.tblSeries.oddRowsBackColor = wx.Colour(191, 217, 217)
        self.cpnlSimple.Collapse(True)
        self._init_sizers()

    ## Virtual Event Handlers
    def onReadyToPlot(self, event):
        event.Skip()

    def onReadyToEdit(self, event):
        event.Skip()

    def stopEdit(self):
        pass

    def getSelectedObject(self, event):
        event.Skip()

    def resetDB(self, dbservice):
        pass

    def initTableSeries(self):
        pass

    def refreshTableSeries(self, db):
        pass

    def refreshSeries(self):
        pass

    def initSVBoxes(self):
        pass

    def initPubSub(self):
        pass

    def OnTableRightDown(self, event):
        event.Skip()

    def onPaneChanged(self, event=None):
        pass

    def onRbAdvancedRadiobutton(self, event):
        event.Skip()

    def onRbAllRadiobutton(self, event):
        event.Skip()

    def onRbSimpleRadiobutton(self, event):
        event.Skip()

    def onRightPlot(self, event):
        event.Skip()

    def onRightEdit(self, event):
        event.Skip()

    def onRightRefresh(self, event):
        event.Skip()

    def onRightClearSelected(self, event):
        event.Skip()

    def onRightExData(self, event):
        event.Skip()

    def onRightExMeta(self, event):
        event.Skip()

    def onCbSitesCombobox(self, event):
        event.Skip()

    def onCbVariablesCombobox(self, event):
        event.Skip()

    def siteAndVariables(self):
        pass

    def siteOnly(self):
        pass

    def variableOnly(self):
        pass

    def onCheck(self, event):
        event.Skip()

    def setFilter(self, site_code='', var_code='', advfilter=''):
        pass

    def isEditing(self):
        return self.isEditing

    def _rowFormatter(self, listItem, object):
        pass
Пример #12
0
class frmODMToolsMain(wx.Frame):
    """

    """

    def __init__(self, **kwargs):
        """

        """

        self.taskserver = kwargs.pop('taskServer')
        self.memDB = kwargs.pop('memdb')

        # Determine the optimal size of the screen resolution
        size = self._obtainScreenResolution()
        kwargs['size'] = size

        wx.Frame.__init__(self, **kwargs)

        self.service_manager = ServiceManager()
        self.record_service = None

        series_service = self._init_database()
        if series_service:
            self._init_ctrls(series_service)
            self._init_aui_manager()
            self._init_sizers()
            self._ribbon.Realize()
            self.Refresh()
            logger.debug("System starting ...")
        else:
            logger.debug("System shutting down... ")
            sys.exit(0)


    def _obtainScreenResolution(self):
        """ Calculates the size of ODMTools. Prevents ODMTools being larger than the available screen size
            typically a problem on laptops

        :return wx.Size:
        """

        defaultSize = wx.Size(850, 800)
        defaultHeight, defaultWidth = defaultSize
        screenHeight, screenWidth = wx.GetDisplaySize()
        minimumAllowedSize = wx.Size(640, 480)

        '''
        if minimumAllowedSize >= wx.GetDisplaySize():
            logger.fatal("ODMTools cannot be displayed in this resolution: %s \n\tPlease use a larger resolution"
                         % wx.GetDisplaySize())
            print "minimumAllowedsize: ", minimumAllowedSize, "display: ", wx.GetDisplaySize()
            sys.exit(0)
        '''

        newSize = defaultSize
        ## Screen size is greater than ODMTools' default size
        if screenHeight > defaultHeight and screenWidth > defaultWidth:
            pass
        ## Screen size is smaller than ODMTools' default size
        elif screenHeight < defaultHeight and screenWidth < defaultWidth:
            newSize = wx.Size(screenHeight / 1.5, screenWidth / 1.5)
        elif screenHeight < defaultHeight:
            newSize = wx.Size(screenHeight / 1.5, defaultWidth)
        elif screenWidth < defaultWidth:
            newSize = wx.Size(defaultHeight, screenWidth / 1.5)

        logger.debug("ODMTools Window Size: %s" % newSize)
        return newSize


    #############Entire Form Sizers##########

    def _init_sizers(self):
        # generated method, don't edit
        self.s = wx.BoxSizer(wx.VERTICAL)
        self._init_s_Items(self.s)
        self.SetSizer(self.s)

    def _init_s_Items(self, parent):
        # generated method, don't edit
        parent.AddWindow(self._ribbon, 0, wx.EXPAND)
        parent.AddWindow(self.pnlDocking, 85, flag=wx.ALL | wx.EXPAND)

    def _init_database(self, quit_if_cancel=True):
        logger.debug("Loading Database...")



        while True:
            ## Database connection is valid, therefore proceed through the rest of the program
            if self.service_manager.is_valid_connection():
                conn_dict = None

                series_service = self.createService()
                conn_dict = self.service_manager.get_current_conn_dict()

                if self.servicesValid(series_service):
                    self.service_manager.add_connection(conn_dict)
                    break

            db_config = frmDBConfig.frmDBConfig(None, self.service_manager, False)
            value = db_config.ShowModal()
            if value == wx.ID_CANCEL and quit_if_cancel:
                logger.fatal("ODMTools is now closing because there is no database connection.")
                sys.exit(0)
            elif not quit_if_cancel:
                return series_service

            newConnection = db_config.panel.getFieldValues()
            self.service_manager.set_current_conn_dict(newConnection)
            db_config.Destroy()

        conn_dict = self.service_manager.get_current_conn_dict()
        msg = '%s://%s@%s/%s' % (
            conn_dict['engine'], conn_dict['user'], conn_dict['address'], conn_dict['db']
        )
        logger.debug("...Connected to '%s'" % msg)

        return series_service

    def onChangeDBConn(self, event):
        db_config = frmDBConfig.frmDBConfig(None, self.service_manager, False)
        value = db_config.ShowModal()
        if value == wx.ID_CANCEL:
            return

        newConnection = db_config.panel.getFieldValues()
        self.service_manager.set_current_conn_dict(newConnection)
        db_config.Destroy()

        if self._init_database(quit_if_cancel=False):
            # if editing, stop editing...
            if self._ribbon.getEditStatus():
                self.stopEdit(event=None)

        if value == wx.ID_OK:

            series_service = self.createService(newConnection)
            self.pnlSelector.resetDB(series_service)
            self.refreshConnectionInfo()
            self.pnlPlot.clear()
            self.dataTable.clear()


    def servicesValid(self, service, displayMsg=True):
        """

        :param displayMsg:
            Option to display a message box if there is an issue with a service. Default: True
        :return:
        """
        valid = True

        ## Test if Series Catalog is empty
        if not service.get_used_sites():
            if displayMsg:
                msg = wx.MessageDialog(None, 'Series Catalog cannot be empty. Please enter in a new database connection',
                                           'Series Catalog is empty', wx.OK | wx.ICON_ERROR )
                msg.ShowModal()
            valid = False

        # @TODO If Jeff runs into other issues with services not being available, we can simply test different services here
        #if not service.get_all_variables():
        #    valid = False

        return valid

    def on_about_request(self, event):
        frmAbout(self)

    def MacReopenApp(self):
        """Called when the doc icon is clicked, and ???"""

        try: # it's possible for this event to come when the frame is closed
            self.GetTopWindow().Raise()
        except:
            pass

    ###################### Frame ################

    def _init_ctrls(self, series_service):
        # generated method, don't edit
        logger.debug("Loading frame...")

        self.SetIcon(gtk_execute.getIcon())

        self.SetFont(wx.Font(9, wx.SWISS, wx.NORMAL, wx.NORMAL,
                             False, u'Tahoma'))

        ############### Ribbon ###################
        logger.debug("Loading Ribbon Menu...")
        self._ribbon = mnuRibbon.mnuRibbon(parent=self, id=wx.ID_ANY, name='ribbon')

        if sys.platform == 'darwin':
            self.menu_bar = wx.MenuBar()
            self.help_menu = wx.Menu()

            self.help_menu.Append(wx.ID_ABOUT, "&About ODMTools")
            self.menu_bar.Append(self.help_menu, "&Help")

            self.SetMenuBar(self.menu_bar)
            self.Bind(wx.EVT_MENU, self.on_about_request, id=wx.ID_ABOUT)

            # self.menu_bar.SetAutoWindowMenu()

        ################ Docking Tools##############
        self.pnlDocking = wx.Panel(name='pnlDocking',
                                   parent=self, size=wx.Size(605, 458),
                                   style=wx.TAB_TRAVERSAL)

        ############# Graph ###############
        logger.debug("Loading Plot ...")
        self.pnlPlot = pnlPlot.pnlPlot(self.pnlDocking, self.taskserver)

        ################ Series Selection Panel ##################
        logger.debug("Loading Series Selector ...")


        self.pnlSelector = FrmSeriesSelector(self.pnlDocking, series_service, plot=self.pnlPlot, taskserver=self.taskserver, memdb = self.memDB)


        ####################grid Table View##################
        logger.debug("Loading DataTable ...")
        self.dataTable = FrmDataTable(self.pnlDocking)
        # self.dataTable = pnlDataTable.pnlDataTable(self.pnlDocking)
        # self.dataTable.toggleBindings()
        ############# Script & Console ###############
        logger.debug("Loading Python Console ...")
        self.txtPythonConsole = ODMToolsConsole(parent=self.pnlDocking, size=wx.Size(200, 200))
        wx.CallAfter(self._postStartup)



        logger.debug("Loading Python Script ...")
        self.txtPythonScript = pnlScript(name=u'txtPython', parent=self,
                                     size=wx.Size(200, 200))

        self.Bind(wx.EVT_CLOSE, self.onClose)


        Publisher.subscribe(self.onDocking, ("adjust.Docking"))
        Publisher.subscribe(self.onPlotSelection, ("select.Plot"))
        Publisher.subscribe(self.onExecuteScript, ("execute.script"))
        Publisher.subscribe(self.onChangeDBConn, ("change.dbConfig"))
        Publisher.subscribe(self.onSetScriptTitle, ("script.title"))
        #.subscribe(self.onSetScriptTitle, ("script.title"))
        Publisher.subscribe(self.onClose, ("onClose"))
        Publisher.subscribe(self.addEdit, ("selectEdit"))
        Publisher.subscribe(self.stopEdit, ("stopEdit"))

    def _init_aui_manager(self):

        ############ Docking ###################
        logger.debug("Loading AuiManager ...")
        self._mgr = aui.AuiManager()
        self._mgr.SetManagedWindow(self.pnlDocking)

        self._mgr.AddPane(self.pnlPlot, aui.AuiPaneInfo().CenterPane()
                          .Name("Plot").Caption("Plot").MaximizeButton(True).DestroyOnClose(False)

        )

        self._mgr.AddPane(self.dataTable, aui.AuiPaneInfo().Right().Name("Table").
                          Show(show=False).Caption('Table View').MinSize(wx.Size(200, 200)).Floatable().Movable().
                          Position(1).MinimizeButton(True).MaximizeButton(True).DestroyOnClose(False)

        )

        self._mgr.AddPane(self.pnlSelector, aui.AuiPaneInfo().Bottom().Name("Selector").MinSize(wx.Size(50, 200)).
                          Movable().Floatable().Position(0).MinimizeButton(True).MaximizeButton(True).CloseButton(True)
                          .DestroyOnClose(False)
        )

        self._mgr.AddPane(self.txtPythonScript, aui.AuiPaneInfo().Caption('Script').
                          Name("Script").Movable().Floatable().Right()
                          .MinimizeButton(True).MaximizeButton(True).FloatingSize(size=(400, 400))
                          .CloseButton(True).Float().FloatingPosition(pos=(self.Position))
                          .Hide().CloseButton(True).DestroyOnClose(False)
        )

        self._mgr.AddPane(self.txtPythonConsole, aui.AuiPaneInfo().Caption('Python Console').
                          Name("Console").FloatingSize(size=(300, 400)).MinimizeButton(
            True).Movable().Floatable().MaximizeButton(True).CloseButton(True).Float()
                          .FloatingPosition(pos=(self.Position)).Show(show=False).DestroyOnClose(False)
        )


        ## TODO Fix loadingDockingSettings as it doesn't load it correctly.
        # self.loadDockingSettings()

        self.refreshConnectionInfo()
        self._mgr.Update()

    def refreshConnectionInfo(self):
        """Updates the Series Selector Connection Information for the user"""

        conn_dict = self.service_manager.get_current_conn_dict()

        msg = 'Series: %s://%s@%s/%s' % (
            conn_dict['engine'], conn_dict['user'], conn_dict['address'], conn_dict['db']
        )

        self._mgr.GetPane('Selector').Caption(msg)
        self._mgr.RefreshCaptions()

    def onDocking(self, value):
        paneDetails = self._mgr.GetPane(self.pnlPlot)

        if value == "Table":
            paneDetails = self._mgr.GetPane(self.dataTable)
            # self.dataTable.toggleBindings()

        elif value == "Selector":
            paneDetails = self._mgr.GetPane(self.pnlSelector)

        elif value == "Script":
            paneDetails = self._mgr.GetPane(self.txtPythonScript)

        elif value == "Console":
            paneDetails = self._mgr.GetPane(self.txtPythonConsole)
            self.txtPythonConsole.crust.OnSashDClick(event=None)

        if paneDetails.IsNotebookPage() or paneDetails.dock_direction == 0:
            paneDetails.FloatingPosition(pos=self.Position)
            paneDetails.Float()

        if paneDetails.IsShown():
            paneDetails.Show(show=False)
        else:
            paneDetails.Show(show=True)
        self._mgr.Update()

    def getDBService(self):
        return self.service_manager

    def onPlotSelection(self, value):
        self.pnlPlot.selectPlot(value)


    def onSetScriptTitle(self, title):
        scriptPane = self._mgr.GetPane(self.txtPythonScript)
        scriptPane.Caption(title)
        if scriptPane.IsFloating():
            scriptPane.Restore()
        self._mgr.Update()

    def addEdit(self, event):

        with wx.BusyInfo("Please wait for a moment while ODMTools fetches the data and stores it in our database", parent=self):
            logger.debug("Beginning editing")
            isSelected, seriesID = self.pnlSelector.onReadyToEdit()

            # logger.debug("Initializing DataTable")
            # # tasks = [("dataTable", (memDB.conn, self.dataTable.myOlv))]
            # tasks = [("dataTable", (self.dataTable.myOlv))]
            # self.taskserver.setTasks(tasks)
            # self.taskserver.processTasks()

            if isSelected:
                self.record_service = self.service_manager.get_record_service(self.txtPythonScript, seriesID,
                                                                              connection=self.memDB)
                self._ribbon.toggleEditButtons(True)

                logger.debug("Initializing Plot")
                self.pnlPlot.addEditPlot(self.memDB, seriesID, self.record_service)

                logger.debug("Initializing DataTable")
                self.dataTable.init(self.memDB)

                # set record service for console
                Publisher.sendMessage("setEdit", isEdit=True)
                logger.debug("Enabling Edit")
                self.record_service.toggle_record(True)

                # set the cursor for matplotlib
                selectedObject = self.record_service.get_series()
                Publisher.sendMessage("updateCursor", selectedObject=selectedObject)

            else:
                logger.debug("disabling Edit")
                Publisher.sendMessage("setEdit", isEdit=False)

                self.record_service.toggle_record(False)

                # disable cursor for matplotlib
                selectedObject = self.record_service.get_series()
                Publisher.sendMessage("updateCursor", deselectedObject=selectedObject)


            # self._mgr.Update()

            logger.debug("Recording? %s" % self.record_service._record)


            #self.record_service = None
            self.txtPythonConsole.shell.run("edit_service = app.TopWindow.record_service", prompt=False, verbose=False)
            self.txtPythonConsole.shell.run("series_service = edit_service.get_series_service()", prompt=False,
                                            verbose=False)

            #from meliae import scanner
            #scanner.dump_all_objects("edit_plotting.dat")
            logger.info("Finished Setting up Editing Series: %s " % seriesID)


    def stopEdit(self, event):

        self.pnlSelector.stopEdit()
        self.dataTable.stopEdit()
        self.pnlPlot.stopEdit()
        Publisher.sendMessage("toggleEdit", checked=False)
        self.record_service = None
        self._ribbon.toggleEditButtons(False)


    def getRecordService(self):
        return self.record_service



    def createService(self, conn_dict=""):
        """

        :param conn_dict:
            Provides the ability to send in your own conn_dict instead
            of relying on reading one in from connection.config
        :return:
        """

        series_service = self.service_manager.get_series_service(conn_dict=conn_dict)
        return series_service

    def getServiceManager(self):
        return self.service_manager

    def toggleConsoleTools(self):
        self.txtPythonConsole.ToggleTools()

    def onExecuteScript(self, value):
        for i in ('red', 'blue', 'green', 'magenta', 'gold', 'cyan', 'brown', 'lime', 'purple', 'navy'):
            self.txtPythonScript('This is a test\n', i)

    def loadDockingSettings(self):
        # test if there is a perspective to load
        try:
            # TODO Fix resource_path to appdirs
            os.path.join(user_config_dir("ODMTools", "UCHIC"), 'ODMTools.config')
            f = open(os.path.join(user_config_dir("ODMTools", "UCHIC"), 'ODMTools.config'), 'r')
        except:
            # Create the file if it doesn't exist
            open(os.path.join(user_config_dir("ODMTools", "UCHIC"), 'ODMTools.config'), 'w').close()
            f = open(os.path.join(user_config_dir("ODMTools", "UCHIC"), 'ODMTools.config'), 'r')

        self._mgr.LoadPerspective(f.read(), True)

    def onClose(self, event):
        """
            Closes ODMTools Python
            Closes AUI Manager then closes MainWindow
        """
        # deinitialize the frame manager
        self.pnlPlot.Close()
        try:
            f = open(os.path.join(user_config_dir("ODMTools", "UCHIC"), 'ODMTools.config'), 'w')
            f.write(self._mgr.SavePerspective())
        except:
            print "error saving docking data"
        self._mgr.UnInit()

        
        # Shut down processes running in background
        if self.taskserver.numprocesses > 0 and self.taskserver.anyAlive:
            busy = wx.BusyInfo("Closing ODMTools ...", parent=self)

            # Terminate the processes
            self.taskserver.processTerminate()

        # IMPORTANT! if wx.TaskBarIcons exist, it will keep mainloop running

        windowsRemaining = len(wx.GetTopLevelWindows())
        if windowsRemaining > 0:
            import wx.lib.agw.aui.framemanager as aui
            # logger.debug("Windows left to close: %d" % windowsRemaining)
            for item in wx.GetTopLevelWindows():
                # logger.debug("Windows %s" % item)
                if not isinstance(item, self.__class__):
                    if isinstance(item, aui.AuiFloatingFrame):
                        item.Destroy()
                    elif isinstance(item, aui.AuiSingleDockingGuide):
                        item.Destroy()
                    elif isinstance(item, aui.AuiDockingHintWindow):
                        item.Destroy()
                    elif isinstance(item, wx.Dialog):
                        item.Destroy()
                    item.Close()
        self.Destroy()

        wx.GetApp().ExitMainLoop()

    def _postStartup(self):
        """
            Called after MainLoop is initialized
                Hides Python Console Tools
        """
        if self.txtPythonConsole.ToolsShown():
            self.txtPythonConsole.ToggleTools()
        self.txtPythonConsole.shell.run("import datetime", prompt=False, verbose=False)
        self.txtPythonConsole.shell.run("edit_service = app.TopWindow.record_service", prompt=False, verbose=False)