summaryrefslogtreecommitdiff
path: root/src/main/java/utils/VSFrame.java
blob: 818a72d29d0391731503538de75464724b92539c (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
package utils;

import java.awt.Component;
import java.awt.Dimension;
import java.awt.Point;
import java.awt.Toolkit;
import java.awt.Window;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;

import javax.swing.JFrame;

/**
 * The class VSFrame. All frames of the simulator extend this VSFrame class.
 * This class makes sure that all 'subwindows' get closed if its parent gets
 * closed. And it also makes sure to open new windows relative to its parent.
 *
 * @author Paul C. Buetow
 */
public class VSFrame extends JFrame {
    /** The serial version uid */
    private static final long serialVersionUID = 1L;

    /** The Constant X_LOCATION_OFFSET. */
    private final static int X_LOCATION_OFFSET = 40;

    /** The Constant Y_LOCATION_OFFSET. */
    private final static int Y_LOCATION_OFFSET = 80;

    /** The parent window/component. */
    private Component parent;

    /** True, if the current window will get disposed with its parent.  */
    private boolean dispose;

    /**
     * Instantiates a VSFrame object.
     *
     * @param title the title
     * @param parent the parent
     */
    public VSFrame(String title, Component parent) {
        super(title);
        init(parent);
    }

    /**
     * Instantiates a new VSFrame object.
     *
     * @param title the title
     */
    public VSFrame(String title) {
        super(title);
        init(null);
    }

    /**
     * Inits the VSFrame.
     *
     * @param parent the parent
     */
    private void init(Component parent) {
        this.parent = parent;
        this.dispose = false;
    }

    /**
     * Dispose with its parent.
     */
    public void disposeWithParent() {
        if (!dispose && parent != null && parent instanceof Window) {
            Window window = (Window) parent;
            window.addWindowListener(new WindowAdapter() {
                public void windowClosed(WindowEvent we) {
                    VSFrame.this.dispose();
                }
            });
        }
        dispose = true;
    }

    /**
     * Sets the correct location of the window.
     */
    private void setCorrectLocation() {
        int x = 0, y = 0;
        final Dimension screenSize =
            Toolkit.getDefaultToolkit().getScreenSize();

        if (parent == null) {
            x = (int) (screenSize.width - getWidth()) / 2;
            y = 50;//(int) (screenSize.height - getHeight()) / 2;

        } else {
            final Point location = parent.getLocation();
            x = (int) location.getX() + X_LOCATION_OFFSET;
            y = (int) location.getY() + Y_LOCATION_OFFSET;
        }

        if (x + super.getWidth() >= screenSize.width)
            x = screenSize.width - super.getWidth();
        else if (x < 0)
            x = 0;

        if (y + super.getHeight() >= screenSize.height)
            y = screenSize.height - super.getHeight();

        super.setLocation(x, y);
    }

    /* (non-Javadoc)
     * @see java.awt.Window#setSize(int, int)
     */
    public void setSize(int width, int height) {
        super.setSize(width, height);
        setCorrectLocation();
    }
}