summaryrefslogtreecommitdiffstats
path: root/documentation/getting-started/getting-started-scala.asciidoc
diff options
context:
space:
mode:
Diffstat (limited to 'documentation/getting-started/getting-started-scala.asciidoc')
-rw-r--r--documentation/getting-started/getting-started-scala.asciidoc113
1 files changed, 113 insertions, 0 deletions
diff --git a/documentation/getting-started/getting-started-scala.asciidoc b/documentation/getting-started/getting-started-scala.asciidoc
new file mode 100644
index 0000000000..1da94d0853
--- /dev/null
+++ b/documentation/getting-started/getting-started-scala.asciidoc
@@ -0,0 +1,113 @@
+---
+title: Using Vaadin with Scala
+order: 10
+layout: page
+---
+
+[[getting-started.scala]]
+= Using Vaadin with Scala
+
+You can use Vaadin with any JVM compatible language, such as Scala or Groovy.
+There are, however, some caveats related to libraries and project set-up. In the
+following, we give instructions for creating a Scala UI in Eclipse, with the
+Scala IDE for Eclipse and the Vaadin Plugin for Eclipse.
+
+. Install the link:http://scala-ide.org/[Scala IDE for Eclipse], either from an
+Eclipse update site or as a bundled Eclipse distribution.
+
+. Open an existing Vaadin Java project or create a new one as outlined in
+<<dummy/../../../framework/getting-started/getting-started-first-project#getting-started.first-project,"Creating
+and Running a Project with Eclipse">>. You can delete the UI class created by
+the wizard.
+
+. Switch to the Scala perspective by clicking the perspective in the upper-right
+corner of the Eclipse window.
+
+. Right-click on the project folder in [guilabel]#Project Explorer# and select
+"Configure > Add Scala Nature".
+
+. The web application needs [filename]#scala-library.jar# in its class path. If
+using Scala IDE, you can copy it from somewhere under your Eclipse installation
+to the class path of the web application, that is, either to the
+[filename]#WebContent/WEB-INF/lib# folder in the project or to the library path
+of the application server. If copying outside Eclipse to a project, refresh the
+project by selecting it and pressing F5.
+
++
+You could also get it with an Ivy or Maven dependency, just make sure that the
+version is same as what the Scala IDE uses.
+
+
+You should now be able to create a Scala UI class, such as the following:
+
+
+[source, scala]
+----
+@Theme("mytheme")
+class MyScalaUI extends UI {
+ override def init(request: VaadinRequest) = {
+ val content: VerticalLayout = new VerticalLayout
+ setContent(content)
+
+ val label: Label = new Label("Hello, world!")
+ content addComponent label
+
+ // Handle user interaction
+ content addComponent new Button("Click Me!",
+ new ClickListener {
+ override def buttonClick(event: ClickEvent) =
+ Notification.show("The time is " + new Date)
+ })
+ }
+}
+----
+
+Eclipse and Scala IDE should be able to import the Vaadin classes automatically
+when you press CtrlShiftO.
+
+You need to define the Scala UI class either in a servlet class (in Servlet 3.0
+project) or in a [filename]#web.xml# deployment descriptor, just like described
+in
+<<dummy/../../../framework/getting-started/getting-started-first-project#getting-started.first-project.exploring,"Exploring
+the Project">> for Java UIs.
+
+ifdef::web[]
+The link:https://github.com/henrikerola/scaladin[Scaladin add-on] offers a more
+Scala-like API for Vaadin. A Vaadin 7 compatible version is under development.
+endif::web[]
+
+ifdef::web[]
+[[getting-started.scala.lambdas]]
+== Defining Listeners with Lambda Expressions
+
+Scala does not support use of lambda expressions for calling functional
+interfaces, like Java 8 does. Hence, we can't just use a lambda expression for
+the [interfacename]#ClickListener# in the example above. You can, however,
+define implicit conversions from lambda expressions to such interface
+implementations. For example, for click listeners:
+
+
+[source, scala]
+----
+implicit def clickListener(f: ClickEvent => Unit) =
+ new ClickListener {
+ override def buttonClick(event: ClickEvent) {
+ f(event)
+ }
+ }
+----
+
+You could then use a lambda expression as follows:
+
+
+[source, scala]
+----
+content addComponent new Button("Click Me!",
+ (event: ClickEvent) =>
+ Notification.show("The time is " + new Date))
+----
+
+endif::web[]
+
+
+