package observer.nonpattern;
import java.awt.Color;
import java.awt.Graphics;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.Vector;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JSlider;
import javax.swing.border.TitledBorder;
import javax.swing.event.ChangeEvent;
import javax.swing.event.ChangeListener;
import observer.CourseRecord;
import observer.LayoutConstants;
/**
* Presents a barchart view of a set of courses and their marks. No pattern is
* used in this program.
*/
@SuppressWarnings("serial")
public class CourseViewer extends JFrame implements ActionListener,
ChangeListener {
/**
* Create a CourseViewer object
*/
public CourseViewer() {
this.setTitle("Observer Pattern -- Non Pattern Version");
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
sliders = new Vector<JSlider>();
sliderPanel = new JPanel();
sliderPanel.setLayout(new GridBagLayout());
sliderPanel.setBackground(Color.white);
this.getContentPane().setLayout(new GridBagLayout());
coursePanel = new JPanel();
coursePanel.setBorder(new TitledBorder("Courses"));
coursePanel.setLayout(new GridLayout(0, 1));
GridBagConstraints constraints = new GridBagConstraints();
constraints.fill = GridBagConstraints.BOTH;
scrollPane = new JScrollPane(coursePanel,
JScrollPane.VERTICAL_SCROLLBAR_ALWAYS,
JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED);
// Layout code
constraints.weightx = 0.0;
constraints.weighty = 1.0;
constraints.gridx = 0;
constraints.gridy = 0;
sliderPanel.add(scrollPane, constraints);
button = new JButton("New Course");
button.addActionListener(this);
// Layout code
constraints.weightx = 0.0;
constraints.weighty = 0.0;
constraints.gridy = 1;
sliderPanel.add(button, constraints);
// Layout code
constraints.weightx = 0.0;
constraints.weighty = 0.0;
constraints.gridx = 0;
constraints.gridy = 0;
this.getContentPane().add(sliderPanel, constraints);
// Layout code
constraints.weightx = 1.0;
constraints.weighty = 1.0;
constraints.gridx = 1;
constraints.gridy = 0;
// the bar chart will be drawn over this panel
this.getContentPane().add(new JPanel(), constraints);
this.setVisible(true);
}
/**
* Add a new Course object
*
* @param courseRecord
* the CourseRecord to be added
*/
public void addCourse(CourseRecord courseRecord) {
boolean alreadyExists = false;
for (int i = 0; i < sliders.size(); i++) {
JSlider slider = sliders.elementAt(i);
if (slider.getName().equals(courseRecord.getName())) {
alreadyExists = true;
JOptionPane
.showMessageDialog(
null,
"Warning: Attempt to add new course with an already existing name",
"alert", JOptionPane.ERROR_MESSAGE);
i = sliders.size(); // exit the loop
}
}
if (!alreadyExists) { // add the slider
JSlider slider = new JSlider();
slider.setBackground(Color.white);
slider.setName(courseRecord.getName());
slider.setValue(50);
slider.setMinimum(0);
slider.setMaximum(100);
slider.setMajorTickSpacing(25);
slider.setMinorTickSpacing(5);
slider.setPaintTicks(true);
slider.setPaintLabels(true);
slider.setBorder(new TitledBorder(courseRecord.getName()));
slider.addChangeListener(this);
coursePanel.add(slider);
coursePanel.revalidate();
sliders.addElement(slider);
this.setSize(LayoutConstants.xOffset + 50 + this.sliders.size()
* (LayoutConstants.barWidth + LayoutConstants.barSpacing),
(sliders.size() + 1) * 100 + this.button.getHeight());
this.sliderPanel.revalidate();
this.coursePanel.revalidate();
this.repaint();
this.setVisible(true);
}
}
public void paint(Graphics g) {
super.paint(g);
LayoutConstants.paintBarChartOutline(g, sliders.size());
for (int i = 0; i < sliders.size(); i++) {
JSlider record = sliders.elementAt(i);
g.setColor(LayoutConstants.courseColours[i]);
g.fillRect(
LayoutConstants.xOffset + (i + 1)
* LayoutConstants.barSpacing + i
* LayoutConstants.barWidth, LayoutConstants.yOffset
+ LayoutConstants.graphHeight
- LayoutConstants.barHeight + 2
* (LayoutConstants.maxValue - record.getValue()),
LayoutConstants.barWidth, 2 * record.getValue());
g.setColor(Color.red);
g.drawString(record.getName(),
LayoutConstants.xOffset + (i + 1)
* LayoutConstants.barSpacing + i
* LayoutConstants.barWidth, LayoutConstants.yOffset
+ LayoutConstants.graphHeight + 20);
}
}
/**
* Manages the creation of a new course. Called when "New Course" button is pressed.
*
* @param arg0
* not used
*/
public void actionPerformed(ActionEvent arg0) {
String input = JOptionPane
.showInputDialog("Please enter the new course name:");
if (input != null)
this.addCourse(new CourseRecord(input, 50));
}
/**
* Handles the changing of the marks for a course (changing of a JSlider)
*
* @param arg0
* not used
*/
public void stateChanged(ChangeEvent arg0) {
this.repaint();
}
/**
* Sets up an initial set of three courses
*
* @param args
* not used
*/
public static void main(String[] args) {
CourseViewer viewer = new CourseViewer();
viewer.addCourse(new CourseRecord("Physics", 50));
viewer.addCourse(new CourseRecord("Chemistry", 50));
viewer.addCourse(new CourseRecord("Biology", 50));
}
// Frame contents
private JPanel sliderPanel;
private JPanel coursePanel;
private Vector<JSlider> sliders;
private JScrollPane scrollPane;
private JButton button;
}