// $Id: FMC.FPL 1.9 1995/08/18 23:33:50 jskov Exp $
// $VER: FMC.FPL 2.1 (18.08.95) © Jesper Skov

int maxMajor=10;							// We have a maximum number of modes!
int majorCount=0;

int maxMinor=20;
int minorCount=0;

string export majorName[maxMajor];			// Major modes have Name,
string export majorExt[maxMajor];			// Extension match and
string export majorExe[maxMajor];			// Execute string

string minorName[maxMinor];					// Minor modes have no ext&exe

string export majorCycleString = "None";	// For use by PromptInfo
string export majorConfigString = "";

string export minorCheckString = "";


//»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»» AddMode() ««
int export AddMode(int type,
                   string name,
				   string extensions,
				   string execute)
{
  // Check that name exists?

  if (type){								// type_major==1
	if (majorCount>=maxMajor)
	  return 1;								// Bummer! No more space!

	majorName[majorCount]=name;

	// Check that ext&exe exist?
	majorExt[majorCount]=extensions;
	majorExe[majorCount]=execute;

	majorCycleString += joinstr("|", name); // Add mode to MajorMode cycle gadget

	majorConfigString += joinstr(",\"", extensions, "\""); // Add extensions string
	majorConfigString += joinstr(",\"", execute, "\""); // Add execute string


	// The code below will cause trouble if a MajorMode is added, while the
	// user is working (i.e. (s)he has several different buffers open).
	// Since the AddMode() should only be for use in the startup, I don't
	// see this as a problem, though!
	DeleteInfo("MajorMode");
	ConstructInfo("MajorMode", "","", "LCH", majorCycleString, 0,0,0);

	majorCount++;

	return 0;

  } else {									// type_minor==0
	if (minorCount>=maxMinor)
	  return 1;								// No more space

	minorName[minorCount]=name;
	// Maybe warn if ext&exe are not empty?

	minorCheckString += joinstr(",\"", name, "\""); // Add mode to minor mode list

	minorCount++;
	return 0;
  }
}

//»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»» CheckForce_hookPast ««
int export CheckForced_hookPast()
{
  string req = GetLine();
  int i = strstr(req,"-*-");				// Extract forced mode if any
  if(majorCount) {
	if (i>=0) {
	  int a = strstr(req,"-*-",i+3);
	  if(a>0) {
		req = substr(req, i+3, a-i-3);		// rec holds major mode request
	  } else {
		i=-1;
	  }
	}
	if(i>=0) {
	  for(i=0; i<majorCount; i++) {			// Check all major modes for match
		if(0 == stricmp(majorName[i], req)) {
		  enableMajorMode(i);
		  return 0;
		}
	  }
	}
  }
  return 0;
}

//»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»» CheckExt_hook() ««
export int CheckExt_hook(string path, string name)
{
  int i = strstr(name, ".");
  if (i > 0) {
	string ext;
	int a;
	while (0<=(a=strstr(name, ".", i+1)))	// Check for 2+ pts
	  i=a;
    a=0;
    ext = joinstr("*",substr(name, i + 1, -1),"*");    
    while(a<majorCount) {
      if(0 <= stristr(ReadInfo(majorExt[a]), ext)) {
        enableMajorMode(a);
        return 0;
      }
      a++;
    }
    // no extension matched

  }
}

//»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»» enableMajorMode() ««
void enableMajorMode(int number)
{
  if (number>=0){
	SetInfo(-1, "MajorMode", number+1);
	SetInfo(-1, majorName[number], 1);		// Set major mode's flag
	if(strlen(ReadInfo(majorExe[number])))	// and execute it's exeString
	  ExecuteString(ReadInfo(majorExe[number]));
	ReturnStatus(joinstr("Enabled major mode \"",majorName[number], "\"!"));
  }
}

//»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»» MajorModeControl() ««
void export MajorModeControl()
{
  int i = ReadInfo("MajorMode");

  PromptInfo(-1, "Buffer Major Mode", -1,-1, "MajorMode");

  if (ReadInfo("MajorMode")!=i){			// New major mode selected
	if (i)									// Disable "old" major mode
	  SetInfo(-1,majorName[i-1],0);

	for(i=0;i<minorCount;i++)				// Disable all minor modes
	  SetInfo(-1,minorName[i],0);

    enableMajorMode(ReadInfo("MajorMode")-1); // Enable new major mode
  }
}

//»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»» MinorModeControl() ««
void export MinorModeControl()
{
  ExecuteString(joinstr("PromptInfo(-1, \"Buffer Minor Modes\", -1,-1",
                        minorCheckString, ");"));
}

//»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»» MajorModeSettings() ««
void export MajorModeSettings()
{
  ExecuteString(joinstr("PromptInfo(-1, \"Major Mode Preferences\", -1,-1",
                        majorConfigString, ");"));
}


//»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»» ME() ««
void export ME(string mode_name)
{
  SetInfo(-1,mode_name,1);
}

//»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»» Info construction ««
ConstructInfo("MajorMode", "","", "LCH", majorCycleString, 0,0,0);


//»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»» Menu ««

MenuAdd("i", "Buffer Mode", "", "", 6,7);	// Add new Customizing menu

MenuAdd("s", "Major...", "MajorModeControl();", "", 6,7,-1);
MenuAdd("s", "Minor...", "MinorModeControl();", "", 6,7,-1);

MenuAdd("s", "Major Modes...", "MajorModeSettings();", "", 6,6,-1); // Add to Program

MenuBuild();


//»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»» Hooking ««
HookPast("Load","CheckForced_hookPast();"); // Checks forced requests
Hook("GetFile", "CheckExt_hook");		// Checks extensions
