package com.faforever.client.news;
import com.faforever.client.fx.JavaFxUtil;
import com.faforever.client.i18n.I18n;
import com.faforever.client.preferences.PreferencesService;
import com.faforever.client.theme.ThemeService;
import com.google.common.eventbus.EventBus;
import com.google.common.io.CharStreams;
import javafx.fxml.FXML;
import javafx.scene.Node;
import javafx.scene.layout.Pane;
import javafx.scene.web.WebView;
import org.springframework.context.ApplicationContext;
import org.springframework.core.io.ClassPathResource;
import javax.annotation.Resource;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.Reader;
import java.util.List;
public class NewsController {
private static final ClassPathResource NEWS_DETAIL_HTML_RESOURCE = new ClassPathResource("/theme/news_detail.html");
@FXML
Pane newsRoot;
@FXML
Pane newsListPane;
@FXML
WebView newsDetailWebView;
@Resource
ApplicationContext applicationContext;
@Resource
PreferencesService preferencesService;
@Resource
I18n i18n;
@Resource
NewsService newsService;
@Resource
ThemeService themeService;
@Resource
EventBus eventBus;
public void setUpIfNecessary() {
if (!newsListPane.getChildren().isEmpty()) {
return;
}
newsDetailWebView.setContextMenuEnabled(false);
JavaFxUtil.configureWebView(newsDetailWebView, preferencesService, themeService);
themeService.registerWebView(newsDetailWebView);
boolean firstItemSelected = false;
List<NewsItem> newsItems = newsService.fetchNews();
for (NewsItem newsItem : newsItems) {
NewsListItemController newsListItemController = applicationContext.getBean(NewsListItemController.class);
newsListItemController.setNewsItem(newsItem);
newsListItemController.setOnItemSelectedListener(this::displayNewsItem);
newsListPane.getChildren().add(newsListItemController.getRoot());
if (!firstItemSelected) {
preferencesService.getPreferences().getNews().setLastReadNewsUrl(newsItem.getLink());
preferencesService.storeInBackground();
newsListItemController.onMouseClicked();
firstItemSelected = true;
}
}
}
private void displayNewsItem(NewsItem newsItem) {
eventBus.post(new UnreadNewsEvent(false));
try (Reader reader = new InputStreamReader(NEWS_DETAIL_HTML_RESOURCE.getInputStream())) {
String html = CharStreams.toString(reader);
html = html.replace("{title}", newsItem.getTitle())
.replace("{content}", newsItem.getContent())
.replace("{authored}", i18n.get("news.authoredFormat", newsItem.getAuthor(), newsItem.getDate()));
newsDetailWebView.getEngine().loadContent(html);
} catch (IOException e) {
throw new RuntimeException(e);
}
}
public Node getRoot() {
return newsRoot;
}
}