# # calc <- function() { actionPerformed <- function(ev) { txt <- ev$getActionCommand() back <- 0 if(txt == "=") { txt <- input$getText() val <- as.character(eval(parse(text=txt))) input$setText(val) jcombo$getModel()$insertElementAt(txt, as.integer(0)) return(NULL) } else if(!is.na(match(txt, unaryOps))) { if(txt == "()") txt <- "" val <- paste(txt, "()",sep="") back <- -1 } else if(txt == "Clear") { input$setText("") return(NULL) } else { val <- txt } doc <- input$getDocument() doc$insertString(input$getCaretPosition(), val, NULL) if(back < 0) { input$setCaretPosition(as.integer(input$getCaretPosition() + back)) } } jdynamicCompile("java.awt.event.ActionListener", "RButtonListener") obj <- list(actionPerformed=actionPerformed) ref <- foreignReference(obj) l <- .JNew("RButtonListener", ref) numPad <- .JNew("JPanel") numPad$setLayout(.JNew("GridLayout", as.integer(4), as.integer(3), as.integer(5), as.integer(5))) for(i in c(1:9, 0, ".")) { b <- .JNew("JButton", i) b$addActionListener(l) numPad$add(b) } opPad <- .JNew("JPanel") unaryOps <- c("log", "exp", "sqrt", "()") opNames <- c("/", "*", "-", "+", unaryOps) opPad$setLayout(.JNew("GridLayout", as.integer(4), as.integer(2))) for(i in c("=", opNames, "Clear")) { b <- .JNew("JButton", i) b$addActionListener(l) opPad$add(b) } lowerPanel <- .JNew("JPanel") lowerPanel$setLayout(.JNew("GridLayout", as.integer(1), as.integer(2))) lowerPanel$add("West",numPad) lowerPanel$add("East", opPad) topPanel <- .JNew("JPanel") topPanel$setLayout(.JNew("BorderLayout")) # input <- .JNew("JTextField", as.integer(30)) input <- .JNew("JComboBox") input$setEditable(T) go <- .JNew("JButton", "=") go$addActionListener(l) topPanel$add("East", go) topPanel$add("Center", input) panel <- .JNew("JPanel") panel$setLayout(.JNew("BorderLayout")) panel$add("North", topPanel) panel$add("Center", lowerPanel) f <- .JNew("GenericFrame", panel) jcombo <- input input <- input$getEditor()$getEditorComponent() list(ref, input=input) }