[Bio] / PyGUI / Catalogpanel.py Repository:
ViewVC logotype

View of /PyGUI/Catalogpanel.py

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1.33 - (download) (as text) (annotate)
Fri Jul 9 19:08:13 2004 UTC (15 years, 5 months ago) by efrank
Branch: MAIN
Changes since 1.32: +9 -7 lines
Had a loop between catalogpanel putting a factory into the catalog
in loadCatalog() and the callback handler in MainLayout for added factories
trying to call into loadCatalog().

got rid of the adding of factories in loadCatalog().

now factory is added in very topmost level (ModelEditor).  the callback
chain/observer takes care of the rest.

from wxPython.wx             import *
from FaST.BssFactory         import BssFactory
from FaST.BssFactoryProxy    import BssFactoryProxy
from FaST.WitFactory         import WitFactory
from FaST.SeedDataFactory    import SeedDataFactory
from FaST.SeedDataFactory    import SeedOrganism
from KahOM.RecoElem           import RecoElem
from PyGUI.RecoElempanel           import RecoElempanel
from CatalogServices.Catalog import Catalog


class Catalogpanel:
    #------------------------------------------------------------------------
    def __init__(self, parent):
    #------------------------------------------------------------------------
        self.parent            = parent

        self.to_re    = parent.re 
        self.selected = None       #remember last selected catalog entry
                                   #..is used when LOAD button is hit.

        # seedItemId is the wxPython id for the "Seed" node
        # in the catalog tree under which all specific Seed servers
        # are listed

        self.seedItemId        = None

        self.initCatEvents()
        self.initCatData()


        # setup catalog editing menu (right click)

        self.catEditMenu         = wxMenu()
        self.catEditMkItemId     = wxNewId()
        self.catEditMkDirId      = wxNewId()
        self.setupCatEditMenu()

        return

    
    #------------------------------------------------------------------------
    def initCatEvents(self):
    #------------------------------------------------------------------------

        EVT_TREE_SEL_CHANGED(self.parent.catalog_tree,
                             self.parent.catalog_treeId,
                             self.onLeftClick)

        # Right click on List item for Seed will let you connect to
        # another Seed server

        EVT_RIGHT_DOWN(self.parent.catalog_tree, self.onRightClickCatalogTree)

                
        EVT_LEFT_DCLICK (self.parent.catalog_tree, self.onLeftDClick)

        EVT_COMBOBOX(self.parent.catVersionValueComboBox,
                     self.parent.catVersionValueComboBox.GetId(),
                     self.onCatVersionValueComboBox)

        return
        
    #------------------------------------------------------------------------
    def initCatData( self ):
    #------------------------------------------------------------------------

        self.parent.catalogRootId = self.parent.catalog_tree.AddRoot("/")
        self.loadCatalog()

        self.parent.catalog_tree.Expand( self.parent.catalogRootId)
        return

    #------------------------------------------------------------------
    def setupCatEditMenu(self):
    #------------------------------------------------------------------

        self.catEditMenu.Append( self.catEditMkDirId,
                                 "New Directory", "NewDirectory" )
        EVT_MENU(self.parent, self.catEditMkDirId, self.doCatEditMkDir)

        self.catEditMenu.Append( self.catEditMkItemId,
                                 "New Item", "NewDirectory" )
        EVT_MENU(self.parent, self.catEditMkItemId, self.doCatEditMkItem)

        return

    #------------------------------------------------------------------------
    def loadCatalog(self):
    #------------------------------------------------------------------------
        wxBeginBusyCursor()

        #localSeedServer        = "http://localhost/FIG"
        #seedFactory   = SeedDataFactory( localSeedServer )

        #b             = BssFactory()
        #theConnectionInfo = ["terra.mcs.anl.gov", 3000]
        #b             = BssFactoryProxy(theConnectionInfo)

        #try:
        #   Catalog.instance().addDataFactory( b )
        #else:
        #except:
        #    self.parent.error("LoadCatalog: no local Bss database." )
        #    wxEndBusyCursor()
        #    return

        ##
        # Handle top/root of catalog/tree specially to avoid "two root"
        # on display problem
        ##

        top = Catalog.instance().getCatalogTop()
        parentTree = self.parent.catalog_tree
        parentTree.SetPyData( self.parent.catalogRootId,
                              (self.recoElemLoader, top, self.parent.catalogRootId) )

        for e in top.entries():
            self.recurseCatalog( e, parentTree, self.parent.catalogRootId)

        parentTree.SortChildren( self.parent.catalogRootId)

        wxEndBusyCursor()

        return

    #------------------------------------------------------------------------
    def recurseCatalog( self, catEntry, parentTree, parentItemId):
    #------------------------------------------------------------------------
        """
        Create a new item under parentItemId in wxTree, parentTree.  Associate
        catEntry with it.  If catEntry has entries, recurse on them.
        """

        if ( catEntry.isTerminal() ): 
            displayedName = catEntry.name()
        else:
            displayedName = catEntry.name() + "/"

        newItemId=parentTree.AppendItem(parentItemId, displayedName )

        # associate data needed to manipulate the catEntry

        parentTree.SetPyData( newItemId,
                              (self.recoElemLoader, catEntry, newItemId ) )

        if ( not catEntry.isTerminal() ):
            for e in catEntry.entries():
                self.recurseCatalog( e, parentTree, newItemId)

        parentTree.SortChildren( newItemId )

        return

    #------------------------------------------------------------------------
    def DOOMloadSeedCatalog(self, seedServer ):
    #------------------------------------------------------------------------
        """
        This adds a Seed instance to the catalog.  It is called from the
        MainMenuBar when Data->Add Seed Instance is called, for example.
        """

        wxBeginBusyCursor()

	# The SeedDataFactory ctor is slow and actually reads a bunch of
	# data from the server

        seedFactory   = SeedDataFactory( seedServer )

        # add it to the list in the catalog
        try:
            Catalog.instance().addDataFactory( seedFactory )
        except:
            self.parent.error("loadSeedCatalog: %s already in foundry list." % seedServer)
            wxEndBusyCursor()
            return

        top = seedFactory.getCatalogTop()
        self.recurseCatalog( top, self.parent.catalog_tree, self.parent.catalogRootId)

        wxEndBusyCursor()

        return

    #------------------------------------------------------------------------
    def onLeftClick(self,treeEvent):
    #------------------------------------------------------------------------
        item = treeEvent.GetItem()
        
        catEntryTuple = self.parent.tree_ctr.GetPyData(item)
        if (catEntryTuple == None ):
            return
        self.selected = catEntryTuple
        catEntry   = catEntryTuple[1]

        ##
        # update the history information display
        ##

        theBox = self.parent.catVersionValueComboBox
        theBox.Clear()

        if ( not catEntry.isTerminal() ):
            
            self.parent.catPathValue.SetValue( catEntry.path() + "/" )
            self.parent.catVersionValueComboBox.SetLabel( "")
            self.parent.catHistoryDateValue.SetLabel( "" )
            self.parent.catHistoryUserValue.SetLabel( "" )
            self.parent.catHistoryCreatedFromValue.SetLabel( "")
            theBox.SetValue( "" )
        else:
            versions   = catEntry.versions()
            if ( [] == versions ):
                self.parent.catPathValue.SetLabel( catEntry.path()+";[None]" )
                theBox.SetValue( "None" )
            else:
                maxVersion = max( versions )
                for v in versions:
                    theBox.Append( "%s" % (v ) )
                    theBox.SetValue( "%s" % (maxVersion) )
                self.parent.catPathValue.SetLabel(catEntry.path()+";[%s]" % (maxVersion))
            #
            self.parent.catHistoryDateValue.SetLabel( "no date info yet" )
            self.parent.catHistoryUserValue.SetLabel( "no user info yet" )
            self.parent.catHistoryCreatedFromValue.SetLabel( "no history info yet" )
            
        return


    #------------------------------------------------------------------------
    def onCatVersionValueComboBox(self, event):
    #------------------------------------------------------------------------
        """
        Handles activity in combo box where user sets Verion to use
        """
                
        # get the value selected in the combo box.
        choice = event.GetString()
        self.parent.catVersionValueComboBox.SetValue( "%s" % (choice) )

        # the operation is interpreted relative to the currently selected
        # catalogEntry.  find what that is.
        
        catEntry   = self.selected[1]

        # update stuff
        #version = self.parent.catVersionValueComboBox.GetValue()
        self.parent.catPathValue.SetLabel( catEntry.path()+";[%s]" % (choice) )

        return
    
        
    #------------------------------------------------------------------------
    def onRightClickCatalogTree(self, event):
    #------------------------------------------------------------------------
        """ Fires off the pop-up menu to handle right click events. """

        event.GetEventObject().PopupMenu(self.catEditMenu, event.GetPosition())
        return

    #------------------------------------------------------------------------
    def doCatEditMkDir( self, event ):
    #------------------------------------------------------------------------
        if (None == self.selected):
            self.parent.error( "A selection is required first.")
            return
        
        catEntryTuple = self.selected
        catEntry      = catEntryTuple[1]
        treeItemId    = catEntryTuple[2]
        
        if (catEntry.isTerminal()):
            self.parent.error("Directories can not be added to items.")
            return

        prompt = "New catalog directory name:"
        dlg = wxTextEntryDialog(self.parent, message=prompt, style=wxOK)

        if ( dlg.ShowModal() == wxID_OK):
            theName = dlg.GetValue()
            if ( theName=="" ): return
            dlg.Destroy()
        else:
            #didn't get a kid name
            dlg.Destroy()
            return

        try:
            newCatEntry=catEntry.mkDir( theName )
            parentTree=self.parent.catalog_tree
            newItemId=parentTree.AppendItem(treeItemId, newCatEntry.name() )
            parentTree.SetPyData( newItemId,
                                  (self.recoElemLoader, newCatEntry, newItemId )  )

            parentTree.SortChildren( treeItemId )
        except:
            self.parent.error( "Operation refused." )
            

        return 

    #------------------------------------------------------------------------
    def doCatEditMkItem( self, event ):
    #------------------------------------------------------------------------
        if (None == self.selected):
            self.parent.error( "A selection is required first.")
            return

        catEntryTuple = self.selected
        catEntry      = catEntryTuple[1]
        treeItemId    = catEntryTuple[2]

        if (catEntry.isTerminal()):
            self.parent.error("Items can not be added to items. Add to a directory.")
            return

        prompt = "New catalog entry name:"
        dlg = wxTextEntryDialog(self.parent, message=prompt, style=wxOK)

        if ( dlg.ShowModal() == wxID_OK):
            theName = dlg.GetValue()
            if ( theName=="" ): return
            dlg.Destroy()
        else:
            #didn't get a kid name
            dlg.Destroy()
            return

        try:
            newCatEntry = catEntry.mkItem( theName )
            parentTree=self.parent.catalog_tree
            newItemId=parentTree.AppendItem(treeItemId, newCatEntry.name() )
            parentTree.SetPyData( newItemId,
                                  (self.recoElemLoader, newCatEntry, newItemId )  )

            parentTree.SortChildren( treeItemId )
        except:
            self.parent.error( "Operation refused." )
            

        return 


    #------------------------------------------------------------------------
    def onLeftDClick(self, event):
    #------------------------------------------------------------------------
        """ Double left-click means, "Load the currently selected item." """

        if ( self.selected == None ):
            self.parent.error( "You must select a catalog entry before requesting load.")
            return 

        # We store a loader to actually load the selected item.  This dates
        # back to a time before a single loader could handle all the various
        # data factory kinds.

        catEntryTuple = self.selected
        apply( catEntryTuple[0], [catEntryTuple[1]] )

        return
    
    #------------------------------------------------------------------------
    def recoElemLoader(self,  argList ):
    #------------------------------------------------------------------------
        wxBeginBusyCursor()

        (catalogEntry) = argList

        if (catalogEntry.isTerminal() ):
            ver = self.parent.catVersionValueComboBox.GetValue()
            if ( ver == "None" ):
                top = RecoElem( catalogEntry.name() )
            else:
                top = catalogEntry.read( int( ver ) )
                
            self.to_re.addRecoElemTree(self.parent.rootId, top, catalogEntry)
        else:
            # current selection is directory. can't load that!
            wxEndBusyCursor()
            return


        wxEndBusyCursor()
        return

    #------------------------------------------------------------------------
    def DOOMwitPwyLoader(self,  pwyName ):
    #------------------------------------------------------------------------
        wxBeginBusyCursor()
        w=WitFactory()
        top= w.getRxnByPwy( pwyName )
        self.to_re.addRecoElemTree(self.parent.rootId, top)
        wxEndBusyCursor()
        return

MCS Webmaster
ViewVC Help
Powered by ViewVC 1.0.3