Patent Fetcher Button

    {info} This button functions within the Markush data infrastructure. When the button is placed on an Inventions form, it will fetch all the patents associated with the selected invention. From there, it determines the master patent and offers to launch the webpage associated with the patent, or providing a combination of patent websites and patents from the invention. It also provides links to a variety of patent repositories for other countries.

    This script is a good example of using SwingBuilder and GridBagLayout to make clean input pop-ups. This button is on a query form, a dataTree with the necessary table containing the invention information as a secondary child (VMNS is a child of Query/root and Inventions is a child of VMNS). This is also a nice example for finding and using nested child tables.

    
    /** Patent Fetcher
    *
    * Usage: Button on a Query form in the Markush Demo Data set, which has the edges of VMNS and then Inventions.
    * It can be adapted to other dataTrees by locating the Inventions table among the dataTree
    *
    * @author Erin Bolstad (ebolstad@chemaxon.com)
    * Dec 2011
    */
    import java.awt.Desktop
    import com.im.commons.progress.*
    import groovy.swing.SwingBuilder
    import javax.swing.SwingUtilities
    
    evaluate = { widget ->
        if (SwingUtilities.isEventDispatchThread()) {
            Thread.start() {
                evaluateImpl(widget)
            }
        } else {
            evaluateImpl(widget)
        }
    }
    
    evaluateImpl = { widget ->
    
        def rs = widget.form.resultSet
        def dataTree = rs.getDataTree()
        def VMNSvertex = dataTree.rootVertex.edges.find { it.destination.entity.name == 'VMNS' }
        def inventionVertex = VMNSvertex.destination.edges.find { it.destination.entity.name == 'Inventions' }
        def inventionEty = inventionVertex.destination.entity
        def inventionPatentFld = inventionEty.fields.items.find { it.name == 'Patents' }
        def invenV = inventionVertex.getDestination()
        def invenVS = rs.getVertexState(invenV)
    
        def invenIds = invenVS.selectedRowsIds
        def invenFirstId = invenIds.get(0)
    
        def invenGetData = invenVS.getData([invenFirstId], DFEnvironmentRO.DEV_NULL)
        def patArray = invenGetData[invenFirstId][inventionPatentFld.id]
        def patMaster = patArray.replace("*", "master")
        def patentArray = patMaster.split("\\r?\\n")
    
        patArray = ["-"]
        patentArray.eachWithIndex { num, m ->
            def trimLocation = num.indexOf("-")
            def patentTrimmed = num.subSequence(0, trimLocation)
            patArray.add(patentTrimmed)
            if (num.contains("master")){
                MASTER_PATENT = num
            }
        }
    
        // Clean the master patent
    
        def masterRemoved = MASTER_PATENT.replace("master", "")
        def blanksRemoved = masterRemoved.replace(" ", "")
    
        MASTER_PATENT = blanksRemoved
    
        // master patent now to be matched against resource
    
        def patentToTrim = MASTER_PATENT
        def patentAssignment = MASTER_PATENT.substring(0, 2)
    
        switch (patentAssignment) {
            case "WO":
                def trimLocation = patentToTrim.indexOf("-")
                def patentTrimmed = patentToTrim.subSequence(0, trimLocation)
                LEAD = "http://www.wipo.int/patentscope/search/en/detail.jsf?docId=" + patentTrimmed
                break
    
            case "US":
                def trimLocation = patentToTrim.indexOf("-")
                def endTrimmed = patentToTrim.subSequence(0, trimLocation)
                def patentLength = endTrimmed.length()
                def patentTrimmed = endTrimmed.subSequence(2, patentLength)
                LEAD = "http://www.patentlens.net/patentlens/patents.html?patnums=US_" + patentTrimmed + "&returnTo=patentnumber.html" + patentTrimmed
                break
    
            default:
                def trimLocation = patentToTrim.indexOf("-")
                def patentTrimmed = patentToTrim.subSequence(0, trimLocation)
                LEAD = "http://worldwide.espacenet.com/searchResults?DB=EPODOC&submitted=true&locale=en_EP&ST=singleline&compact=false&DB=EPODOC&query=" + patentTrimmed
                break
        }
    
        def s = new SwingBuilder()
    
        s.setVariable('myDialog-properties',[:])
    
        def vars = s.variables
    
        patentToTrim = MASTER_PATENT
        def trimLocation = patentToTrim.indexOf("-")
        def leadButton = patentToTrim.subSequence(0, trimLocation)
    
        def dial = s.dialog(title:'Patent Selection',id:'myDialog',modal:true) {
            panel() {
                gridBagLayout()
                label (text:"Retrieve the lead patent using our best guess to the location:", constraints:gbc(
                        gridx:0,
                        gridy:0,
                        insets:[10,20,10,0]))
                button (id:'lead', label:"Lead Patent: $leadButton", constraints:gbc(
                        gridx:1,
                        gridy:0,
                        insets:[10,0,10,20],
                        anchor:LINE_START),
                        actionPerformed: {
                            vars.buttonResult = 'lead'
                            dispose()})
                label(text:"---", constraints:gbc(
                        gridy:1,
                        gridwidth:2))
                label(text:"Or, select the patent from the invention to view, and the web location", constraints:gbc(
                        gridy:2,
                        gridwidth:2,
                        insets:[10,0,0,0]))
                label(text:"Some sites only work with patents from certain countries.", constraints:gbc(
                        gridy:3,
                        gridwidth:2,
                        insets:[0,0,10,0]))
                label(text:"Select patent", constraints:gbc(
                        gridx:0,
                        gridy:4,
                        anchor:LINE_END))
                comboBox(id:'patents', items:patArray, constraints:gbc(
                        gridx:1,
                        gridy:4,
                        anchor:LINE_START))
                label(text:"Select patent repository", constraints:gbc(
                        gridx:0,
                        gridy:5,
                        insets:[0,0,10,0],
                        anchor:LINE_END))
                comboBox(id:'patentLoc', items:['-', 'EP Patent Register', 'PatentScope (WIPO)', 'PatentLens'], constraints:gbc(
                        gridx:1,
                        gridy:5,
                        insets:[0,0,10,0],
                        anchor:LINE_START))
                button(id:'search', label:"Search Patent/Location Combo", constraints:gbc(
                        gridx:0,
                        gridy:6,
                        insets:[0,0,10,0],
                        anchor:LINE_END),
                        actionPerformed: {
                            vars.buttonResult = 'search'
                            dispose()})
                button(id:'cancel', label:"Cancel", constraints:gbc(
                        gridx:1,
                        gridy:6,
                        anchor:LINE_START,
                        insets:[0,0,10,0]),
                        actionPerformed: {
                            vars.buttonResult = 'cancel'
                            dispose()})
                label(text:"---", constraints:gbc(
                        gridy:7,
                        gridwidth:2))
                label(text:"Some patent sites block external programs, or are not used often.", constraints:gbc(
                        gridy:8,
                        gridwidth:2,
                        insets:[10,0,0,0]))
                label(text:"Jump to the country specific patent websites using the menu below.", constraints:gbc(
                        gridy:9,
                        gridwidth:2,
                        insets:[0,0,10,0]))
                comboBox(id:'othersites', items:['-', 'JP: IDPL', 'CA: CIPO', 'AU: AusPat', 'KR: Korea', 'HK: PatentSearch', 'TW: Taiwan IPO', 'SG: IPOS', 'DE: DPMA', 'RU: FIPS', 'ID: IPDL'], constraints:gbc(
                        gridx:0,
                        gridy:10,
                        insets:[0,0,10,0],
                        anchor:LINE_END))
                button(id:'otherok', label:"Go To Site", constraints:gbc(
                        gridx:1,
                        gridy:10,
                        insets:[0,0,10,0],
                        anchor:LINE_START),
                        actionPerformed: {
                            vars.buttonResult = 'otherok'
                            dispose()})
    
            }
        }
    
        dial.pack()
        dial.setLocationRelativeTo(null)
        dial.show()
    
        chosenAction = vars.buttonResult
    
        switch (chosenAction) {
            case "cancel":
                return
                break
            case "lead":
                def temp = LEAD
                GOTOURL = temp
                break
            case "search":
                def patentWebsite = vars.patentLoc.selectedItem
                def patentTrimmed = vars.patents.selectedItem
    
                switch (patentWebsite) {
                    case "EP Patent Register":
                        GOTOURL = "http://worldwide.espacenet.com/searchResults?DB=EPODOC&submitted=true&locale=en_EP&ST=singleline&compact=false&DB=EPODOC&query=" + patentTrimmed
                        break
                    case "PatentScope (WIPO)":
                        GOTOURL = "http://www.wipo.int/patentscope/search/en/detail.jsf?docId=" + patentTrimmed
                        break
                    case "PatentLens":
                        GOTOURL = "http://www.patentlens.net/patentlens/patents.html?patnums=" + patentTrimmed + "&returnTo=patentnumber.html" + patentTrimmed
                        break
                }
                break
            case "otherok":
                goToLoc = vars.othersites.selectedItem
                switch (goToLoc) {
                    case "JP: IDPL":
                        GOTOURL =  "http://www.ipdl.inpit.go.jp/homepg_e.ipdl"
                        break
                    case "CA: CIPO":
                        GOTOURL = "http://brevets-patents.ic.gc.ca/opic-cipo/cpd/eng/introduction.html"
                        break
                    case "AU: AusPat":
                        GOTOURL = "http://www.ipaustralia.gov.au/auspat/index.htm"
                        break
                    case "KR: Korea":
                        GOTOURL = "http://patent2.kipris.or.kr/pateng/searchLogina.do?next=GeneralSearch"
                        break
                    case "HK: PatentSearch":
                        GOTOURL = "http://ipsearch.ipd.gov.hk/patent/main.jsp?LANG=en"
                        break
                    case "TW: Taiwan IPO":
                        GOTOURL = "http://www.tipo.gov.tw/en/index.aspx"
                        break
                    case "SG: IPOS":
                        GOTOURL = "http://www.epatents.gov.sg/default_redirect.asp"
                        break
                    case "DE: DPMA":
                        GOTOURL = "http://register.dpma.de/DPMAregister/Uebersicht"
                        break
                    case "RU: FIPS":
                        GOTOURL = "http://www1.fips.ru/wps/wcm/connect/content_en/en/main+/"
                        break
                    case "ID: IPDL":
                        GOTOURL = "http://ipdl.dgip.go.id"
                        break
                }
                break
        }
    
        URI testUrl = new URI(GOTOURL)
    
        Desktop desktop = Desktop.getDesktop()
        desktop.browse(testUrl)
    }