summaryrefslogblamecommitdiffstats
path: root/dozentenmodul/src/main/java/org/openslx/dozmod/gui/window/ImageListWindow.java
blob: 340b320de38dff60a4b43c5b42c6bd191fcb51bd (plain) (tree)
1
2
3
4
5
6
7
8
9

                                      
                      

                                     

                                   

                                     
                           
                      
 
                                
                          
                             
                             
                                  
                             

                                          
 
                               
                                    
                                                      
                                                             
                                                        
                                                         
                                              
                                                    
                                  
                                         
                                                 
                                                 
                                               
                                                                  
                                                 
                                            
                                         

                                            
                                              

                                        
 
                           

                                                            

                                                                                     
                                               
 


                                                                                    
 

                                  
 

                                                                                          
 











                                                                    
                                        
                                                   


                         


                                                                          




                                                                                
                                                               









                                                                               



                                                     
 






                                                                    
                                                                
                                 
                                                                
                                                                                                    

                                                                                          
                                                                                                                                      
                                 






















                                                                                               

                         


                                                                    
                                                                                                       
                                                  





                                                                       
                                                        

                         
 


                                                                     



                                                                                  
                                                                   

                                                                                           

                                                                                                                                                               










                                                                                                                                                             

                         
 






                                                                          
 
         
 
                                                              
                                                    
                                 




                                                                                                      
                                                                                    

                                         

                         

         









                                                                                                             
                 
                                      



                            
                                   
                                   
         




















                                                                                                                                                                                                                                                    
                                                                                             


                                                    









































                                                                                                                                   
 
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.io.File;
import java.io.FileNotFoundException;
import java.util.ArrayList;
import java.util.List;

import javax.swing.JFileChooser;
import javax.swing.JFrame;
import javax.swing.JMenuItem;
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.bwlp.thrift.iface.TransferInformation;
import org.openslx.bwlp.thrift.iface.UserInfo;
import org.openslx.dozmod.filetransfer.DownloadTask;
import org.openslx.dozmod.gui.Gui;
import org.openslx.dozmod.gui.MainWindow;
import org.openslx.dozmod.gui.helper.FileChooser;
import org.openslx.dozmod.gui.helper.MessageType;
import org.openslx.dozmod.gui.helper.PopupMenu;
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.dozmod.thrift.UserCache;
import org.openslx.dozmod.util.FormatHelper;
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;

	private JMenuItem popupItemNewLecture = new JMenuItem("Neue Veranstaltung");
	private JMenuItem popupItemDelete = new JMenuItem("Löschen");
	private JMenuItem popupItemDownload = new JMenuItem("Download");

	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
				applyFilterTable();
			}
		});

		// Setup popup menu for the right panel
		final PopupMenu pop = new PopupMenu(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
				if (e.getSource().equals(popupItemNewLecture)) {
					// TODO new lecture
					LOGGER.debug("New lecture clicked");
				}
				if (e.getSource().equals(popupItemDownload)) {
					performImageDownload();
					LOGGER.debug("Download image clicked");
				}
				if (e.getSource().equals(popupItemDelete)) {
					// TODO delete that image
					LOGGER.debug("Delete image clicked");
				}
			}
		});

		// add them to the popup menu
		pop.addMenuItem(popupItemNewLecture);
		pop.addMenuItem(popupItemDownload);
		pop.addSeparator();
		pop.addMenuItem(popupItemDelete);

		showOwned.addActionListener(new ActionListener() {
			@Override
			public void actionPerformed(ActionEvent e) {
				applyFilterTable();
			}
		});

		imageTable.addMouseListener(new MouseAdapter() {
			@Override
			public void mouseClicked(MouseEvent e) {
				if (SwingUtilities.isLeftMouseButton(e) && e.getClickCount() == 2) {
					final ImageSummaryRead image = getSelectedImage();
					if (image == null) return;
					ImageDetailsWindow.open((JFrame)SwingUtilities.getWindowAncestor(me), image.getImageBaseId());
				}
				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();
				}
			}
		});
		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) {
				performImageDownload();	
			}
		});

		// 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);
	}

	private void performImageDownload() {
		FileChooser fc = new FileChooser(false);
		int action = fc.showOpenDialog(me);
		File file = fc.getSelectedFile();
		if (action != JFileChooser.APPROVE_OPTION || file == null)
			return;
		TransferInformation transInf = null;
		try {
			transInf = ThriftManager.getSatClient().requestDownload(Session.getSatelliteToken(), imageTable.getSelectedItem().latestVersionId);
		} catch ( TException e) {
			LOGGER.error("Failed to get transfer information: ", e);
			return;
		}
		if (transInf == null) 
			return;

		// TODO fix filename/path and consider multiplatform
		try {
			DownloadTask dlTask = new DownloadTask(Session.getSatelliteAddress(), transInf.getPlainPort(), transInf.getToken(), new File(file.getAbsolutePath() + "/HanneloreKraft"), imageTable.getSelectedItem().getFileSize(), null);
		} catch (FileNotFoundException e) {
			LOGGER.error("Got transfer information but failed to download: ", e);
		}
		LOGGER.info(file.getAbsolutePath());
	}

	private void applyFilterTable(){
		try {
			// List for filters
			List<RowFilter<Object,Object>> filters = new ArrayList<RowFilter<Object,Object>>(3);

			// string for text in filter text field
			String filterField = searchTextField.getText();
			filters.add(RowFilter.regexFilter("(?i)"+filterField, 0, 1, 2));
			// filter for user (only show own)
			switch (showOwned.getSelectedIndex()) {
			case 0:
				// no additional filters
				break;
			case 1:
				// filter for owner
				String userFilter = FormatHelper.userName(UserCache.find(Session.getUserId()));
				LOGGER.info(userFilter);
				filters.add(RowFilter.regexFilter("(?i)"+userFilter, 2));
				break;
			case 2:
				// filter for editable
				RowFilter<Object, Object> filter = new RowFilter<Object, Object>() {
					public boolean include(Entry entry) {
						return imageTable.getModelRow((Integer)entry.getIdentifier()).userPermissions.edit;
					}
				};
				filters.add(filter);
				break;
			default:
				break;
			} 
			// for using multiple filters
			RowFilter<Object,Object> andFilters = RowFilter.andFilter(filters);
			imageTable.getRowSorter().setRowFilter(andFilters);

			searchTextField.setForeground(UIManager.getColor("TextField.foreground"));
		} catch (IllegalArgumentException ex) {
			// TODO set background color of search field to something redish
			searchTextField.setForeground(Color.RED);
		}
	}
}