Package org.pdfsam.guiclient.commons.panels

Source Code of org.pdfsam.guiclient.commons.panels.JVisualPdfPageSelectionPanel

/*
* Created on 18-Jun-2008
* Copyright (C) 2008 by Andrea Vacondio.
*
* This program is free software; you can redistribute it and/or modify it under the terms of the
* GNU General Public License as published by the Free Software Foundation;
* either version 2 of the License.
* This program 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 General Public License for more details.
* You should have received a copy of the GNU General Public License along with this program;
* if not, write to the Free Software Foundation, Inc.,
*  59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
package org.pdfsam.guiclient.commons.panels;

import java.awt.Component;
import java.awt.Dimension;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.Insets;
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 java.io.File;
import java.util.ArrayList;
import java.util.Collection;
import java.util.LinkedHashSet;
import java.util.List;
import java.util.Set;

import javax.swing.BorderFactory;
import javax.swing.Box;
import javax.swing.BoxLayout;
import javax.swing.DropMode;
import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JLabel;
import javax.swing.JList;
import javax.swing.JMenuItem;
import javax.swing.JPanel;
import javax.swing.JPopupMenu;
import javax.swing.JScrollPane;
import javax.swing.ListSelectionModel;

import org.apache.commons.lang.StringUtils;
import org.apache.log4j.Logger;
import org.pdfsam.console.business.dto.commands.ConcatParsedCommand;
import org.pdfsam.guiclient.business.PagePreviewOpener;
import org.pdfsam.guiclient.business.PagesWorker;
import org.pdfsam.guiclient.business.listeners.EnterDoClickListener;
import org.pdfsam.guiclient.commons.business.listeners.VisualPdfSelectionActionListener;
import org.pdfsam.guiclient.commons.business.listeners.adapters.PageOpenerMouseAdapter;
import org.pdfsam.guiclient.commons.business.listeners.adapters.VisualPdfSelectionKeyAdapter;
import org.pdfsam.guiclient.commons.business.listeners.adapters.VisualPdfSelectionMouseAdapter;
import org.pdfsam.guiclient.commons.business.listeners.mediators.PagesActionsMediator;
import org.pdfsam.guiclient.commons.business.loaders.PdfThumbnailsLoader;
import org.pdfsam.guiclient.commons.components.JVisualSelectionList;
import org.pdfsam.guiclient.commons.dnd.handlers.VisualListExportTransferHandler;
import org.pdfsam.guiclient.commons.dnd.handlers.VisualListTransferHandler;
import org.pdfsam.guiclient.commons.models.VisualListModel;
import org.pdfsam.guiclient.commons.renderers.VisualListRenderer;
import org.pdfsam.guiclient.configuration.Configuration;
import org.pdfsam.guiclient.dto.DocumentInfo;
import org.pdfsam.guiclient.dto.Rotation;
import org.pdfsam.guiclient.dto.VisualPageListItem;
import org.pdfsam.guiclient.dto.VisualSelectedItem;
import org.pdfsam.i18n.GettextResource;

/**
* Customizable panel for a visual page selection
* @author Andrea Vacondio
*
*/
public class JVisualPdfPageSelectionPanel extends JPanel {

  private static final long serialVersionUID = 1384691784810385438L;

  private static final Logger log = Logger.getLogger(JVisualPdfPageSelectionPanel.class.getPackage().getName());
 
  public static final int HORIZONTAL_ORIENTATION = 1;
  public static final int VERTICAL_ORIENTATION = 2;
 
  public static final int SINGLE_INTERVAL_SELECTION = ListSelectionModel.SINGLE_INTERVAL_SELECTION;
  public static final int MULTIPLE_INTERVAL_SELECTION = ListSelectionModel.MULTIPLE_INTERVAL_SELECTION;
  public static final int SINGLE_SELECTION = ListSelectionModel.SINGLE_SELECTION;

  public static final int STYLE_TOP_PANEL_HIDE = 0;
  public static final int STYLE_TOP_PANEL_MINIMAL = 1;
  public static final int STYLE_TOP_PANEL_MEDIUM = 2;
  public static final int STYLE_TOP_PANEL_FULL = 3;
 
  public static final int DND_SUPPORT_NONE = 0;
  public static final int DND_SUPPORT_FILES = 1;
  public static final int DND_SUPPORT_JAVAOBJECTS = 2;
  public static final int DND_SUPPORT_FILES_AND_JAVAOBJECTS = 3;
 
  public static final String OUTPUT_PATH_PROPERTY = "defaultOutputPath"

  private int orientation = HORIZONTAL_ORIENTATION;
  private File selectedPdfDocument = null;
  private String selectedPdfDocumentPassword = "";
  private boolean showButtonPanel = true;
  private int topPanelStyle = STYLE_TOP_PANEL_FULL;
  private boolean showContextMenu = true;
  private int dndSupport = DND_SUPPORT_NONE;
  private int selectionType = SINGLE_INTERVAL_SELECTION;
  private final JMenuItem menuItemSetOutputPath = new JMenuItem();
  /**
   * if true, deleted items appear with a red cross over
   */
  private boolean drawDeletedItems = true;
  //if the JList uses wrap
  private boolean wrap = false;
 
 
  private Configuration config;
  private PagesWorker pagesWorker;
    //menu
  private final JButton loadFileButton = new JButton();
  private final JButton clearButton = new JButton();
  private final JButton zoomInButton = new JButton();
  private final JButton zoomOutButton = new JButton();
 
    private final JLabel documentProperties = new JLabel();   
    private final JVisualSelectionList thumbnailList = new JVisualSelectionList();
    private PdfThumbnailsLoader pdfLoader;
    private VisualPdfSelectionActionListener pdfSelectionActionListener;
    private PagesActionsMediator pageActionListener;
  private final JPopupMenu popupMenu = new JPopupMenu();
  private final JMenuItem menuItemPreview = new JMenuItem();
  private final JPanel topPanel = new JPanel();
 
  //button panel
  private JPanel buttonPanel;
  private JButton undeleteButton;
    private JButton removeButton;
    private JButton moveUpButton;
    private JButton moveDownButton;
    private JButton rotateButton;
    private JButton rotateAntiButton;
    private JButton reverseButton;

    /**
     * default constructor
     */
  public JVisualPdfPageSelectionPanel() {
    this(HORIZONTAL_ORIENTATION);
  }
  /**
   * draw deleted items default value (true)
   * show button panel default value (true)
   * @param orientation panel orientation
   */
  public JVisualPdfPageSelectionPanel(int orientation){
    this(orientation, true, true);
  }
 
  /**
   * @param orientation panel orientation
   * @param drawDeletedItems if true deleted items appear with a red cross over
   * @param showButtonPanel true=shows button panel
   */
  public JVisualPdfPageSelectionPanel(int orientation, boolean drawDeletedItems, boolean showButtonPanel){
    this(orientation, drawDeletedItems, showButtonPanel, true, STYLE_TOP_PANEL_FULL);
  }

  /**
   *
   * @param orientation panel orientation
   * @param drawDeletedItems if true deleted items appear with a red cross over
   * @param showButtonPanel true=shows button panel
   * @param showContextMenu
   * @param topPanelStyle
   */
  public JVisualPdfPageSelectionPanel(int orientation, boolean drawDeletedItems, boolean showButtonPanel,
      boolean showContextMenu, int topPanelStyle){
    this(orientation, drawDeletedItems, showButtonPanel, showContextMenu, topPanelStyle, DND_SUPPORT_FILES_AND_JAVAOBJECTS, SINGLE_INTERVAL_SELECTION);
  }
   
  /**
   *
   * @param orientation panel orientation
   * @param drawDeletedItems if true deleted items appear with a red cross over
   * @param showButtonPanel true=shows button panel
   * @param showContextMenu
   * @param topPanelStyle top panel style
   * @param selectionType selection type
   */
  public JVisualPdfPageSelectionPanel(int orientation, boolean drawDeletedItems, boolean showButtonPanel,
      boolean showContextMenu, int topPanelStyle, int dndSupport, int selectionType){
    this.orientation = orientation;
    this.config = Configuration.getInstance();
    this.pdfLoader = new PdfThumbnailsLoader(this);
    this.drawDeletedItems = drawDeletedItems;
    this.showButtonPanel = showButtonPanel;
    this.showContextMenu = showContextMenu;
    this.topPanelStyle = topPanelStyle;
    this.dndSupport = dndSupport;   
    this.selectionType = selectionType;
    init();   
  }
  /**
   * panel initialization
   */
  private void init(){
    setLayout(new GridBagLayout());
   
    thumbnailList.setDrawDeletedItems(drawDeletedItems);
    if(dndSupport == DND_SUPPORT_FILES){
      thumbnailList.setTransferHandler(new VisualListExportTransferHandler(pdfLoader));
    }else if(dndSupport == DND_SUPPORT_JAVAOBJECTS){
      thumbnailList.setTransferHandler(new VisualListTransferHandler());
    }else if(dndSupport == DND_SUPPORT_FILES_AND_JAVAOBJECTS){
      thumbnailList.setTransferHandler(new VisualListTransferHandler(pdfLoader));
    }else{
      thumbnailList.setTransferHandler(new VisualListExportTransferHandler(null));
    }
    thumbnailList.setDragEnabled(true);
    thumbnailList.setDropMode(DropMode.INSERT);
    pagesWorker = new PagesWorker(thumbnailList);
    thumbnailList.addKeyListener(new VisualPdfSelectionKeyAdapter(pagesWorker));
    thumbnailList.addMouseListener(new PageOpenerMouseAdapter(thumbnailList));
   
    if(showButtonPanel){
      initButtonPanel(pagesWorker);
      initKeyListener();
    }
   
    //JList orientation
    if(HORIZONTAL_ORIENTATION == orientation){
      thumbnailList.setLayoutOrientation(JList.HORIZONTAL_WRAP);
    }else{
      if(wrap){
        thumbnailList.setLayoutOrientation(JList.VERTICAL_WRAP);
      }
    }
       
    topPanel.setLayout(new BoxLayout(topPanel, BoxLayout.LINE_AXIS));
    topPanel.setPreferredSize(new Dimension(400,30));
   
      pdfSelectionActionListener = new VisualPdfSelectionActionListener(this, pdfLoader);
    if(topPanelStyle>=STYLE_TOP_PANEL_FULL){
        //load button
      loadFileButton.setMargin(new Insets(1, 1, 1, 1));
      loadFileButton.setText(GettextResource.gettext(config.getI18nResourceBundle(),"Open"));
      loadFileButton.setPreferredSize(new Dimension(100,30));
      loadFileButton.setToolTipText(GettextResource.gettext(config.getI18nResourceBundle(),"Load a pdf document"));
      loadFileButton.setIcon(new ImageIcon(this.getClass().getResource("/images/add.png")));
      loadFileButton.addKeyListener(new EnterDoClickListener(loadFileButton));
      loadFileButton.setAlignmentX(Component.CENTER_ALIGNMENT);
      loadFileButton.setAlignmentY(Component.CENTER_ALIGNMENT);
      loadFileButton.setActionCommand(VisualPdfSelectionActionListener.ADD);
      loadFileButton.addActionListener(pdfSelectionActionListener);   
    }
    documentProperties.setIcon(new ImageIcon(this.getClass().getResource("/images/info.png")));
    documentProperties.setVisible(false);
   
       
    if(topPanelStyle>=STYLE_TOP_PANEL_MEDIUM){
      clearButton.setMargin(new Insets(1, 1, 1, 1));
      clearButton.setMinimumSize(new Dimension(30,30));
      clearButton.setText(GettextResource.gettext(config.getI18nResourceBundle(),"Clear"));
      clearButton.setIcon(new ImageIcon(this.getClass().getResource("/images/clear.png")));
      clearButton.addActionListener(new ActionListener() {
        public void actionPerformed(ActionEvent e) {
          resetPanel();
        }
          });
    }
   
    zoomInButton.setMargin(new Insets(1, 1, 1, 1));
    zoomInButton.setMinimumSize(new Dimension(30,30));
    zoomInButton.setText(GettextResource.gettext(config.getI18nResourceBundle(),"Zoom in"));
    zoomInButton.setIcon(new ImageIcon(this.getClass().getResource("/images/zoomin.png")));
    zoomInButton.addActionListener(new ActionListener() {
      public void actionPerformed(ActionEvent e) {           
                try{
                  thumbnailList.incZoomLevel();
                zoomOutButton.setEnabled(true);
                  if(thumbnailList.getCurrentZoomLevel() >= JVisualSelectionList.MAX_ZOOM_LEVEL){
                    zoomInButton.setEnabled(false);
                  }
                  ((VisualListModel)thumbnailList.getModel()).elementsChanged();
                }
                catch (Exception ex){
                    log.error(GettextResource.gettext(config.getI18nResourceBundle(),"Error setting zoom level."), ex);
                }               
            }
        });   

    zoomOutButton.setMargin(new Insets(1, 1, 1, 1));
    zoomOutButton.setMinimumSize(new Dimension(30,30));
    zoomOutButton.setText(GettextResource.gettext(config.getI18nResourceBundle(),"Zoom out"));
    zoomOutButton.setIcon(new ImageIcon(this.getClass().getResource("/images/zoomout.png")));
    zoomOutButton.addActionListener(new ActionListener() {
      public void actionPerformed(ActionEvent e) {              
                try{
                  thumbnailList.deincZoomLevel();
                  zoomInButton.setEnabled(true);
                  if(thumbnailList.getCurrentZoomLevel() <= JVisualSelectionList.MIN_ZOOM_LEVEL){
                    zoomOutButton.setEnabled(false);
                  }
                  ((VisualListModel)thumbnailList.getModel()).elementsChanged();
                }
                catch (Exception ex){
                    log.error(GettextResource.gettext(config.getI18nResourceBundle(),"Error setting zoom level."), ex);
                }               
            }
        });   

    thumbnailList.setModel(new VisualListModel());
    thumbnailList.setCellRenderer(new VisualListRenderer());
    thumbnailList.setVisibleRowCount(-1);
    thumbnailList.setSelectionMode(selectionType);   
    JScrollPane listScroller = new JScrollPane(thumbnailList);   

    //preview item 
    menuItemPreview.setIcon(new ImageIcon(this.getClass().getResource("/images/preview-viewer.png")));
    menuItemPreview.setText(GettextResource.gettext(config.getI18nResourceBundle(),"Preview"));
    menuItemPreview.addMouseListener(new MouseAdapter() {
            public void mouseReleased(MouseEvent e) {
              int[] selection = thumbnailList.getSelectedIndices();
              if(selection!=null && selection.length==1){
                VisualPageListItem item = (VisualPageListItem) thumbnailList.getModel().getElementAt(selection[0]);
                PagePreviewOpener.getInstance().openPreview(item.getParentFileCanonicalPath(), item.getDocumentPassword(), item.getPageNumber());
              }
            }
        });
   
    if(showContextMenu){
      //popup
      final JMenuItem menuItemMoveUp = new JMenuItem();
      menuItemMoveUp.setIcon(new ImageIcon(this.getClass().getResource("/images/up.png")));
      menuItemMoveUp.setText(GettextResource.gettext(config.getI18nResourceBundle(),"Move Up"));
      menuItemMoveUp.addMouseListener(new VisualPdfSelectionMouseAdapter(PagesWorker.MOVE_UP, pagesWorker));
      popupMenu.add(menuItemMoveUp);
     
      final JMenuItem menuItemMoveDown = new JMenuItem();
      menuItemMoveDown.setIcon(new ImageIcon(this.getClass().getResource("/images/down.png")));
      menuItemMoveDown.setText(GettextResource.gettext(config.getI18nResourceBundle(),"Move Down"));
      menuItemMoveDown.addMouseListener(new VisualPdfSelectionMouseAdapter(PagesWorker.MOVE_DOWN, pagesWorker));
      popupMenu.add(menuItemMoveDown);
     
      final JMenuItem menuItemRemove = new JMenuItem();
      menuItemRemove.setIcon(new ImageIcon(this.getClass().getResource("/images/remove.png")));
      menuItemRemove.setText(GettextResource.gettext(config.getI18nResourceBundle(),"Delete"));
      menuItemRemove.addMouseListener(new VisualPdfSelectionMouseAdapter(PagesWorker.REMOVE, pagesWorker));
      popupMenu.add(menuItemRemove);
     
          //if elements are physically deleted i don't need this item
          if(drawDeletedItems){
        final JMenuItem menuItemUndelete = new JMenuItem();
        menuItemUndelete.setIcon(new ImageIcon(this.getClass().getResource("/images/remove.png")));
        menuItemUndelete.setText(GettextResource.gettext(config.getI18nResourceBundle(),"Undelete"));
        menuItemUndelete.addMouseListener(new VisualPdfSelectionMouseAdapter(PagesWorker.UNDELETE, pagesWorker));
        popupMenu.add(menuItemUndelete);
          }         
       
        //rotate item 
        final JMenuItem menuItemRotate = new JMenuItem();
        menuItemRotate.setIcon(new ImageIcon(this.getClass().getResource("/images/clockwise.png")));
        menuItemRotate.setText(GettextResource.gettext(config.getI18nResourceBundle(),"Rotate clockwise"));
        menuItemRotate.addMouseListener(new VisualPdfSelectionMouseAdapter(PagesWorker.ROTATE_CLOCK, pagesWorker));
        popupMenu.add(menuItemRotate);
       
        //rotate anticlock item 
        final JMenuItem menuItemAntiRotate = new JMenuItem();
        menuItemAntiRotate.setIcon(new ImageIcon(this.getClass().getResource("/images/anticlockwise.png")));
        menuItemAntiRotate.setText(GettextResource.gettext(config.getI18nResourceBundle(),"Rotate anticlockwise"));
        menuItemAntiRotate.addMouseListener(new VisualPdfSelectionMouseAdapter(PagesWorker.ROTATE_ANTICLOCK, pagesWorker));
        popupMenu.add(menuItemAntiRotate);
       
        //reverse item 
        final JMenuItem menuItemReverse = new JMenuItem();
        menuItemReverse.setIcon(new ImageIcon(this.getClass().getResource("/images/reverse.png")));
        menuItemReverse.setText(GettextResource.gettext(config.getI18nResourceBundle(),"Reverse"));
        menuItemReverse.addMouseListener(new VisualPdfSelectionMouseAdapter(PagesWorker.REVERSE, pagesWorker));
        popupMenu.add(menuItemReverse);
       
          enableSetOutputPathMenuItem();
         
          addPopupShower();
    }
   
    popupMenu.add(menuItemPreview);

   
    if(topPanelStyle>=STYLE_TOP_PANEL_FULL){
      topPanel.add(Box.createRigidArea(new Dimension(5, 0)));
      topPanel.add(loadFileButton);
    }
    if(topPanelStyle>=STYLE_TOP_PANEL_MEDIUM){
      topPanel.add(Box.createRigidArea(new Dimension(5, 0)));
      topPanel.add(clearButton);
    }
    topPanel.add(Box.createRigidArea(new Dimension(5, 0)));
    topPanel.add(documentProperties);
    topPanel.add(Box.createHorizontalGlue());
    topPanel.add(zoomInButton);
    topPanel.add(Box.createRigidArea(new Dimension(5, 0)));
    topPanel.add(zoomOutButton);
   
    GridBagConstraints topConstraints = new GridBagConstraints();
    topConstraints.fill = GridBagConstraints.BOTH  ;
    topConstraints.gridx=0;
    topConstraints.gridy=0;
    topConstraints.gridwidth=3;
    topConstraints.gridheight=1;
    topConstraints.insets = new Insets(5,5,5,5);
    topConstraints.weightx=1.0;
    topConstraints.weighty=0.0;   
    if(topPanelStyle>STYLE_TOP_PANEL_HIDE){
      add(topPanel, topConstraints);
    }

    GridBagConstraints thumbConstraints = new GridBagConstraints();
    thumbConstraints.fill = GridBagConstraints.BOTH;
    thumbConstraints.gridx=0;
    thumbConstraints.gridy=1;
    thumbConstraints.gridwidth=(showButtonPanel?2:3);
    thumbConstraints.gridheight=2;
    thumbConstraints.insets = new Insets(5,5,5,5);
    thumbConstraints.weightx=1.0;
    thumbConstraints.weighty=1.0;   
    add(listScroller, thumbConstraints);
   
    if(showButtonPanel){
      GridBagConstraints buttonsConstraints = new GridBagConstraints();
      buttonsConstraints.fill = GridBagConstraints.BOTH;
      buttonsConstraints.gridx=2;
      buttonsConstraints.gridy=1;
      buttonsConstraints.gridwidth=1;
      buttonsConstraints.gridheight=2;
      buttonsConstraints.insets = new Insets(5,5,5,5);
      buttonsConstraints.weightx=0.0;
      buttonsConstraints.weighty=1.0;   
      add(buttonPanel, buttonsConstraints);
    }
  }
 
 
  /**
     * adds a button to the button panel
     * @param button
     */
    private void addButtonToButtonPanel(JButton button){
      button.setMinimumSize(new Dimension(90, 25));
      button.setMaximumSize(new Dimension(160, 25));
      buttonPanel.add(button);
    buttonPanel.add(Box.createRigidArea(new Dimension(0,5)));
    }
   
  private void initButtonPanel(PagesWorker pagesWorker){
    buttonPanel = new JPanel();
    buttonPanel.setLayout(new BoxLayout(buttonPanel, BoxLayout.Y_AXIS));
    buttonPanel.setBorder(BorderFactory.createEmptyBorder(0, 10, 10, 10));
   
      pageActionListener = new PagesActionsMediator(pagesWorker);

      //move up button
    moveUpButton = new JButton();
    moveUpButton.setMargin(new Insets(2, 2, 2, 2));
    moveUpButton.addActionListener(pageActionListener);       
    moveUpButton.setIcon(new ImageIcon(this.getClass().getResource("/images/up.png")));
    moveUpButton.setActionCommand(PagesWorker.MOVE_UP);
    moveUpButton.setText(GettextResource.gettext(config.getI18nResourceBundle(),"Move Up"));
    moveUpButton.setToolTipText(GettextResource.gettext(config.getI18nResourceBundle(),"Move up selected pages")+" "+GettextResource.gettext(config.getI18nResourceBundle(),"(Alt+ArrowUp)"));
    moveUpButton.addKeyListener(new EnterDoClickListener(moveUpButton));
    moveUpButton.setAlignmentX(Component.CENTER_ALIGNMENT);
    addButtonToButtonPanel(moveUpButton);
   
      //move down button
    moveDownButton = new JButton();
    moveDownButton.addActionListener(pageActionListener);
    moveDownButton.setIcon(new ImageIcon(this.getClass().getResource("/images/down.png")));
    moveDownButton.setActionCommand(PagesWorker.MOVE_DOWN);
    moveDownButton.setMargin(new Insets(2, 2, 2, 2));
    moveDownButton.setText(GettextResource.gettext(config.getI18nResourceBundle(),"Move Down"));
    moveDownButton.setToolTipText(GettextResource.gettext(config.getI18nResourceBundle(),"Move down selected pages")+" "+GettextResource.gettext(config.getI18nResourceBundle(),"(Alt+ArrowDown)"));
    moveDownButton.addKeyListener(new EnterDoClickListener(moveDownButton));
    moveDownButton.setAlignmentX(Component.CENTER_ALIGNMENT);
    addButtonToButtonPanel(moveDownButton);
   
    //delete button
    removeButton = new JButton();
    removeButton.addActionListener(pageActionListener);
    removeButton.setIcon(new ImageIcon(this.getClass().getResource("/images/remove.png")));
    removeButton.setActionCommand(PagesWorker.REMOVE);
    removeButton.setMargin(new Insets(2, 2, 2, 2));
    removeButton.setText(GettextResource.gettext(config.getI18nResourceBundle(),"Delete"));
    removeButton.setToolTipText(GettextResource.gettext(config.getI18nResourceBundle(),"Delete selected pages")+" "+GettextResource.gettext(config.getI18nResourceBundle(),"(Canc)"));
    removeButton.addKeyListener(new EnterDoClickListener(removeButton));
    removeButton.setAlignmentX(Component.CENTER_ALIGNMENT);
    addButtonToButtonPanel(removeButton);
   
    //undelete button
    if(drawDeletedItems){
      undeleteButton = new JButton();
      undeleteButton.addActionListener(pageActionListener);
      undeleteButton.setIcon(new ImageIcon(this.getClass().getResource("/images/remove.png")));
      undeleteButton.setActionCommand(PagesWorker.UNDELETE);
      undeleteButton.setMargin(new Insets(2, 2, 2, 2));
      undeleteButton.setText(GettextResource.gettext(config.getI18nResourceBundle(),"Undelete"));
      undeleteButton.setToolTipText(GettextResource.gettext(config.getI18nResourceBundle(),"Undelete selected pages")+" "+GettextResource.gettext(config.getI18nResourceBundle(),"(Ctrl+Z)"));
      undeleteButton.addKeyListener(new EnterDoClickListener(undeleteButton));
      undeleteButton.setAlignmentX(Component.CENTER_ALIGNMENT);
      addButtonToButtonPanel(undeleteButton);
    }
   
    //rotate button
    rotateButton = new JButton();
    rotateButton.addActionListener(pageActionListener);
    rotateButton.setIcon(new ImageIcon(this.getClass().getResource("/images/clockwise.png")));
    rotateButton.setActionCommand(PagesWorker.ROTATE_CLOCK);
    rotateButton.setMargin(new Insets(2, 2, 2, 2));
    rotateButton.setText(GettextResource.gettext(config.getI18nResourceBundle(),"Rotate right"));
    rotateButton.setToolTipText(GettextResource.gettext(config.getI18nResourceBundle(),"Rotate clockwise selected pages")+" "+GettextResource.gettext(config.getI18nResourceBundle(),"(Alt+ArrowRight)"));
    rotateButton.addKeyListener(new EnterDoClickListener(rotateButton));
    rotateButton.setAlignmentX(Component.CENTER_ALIGNMENT);
    addButtonToButtonPanel(rotateButton);

    //rotate button
    rotateAntiButton = new JButton();
    rotateAntiButton.addActionListener(pageActionListener);
    rotateAntiButton.setIcon(new ImageIcon(this.getClass().getResource("/images/anticlockwise.png")));
    rotateAntiButton.setActionCommand(PagesWorker.ROTATE_ANTICLOCK);
    rotateAntiButton.setMargin(new Insets(2, 2, 2, 2));
    rotateAntiButton.setText(GettextResource.gettext(config.getI18nResourceBundle(),"Rotate left"));
    rotateAntiButton.setToolTipText(GettextResource.gettext(config.getI18nResourceBundle(),"Rotate anticlockwise selected pages")+" "+GettextResource.gettext(config.getI18nResourceBundle(),"(Alt+ArrowLeft)"));
    rotateAntiButton.addKeyListener(new EnterDoClickListener(rotateAntiButton));
    rotateAntiButton.setAlignmentX(Component.CENTER_ALIGNMENT);
    addButtonToButtonPanel(rotateAntiButton);

    //reverse button
    reverseButton = new JButton();
    reverseButton.addActionListener(pageActionListener);
    reverseButton.setIcon(new ImageIcon(this.getClass().getResource("/images/reverse.png")));
    reverseButton.setActionCommand(PagesWorker.REVERSE);
    reverseButton.setMargin(new Insets(2, 2, 2, 2));
    reverseButton.setText(GettextResource.gettext(config.getI18nResourceBundle(),"Reverse"));
    reverseButton.setToolTipText(GettextResource.gettext(config.getI18nResourceBundle(),"Reverse pages order"));
    reverseButton.addKeyListener(new EnterDoClickListener(reverseButton));
    reverseButton.setAlignmentX(Component.CENTER_ALIGNMENT);
    addButtonToButtonPanel(reverseButton);
  }
 
  private void initKeyListener(){
    //key listener
    thumbnailList.addKeyListener(new KeyAdapter() {
            public void keyPressed(KeyEvent e) {
                if((e.isAltDown())&& (e.getKeyCode() == KeyEvent.VK_UP)){
                  moveUpButton.doClick();
                } else if((e.isAltDown())&& (e.getKeyCode() == KeyEvent.VK_DOWN)){
                  moveDownButton.doClick();
                } else if((e.getKeyCode() == KeyEvent.VK_DELETE)){
                  removeButton.doClick();
                } else if(drawDeletedItems && (e.isControlDown())&& (e.getKeyCode() == KeyEvent.VK_Z)){
                  undeleteButton.doClick();
                } else if((e.isAltDown())&& (e.getKeyCode() == KeyEvent.VK_RIGHT)){
                  rotateButton.doClick();
                } else if((e.isAltDown())&& (e.getKeyCode() == KeyEvent.VK_LEFT)){
                  rotateAntiButton.doClick();
                }
            }
        });
  }
  /**
   * reset the panel
   */
  public void resetPanel(){
    thumbnailList.setCurrentZoomLevel(JVisualSelectionList.DEFAULT_ZOOM_LEVEL);
    zoomInButton.setEnabled(true);
    zoomOutButton.setEnabled(true);
    ((VisualListModel)thumbnailList.getModel()).clearData();
    selectedPdfDocument = null;
    selectedPdfDocumentPassword = "";
    setDocumentPropertiesVisible(false);
    getPdfLoader().cleanCreator();
   
  }
  /**
   * Set the visible the label that shows document properties
   * @param visible
   */
  public void setDocumentPropertiesVisible(boolean visible){
    documentProperties.setVisible(visible);
  }
 
  /**
   * Set the document properties to be shown as a tooltip of the documentProperties JLabel
   * @param documetnInfo bean containing document informations
   */ 
 
  public void setDocumentProperties(DocumentInfo documetnInfo){
    if(documetnInfo != null){
      String encrypted = documetnInfo.isEncrypted()?GettextResource.gettext(config.getI18nResourceBundle(),"Yes"):GettextResource.gettext(config.getI18nResourceBundle(),"No");
      documentProperties.setToolTipText(
          "<html><body><b><p>"+GettextResource.gettext(config.getI18nResourceBundle(),"File: ")+"</b>"+documetnInfo.getFileName()+"</p>"+
          "<p><b>"+GettextResource.gettext(config.getI18nResourceBundle(),"Pages: ")+"</b>"+documetnInfo.getPages()+"</p>"+
          "<p><b>"+GettextResource.gettext(config.getI18nResourceBundle(),"Pdf version: ")+"</b>"+(documetnInfo.getPdfVersion()!=null? documetnInfo.getPdfVersion():"")+"</p>"+
          "<p><b>"+GettextResource.gettext(config.getI18nResourceBundle(),"Title: ")+"</b>"+StringUtils.trimToEmpty(documetnInfo.getDocumentMetaData().getTitle())+"</p>"+
          "<p><b>"+GettextResource.gettext(config.getI18nResourceBundle(),"Author: ")+"</b>"+StringUtils.trimToEmpty(documetnInfo.getDocumentMetaData().getAuthor())+"</p>"+
          "<p><b>"+GettextResource.gettext(config.getI18nResourceBundle(),"Creator: ")+"</b>"+StringUtils.trimToEmpty(documetnInfo.getDocumentMetaData().getCreator())+"</p>"+
          "<p><b>"+GettextResource.gettext(config.getI18nResourceBundle(),"Producer: ")+"</b>"+StringUtils.trimToEmpty(documetnInfo.getDocumentMetaData().getProducer())+"</p>"+
          "<p><b>"+GettextResource.gettext(config.getI18nResourceBundle(),"Encrypted: ")+"</b>"+encrypted+"</p>"+
          "</body></html>");
    }
   
  }
  /**
   * @return the orientation
   */
  public int getOrientation() {
    return orientation;
  }
  /**
   * @return the selectedPdfDocument
   */
  public File getSelectedPdfDocument() {
    return selectedPdfDocument;
  }
  /**
   * @return the wrap
   */
  public boolean isWrap() {
    return wrap;
  }
  /**
   * @return the thumbnailList
   */
  public JVisualSelectionList getThumbnailList() {
    return thumbnailList;
  }

  /**
   * @param selectedPdfDocument the selectedPdfDocument to set
   */
  public void setSelectedPdfDocument(File selectedPdfDocument) {
    this.selectedPdfDocument = selectedPdfDocument;
  }

  /**
   * @return the dndSupport
   */
  public int getDndSupport() {
    return dndSupport;
  }
  /**
   * @return the drawDeletedItems
   */
  public boolean isDrawDeletedItems() {
    return drawDeletedItems;
  }
  /**
   * @param drawDeletedItems the drawDeletedItems to set
   */
  public void setDrawDeletedItems(boolean drawDeletedItems) {
    this.drawDeletedItems = drawDeletedItems;
  }
  /**
   * @return the pdfLoader
   */
  public PdfThumbnailsLoader getPdfLoader() {
    return pdfLoader;
  }
  /**
   * @return the topPanel
   */
  public JPanel getTopPanel() {
    return topPanel;
  }
 
  /**
   * @param pages input selection set
   * @return a String version of the input Set, ready to be used as -u parameter for the console
   */
  private String getSelectionString(Set<Integer> pages){
    StringBuilder buffer = new StringBuilder();
    for(Integer page : pages){
      buffer.append(page.toString()).append(",");
    }
    return StringUtils.chomp(buffer.toString(), ",");
    }

  /**
   *
   * @return an ordered List of {@link VisualSelectedItem} corresponding to the panel elements.
   */
    private List<VisualSelectedItem> getSelectedItemsList(){
            List<VisualSelectedItem> retVal = new ArrayList<VisualSelectedItem>();
            List<VisualPageListItem> validElements = ((VisualListModel)thumbnailList.getModel()).getValidElements();
            VisualSelectedItem tmpElement = null;
            Set<Integer> pages = new LinkedHashSet<Integer>();
            for(VisualPageListItem currentElement : validElements){
                    //first element
                    if(tmpElement == null){
                        tmpElement = new VisualSelectedItem(currentElement.getParentFileCanonicalPath(), currentElement.getDocumentPassword());
                            pages.add(currentElement.getPageNumber());
                    }else{
                            //filename changed
                            if(!tmpElement.getSelectedFile().equals(currentElement.getParentFileCanonicalPath())){
                                    tmpElement.setPagesSelection(getSelectionString(pages));
                                    retVal.add(tmpElement);
                                    tmpElement = new VisualSelectedItem(currentElement.getParentFileCanonicalPath(), currentElement.getDocumentPassword());
                                    pages.clear();
                                    pages.add(currentElement.getPageNumber());
                            }else{
                                    //page already there
                                    if(!pages.add(currentElement.getPageNumber())){
                                            tmpElement.setPagesSelection(getSelectionString(pages));
                                            retVal.add(tmpElement);
                                            tmpElement = new VisualSelectedItem(currentElement.getParentFileCanonicalPath(), currentElement.getDocumentPassword());
                                            pages.clear();
                                            pages.add(currentElement.getPageNumber());
                                    }
                            }
                    }
            }
            tmpElement.setPagesSelection(getSelectionString(pages));
            retVal.add(tmpElement);
            return retVal;
    }
  
    /**
     * A of String List that can be used as input for the console. It contains the -f and -u parameters for this panel
     * @return
     */
  public List<String> getValidConsoleParameters(){
    List<String> retVal = new ArrayList<String>();
    StringBuilder builder = new StringBuilder();
    for(VisualSelectedItem item : getSelectedItemsList()){
      builder.append(item.getPagesSelection()).append(":");
      retVal.add("-" + ConcatParsedCommand.F_ARG);
      if(StringUtils.isEmpty(item.getPassword())){
        retVal.add(item.getSelectedFile());
      }else{
        retVal.add(item.getSelectedFile()+":"+item.getPassword());
      }
    }
    retVal.add("-"+ConcatParsedCommand.U_ARG);
    retVal.add(builder.toString());
    return retVal;
  }
 
  /**
   *
   * @return true if the panel has valid elements
   */
  public boolean hasValidElements(){
    List<VisualPageListItem> elements = ((VisualListModel)thumbnailList.getModel()).getValidElements();
    return (elements != null && !elements.isEmpty());
  }
 
  /**
   * @return a String that can be used as a -r param for the pdfsam-console
   */
  public String getRotatedElementsString(){
    StringBuilder retVal = new StringBuilder();
    Collection<VisualPageListItem> validElements = ((VisualListModel)thumbnailList.getModel()).getValidElements();
    if(validElements!=null && !validElements.isEmpty()){
      int i=0;
      for(VisualPageListItem currentElement : validElements){
        i++;
        if(!Rotation.DEGREES_0.equals(currentElement.getRotation())){
          retVal.append(i).append(":").append(currentElement.getRotation().getDegrees()).append(",");
        }
      }
    }
    return retVal.toString();
  }
 
  /**
   * Add a component on the left of the top panel
   * @param c
   */
  public void addToTopPanel(Component c){
    topPanel.removeAll();
    /*TODO fix this*/
    if(c!=null){
      topPanel.add(Box.createRigidArea(new Dimension(5, 0)));
      topPanel.add(c);
    }
    if(topPanelStyle>=STYLE_TOP_PANEL_FULL){
      topPanel.add(Box.createRigidArea(new Dimension(5, 0)));
      topPanel.add(loadFileButton);
    }
    if(topPanelStyle>=STYLE_TOP_PANEL_MEDIUM){
      topPanel.add(Box.createRigidArea(new Dimension(5, 0)));
      topPanel.add(clearButton);
    }
    topPanel.add(Box.createRigidArea(new Dimension(5, 0)));
    topPanel.add(documentProperties);
    topPanel.add(Box.createHorizontalGlue());
    topPanel.add(zoomInButton);
    topPanel.add(Box.createRigidArea(new Dimension(5, 0)));
    topPanel.add(zoomOutButton);
  }
 
  /**
   *
   * @return Returns an array of all the selected values, in increasing order based on their indices in the list or an empty array if nothing is selected
   */
  public VisualPageListItem[] getSelectedElements(){
    Object[] elems = thumbnailList.getSelectedValues();
    VisualPageListItem[] visElems = new VisualPageListItem[elems.length];
    System.arraycopy(elems, 0, visElems, 0, elems.length);
    return visElems;
  }
 
  /**
   * @param c
   * @see VisualListModel#appendAllElements(Collection)
   */
  public void appendElements(Collection<VisualPageListItem> c){
    ((VisualListModel)thumbnailList.getModel()).appendAllElements(c);
  }
 
  /**
   * @param c
   * @see VisualListModel#prependAllElements(Collection)
   */
  public void prependElements(Collection<VisualPageListItem> c){
    ((VisualListModel)thumbnailList.getModel()).prependAllElements(c);
  }
  /**
   * Adds a item to the popup menu
   * @param item
   */
  public void addMenuItem(JMenuItem item){
    popupMenu.add(item);   
  }
 
   /**
     * enables the set output path menu item
     */
    public void enableSetOutputPathMenuItem(){
   
      menuItemSetOutputPath.setIcon(new ImageIcon(this.getClass().getResource("/images/set_outfile.png")));
      menuItemSetOutputPath.setText(GettextResource.gettext(config.getI18nResourceBundle(),"Set output file"));
      menuItemSetOutputPath.addMouseListener(new MouseAdapter() {
              public void mouseReleased(MouseEvent e) {
                  if (selectedPdfDocument != null){
                      try{
                        String defaultOutputPath = selectedPdfDocument.getParent();
                        firePropertyChange(OUTPUT_PATH_PROPERTY, "", defaultOutputPath);
                      }
                      catch (Exception ex){
                          log.error(GettextResource.gettext(config.getI18nResourceBundle(),"Error: Unable to get the file path."), ex);
                      }
                  }
                }
          });
      popupMenu.add(menuItemSetOutputPath);
     
      if(!showContextMenu){
        //show popup
        addPopupShower();
      }
    }
    /**
     * adds the listener that showes the popup
     */
    private void addPopupShower(){
      //show popup
    thumbnailList.addMouseListener(new MouseAdapter() {
            public void mousePressed(MouseEvent e) {
                if (e.isPopupTrigger()) {
          showMenu(e);
        }
            }
            public void mouseReleased(MouseEvent e) {
                if (e.isPopupTrigger()) {
          showMenu(e);
        }
            }
            private void showMenu(MouseEvent e) {
              int[] selection = thumbnailList.getSelectedIndices();
              if(!(selection!=null && selection.length>1)){
                thumbnailList.setSelectedIndex(thumbnailList.locationToIndex(e.getPoint()) );
                selection = thumbnailList.getSelectedIndices();
              }
              menuItemPreview.setEnabled(selection!=null && selection.length==1);
              popupMenu.show(thumbnailList, e.getX(), e.getY() );
            }
        });
    }
    /**
     * remove the set ouput path menu item
     */
    public void disableSetOutputPathMenuItem(){
      popupMenu.remove(menuItemSetOutputPath);
    }
  /**
   * @return the selectedPdfDocumentPassword
   */
  public String getSelectedPdfDocumentPassword() {
    return selectedPdfDocumentPassword;
  }
  /**
   * @param selectedPdfDocumentPassword the selectedPdfDocumentPassword to set
   */
  public void setSelectedPdfDocumentPassword(String selectedPdfDocumentPassword) {
    this.selectedPdfDocumentPassword = selectedPdfDocumentPassword;
  }
  /**
   * @return the clearButton
   */
  public JButton getClearButton() {
    return clearButton;
  }
  /**
   * @return the zoomInButton
   */
  public JButton getZoomInButton() {
    return zoomInButton;
  }
  /**
   * @return the zoomOutButton
   */
  public JButton getZoomOutButton() {
    return zoomOutButton;
  }
  /**
   * @return the undeleteButton
   */
  public JButton getUndeleteButton() {
    return undeleteButton;
  }
  /**
   * @return the removeButton
   */
  public JButton getRemoveButton() {
    return removeButton;
  }
  /**
   * @return the moveUpButton
   */
  public JButton getMoveUpButton() {
    return moveUpButton;
  }
  /**
   * @return the moveDownButton
   */
  public JButton getMoveDownButton() {
    return moveDownButton;
  }
  /**
   * @return the rotateButton
   */
  public JButton getRotateButton() {
    return rotateButton;
  }
  /**
   * @return the rotateAntiButton
   */
  public JButton getRotateAntiButton() {
    return rotateAntiButton;
  }
  /**
   * @return the loadFileButton
   */
  public JButton getLoadFileButton() {
    return loadFileButton;
  }
  /**
   * @return the reverseButton
   */
  public JButton getReverseButton() {
    return reverseButton;
  }
}
TOP

Related Classes of org.pdfsam.guiclient.commons.panels.JVisualPdfPageSelectionPanel

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.