aboutsummaryrefslogtreecommitdiff
path: root/Week15 Mandelbrot/src/com/camilstaps/mandelbrot/Textfields.java
blob: 78098d1a1c4e48d5823c49b5c84c90483eb1ce7d (plain) (blame)
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
119
120
121
122
123
124
125
126
127
/*
 * Copyright (c) 2015 Camil Staps
 */
package com.camilstaps.mandelbrot;

import java.awt.BorderLayout;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.Observable;
import java.util.Observer;
import javax.swing.JButton;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JTextField;

/**
 *
 * @author camilstaps
 */
public class Textfields extends JPanel implements Observer {

    private final FractalModel fractalModel;
    
    private final String INITIAL_CENTER_X = "0",
            INITIAL_CENTER_Y = "0",
            INITIAL_SCALE = "0.5",
            INITIAL_REPETITIONS = "100";
    
    private final JTextField field_centerX = new JTextField(INITIAL_CENTER_X, 6);
    private final JTextField field_centerY = new JTextField(INITIAL_CENTER_Y, 6);
    private final JTextField field_scale = new JTextField(INITIAL_SCALE, 6);
    private final JTextField field_repetitions = new JTextField(INITIAL_REPETITIONS, 6);
    private final JButton button_redraw = new JButton("Redraw");
    private final JButton button_reset = new JButton("Reset");
    
    public Textfields(FractalModel fractalModel) {
        super(new BorderLayout());
        
        this.fractalModel = fractalModel;
        fractalModel.addObserver(this);
        
        setupControls();
    }
    
    private void setupControls() {
        JPanel panel = new JPanel(new GridLayout(10,1));
        
        panel.add(new JLabel("Center x:"));
        panel.add(field_centerX);
        
        panel.add(new JLabel("Center y:"));
        panel.add(field_centerY);
        
        panel.add(new JLabel("Scale:"));
        panel.add(field_scale);
        
        panel.add(new JLabel("Repetitions:"));
        panel.add(field_repetitions);
        
        button_redraw.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent ae) {
                if (ae.getActionCommand().equals("Redraw")) {
                    fractalModel.setBorders(getStartX(), getEndX(), getStartY(), getEndY());
                }
            }
        });
        panel.add(button_redraw);
        
        button_reset.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent ae) {
                field_centerX.setText(INITIAL_CENTER_X);
                field_centerY.setText(INITIAL_CENTER_Y);
                field_scale.setText(INITIAL_SCALE);
                field_repetitions.setText(INITIAL_REPETITIONS);
                
                button_redraw.doClick();
            }
        });
        panel.add(button_reset);
        
        add(panel, BorderLayout.NORTH);
        add(new JPanel(), BorderLayout.CENTER);
    }
    
    @Override
    public int getWidth() {
        return 100;
    }
    
    protected double getStartX() {
        double width = 1 / Double.parseDouble(field_scale.getText());
        double center = Double.parseDouble(field_centerX.getText());
        return center - width / 2;
    }
    
    protected double getEndX() {
        double width = 1 / Double.parseDouble(field_scale.getText());
        double center = Double.parseDouble(field_centerX.getText());
        return center + width / 2;
    }
    
    protected double getStartY() {
        double height = 1 / Double.parseDouble(field_scale.getText());
        double center = Double.parseDouble(field_centerY.getText());
        return center - height / 2;
    }
    
    protected double getEndY() {
        double height = 1 / Double.parseDouble(field_scale.getText());
        double center = Double.parseDouble(field_centerY.getText());
        return center + height / 2;
    }

    @Override
    public void update(Observable o, Object o1) {
        field_centerX.setText(Float.toString((float) 
                ((fractalModel.getEndX() - fractalModel.getStartX()) / 2 + fractalModel.getStartX())));
        field_centerY.setText(Float.toString((float) 
                ((fractalModel.getEndY() - fractalModel.getStartY()) / 2 + fractalModel.getStartY())));
        field_scale.setText(Float.toString((float) 
                (1 / (fractalModel.getEndX() - fractalModel.getStartX()))));
    }
    
}