/*
 * Copyright (C) Azureus Software, Inc, All Rights Reserved.
 *
 * 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 ( see the LICENSE file ).
 *
 * 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.gudy.azureus2.ui.swt.views.tableitems.files;

import java.io.File;
import java.io.IOException;


import org.gudy.azureus2.plugins.ui.tables.*;

import org.gudy.azureus2.core3.disk.DiskManagerFileInfo;
import org.gudy.azureus2.core3.download.DownloadManager;
import org.gudy.azureus2.core3.download.DownloadManagerState;
import org.gudy.azureus2.core3.torrent.TOTorrent;
import org.gudy.azureus2.ui.swt.views.FilesView;
import org.gudy.azureus2.ui.swt.views.table.CoreTableColumnSWT;



public class PathItem
       extends CoreTableColumnSWT 
       implements TableCellRefreshListener
{
  
  
  /** Default Constructor */
  public PathItem() {
    super("path", ALIGN_LEAD, POSITION_LAST, 200, TableManager.TABLE_TORRENT_FILES);
  }

	public void fillTableColumnInfo(TableColumnInfo info) {
		info.addCategories(new String[] {
			CAT_CONTENT,
		});
		info.setProficiency(TableColumnInfo.PROFICIENCY_BEGINNER);
	}

  public void refresh(TableCell cell) {
    DiskManagerFileInfo fileInfo = (DiskManagerFileInfo)cell.getDataSource();
    cell.setText(determinePath(fileInfo));
  }
  
  private static String determinePath(DiskManagerFileInfo fileInfo) {
    
    if( fileInfo == null ) {
    	return "";
    }
    
   	boolean has_link = fileInfo.getLink() != null;
   	boolean show_full_path = FilesView.show_full_path;
   	
  	DownloadManager dm = fileInfo.getDownloadManager();

   	File dl_save_path_file = dm.getAbsoluteSaveLocation();
   	
   	TOTorrent torrent = dm.getTorrent();
   	
   	if ( torrent != null && torrent.isSimpleTorrent()){
   		
   		dl_save_path_file = dl_save_path_file.getParentFile();
   	}
   	
   	String dl_save_path = dl_save_path_file.getPath();
   	if (!dl_save_path.endsWith(File.separator)) {
   		 dl_save_path += File.separator;
   	}

   	File file = fileInfo.getFile(true);
   	
   	/**
   	 * Figure out whether we should show the full path anyway.
   	 * We'll do this if the path is relative to he current
   	 * download save path.
   	 */
   	//  
   	if (has_link && !show_full_path) {
   		show_full_path = !file.getAbsolutePath().startsWith(dl_save_path);
   	}
   	String path = "";
  	
    if (show_full_path) { 
    	  
	      try {
	          path = file.getParentFile().getCanonicalPath();
	      }
	      catch( IOException e ) {
	          path = file.getParentFile().getAbsolutePath();
	      }
	      
	      if ( !path.endsWith( File.separator )){
	    	  
	    	  path += File.separator;
	      }
	      
    }else{
    	
    	path = file.getAbsolutePath().substring(dl_save_path.length());
    	if (path.length() == 0) {
    		path = File.separator;
    	}
    	else {
    		if (path.charAt(0) == File.separatorChar) {
    			path = path.substring(1);
    		}
    		int	pos = path.lastIndexOf(File.separator);
    	  
    		if (pos > 0 ) {
    			path = File.separator + path.substring( 0, pos );
    		}
    		else {
    			path = File.separator;
    		}
      }
    }
    
    if ( fileInfo.isSkipped()){
    	
    	String dnd_sf = dm.getDownloadState().getAttribute( DownloadManagerState.AT_DND_SUBFOLDER );
    
    	if ( dnd_sf != null ){
    		
    		dnd_sf = dnd_sf.trim();
    		
    		if ( dnd_sf.length() > 0 ){
    			
    			if ( show_full_path ){
    				
	    			dnd_sf += File.separatorChar;
	    			
	    			if ( path.endsWith( dnd_sf )){
	    				
	    				path = path.substring( 0, path.length() - dnd_sf.length());
	    			}
    			}else{
    				
    				if ( path.endsWith( dnd_sf )){
	    				
	    				path = path.substring( 0, path.length() - dnd_sf.length());
	    				
	    				if ( path.length() > 1 && path.endsWith( File.separator )){
	    					
	    					path = path.substring( 0, path.length()-1 );
	    				}
	    			}
    			}
    		}
    	}
    }
    
    return path;
  }
  
}
