// Version 1.00 03/10/96  First full release
//         1.01 22/10/96  Fixed spelling of 'Stationery'.
//         1.02 04/11/96  Stationery menu now automatically updated after new 
//                        documents and stylesheets have been added.
//                        Added 'View' option.
//         1.03 20/05/97  Uses OvationPro$AppletsDir to read/write resources.
//                        Uses loadfile() to load files.
//         1.04 25/07/97  Allows upto 4 levels of nested directories
//         1.05 01/09/97  Program around bug in menuprevious()



int statnry_handle;
int statnry_handle1;
int statnry_handle2;
int statnry_handle3;


int statnry_last;
int statnry_last1;
int statnry_last2;

int statnry_index;


string statnry_path = "<OvationPro$Applets>.!Statnry.Stationery";


// open directory or run the file


int statnry_entry(int entry, int subcode)
{
 string path;
 int    handle;

 path=statnry_path;
 handle=statnry_handle;

 if(subcode>=0)
 {
  path+="."+string_menu(statnry_handle,statnry_last);
  entry=statnry_index;
  handle=statnry_handle1;
 }

 if(subcode>=1)
 {
  path+="."+string_menu(statnry_handle1,statnry_last1);    
  handle=statnry_handle2;
 }

 if(subcode>=2)
 {
  path+="."+string_menu(statnry_handle2,statnry_last2);
  handle=statnry_handle3;
 }

 switch(entry)
 {
   case 0:
           osclis("filer_opendir "+path);
           break;
   default:
           loadfile(path + "." + string_menu(handle,entry));
           break;
 }

 return(0);
}


int statnry_subentry(int entry, int subcode)
{
 if(subcode==-1) statnry_index=entry;
 return(subcode+1);
}




// put dotted line below 'View' entry

int statnry_flags(int entry,string & text)
{
 return(DOTTED);
}


// rebuild menu each time it is opened

int statnry_menu(int open)
{
 string s;
 string path;
 int    object;
 int    handle;
 string entry;

 path=statnry_path;

 if(menuprevious(1)>=0)
 {
  if(menuprevious(2)>=0)
  {
   if(menuprevious(3)>=0)
   {
    if(menuprevious(4)>=0)
    {

    }
    else
    {
     if(statnry_handle3) delete_menu(statnry_handle3);
     statnry_handle3=handle=create_menu("{STATNRY_00}");
     path+="."+string_menu(statnry_handle,menuprevious(2));
     path+="."+string_menu(statnry_handle1,menuprevious(1));    
     path+="."+string_menu(statnry_handle2,menuprevious(0));
     statnry_last2=menuprevious(0);
    }
   }
   else
   {
    if(statnry_handle2) delete_menu(statnry_handle2);
    statnry_handle2=handle=create_menu("{STATNRY_00}");
    path+="."+string_menu(statnry_handle,menuprevious(1));
    path+="."+string_menu(statnry_handle1,menuprevious(0));
    statnry_last1=menuprevious(0);
   }
  }
  else
  {
   if(statnry_handle1) delete_menu(statnry_handle1);
   statnry_handle1=handle=create_menu("{STATNRY_00}");
   path+="."+string_menu(statnry_handle,menuprevious(0));
   statnry_last=menuprevious(0);
  }
  entry="statnry_subentry";
 }
 else
 {
  if(statnry_handle) delete_menu(statnry_handle);
  statnry_handle=handle=create_menu("{STATNRY_00}");
  entry="statnry_entry";
 }


 addentry_menu(handle,entry,"statnry_flags","","", "{STATNRY_01}");

 startscan();
 while((object=nextobject(path,"*",s))!=0)
 {
  if(object==1) addentry_menu(handle,entry,"","","",s);
  else          addentry_menu(handle,entry,"","statnry_menu","",s);
 }

 return(handle);
}


// find the position of an entry on a menu

int statnry_findmenuentry(int handle, string &t)
{
 int entry;
 string s;

 entry = 0;

 while(menudefstring(handle, entry, 4, s))
 {
  if(s == t)
   return(entry);
  entry++;
 }
 return(0);
}


// create 'Stationery' submenu and add it to the icon bar menu

void main(void)
{
 int    i, index;
 string s;

 index=statnry_findmenuentry(info_handle, "Quit");
 insertentry_menu(info_handle,index,"","","statnry_menu","","{STATNRY_00}");

 statnry_path = "OvationPro$AppletsDir";
 getenvs(statnry_path);
 statnry_path += ".!Statnry.Stationery";
}
