Skip to content

Commit 086cd35

Browse files
committed
implemented DesktopPane and InternalFrame
1 parent 07ce708 commit 086cd35

File tree

3 files changed

+205
-0
lines changed

3 files changed

+205
-0
lines changed
Lines changed: 64 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,64 @@
1+
package scala.swing
2+
3+
import javax.swing.JDesktopPane
4+
5+
import scala.collection.immutable
6+
7+
8+
/**
9+
* A pane that can host nested internal windows (represented by [[InternalFrame]]).
10+
*/
11+
class DesktopPane extends Component with SequentialContainer.Wrapper {
12+
import DesktopPane._
13+
14+
override lazy val peer : JDesktopPane = new JDesktopPane with SuperMixin
15+
16+
/**
17+
* Returns all internal frames in this pane, including iconified ones.
18+
*
19+
* @return a list of internal frames.
20+
*/
21+
def frames : immutable.Seq[InternalFrame] =
22+
peer.getAllFrames.toSeq.view.map(UIElement.cachedWrapper[InternalFrame]).toVector
23+
24+
/**
25+
* Returns the currently selected frame, if one is selected.
26+
*
27+
* @return the currently selected frame, or `None` if none is selected.
28+
*/
29+
def selectedFrame : Option[InternalFrame] =
30+
Option(peer.getSelectedFrame).map(UIElement.cachedWrapper[InternalFrame])
31+
32+
/**
33+
* Indicates how dragged frames will be animated.
34+
*
35+
* @return either `LiveDragMode` or `OutlineDragMode`.
36+
*/
37+
def dragMode : DragMode = DragMode(peer.getDragMode)
38+
39+
/**
40+
* Specifies how dragged frames will be animated.
41+
*
42+
* @param newMode either `LiveDragMode` or `OutlineDragMode`.
43+
*/
44+
def dragMode_= (newMode : DragMode) : Unit = peer.setDragMode(newMode.intValue)
45+
}
46+
47+
48+
object DesktopPane {
49+
50+
/**
51+
* Indicates how an internal frame will be animated as it is dragged.
52+
*/
53+
final case class DragMode(intValue : Int)
54+
55+
/**
56+
* Indicates that a dragged internal frame will be animated with its contents.
57+
*/
58+
val LiveDragMode: DragMode = DragMode(JDesktopPane.LIVE_DRAG_MODE)
59+
60+
/**
61+
* Indicates that a dragged internal frame will only render as an outline.
62+
*/
63+
val OutlineDragMode: DragMode = DragMode(JDesktopPane.OUTLINE_DRAG_MODE)
64+
}
Lines changed: 115 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,115 @@
1+
package scala.swing
2+
3+
import javax.swing.{Icon, JInternalFrame, WindowConstants}
4+
5+
import scala.swing.MenuBar.NoMenuBar
6+
import scala.swing.event.{InternalFrameActivated, InternalFrameClosed, InternalFrameClosing, InternalFrameDeactivated, InternalFrameDeiconified, InternalFrameIconified, InternalFrameOpened}
7+
8+
9+
/**
10+
* A window that can be nested inside another window (typically within a [[DesktopPane]]).
11+
*/
12+
class InternalFrame extends Component with RootPanel with Publisher { outer =>
13+
import javax.swing.event.{InternalFrameEvent => PeerEvent, InternalFrameListener => PeerListener}
14+
15+
override lazy val peer: JInternalFrame = new JInternalFrame with InterfaceMixin
16+
peer.setDefaultCloseOperation(WindowConstants.DO_NOTHING_ON_CLOSE)
17+
18+
trait InterfaceMixin extends JInternalFrame with SuperMixin {
19+
override def doDefaultCloseAction(): Unit = {
20+
super.doDefaultCloseAction()
21+
closeOperation()
22+
}
23+
}
24+
25+
def title: String = peer.getTitle
26+
def title_=(s: String): Unit = peer.setTitle(s)
27+
28+
/**
29+
* The menu bar of this frame or [[NoMenuBar]] if no menu bar is set.
30+
*/
31+
def menuBar: MenuBar =
32+
peer.getJMenuBar match {
33+
case null => NoMenuBar
34+
case m => UIElement.wrap(m).asInstanceOf[MenuBar]
35+
}
36+
37+
/**
38+
* Set the current menu bar of this frame. Pass `NoMenuBar` if this frame
39+
* should not show a menu bar.
40+
*/
41+
def menuBar_=(m: MenuBar): Unit =
42+
peer.setJMenuBar(if (m == MenuBar.NoMenuBar) null else m.peer)
43+
44+
def resizable_=(b: Boolean): Unit = peer.setResizable(b)
45+
def resizable: Boolean = peer.isResizable
46+
47+
def maximizable : Boolean = peer.isMaximizable
48+
def maximizable_= (b : Boolean) : Unit = peer.setMaximizable(b)
49+
50+
def maximized : Boolean = peer.isMaximum
51+
def maximize() : Unit = peer.setMaximum(true)
52+
def unmaximize() : Unit = peer.setMaximum(false)
53+
54+
def location_=(p: Point): Unit = peer.setLocation(p)
55+
def size_=(size: Dimension): Unit = peer.setSize(size)
56+
def bounds_=(rect: Rectangle): Unit = peer.setBounds(rect)
57+
58+
def closable : Boolean = peer.isClosable
59+
def closable_= (b : Boolean): Unit = peer.setClosable(b)
60+
61+
def closed : Boolean = peer.isClosed
62+
def close() : Unit = peer.setClosed(true)
63+
64+
def iconifiable : Boolean = peer.isIconifiable
65+
def iconifiable_= (b : Boolean) : Unit = peer.setIconifiable(b)
66+
67+
def iconified : Boolean = peer.isIcon
68+
def iconify() : Unit = peer.setIcon(true)
69+
def uniconify() : Unit = peer.setIcon(false)
70+
71+
def frameIcon : Icon = peer.getFrameIcon
72+
def frameIcon_= (icon : Icon) : Unit = peer.setFrameIcon(icon)
73+
74+
def dispose(): Unit = peer.dispose()
75+
76+
def pack(): this.type = { peer.pack(); this }
77+
78+
def show() : Unit = peer.show()
79+
def hide() : Unit = peer.hide()
80+
81+
def moveToBack() : Unit = peer.moveToBack()
82+
def moveToFront() : Unit = peer.moveToFront()
83+
84+
def layer : Int = peer.getLayer
85+
def layer_= (n : Int) : Unit = peer.setLayer(n)
86+
87+
def selected : Boolean = peer.isSelected
88+
def select() : Unit = peer.setSelected(true)
89+
def deselect() : Unit = peer.setSelected(false)
90+
91+
/**
92+
* This method is called when the window is closing, after all other window
93+
* event listeners have been processed.
94+
*
95+
* Default behavior is to dispose of the internal frame, but other options include hiding the frame
96+
* or doing nothing at all.
97+
*/
98+
def closeOperation(): Unit = dispose()
99+
100+
peer.addInternalFrameListener(new PeerListener {
101+
override def internalFrameOpened(e: PeerEvent): Unit = publish(InternalFrameOpened(outer))
102+
103+
override def internalFrameClosing(e: PeerEvent): Unit = publish(InternalFrameClosing(outer))
104+
105+
override def internalFrameClosed(e: PeerEvent): Unit = publish(InternalFrameClosed(outer))
106+
107+
override def internalFrameIconified(e: PeerEvent): Unit = publish(InternalFrameIconified(outer))
108+
109+
override def internalFrameDeiconified(e: PeerEvent): Unit = publish(InternalFrameDeiconified(outer))
110+
111+
override def internalFrameActivated(e: PeerEvent): Unit = publish(InternalFrameActivated(outer))
112+
113+
override def internalFrameDeactivated(e: PeerEvent): Unit = publish(InternalFrameDeactivated(outer))
114+
})
115+
}
Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
package scala.swing.event
2+
3+
import scala.swing.InternalFrame
4+
5+
6+
/**
7+
* Base class for events generated by instances of [[InternalFrame]].
8+
*
9+
* @param source the `InternalFrame` that generated the event.
10+
*/
11+
abstract class InternalFrameEvent(override val source : InternalFrame) extends UIEvent
12+
13+
case class InternalFrameOpened(override val source : InternalFrame) extends InternalFrameEvent(source)
14+
15+
case class InternalFrameClosing(override val source : InternalFrame) extends InternalFrameEvent(source)
16+
17+
case class InternalFrameClosed(override val source : InternalFrame) extends InternalFrameEvent(source)
18+
19+
case class InternalFrameIconified(override val source : InternalFrame) extends InternalFrameEvent(source)
20+
21+
case class InternalFrameDeiconified(override val source : InternalFrame) extends InternalFrameEvent(source)
22+
23+
case class InternalFrameActivated(override val source : InternalFrame) extends InternalFrameEvent(source)
24+
25+
case class InternalFrameDeactivated(override val source : InternalFrame) extends InternalFrameEvent(source)
26+

0 commit comments

Comments
 (0)