Anonymous avatar Anonymous committed 9ff1d18

DialogLayout DSL

Comments (0)

Files changed (1)

src/de/matthiasmann/twlscala/DialogLayout.scala

+/*
+ * Copyright (c) 2008-2009, Matthias Mann
+ *
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ *     * Redistributions of source code must retain the above copyright notice,
+ *       this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above copyright
+ *       notice, this list of conditions and the following disclaimer in the
+ *       documentation and/or other materials provided with the distribution.
+ *     * Neither the name of Matthias Mann nor the names of its contributors may
+ *       be used to endorse or promote products derived from this software
+ *       without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+ * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+package de.matthiasmann.twlscala
+
+import twlinternal._
+import de.matthiasmann.twl.{Widget=>TWLWidget, DialogLayout=>TWLDialogLayout}
+
+class DialogLayout extends TWLDialogLayout with ThemeSupport {
+    theme = "dialoglayout"
+
+    type TWLGroup = TWLDialogLayout#Group
+    
+    sealed abstract class Gap
+    case object Filler extends Gap
+    case object SmallGap extends Gap
+    case object MediumGap extends Gap
+    case object LargeGap extends Gap
+    case object DefaultGap extends Gap
+    case class FixedGap(size:Int) extends Gap { require(size >= 0) }
+
+    abstract class GroupWrapper {
+        def underlaying:TWLGroup
+        protected def addGap(g:Gap):Unit =  g match {
+            case Filler      => underlaying.addGap
+            case SmallGap    => underlaying.addGap(TWLDialogLayout.SMALL_GAP)
+            case MediumGap   => underlaying.addGap(TWLDialogLayout.MEDIUM_GAP)
+            case LargeGap    => underlaying.addGap(TWLDialogLayout.LARGE_GAP)
+            case DefaultGap  => underlaying.addGap(TWLDialogLayout.DEFAULT_GAP)
+            case FixedGap(s) => underlaying.addGap(s)
+        }
+    }
+    class ParallelGroupWrapper(val underlaying:TWLGroup) extends GroupWrapper {
+        def || (w:TWLWidget)    = { underlaying.addWidget(w); this }
+        def || (g:Gap)          = { addGap(g); this }
+        def || (g:GroupWrapper) = { underlaying.addGroup(g.underlaying); this }
+    }
+
+    class SequentialGroupWrapper(val underlaying:TWLGroup) extends GroupWrapper {
+        def -- (w:TWLWidget)    = { underlaying.addWidget(w); this }
+        def -- (g:Gap)          = { addGap(g); this }
+        def -- (g:GroupWrapper) = { underlaying.addGroup(g.underlaying); this }
+    }
+
+    implicit def makeparallelgroup(w:TWLWidget) = new ParallelGroupWrapper(createParallelGroup) || w
+    implicit def makesequentialgroup(w:TWLWidget) = new SequentialGroupWrapper(createSequentialGroup) -- w
+    implicit def makeparallelgroup(g:SequentialGroupWrapper) = new ParallelGroupWrapper(createParallelGroup) || g
+    implicit def makesequentialgroup(g:ParallelGroupWrapper) = new SequentialGroupWrapper(createSequentialGroup) -- g
+
+    def horizontalGroup = getHorizontalGroup
+    def horizontalGroup_= (g:GroupWrapper) { setHorizontalGroup(g.underlaying) }
+
+    def verticalGroup = getVerticalGroup
+    def verticalGroup_= (g:GroupWrapper) { setVerticalGroup(g.underlaying) }
+}
Tip: Filter by directory path e.g. /media app.js to search for public/media/app.js.
Tip: Use camelCasing e.g. ProjME to search for ProjectModifiedEvent.java.
Tip: Filter by extension type e.g. /repo .js to search for all .js files in the /repo directory.
Tip: Separate your search with spaces e.g. /ssh pom.xml to search for src/ssh/pom.xml.
Tip: Use ↑ and ↓ arrow keys to navigate and return to view the file.
Tip: You can also navigate files with Ctrl+j (next) and Ctrl+k (previous) and view the file with Ctrl+o.
Tip: You can also navigate files with Alt+j (next) and Alt+k (previous) and view the file with Alt+o.