/*
* Copyright (C) 2013 Jonathan
*
* This program 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.
*
* This program 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 this program. If not, see <http://www.gnu.org/licenses/>.
*/
package tumblrviewer;
import com.tumblr.jumblr.types.*;
import java.awt.*;
import java.awt.event.*;
import java.util.*;
import javax.swing.*;
import static tumblrviewer.MainViewGUI.SINGLE_VIEW_MODE;
import tumblrviewer.TumblrBackend.DisplayModes;
/**
*
* @author jonathan
*/
public abstract class PostViewer
{
private JFrame jFrame;
private Container panel;
private final PhotoPost photoPost;
private final MainViewGUI mainViewGUI;
private final TumblrBackend tumblrBackend;
private JMenu likedOrNotMenu;
private JMenuItem likeItem;
private JMenuItem unlikeItem;
private JMenu rebloggedFromMenu;
private JMenu notesMenu;
private JMenuItem goToRebloggedFromItem;
private JMenu reblogMenu;
JLabel contentLabel;
public PostViewer(MainViewGUI mainViewGUI, TumblrBackend tumblrBackend, PhotoPost photoPost)
{
this.mainViewGUI = mainViewGUI;
this.tumblrBackend = tumblrBackend;
this.photoPost = photoPost;
createGUI();
}
private void createGUI()
{
jFrame = new JFrame(java.util.ResourceBundle.getBundle("en_gb").getString("IMAGE FROM ") + photoPost.getBlogName());
jFrame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
jFrame.setExtendedState(JFrame.MAXIMIZED_BOTH);
panel = jFrame.getContentPane();
panel.setLayout(new BorderLayout());
contentLabel = new JLabel("Loading...");
contentLabel.setHorizontalAlignment(JLabel.CENTER);
contentLabel.addMouseListener(new MouseAdapter()
{
@Override
public void mousePressed(MouseEvent e)
{
jFrame.dispose();
}
});
JScrollPane jsp = new JScrollPane(contentLabel);
jsp.getVerticalScrollBar().setUnitIncrement(25);
jsp.setBorder(null);
panel.add(jsp, BorderLayout.CENTER);
jFrame.setJMenuBar(createMenuBar());
jFrame.pack();
jFrame.setVisible(true);
}
void loadFromTumblr()
{
Thread refreshControlsThread = new Thread(new RefreshControls(), "PostViewer Refresh Controls");
loadMainContent(refreshControlsThread);
}
abstract void loadMainContent(Thread refreshControlsThread);
private JMenuBar createMenuBar()
{
JMenuBar jMenuBar = new JMenuBar();
likedOrNotMenu = new JMenu("...");
likeItem = new JMenuItem(java.util.ResourceBundle.getBundle("en_gb").getString("LIKE"));
unlikeItem = new JMenuItem(java.util.ResourceBundle.getBundle("en_gb").getString("UNLIKE"));
likeItem.addActionListener(new LikeButtonActionListener());
unlikeItem.addActionListener(new LikeButtonActionListener());
likedOrNotMenu.add(likeItem);
likedOrNotMenu.add(unlikeItem);
likedOrNotMenu.setEnabled(false);
reblogMenu = new JMenu(java.util.ResourceBundle.getBundle("en_gb").getString("REBLOG"));
JMenuItem reblogThisItem = new JMenuItem(java.util.ResourceBundle.getBundle("en_gb").getString("REBLOG THIS"));
reblogThisItem.addActionListener(new ReblogThisItemActionListener());
reblogMenu.add(reblogThisItem);
notesMenu = new JMenu("...");
notesMenu.setEnabled(false);
rebloggedFromMenu = new JMenu();
goToRebloggedFromItem = new JMenuItem("");
rebloggedFromMenu.add(goToRebloggedFromItem);
jMenuBar.add(rebloggedFromMenu);
jMenuBar.add(reblogMenu);
jMenuBar.add(likedOrNotMenu);
jMenuBar.add(notesMenu);
return jMenuBar;
}
private class RefreshControls implements Runnable
{
private class SetLikeButton implements Runnable
{
@Override
public void run()
{
//Liked or not
if (tumblrBackend.isCurrentlyLiked(photoPost))
{
likedOrNotMenu.setText(java.util.ResourceBundle.getBundle("en_gb").getString("LIKED"));
likeItem.setEnabled(false);
unlikeItem.setEnabled(true);
}
else
{
likedOrNotMenu.setText(java.util.ResourceBundle.getBundle("en_gb").getString("LIKE"));
likeItem.setEnabled(true);
unlikeItem.setEnabled(false);
}
likedOrNotMenu.setEnabled(true);
}
}
private class SetNotesInfo implements Runnable
{
private class SetUpNotesMenu extends SwingWorker<Note[], Object>
{
@Override
public void done()
{
try
{
Note[] notes = get();
if (notes == null)
{
throw new Exception("No notes!");
}
for (Note note : notes)
{
String typePastTense = note.getType();
switch (typePastTense)
{
case "reblog":
typePastTense = "reblogged";
break;
case "like":
typePastTense = "liked";
break;
}
AddBlogMenuLink addBlogMenuLinkThread = new AddBlogMenuLink(tumblrBackend, note.getBlogName(), notesMenu, jFrame);
addBlogMenuLinkThread.setMenuItemText(note.getBlogName() + " " + typePastTense + " this");
addBlogMenuLinkThread.setMainGUIJFrame(mainViewGUI.getJFrame());
new Thread(addBlogMenuLinkThread).start();
}
notesMenu.setEnabled(true);
}
catch (Exception ex)
{
notesMenu.setEnabled(false);
//There are no notes, so return (stops NullPointerException)
}
}
@Override
protected Note[] doInBackground() throws Exception
{
return tumblrBackend.getCurrentNotes(photoPost);
}
}
@Override
public void run()
{
//Start notes menu thread
(new Thread(new SetUpNotesMenu())).start();
//Rest of notes (the counter)
int noteCount = tumblrBackend.getCurrentNoteCount(photoPost);
notesMenu.setText(noteCount + " notes");
}
}
private class SetReblogInfo extends SwingWorker<Map<String, Object>, Object>
{
@Override
public Map<String, Object> doInBackground()
{
Map<String, Object> map = new HashMap();
String rebloggedFrom = photoPost.getRebloggedFromName();
map.put("rebloggedFrom", rebloggedFrom);
map.put("standardAvatar", tumblrBackend.getAvatar(rebloggedFrom));
map.put("bigAvatar", tumblrBackend.getAvatar(rebloggedFrom, 64));
return map;
}
@Override
protected void done()
{
try
{
final Map<String, Object> map = get();
String rebloggedFrom = (String) map.get("rebloggedFrom");
if (rebloggedFrom != null)
{
goToRebloggedFromItem.addActionListener(new RebloggedFromActionListener(rebloggedFrom));
rebloggedFromMenu.setIcon((Icon) map.get("standardAvatar"));
rebloggedFromMenu.setText(java.util.ResourceBundle.getBundle("en_gb").getString("REBLOGGED FROM ") + rebloggedFrom);
goToRebloggedFromItem.setText("Go to " + rebloggedFrom);
goToRebloggedFromItem.setIcon((Icon) map.get("bigAvatar"));
}
else
{
throw new Exception("Nothing to reblog");
}
}
catch (Exception ex)
{
rebloggedFromMenu.setVisible(false);
}
}
}
@Override
public void run()
{
(new Thread(new SetLikeButton())).start();
notesMenu.removeAll();
(new Thread(new SetNotesInfo())).start();
(new Thread(new SetReblogInfo(), "Reblog Info load Thread")).start();
}
}
private class RebloggedFromActionListener implements ActionListener
{
String rebloggedFrom;
public RebloggedFromActionListener(String rebloggedFrom)
{
this.rebloggedFrom = rebloggedFrom;
}
@Override
@SuppressWarnings("ResultOfObjectAllocationIgnored")
public void actionPerformed(ActionEvent e)
{
JComponent sourceButton = (JComponent) e.getSource();
sourceButton.setEnabled(false);
new MainViewGUI(DisplayModes.POSTS, rebloggedFrom);
if (SINGLE_VIEW_MODE)
{
jFrame.dispose();
mainViewGUI.getJFrame().dispose();
}
}
}
private class LikeButtonActionListener implements ActionListener, Runnable
{
private Thread loaderThread;
JMenuItem source;
@Override
public void actionPerformed(ActionEvent e)
{
source = (JMenuItem) e.getSource();
if (loaderThread != null)
{
return;
}
loaderThread = new Thread((Runnable) this);
loaderThread.start();
}
@Override
public void run()
{
likedOrNotMenu.setEnabled(false);
if (source.getText().equals(java.util.ResourceBundle.getBundle("en_gb").getString("UNLIKE")))
{
likedOrNotMenu.setText(java.util.ResourceBundle.getBundle("en_gb").getString("UNLIKING"));
photoPost.unlike();
}
else
{
likedOrNotMenu.setText(java.util.ResourceBundle.getBundle("en_gb").getString("LIKING"));
photoPost.like();
}
(new Thread(new RefreshControls())).start();
loaderThread = null;
}
}
private class ReblogThisItemActionListener implements ActionListener, Runnable
{
private JMenuItem source;
private ActionEvent e;
private Thread loaderThread;
@Override
public void actionPerformed(ActionEvent e)
{
this.e = e;
if (loaderThread != null)
{
return;
}
loaderThread = new Thread((Runnable) this);
loaderThread.start();
}
@Override
public void run()
{
source = (JMenuItem) e.getSource();
source.setEnabled(false);
reblogMenu.setEnabled(false);
reblogMenu.setText(java.util.ResourceBundle.getBundle("en_gb").getString("REBLOGGING..."));
tumblrBackend.reblogThis(photoPost);
reblogMenu.setText(java.util.ResourceBundle.getBundle("en_gb").getString("REBLOGGED!"));
loaderThread = null;
}
}
public JFrame getjFrame()
{
return jFrame;
}
}