Building Vaadin Applications With Pure Scala · Scala OO + FP Runs on JVM and fully compatible with...

Post on 17-Jul-2020

8 views 0 download

Transcript of Building Vaadin Applications With Pure Scala · Scala OO + FP Runs on JVM and fully compatible with...

Henri KerolaVaadin Expert at Vaadin Ltd

Building Vaadin Applications With

Pure Scala

26. lokakuuta 12

? 26. lokakuuta 12

Vaadin is a UI framework

for rich web applications

26. lokakuuta 12

26. lokakuuta 12

htmljava

26. lokakuuta 12

26. lokakuuta 12

26. lokakuuta 12

Internet ExplorerChromeFirefoxSafariOpera

iOSAndroid

26. lokakuuta 12

Nobrowserplugins

Nothing toinstall

26. lokakuuta 12

Scala

26. lokakuuta 12

Scala

OO + FP

Runs on JVM and fully compatible with Java

A programming language created by Martin Odersky

26. lokakuuta 12

Type inference

Statically typed

val hello = "Hello World!" // type is Stringval hello: String = "Hello World!"

var i = 3 // type is Inti = "hi!" // doesn’t work

26. lokakuuta 12

Compact

public class Person { private final String name; private final int age; public Person(String name, int age) { this.name = name; this.age = age; }

public String getName() { return name; }

public int getAge() { return age; }}

class Person(val name: String, val age: Int)

26. lokakuuta 12

Compact

List<Person> persons = ...List<Person> adults = new ArrayList<Person>();for (Person person : persons) { if (person.getAge() >= 18) { adults.add(person); }}

val persons = ...val adults = persons.filter(_.age >= 18)

26. lokakuuta 12

OK, you can use Vaadin Framework

with Scala, but...

26. lokakuuta 12

class MyApplication extends Application { def init() { setMainWindow(new Window)

val button = new Button("Click", new Button.ClickListener { def buttonClick(event: Button#ClickEvent) { getMainWindow.showNotification("Button clicked!") } }) getMainWindow.addComponent(b) }}

26. lokakuuta 12

Verbose

Listeners as anonymous inner classes

Java style API

26. lokakuuta 12

Scaladin

26. lokakuuta 12

Pure and compact Scala API for Vaadin Framework

26. lokakuuta 12

By wrapping Vaadin API

26. lokakuuta 12

Wrappingpackage vaadin.scala

class Button extends AbstractField { val p = new com.vaadin.ui.Button def disableOnClick: Boolean = p.isDisableOnClick def disableOnClick_=(disableOnClick: Boolean) = p.setDisableOnClick(disableOnClick)

}

val button = new Buttonbutton.disableOnClick = trueval bisableOnClick = button.disableOnClick

26. lokakuuta 12

Table

AbstractSelect

AbstractField

AbstractComponent

com.vaadin.ui

Table

AbstractSelect

AbstractField

AbstractComponent

vaadin.scala

26. lokakuuta 12

final Table table = new Table();table.setSizeFull();table.setImmediate(true);table.setSelectable(true);table.setContainerDataSource(createContainer());table.addListener(new ValueChangeListener() {

@Overridepublic void valueChange(ValueChangeEvent e) {

System.out.println("Table" + e.getProperty() + "clicked!"); }

});

val table = new Tabletable.sizeFull()table.immediate = truetable.selectionMode = SelectionMode.Singletable.valueChangeListeners += { e => println("Table " + e.property + " clicked!") }

val table = new Table { sizeFull() immediate = true selectionMode = SelectionMode.Single container = createContainer valueChangeListeners += { e => println("Table " + e.property + " clicked!") }}

val table = new Table { sizeFull() immediate = true selectionMode = SelectionMode.Single container = createContainer valueChangeListeners += { e: ValueChangeEvent => println("Table " + e.property + " clicked!") }}

val table = new Table { sizeFull() immediate = true selectionMode = SelectionMode.Single container = createContainer valueChangeListeners += { e: ValueChangeEvent => println("Table clicked!") }}

val table = new Table { sizeFull() immediate = true selectionMode = SelectionMode.Single container = createContainer valueChangeListeners += { println("Table clicked!") }}

26. lokakuuta 12

VerticalLayout layout = new VerticalLayout();layout.setSizeFull(); final Button edit = new Button("Edit row");

final Table table = new Table();table.setSizeFull(); table.addListener(new ValueChangeListener() { @Override public void valueChange(ValueChangeEvent event) { edit.setEnabled(table.getValue() != null); }});layout.addComponent(table);layout.setExpandRatio(table, 1);layout.addComponent(edit);layout.setComponentAlignment(edit, BOTTOM_RIGHT);

val layout = new VerticalLayout { sizeFull() add(new Table { sizeFull() valueChangeListeners += { edit.enabled = value.isDefined } }, ratio = 1) val edit = add(Button("Edit"), alignment = BottomRight)}

26. lokakuuta 12

Example

26. lokakuuta 12

26. lokakuuta 12

26. lokakuuta 12

Tools

Scaladin 2.1.0 “JDD” ja Vaadin 6.8.4

Eclipse and Scala IDE

Scala 2.9 (and Java)

26. lokakuuta 12

Tools

Akka

SBT (Simple Build Tool)

26. lokakuuta 12

https://github.com/henrikerola/scaladinQuestions?Comments?

henri.kerola@vaadin.com @henrikerola

26. lokakuuta 12