Source code: mas_gui/IndicatorListener.java
1 /* Copyright 1998 - 2003: Jim Cochrane - see file forum.txt */
2
3 package mas_gui;
4
5 import java.awt.event.*;
6 import java.util.*;
7 import support.*;
8 import graph.DataSet;
9
10 /** Listener for indicator selection */
11 public class IndicatorListener implements ActionListener {
12 public IndicatorListener(Chart c) {
13 chart = c;
14 data_builder = chart.data_builder;
15 main_pane = chart.main_pane;
16 }
17
18 public void actionPerformed(java.awt.event.ActionEvent e) {
19 String selection = e.getActionCommand();
20 DataSet dataset, main_dataset;
21 Configuration conf = Configuration.instance();
22 try {
23 String tradable = chart.current_tradable;
24 if (tradable == null || no_change(selection)) {
25 // If no tradable is selected or the selection hasn't changed,
26 // there is nothing to display.
27 return;
28 }
29 if (! (selection.equals(chart.No_upper_indicator) ||
30 selection.equals(chart.No_lower_indicator) ||
31 selection.equals(chart.Volume) ||
32 selection.equals(chart.Open_interest))) {
33 GUI_Utilities.busy_cursor(true, chart);
34 data_builder.send_indicator_data_request(
35 ((Integer) chart.indicators().get(selection)).intValue(),
36 tradable, chart.current_period_type);
37 GUI_Utilities.busy_cursor(false, chart);
38 }
39 }
40 catch (Exception ex) {
41 chart.fatal("Exception occurred: ", ex);
42 }
43 // Set graph data according to whether the selected indicator is
44 // configured to go in the upper (main) or lower (indicator) graph.
45 if (Configuration.instance().upper_indicators().containsKey(selection))
46 {
47 main_dataset = data_builder.last_market_data();
48 if (! chart.current_upper_indicators.isEmpty() &&
49 chart.replace_indicators) {
50 // Remove the old indicator data from the graph (and the
51 // market data).
52 main_pane.clear_main_graph();
53 // Re-attach the market data.
54 chart.link_with_axis(main_dataset, null);
55 main_pane.add_main_data_set(main_dataset);
56 chart.current_upper_indicators.removeAllElements();
57 }
58 chart.current_upper_indicators.addElement(selection);
59 dataset = data_builder.last_indicator_data();
60 dataset.set_dates_needed(false);
61 dataset.set_color(conf.indicator_color(selection, true));
62 chart.link_with_axis(dataset, selection);
63 main_pane.add_main_data_set(dataset);
64 }
65 else if (selection.equals(chart.No_upper_indicator)) {
66 // Remove the old indicator and market data from the graph.
67 main_pane.clear_main_graph();
68 // Re-attach the market data without the indicator data.
69 chart.link_with_axis(data_builder.last_market_data(), null);
70 main_pane.add_main_data_set(data_builder.last_market_data());
71 chart.current_upper_indicators.removeAllElements();
72 }
73 else if (selection.equals(chart.No_lower_indicator)) {
74 main_pane.clear_indicator_graph();
75 chart.current_lower_indicators.removeAllElements();
76 chart.set_window_title();
77 }
78 else {
79 if (selection.equals(chart.Volume)) {
80 dataset = data_builder.last_volume();
81 } else if (selection.equals(chart.Open_interest)) {
82 dataset = data_builder.last_open_interest();
83 } else {
84 dataset = data_builder.last_indicator_data();
85 }
86 if (chart.replace_indicators) {
87 main_pane.clear_indicator_graph();
88 chart.current_lower_indicators.removeAllElements();
89 }
90 dataset.set_color(conf.indicator_color(selection, false));
91 chart.link_with_axis(dataset, selection);
92 chart.current_lower_indicators.addElement(selection);
93 chart.set_window_title();
94 chart.add_indicator_lines(dataset, selection);
95 main_pane.add_indicator_data_set(dataset);
96 }
97 main_pane.repaint_graphs();
98 }
99
100 // Does `v' contain `s' by value?
101 private boolean vector_has(Vector v, String s) {
102 return Utilities.vector_has(v, s);
103 }
104
105 // Is a change not needed with selection `s'?
106 private boolean no_change(String s) {
107 boolean result = false;
108
109 if (! chart.replace_indicators) {
110 if (vector_has(chart.current_upper_indicators, s) ||
111 vector_has(chart.current_lower_indicators, s)) {
112 result = true;
113 }
114 } else {
115 if ((vector_has(chart.current_upper_indicators, s) &&
116 chart.current_upper_indicators.size() == 1) ||
117 (vector_has(chart.current_lower_indicators, s) &&
118 chart.current_lower_indicators.size() == 1)) {
119 result = true;
120 }
121 }
122
123 return result;
124 }
125
126 private Chart chart;
127 private DataSetBuilder data_builder;
128 private MA_ScrollPane main_pane;
129 }