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

                                      
                      
                      

                                     

                                   

                                 

                                   
                        


                             
 


                             
                             








                                          
 
                               

                                                      
                                               

                                                 
                                         
                                                 
                                               
                                                
                                                                     
                                                 







                                               
                           
                                                                                        





                                                                                        
 
                                                                    
 

                                                      
                                   
                                                 
 

                                                                 
                                 

                                                                    

                         

                                                                 
                                                                       
                                 


                                                                    

                         







                                                                    
                                                       
                                                                          



                                                                                         
                                 


                                                                              
                                 
 

                         



                                                                        
                                                   
                                   
                                                   
 
                                                                                
                                                            

                                                                
                                                
                         
 

                                                                 
                                                
                         
 
                                                                 
                                                                              
                                                                               
                                                                               
                                                                                   
                                                                 

                                                                                               

                                                                      


                                 
                                                             

                                                            
 
         
 
           

                                                         
           
                                                        
 







                                                                  
                                                                                                                                               











                                                                                 

                                                                                                                                                    
                                                                  








                                                               


                                                                                 
                             
                                  
                               

                                                               

                                                                         

                                                                                    
                                                               
                                               
 







                                                                                    

                                                       

                                                                              
                                                               



                                                                                       
 




                                                             
                                                            
 
                                                                
 
                                                        
                       
                                             
 
                                            

                                                                             



                                                                   
                                 



                                                                   

                                                                    
                                                

                         
                                                                        







                                                                               
                                                        




                                                                      







                                                                      
                                     
                                 

         


                                                                   

                                                                    
           
                                                     
                                               



                                                     
                                                   
                                                        
                                                  
         

           

                                                                                    
           



                                                           

                                                                        
                                                                             
                                          
         
 






































                                                                                                            

                                          

                                                                                   








                                         
 
package org.openslx.dozmod.gui.window;

import java.awt.Color;
import java.awt.Frame;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.ItemEvent;
import java.awt.event.ItemListener;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.util.Arrays;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;

import javax.swing.JCheckBox;
import javax.swing.JComboBox;
import javax.swing.JLabel;
import javax.swing.JMenuItem;
import javax.swing.JTextField;
import javax.swing.RowFilter;
import javax.swing.UIManager;
import javax.swing.event.ChangeEvent;
import javax.swing.event.ChangeListener;
import javax.swing.event.DocumentEvent;
import javax.swing.event.DocumentListener;
import javax.swing.event.ListDataEvent;
import javax.swing.event.ListDataListener;

import org.apache.log4j.Logger;
import org.openslx.bwlp.thrift.iface.ImageDetailsRead;
import org.openslx.bwlp.thrift.iface.OperatingSystem;
import org.openslx.bwlp.thrift.iface.ShareMode;
import org.openslx.bwlp.thrift.iface.Virtualizer;
import org.openslx.dozmod.gui.Gui;
import org.openslx.dozmod.gui.MainWindow;
import org.openslx.dozmod.gui.helper.MessageType;
import org.openslx.dozmod.gui.helper.PopupMenu;
import org.openslx.dozmod.gui.helper.UiFeedback;
import org.openslx.dozmod.gui.window.layout.ImageDetailsWindowLayout;
import org.openslx.dozmod.permissions.ImagePerms;
import org.openslx.dozmod.thrift.MetaDataCache;
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 ImageDetailsWindow extends ImageDetailsWindowLayout implements UiFeedback {

	private static final Logger LOGGER = Logger.getLogger(ImageDetailsWindow.class);

	private final ImageDetailsWindow me = this;

	private ImageDetailsRead image = null;

	private final JMenuItem[] popupMenuItems = new JMenuItem[2];

	public ImageDetailsWindow(Frame modalParent) {
		super(modalParent);
		setFocusable(true);
		btnSaveChanges.setEnabled(false);

		// Close button closes window
		btnClose.addActionListener(new ActionListener() {
			@Override
			public void actionPerformed(ActionEvent e) {
				dispose();
			}
		});

		// nothing to save at first since nothing changed
		btnSaveChanges.addActionListener(new ActionListener() {
			@Override
			public void actionPerformed(ActionEvent e) {
				LOGGER.debug(("Speichern clicked"));
				// TODO do save
			}
		});
		// Close button closes window
		btnClose.addActionListener(new ActionListener() {
			@Override
			public void actionPerformed(ActionEvent e) {
				dispose();
			}
		});

		// Setup popup menu for the right panel
		final PopupMenu pop = new PopupMenu(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
				if (e.getSource().equals(popupMenuItems[0])) {
					// TODO new lecture wizard with this image preset
					LOGGER.debug("New lecture clicked");
				}
				if (e.getSource().equals(popupMenuItems[1])) {
					// TODO delete that image
					LOGGER.debug("Delete image clicked");
				}

			}
		});
		// our menu items
		popupMenuItems[0] = new JMenuItem("Neue Veranstaltung");
		popupMenuItems[1] = new JMenuItem("Löschen");
		// add them to the popup menu
		pop.addMenuItem(popupMenuItems[0]);
		pop.addSeparator();
		pop.addMenuItem(popupMenuItems[1]);

		// mouse adapter to register clicks and react on the right panel
		final MouseAdapter ma = new MouseAdapter() {
			@Override
			public void mousePressed(MouseEvent e) {
				processClick(e);
			}

			@Override
			public void mouseReleased(MouseEvent e) {
				processClick(e);
			}

			private void processClick(MouseEvent e) {
				int r = versionTable.rowAtPoint(e.getPoint());
				if (r >= 0 && r < versionTable.getRowCount()) {
					// highlight the row and popup the menu
					versionTable.setRowSelectionInterval(r, r);
					if (e.isPopupTrigger()) {
						pop.show(e.getComponent(), e.getX(), e.getY());
					}
				} else {
					versionTable.clearSelection();
				}
			}
		};
		// register mouse adapter for the right panel
		versionTableScrollPane.addMouseListener(ma);
		versionTable.addMouseListener(ma);

	}

	/**
	 * @param imageBaseId
	 *            the id of the image to be displayed
	 */
	public void setImage(final String imageBaseId) {

		QuickTimer.scheduleOnce(new Task() {
			@Override
			public void fire() {
				Exception error = null;
				try {
					synchronized (me) {
						if (image != null)
							return;
						image = ThriftManager.getSatClient().getImageDetails(Session.getSatelliteToken(), imageBaseId);
					}
				} catch (Exception e) {
					error = e;
				}
				// Just prime the cache...
				MetaDataCache.getOperatingSystems();
				MetaDataCache.getVirtualizers();
				final Exception e = error;
				Gui.asyncExec(new Runnable() {
					@Override
					public void run() {
						if (e != null || image == null) {
							Gui.showMessageBox(null, "Konnte Daten des Images nicht abrufen", MessageType.ERROR, LOGGER,
									e);
							dispose();
						} else {
							fill();
						}
					}
				});
			}
		});
	}

	/**
	 * callback function when we received the image's details from the server
	 */
	private void fill() {
		if (image == null)
			return;
		txtTitle.setText(image.getImageName());
		txtDescription.setText(image.getDescription());
		lblOwner.setUser(UserCache.find(image.getOwnerId()));
		lblUpdater.setUser(UserCache.find(image.getUpdaterId()));
		lblCreateTime.setText(FormatHelper.longDate(image.getCreateTime()));
		lblUpdateTime.setText(FormatHelper.longDate(image.getUpdateTime()));
		txtVersion.setText(image.getLatestVersionId());
		setTitle(image.getImageName());

		List<OperatingSystem> osList = MetaDataCache.getOperatingSystems();
		// all fine, lets sort it
		Collections.sort(osList, new Comparator<OperatingSystem>() {
			public int compare(OperatingSystem o1, OperatingSystem o2) {
				return o1.getOsName().compareTo(o2.getOsName());
			}
		});
		for (OperatingSystem os : osList) {
			cboOperatingSystem.addItem(os);
		}
		OperatingSystem os = MetaDataCache.getOsById(image.getOsId());
		if (os != null) {
			cboOperatingSystem.setSelectedItem(os);
		}
		Virtualizer virt = MetaDataCache.getVirtualizerById(image.getVirtId());
		if (virt != null)
			lblVirtualizer.setText(virt.getVirtName());

		String tagsString = "";
		for (String tag : image.getTags()) {
			tagsString = tagsString + ", " + tag;
		}
		txtTags.setText(tagsString);
		btnIsTemplate.setSelected(image.isTemplate);

		versionTable.setData(image.getVersions(), true);

		makeEditable(ImagePerms.canEdit(image));
		pack();
		MainWindow.centerShell(this);

		// final step, add listeners
		final DocumentListener docListener = new DocumentListener() {
			@Override
			public void removeUpdate(DocumentEvent e) {
				changedUpdate(e);
			}

			@Override
			public void insertUpdate(DocumentEvent e) {
				changedUpdate(e);
			}

			@Override
			public void changedUpdate(DocumentEvent e) {
				reactToChange();
			}
		};
		txtTitle.getDocument().addDocumentListener(docListener);
		txtDescription.getDocument().addDocumentListener(docListener);
		txtTags.getDocument().addDocumentListener(docListener);

		// Comboboxes
		final ItemListener comboItemListener = new ItemListener() {
			@Override
			public void itemStateChanged(ItemEvent e) {
				if (e.getStateChange() == ItemEvent.SELECTED) {
					reactToChange();
				}
			}
		};
		cboOperatingSystem.addItemListener(comboItemListener);
		cboShareMode.addItemListener(comboItemListener);
		btnIsTemplate.addActionListener(new ActionListener() {

			@Override
			public void actionPerformed(ActionEvent e) {
				reactToChange();

			}
		});
		// finally do show it
		setVisible(true);
	}

	/**
	 * Enables/disables the editable fields based on 'editable'
	 * 
	 * @param editable
	 *            true to make fields editable, false otherwise.
	 */
	private void makeEditable(boolean editable) {
		txtTitle.setEditable(editable);
		txtDescription.setEditable(editable);
		txtTags.setEditable(editable);
		txtVersion.setEditable(editable);
		txtId.setEditable(editable);
		btnIsTemplate.setEnabled(editable);
		cboOperatingSystem.setEnabled(editable);
		cboShareMode.setEnabled(editable);
	}

	/**
	 * Opens a new ImageDetailsWindow showing the details of the image with ID =
	 * imageBaseId
	 * 
	 * @param modalParent
	 *            parent of this window
	 * @param imageBaseId
	 *            id of the image to set the details of
	 */
	public static void open(Frame modalParent, String imageBaseId) {
		ImageDetailsWindow win = new ImageDetailsWindow(modalParent);
		win.setImage(imageBaseId);
	}

	/**
	 * Checks whether the user changed any fields of the image details and
	 * enables the save button if so.
	 * 
	 */
	private void reactToChange() {
		boolean changed = false;
		// Image name:
		if (!txtTitle.getText().equals(image.getImageName())) {
			LOGGER.debug("Title changed to: " + txtTitle.getText());
			changed =true;
		}
		// Image description:
		if (!txtDescription.getText().equals(image.getDescription())) {
			LOGGER.debug("Description changed to: " + txtDescription.getText());
			changed = true;
		}
		// OS:
		OperatingSystem newOs = cboOperatingSystem.getItemAt(cboOperatingSystem.getSelectedIndex());
		if (newOs != null && newOs.getOsId() != image.getOsId()) {
			LOGGER.debug("OS changed to: " + newOs.getOsName());
			changed = true;
		}
		// TODO TAGS
		// ShareMode:
		ShareMode newShareMode = cboShareMode.getItemAt(cboShareMode.getSelectedIndex());
		if (newShareMode != null && !newShareMode.equals(image.shareMode)) {
			LOGGER.debug("ShareMode changed to: " + newShareMode);
			changed = true;
		}
		// Template:
		if (btnIsTemplate.isSelected() != image.isTemplate) {
			LOGGER.debug("Template changed to: " + btnIsTemplate.isSelected());
			changed = true;
		}
		btnSaveChanges.setEnabled(changed);

	}

	@Override
	public boolean wantConfirmQuit() {
		// Maybe return true if the user changed one of the fields, but not
		// really a priority
		return false;
	}

	@Override
	public void escapePressed() {
		// Also ask if applicable
		this.dispose();
	}

}