alvinalexander.com | career | drupal | java | mac | mysql | perl | scala | uml | unix  

Scala example source code file (RichWindow.scala)

This example Scala source code file (RichWindow.scala) is included in the DevDaily.com "Java Source Code Warehouse" project. The intent of this project is to help you "Learn Java by Example" TM.

Java - Scala tags/keywords

any, awt, boolean, boolean, component, dialog, emptyicon, enumeration, gui, icon, interfacemixin, interfacemixin, richwindow, richwindow, string, string, swing

The Scala RichWindow.scala source code

/*                     __                                               *\
**     ________ ___   / /  ___     Scala API                            **
**    / __/ __// _ | / /  / _ |    (c) 2007-2011, LAMP/EPFL             **
**  __\ \/ /__/ __ |/ /__/ __ |    http://scala-lang.org/               **
** /____/\___/_/ |_/____/_/ | |                                         **
**                          |/                                          **
\*                                                                      */



package scala.swing

import java.awt.{Window => AWTWindow, Frame => AWTFrame}
import javax.swing._
import Swing._

object RichWindow {
  /**
   * Mixin this trait if you want an undecorated window.
   */
  trait Undecorated extends RichWindow {
    // we do a mixin here, since setUndecorated is only allowed to be called
    // when the component is not displayable.
    peer.setUndecorated(true) 
  }
}

/**
 * A window that adds some functionality to the plain Window class and serves as 
 * the common base class for frames and dialogs.
 * 
 * Implementation note: this class is sealed since we need to know that a rich
 * window is either a dialog or a frame at some point.
 */
sealed trait RichWindow extends Window {
  def peer: AWTWindow with InterfaceMixin
  
  trait InterfaceMixin extends super.InterfaceMixin {
    def getJMenuBar(): JMenuBar
    def setJMenuBar(b: JMenuBar)
    def setUndecorated(b: Boolean)
    def setTitle(s: String)
    def getTitle(): String
    def setResizable(b: Boolean)
    def isResizable(): Boolean
  }
  
  def title: String = peer.getTitle
  def title_=(s: String) = peer.setTitle(s)
  
  /**
   * The menu bar of this frame or `NoMenuBar` if no menu bar is set.
   */
  def menuBar: MenuBar = {
      val m = UIElement.cachedWrapper[MenuBar](peer.getJMenuBar)
      if (m != null) m else MenuBar.NoMenuBar 
  }
  /**
   * Set the current menu bar of this frame. Pass `NoMenuBar` if this frame 
   * should not show a menu bar.
   */
  def menuBar_=(m: MenuBar) = 
    peer.setJMenuBar(if(m == MenuBar.NoMenuBar) null else m.peer)
  
  def resizable_=(b: Boolean) { peer.setResizable(b) }
  def resizable = peer.isResizable
}

/**
 * A window with decoration such as a title, border, and action buttons.
 * 
 * An AWT window cannot be wrapped dynamically with this class, i.e., you cannot 
 * write something like new Window { def peer = myAWTWindow }
 * 
 * @see javax.swing.JFrame
 */
class Frame extends RichWindow {
  override lazy val peer: JFrame with InterfaceMixin = new JFrame with InterfaceMixin with SuperMixin
  
  protected trait SuperMixin extends JFrame {
    override protected def processWindowEvent(e: java.awt.event.WindowEvent) {
      super.processWindowEvent(e)
      if (e.getID() == java.awt.event.WindowEvent.WINDOW_CLOSING)
        closeOperation()
    }
  }

  def iconify() { peer.setExtendedState(peer.getExtendedState | AWTFrame.ICONIFIED) }
  def uniconify() { peer.setExtendedState(peer.getExtendedState & ~AWTFrame.ICONIFIED) }
  def iconified() { (peer.getExtendedState & AWTFrame.ICONIFIED) != 0 }
  def maximize() { peer.setExtendedState(peer.getExtendedState | AWTFrame.MAXIMIZED_BOTH) }
  def unmaximize() { peer.setExtendedState(peer.getExtendedState & ~AWTFrame.MAXIMIZED_BOTH) }
  def maximized() { (peer.getExtendedState & AWTFrame.MAXIMIZED_BOTH) != 0 }
  
  def iconImage: Image = peer.getIconImage
  def iconImage_=(i: Image) { peer.setIconImage(i) }
}

/**
 * Simple predefined dialogs.
 * 
 * @see javax.swing.JOptionPane
 */
object Dialog {
  /**
   * The message type of a dialog.
   */
  object Message extends Enumeration {
    val Error = Value(JOptionPane.ERROR_MESSAGE)
    val Info = Value(JOptionPane.INFORMATION_MESSAGE)
    val Warning = Value(JOptionPane.WARNING_MESSAGE)
    val Question = Value(JOptionPane.QUESTION_MESSAGE)
    val Plain = Value(JOptionPane.PLAIN_MESSAGE)
  }
  
  /**
   * The possible answers a user can select.
   */
  object Options extends Enumeration {
    val Default = Value(JOptionPane.DEFAULT_OPTION)
    val YesNo = Value(JOptionPane.YES_NO_OPTION)
    val YesNoCancel = Value(JOptionPane.YES_NO_CANCEL_OPTION)
    val OkCancel = Value(JOptionPane.OK_CANCEL_OPTION)
  }
  
  /**
   * The selected result of dialog.
   */
  object Result extends Enumeration {
    val Yes = Value(JOptionPane.YES_OPTION)
    val Ok = Yes
    val No = Value(JOptionPane.NO_OPTION)
    val Cancel = Value(JOptionPane.CANCEL_OPTION)
    val Closed = Value(JOptionPane.CLOSED_OPTION)
  }
  
  private def uiString(txt: String) = UIManager.getString(txt)
  
  def showConfirmation(parent: Component = null,
                       message: Any, 
                       title: String = uiString("OptionPane.titleText"), 
                       optionType: Options.Value = Options.YesNo, 
                       messageType: Message.Value = Message.Question, 
                       icon: Icon = EmptyIcon): Result.Value =
     Result(JOptionPane.showConfirmDialog(nullPeer(parent), message, title, 
                                   optionType.id, messageType.id, Swing.wrapIcon(icon)))
  
  def showOptions(parent: Component = null, 
                  message: Any, 
                  title: String = uiString("OptionPane.titleText"),  
                  optionType: Options.Value = Options.YesNo, 
                  messageType: Message.Value = Message.Question, 
                  icon: Icon = EmptyIcon, 
                  entries: Seq[Any], 
                  initial: Int): Result.Value = {
    val r = JOptionPane.showOptionDialog(nullPeer(parent), message, title, 
                                   optionType.id, messageType.id, Swing.wrapIcon(icon), 
                                   entries map toAnyRef toArray, entries(initial))
    Result(r)
  }

  def showInput[A](parent: Component = null, 
                   message: Any, 
                   title: String = uiString("OptionPane.inputDialogTitle"),
                   messageType: Message.Value = Message.Question, 
                   icon: Icon = EmptyIcon, 
                   entries: Seq[A] = Nil, 
                   initial: A): Option[A] = {
    val e = if (entries.isEmpty) null
            else entries map toAnyRef toArray
    val r = JOptionPane.showInputDialog(nullPeer(parent), message, title,
        messageType.id, Swing.wrapIcon(icon), 
        e, initial)
        
    toOption[A](r)
  }
  def showMessage(parent: Component = null, 
                  message: Any, 
                  title: String = uiString("OptionPane.messageDialogTitle"), 
                  messageType: Message.Value = Message.Info, 
                  icon: Icon = EmptyIcon) {
     JOptionPane.showMessageDialog(nullPeer(parent), message, title, 
                                   messageType.id, Swing.wrapIcon(icon))
  }
}

/**
 * A dialog window.
 * 
 * @see javax.swing.JDialog
 */
class Dialog(owner: Window) extends RichWindow {
  override lazy val peer: JDialog with InterfaceMixin = 
    if (owner == null) new JDialog with InterfaceMixin
    else owner match {
      case f: Frame => new JDialog(f.peer) with InterfaceMixin
      case d: Dialog => new JDialog(d.peer) with InterfaceMixin
    }
  
  def this() = this(null)
  
  def modal_=(b: Boolean) { peer.setModal(b) }
  def modal = peer.isModal
}

Other Scala examples (source code examples)

Here is a short list of links related to this Scala RichWindow.scala source code file:

... this post is sponsored by my books ...

#1 New Release!

FP Best Seller

 

new blog posts

 

Copyright 1998-2021 Alvin Alexander, alvinalexander.com
All Rights Reserved.

A percentage of advertising revenue from
pages under the /java/jwarehouse URI on this website is
paid back to open source projects.