/*====================================================================
	TapBarModule.def		TapBar Module Interface file.
		
	)1995-1996 Yosuke "Basuke" Suzuki.
		
	Date		Who			Comment
	--------------------------------------------------------------
	12/16/95	Basuke		initial draft
	
	12/27/95	Basuke		change the structure of globals
							add palette definition
	
	3/15/96		Basuke		change its name as "TapBar"
							add ReallyEnsureInternal interface (debugging)
							change :ClickFinish() to ClickFinish(success)
	
	3/28/96		Basuke		1.0a0 release
	
	4/3/96		Basuke		now buttons can send Change ClickStart and 
							ClickFinish message directly to itself, not
							its parent. More to say it should do so.
							
	4/6/96		Basuke		add function to display icons instead of 
							default arrows. use arrowIcons slot.
							
	4/6/96		Basuke		add grouping facility. bar can have its own 
							group symbol, and buttons with same group 
							will be added into that bar. the bar with 
							group cannot be deleted by user.
							
	4/10/96		Basuke		1.0a1 release
	
	4/11/96		Basuke		change global frame structure not to hold
							preference soup entry.
							
	4/13/96		Basuke		move all static text into localization frame
							so that easily translate into Japanese using
							language preference.
							
	4/14/96		Basuke		add interface to change button order and
							to turn it on and off.
							
	4/15/96		Basuke		1.0b0 release
	
	4/16/96		Basuke		change app interface.
	
	4/16/96		Basuke		add dontFormat option.
	
	4/16/96		Basuke		1.0b1 release
	
	4/17/96		Basuke		add function to add buttons into status bar.
	
	4/17/96		Basuke		1.0b2 release
	
	4/18/96		Basuke		add groupOnly option to both buttons and bars.
							if this slot is true in button, it won't appear
							on bars except its group. if this slot is true
							in bar, only its group buttons will appear on it.
							
	5/9/96		Basuke		1.0 release
	
  ====================================================================*/

// ---------------------------------------------
//	kTapBarAppSym
// ---------------------------------------------
//		symbol of TapBar application

	constant kTapBarAppSym := '|TapBar:BASUKE|;


// ---------------------------------------------
//	kTapBarModuleRegistrySym
// ---------------------------------------------
//		symbol of module registry

	constant kTapBarModuleRegistrySym := '|Module:TapBar:BASUKE|;


// ---------------------------------------------
//	kReallyEnsureInternalFunc
// ---------------------------------------------
//		EnsureInternal only if it installed on external memory

	DefConst('kReallyEnsureInternalFunc,
	func(object)
	begin
		local onInternal := 
					(GetVBOStore(ObjectPkgRef(object)) = GetStores()[0]);
		
		if onInternal then
			object;
		else
			EnsureInternal(object);
	end);


// ---------------------------------------------
//	kNotifyTapBarButtonRegistryFunc
// ---------------------------------------------
//		function to notify change of button registry

	DefConst('kNotifyTapBarButtonRegistryFunc,
	func(what, who)
	begin
		local tb := GetGlobals().(kTapBarAppSym);
		if tb then
			tb:PrefChanged(what, who);
	end);


// ---------------------------------------------
//	kGetTapBarModulePrefFunc
// ---------------------------------------------
//		function to get pref frame of each module

	DefConst('kGetTapBarModulePrefFunc,
	func(symbol)
	begin
		local tb := GetGlobals().(kTapBarAppSym);
		if tb then
			tb:GetTapBarModulePref(symbol);
		else
			{};
	end);


// ---------------------------------------------
//	kSetTapBarModulePrefFunc
// ---------------------------------------------
//		function to set pref frame of each module

	DefConst('kSetTapBarModulePrefFunc,
	func(symbol, value)
	begin
		local tb := GetGlobals().(kTapBarAppSym);
		if tb then
			tb:SetTapBarModulePref(symbol, value);
	end);


// ---------------------------------------------
//	kGetTapBarModuleRegistryFunc : internal use
// ---------------------------------------------
//		function to get module registry frame

	constant kDefaultModuleRegistry := '{
		buttons:	{},		// actual button templates
		prefs:		{},		// pref panel templates
		palettes:	{},		// palette definitions
	};


	DefConst('kGetTapBarModuleRegistryFunc,
	func()
	begin
		if NOT HasSlot(GetGlobals(), kTapBarModuleRegistrySym) then
		begin
			local sym := EnsureInternal(kTapBarModuleRegistrySym);
			
			GetGlobals().(sym) := TotalClone(kDefaultModuleRegistry);
		end;
		
		GetGlobals().(kTapBarModuleRegistrySym);
	end);


// ---------------------------------------------
//	kRegTapBarSymbolFunc : internal use
// ---------------------------------------------
//		function to register frmae into slot

	DefConst('kRegTapBarSymbolFunc,
	func(frameBase, sym, frame)
	begin
		if sym AND frame then
		begin
			local registry;
			
			registry := (call kGetTapBarModuleRegistryFunc with ());
			
			if NOT HasSlot(registry, frameBase) then
			begin
				frameBase := EnsureInternal(frameBase);
				registry.(frameBase) := {};
			end;
			
			sym := EnsureInternal(sym);
			registry.(frameBase).(sym) := frame;
		
			sym;
		end
	end);


// ---------------------------------------------
//	kUnRegTapBarSymbolFunc : internal use
// ---------------------------------------------
//		function to register frmae from slot

	DefConst('kUnRegTapBarSymbolFunc,
	func(frameBase, sym)
	begin
		if sym then
		begin
			local registry := (call kGetTapBarModuleRegistryFunc with ());
			
			RemoveSlot(registry.(frameBase), sym);
		end
	end);


// ---------------------------------------------
//	kRegTapBarButtonFunc
// ---------------------------------------------
//		function to register button

	DefConst('kRegTapBarButtonFunc,
	func(sym, button)
	begin
		local slot := call kRegTapBarSymbolFunc
						 with ('buttons, sym, button);
		
		call kNotifyTapBarButtonRegistryFunc with ('buttonAdded, sym);
		
		return slot;
	end);


// ---------------------------------------------
//	kUnRegTapBarButtonFunc
// ---------------------------------------------
//		function to unregister button

	DefConst('kUnRegTapBarButtonFunc,
	func(sym)
	begin
		call kUnRegTapBarSymbolFunc with ('buttons, sym);
		
		call kNotifyTapBarButtonRegistryFunc with ('buttonRemoved, sym);
	end);


// ---------------------------------------------
//	kRegTapBarPrefFunc
// ---------------------------------------------
//		function to register pref panel

	DefConst('kRegTapBarPrefFunc,
	func(sym, pref)
	begin
		local slot := call kRegTapBarSymbolFunc
						 with ('prefs, sym, pref);
		
		call kNotifyTapBarButtonRegistryFunc with ('prefAdded, sym);
		
		return slot;
	end);


// ---------------------------------------------
//	kUnRegTapBarPrefFunc
// ---------------------------------------------
//		function to unregister pref panel

	DefConst('kUnRegTapBarPrefFunc,
	func(sym)
	begin
		call kUnRegTapBarSymbolFunc with ('prefs, sym);
		
		call kNotifyTapBarButtonRegistryFunc with ('prefRemoved, sym);
	end);


// ---------------------------------------------
//	kRegTapBarPaletteFunc
// ---------------------------------------------
//		function to register palette definition

	DefConst('kRegTapBarPaletteFunc,
	func(sym, paletteDef)
	begin
		local slot := call kRegTapBarSymbolFunc
						 with ('palettes, sym, paletteDef);
		
		call kNotifyTapBarButtonRegistryFunc with ('paletteAdded, sym);
		
		return slot;
	end);


// ---------------------------------------------
//	kUnRegTapBarPaletteFunc
// ---------------------------------------------
//		function to unregister palette definition

	DefConst('kUnRegTapBarPaletteFunc,
	func(sym)
	begin
		call kUnRegTapBarSymbolFunc with ('palettes, sym);
		
		call kNotifyTapBarButtonRegistryFunc with ('paletteRemoved, sym);
	end);


// ---------------------------------------------
//	kTapBarCreateNewBarFunc
// ---------------------------------------------
//		function to unregister palette definition

	DefConst('kTapBarCreateNewBarFunc,
	func(groupSym, barPrefFrame)
	begin
		if groupSym then
		begin
			if NOT HasSlot(barPrefFrame, 'version)
			 OR ClassOf(barPrefFrame.version) <> 'int then
			begin
				barPrefFrame := Clone(barPrefFrame);
				barPrefFrame.version := 0;
			end;
			
			local tb := GetGlobals().(kTapBarAppSym);
			if tb then
			begin
				tb:CreateNewBar(groupSym, barPrefFrame);
			end
			else
			begin
				call kRegTapBarSymbolFunc
						 with ('bars, groupSym, barPrefFrame);
			end
		end
	end);


