package org.openslx.dozmod.gui.window;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import javax.swing.JFrame;
import javax.swing.JMenuItem;
import javax.swing.JOptionPane;
import javax.swing.SwingUtilities;
import javax.swing.event.ListSelectionEvent;
import javax.swing.event.ListSelectionListener;
import org.apache.log4j.Logger;
import org.openslx.bwlp.thrift.iface.ImageSummaryRead;
import org.openslx.dozmod.gui.Gui;
import org.openslx.dozmod.gui.MainWindow;
import org.openslx.dozmod.gui.control.table.ImageTable;
import org.openslx.dozmod.gui.helper.MessageType;
import org.openslx.dozmod.gui.helper.PopupMenu;
import org.openslx.dozmod.gui.window.ImageDetailsWindow.ImageUpdatedCallback;
import org.openslx.dozmod.gui.window.layout.ImageListWindowLayout;
import org.openslx.dozmod.gui.wizard.ImageCreationWizard;
import org.openslx.dozmod.gui.wizard.LectureWizard;
import org.openslx.dozmod.permissions.ImagePerms;
import org.openslx.dozmod.thrift.ThriftActions;
import org.openslx.dozmod.thrift.ThriftActions.DeleteCallback;
import org.openslx.dozmod.thrift.ThriftActions.DownloadCallback;
/**
*
*/
@SuppressWarnings("serial")
public class ImageListWindow extends ImageListWindowLayout implements DownloadCallback, DeleteCallback {
private final static Logger LOGGER = Logger.getLogger(ImageListWindow.class);
/**
* Self-reference
*/
public final ImageListWindow me = this;
/**
* The image table held by the ImageListViewer
*/
public final ImageTable imageTable = imageListViewer.getImageTable();
/**
* Popup menu items
*/
private final JMenuItem popupItemNewLecture = new JMenuItem("Neue Veranstaltung");
private final JMenuItem popupItemEdit = new JMenuItem("Bearbeiten");
private final JMenuItem popupItemDelete = new JMenuItem("Löschen");
private final JMenuItem popupItemDownload = new JMenuItem("Download");
/**
* Constructor
*/
public ImageListWindow() {
super();
/**
* Popup menu for the version table on the right side
*/
final PopupMenu pop = new PopupMenu(new ActionListener() {
public void actionPerformed(ActionEvent e) {
if (e.getSource().equals(popupItemNewLecture)) {
startLectureWizard(imageTable.getSelectedItem());
}
if (e.getSource().equals(popupItemEdit)) {
openImageDetails(imageTable.getSelectedItem());
}
if (e.getSource().equals(popupItemDownload)) {
performImageDownload(imageTable.getSelectedItem());
}
if (e.getSource().equals(popupItemDelete)) {
deleteBaseImage(imageTable.getSelectedItem());
}
}
});
// add them to the popup menu
pop.addMenuItem(popupItemNewLecture);
pop.addMenuItem(popupItemEdit);
pop.addMenuItem(popupItemDownload);
pop.addSeparator();
pop.addMenuItem(popupItemDelete);
/**
* Table listeners
*/
imageTable.getSelectionModel().addListSelectionListener(new ListSelectionListener() {
@Override
public void valueChanged(ListSelectionEvent e) {
ImageSummaryRead item = imageTable.getSelectedItem();
updateAvailableOptions(item);
}
});
imageTable.addKeyListener(new KeyAdapter() {
@Override
public void keyReleased(KeyEvent e) {
if (e.getKeyCode() == KeyEvent.VK_F5) {
imageListViewer.refreshList(true, 1);
}
}
});
imageTable.addMouseListener(new MouseAdapter() {
@Override
public void mouseClicked(MouseEvent e) {
if (SwingUtilities.isLeftMouseButton(e) && e.getClickCount() == 2) {
openImageDetails(imageTable.getSelectedItem());
}
processClick(e);
}
@Override
public void mousePressed(MouseEvent e) {
processClick(e);
}
@Override
public void mouseReleased(MouseEvent e) {
processClick(e);
}
private void processClick(MouseEvent e) {
int r = imageTable.rowAtPoint(e.getPoint());
if (r >= 0 && r < imageTable.getRowCount()) {
// highlight the row and popup the menu
imageTable.setRowSelectionInterval(r, r);
if (e.isPopupTrigger()) {
pop.show(e.getComponent(), e.getX(), e.getY());
}
} else {
imageTable.clearSelection();
}
}
});
/**
* Bottom button panel listeners
*/
newButton.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
new ImageCreationWizard(SwingUtilities.getWindowAncestor(me)).setVisible(true);
imageListViewer.refreshList(true, 100);
}
});
newLectureButton.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
startLectureWizard(imageTable.getSelectedItem());
}
});
editButton.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
openImageDetails(imageTable.getSelectedItem());
}
});
downloadButton.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
performImageDownload(imageTable.getSelectedItem());
}
});
deleteButton.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent ae) {
deleteBaseImage(imageTable.getSelectedItem());
}
});
switchViewButton.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
MainWindow.showPage(LectureListWindow.class);
}
});
updateAvailableOptions(null);
}
/********************************************************************************
*
* General GUI and table helpers
*
********************************************************************************/
/**
* Helper to check if the given image has a latest version
*
* @param image the image to check for a latest version
* @return true if the image has a latest version, false otherwise
*/
private boolean hasLatestVersion(ImageSummaryRead image) {
if (image == null)
return false;
if (image.getLatestVersionId() == null) {
Gui.showMessageBox(me, "Das gewählte Image besitzt keine gültige Image-Version",
MessageType.ERROR, null, null);
return false;
}
return true;
}
/**
* Updates the buttons/popup menu items according to the user's permissions
*
* @param item the image to check the user's permissions for
*/
private void updateAvailableOptions(ImageSummaryRead item) {
boolean isValid = item != null && item.getLatestVersionId() != null;
boolean download = isValid && ImagePerms.canDownload(item);
boolean link = isValid && ImagePerms.canLink(item);
boolean admin = ImagePerms.canAdmin(item);
downloadButton.setEnabled(download);
newLectureButton.setEnabled(link);
deleteButton.setEnabled(admin);
popupItemDownload.setEnabled(download);
popupItemNewLecture.setEnabled(link);
popupItemDelete.setEnabled(admin);
}
/********************************************************************************
*
* Helpers triggering the actual actions
*
********************************************************************************/
/**
* Starts a lecture wizard for the given image if it has a valid version
*
* @param image image to link the new lecture to
*/
private void startLectureWizard(ImageSummaryRead image) {
if (!hasLatestVersion(image))
return;
new LectureWizard(SwingUtilities.getWindowAncestor(this), image, image.getLatestVersionId()).setVisible(true);
}
/**
* Opens the given image details as a popup window
*
* @param image the image to show the details of
*/
private void openImageDetails(ImageSummaryRead image) {
if (image == null)
return;
ImageDetailsWindow.open((JFrame) SwingUtilities.getWindowAncestor(me), image.getImageBaseId(),
new ImageUpdatedCallback() {
public void updated() {
imageListViewer.refreshList(true, 100);
}
});
}
/**
* Triggers a download of the given image's latest version
*
* @param image the image to download
*/
private void performImageDownload(ImageSummaryRead image) {
if (!hasLatestVersion(image))
return;
downloadButton.setEnabled(false);
ThriftActions.initDownload(JOptionPane.getFrameForComponent(this), image.latestVersionId,
image.imageName, image.virtId, image.fileSize, this);
}
/**
* Callback when download initialized
*
* @param success true if downloading, false otherwise
*/
@Override
public void downloadInitialized(boolean success) {
if (!success) {
Gui.asyncExec(new Runnable() {
@Override
public void run() {
downloadButton.setEnabled(true);
imageListViewer.refreshList(true, 1000);
}
});
}
}
/**
* Deletes the latest version of the given image if it has one
*
* @param image image to delete
*/
private void deleteBaseImage(final ImageSummaryRead image) {
ThriftActions.deleteImageBase(JOptionPane.getFrameForComponent(this), image.getImageBaseId(), this);
}
/**
* Callback when download initialized
*
* @param success true if downloading, false otherwise
*/
@Override
public void isDeleted(boolean success) {
imageListViewer.refreshList(success, 1000);
}
/********************************************************************************
*
* CompositePage abstract methods implementation
*
********************************************************************************/
@Override
public boolean requestHide() {
return true;
}
@Override
public void requestShow() {
imageListViewer.refreshList(false, 1);
}
}