2020import java .awt .*;
2121import java .awt .event .ActionEvent ;
2222import java .awt .event .ActionListener ;
23+ import java .awt .event .MouseAdapter ;
24+ import java .awt .event .MouseEvent ;
25+ import java .awt .event .MouseMotionListener ;
2326import java .awt .event .WindowAdapter ;
2427import java .awt .event .WindowEvent ;
2528import java .lang .System ;
@@ -31,19 +34,64 @@ public class LayoutFrame extends JFrame {
3134 private String windowName ;
3235 private ChannelClient channelClient ;
3336 private String appUuid ;
37+ private boolean frameless ;
3438
3539 public LayoutFrame (DesktopConnection desktopConnection , String appUuid , String windowName ) throws DesktopException {
40+ this (desktopConnection , appUuid , windowName , false );
41+ }
42+
43+ public LayoutFrame (DesktopConnection desktopConnection , String appUuid , String windowName , boolean frameless ) throws DesktopException {
3644 super ();
3745 System .out .println (windowName + " being created " );
3846 this .appUuid = appUuid ;
3947 this .windowName = windowName ;
48+ this .frameless = frameless ;
4049 this .setDefaultCloseOperation (JFrame .DO_NOTHING_ON_CLOSE );
4150 this .setPreferredSize (new Dimension (640 , 480 ));
4251 JPanel pnl = new JPanel (new FlowLayout (FlowLayout .CENTER ));
4352 this .btnUndock = new JButton ("undock" );
4453 this .btnUndock .setEnabled (false );
4554 pnl .add (btnUndock );
4655 this .getContentPane ().add (pnl );
56+
57+ if (frameless ) {
58+ this .setUndecorated (true );
59+ JPanel titleBar = new JPanel (new BorderLayout ());
60+ titleBar .setBackground (Color .DARK_GRAY );
61+ MouseAdapter myListener = new MouseAdapter () {
62+ int pressedAtX , pressedAtY ;
63+ @ Override
64+ public void mousePressed (MouseEvent e ) {
65+ pressedAtX = e .getX ();
66+ pressedAtY = e .getY ();
67+ System .out .println ("mouse pressed at x=" + pressedAtX + ", y=" + pressedAtY );
68+ }
69+
70+ @ Override
71+ public void mouseDragged (MouseEvent e ) {
72+ int distanceX = e .getX () - pressedAtX ;
73+ int distanceY = e .getY () - pressedAtY ;
74+ System .out .println ("dragged x=" + distanceX + ", y=" + distanceY );
75+ Point frameLocation = LayoutFrame .this .getLocation ();
76+ LayoutFrame .this .setLocation (frameLocation .x + distanceX , frameLocation .y + distanceY );
77+ }
78+ };
79+ titleBar .addMouseListener (myListener );
80+ titleBar .addMouseMotionListener (myListener );
81+
82+ JButton btnClose = new JButton ("X" );
83+ btnClose .addActionListener (new ActionListener () {
84+
85+ @ Override
86+ public void actionPerformed (ActionEvent e ) {
87+ LayoutFrame .this .dispose ();
88+ }});
89+ titleBar .add (btnClose , BorderLayout .EAST );
90+
91+ this .getContentPane ().add (titleBar , BorderLayout .NORTH );
92+
93+ }
94+
4795 this .pack ();
4896 this .setLocationRelativeTo (null );
4997 this .setVisible (true );
@@ -152,33 +200,35 @@ public void onError(Ack ack) {
152200 }
153201
154202 private void setHasFrame (JFrame frame , boolean hasFrame ) {
155- SwingUtilities .invokeLater (new Runnable () {
156- @ Override
157- public void run () {
158- System .out .println (windowName + " hasFrame=" + hasFrame );
159-
160- Dimension size = frame .getSize ();
161- WinDef .HWND hWnd = new WinDef .HWND ();
162- hWnd .setPointer (Native .getComponentPointer (frame ));
163-
164- int style = User32 .INSTANCE .GetWindowLong (hWnd , User32 .GWL_STYLE );
165-
166- if (hasFrame ) {
167- frame .setResizable (true );
168- // style = style & ~User32.WS_CHILD;
169- style = style | User32 .WS_CAPTION | User32 .WS_BORDER | User32 .WS_THICKFRAME ;
170- } else {
171- frame .setResizable (false );
172- style = style &~ User32 .WS_CAPTION &~ User32 .WS_BORDER &~ User32 .WS_THICKFRAME ;
173- // style = style | User32.WS_CHILD;
203+ if (!this .frameless ) {
204+ SwingUtilities .invokeLater (new Runnable () {
205+ @ Override
206+ public void run () {
207+ System .out .println (windowName + " hasFrame=" + hasFrame );
208+
209+ Dimension size = frame .getSize ();
210+ WinDef .HWND hWnd = new WinDef .HWND ();
211+ hWnd .setPointer (Native .getComponentPointer (frame ));
212+
213+ int style = User32 .INSTANCE .GetWindowLong (hWnd , User32 .GWL_STYLE );
214+
215+ if (hasFrame ) {
216+ frame .setResizable (true );
217+ // style = style & ~User32.WS_CHILD;
218+ style = style | User32 .WS_CAPTION | User32 .WS_BORDER | User32 .WS_THICKFRAME ;
219+ } else {
220+ frame .setResizable (false );
221+ style = style &~ User32 .WS_CAPTION &~ User32 .WS_BORDER &~ User32 .WS_THICKFRAME ;
222+ // style = style | User32.WS_CHILD;
223+ }
224+ User32 .INSTANCE .SetWindowLong (hWnd , User32 .GWL_STYLE , style );
225+ User32 .INSTANCE .RedrawWindow (hWnd , null , null , new WinDef .DWORD ((User32 .RDW_FRAME | User32 .RDW_INVALIDATE )));
226+ frame .setSize (size .width , size .height + 1 );
227+ frame .invalidate ();
228+ frame .repaint ();
174229 }
175- User32 .INSTANCE .SetWindowLong (hWnd , User32 .GWL_STYLE , style );
176- User32 .INSTANCE .RedrawWindow (hWnd , null , null , new WinDef .DWORD ((User32 .RDW_FRAME | User32 .RDW_INVALIDATE )));
177- frame .setSize (size .width , size .height + 1 );
178- frame .invalidate ();
179- frame .repaint ();
180- }
181- });
230+ });
231+ }
182232 }
183233
184234 public String getWindowName () {
0 commit comments