package com.limegroup.gnutella.gui.options.panes;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.File;
import java.io.IOException;
import java.util.Arrays;
import java.util.Set;
import java.util.HashSet;
import com.limegroup.gnutella.FileManager;
import com.limegroup.gnutella.RouterService;
import com.limegroup.gnutella.gui.FileChooserHandler;
import com.limegroup.gnutella.gui.GUIMediator;
import com.limegroup.gnutella.gui.StandardListEditor;
import com.limegroup.gnutella.settings.SharingSettings;
/**
* This class defines the panel in the options window that allows the user
* to change the directory that are shared.
*/
//2345678|012345678|012345678|012345678|012345678|012345678|012345678|012345678|
public final class SharedDirPaneItem extends AbstractPaneItem {
/**
* Constant handle to the <tt>StandardListEditor</tt> that adds and removes
* remove hosts to aumotically connect to.
*/
private final StandardListEditor DIR_LIST =
new StandardListEditor(new SelectSharedDirectoryListener());
/**
* The constructor constructs all of the elements of this
* <tt>AbstractPaneItem</tt>.
*
* @param key the key for this <tt>AbstractPaneItem</tt> that the
* superclass uses to generate strings
*/
public SharedDirPaneItem(final String key) {
super(key);
add(DIR_LIST.getComponent());
}
/**
* Adds a directory to the string of shared directories,
* checking to make sure that the directory is not already
* contained in the shared directory String.
*
* @param dir a <tt>File</tt> instance denoting the abstract pathname
* of the new shared directory
*/
private void addDirectory(File dir) {
if (!dir.isDirectory())
return;
if(!isGoingToBeShared(dir))
DIR_LIST.addFile(dir);
}
/**
* Adds a directory to the internal list, resetting 'dirty' only if it wasn't
* dirty already.
*/
void addAndKeepDirtyStatus(File dir) {
boolean wasDirty = DIR_LIST.getListChanged();
addDirectory(dir);
if(!wasDirty)
DIR_LIST.resetList();
}
/**
* Determines if this is already in the list of things to share.
*/
boolean isGoingToBeShared(File dir) {
File[] dirs = DIR_LIST.getDataAsFileArray();
for(int i = 0; i < dirs.length; i++) {
if (dirs[i].equals(dir))
return true;
}
return false;
}
/**
* This class shows the <tt>JFileChooser</tt> when the user presses
* the button to add a new directory to the shared directories. It
* adds the directory only if does not already exist in the list.
*/
private class SelectSharedDirectoryListener implements ActionListener {
public void actionPerformed(ActionEvent ae) {
File dir = FileChooserHandler.getInputDirectory(MEDIATOR.getMainOptionsComponent());
if (dir == null)
return;
if (!dir.isDirectory() || !dir.canRead()) {
GUIMediator.showError("ERROR_INVALID_SHARED_DIRECTORY");
return;
}
// share directory only if not sensitive
if (FileManager.isSensitiveDirectory(dir))
if (!RouterService.getCallback().warnAboutSharingSensitiveDirectory(dir))
return;
SharedDirPaneItem.this.addDirectory(dir);
}
}
/**
* Defines the abstract method in <tt>AbstractPaneItem</tt>.<p>
*
* Sets the options for the fields in this <tt>PaneItem</tt> when the
* window is shown.
*/
public void initOptions() {
File[] dirs = SharingSettings.DIRECTORIES_TO_SHARE.getValueAsArray();
DIR_LIST.setListData(dirs);
DIR_LIST.resetList();
}
/**
* Gets all folders to share.
*/
public Set getDirectoriesToShare() {
return new HashSet(Arrays.asList(DIR_LIST.getDataAsFileArray()));
}
/**
* Defines the abstract method in <tt>AbstractPaneItem</tt>.<p>
*
* This makes sure that the shared directories have, in fact, changed to
* make sure that we don't load the <tt>FileManager</tt> twice. This is
* particularly relevant to the case where the save directory has changed,
* in which case we only want to reload the <tt>FileManager</tt> once for
* any changes.<p>
*
* Applies the options currently set in this window, displaying an
* error message to the user if a setting could not be applied.
*
* @throws <tt>IOException</tt> if the options could not be applied
* for some reason
*/
public boolean applyOptions() throws IOException {
// Handle a change to the shared directories or list of extensions.
if(DIR_LIST.getListChanged())
DIR_LIST.resetList();
// the actual applying of shared folders is done in OptionsPaneManager,
// since it needs to be _after_ everything else is done.
return false;
}
public boolean isDirty() {
return DIR_LIST.getListChanged();
}
}