static char rcsid[] = "@(#)$Id: openmailbox.c,v 1.5 2007/08/18 09:09:09 hurtta Exp $";

/******************************************************************************
 *  The Elm (ME+) Mail System  -  $Revision: 1.5 $   $State: Exp $
 *
 *  Author: Kari Hurtta <hurtta+elm@posti.FMI.FI> 
 *      or  Kari Hurtta <elm@elmme-mailer.org>
 *****************************************************************************
 * This routine mimics some routines from src/quit.c
 * That code was following copyright:
 *
 *  The Elm Mail System 
 *
 *			Copyright (c) 1988-1992 USENET Community Trust
 *			Copyright (c) 1986,1987 Dave Taylor
 *****************************************************************************/

#include "def_elm.h"
#include "s_me.h"

DEBUG_VAR(Debug,__FILE__,"ELM");

/* Opens new mailbox to current mailbox view without closing current mailbox */
void OpenMailbox(mailbox,aview,page)
     struct MailboxView *mailbox;
     struct AliasView *aview;
     struct menu_context  *page;
{
    struct folder_info *new_folder = NULL;
    struct folder_browser * XXX = new_browser(selection_folder);
    struct string         * buffer = NULL;
    int mc, old;

 ask_again:
    while(1) {
	int mbc,i;
	
	new_folder = folder_browser(page,
				    XXX,&buffer,
				    aview,
				    CATGETS(elm_msg_cat, MeSet, 
					    MeAskOpenFolder,
					    "Open which folder: "));
	if (!new_folder)
	    break;
	
	DPRINT(Debug,3,(&Debug,  
			"OpenMailbox(%p): new folder = %p\n",
			mailbox,new_folder));
	

	mbc = get_storage_count(mailbox);
	
	for (i = 0; i < mbc; i++) {
	    struct current_storage *storage = get_storage(mailbox,i);

	    if (!storage)
		continue;

	    /* do not accept the same file as the current */
	    if (storage->current_folder && 
		selection_is_folder(XXX,storage->current_folder)) {
		lib_error(CATGETS(elm_msg_cat, MeSet, 
				  MeFolderAlreadyOpened,
				  "Folder %S is already opened to current view."),
			  buffer);
	    
		/* Closing of IMAP folder may clear that error message
		 * se sleep on here ...
		 */
		
		FlushBuffer();
		sleep_message();
		
		leave_old_folder(&new_folder,CLOSE_NORMAL);
		
		goto ask_again;	/* prompt again */
	    }	
	}


	/* Make sure this is a file the user can open, unless it is 
	 * the default mailfile, which is openable even if empty 
	 */
			       
	if (!sessionlock_folder(new_folder,SESSIONLOCK_CHECK)) {
	    leave_old_folder(&new_folder,CLOSE_NORMAL);
		
	    continue; 	/* prompt again */
	}

	break;  /* exit loop - we got the name of a good file */
    }

    if (!new_folder)
	return;


    old = get_selected(mailbox);
    if (old) {
	DPRINT(Debug,4,(&Debug,
			"OpenMailbox: %d messages was selected.\n",old));

    }


    add_new_mailbox(new_folder,mailbox,page);

    mc = get_message_count(mailbox);
    DPRINT(Debug,4,(&Debug,
		    "OpenMailbox: %d messages total.\n",mc));

    if (old) {
	int i, selected = 0;

	for (i = 0; i < mc; i++) {
	    if ( ison_status_message(mailbox,i,status_basic,VISIBLE))
		selected++;
	}

	DPRINT(Debug,4,(&Debug,"  -> Now %d messages selected  (was %d).\n",
			selected,old));

	set_selected(mailbox,selected);
    }
}

void OpenMailboxPost(mailbox,page,LOC)
     struct MailboxView *mailbox;
     struct menu_context  *page;
     struct screen_parts *LOC;
{
    
    {
	struct menu_common MENU;
	set_mcommon_from_mbxview(&MENU,mailbox);

	get_page(&MENU, LOC->header_page);  /* resort_mailbox no longer call get_page() */
    }

    menu_trigger_redraw(LOC->header_page);
    menu_trigger_redraw(LOC->title_page);
}

/*
 * Local Variables:
 *  mode:c
 *  c-basic-offset:4
 *  buffer-file-coding-system: iso-8859-1
 * End:
 */


syntax highlighted by Code2HTML, v. 0.9.1