package org.ripple.power.ui; import java.awt.Dialog; import java.awt.Dimension; import java.awt.Font; import java.awt.Window; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.WindowEvent; import java.awt.event.WindowListener; import java.util.ArrayList; import org.ripple.power.collection.ArrayMap; import org.ripple.power.config.LSystem; import org.ripple.power.helper.HelperWindow; import org.ripple.power.i18n.LangConfig; import org.ripple.power.txns.OtherData; import org.ripple.power.txns.OtherData.CoinmarketcapData; import org.ripple.power.txns.Updateable; import org.ripple.power.ui.graphics.LColor; import org.ripple.power.ui.graphics.chart.ChartValue; import org.ripple.power.ui.graphics.chart.ChartValueSerie; import org.ripple.power.ui.graphics.chart.LineChartCanvas; import org.ripple.power.ui.view.ABaseDialog; import org.ripple.power.ui.view.RPLabel; import org.ripple.power.ui.view.RPToast; import org.ripple.power.ui.view.WaitDialog; import org.ripple.power.ui.view.log.ErrorLog; import org.ripple.power.utils.SwingUtils; public class RPChartsHistoryDialog extends ABaseDialog implements WindowListener { /** * */ private static final long serialVersionUID = 1L; private RPCheckBox _autoRefreshCheckBox; private RPCheckBox _matchBTCCheckBox; private RPLabel _currencyLabel; private RPCButton _okButton; private RPCButton _exitButton; private RPComboBox _cComboBox; private RPLabel jLabel1; private RPLabel jLabel2; private RPLabel jLabel3; private javax.swing.JSeparator jSeparator1; private LineChartCanvas chartOneCanvas; private ChartValueSerie chartsOne = new ChartValueSerie(LColor.red, 1); private ChartValueSerie chartsOnebtc = new ChartValueSerie(LColor.blue, 2); private LineChartCanvas chartTwoCanvas; private ChartValueSerie chartsTwo = new ChartValueSerie(LColor.orange, 1); private ChartValueSerie chartsTwobtc = new ChartValueSerie(LColor.blue, 2); private LineChartCanvas chartThreeCanvas; private ChartValueSerie chartsThree = new ChartValueSerie(LColor.green, 1); private ChartValueSerie chartsThreebtc = new ChartValueSerie(LColor.blue, 2); private boolean _closed = false; private ArrayList<WaitDialog> _waitDialogs = new ArrayList<WaitDialog>(10); private LineChartCanvas addChart(LineChartCanvas canvas, int w, int h, ChartValueSerie my, ChartValueSerie btc) { if (canvas == null) { canvas = new LineChartCanvas(w, h); canvas.setTextVis(false, false, false, false); canvas.setAxisVis(false); canvas.setBackground(UIConfig.background); canvas.addSerie(my); LineChartCanvas chart = new LineChartCanvas(w, h); chart.setTextVis(false, false, false, false); chart.setAxisVis(false); chart.addSerie(btc); canvas.joinLine(chart); } else { RPChartsHistoryDialog.this.repaint(); canvas.validate(); canvas.repaint(); } return canvas; } private void initChart() { chartOneCanvas = addChart(chartOneCanvas, 730, 130, chartsOne, chartsOnebtc); chartTwoCanvas = addChart(chartTwoCanvas, 730, 130, chartsTwo, chartsTwobtc); chartThreeCanvas = addChart(chartThreeCanvas, 730, 130, chartsThree, chartsThreebtc); javax.swing.GroupLayout jPanel2Layout = new javax.swing.GroupLayout( chartThreeCanvas); chartThreeCanvas.setLayout(jPanel2Layout); jPanel2Layout.setHorizontalGroup(jPanel2Layout.createParallelGroup( javax.swing.GroupLayout.Alignment.LEADING).addGap(0, 730, Short.MAX_VALUE)); jPanel2Layout.setVerticalGroup(jPanel2Layout.createParallelGroup( javax.swing.GroupLayout.Alignment.LEADING).addGap(0, 130, Short.MAX_VALUE)); getContentPane().add(chartThreeCanvas); chartThreeCanvas.setBounds(10, 340, 730, 130); chartOneCanvas.setBackground(new java.awt.Color(51, 51, 51)); javax.swing.GroupLayout _chartOnePanelLayout = new javax.swing.GroupLayout( chartOneCanvas); chartOneCanvas.setLayout(_chartOnePanelLayout); _chartOnePanelLayout.setHorizontalGroup(_chartOnePanelLayout .createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addGap(0, 730, Short.MAX_VALUE)); _chartOnePanelLayout.setVerticalGroup(_chartOnePanelLayout .createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addGap(0, 130, Short.MAX_VALUE)); getContentPane().add(chartOneCanvas); chartOneCanvas.setBounds(10, 20, 730, 130); chartTwoCanvas.setBackground(new java.awt.Color(51, 51, 51)); javax.swing.GroupLayout _chartTwoPanelLayout = new javax.swing.GroupLayout( chartTwoCanvas); chartTwoCanvas.setLayout(_chartTwoPanelLayout); _chartTwoPanelLayout.setHorizontalGroup(_chartTwoPanelLayout .createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addGap(0, 730, Short.MAX_VALUE)); _chartTwoPanelLayout.setVerticalGroup(_chartTwoPanelLayout .createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addGap(0, 130, Short.MAX_VALUE)); getContentPane().add(chartTwoCanvas); chartTwoCanvas.setBounds(10, 180, 730, 130); } public RPChartsHistoryDialog(Window parent) { super(parent, LangConfig.get(RPChartsHistoryDialog.class, "hp", "Historical Prices Charts"), Dialog.ModalityType.MODELESS); addWindowListener(HelperWindow.get()); setIconImage(UIRes.getIcon()); setResizable(false); Dimension dim = new Dimension(755, 625); setPreferredSize(dim); setSize(dim); initComponents(); } public static void showDialog(Window parent) { try { RPChartsHistoryDialog dialog = new RPChartsHistoryDialog(parent); dialog.pack(); dialog.setLocationRelativeTo(parent); dialog.setVisible(true); } catch (Exception exc) { ErrorLog.get().logException("RPChartsHistoryDialog Exception", exc); } } private void initComponents() { _okButton = new RPCButton(); _exitButton = new RPCButton(); _currencyLabel = new RPLabel(); _cComboBox = new RPComboBox(); _autoRefreshCheckBox = new RPCheckBox(); _matchBTCCheckBox = new RPCheckBox(); jSeparator1 = new javax.swing.JSeparator(); jLabel1 = new RPLabel(); jLabel2 = new RPLabel(); jLabel3 = new RPLabel(); Font font = UIRes.getFont(); getContentPane().setLayout(null); _okButton.setFont(font); // NOI18N _okButton.setText(UIMessage.ok); getContentPane().add(_okButton); _okButton.setBounds(470, 540, 130, 40); _okButton.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { final String cur = (String) _cComboBox.getSelectedItem(); final boolean match = _matchBTCCheckBox.isSelected() && !"bitcoin".equalsIgnoreCase(cur); final WaitDialog dialog = WaitDialog .showDialog(RPChartsHistoryDialog.this); _waitDialogs.add(dialog); dialog.get().setFadeClose(false); Updateable update = new Updateable() { @Override public void action(Object o) { try { addData(chartsOne, 1, cur, match, chartsOnebtc); chartOneCanvas = addChart(chartOneCanvas, 730, 130, chartsOne, chartsOnebtc); } catch (Exception e) { try { addData(chartsOne, 1, cur, match, chartsOnebtc); chartOneCanvas = addChart(chartOneCanvas, 730, 130, chartsOne, chartsOnebtc); } catch (Exception ex) { RPToast.makeText(RPChartsHistoryDialog.this, e.getMessage(), RPToast.Style.ERROR) .display(); } } try { addData(chartsTwo, 7, cur, match, chartsTwobtc); chartTwoCanvas = addChart(chartTwoCanvas, 730, 130, chartsTwo, chartsTwobtc); } catch (Exception e) { try { addData(chartsTwo, 7, cur, match, chartsTwobtc); chartTwoCanvas = addChart(chartTwoCanvas, 730, 130, chartsTwo, chartsTwobtc); } catch (Exception ex) { RPToast.makeText(RPChartsHistoryDialog.this, e.getMessage(), RPToast.Style.ERROR) .display(); } } try { addData(chartsThree, 30, cur, match, chartsThreebtc); chartThreeCanvas = addChart(chartThreeCanvas, 730, 130, chartsThree, chartsThreebtc); } catch (Exception e) { try { addData(chartsThree, 30, cur, match, chartsThreebtc); chartThreeCanvas = addChart(chartThreeCanvas, 730, 130, chartsThree, chartsThreebtc); } catch (Exception ex) { RPToast.makeText(RPChartsHistoryDialog.this, e.getMessage(), RPToast.Style.ERROR) .display(); } } dialog.closeDialog(); initChart(); } }; LSystem.postThread(update); } }); _exitButton.setFont(font); // NOI18N _exitButton.setText(LangConfig.get(this, "exit", "Exit")); getContentPane().add(_exitButton); _exitButton.setBounds(610, 540, 120, 40); _exitButton.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { _closed = true; SwingUtils.close(RPChartsHistoryDialog.this); } }); _currencyLabel.setFont(font); // NOI18N _currencyLabel.setText(LangConfig.get(this, "currency", "Currency")); getContentPane().add(_currencyLabel); _currencyLabel.setBounds(10, 490, 120, 20); _cComboBox.setFont(font); // NOI18N _cComboBox.setItemModel(new String[] { "Bitcoin", "Ripple", "Litecoin", "Bitshares-x", "Dogecoin" }); getContentPane().add(_cComboBox); _cComboBox.setBounds(90, 490, 180, 22); _autoRefreshCheckBox.setText(LangConfig.get(this, "autor", "Auto Refresh")); getContentPane().add(_autoRefreshCheckBox); _autoRefreshCheckBox.setBackground(UIConfig.dialogbackground); _autoRefreshCheckBox.setBounds(640, 490, 100, 23); _matchBTCCheckBox.setText(LangConfig.get(this, "mbtc", "Match BTC")); getContentPane().add(_matchBTCCheckBox); _matchBTCCheckBox.setBounds(540, 490, 90, 23); _matchBTCCheckBox.setBackground(UIConfig.dialogbackground); getContentPane().add(jSeparator1); jSeparator1.setBounds(0, 520, 760, 10); jLabel1.setText("30 Day"); getContentPane().add(jLabel1); jLabel1.setBounds(10, 322, 130, 15); jLabel2.setText("1 Day"); getContentPane().add(jLabel2); jLabel2.setBounds(10, 2, 130, 15); jLabel3.setText("7 Day"); getContentPane().add(jLabel3); jLabel3.setBounds(10, 162, 130, 15); getContentPane().setBackground(UIConfig.dialogbackground); addWindowListener(new WindowListener() { @Override public void windowOpened(WindowEvent e) { } @Override public void windowIconified(WindowEvent e) { } @Override public void windowDeiconified(WindowEvent e) { } @Override public void windowDeactivated(WindowEvent e) { } @Override public void windowClosing(WindowEvent e) { _closed = true; } @Override public void windowClosed(WindowEvent e) { _closed = true; } @Override public void windowActivated(WindowEvent e) { } }); initChart(); pack(); Updateable update = new Updateable() { @Override public void action(Object o) { try { ArrayList<CoinmarketcapData> datas = OtherData .getCoinmarketcapAllTo(30); if (datas.size() > 0) { final ArrayList<String> list = new ArrayList<String>(30); for (CoinmarketcapData data : datas) { list.add(data.name); } _cComboBox.setItemModel(list.toArray()); } } catch (Exception ex) { } for (; !_closed;) { LSystem.invokeLater(new Runnable() { @Override public void run() { if (_autoRefreshCheckBox.isSelected()) { final String cur = (String) _cComboBox .getSelectedItem(); final boolean match = _matchBTCCheckBox .isSelected() && !"bitcoin".equalsIgnoreCase(cur); try { addData(chartsOne, 1, cur, match, chartsOnebtc); addData(chartsTwo, 7, cur, match, chartsTwobtc); addData(chartsThree, 30, cur, match, chartsThreebtc); } catch (Exception ex) { RPToast.makeText( RPChartsHistoryDialog.this, ex.getMessage(), RPToast.Style.ERROR).display(); } } RPChartsHistoryDialog.this.repaint(); if (chartOneCanvas != null) { chartOneCanvas.repaint(); } if (chartTwoCanvas != null) { chartTwoCanvas.repaint(); } if (chartThreeCanvas != null) { chartThreeCanvas.repaint(); } } }); LSystem.sleep(LSystem.SECOND); } } }; LSystem.postThread(update); } private void addData(ChartValueSerie chart, int day, String cur, boolean match, ChartValueSerie btcchart) throws Exception { ArrayMap arrays = OtherData.getCapitalization(day, cur); if (arrays != null && arrays.size() > 0) { chart.clearPointList(); for (int i = 0; i < arrays.size(); i++) { if (i < arrays.size()) { String key = (String) arrays.getKey(i); chart.addPoint(new ChartValue(key, Float .parseFloat((String) arrays.getValue(key)) / 1000f)); } } } if (match) { arrays = OtherData.getCapitalization(day, "bitcoin"); if (arrays != null && arrays.size() > 0) { btcchart.clearPointList(); for (int i = 0; i < arrays.size(); i++) { if (i < arrays.size()) { String key = (String) arrays.getKey(i); btcchart.addPoint(new ChartValue( key, Float.parseFloat((String) arrays.getValue(key)) / 1000f)); } } } } } @Override public void windowActivated(WindowEvent e) { } @Override public void windowClosed(WindowEvent e) { } @Override public void windowClosing(WindowEvent e) { if (_waitDialogs != null) { for (WaitDialog wait : _waitDialogs) { if (wait != null) { wait.closeDialog(); } } } } @Override public void windowDeactivated(WindowEvent e) { } @Override public void windowDeiconified(WindowEvent e) { } @Override public void windowIconified(WindowEvent e) { } @Override public void windowOpened(WindowEvent e) { } }