package org.openslx.dozmod.gui.window;
import java.awt.Color;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.util.List;
import javax.swing.JFrame;
import javax.swing.RowFilter;
import javax.swing.SwingUtilities;
import javax.swing.UIManager;
import javax.swing.event.DocumentEvent;
import javax.swing.event.DocumentListener;
import org.apache.log4j.Logger;
import org.apache.thrift.TException;
import org.openslx.bwlp.thrift.iface.ImageSummaryRead;
import org.openslx.bwlp.thrift.iface.TAuthorizationException;
import org.openslx.bwlp.thrift.iface.TNotFoundException;
import org.openslx.dozmod.gui.Gui;
import org.openslx.dozmod.gui.MainWindow;
import org.openslx.dozmod.gui.helper.MessageType;
import org.openslx.dozmod.gui.window.layout.ImageListWindowLayout;
import org.openslx.dozmod.gui.wizard.ImageWizard;
import org.openslx.dozmod.thrift.ImageCache;
import org.openslx.dozmod.thrift.Session;
import org.openslx.thrifthelper.ThriftManager;
import org.openslx.util.QuickTimer;
import org.openslx.util.QuickTimer.Task;
@SuppressWarnings("serial")
public class ImageListWindow extends ImageListWindowLayout {
private final static Logger LOGGER = Logger.getLogger(ImageListWindow.class);
public final ImageListWindow me = this;
public ImageListWindow() {
super();
// filter the objects in the table depending on the search field
searchTextField.getDocument().addDocumentListener(new DocumentListener() {
@Override
public void removeUpdate(DocumentEvent e) {
changedUpdate(e);
}
@Override
public void insertUpdate(DocumentEvent e) {
changedUpdate(e);
}
@Override
public void changedUpdate(DocumentEvent e) {
// stuff
try {
imageTable.getRowSorter().setRowFilter(RowFilter.regexFilter("(?i)"+searchTextField.getText(), 0, 1, 2));
searchTextField.setForeground(UIManager.getColor("TextField.foreground"));
} catch (IllegalArgumentException ex) {
// TODO set background color of search field to something redish
searchTextField.setForeground(Color.RED);
}
}
});
imageTable.addMouseListener(new MouseAdapter() {
@Override
public void mouseClicked(MouseEvent e) {
if (e.getClickCount() == 2) {
final ImageSummaryRead image = getSelectedImage();
if (image == null) return;
ImageDetailsWindow.open((JFrame)SwingUtilities.getWindowAncestor(me), image.getImageBaseId());
}
}
});
newButton.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
new ImageWizard(SwingUtilities.getWindowAncestor(me)).setVisible(true);
refreshList(true);
}
});
downloadButton.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
// TODO open download popup
}
});
// delete lecture
deleteButton.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent ae) {
final ImageSummaryRead image = getSelectedImage();
if (image == null) return;
// check if we have a version
if (image.isSetLatestVersionId()) {
// try to actually delete this version of the image
try {
ThriftManager.getSatClient().deleteImageVersion(Session.getSatelliteToken(), image.getLatestVersionId());
LOGGER.info("Deleted version '" + image.getLatestVersionId() + "' of image '" + image.getImageBaseId() + "'.");
refreshList(true);
} catch (TAuthorizationException e) {
Gui.showMessageBox(me, "Sie sind nicht autorisiert dieses Image zu löschen!", MessageType.ERROR, LOGGER, e);
} catch (TNotFoundException e) {
Gui.showMessageBox(me, "Diese Image existiert nicht auf dem Satelliten!", MessageType.ERROR, LOGGER, e);
} catch (TException e) {
Gui.showMessageBox(me, "Interner Fehler! Siehe Logs.", MessageType.ERROR, LOGGER, e);
}
} else {
Gui.showMessageBox(me, "Keine Version für diese Image!", MessageType.ERROR, LOGGER, null);
}
}
});
// return to mainMenu
backButton.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
MainWindow.showPage(MainMenuWindow.class);
}
});
}
private void refreshList(final boolean forceRefresh) {
QuickTimer.scheduleOnce(new Task() {
@Override
public void fire() {
final List<ImageSummaryRead> imageList = ImageCache.get(forceRefresh);
Gui.asyncExec(new Runnable() {
@Override
public void run() {
imageTable.setData(imageList, true);
}
});
}
});
}
private final ImageSummaryRead getSelectedImage() {
final ImageSummaryRead image = imageTable.getSelectedItem();
if (image == null) {
Gui.showMessageBox(this, "Kein Image ausgewählt!", MessageType.ERROR, LOGGER, null);
return null;
} else {
return image;
}
}
@Override
public boolean requestHide() {
return true;
}
@Override
public void requestShow() {
refreshList(false);
}
}