/*
* �Copyright 2013 Jose F. Maldonado�
*
* This file is part of aFileDialog.
*
* aFileDialog is free software: you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public License as published
* by the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* aFileDialog 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 Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public License
* along with aFileDialog. If not, see <http://www.gnu.org/licenses/>.
*/
package ar.com.daidalos.afiledialog;
import java.io.File;
import java.util.LinkedList;
import java.util.List;
import android.app.Dialog;
import android.content.Context;
import android.view.View;
import android.view.WindowManager;
import android.widget.LinearLayout;
import com.example.avoscloud_demo.R;
/**
* A file chooser implemented in a Dialog.
*/
public class FileChooserDialog extends Dialog implements FileChooser {
// ----- Attributes ----- //
/**
* The core of this file chooser.
*/
private FileChooserCore core;
/**
* The listeners for the event of select a file.
*/
private List<OnFileSelectedListener> listeners;
// ----- Constructors ----- //
/**
* Creates a file chooser dialog which, by default, lists all the files in the SD card.
*
* @param context The current context.
*/
public FileChooserDialog(Context context) {
this(context, null);
}
/**
* Creates a file chooser dialog which lists all the file of a particular folder.
*
* @param context The current context.
* @param folderPath The folder which files are going to be listed.
*/
public FileChooserDialog(Context context, String folderPath) {
// Call superclass constructor.
super(context);
// Set layout.
this.setContentView(R.layout.daidalos_file_chooser);
// Maximize the dialog.
WindowManager.LayoutParams lp = new WindowManager.LayoutParams();
lp.copyFrom(this.getWindow().getAttributes());
lp.width = WindowManager.LayoutParams.FILL_PARENT;
lp.height = WindowManager.LayoutParams.FILL_PARENT;
this.getWindow().setAttributes(lp);
// By default, load the SD card files.
this.core = new FileChooserCore(this);
this.core.loadFolder(folderPath);
// Initialize attributes.
this.listeners = new LinkedList<OnFileSelectedListener>();
// Set the background color.
LinearLayout layout = (LinearLayout) this.findViewById(R.id.rootLayout);
layout.setBackgroundColor(context.getResources().getColor(R.color.daidalos_backgroud));
// Add a listener for when a file is selected.
core.addListener(new FileChooserCore.OnFileSelectedListener() {
public void onFileSelected(File folder, String name) {
// Call to the listeners.
for(int i=0; i<FileChooserDialog.this.listeners.size(); i++) {
FileChooserDialog.this.listeners.get(i).onFileSelected(FileChooserDialog.this, folder, name);
}
}
public void onFileSelected(File file) {
// Call to the listeners.
for(int i=0; i<FileChooserDialog.this.listeners.size(); i++) {
FileChooserDialog.this.listeners.get(i).onFileSelected(FileChooserDialog.this, file);
}
}
});
}
// ----- Events methods ----- //
/**
* Add a listener for the event of a file selected.
*
* @param listener The listener to add.
*/
public void addListener(OnFileSelectedListener listener) {
this.listeners.add(listener);
}
/**
* Removes a listener for the event of a file selected.
*
* @param listener The listener to remove.
*/
public void removeListener(OnFileSelectedListener listener) {
this.listeners.remove(listener);
}
/**
* Removes all the listeners for the event of a file selected.
*/
public void removeAllListeners() {
this.listeners.clear();
}
/**
* Interface definition for a callback to be invoked when a file is selected.
*/
public interface OnFileSelectedListener {
/**
* Called when a file has been selected.
*
* @param file The file selected.
*/
void onFileSelected(Dialog source, File file);
/**
* Called when an user wants to be create a file.
*
* @param folder The file's parent folder.
* @param name The file's name.
*/
void onFileSelected(Dialog source, File folder, String name);
}
// ----- Miscellaneous methods ----- //
/**
* Set a regular expression to filter the files that can be selected.
*
* @param filter A regular expression.
*/
public void setFilter(String filter) {
this.core.setFilter(filter);
}
/**
* Defines if only the files that can be selected (they pass the filter) must be show.
*
* @param show 'true' if only the files that can be selected must be show or 'false' if all the files must be show.
*/
public void setShowOnlySelectable(boolean show) {
this.core.setShowOnlySelectable(show);
}
/**
* Loads all the files of the SD card root.
*/
public void loadFolder() {
this.core.loadFolder();
}
/**
* Loads all the files of a folder in the file chooser.
*
* If no path is specified ('folderPath' is null) the root folder of the SD card is going to be used.
*
* @param folderPath The folder's path.
*/
public void loadFolder(String folderPath) {
this.core.loadFolder(folderPath);
}
/**
* Defines if the chooser is going to be used to select folders, instead of files.
*
* @param folderMode 'true' for select folders or 'false' for select files.
*/
public void setFolderMode(boolean folderMode) {
this.core.setFolderMode(folderMode);
}
/**
* Defines if the user can create files, instead of only select files.
*
* @param canCreate 'true' if the user can create files or 'false' if it can only select them.
*/
public void setCanCreateFiles(boolean canCreate) {
this.core.setCanCreateFiles(canCreate);
}
/**
* Defines the value of the labels.
*
* @param label The labels.
*/
public void setLabels(FileChooserLabels labels) {
this.core.setLabels(labels);
}
/**
* Allows to define if a confirmation dialog must be show when selecting o creating a file.
*
* @param onSelect 'true' for show a confirmation dialog when selecting a file, 'false' if not.
* @param onCreate 'true' for show a confirmation dialog when creating a file, 'false' if not.
*/
public void setShowConfirmation(boolean onSelect, boolean onCreate) {
this.core.setShowConfirmationOnCreate(onCreate);
this.core.setShowConfirmationOnSelect(onSelect);
}
/**
* Allows to define if, in the title, must be show only the current folder's name or the full file's path..
*
* @param show 'true' for show the full path, 'false' for show only the name.
*/
public void setShowFullPath(boolean show) {
this.core.setShowFullPathInTitle(show);
}
// ----- FileChooser methods ----- //
public LinearLayout getRootLayout() {
View root = this.findViewById(R.id.rootLayout);
return (root instanceof LinearLayout)? (LinearLayout)root : null;
}
public void setCurrentFolderName(String name) {
this.setTitle(name);
}
}