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

                                      

                                     

                                 

                                   
 
                          
                             
                               
                                  

                                               
 
                               
                                                      
                                  
                                         
                                                       
                                                 
                                               
                                                                             
                                                                  
                                                         
                                                   
                                                 
                                               
                                                              
                                                                
 
   
   
   
                           
                                                                                                        
 

                                                                                     


                         
                                               
 
           
                                                      

                                                                             
 
           

                           
                                                                                          
                                                                            

                                                                              
 


                      

                                  
 


                                                                     

                                                                          
                                                                                
                                                                                         
                                 


                                                                                       
                                                                              
                                                                                           

                                                                            
                                                                                      




                                             
                                                     
                                               


                                                   
 


                                  






                                                                                                     
 



                                                                       
                                                                             



                                 
                                                                
                                 
                                                                
                                                                                                    
                                                                                       
                                 

                                                
 




















                                                                                               

                         



                                                


                                                                    
                                                                                                               
                                                                       

                         



                                                                                 

                         





                                                                               


                                                                       
                                                                                   

                         

                                                                     
                                                                     
                                                                              

                         
                                                                         

                                                                    
                                                                             

                         
 
                                             
         



                                                                                         
           

                                                                                          






                                                                          
                                  




                                                                                                          
                 
                            
         
 




                                                                                   
                                                                    


                                                                                    







                                                          



                                                                                         
           












                                                                                                                              




                                                          


                                                               

                                                                                                              




                                                                                       
 








                                                                   
                                                                                                         

                                                                                     
 
           
                                             




                                                              
                               


                                                      
                                                                        


                                                                                
                 
         
 




                                                                      
                                                                    
                                                                                                                    
         
 
           
                                             
           
                                                              
           

                                                
                                                           

         


                                                                                         
           







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