Drop Down Input Dialog
/** Add annotations to an Invention button, from the Invention form
*
* @author Erin Bolstad (ebolstad@chemaxon.com)
* Dec 2011
*/
import com.im.df.api.dml.*
import com.im.commons.progress.*
import groovy.swing.SwingBuilder
import com.im.df.api.util.DIFUtilities
import java.awt.*
import org.openide.NotifyDescriptor
import org.openide.DialogDisplayer
evaluate = { widget ->
def rs = widget.form.resultSet
def dataTree = rs.dataTree
def ety = dataTree.rootVertex.entity
def parentVS = rs.rootVertexState
def schema = ety.schema
def VMNSvertex = dataTree.rootVertex.edges.find { it.destination.entity.name == 'VMNS' }
def inventionVertex = VMNSvertex.destination.edges.find { it.destination.entity.name == 'Inventions' }
def invenV = inventionVertex.getDestination()
def invenVS = rs.getVertexState(invenV)
def invenIds = invenVS.selectedRowsIds
def invenFirstId = invenIds.get(0)
def noteEdge = inventionVertex.destination.edges.find { it.destination.entity.name == 'Notes' }
def noteEntity = noteEdge.destination.entity
def noteEdp = noteEntity.schema.dataProvider.getEntityDataProvider(noteEntity)
def noteRS = noteEntity.schema.dataProvider.getDefaultResultSet(dataTree, true, DFEnvironmentRO.DEV_NULL)
def noteVS = noteRS.getVertexState(noteEdge.destination)
noteEdp.lockable.withLock('Notating') { envRW ->
def noteIDs = noteEdp.queryForIds(DFTermExpression.ALL_DATA, null, envRW)
def noteData = noteVS.getData(noteIDs, envRW)
def noteFld = noteEntity.fields.items.find { it.name == 'NOTE' }
def noteUserFld = noteEntity.fields.items.find { it.name == 'User' }
def noteDateFld = noteEntity.fields.items.find { it.name == 'Date Added' }
noteRef = [:]
noteList = ["-"]
noteData.each { id, noteMap ->
notetation = noteData[id][noteFld.id]
noteRef.putAt(id, notetation)
noteList << notetation
}
def noteSel = new SwingBuilder()
noteSel.setVariable('properties',[:])
def vars = noteSel.variables
def frame = noteSel.dialog(title:'Notations', modal:true) {
panel () {
gridBagLayout()
label(text:"Enter a new notation:", constraints:gbc(
gridx:0,
gridy:0,
insets:[10,10,10,5]))
textField(id:'newName', constraints:gbc(
gridx:1,
gridy:0,
fill:GridBagConstraints.HORIZONTAL,
insets:[10,10,10,10]))
label(text:" Or, select an existing notation from the list", constraints:gbc(
gridy:1,
gridwidth:2,
insets:[10,50,5,50]))
comboBox(id:'notetations', items:noteList, constraints:gbc(
gridy:2,
gridwidth:2,
insets:[5,10,10,10]))
button(id:'ok', label: "OK", constraints:gbc(
gridx:0,
gridy:3,
anchor:LINE_END,
insets:[10,0,10,0]),
actionPerformed: {
vars.buttonResults = 'ok'
dispose()})
button(id:'cancel', label: "Cancel", constraints:gbc(
gridx:1,
gridy:3,
anchor:LINE_START,
insets:[10,0,10,0]),
actionPerformed: {
vars.buttonResults = 'quit'
dispose()})
}
}
frame.pack()
frame.setLocationRelativeTo(null)
frame.show()
def chosenAction = vars.buttonResults
if (chosenAction == 'quit') {
return
}
if (chosenAction == 'ok') {
newNotetation = vars.newName.text
selNotetation = vars.notetations.selectedItem
}
rel = DIFUtilities.findUsagesInRelationships(noteEntity)
firstRel = rel.get(0)
//Get current invention ID - make relationship with only that one.
def userName = schema.getUsername()
def timeStamp = new Date()
if (selNotetation == "-") {
// See if Notation already exists, throw warning message
def newNoteIDs = noteEdp.queryForIds(DFTermExpression.ALL_DATA, null, envRW)
def newNoteData = noteVS.getData(newNoteIDs, envRW)
newNoteRef = [:]
newNoteList = ["-"]
if (!newNoteData.isEmpty()) {
newNoteData.each { id, noteMap ->
notetation = newNoteData[id][noteFld.id]
newNoteRef.putAt(id, notetation)
newNoteList << notetation
}
}
if (newNoteList.contains(newNotetation)) {
def message1 = "$newNotetation already exists!\nCheck the drop down box"
NotifyDescriptor w = new NotifyDescriptor.Message(message1)
DialogDisplayer.getDefault().notify(w)
return
}else{
vals =[(noteFld.id):newNotetation]
vals.putAt(noteUserFld.id, userName)
vals.putAt(noteDateFld.id, timeStamp)
noteEdp.insert(vals, null, envRW)
def insNoteIDs = noteEdp.queryForIds(DFTermExpression.ALL_DATA, null, envRW)
def insNoteData = noteVS.getData(insNoteIDs, envRW)
newNoteRef = [:]
insNoteData.each { id, noteMap ->
notetation = insNoteData[id][noteFld.id]
newNoteRef.putAt(id, notetation)
}
newLastKey = newNoteRef.max{ it.key }
newIdx = newLastKey.key
def x = ("$newIdx" as String) as Integer
def y = ("$invenFirstId" as String) as Object
DIFUtilities.connectRelationalData(firstRel.forward, y, x, envRW)
def message = "Please Note:\nTo see this new Note in the Notation View,\nyou will first need to select 'Show All' in Query mode."
NotifyDescriptor d = new NotifyDescriptor.Message(message)
DialogDisplayer.getDefault().notify(d)
}
}
if (selNotetation != "-") {
def selKeySet = noteRef.find { id, notet -> notet == selNotetation}
def selNoteID = selKeySet.key
// Get the note IDs for the invention in question
def checkIDs = noteVS.getIdsForParentId(invenFirstId, DFEnvironmentRO.DEV_NULL)
if (checkIDs.contains(selNoteID)) {
def message2 = "$selNotetation already assigned to Invention $invenFirstId!"
NotifyDescriptor q = new NotifyDescriptor.Message(message2)
DialogDisplayer.getDefault().notify(q)
return
} else {
def x = ("$selNoteID" as String) as Integer
def y = ("$invenFirstId" as String) as Object
DIFUtilities.connectRelationalData(firstRel.forward, y, x, envRW)
}
}
}
}