diff --git a/src/main/java/interface_adapters/GetNews/GetNewsPresenter.java b/src/main/java/interface_adapters/GetNews/GetNewsPresenter.java index e690fdd..64bab2c 100644 --- a/src/main/java/interface_adapters/GetNews/GetNewsPresenter.java +++ b/src/main/java/interface_adapters/GetNews/GetNewsPresenter.java @@ -16,13 +16,20 @@ public GetNewsPresenter(ViewManagerModel viewManagerModel, GetNewsViewModel getN @Override public void prepareSuccessView(GetNewsOutputData response) { // TODO: On success, show articles in a list (aka. table) + GetNewsState state = getNewsViewModel.getState(); + + state.setRenderNewInfo(true); + state.setNewsItems(response.getNewsItems()); + state.setTicker(response.getTicker()); + + getNewsViewModel.firePropertyChanged(); } @Override public void prepareFailView(String error) { - // TODO GetNewsState state = getNewsViewModel.getState(); state.setTickerError(error); getNewsViewModel.firePropertyChanged(); } + } diff --git a/src/main/java/interface_adapters/GetNews/GetNewsState.java b/src/main/java/interface_adapters/GetNews/GetNewsState.java index ebaf450..b16dcef 100644 --- a/src/main/java/interface_adapters/GetNews/GetNewsState.java +++ b/src/main/java/interface_adapters/GetNews/GetNewsState.java @@ -1,24 +1,54 @@ package interface_adapters.GetNews; +import java.util.List; +import java.util.Map; + public class GetNewsState { private String tickerError = null; - private String ticker = null; + private String ticker = ""; + List> newsItems; + private Boolean renderNewInfo; - public GetNewsState(String ticker, String tickerError) { - this.ticker = ticker; + public String getTickerError() { + return tickerError; + } + + public void setTickerError(String tickerError) { this.tickerError = tickerError; } - public String getTickerError() {return tickerError;} + public String getTicker() { + return ticker; + } - public void setTickerError(String tickerError) {this.tickerError = tickerError;} + public void setTicker(String ticker) { + this.ticker = ticker; + } - public String getTicker() {return ticker;} + public List> getNewsItems() { + return this.newsItems; + } - public void setTicker(String ticker) {this.ticker = ticker;} + public void setNewsItems(List> newsItems) { + this.newsItems = newsItems; + } + + public Map getNewsItem() { + return this.newsItems.get(0); + } + + public Boolean getRenderNewInfo() { + return renderNewInfo; + } + + public void setRenderNewInfo(Boolean renderNewInfo) { + this.renderNewInfo = renderNewInfo; + } // Due to the ViewModel's default constructor call, we must explicitly define the default constructor. // So, we overload the copy constructor. - public GetNewsState() {} + public GetNewsState() { + + } } diff --git a/src/main/java/use_cases/GetNews/GetNewsInteractor.java b/src/main/java/use_cases/GetNews/GetNewsInteractor.java index 88c7c2a..ed1bc69 100644 --- a/src/main/java/use_cases/GetNews/GetNewsInteractor.java +++ b/src/main/java/use_cases/GetNews/GetNewsInteractor.java @@ -18,13 +18,13 @@ public GetNewsInteractor(GetNewsOutputBoundary getNewsPresenter, APIAccessInterf @Override public void execute(GetNewsInputData getNewsInputData) { /** - * The getNewsInputData parameter should follow the specifications laid out in that class. - *

- * This method implements the bulk of the GetNews use case. - * News is fetched over a time period of a month prior to the method call. - * - * @param getNewsInputData an InputData object following the relevant CA Engine rules - */ + * The getNewsInputData parameter should follow the specifications laid out in that class. + *

+ * This method implements the bulk of the GetNews use case. + * News is fetched over a time period of a month prior to the method call. + * + * @param getNewsInputData an InputData object following the relevant CA Engine rules + */ String ticker = getNewsInputData.getTicker(); // Define end of news period to be right now @@ -34,10 +34,10 @@ public void execute(GetNewsInputData getNewsInputData) { try { // Make API call - List company_news_list = driverAPI.getCompanyNews(ticker, from, to); + List companyNewsList = driverAPI.getCompanyNews(ticker, from, to); // Save API output using OutputData format for the GetNews use case - GetNewsOutputData result = new GetNewsOutputData(ticker, company_news_list); + GetNewsOutputData result = new GetNewsOutputData(ticker, companyNewsList); getNewsPresenter.prepareSuccessView(result); diff --git a/src/main/java/use_cases/GetNews/GetNewsOutputData.java b/src/main/java/use_cases/GetNews/GetNewsOutputData.java index ef22690..a08cf63 100644 --- a/src/main/java/use_cases/GetNews/GetNewsOutputData.java +++ b/src/main/java/use_cases/GetNews/GetNewsOutputData.java @@ -9,29 +9,28 @@ public class GetNewsOutputData { String ticker; - List> news_items; + List> newsItems; - public GetNewsOutputData(String ticker, List company_news_items) { + public GetNewsOutputData(String ticker, List companyNewsItems) { this.ticker = ticker; - this.news_items = new ArrayList>(); + this.newsItems = new ArrayList>(); - for (CompanyNews company_news : company_news_items) { - Map news_item = new HashMap<>(); + for (CompanyNews companyNews : companyNewsItems) { + Map newsItem = new HashMap<>(); - news_item.put("category", company_news.getCategory()); - news_item.put("datetime", company_news.getDatetime().toString()); - news_item.put("headline", company_news.getHeadline()); - news_item.put("url", company_news.getUrl()); - news_item.put("summary", company_news.getSummary()); + newsItem.put("category", companyNews.getCategory()); + newsItem.put("datetime", companyNews.getDatetime().toString()); + newsItem.put("headline", companyNews.getHeadline()); + newsItem.put("url", companyNews.getUrl()); + newsItem.put("summary", companyNews.getSummary()); - this.news_items.add(news_item); + this.newsItems.add(newsItem); } + } public String getTicker() {return ticker;} - public List> getNewsItems() {return news_items;} + public List> getNewsItems() {return newsItems;} - // TODO decide whether this is necessary - // public Map getNewsItem(int idx) {return news_items.get(idx);} } \ No newline at end of file diff --git a/src/main/java/view/BuyView.java b/src/main/java/view/BuyView.java index 07d73d9..c5c327e 100644 --- a/src/main/java/view/BuyView.java +++ b/src/main/java/view/BuyView.java @@ -20,6 +20,7 @@ public class BuyView extends JPanel implements ActionListener, PropertyChangeLis public final String viewName = "buy"; private final BuyViewModel buyViewModel; + private final BuyController buyController; private final JLabel amountErrorField = new JLabel(); final JTextField tickerInputField = new JTextField(15); @@ -33,7 +34,7 @@ public class BuyView extends JPanel implements ActionListener, PropertyChangeLis JPanel middlePanel; JPanel bottomPanel; private final JLabel balanceField = new JLabel(); - BuyController buyController; + private void updateBalanceLabelColor() { BuyState state = buyViewModel.getState(); if (state == null || state.getCurBalance() == null || state.getStockInfo() == null) { diff --git a/src/main/java/view/GetNewsView.java b/src/main/java/view/GetNewsView.java index 1f6a47f..925d068 100644 --- a/src/main/java/view/GetNewsView.java +++ b/src/main/java/view/GetNewsView.java @@ -1,5 +1,9 @@ package view; +import java.util.Map; +import java.util.List; + +import drivers.TableModel; import interface_adapters.Dashboard.DashboardViewModel; import interface_adapters.GetNews.GetNewsController; import interface_adapters.GetNews.GetNewsState; @@ -12,6 +16,8 @@ import java.awt.event.ActionListener; import java.awt.event.KeyEvent; import java.awt.event.KeyListener; +import java.awt.BorderLayout; +import java.awt.Dimension; import java.beans.PropertyChangeEvent; import java.beans.PropertyChangeListener; @@ -25,9 +31,15 @@ public class GetNewsView extends JPanel implements ActionListener, PropertyChang /** * Text fields, labels, and buttons */ - final JTextField tickerIn = new JTextField(4); + final JTextField tickerInputField = new JTextField(5); + private final JLabel tickerErrorField = new JLabel(); + JTable table; final JButton search; final JButton back; + JPanel topPanel; + JPanel middlePanel; + JTabbedPane newsTabs; + ImageIcon icon; public GetNewsView(GetNewsViewModel getNewsViewModel, GetNewsController getNewsController, @@ -40,66 +52,108 @@ public GetNewsView(GetNewsViewModel getNewsViewModel, this.getNewsViewModel = getNewsViewModel; this.getNewsViewModel.addPropertyChangeListener(this); - JLabel title = new JLabel(getNewsViewModel.TITLE_LABEL); - title.setAlignmentX(Component.CENTER_ALIGNMENT); - title.setAlignmentY(Component.TOP_ALIGNMENT); - - // Create stock search bar. - LabelTextPanel tickerField = new LabelTextPanel( - new JLabel("Stock ticker"), tickerIn); - tickerField.setAlignmentX(Component.CENTER_ALIGNMENT); + setPreferredSize(new Dimension(800, 400)); - JPanel back_panel = new JPanel(); back = new JButton(getNewsViewModel.BACK_BUTTON_LABEL); - back_panel.add(back); - - JPanel search_panel = new JPanel(); search = new JButton(getNewsViewModel.SEARCH_BUTTON_LABEL); - search_panel.add(search); + + // Create stock search bar. + LabelTextPanel tickerInput = new LabelTextPanel( + new JLabel("Stock ticker"), tickerInputField); + tickerInput.setAlignmentX(Component.CENTER_ALIGNMENT); back.addActionListener( - new ActionListener() { - public void actionPerformed(ActionEvent evt) { - if (evt.getSource().equals(back)) { - dashboardViewModel.firePropertyChanged(); - viewManagerModel.setActiveView(dashboardViewModel.getViewName()); - viewManagerModel.firePropertyChanged(); - } - } + evt -> { + dashboardViewModel.firePropertyChanged(); + viewManagerModel.setActiveView(dashboardViewModel.getViewName()); + viewManagerModel.firePropertyChanged(); } ); search.addActionListener( - new ActionListener() { - public void actionPerformed(ActionEvent evt) { - if (evt.getSource().equals(search)) { - GetNewsState currentState = getNewsViewModel.getState(); - getNewsController.execute(currentState.getTicker()); - } - } + evt -> { + GetNewsState currentState = getNewsViewModel.getState(); + + getNewsController.execute(currentState.getTicker()); } ); - tickerField.addKeyListener(new KeyListener() { + tickerInputField.addKeyListener(new KeyListener() { @Override public void keyTyped(KeyEvent e) { GetNewsState currentState = getNewsViewModel.getState(); - currentState.setTicker(tickerIn.getText() + e.getKeyChar()); + currentState.setTicker(tickerInputField.getText() + e.getKeyChar()); getNewsViewModel.setState(currentState); } @Override - public void keyPressed(KeyEvent e) {} + public void keyPressed(KeyEvent e) { + + } @Override - public void keyReleased(KeyEvent e) {} + public void keyReleased(KeyEvent e) { + + } }); - this.setLayout(new BoxLayout(this, BoxLayout.Y_AXIS)); - this.add(title); - this.add(tickerField); - this.add(back_panel); - this.add(search_panel); + this.setLayout(new BoxLayout(this, BoxLayout.X_AXIS)); + setLayout(new BorderLayout()); + topPanel = new JPanel(new GridBagLayout()); + GridBagConstraints gbc = new GridBagConstraints(); + + gbc.gridx = 0; + gbc.gridy = 0; + gbc.anchor = GridBagConstraints.WEST; + topPanel.add(back, gbc); + + gbc.gridx = 1; + gbc.weightx = 1; + gbc.fill = GridBagConstraints.HORIZONTAL; + topPanel.add(Box.createHorizontalGlue(), gbc); + + gbc.gridx = 2; + gbc.weightx = 0; + gbc.fill = GridBagConstraints.NONE; + topPanel.add(tickerInput, gbc); + + gbc.gridx = 3; + gbc.weightx = 0; + topPanel.add(search); + + topPanel.add(tickerErrorField); + + gbc.gridx = 4; + gbc.weightx = 1.24; + topPanel.add(Box.createHorizontalGlue(), gbc); + this.add(topPanel, BorderLayout.NORTH); + + gbc.gridx = 0; + + gbc.gridx = 1; + gbc.gridy = 0; + gbc.anchor = GridBagConstraints.EAST; + gbc.weightx = 0; + + gbc.gridx = 2; + gbc.gridy = 0; + gbc.anchor = GridBagConstraints.EAST; + gbc.weightx = 0; + + middlePanel = new JPanel(new GridBagLayout()); + newsTabs = new JTabbedPane(); + icon = new ImageIcon("images/news.png"); + + gbc.gridx = 0; + gbc.gridy = 1; + gbc.fill = GridBagConstraints.HORIZONTAL; + gbc.weightx = 1; +// gbc.weighty = 10000; + middlePanel.add(newsTabs, gbc); + add(middlePanel); + + middlePanel.setVisible(false); + } /** @@ -113,8 +167,39 @@ public void actionPerformed(ActionEvent evt) { public void propertyChange(PropertyChangeEvent evt) { GetNewsState state = (GetNewsState) evt.getNewValue(); setFields(state); + + List> newsItems = state.getNewsItems(); + + if (newsItems != null && state.getRenderNewInfo() != null) { + + for (int i = 0; i < 5; i++) { + Map newsItem = newsItems.get(i); + + JTable table = new JTable(); + table.setPreferredSize(new Dimension(100, 200)); + table.setModel(new TableModel(newsItem)); + + newsTabs.addTab(String.format("Article %d", i + 1), icon, table); + } + + middlePanel.setVisible(true); + state.setRenderNewInfo(null); + getNewsViewModel.setState(state); + + } + + String tickerError = state.getTickerError(); + + if (tickerError != null) { + JOptionPane.showMessageDialog(this, tickerError); + state.setTickerError(null); + getNewsViewModel.setState(state); + } + } - private void setFields(GetNewsState state) {} + private void setFields(GetNewsState state) { + tickerInputField.setText(state.getTicker()); + } }