Page tree
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)
}