Package org.jmule.ui.swing.maintabs.shared

Source Code of org.jmule.ui.swing.maintabs.shared.SharedTab$SharedFoldersListCellRenderer

/*
*  JMule - Java file sharing client
*  Copyright (C) 2007-2008 JMule team ( jmule@jmule.org / http://jmule.org )
*
*  Any parts of this program derived from other projects, or contributed
*  by third-party developers are copyrighted by their respective authors.
*
*  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, or (at your option) any later version.
*
*  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., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
*
*/
package org.jmule.ui.swing.maintabs.shared;

import java.awt.BorderLayout;
import java.awt.Component;
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.MouseAdapter;
import java.awt.event.MouseEvent;
import java.io.File;
import java.util.LinkedList;
import java.util.List;
import java.util.concurrent.CopyOnWriteArrayList;

import javax.swing.AbstractListModel;
import javax.swing.JButton;
import javax.swing.JFileChooser;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JList;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JSplitPane;
import javax.swing.ListCellRenderer;
import javax.swing.SwingUtilities;
import javax.swing.border.TitledBorder;
import javax.swing.filechooser.FileSystemView;

import org.jmule.core.JMThread;
import org.jmule.core.JMuleCore;
import org.jmule.core.JMuleCoreFactory;
import org.jmule.core.configmanager.ConfigurationAdapter;
import org.jmule.core.configmanager.ConfigurationManager;
import org.jmule.core.sharingmanager.PartialFile;
import org.jmule.core.sharingmanager.SharedFile;
import org.jmule.core.sharingmanager.SharingManager;
import org.jmule.core.utils.FileUtils;
import org.jmule.ui.swing.ImgRep;
import org.jmule.ui.swing.Refreshable;
import org.jmule.ui.swing.SwingGUIUpdater;
import org.jmule.ui.swing.maintabs.AbstractTab;
import org.jmule.ui.swing.tables.SharedFilesTable;
import org.jmule.ui.swing.wizards.ChosenFolders;
import org.jmule.ui.swing.wizards.ExistedFoldersDialog;
import org.jmule.ui.utils.NumberFormatter;

/**
*
* @author javajox
* @version $$Revision: 1.3 $$
* Last changed by $$Author: javajox $$ on $$Date: 2009/09/22 19:08:43 $$
*/
public class SharedTab extends AbstractTab {

  JMuleCore _core = JMuleCoreFactory.getSingleton();
  SharingManager _sharing_manager = _core.getSharingManager();
  ConfigurationManager _config_manager = _core.getConfigurationManager();
  SwingGUIUpdater _updater = SwingGUIUpdater.getInstance();
 
  private enum FilesCategory {
    INCOMING_FILES { public String toString() { return "Incoming files"; } },
    INCOMPLETE_FILES { public String toString() { return "Incomplete files"; } },
    ALL_FILES { public String toString() { return "All files"; } }
  }
 
  class SharedFoldersListModel extends AbstractListModel {
   
    public SharedFoldersListModel() {
      _config_manager.addConfigurationListener(new ConfigurationAdapter() {
        public void sharedDirectoriesChanged(List<File> sharedDirs) {
          fireContentsChanged(this,2,sharedDirs.size()-1);
        }
      });
    }
   
    public Object getElementAt(int index) {
            if(index == 0) return FilesCategory.INCOMING_FILES;
            if(index == 1) return FilesCategory.INCOMPLETE_FILES;
            if(index == 2) return FilesCategory.ALL_FILES;
            Object result = null;
            try {
               result = _config_manager.getSharedFolders().get(index-3);
            }catch( Throwable cause ) {
              cause.printStackTrace();
            }
      return result;
    }

    public int getSize() {
       int result = 0;
       try
       if(_config_manager.getSharedFolders() == null) result = 3;
       result = _config_manager.getSharedFolders().size() + 3;
       }catch( Throwable cause ) {
         cause.printStackTrace();
       }
       return result;
    }
   
  }
 
  class SharedFoldersListCellRenderer extends JLabel implements ListCellRenderer {
    public Component getListCellRendererComponent(JList list, Object value,
        int index, boolean isSelected, boolean cellHasFocus) {
      if(value instanceof String) this.setText((String)value);
      else if(value instanceof File) {
        this.setFont(new java.awt.Font("Dialog", 0, 12));
        this.setText(((File)value).getAbsolutePath());
      } else if(value instanceof FilesCategory) {
        FilesCategory files_category = (FilesCategory)value;
        this.setFont(new java.awt.Font("Dialog", 1, 12));
        this.setText(files_category.toString());
      }
      setEnabled(list.isEnabled());
      //setFont(list.getFont());
        setOpaque(true);
      if (isSelected) {
             setBackground(list.getSelectionBackground());
           setForeground(list.getSelectionForeground());
      } else {
          // if ( (index % 2) == 0 )
          //  this.setBackground(new Color(255,255,255));
         //  else
         //    this.setBackground(new Color(240,240,240));
             setBackground(list.getBackground());
             setForeground(list.getForeground());
      }
      return this;
    }   
  }
 
  class TopPanel extends JPanel {
   
    private JButton add_button = new JButton("Add");
    private JButton remove_button = new JButton("Remove");
    private JButton rescan_button = new JButton("Rescan");
    private JButton clear_button = new JButton("Clear");
   
    public TopPanel() {
      init();
    }
   
    private void init() {
      GridBagLayout thisLayout = new GridBagLayout();
      this.setPreferredSize(new java.awt.Dimension(467, 56));
      thisLayout.rowWeights = new double[] {0.1};
      thisLayout.rowHeights = new int[] {7};
      thisLayout.columnWeights = new double[] {0.0, 0.0, 0.0, 0.0, 0.0, 0.0};
      thisLayout.columnWidths = new int[] {6, 107, 108, 107, 122, 7};
      this.setLayout(thisLayout);
      this.add(add_button, new GridBagConstraints(1, 0, 1, 1, 0.0, 0.0, GridBagConstraints.CENTER, GridBagConstraints.HORIZONTAL, new Insets(0, 10, 0, 10), 0, 0));
            this.add(remove_button, new GridBagConstraints(2, 0, 1, 1, 0.0, 0.0, GridBagConstraints.CENTER, GridBagConstraints.HORIZONTAL, new Insets(0, 10, 0, 10), 0, 0));
            this.add(clear_button, new GridBagConstraints(3, 0, 1, 1, 0.0, 0.0, GridBagConstraints.CENTER, GridBagConstraints.HORIZONTAL, new Insets(0, 10, 0, 10), 0, 0));
            this.add(rescan_button, new GridBagConstraints(4, 0, 1, 1, 0.0, 0.0, GridBagConstraints.CENTER, GridBagConstraints.HORIZONTAL, new Insets(0, 10, 0, 10), 0, 0));
            add_button.setIcon(ImgRep.getIcon("add.png"));
            remove_button.setIcon(ImgRep.getIcon("remove.png"));
            clear_button.setIcon(ImgRep.getIcon("remove_all.png"));
            rescan_button.setIcon(ImgRep.getIcon("refresh.png"));
    }
   
    public JButton getAddButton() {
     
      return add_button;
    }
   
    public JButton getRemoveButton() {
     
      return remove_button;
    }
   
    public JButton getClearButton() {
     
      return clear_button;
    }
   
    public JButton getRescanButton() {
     
      return rescan_button;
    }
  }
 
  private JSplitPane split_pane;
  private TopPanel top_panel;
  private JScrollPane shared_folders_scroll_pane;
  private JScrollPane shared_files_scroll_pane;
  private JList shared_folders_list;
  private TitledBorder shared_folders_border;
  private TitledBorder shared_files_border;
  private SharedFoldersListModel shared_folders_list_model;
  private SharedFilesTable shared_files_table;
 
    private JFileChooser file_chooser;
    private FileSystemView file_system_view;
   
// current chosen folders
    private File[] current_chosen_folders;
    // all folders chosen during this session
    private ChosenFolders chosen_folders;
  //private JDialog parent;
 
  public SharedTab(final JFrame parent) {
    super(parent);
    init();
    file_system_view = FileSystemView.getFileSystemView();
        file_chooser = new JFileChooser( file_system_view );
        file_chooser.setFileSelectionMode(JFileChooser.DIRECTORIES_ONLY);
        file_chooser.setMultiSelectionEnabled(true);
       
        file_chooser.addActionListener(new ActionListener() {
          public void actionPerformed(ActionEvent event) {
            if(event.getActionCommand() == JFileChooser.APPROVE_SELECTION) {
              chosen_folders = new ChosenFolders();
                 
              List<File> shared_folders = null;
              try {
                     shared_folders = _config_manager.getSharedFolders();
              }catch( Throwable cause ) {
                cause.printStackTrace();
              }
                 
                  if(shared_folders != null) {       
                    for(File folder : shared_folders) {
                        chosen_folders.add(folder)
                    }
                  }
              current_chosen_folders = file_chooser.getSelectedFiles();
              LinkedList<File> newFolders = new LinkedList<File>();
              final List<File> already_existed_folders =
                org.jmule.core.utils.FileUtils.extractNewFolders(current_chosen_folders,
                                                             chosen_folders.getFoldersList(),
                                                             newFolders);
              for(File file : newFolders)
                chosen_folders.add(file);
              if(already_existed_folders.size() != 0) {
                 ExistedFoldersDialog existed_folders_dialog = new ExistedFoldersDialog(parent, true, new AbstractListModel() {
                   public int getSize() {
                 
                     return already_existed_folders.size();
                   }
                   public Object getElementAt(int i) {
                 
                     return already_existed_folders.get( i );
                   }
                 });
                 existed_folders_dialog.setVisible(true);
              }
              //List<File> shared_folders2 = _config_manager.getSharedFolders();
              //if(shared_folders2 == null) shared_folders2 = new LinkedList<File>();
                    List<File> folders_for_config_mg = new LinkedList<File>();
              for(File file : chosen_folders)
                folders_for_config_mg.add(file);
              try {
                 _config_manager.setSharedFolders(folders_for_config_mg);
              }catch( Throwable cause ) {
                cause.printStackTrace();
              }
            }
          }
        });
        final SharedTab shared_tab = this;
        top_panel.getAddButton().addActionListener(new ActionListener() {
          public void actionPerformed(ActionEvent event) {
            file_chooser.showDialog(shared_tab,"Choose")
          }
        });
        top_panel.getRemoveButton().addActionListener(new ActionListener() {
          public void actionPerformed(ActionEvent event) {
            Object object = shared_folders_list.getSelectedValue();
            if(object instanceof File) {
               try {  
               List<File> shared_folders = _config_manager.getSharedFolders();
                     shared_folders.remove(object);
                     _config_manager.setSharedFolders(shared_folders);
               }catch( Throwable cause ) {
                 cause.printStackTrace();
               }
            }
          }
        });
        top_panel.getClearButton().addActionListener(new ActionListener() {
          public void actionPerformed(ActionEvent event) {
            try {
              _config_manager.setSharedFolders(null);
            }catch( Throwable cause ) {
              cause.printStackTrace();
            }
          }
        });
        top_panel.getRescanButton().addActionListener(new ActionListener() {
          public void actionPerformed(ActionEvent event) {
            _sharing_manager.loadCompletedFiles();
          }
        });
       // SwingGUIUpdater.getInstance().addRefreshable(new Refreshable() {
        //  public void refresh() {
        //    shared_folders_list.repaint();
        //  }
        //});
        _updater.addRefreshable(new Refreshable() {
           public void refresh() {
            String str;
            SharedFile shared_file = _sharing_manager.getCurrentHashingFile();
            double percent_complete = 0;
              if(shared_file != null) {
                percent_complete = _sharing_manager.getCurrentHashingFilePercent();
                str = " [Hashing : " + shared_file.getSharingName() + " (" + NumberFormatter.formatProgress(percent_complete) + ")]";
                shared_files_border.setTitle(nr_of_files + str);
                //shared_files_border.setTitle(current_title + str);
                //setSharedFilesBorderTitle(current_title  + str);
            } else {
                 shared_files_border.setTitle(nr_of_files);
            }
            shared_files_scroll_pane.repaint();
           }
        });
  }
 
  private String nr_of_files = "";
 
  private void init() {
   
    split_pane = new JSplitPane();
    shared_folders_scroll_pane = new JScrollPane();
    shared_files_scroll_pane = new JScrollPane();
    shared_folders_list = new JList();
    shared_folders_list_model = new SharedFoldersListModel();
    top_panel = new TopPanel();
   
   
    shared_folders_list.setModel(shared_folders_list_model);
    shared_folders_list.setCellRenderer(new SharedFoldersListCellRenderer());
   
    shared_folders_border = javax.swing.BorderFactory.createTitledBorder("");
    shared_files_border = javax.swing.BorderFactory.createTitledBorder("");
   
   
   
    shared_folders_scroll_pane.setBorder(shared_folders_border);
    shared_files_scroll_pane.setBorder(shared_files_border);
   
    shared_folders_scroll_pane.setViewportView(shared_folders_list);
   
    split_pane.setOrientation(JSplitPane.VERTICAL_SPLIT);
    split_pane.setTopComponent(shared_folders_scroll_pane);
    split_pane.setBottomComponent(shared_files_scroll_pane);
   
    this.setLayout(new BorderLayout());
    this.add(top_panel, BorderLayout.NORTH);
    this.add(split_pane, BorderLayout.CENTER);
   
    class FileScanner extends JMThread {
     
      private boolean stop = false;
      private Object object;
     
      public void JMStop() {
        stop = true;
        interrupt();
      }
   
      public FileScanner() {

      }
     
      public void setSharedFolder(Object object) {
        this.object = object;
      }
     
      public void run() {
        //if( shared_files_scroll_pane. )
        final List<SharedFile> shared_files = new CopyOnWriteArrayList<SharedFile>();
        SwingUtilities.invokeLater(new Runnable() {
          public void run() {
             //if(shared_files_scroll_pane.getViewport().getComponentCount() !=0 ) {
            //  shared_files_scroll_pane.remove(1);
            // }
             shared_files_table = new SharedFilesTable(shared_files);
             shared_files_scroll_pane.setViewportView(shared_files_table);
          }
        });
        //Iterator<File> i = null;
        List<File> list_of_files = null;
        boolean is_iterator = false;
        if(object instanceof FilesCategory) {
          FilesCategory files_category = (FilesCategory)object;
          switch(files_category) {
              case ALL_FILES          : for(SharedFile shared_file : _sharing_manager.getSharedFiles())
                                           shared_files.add(shared_file);
                                        break;
              case INCOMPLETE_FILES   : for(PartialFile partial_file : _sharing_manager.getPartialFiles())
                                            shared_files.add(partial_file);
                                      break
              case INCOMING_FILES     : list_of_files = FileUtils.traverseDirAndReturnListOfFiles( new File(ConfigurationManager.INCOMING_DIR ));
                                      //i = FileUtils.iterateFiles(new File(ConfigurationManager.INCOMING_DIR), null, true);
                                        is_iterator = true;
          }
        } else if( object instanceof File ) {
          //i = FileUtils.iterateFiles((File)object, null, true);
          list_of_files = FileUtils.traverseDirAndReturnListOfFiles( (File)object );
          is_iterator = true;
        }
       
        if(is_iterator) {
          //while(i.hasNext()) {
          for(File file : list_of_files) {
            if(stop) return;
           // File file = i.next();
            if(file.isDirectory()) continue;
            SharedFile shared_file = _sharing_manager.getSharedFile(file);
            if(shared_file != null) shared_files.add(shared_file);
          }
          //}
        }
        nr_of_files = "Shared files(" + shared_files.size() + ")";
        }
    }
   
    //final FileScanner file_scanner = new FileScanner();
   
    shared_folders_list.addMouseListener(new MouseAdapter() {
       public void mouseClicked(MouseEvent e) {
          if(scanner != null && scanner.isAlive()) {
            scanner.JMStop();
            scanner = null;
         
          Object object = shared_folders_list.getSelectedValue();
          //File file = (File)shared_folders_list.getSelectedValue();
                  FileScanner file_scanner = new FileScanner();
          file_scanner.setSharedFolder(object);
          file_scanner.start();
          scanner = file_scanner;
         // SharedFilesTable shared_files_table = new SharedFilesTable()
       }
    });
  }
 
  JMThread scanner;
 
}
TOP

Related Classes of org.jmule.ui.swing.maintabs.shared.SharedTab$SharedFoldersListCellRenderer

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.