		/*************************************
		 *                                   *
		 *             Editor v1.0           *
		 *   by Torsten Jürgeleit in 08/91   *
		 *                                   *
		 *              Save part            *
		 *                                   *
		 *************************************/

	/* Includes */

#include "includes.h"
#include "defines.h"
#include "imports.h"
#include "protos.h"

	/* Save project */

   SHORT
save_project(VOID)
{
   struct TemplateList   *tl = &template_list;
   struct Template       *tp;
   struct FileRequester  *freq = project_file_requester;
   BPTR   fh;
   BYTE   path[LONG_DSIZE + LONG_FSIZE + 1];
   USHORT len;
   SHORT  status = EDITOR_STATUS_NORMAL;

   /* Display ARP file requester and check if user selected cancel */
   freq->fr_FuncFlags |= FRF_DoColor;
   freq->fr_Hail       = PROJECT_SAVE_HAIL_TEXT;
   if (FileRequest(freq)) {

      /* Prepare file name and project name */
      len = strlen(freq->fr_File) - 4;
      if (Strcmp(freq->fr_File + len, ".tpl")) {
	 strcpy(&tl->tl_ProjectName[0], freq->fr_File);
	 strcat(freq->fr_File, ".tpl");
      } else {
	 strncpy(&tl->tl_ProjectName[0], freq->fr_File, (size_t)len);
	 tl->tl_ProjectName[len] = '\0';
      }

      /* Build full path for project file */
      strcpy(&path[0], freq->fr_Dir);
      TackOn(&path[0], freq->fr_File);

      /* Check if file already exists and inform user */
      if (fh = Open(&path[0], (LONG)MODE_OLDFILE)) {
	 Close(fh);
      }
      if (!fh || ok_cancel_requester(" Save ", "File already exists."
			     " Do you really want to overwrite?") == TRUE) {

	 /* Open file and write project header */
	 if (!(fh = Open(&path[0], (LONG)MODE_NEWFILE))) {
	    status = EDITOR_ERROR_OPEN_FAILED;
	 } else {
	    if ((status = write_project_header(fh)) == EDITOR_STATUS_NORMAL) {

	       /* Save all templates */
	       for (tp = get_head(&tl->tl_List); tp && status ==
			EDITOR_STATUS_NORMAL; tp = get_succ(&tp->tp_Node)) {
		  status = write_template(fh, tp);
	       }

	       /* If any error then delete incomplete project file */
	       if (status != EDITOR_STATUS_NORMAL) {
		  DeleteFile(&path[0]);
	       } else {
		  tl->tl_Flags &= ~TEMPLATE_LIST_FLAG_CHANGED;
	       }
	    }
	    Close(fh);
	 }
      }
   }
   if (status != EDITOR_STATUS_NORMAL) {
      show_error(status);
   }
   return(status);
}
	/* Write project header to save file */

   STATIC SHORT
write_project_header(BPTR fh)
{
   SHORT status;

   if (FPrintf(fh,
		"BEGIN PROJECTHEADER\n"
		"   LEFTEDGE=%d\n"
		"   TOPEDGE=%d\n"
		"   WIDTH=%d\n"
		"   HEIGHT=%d\n"
		"   FLAGS=%d\n"
		"END PROJECTHEADER\n", pwin->LeftEdge, pwin->TopEdge,
		pwin->Width, pwin->Height, template_list.tl_Flags) == -1L) {
      status = EDITOR_ERROR_WRITE_FAILED;
   } else {
      status = EDITOR_STATUS_NORMAL;
   }
   return(status);
}
	/* Write template data to save file */

   STATIC SHORT
write_template(BPTR fh, struct Template  *tp)
{
   struct Box         *box = &tp->tp_Box;
   struct TextAttr    *ta = &tp->tp_TextAttr;
   struct BorderData  *bd;
   struct TextData    *td;
   struct GadgetData  *gd;
   struct Node        *node;
   BYTE  *fmt;
   UBYTE type = tp->tp_Type;
   SHORT status = EDITOR_STATUS_NORMAL;

   /* Write standard data */
   if (FPrintf(fh,
		"BEGIN TEMPLATE\n"
		"   NAME=\"%s\"\n"
		"   TYPE=%d\n"
		"   FLAGS=%d\n"
		"   BEGIN BOX\n"
		"      X1=%d\n"
		"      Y1=%d\n"
		"      X2=%d\n"
		"      Y2=%d\n"
		"   END BOX\n", &tp->tp_TemplateName[0], type,
			   tp->tp_Flags, box->bo_X1, box->bo_Y1, box->bo_X2,
						       box->bo_Y2) == -1L) {
      status = EDITOR_ERROR_WRITE_FAILED;
   } else {

      /* Write text list if any */
      if (type == TEMPLATE_TYPE_MX || type == TEMPLATE_TYPE_CYCLE ||
					   type == TEMPLATE_TYPE_LISTVIEW) {
	 if (FPrintf(fh, "   BEGIN TEXTLIST\n") == -1L) {
	    status = EDITOR_ERROR_WRITE_FAILED;
	 } else {
	    for (node = get_head(&tp->tp_TextList); node &&
		    status == EDITOR_STATUS_NORMAL; node = get_succ(node)) {
	       if (FPrintf(fh, "      TEXT=\"%s\"\n", node->ln_Name) == -1L) {
		  status = EDITOR_ERROR_WRITE_FAILED;
	       }
	    }
	    if (status == EDITOR_STATUS_NORMAL) {
	       if (FPrintf(fh, "   END TEXTLIST\n") == -1L) {
		  status = EDITOR_ERROR_WRITE_FAILED;
	       }
	    }
	 }
      }

      /* Write template data */
      if (status == EDITOR_STATUS_NORMAL) {
	 switch (TEMPLATE_GROUP(tp)) {
	    case TEMPLATE_GROUP_BORDER :

	       /* Write border data */
	       bd = &tp->tp_Data.tp_BorderData;
	       if (FPrintf(fh,
			"   BEGIN BORDERDATA\n"
			"      TYPE=%ld\n"
			"   END BORDERDATA\n", bd->bd_Type) == -1L) {
		  status = EDITOR_ERROR_WRITE_FAILED;
	       }
	       break;
	    case TEMPLATE_GROUP_TEXT :

	       /* Write text data */
	       td = &tp->tp_Data.tp_TextData;
	       if (td->td_Type == TEXT_DATA_TYPE_TEXT) {
		  fmt = "   BEGIN TEXTATTR\n"
			"      NAME=\"%s\"\n"
			"      YSIZE=%d\n"
			"      STYLE=%d\n"
			"      FLAGS=%d\n"
			"   END TEXTATTR\n"
		  	"   BEGIN TEXTDATA\n"
			"      TYPE=%d\n"
			"      FLAGS=%d\n"
			"      TEXT=\"%s\"\n"
			"   END TEXTDATA\n";
	       } else {
		  fmt = "   BEGIN TEXTATTR\n"
			"      NAME=\"%s\"\n"
			"      YSIZE=%d\n"
			"      STYLE=%d\n"
			"      FLAGS=%d\n"
			"   END TEXTATTR\n"
		  	"   BEGIN TEXTDATA\n"
			"      TYPE=%d\n"
			"      FLAGS=%d\n"
			"      TEXT=%ld\n"
			"   END TEXTDATA\n";
	       }
	       if (FPrintf(fh, fmt, ta->ta_Name, ta->ta_YSize, ta->ta_Style,
				    ta->ta_Flags, td->td_Type, td->td_Flags,
						      td->td_Text) == -1L) {
		  status = EDITOR_ERROR_WRITE_FAILED;
	       }
	       break;
	    case TEMPLATE_GROUP_GADGET :

	       /* Write gadget data */
	       gd = &tp->tp_Data.tp_GadgetData;
	       if (FPrintf(fh,
			"   BEGIN TEXTATTR\n"
			"      NAME=\"%s\"\n"
			"      YSIZE=%d\n"
			"      STYLE=%d\n"
			"      FLAGS=%d\n"
			"   END TEXTATTR\n"
			"   BEGIN GADGETDATA\n"
			"      TYPE=%ld\n"
			"      FLAGS=%ld\n", ta->ta_Name, ta->ta_YSize,
				    ta->ta_Style, ta->ta_Flags, gd->gd_Type,
						     gd->gd_Flags) == -1L) {
		  status = EDITOR_ERROR_WRITE_FAILED;
	       } else {
		  if (!gd->gd_Text) {
		     fmt = "      TEXT=%ld\n";
		  } else {
		     fmt = "      TEXT=\"%s\"\n";
		  }
		  if (FPrintf(fh, fmt, gd->gd_Text) == -1L) {
		     status = EDITOR_ERROR_WRITE_FAILED;
		  } else {
		     if (gd->gd_Type == GADGET_DATA_TYPE_STRING) {
			fmt = "      SPECIAL1=%ld\n"
			      "      SPECIAL2=%ld\n"
			      "      SPECIAL3=\"%s\"\n";
		     } else {
		        fmt = "      SPECIAL1=%ld\n"
			      "      SPECIAL2=%ld\n"
			      "      SPECIAL3=%ld\n";
		     }
		     if (FPrintf(fh, fmt, gd->gd_SpecialData.gd_Data.gd_Data1,
					gd->gd_SpecialData.gd_Data.gd_Data2,
			      gd->gd_SpecialData.gd_Data.gd_Data3) == -1L) {
			status = EDITOR_ERROR_WRITE_FAILED;
		     } else {
			if (FPrintf(fh, "   END GADGETDATA\n") == -1L) {
			   status = EDITOR_ERROR_WRITE_FAILED;
			}
		     }
		  }
	       }
	       break;
	 }
      }
      if (status == EDITOR_STATUS_NORMAL) {
	 if (FPrintf(fh, "END TEMPLATE\n") == -1L) {
	    status = EDITOR_ERROR_WRITE_FAILED;
	 }
      }
   }
   return(status);
}
