/* AbiSource Application Framework
 * Copyright (C) 1998 AbiSource, Inc.
 * 
 * This program is free software; you can redistribute it and/or
 * modify it under the terms of the GNU General Public License
 * as published by the Free Software Foundation; either version 2
 * of the License, or (at your option) any later version.
 * 
 * This program 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 General Public License for more details.
 * 
 * You should have received a copy of the GNU General Public License
 * along with this program; if not, write to the Free Software
 * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  
 * 02111-1307, USA.
 */

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>
#include <Pt.h>

#include "ut_string.h"
#include "ut_misc.h"
#include "ut_assert.h"
#include "xap_Dialog_Id.h"
#include "xap_Dlg_MessageBox.h"
#include "xap_QNXDlg_FileOpenSaveAs.h"
#include "xap_QNXApp.h"
#include "xap_QNXFrameImpl.h"
#include "xap_Frame.h"
#include "xap_Strings.h"

/*****************************************************************/
XAP_Dialog * XAP_QNXDialog_FileOpenSaveAs::static_constructor(XAP_DialogFactory * pFactory,
															 XAP_Dialog_Id id)
{
	XAP_QNXDialog_FileOpenSaveAs * p = new XAP_QNXDialog_FileOpenSaveAs(pFactory,id);
	return p;
}

XAP_QNXDialog_FileOpenSaveAs::XAP_QNXDialog_FileOpenSaveAs(XAP_DialogFactory * pDlgFactory,
														   XAP_Dialog_Id id)
	: XAP_Dialog_FileOpenSaveAs(pDlgFactory,id)
{
	m_szFinalPathnameCandidate = NULL;
}

XAP_QNXDialog_FileOpenSaveAs::~XAP_QNXDialog_FileOpenSaveAs(void)
{
	FREEP(m_szFinalPathnameCandidate);
}

/*****************************************************************/

void XAP_QNXDialog_FileOpenSaveAs::runModal(XAP_Frame * pFrame)
{
	char file_filter[80];	
	m_pQNXFrame = (XAP_QNXFrame *)pFrame;
	UT_ASSERT(m_pQNXFrame);

	const XAP_StringSet * pSS = m_pApp->getStringSet();
	UT_UTF8String s;
	
	// do we want to let this function handle stating the QNX
	// directory for writability?  Save/Export operations will want
	// this, open/import will not.

	bool bCheckWritePermission = true;
	const XML_Char * szTitle = NULL;
	int   flags = 0;

	switch (m_id)
	{
	case XAP_DIALOG_ID_FILE_SAVEAS:
	{
		pSS->getValueUTF8(XAP_STRING_ID_DLG_FOSA_SaveAsTitle,s);
		szTitle = strdup(s.utf8_str());
		bCheckWritePermission = true;
		/* Allow non-existant files to be selected and confirm overwrite */
		flags = Pt_FSR_NO_FCHECK | Pt_FSR_CONFIRM_EXISTING;
		break;
	}
	case XAP_DIALOG_ID_PRINTTOFILE:
	{
		pSS->getValueUTF8(XAP_STRING_ID_DLG_FOSA_PrintToFileTitle,s);
		szTitle = strdup(s.utf8_str());
		bCheckWritePermission = true;
		flags = Pt_FSR_NO_FCHECK | Pt_FSR_CONFIRM_EXISTING;
		break;
	}
		case XAP_DIALOG_ID_INSERT_PICTURE:
	  {
		  pSS->getValueUTF8(XAP_STRING_ID_DLG_IP_Title,s);
		  szTitle = strdup(s.utf8_str());
		  bCheckWritePermission = false;    
		  break;
	  }
	case XAP_DIALOG_ID_FILE_OPEN:
	{
		pSS->getValueUTF8(XAP_STRING_ID_DLG_FOSA_OpenTitle,s);
		szTitle = strdup(s.utf8_str());
		bCheckWritePermission = false;
		break;
	}
	case XAP_DIALOG_ID_FILE_IMPORT:
	  {
		  pSS->getValueUTF8(XAP_STRING_ID_DLG_FOSA_ImportTitle,s);
		  szTitle = strdup(s.utf8_str());
		  bCheckWritePermission = false;
		  break;
	  }
	case XAP_DIALOG_ID_INSERT_FILE:
	  {
		  pSS->getValueUTF8(XAP_STRING_ID_DLG_FOSA_InsertTitle,s);
		  szTitle = strdup(s.utf8_str());
		  bCheckWritePermission = false;
		  break;
	  }
	case XAP_DIALOG_ID_FILE_EXPORT:
	  {
		  pSS->getValueUTF8(XAP_STRING_ID_DLG_FOSA_ExportTitle,s);
		  szTitle = strdup(s.utf8_str());
		  bCheckWritePermission = true;
		  flags = Pt_FSR_NO_FCHECK | Pt_FSR_CONFIRM_EXISTING;
		  break;
	  }
	default:
		UT_ASSERT(UT_SHOULD_NOT_HAPPEN);
		break;
}

	// use the persistence info and/or the suggested filename
	// to properly seed the dialog.
	
	char * szPersistDirectory = NULL;	// we must free this

	if (!m_szInitialPathname || !*m_szInitialPathname)
	{
		// the caller did not supply initial pathname
		// (or supplied an empty one).  see if we have
		// some persistent info.
		
		UT_ASSERT(!m_bSuggestName);
		if (m_szPersistPathname)
		{
			// we have a pathname from a previous use,
			// extract the directory portion and start
			// the dialog there (but without a filename).

			UT_cloneString(szPersistDirectory,m_szPersistPathname);
			char * pLastSlash = strrchr(szPersistDirectory, '/');
			if (pLastSlash)
				pLastSlash[1] = 0;
		}
		else
		{
			// no initial pathname given and we don't have
			// a pathname from a previous use, so just let
			// it come up in the current working directory.
			char thisdir[PATH_MAX];
			getcwd(thisdir, PATH_MAX);
			UT_cloneString(szPersistDirectory, thisdir);
		}
	}
	else
	{
		// we have an initial pathname (the name of the document
		// in the frame that we were invoked on).  if the caller
		// wanted us to suggest a filename, use the initial
		// pathname as is.  if not, use the directory portion of
		// it.
		
		//TODO: We need to make sure the fullpath of the 
		//      document is loaded up at start time.

		if (m_bSuggestName)
		{
			// use m_szInitialPathname
			UT_cloneString(szPersistDirectory, m_szInitialPathname);
		}
		else
		{
			// use directory(m_szInitialPathname)
			UT_cloneString(szPersistDirectory,m_szInitialPathname);
			char * pLastSlash = strrchr(szPersistDirectory, '/');
			if (pLastSlash)
				pLastSlash[1] = 0;
		}
	}

	XAP_QNXFrameImpl * pQNXFrameImpl = (XAP_QNXFrameImpl*)pFrame->getFrameImpl();
	PtWidget_t *parent =	pQNXFrameImpl->getTopLevelWindow();	

	PtFileSelectionInfo_t info;
	int ret;

	memset(&info, 0, sizeof(info));

	//Put this in a local function in order to run it in a loop

	//TODO: Dynamically create the file specification
	file_filter[0] = '\0';
	{
		UT_ASSERT(UT_pointerArrayLength((void **) m_szSuffixes) ==
				  UT_pointerArrayLength((void **) m_szDescriptions));

		// measure one list, they should all be the same length
		UT_uint32 end = UT_pointerArrayLength((void **) m_szDescriptions);

		for (UT_uint32 i = 0; i < end; i++) {
			UT_uint32 totallen;

			if(m_nTypeList[i] == m_nDefaultFileType) {
				printf("Missing FEATURE: No way to show default filter\n");
			}

#define PHOTON_HAS_STUPID_FILTER_LIMITATION
#if defined(PHOTON_HAS_STUPID_FILTER_LIMITATION)
			if(i >= 10) {
				printf("PHOTON BUG: Not enough room for filter \n");
				break;
			}
#endif

			totallen = strlen(file_filter) + strlen(m_szSuffixes[i]) + 2;
#if defined(PHOTON_SUPPORTS_COMBOFILTER)
			totallen += strlen(m_szDescriptions[i]) + 1;
#endif

			if (totallen > sizeof(file_filter)) {
				printf("PHOTON BUG: File filter string is limited to 80 characters \n");
				break;
			}

#if defined(PHOTON_SUPPORTS_COMBOFILTER)
			strcat(file_filter, "|");
			strcat(file_filter, m_szDescriptions[i]);
			strcat(file_filter, "|");
			strcat(file_filter, m_szSuffixes[i]);
#else	
			if (*file_filter) {
				strcat(file_filter, ",");
			}
			strcat(file_filter, m_szSuffixes[i]);
#endif
		}
	}
	char *tmp=file_filter;
while((tmp=strchr(tmp,';'))) 
	tmp[0]=',';
		
	ret = PtFileSelection(parent,											/* Parent */
						  NULL,												/* Position */
						  szTitle,											/* Title */
						  szPersistDirectory,								/* Root directory */
						  file_filter /* "*.abw, *"*/ , 					/* File spec */
						   (m_id == XAP_DIALOG_ID_FILE_OPEN)   ? "Open"  :  /* Button 1 name */
						  ((m_id == XAP_DIALOG_ID_FILE_SAVEAS) ? "Save"  :
						  ((m_id == XAP_DIALOG_ID_PRINTTOFILE) ? "Print" : NULL)),
						  NULL,												/* Button 2 name */
						  "nkd", 							/* Format (Name, Kb Size, date) */
						  &info,							/* Returned info structure */
						  flags);							/* Flags we might want */
	if (ret != -1 && (info.ret == Pt_FSDIALOG_BTN1)) {
		m_answer = XAP_Dialog_FileOpenSaveAs::a_OK;
		
		m_nFileType= XAP_DIALOG_FILEOPENSAVEAS_FILE_TYPE_AUTO;

		if (bCheckWritePermission)	 {  //Save/Print dialogs
			//If the file didn't have a suffix, then append one
			//We would normally do this based on the filter type ...

			//In photon this is kind of screwy since we have filters.
			if ((!UT_pathSuffix(info.path))) {
				//strcat(info.path, UT_pathSuffix(m_szSuffixes[0]);
				strcat(info.path, ".abw");
			}

			//Check our access on the file: 
			//- if can't write then try again
			//- if file exists then prompt for overwrite
		}

		// store final path name and file type
		UT_cloneString(m_szFinalPathname, info.path);

		//Not sure if I should do this here or not
		if (m_szPersistPathname)
			FREEP(m_szPersistPathname);
		UT_cloneString(m_szPersistPathname, info.path);

		//Store other info here too ....
		//info.format, info.fspec
	}
	else {
		m_answer = XAP_Dialog_FileOpenSaveAs::a_CANCEL;
	}
	
		   
	FREEP(szPersistDirectory);
	FREEP(szTitle);
	m_pQNXFrame = NULL;

	return;
}