diff --git a/src/main/java/net/liftweb/seventhings/lib/BoxJ.java b/src/main/java/net/liftweb/seventhings/lib/BoxJ.java new file mode 100644 index 0000000..c492b31 --- /dev/null +++ b/src/main/java/net/liftweb/seventhings/lib/BoxJ.java @@ -0,0 +1,11 @@ +package net.liftweb.seventhings.lib; + +public class BoxJ { + + private final static BoxJBridge j = new BoxJBridge(); + + public static BoxJBridge j() { + return j; + } + +} diff --git a/src/main/java/net/liftweb/seventhings/lib/JqJsCmdsJ.java b/src/main/java/net/liftweb/seventhings/lib/JqJsCmdsJ.java new file mode 100644 index 0000000..58e8ca1 --- /dev/null +++ b/src/main/java/net/liftweb/seventhings/lib/JqJsCmdsJ.java @@ -0,0 +1,21 @@ +package net.liftweb.seventhings.lib; + +import net.liftweb.http.js.JE; +import net.liftweb.http.js.JsCmd; +import net.liftweb.http.js.jquery.JqJE; +import net.liftweb.http.js.jquery.JqJsCmds; +import scala.xml.NodeSeq; + +public class JqJsCmdsJ { + + private final static JqJsCmdsJBridge j = new JqJsCmdsJBridge(); + + public static JsCmd appendHtml(String uid, NodeSeq content) { + return (new JqJE.JqId(new JE.Str(uid)).$tilde$greater(new JqJE.JqAppend(content))).cmd(); + } + + public static JqJsCmdsJBridge j() { + return j; + } + +} diff --git a/src/main/java/net/liftweb/seventhings/lib/ListJ.java b/src/main/java/net/liftweb/seventhings/lib/ListJ.java new file mode 100644 index 0000000..ac6791b --- /dev/null +++ b/src/main/java/net/liftweb/seventhings/lib/ListJ.java @@ -0,0 +1,11 @@ +package net.liftweb.seventhings.lib; + +import scala.collection.Seq; + +public class ListJ { + + public static Seq Nil() { + return scala.collection.immutable.Nil$.MODULE$; + } + +} diff --git a/src/main/java/net/liftweb/seventhings/lib/XmlJ.java b/src/main/java/net/liftweb/seventhings/lib/XmlJ.java index 4081ddd..57682b3 100644 --- a/src/main/java/net/liftweb/seventhings/lib/XmlJ.java +++ b/src/main/java/net/liftweb/seventhings/lib/XmlJ.java @@ -39,6 +39,16 @@ public static scala.xml.Elem elem(String label, scala.xml.Node... children) { return el; } + public static scala.xml.Elem nselem(String prefix, String label, MetaData attributes, scala.xml.Node... children) { + scala.xml.Elem el = new scala.xml.Elem(prefix, label, attributes, topScope(), elemSeq(children)); + return el; + } + + public static scala.xml.Elem nselem(String prefix, String label, scala.xml.Node... children) { + scala.xml.Elem el = new scala.xml.Elem(prefix, label, xmlNull(), topScope(), elemSeq(children)); + return el; + } + public static MetaData attr(String key, String value) { return new scala.xml.UnprefixedAttribute(key, new scala.xml.Text(value), xmlNull()); } diff --git a/src/main/java/net/liftweb/seventhings/snippet/AjaxRunner.java b/src/main/java/net/liftweb/seventhings/snippet/AjaxRunner.java new file mode 100644 index 0000000..14b6417 --- /dev/null +++ b/src/main/java/net/liftweb/seventhings/snippet/AjaxRunner.java @@ -0,0 +1,31 @@ +package net.liftweb.seventhings.snippet; + +import net.liftweb.common.Box; +import net.liftweb.common.Empty; +import net.liftweb.http.SHtmlJ; +import net.liftweb.http.js.JsCmd; +import net.liftweb.http.js.JsExp; +import net.liftweb.http.js.jquery.JqJsCmds; +import net.liftweb.seventhings.lib.BoxJ; +import net.liftweb.seventhings.lib.JqJsCmdsJ; +import net.liftweb.util.Css; +import scala.Function1; +import scala.xml.Elem; +import scala.xml.NodeSeq; +import static net.liftweb.seventhings.lib.XmlJ.*; + +public class AjaxRunner { + + public Function1 render() { + + final scala.Tuple2 ajax = SHtmlJ.j().ajaxInvoke(net.liftweb.util.Func.lift(new net.liftweb.util.Func0() { + public JsCmd apply() { + final Elem el = elem("div", nselem("lift", "MyWizard", attr("ajax", "true"))); + return new JqJsCmds.ModalDialog(toNodeSeq(el), (Box)BoxJ.j().empty()); + } + })); + + return Css.sel("* [onclick]", ((JsExp)ajax._2()).toJsCmd()); + } + +} diff --git a/src/main/java/net/liftweb/seventhings/snippet/InvoiceWiring.java b/src/main/java/net/liftweb/seventhings/snippet/InvoiceWiring.java index 3680055..30f149c 100644 --- a/src/main/java/net/liftweb/seventhings/snippet/InvoiceWiring.java +++ b/src/main/java/net/liftweb/seventhings/snippet/InvoiceWiring.java @@ -5,23 +5,31 @@ import net.liftweb.http.WiringUI; import net.liftweb.http.js.JsCmd; import net.liftweb.http.js.JsCmds; +import net.liftweb.http.js.JsExp; +import net.liftweb.http.js.jquery.JqJsCmds; import net.liftweb.http.js.jquery.JqWiringSupport; -import net.liftweb.seventhings.lib.HelpersJ; -import net.liftweb.seventhings.lib.XmlJBridge; +import net.liftweb.seventhings.lib.*; +import net.liftweb.util.*; import net.liftweb.util.Css; -import net.liftweb.util.ValueCell; +import net.liftweb.util.Func; +import net.liftweb.util.Func0; +import net.liftweb.util.Func1; +import net.liftweb.util.Func2; import scala.Function1; import scala.Function2; import scala.collection.Iterator; +import scala.collection.immutable.Nil; import scala.collection.mutable.ListBuffer; import scala.runtime.AbstractFunction1; import scala.runtime.AbstractFunction2; import scala.xml.Elem; import scala.xml.NodeSeq; import scala.xml.Text; +import scala.collection.JavaConversions; import javax.swing.text.Element; import java.text.NumberFormat; +import java.util.ArrayList; import static net.liftweb.seventhings.lib.XmlJ.*; @@ -53,8 +61,8 @@ private class Info { final InvoiceWiring iWiring; - final ValueCell invoices; - final ValueCell taxRate; + final net.liftweb.util.ValueCell invoices; + final net.liftweb.util.ValueCell taxRate; final net.liftweb.util.Cell subtotal; final net.liftweb.util.Cell taxable; final net.liftweb.util.Cell tax; @@ -64,18 +72,18 @@ private class Info { this.iWiring = iWiring; ListBuffer buf = new ListBuffer(); buf.$plus$eq(iWiring.newLine()); - invoices = new ValueCell(buf.toList()); - taxRate = new ValueCell(0.05d); + invoices = new net.liftweb.util.ValueCell(buf.toList()); + taxRate = new net.liftweb.util.ValueCell(0.05d); - subtotal = invoices.lift(new AbstractFunction1, Double>(){ + subtotal = invoices.lift(Func.lift(new Func1, Double>(){ public Double apply(scala.collection.immutable.List in) { - return in.foldLeft(0d, new AbstractFunction2(){ + return in.foldLeft(0d, Func.lift(new Func2(){ public Double apply(Double in, Line line) { return in + line.price; } - }); + })); } - }); + })); taxable = invoices.lift(new AbstractFunction1, Double>(){ public Double apply(scala.collection.immutable.List in) { @@ -91,17 +99,17 @@ public Double apply(Double in, Line line) { } }); - tax = taxRate.lift(taxable, new AbstractFunction2(){ + tax = taxRate.lift(taxable, Func.lift(new Func2(){ public Double apply(Double left, Double right) { return left * right; } - }); + })); - total = subtotal.lift(tax, new AbstractFunction2(){ + total = subtotal.lift(tax, Func.lift(new Func2(){ public Double apply(Double left, Double right) { return left + right; } - }); + })); } } @@ -138,13 +146,25 @@ public Function1 total() { */ public Elem taxRate() { return SHtmlJ.j().ajaxText(info.taxRate.get().toString(), - doubleToJsCmd(new AbstractFunction1() { + doubleToJsCmd(Func.lift(new Func1() { public Object apply(Double d) { return info.taxRate.set(d); } - }), null); + })), ListJ.Nil()); } + /** + * Add a line to the input + */ + public Function1 addLine() { + final scala.Tuple2 ajax = SHtmlJ.j().ajaxInvoke(net.liftweb.util.Func.lift(new net.liftweb.util.Func0() { + public JsCmd apply() { + return JqJsCmdsJ.appendHtml("invoice_lines", renderLine(appendLine())); + } + })); + + return Css.sel("* [onclick]", ((JsExp)ajax._2()).toJsCmd()); + } /** * Draw all the input lines @@ -181,10 +201,10 @@ private Elem renderLineAsElem(final Line theLine) { Elem el = elem("div", attr("id", theLine.guid), - SHtmlJ.j().ajaxText(theLine.name, new AbstractFunction1() { + SHtmlJ.j().ajaxText(theLine.name, Func.lift(new Func1() { public JsCmd apply(final String s) { System.out.println("JsCmd APPLY. s="+s); - return mutateLine(theLine.guid, new AbstractFunction1() { + return mutateLine(theLine.guid, new Func1() { public Line apply(Line in) { System.out.println("mutateLine Func. Line="+in); Line out = new Line(in.guid, s, in.price, in.taxable); @@ -193,39 +213,32 @@ public Line apply(Line in) { } }); } - }, null), + }), ListJ.Nil()), - SHtmlJ.j().ajaxText(""+theLine.price, new AbstractFunction1() { + SHtmlJ.j().ajaxText(""+theLine.price, Func.lift(new Func1() { public JsCmd apply(final String s) { final double dbl = Double.parseDouble(s); - return mutateLine(theLine.guid, new AbstractFunction1() { + return mutateLine(theLine.guid, new Func1() { public Line apply(Line in) { return new Line(in.guid, in.name, dbl, in.taxable); } }); } - }, null), + }), ListJ.Nil()), - SHtmlJ.j().ajaxCheckbox(theLine.taxable, new AbstractFunction1() { + SHtmlJ.j().ajaxCheckbox(theLine.taxable, Func.lift(new Func1() { + @Override public JsCmd apply(final Boolean b) { - return mutateLine(theLine.guid, new AbstractFunction1() { + return mutateLine(theLine.guid, new Func1(){ public Line apply(Line in) { return new Line(in.guid, in.name, in.price, b); } }); } - }, null)); + }), ListJ.Nil())); return el; - -//
-// {ajaxText(name, s => mutateLine(guid)(_.copy(name = s)))} -// -// {ajaxText(price.toString, (d: Double) => mutateLine(guid) {_.copy(price = d)})} -// -// {ajaxCheckbox(theLine.taxable, b => mutateLine(guid) {_.copy(taxable = b)})} -//
} private Line appendLine() { @@ -244,45 +257,38 @@ public Line newLine() { /** * Mutate a line and update the Info field */ - private JsCmd mutateLine(final String guid, final Function1 f) { - scala.collection.immutable.List all = (scala.collection.immutable.List) info.invoices.get(); - scala.collection.immutable.List head = all.filter(new AbstractFunction1() { - public Boolean apply(Line line) { - return line.guid.equals(guid); - } - }); - - final ListBuffer buf = new ListBuffer(); - head.foreach(new AbstractFunction1() { - public Void apply(Line line) { - buf.$plus$eq(f.apply(line)); - return null; - } - }); - - scala.collection.immutable.List rest = all.filter(new AbstractFunction1(){ - public Boolean apply(Line line) { - return !line.guid.equals(guid); - } - }); - - info.invoices.set(rest.$colon$colon$colon(head)); - return JsCmds.Noop(); - } - - private Function2 doubleDraw() { - return new AbstractFunction2() { - public NodeSeq apply(Double d, NodeSeq ns) { - return new Text(NumberFormat.getCurrencyInstance().format(d)); + private JsCmd mutateLine(final String guid, final Func1 fIn) { + final Function1 f = Func.lift(fIn); + scala.collection.immutable.List all = (scala.collection.immutable.List) info.invoices.get(); + + java.util.List head = new java.util.ArrayList(); + java.util.List rest = new java.util.ArrayList(); + for (Object o : JavaConversions.asJavaIterable(all)) { + Line l = (Line) o; + if (l.guid.equals(guid)) { + head.add((Line)f.apply(l)); + } else { + rest.add(l); + } } - }; + head.addAll(rest); - } + info.invoices.set(JavaConversions.asScalaBuffer(head).toList()); + return JsCmds.Noop(); + } + + private Function2 doubleDraw() { + return Func.lift(new net.liftweb.util.Func2() { + public NodeSeq apply(Double d, NodeSeq ns) { + return new Text(NumberFormat.getCurrencyInstance().format(d)); + } + }); + } private Function1 doubleToJsCmd(final Function1 in) { - return new AbstractFunction1() { + return Func.lift(new Func1() { public JsCmd apply(String str) { try { double d = Double.parseDouble(str); @@ -291,7 +297,7 @@ public JsCmd apply(String str) { return JsCmds.Noop(); } } - } ; + }) ; } } diff --git a/src/main/java/net/liftweb/seventhings/snippet/MyWizardJava.java b/src/main/java/net/liftweb/seventhings/snippet/MyWizardJava.java index 9c3e767..e9d89b3 100644 --- a/src/main/java/net/liftweb/seventhings/snippet/MyWizardJava.java +++ b/src/main/java/net/liftweb/seventhings/snippet/MyWizardJava.java @@ -4,23 +4,45 @@ import net.liftweb.http.SJ; import net.liftweb.http.js.JsCmd; import net.liftweb.http.js.jquery.JqJsCmds; +import net.liftweb.seventhings.lib.JqJsCmdsJ; import net.liftweb.seventhings.lib.WizardJ; +import net.liftweb.util.Func; +import net.liftweb.util.Func0; import net.liftweb.wizard.Wizard; +/** + * An example of a wizard in Lift + */ public class MyWizardJava extends WizardJ { public JsCmd calcAjaxOnDone() { - return null; - //JqJsCmds.Unblock; + return JqJsCmdsJ.j().unblock(); } + // define the first screen // We ask the parent's name if the person is under 18 -// private WizardJ.Screen parentName = new WizardJ.Screen() { -// String parentName = AbstractScreen.field(SJ.j().$qmark("Mom or Dad's name", "", -// AbstractScreen.valMinLen(2, SJ.j().$qmark("Name Too Short")), -// AbstractScreen.valMaxLen(40, SJ.j().$qmark("Name Too Long")))); -// }; + private WizardJ.ScreenJ parentNameObj = new WizardJ.ScreenJ() { + String parentName = field(SJ.j().$qmark("Mom or Dad's name"), "", + valMinLen(Func.lift(new Func0() { + public Integer apply() { + return 2; + } + }), Func.lift(new Func0(){ + public String apply() { + return SJ.j().$qmark("Name Too Short"); + } + })), + valMaxLen(Func.lift(new Func0(){ + public Integer apply() { + return 40; + } + }), Func.lift(new Func0(){ + public String apply() { + return SJ.j().$qmark("Name Too Long"); + } + }))); + }; // we ask for the favorite pet diff --git a/src/main/java/net/liftweb/seventhings/snippet/ShowCode.java b/src/main/java/net/liftweb/seventhings/snippet/ShowCode.java index 250d09f..639ae09 100644 --- a/src/main/java/net/liftweb/seventhings/snippet/ShowCode.java +++ b/src/main/java/net/liftweb/seventhings/snippet/ShowCode.java @@ -23,7 +23,7 @@ private String calcBrush(String fileName) { } if (fileName.endsWith(".java")) { - return "scala"; + return "java"; } return "scala"; diff --git a/src/main/scala/net/liftweb/seventhings/lib/BoxJBridge.scala b/src/main/scala/net/liftweb/seventhings/lib/BoxJBridge.scala new file mode 100644 index 0000000..d96a1ea --- /dev/null +++ b/src/main/scala/net/liftweb/seventhings/lib/BoxJBridge.scala @@ -0,0 +1,10 @@ +package net.liftweb.seventhings.lib + +import net.liftweb.common.{EmptyBox, Box, Empty} + +class BoxJBridge { + + def empty: EmptyBox = Empty + + +} \ No newline at end of file diff --git a/src/main/scala/net/liftweb/seventhings/lib/JqJsCmdsJBridge.scala b/src/main/scala/net/liftweb/seventhings/lib/JqJsCmdsJBridge.scala new file mode 100644 index 0000000..c856926 --- /dev/null +++ b/src/main/scala/net/liftweb/seventhings/lib/JqJsCmdsJBridge.scala @@ -0,0 +1,7 @@ +package net.liftweb.seventhings.lib + +class JqJsCmdsJBridge { + + def unblock = net.liftweb.http.js.jquery.JqJsCmds.Unblock + +} \ No newline at end of file diff --git a/src/main/scala/net/liftweb/seventhings/lib/WizardJ.scala b/src/main/scala/net/liftweb/seventhings/lib/WizardJ.scala index 1f88c3b..cd23b26 100644 --- a/src/main/scala/net/liftweb/seventhings/lib/WizardJ.scala +++ b/src/main/scala/net/liftweb/seventhings/lib/WizardJ.scala @@ -5,4 +5,6 @@ import net.liftweb.wizard.Wizard abstract class WizardJ extends Wizard { + abstract class ScreenJ extends Screen + } \ No newline at end of file diff --git a/src/main/scala/net/liftweb/seventhings/snippet/MyWizard.scala b/src/main/scala/net/liftweb/seventhings/snippet/MyWizard.scala index dddf7e8..7eac2d4 100644 --- a/src/main/scala/net/liftweb/seventhings/snippet/MyWizard.scala +++ b/src/main/scala/net/liftweb/seventhings/snippet/MyWizard.scala @@ -4,6 +4,7 @@ package snippet import net.liftweb._ import http._ import js.jquery.JqJsCmds._ +import util.Func0 import wizard._ import util.Helpers._ @@ -32,7 +33,7 @@ object MyWizard extends Wizard { val parentName = new Screen { val parentName = field(S ? "Mom or Dad's name", "", valMinLen(2, S ? "Name Too Short"), - valMaxLen(40, S ? "Name Too Long")) + valMaxLen(40, S ? "Name Too Long")) } // we ask for the favorite pet @@ -50,6 +51,6 @@ object MyWizard extends Wizard { } } -object AjaxRunner { +object AjaxRunnerScala { def render = "* [onclick]" #> SHtml.ajaxInvoke(() => ModalDialog(
)) }