/*
* This file is part of The Technic Launcher Version 3.
* Copyright ©2015 Syndicate, LLC
*
* The Technic Launcher is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* The Technic Launcher is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with the Technic Launcher. If not, see <http://www.gnu.org/licenses/>.
*/
package net.technicpack.launcher.ui.components.news;
import net.technicpack.ui.lang.ResourceLoader;
import net.technicpack.launcher.settings.TechnicSettings;
import net.technicpack.launcher.ui.LauncherFrame;
import net.technicpack.ui.controls.list.SimpleScrollbarUI;
import net.technicpack.ui.controls.feeds.CountCircle;
import net.technicpack.launcher.ui.controls.feeds.NewsWidget;
import net.technicpack.launchercore.image.ImageRepository;
import net.technicpack.platform.IPlatformApi;
import net.technicpack.platform.io.AuthorshipInfo;
import net.technicpack.platform.io.NewsArticle;
import net.technicpack.platform.io.NewsData;
import net.technicpack.rest.RestfulAPIException;
import net.technicpack.utilslib.Utils;
import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.Collections;
import java.util.Comparator;
import java.util.logging.Level;
public class NewsSelector extends JPanel {
private ResourceLoader resources;
private IPlatformApi platformApi;
private NewsWidget selectedItem;
private JPanel widgetHost;
private CountCircle circle;
private TechnicSettings settings;
private int newLatestNewsArticle;
private NewsInfoPanel panel;
private ImageRepository<AuthorshipInfo> avatarRepo;
public NewsSelector(ResourceLoader resources, NewsInfoPanel panel, IPlatformApi platformApi, ImageRepository<AuthorshipInfo> avatarRepo, CountCircle count, TechnicSettings settings) {
this.resources = resources;
this.platformApi = platformApi;
this.avatarRepo = avatarRepo;
this.panel = panel;
this.settings = settings;
this.circle = count;
initComponents();
downloadItems();
}
protected void selectNewsItem(NewsWidget widget) {
if (selectedItem != null)
selectedItem.setIsSelected(false);
selectedItem = widget;
if (selectedItem != null)
selectedItem.setIsSelected(true);
panel.setArticle(selectedItem.getArticle());
}
private void initComponents() {
setLayout(new BorderLayout());
setBackground(LauncherFrame.COLOR_SELECTOR_BACK);
widgetHost = new JPanel();
widgetHost.setOpaque(false);
widgetHost.setLayout(new GridBagLayout());
JScrollPane scrollPane = new JScrollPane(widgetHost, JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED, JScrollPane.HORIZONTAL_SCROLLBAR_NEVER);
scrollPane.setBorder(BorderFactory.createEmptyBorder());
scrollPane.setOpaque(false);
scrollPane.getViewport().setOpaque(false);
scrollPane.getVerticalScrollBar().setUI(new SimpleScrollbarUI(LauncherFrame.COLOR_SCROLL_TRACK, LauncherFrame.COLOR_SCROLL_THUMB));
scrollPane.getVerticalScrollBar().setPreferredSize(new Dimension(10,10));
scrollPane.getVerticalScrollBar().setUnitIncrement(12);
add(scrollPane, BorderLayout.CENTER);
GridBagConstraints constraints = new GridBagConstraints(0,0,1,1,1.0,0.0,GridBagConstraints.NORTH, GridBagConstraints.HORIZONTAL, new Insets(0,0,0,0),0,0);
constraints.weighty = 1.0;
widgetHost.add(Box.createGlue(), constraints);
}
public void ping() {
settings.setLatestNewsArticle(newLatestNewsArticle);
circle.setVisible(false);
}
protected void loadNewsItems(NewsData news) {
int count = 0;
newLatestNewsArticle = settings.getLatestNewsArticle();
for (int i = 0;i < news.getArticles().size(); i++) {
if (news.getArticles().get(i).getId() > settings.getLatestNewsArticle()) {
count++;
if (news.getArticles().get(i).getId() > newLatestNewsArticle)
newLatestNewsArticle = news.getArticles().get(i).getId();
}
}
if (count > 0) {
circle.setVisible(true);
circle.setCount(count);
} else {
circle.setVisible(false);
}
Collections.sort(news.getArticles(), new Comparator<NewsArticle>() {
@Override
public int compare(NewsArticle o1, NewsArticle o2) {
if (o1.getDate().getTime() > o2.getDate().getTime())
return -1;
else if (o1.getDate().getTime() < o2.getDate().getTime())
return 1;
else
return 0;
}
});
widgetHost.removeAll();
GridBagConstraints constraints = new GridBagConstraints(0,0,1,1,1.0,0.0,GridBagConstraints.NORTH, GridBagConstraints.HORIZONTAL, new Insets(0,0,0,0),0,0);
for (int i = 0; i < news.getArticles().size(); i++) {
NewsWidget widget = new NewsWidget(resources, news.getArticles().get(i), avatarRepo.startImageJob(news.getArticles().get(i).getAuthorshipInfo()));
widget.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
if (e.getSource() instanceof NewsWidget)
selectNewsItem((NewsWidget)e.getSource());
}
});
widgetHost.add(widget, constraints);
constraints.gridy++;
if (selectedItem == null)
selectNewsItem(widget);
}
constraints.weighty = 1.0;
widgetHost.add(Box.createGlue(), constraints);
}
private void downloadItems() {
Thread thread = new Thread(new Runnable() {
@Override
public void run() {
try {
loadNewsItems(platformApi.getNews());
} catch (RestfulAPIException ex) {
Utils.getLogger().log(Level.WARNING, "Unable to load news", ex);
}
}
});
thread.start();
}
}