package org.chartsy.main; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.io.IOException; import javax.swing.JFrame; import javax.swing.SwingUtilities; import org.chartsy.main.data.ChartData; import org.chartsy.main.data.DataProvider; import org.chartsy.main.data.Stock; import org.chartsy.main.exceptions.InvalidStockException; import org.chartsy.main.exceptions.RegistrationException; import org.chartsy.main.exceptions.StockNotFoundException; import org.chartsy.main.intervals.DailyInterval; import org.chartsy.main.intervals.Interval; import org.chartsy.main.managers.DataProviderManager; import org.chartsy.main.templates.Template; import org.netbeans.api.progress.ProgressHandle; import org.netbeans.api.progress.ProgressHandleFactory; import org.openide.DialogDisplayer; import org.openide.NotifyDescriptor; import org.openide.util.Cancellable; import org.openide.util.RequestProcessor; import org.openide.util.Task; import org.openide.util.TaskListener; import org.openide.windows.WindowManager; /** * * @author viorel.gheba */ public class NewChart implements ActionListener { private static final RequestProcessor RP = new RequestProcessor("interruptible tasks", 1, true); private final Interval defaultInterval = new DailyInterval(); private NewChartDialog dialog; private boolean newChart = true; private boolean canOpen = true; private RequestProcessor.Task stockTask; @Override public void actionPerformed(final ActionEvent e) { if (newChart) { dialog = new NewChartDialog(new JFrame(), true); } dialog.setLocationRelativeTo(WindowManager.getDefault().getMainWindow()); dialog.setVisible(true); if (!dialog.isVisible()) { final String symbol = dialog.getStock(); final String dataProvider = dialog.getDataProvider(); final DataProvider provider = DataProviderManager.getDefault().getDataProvider(dataProvider); final Template template = dialog.getTemplate(); if (dataProvider != null && symbol != null && template != null) { final ProgressHandle handle = ProgressHandleFactory.createHandle("Aquiring stock info", new Cancellable() { @Override public boolean cancel() { if (stockTask == null) return false; return stockTask.cancel(); } }); final Runnable runnable = new Runnable() { @Override public void run() { handle.start(); handle.switchToIndeterminate(); canOpen = true; try { if (!provider.stockExists(symbol)) provider.fetchStock(symbol); } catch (InvalidStockException ex) { handle.finish(); notifyError(e, ex); } catch (StockNotFoundException ex) { handle.finish(); notifyError(e, ex); } catch (RegistrationException ex) { handle.finish(); notifyError(e, ex); } catch (IOException ex) { handle.finish(); notifyError(e, new InvalidStockException()); } } }; stockTask = RP.create(runnable); stockTask.addTaskListener(new TaskListener() { @Override public void taskFinished(Task task) { handle.finish(); final Stock stock = provider.fetchStockFromCache(symbol); if (canOpen && stock != null) { SwingUtilities.invokeLater(new Runnable() { @Override public void run() { openNewChart(stock, dataProvider, template); } }); } } }); stockTask.schedule(0); } } } private void notifyError(final ActionEvent e, Throwable t) { canOpen = false; NotifyDescriptor descriptor = new NotifyDescriptor.Message(t.getMessage(), NotifyDescriptor.ERROR_MESSAGE); Object ret = DialogDisplayer.getDefault().notify(descriptor); if (ret.equals(NotifyDescriptor.OK_OPTION)) { newChart = false; SwingUtilities.invokeLater(new Runnable() { @Override public void run() { actionPerformed(e); } }); } } private void openNewChart(Stock stock, String dataProvider, Template template) { newChart = true; ChartData chartData = new ChartData(); chartData.setStock(stock); chartData.setChart(template.getChart()); chartData.setDataProviderName(dataProvider); chartData.setInterval(defaultInterval); ChartFrame chartFrame = ChartFrame.getInstance(); chartFrame.setChartData(chartData); chartFrame.setTemplate(template); chartFrame.open(); chartFrame.requestActive(); } }