The WicketStuff Scala project is the best way to put all this. The project is more Scala-based components driven, like Fodel/SLabel and SForm, but I think Scala can offer even more advantages like the one you propose here.
DSL is the way to go IMO for this Scala-Wicket integration *Bruno Borges* www.brunoborges.com.br +55 21 76727099 On Mon, Aug 1, 2011 at 2:45 AM, Gary Thomas <7za...@gmail.com> wrote: > > I've written some Scala utilities as well, but instead of a DSL I'm using > implicit conversions via traits, which I've found to be a really nice fit > with Wicket. > > An example: > > import org.apache.wicket.model.IModel > import org.apache.wicket.model.**LoadableDetachableModel > import org.apache.wicket.model.**PropertyModel > > trait WicketConversions { > // transparent PropertyModel conversion > implicit def tuple2model[T](tuple: (AnyRef, String)): PropertyModel[T] = > { > new PropertyModel[T](tuple._1, tuple._2) > } > > // transparent function/closure to LoadableDetachableModel conversion > implicit def function2model[T](f: => T): IModel[T] = { > new LoadableDetachableModel[T] { > def load: T = f > } > } > } > > Usage: > > class MyPanel extends Panel("id") with WicketConversions { > > // transparent PropertyModel conversion using article.rating): > add(new RatingPanel("rating", article -> "rating") // so pretty > > // transparent LoadableDetachableModel conversion (expects > IModel[Boolean]): > add(new AjaxCheckBox("selected", { dao.get(id).isAdmin }) { > def onUpdate(target: AjaxRequestTarget) { ... } > }) > } > > > I have more code as well for Spring integration, etc. > If anyone is interested, I could add mine to this or to a new GitHub > project. > > > Thanks, > Gary > > > > On 7/29/11 5:22 PM, Ben Tilford wrote: > >> For LDM >> >> class Ldm[T](provider:()=> T) extends LoadableDetachable... { >> def load():T { >> provider() >> } >> } >> >> object Ldm { >> def apply(provider:()=>T) = new Ldm[T](provider) >> } >> >> could be used as >> >> ... >> val id = 1 >> val model = Ldm(()=>{dao.get(id)}) >> >> or >> >> val id = 1 >> def provider = dao.get(id) >> val model = Ldm(provider) >> >> >> On Fri, Jul 29, 2011 at 6:44 AM, Martin Grigorov<mgrigo...@apache.org>** >> wrote: >> >> Bruno, >>> >>> Yet another idea for the dsl: >>> >>> def ldm[R, ID](id: ID = null, f: (ID) => R) = {new >>> LoadableDetachableModel(id) { override def load() : R = { f(id); } } } >>> >>> P.S. Not tested. >>> >>> On Thu, Jul 28, 2011 at 9:07 AM, Bruno Borges<bruno.bor...@gmail.com> >>> wrote: >>> >>>> Just wanted to share my experience playing a little more with Scala and >>>> Wicket> A few minutes ago I got this excelent code: >>>> >>>> I know it is too simple, and it can be accomplished as well in Java with >>>> static imports. But still, for my project it's being great (and cool) to >>>> >>> do >>> >>>> such things. >>>> >>>> object btnEditar extends Button("btnEditar") { >>>> override def onSubmit() = { >>>> - /* show fields */ >>>> - camposForm.**setVisibilityAllowed(true) >>>> - btnSalvar.**setVisibilityAllowed(true) >>>> - cancelar.setVisibilityAllowed(**true) >>>> - >>>> - /* hide them */ >>>> - camposTela.**setVisibilityAllowed(false) >>>> - btnEditar.**setVisibilityAllowed(false) >>>> + show(camposForm, btnSalvar, cancelar) >>>> + hide(camposTela, btnEditar) >>>> } >>>> } >>>> add(btnEditar) >>>> >>>> Methods show/hide are imported as "import code.DSLWicket._" >>>> >>>> >>>> >>>> *Bruno Borges* >>>> www.brunoborges.com.br >>>> +55 21 76727099 >>>> >>>> >>>> >>>> On Wed, Jul 27, 2011 at 4:53 PM, Bruno Borges<bruno.bor...@gmail.com >>>> wrote: >>>> >>>> Thanks Martin, >>>>> >>>>> There was only a small little problem in your code. The correct syntax >>>>> >>>> is: >>> >>>> >>>>> def label[T](id: String, model: IModel[T] = null): Label = { val label >>>>> = new Label(id, model); add(label); label } >>>>> >>>>> The suggestions were updated on Gist. >>>>> >>>>> *Bruno Borges* >>>>> www.brunoborges.com.br >>>>> +55 21 76727099 >>>>> >>>>> >>>>> >>>>> On Wed, Jul 27, 2011 at 3:55 PM, Martin Grigorov<mgrigo...@apache.org >>>>> >>>> wrote: >>>> >>>>> >>>>> Idea for simplification: use named parameters. >>>>>> For example >>>>>> def label[T](id: String, model: IModel[T]): Label = { val label = new >>>>>> Label(id, model); add(label); label } >>>>>> would become >>>>>> def label[T](id: String, model = _ : IModel[T]): Label = { val label = >>>>>> new Label(id, model); add(label); label } >>>>>> >>>>>> this way you'll have just one declaration of label function which will >>>>>> handle the current three >>>>>> >>>>>> additionally you may add a pimp: >>>>>> implicit def ser2model[S :< Serializable](ser: S): IModel[S] = >>>>>> Model.of(ser) >>>>>> >>>>>> now even when you pass String as second param to label() it will be >>>>>> converted to IModel >>>>>> >>>>>> On Wed, Jul 27, 2011 at 9:11 PM, Martin Grigorov<mgrigo...@apache.org >>>>>> >>>>> >>>> wrote: >>>>>> >>>>>>> Take a look at scala.swing.* sources. >>>>>>> >>>>>>> On Wed, Jul 27, 2011 at 8:34 PM, Bruno Borges< >>>>>>> >>>>>> bruno.bor...@gmail.com> >>> >>>> wrote: >>>>>> >>>>>>> Can some Scala expert help me to make this DSL available as PML >>>>>>>> >>>>>>> (pimp >>> >>>> my >>>>>> >>>>>>> library)? >>>>>>>> >>>>>>>> I've tried to code it that way but things didn't quite worked out >>>>>>>> >>>>>>> the >>> >>>> way >>>>>> >>>>>>> they should. >>>>>>>> >>>>>>>> The reason is that for every Wicket object I create, I must extend >>>>>>>> >>>>>>> the >>> >>>> trait >>>>>> >>>>>>> DSLWicket >>>>>>>> >>>>>>>> >>>>>>>> >>>>>>>> *Bruno Borges* >>>>>>>> www.brunoborges.com.br >>>>>>>> +55 21 76727099 >>>>>>>> >>>>>>>> >>>>>>>> >>>>>>>> On Wed, Jul 27, 2011 at 2:30 PM, Bruno Borges< >>>>>>>> >>>>>>> bruno.bor...@gmail.com >>> >>>> wrote: >>>>>>> >>>>>>>> >>>>>>>> Not really. >>>>>>>>> >>>>>>>>> The method onSubmit() of button is void, as well onClick(), so >>>>>>>>> >>>>>>>> there's >>> >>>> no >>>>>> >>>>>>> need for the function be passed as () => Unit or anything else. >>>>>>>>> >>>>>>>>> I made a few changes to it and updated on Gist. >>>>>>>>> >>>>>>>>> I've also uploaded a page that uses this DSL at >>>>>>>>> https://gist.github.com/**1109919<https://gist.github.com/1109919> >>>>>>>>> >>>>>>>>> Take a look >>>>>>>>> >>>>>>>>> *Bruno Borges* >>>>>>>>> www.brunoborges.com.br >>>>>>>>> +55 21 76727099 >>>>>>>>> >>>>>>>>> >>>>>>>>> >>>>>>>>> On Wed, Jul 27, 2011 at 2:22 PM, Scott Swank< >>>>>>>>> >>>>>>>> scott.sw...@gmail.com >>> >>>> wrote: >>>>>>> >>>>>>>> >>>>>>>>> I think you do want Unit, which as I understand it is closest >>>>>>>>>> equivalent to "void" in Scala. >>>>>>>>>> >>>>>>>>>> http://www.scala-lang.org/api/**current/scala/Unit.html<http://www.scala-lang.org/api/current/scala/Unit.html> >>>>>>>>>> >>>>>>>>>> Scott >>>>>>>>>> >>>>>>>>>> On Wed, Jul 27, 2011 at 10:14 AM, Bruno Borges< >>>>>>>>>> >>>>>>>>> bruno.bor...@gmail.com> >>>>>> >>>>>>> wrote: >>>>>>>>>> >>>>>>>>>>> No, the function must return void, not another function (unit). >>>>>>>>>>> >>>>>>>>>>> But there's also the option of () => Nothing. Which one should I >>>>>>>>>>> >>>>>>>>>> use for >>>>>> >>>>>>> this case? >>>>>>>>>>> >>>>>>>>>>> *Bruno Borges* >>>>>>>>>>> www.brunoborges.com.br >>>>>>>>>>> +55 21 76727099 >>>>>>>>>>> >>>>>>>>>>> >>>>>>>>>>> >>>>>>>>>>> On Wed, Jul 27, 2011 at 12:54 PM, Martin Grigorov< >>>>>>>>>>> >>>>>>>>>> mgrigo...@apache.org >>>>>> >>>>>>> wrote: >>>>>>>>>>> >>>>>>>>>>> def button(id: String, submit: () => Void): Button = { >>>>>>>>>>>> >>>>>>>>>>>> it should be () => Unit, no ? >>>>>>>>>>>> >>>>>>>>>>>> On Wed, Jul 27, 2011 at 6:51 PM, Martin Grigorov< >>>>>>>>>>>> >>>>>>>>>>> mgrigo...@apache.org >>>>>> >>>>>>> >>>>>>>>>>> wrote: >>>>>>>>>>>> >>>>>>>>>>>>> Adding some usage examples at the bottom will help us >>>>>>>>>>>>> >>>>>>>>>>>> evaluate >>> >>>> it. >>>>>> >>>>>>> >>>>>>>>>>>>> Why not add type to >>>>>>>>>>>>> def textField(id: String): TextField[_] = { val field = new >>>>>>>>>>>>> TextField(id); add(field); field } >>>>>>>>>>>>> to become >>>>>>>>>>>>> def textField[T](id: String): TextField[T] = { val field = >>>>>>>>>>>>> >>>>>>>>>>>> new >>> >>>> TextField[T](id); add(field); field } >>>>>>>>>>>>> >>>>>>>>>>>>> usage: textField[Int](someId) >>>>>>>>>>>>> >>>>>>>>>>>>> with using implicit Manifest for T you can also can >>>>>>>>>>>>> >>>>>>>>>>>> automatically set >>>>>> >>>>>>> the type: field.setType(m.erasure) >>>>>>>>>>>>> >>>>>>>>>>>>> On Wed, Jul 27, 2011 at 6:26 PM, Bruno Borges< >>>>>>>>>>>>> >>>>>>>>>>>> bruno.bor...@gmail.com> >>>>>>>>>> >>>>>>>>>>> wrote: >>>>>>>>>>>> >>>>>>>>>>>>> I've been playing with Wicket and Scala and I thought this >>>>>>>>>>>>>> >>>>>>>>>>>>> could be >>>>>> >>>>>>> added to >>>>>>>>>>>> >>>>>>>>>>>>> the wicket-scala project at WicketStuff. >>>>>>>>>>>>>> >>>>>>>>>>>>>> What do you guys think? >>>>>>>>>>>>>> >>>>>>>>>>>>>> https://gist.github.com/**1109603<https://gist.github.com/1109603> >>>>>>>>>>>>>> >>>>>>>>>>>>>> >>>>>>>>>>>>>> *Bruno Borges* >>>>>>>>>>>>>> www.brunoborges.com.br >>>>>>>>>>>>>> +55 21 76727099 >>>>>>>>>>>>>> >>>>>>>>>>>>>> >>>>>>>>>>>>> >>>>>>>>>>>>> >>>>>>>>>>>>> -- >>>>>>>>>>>>> Martin Grigorov >>>>>>>>>>>>> jWeekend >>>>>>>>>>>>> Training, Consulting, Development >>>>>>>>>>>>> http://jWeekend.com >>>>>>>>>>>>> >>>>>>>>>>>>> >>>>>>>>>>>> >>>>>>>>>>>> >>>>>>>>>>>> -- >>>>>>>>>>>> Martin Grigorov >>>>>>>>>>>> jWeekend >>>>>>>>>>>> Training, Consulting, Development >>>>>>>>>>>> http://jWeekend.com >>>>>>>>>>>> >>>>>>>>>>>> >>>>>>>>>>>> ------------------------------**------------------------------ >>>>>> **--------- >>>>>> >>>>>>> To unsubscribe, e-mail: >>>>>>> users-unsubscribe@wicket.**apache.org<users-unsubscr...@wicket.apache.org> >>>>>>>>>>>> For additional commands, e-mail: users-h...@wicket.apache.org >>>>>>>>>>>> >>>>>>>>>>>> >>>>>>>>>>>> >>>>>>>>>>> >>>>>>>>>> >>>>>>>>>> ------------------------------**------------------------------** >>> --------- >>> >>>> To unsubscribe, e-mail: >>>> users-unsubscribe@wicket.**apache.org<users-unsubscr...@wicket.apache.org> >>>>>>>>>> For additional commands, e-mail: users-h...@wicket.apache.org >>>>>>>>>> >>>>>>>>>> >>>>>>>>>> >>>>>>>>> >>>>>>>> >>>>>>> >>>>>>> >>>>>>> -- >>>>>>> Martin Grigorov >>>>>>> jWeekend >>>>>>> Training, Consulting, Development >>>>>>> http://jWeekend.com >>>>>>> >>>>>>> >>>>>> >>>>>> >>>>>> -- >>>>>> Martin Grigorov >>>>>> jWeekend >>>>>> Training, Consulting, Development >>>>>> http://jWeekend.com >>>>>> >>>>>> ------------------------------**------------------------------** >>>>>> --------- >>>>>> To unsubscribe, e-mail: >>>>>> users-unsubscribe@wicket.**apache.org<users-unsubscr...@wicket.apache.org> >>>>>> For additional commands, e-mail: users-h...@wicket.apache.org >>>>>> >>>>>> >>>>>> >>>>> >>>> >>> >>> >>> -- >>> Martin Grigorov >>> jWeekend >>> Training, Consulting, Development >>> http://jWeekend.com >>> >>> ------------------------------**------------------------------** >>> --------- >>> To unsubscribe, e-mail: >>> users-unsubscribe@wicket.**apache.org<users-unsubscr...@wicket.apache.org> >>> For additional commands, e-mail: users-h...@wicket.apache.org >>> >>> >>> >> >