/*
 * Licensed Materials - Property of Rogue Wave Software, Inc. 
 * © Copyright Rogue Wave Software, Inc. 2014, 2015 
 * © Copyright IBM Corp. 2009, 2014
 * © Copyright ILOG 1996, 2009
 * All Rights Reserved.
 *
 * Note to U.S. Government Users Restricted Rights:
 * The Software and Documentation were developed at private expense and
 * are "Commercial Items" as that term is defined at 48 CFR 2.101,
 * consisting of "Commercial Computer Software" and
 * "Commercial Computer Software Documentation", as such terms are
 * used in 48 CFR 12.212 or 48 CFR 227.7202-1 through 227.7202-4,
 * as applicable.
 */
package plugins;

import ilog.views.IlvManagerView;
import ilog.views.maps.IlvMapUtil;
import ilog.views.swing.IlvThreadedActivityMonitor;
import ilog.views.swing.IlvThreadedActivityMonitorProperty;

import java.io.File;
import java.io.IOException;
import java.net.URL;
import java.security.AccessControlException;
import java.text.MessageFormat;
import java.util.Enumeration;
import java.util.Properties;

import javax.swing.JComponent;
import javax.swing.JFileChooser;
import javax.swing.filechooser.FileFilter;
import javax.swing.filechooser.FileSystemView;
import javax.swing.filechooser.FileView;

/**
 * Generic import action for all formats.
 */
public abstract class ImportAction extends FileFilter {
  static String baseDirectory;
  static String LOADING = IlvMapUtil.getString(ImportAction.class, "ImportAction.LoadingTask"); //$NON-NLS-1$
  static String RENDERING = IlvMapUtil.getString(ImportAction.class, "ImportAction.RenderingTask"); //$NON-NLS-1$
  /**
   * @return the base map directory.
   */
  protected abstract String  getSubDirectory();

  final private IlvThreadedActivityMonitor mon;
  private StopButton stopButton;
  final IlvManagerView view;
  private boolean available=true;
  private Properties preferences;
  
  /**
   * @param view
   */
  public ImportAction(IlvManagerView view) {
    this.view = view;
    this.mon = IlvThreadedActivityMonitorProperty.GetThreadedActivityMonitor(view.getManager());
  }
  /**
   * Returns the description to display in monitoring.
   * @param action action for the format.
   * @return the string to display.
   */
  public String getActivityDescription(String action) {
    return action + " " + getFormatName() + " "; //$NON-NLS-1$ //$NON-NLS-2$
  }
  /** Should create an enumeration of data sources created for the file names supplied.
   * @param fileNames files selected by the user.
   * @return an enumeration of data sources.
   * @throws IOException
   */
  public abstract Enumeration getDataSources(String fileNames[]) throws IOException;
  
  /** Should create an enumeration of data sources created for the URL supplied.
   * @param urls urls selected by the user.
   * @return an enumeration of data sources.
   * @throws IOException
   */
  public abstract Enumeration getDataSources(URL urls[]) throws IOException ;
  
  /**
   * This method should return the format name displayed in menus, selection boxes and monitoring.
   * @return the format name.
   */
  public abstract String getFormatName();
  /**
   * @return Returns the stopButton.
   */
  public StopButton getStopButton() {
    return stopButton;
  }
  /**
   * @param stopButton The stopButton to set.
   */
  public void setStopButton(StopButton stopButton) {
    this.stopButton = stopButton;
  }
  /**
   * @return the accessory to use besides the file selector.
   */
  public abstract JComponent getAccessory();
  /**
   * @return the monitor used to set import advancement information.
   */
  public IlvThreadedActivityMonitor getMonitor() {
    return mon;
  }
  /**
   * Method to override to change file selection dialog selection mode.
   * @return JFileChooser.FILES_ONLY
   */
  public int getSelectionMode() {
    return JFileChooser.FILES_ONLY;
  }
  /**
   * Method to override to prevent multi selection of files.
   * @return true.
   */
  public boolean isMultiSelectionEnabled() {
    return true;
  }
  /**
   * Sets the advancement of the loading.
   * @param action sub-action name.
   * @param activityId identifies the threaded activity
   * @param percent percentage of import done.
   */
  public void setAdvancement(String action, Object activityId, int percent) {
    mon.updateActivityProgress(activityId, percent, getActivityDescription(action) + "(" + percent + "%)"); //$NON-NLS-1$//$NON-NLS-2$
  }
  /**
   * @return the view managed by the import action.
   */
  public IlvManagerView getView() {
    return view;
  }
  /**
   * @param file
   */
  public void selectedFileChanged(File file) {
    if (file == null){/* do nothing.*/}
  }
  /**
   * @param url
   */
  public void selectedURLChanged(URL url) {
    if (url == null){/* do nothing.*/}
  }
  /**
   * @param file
   */
  public void directoryChanged(File file) {
    if (file == null){/* do nothing.*/}
  }
  /**
   * @see javax.swing.filechooser.FileFilter#getDescription()
   */
  public String getDescription() {
    String exts[]=getExtensions();
    String extList=""; //$NON-NLS-1$
    if(exts!=null){
      extList=" (";//$NON-NLS-1$
      for (int i = 0; i < exts.length; i++) {
        extList = extList + " *" + exts[i];//$NON-NLS-1$
      }
      extList=extList + ")";//$NON-NLS-1$
    }
    String pattern=IlvMapUtil.getString(ImportAction.class, "ImportAction.FileFilterSuffix"); //$NON-NLS-1$
    return MessageFormat.format(pattern, new Object[]{getFormatName(),extList });
  }
  /**
   * Checks if the file is either a directory or ends with the extensions.
   * @see #getExtensions()
   * @see javax.swing.filechooser.FileFilter#accept(java.io.File)
    */
  public boolean accept(File f) {
     try {
       if(f!=null && f.isDirectory()) return true;
     } catch (AccessControlException e){
       // applets.
     }
     if(f==null)return false;
     String name=f.getName().toLowerCase();
     String extensions[]=getExtensions();
     for (int i = 0; i < extensions.length; i++) {
       if (name.endsWith(extensions[i])) {
         return true;
       }
    }
     return false;
  }
  /**
   * Returns the extension of files accepted by this action.
   * @return a table of string that accepted files names must end with.
   */
  
  public abstract String [] getExtensions();
  
  /**
   * @param selection list of selected files.
   * @return true to approve the selection.
   */
  public boolean approveSelection(File selection[]) {
    for (int i = 0; i < selection.length; i++) {
      if(!selection[i].exists())return false;
    }
    return true;
  }
  
  /**
   * Gives actions a possibility to change the file system view.
   * @return The <code>FileSystemView</code>
   */
  public FileSystemView getFileSystemView() {
    return null;
  }
  
  /**
   * Tells if the action is available
   * @return The action availability
   */
  public boolean isAvailable() {
    return available;
  }

  /**
   * Indicates whether the action is available
   * @param available true to allow action.
   */
  void setAvailable(boolean available) {
    this.available = available;
  }
  
  /**
   * Specifies the file view
   * @return A file view or null.
   */
  public FileView getFileView() {
    return null;
  }
  /**
   * Sets some properties that could impact the action.
   * @param preferences
   */
  public void setPreferences(Properties preferences) {
    this.preferences=preferences;
 }
  /** returns the preferences
   * @return the preferences */
    protected Properties getPreferences() {
        return preferences;
    }
  
}