Project: VisiCut
/**
 * This file is part of VisiCut. 
 * Copyright (C) 2012 Thomas Oster <[email protected]
 * RWTH Aachen University - 52062 Aachen, Germany 
 *  
 *     VisiCut is free software: you can redistribute it and/or modify 
 *     it under the terms of the GNU Lesser General Public License as published by 
 *     the Free Software Foundation, either version 3 of the License, or 
 *     (at your option) any later version. 
 *  
 *    VisiCut is distributed in the hope that it will be useful, 
 *     but WITHOUT ANY WARRANTY; without even the implied warranty of 
 *     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the 
 *     GNU Lesser General Public License for more details. 
 *  
 *     You should have received a copy of the GNU Lesser General Public License 
 *     along with VisiCut.  If not, see <http://www.gnu.org/licenses/>. 
 **/
package com.t_oster.visicut.gui.beans; 
 
import com.t_oster.visicut.misc.ExtensionFilter; 
import com.t_oster.visicut.misc.Helper; 
import java.awt.FileDialog; 
import java.awt.Frame; 
import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 
import java.awt.event.MouseEvent; 
import java.awt.event.MouseListener; 
import java.io.File; 
import java.io.FilenameFilter; 
import javax.swing.JButton; 
import javax.swing.JFileChooser; 
import javax.swing.JMenuItem; 
import javax.swing.JPopupMenu; 
 
/**
 * This Button displays a Thumbnail if a thumbnailPath String is given. 
 * If clicked, it displays a File Selection Dialog, which can select 
 * PNG files and sets its Thumbnail if a PNG file is selected. 
 * @author Thomas Oster <[email protected]
 */
 
public class SelectThumbnailButton extends JButton implements ActionListener 
 
  public SelectThumbnailButton(String path) 
  { 
    this.setThumbnailPath(path); 
    this.addActionListener(this); 
    this.prepareMenu(); 
  } 
   
  private void prepareMenu() 
  { 
    final JPopupMenu menu = new JPopupMenu(); 
    JMenuItem mi = new JMenuItem("remove"); 
    mi.addActionListener(new ActionListener(){ 
      public void actionPerformed(ActionEvent ae) 
      { 
        SelectThumbnailButton.this.setThumbnailPath(null); 
      } 
    }); 
    menu.add(mi); 
    this.addMouseListener(new MouseListener(){ 
 
      public void mouseClicked(MouseEvent me) 
      { 
        if (me.getButton() == MouseEvent.BUTTON3 && SelectThumbnailButton.this.getThumbnailPath() != null
        { 
          menu.show(SelectThumbnailButton.this, me.getX(), me.getY()); 
        } 
      } 
 
      public void mousePressed(MouseEvent me) 
      { 
      } 
 
      public void mouseReleased(MouseEvent me) 
      { 
      } 
 
      public void mouseEntered(MouseEvent me) 
      { 
      } 
 
      public void mouseExited(MouseEvent me) 
      { 
      } 
    }); 
  } 
 
  public SelectThumbnailButton() 
  { 
    this(null); 
  } 
   
  protected File defaultDirectory = null
 
  /**
   * Get the value of defaultDirectory 
   * 
   * @return the value of defaultDirectory 
   */
 
  public File getDefaultDirectory() 
  { 
    return defaultDirectory; 
  } 
 
  /**
   * Set the value of defaultDirectory 
   * 
   * @param defaultDirectory new value of defaultDirectory 
   */
 
  public void setDefaultDirectory(File defaultDirectory) 
  { 
    this.defaultDirectory = defaultDirectory; 
  } 
 
   
  protected String thumbnailPath = null
  public static final String PROP_THUMBNAILPATH = "thumbnailPath"
 
  /**
   * Get the value of thumbnailPath 
   * 
   * @return the value of thumbnailPath 
   */
 
  public String getThumbnailPath() 
  { 
    return thumbnailPath; 
  } 
 
  /**
   * Set the value of thumbnailPath 
   * This will repaint the Button to display  
   * the Thubnnail found on the given path 
   * 
   * @param thumbnailPath new value of thumbnailPath 
   */
 
  public final void setThumbnailPath(String thumbnailPath) 
  { 
    String oldThumbnailPath = this.thumbnailPath; 
    this.thumbnailPath = thumbnailPath; 
    firePropertyChange(PROP_THUMBNAILPATH, oldThumbnailPath, thumbnailPath); 
    if (thumbnailPath == null
    { 
      this.setText("<html><table cellpadding=3><tr><td>"+Helper.imgTag(this.getClass().getResource("resources/no-image.png"), 6464)+"</td></tr></table></html>"); 
    } 
    else 
    { 
      File f = new File(thumbnailPath); 
      if (f.exists()) 
      { 
        this.setText("<html><table cellpadding=3><tr><td>"+Helper.imgTag(f, 6464)+"</td></tr></table></html>"); 
      } 
      else 
      { 
        this.setText(java.util.ResourceBundle.getBundle("com/t_oster/visicut/gui/beans/resources/SelectThumbnailButton").getString("FILE NOT FOUND")); 
      } 
    } 
  } 
 
  public void actionPerformed(ActionEvent ae) 
  { 
    if (Helper.isMacOS()) 
    { 
      FileDialog fd = new FileDialog((Frame) null, java.util.ResourceBundle.getBundle("com/t_oster/visicut/gui/beans/resources/SelectThumbnailButton").getString("PLEASE SELECT A THUMBNAIL")); 
      fd.setMode(FileDialog.LOAD); 
      fd.setFilenameFilter(new FilenameFilter() 
      { 
 
        public boolean accept(File file, String string) 
        { 
          return string.toLowerCase().endsWith("png"); 
        } 
         
      }); 
      if (getDefaultDirectory() != null
      { 
        fd.setDirectory(getDefaultDirectory().getAbsolutePath()); 
      } 
      if (getThumbnailPath() != null
      { 
        File tb = new File(getThumbnailPath()); 
        fd.setDirectory(tb.getParent()); 
        fd.setFile(tb.getName()); 
      } 
      fd.setVisible(true); 
      if (fd.getFile() != null
      { 
        File tb = new File(fd.getDirectory(), fd.getFile()); 
        setThumbnailPath(tb.getAbsolutePath()); 
      } 
    } 
    else 
    { 
      JFileChooser fc = new JFileChooser(); 
      fc.setAcceptAllFileFilterUsed(false); 
      fc.addChoosableFileFilter(new ExtensionFilter(".png", java.util.ResourceBundle.getBundle("com/t_oster/visicut/gui/beans/resources/SelectThumbnailButton").getString("PNG FILES (*.PNG)"))); 
      if (getDefaultDirectory() != null
      { 
        fc.setCurrentDirectory(getDefaultDirectory()); 
      } 
      if (getThumbnailPath() != null
      { 
        fc.setSelectedFile(new File(getThumbnailPath())); 
        fc.setCurrentDirectory(new File(getThumbnailPath()).getParentFile()); 
      } 
      fc.setDialogType(JFileChooser.OPEN_DIALOG); 
      if (fc.showOpenDialog(this) == JFileChooser.APPROVE_OPTION) 
      { 
        File thumb = fc.getSelectedFile(); 
        setThumbnailPath(thumb.getPath()); 
      } 
    } 
  } 
}