void StructureManager::AddFile(const char* filename)
{
    if (!filename)
	return;

    char* localCopy = strdup(filename);
    if (!localCopy)
	return;

    // Strip any trailing directory markers. Maybe we could load all files in the directory in this case,
    // but it hardly seems worth the effort.
    while (strlen(localCopy) > 0 && localCopy[strlen(localCopy) - 1] == '/')
    	localCopy[strlen(localCopy) - 1] = 0;

    // Get the base file name
    const char* basename = strrchr(localCopy, '/');
    if (!basename)
	basename = localCopy;
    else
	basename++;

    // TODO: Check for duplicate file name.

    // Figure out what kind of file we have and try to load it.
    const char* extension = strrchr(basename, '.');
    RNAStructure* structure = 0;
    if (extension && !strncmp(extension, ".bpseq", 6))
    {
	structure = RNAStructure::CreateFromFile(localCopy, true);
    }
    else if (extension && !strncmp(extension, ".ct", 3))
    {
	structure = RNAStructure::CreateFromFile(localCopy, false);
    }
    else
    {
	if (strlen(filename) > 1000)
	    fl_message("Unknown file type: <file name too long>");
	else
	    fl_message("Unknown file type: %s", filename);
	return;
    }

    if (structure)
    {
	// TODO: Check for duplicates.

	int index = AddFirstEmpty(structure);
	MainWindow::AddStructure(structure->GetFilename(), index, false);
    }

    free(localCopy);
}
void StructureManager::AddFile(const char* filename)
{
    if (!filename)
	return;

    char* localCopy = strdup(filename);
    if (!localCopy)
    {
		return;
    }

    // Strip any trailing directory markers. Maybe we could load all files in the directory in this case,
    // but it hardly seems worth the effort.
    while (strlen(localCopy) > 0 && localCopy[strlen(localCopy) - 1] == '/')
    	localCopy[strlen(localCopy) - 1] = 0;

    // Get the base file name
    const char* basename = strrchr(localCopy, '/');
    if (!basename)
		basename = localCopy;
    else
		basename++;
    
    // Don't load if it shares a filename with another loaded structure
    // TODO: Check whether to allow multiple structures with the same filename
    for (int i = 0; i < m_structureCount; ++i)
    {
        if (m_structures[i])
        {
            if (!strcmp(m_structures[i]->GetFilename(), basename))
            {
            	fl_message("Already have a structure loaded with the filename: %s", basename);
            	return;
            }
        }
    }
    
    // Figure out what kind of file we have and try to load it.
    const char* extension = strrchr(basename, '.');
    RNAStructure* structure = 0;
    if (extension && !strncmp(extension, ".bpseq", 6))
    {
		structure = RNAStructure::CreateFromFile(localCopy, true);
    }
    else if (extension && !strncmp(extension, ".ct", 3))
    {
		structure = RNAStructure::CreateFromFile(localCopy, false);
    }
    else if (extension && !strncmp(extension, ".nopct", 6))
    {
		structure = RNAStructure::CreateFromFile(localCopy, false);
    }
    else
    {
		if (strlen(filename) > 1000)
		    fl_message("Unknown file type: <file name too long>");
		else
		    fl_message("Unknown file type: %s", filename);
		return;
    }

    if (structure)
    {
	// TODO: Check for duplicates.

    	int count = (int)folders.size();
		AddFirstEmpty(structure);
        if(count == (int) folders.size()-1)
        {
            InputWindow* input_window = new InputWindow(400, 150, "New Folder Added", 
            	folders[count]->folderName, InputWindow::FOLDER_INPUT);
            while (input_window->visible())
            {
                Fl::wait();
            }
            
            bool same = false;
            
            for(unsigned int ui = 0; ui < folders.size(); ui++)
            {
            	if (!strcmp(folders[ui]->folderName,input_window->getName())
                    && strcmp(input_window->getName(),""))
            	{
            		same = true;
            		break;
            	}
            }
            
            while (same) {
                fl_message("Already have a folder with the name: %s, please choose another name.", input_window->getName());
                delete input_window;
                input_window = new InputWindow(400, 150, "New Folder Added", 
	            	folders[count]->folderName, InputWindow::FOLDER_INPUT);
                while (input_window->visible())
                {
                    Fl::wait();
                }
                same = false;
                for(unsigned int ui = 0; ui < folders.size(); ui++)
            	{
            		if (!strcmp(folders[ui]->folderName,input_window->getName()))
	            	{
    	        		same = true;
        	    		break;
            		}
	            }
            }
                        
            if(strcmp(input_window->getName(), ""))
            	strcpy(folders[count]->folderName,input_window->getName());

            MainWindow::AddFolder(folders[count]->folderName, count, false);
            delete input_window;
        }
	//MainWindow::AddStructure(structure->GetFilename(), index, false);
    }

    free(localCopy); localCopy = NULL;
}
void StructureManager::AddFile(const char* filename)
{
    if (!filename)
	    return;

    char* localCopy = strdup(filename);
    if (!localCopy) {
        return;
    }

    // Get the base file name
    const char* basename = strrchr(localCopy, '/');
    if (!basename)
		basename = localCopy;
    else
		basename++;
    
    // Don't load if it shares a filename with another loaded structure
    for (int i = 0; i < m_structureCount; ++i)
    {
        if (m_structures[i])
        {
            if (!strcmp(m_structures[i]->GetFilename(), basename))
            {
            	fl_message("Already have a structure loaded with filename: %s", 
			   basename);
            	free(localCopy);
		return;
            }
        }
    }
    
    // Figure out what kind of file we have and try to load it.
    const char* extension = strrchr(basename, '.');
    extension = extension ? extension : "";
    RNAStructure* structure = NULL;
    if (extension && !strncasecmp(extension, ".bpseq", 6)) {
        structure = RNAStructure::CreateFromFile(localCopy, true);
    }
    else if (extension && !strncasecmp(extension, ".ct", 3)) {
	structure = RNAStructure::CreateFromFile(localCopy, false);
    }
    else if (extension && !strncasecmp(extension, ".nopct", 6)) {
	structure = RNAStructure::CreateFromFile(localCopy, false);
    }
    else if(extension && (!strncasecmp(extension, ".dot", 4) || 
			  !strncasecmp(extension, ".bracket", 8) || 
			  !strncasecmp(extension, ".dbn", 4))) {
	structure = RNAStructure::CreateFromDotBracketFile(localCopy);
    }
    else {
		if (strlen(filename) > 1000)
		    fl_message("Unknown file type: <file name too long>");
		else
		    fl_message("Unknown file type: %s . %s [%s]", filename, extension, basename);
		return;
    }

    if (structure)
    {
    	int count = (int)folders.size();
	AddFirstEmpty(structure);
        if(count == (int) folders.size()-1)
        {
            InputWindow* input_window = new InputWindow(400, 150, 
			 "New Folder Added", folders[count]->folderName, 
			 InputWindow::FOLDER_INPUT);
            while (input_window->visible() && !GUI_USE_DEFAULT_FOLDER_NAMES)
            {
                Fl::wait();
            }
            
            bool same = false;
            for(unsigned int ui = 0; ui < folders.size(); ui++)
            {
            	if (!strcmp(folders[ui]->folderName,input_window->getName())
                    && strcmp(input_window->getName(),""))
            	{
            		same = true;
            		break;
            	}
            }
            
            while (same) {
                fl_message("Already have a folder with the name: %s, please choose another name.", 
                           input_window->getName());
                delete input_window;
                input_window = new InputWindow(400, 150, "New Folder Added", 
	            	               folders[count]->folderName, InputWindow::FOLDER_INPUT);
                while (input_window->visible() && !GUI_USE_DEFAULT_FOLDER_NAMES)
                {
                    Fl::wait();
                }
                same = false;
                for(unsigned int ui = 0; ui < folders.size(); ui++)
            	{
            		if (!strcmp(folders[ui]->folderName, input_window->getName()))
	            	{
    	        		same = true;
        	    		break;
            		}
	            }
            }
                        
            if(strcmp(input_window->getName(), ""))
            	strcpy(folders[count]->folderName, input_window->getName());

            MainWindow::AddFolder(folders[count]->folderName, count, false);
	    delete input_window;
        }

    }
    else {
         fl_alert("Error adding structure \"%s\"! Could not parse the specified format for this file.\n", 
	          localCopy);
    }
    Free(localCopy); 

}