-- 这是聚光灯控制脚本，用lua 5.2.x语言编写。聚光灯介绍形式是枫传网络独创的软件介绍方式。通过将软件界面雾化为背景，并用聚光灯突显要介绍的部分，配合文字说明，对软件进行介绍。您可以按照提示修改此脚本。
-- 下面为文件信息，除CodePage外，其它项目请不要修改。
Application = "GTalkabout"
Version = "1.1"
ScriptType = "tutorial"
CodePage = 936	-- 简体中文，如果您将此脚本翻译为其他语种，请修改为该语种对应的代码页，否则，请不要修改。

-- 下面为介绍文字，是markdown格式文本。您可以将其翻译为其它语种或进行修改，请不要修改圆括号内的文字。

LocalDevelop1_text = [[
本机源代码管理和批注
===
极客讨论器的批注消息不能直接关联本地目录里的源代码，因为本地目录里的文件是可以修改的，您修改源代码后，被关联的源代码有可能删掉了，也有可能改变了，都会造成批注消息的关联失效。所以要将批注消息关联到版本库中的代码。  
*因为一旦文件入库，它在这一瞬间就像拍了张照片，模样已经定格了，后面再怎么变化，这张照片里的样子是不会变的。把消息批注在源代码文件一个不变的快照的特定位置上，需要使用时再映射到它修改后的新位置。软件自动完成这一系列操作，来应对源代码的修改。*  
极客讨论器使用subversion版本库来容纳批注消息的关联源代码，而通过内置的工具，把其它类型版本库导入subversion版本库中。  
因此极客讨论器内置了subversion版本控制界面、本地版本库生成工具、以及其它类型版本库导入subversion版本库工具（目前只有git）。它即包含了批注代码所需的基本版本控制功能，也不会和您电脑内的其它版本控制工具发生冲突，也不会影响代码原有版本控制。

如果源代码已经是subversion管理下的代码（有.svn子目录），请选择**第三方开源项目**；如果没有版本控制或者是其它类型的版本控制（cvs/git/vss/hg等），请选择**本地开发项目**。

极客讨论器已经注册了资源管理器关联菜单，更方便的办法是通过代码目录的关联菜单打开极客讨论器，将自动判断项目类型。

[关闭向导](cancel_auto_load)
]]

LocalDevelop2_text = [[
本机源代码管理和批注
===
极客讨论器的批注消息不能直接关联本地目录里的源代码，因为本地目录里的文件是可以修改的，您修改源代码后，被关联的源代码有可能删掉了，也有可能改变了，都会造成批注消息的关联失效。所以要将批注消息关联到版本库中的代码。  
*因为一旦文件入库，它在这一瞬间就像拍了张照片，模样已经定格了，后面再怎么变化，这张照片里的样子是不会变的。把消息批注在源代码文件一个不变的快照的特定位置上，需要使用时再映射到它修改后的新位置。软件自动完成这一系列操作，来应对源代码的修改。*  
极客讨论器使用subversion版本库来容纳批注消息的关联源代码，而通过内置的工具，把其它类型版本库导入subversion版本库中。  
因此极客讨论器内置了subversion版本控制界面、本地版本库生成工具、以及其它类型版本库导入subversion版本库工具（目前只有git）。它即包含了批注代码所需的基本版本控制功能，也不会和您电脑内的其它版本控制工具发生冲突，也不会影响代码原有版本控制。

如果源代码已经是subversion管理下的代码（有.svn子目录），请选择**第三方开源项目**；如果没有版本控制或者其它类型的版本控制（cvs/git/vss/hg等），请选择**本地开发项目**。

如果您[注册资源管理器关联菜单](register)（需要通过regsvr32提供注册服务），则可以通过代码目录的关联菜单打开极客讨论器，将自动判断项目类型。

[关闭向导](cancel_auto_load)
]]

AboutConfig_text = [[
配置界面
===
有两处需要配置，其它保持缺省即可。首先，请在左边的配置类别中选择**源代码**。
]]

LocalConfig_text = [[
配置界面
===
subversion配置完成了。接下来，请在左边的配置类别中选择**本地**。
]]

Subversion_text = [[
源代码配置
===
选择**从工作区自动检测**，如果subversion服务器有账号信息，请输入用户名和密码；如果有提交权限，请取消只读；最后还可以选择连接方式。

[下一步](check_subversion)
]]

LocalWorkPath_text = [[
选择工作区
===
请在工作区输入源代码所在的目录。

[下一步](check_workpath)
]]

LocalWorkPath_Error_text = [[
选择工作区
===
%s不是有效的Windows目录（请输入绝对路径）。

[下一步](check_workpath)
]]

LocalDevelopConfig_text = [[
选择工作区
===
请在工作区路径中输入一个有效的本地目录，可以是不存在的目录，如果已存在必须<font color=#f00>不是</font>subversion管理下的目录（<font color=#f00>没有</font>.svn子目录）。

[下一步](check_localpath)
]]

Apply1_text = [[
配置完成
===
点击**确定**即可开始使用。  
也可以先将配置保存为一个配置文件，这样，它将出现在首页的**最近使用的配置**列表中。  

另外还有其它方式创建本地源代码的配置：  
将源代码目录拖到启动界面上；  
通过资源管理器中源代码目录的关联菜单打开极客讨论器。  

[关闭向导](cancel_auto_load)
]]

Apply2_text = [[
配置完成
===
点击**确定**即可开始使用。  
也可以先将配置保存为一个配置文件，这样，它将出现在首页的**最近使用的配置**列表中。  

另外还有其它方式创建本地源代码的配置：  
将源代码目录拖到启动界面上；  
[注册资源管理器关联菜单](register)（需要通过regsvr32提供注册服务）后，通过资源管理器中源代码目录的关联菜单打开极客讨论器。

[关闭向导](cancel_auto_load)
]]

-- 下面为聚光灯流程控制，请不要修改！
function ControlValueIterator(ControlTable)
	local iIndex = 0

	return function()
		iIndex = iIndex + 1;
		local ControlValue = ControlTable[iIndex];

		if type(ControlValue) == "string" then
			return ControlValue, "";
		elseif type(ControlValue) == "table" then
			local Control, Value = ControlValue[1], ControlValue[2];

			if type(Control) == "string" then
				if type(Value) == "string" then
					return Control, Value;
				else
					return Control, "";
				end
			else
				return nil;
			end
		else
			return nil;
		end
	end
end

function ChangeSpotlights_about_config(Iter, ControlTable)
	return { {"config_tab", 0}, {"subversion_detect_option", 0}, {"subversion_detect", 1}, {"subversion_username", 1}, {"subversion_password", 1}, {"subversion_readonly", 1}, {"subversion_connect_option", 1} }, Subversion_text;
end

function ChangeSpotlights_local_config(Iter, ControlTable)
	local Control, Value = Iter();

	for Control, Value in Iter do
		if Control == "subversion_detect_option" then
			if Value == "detect" then
				return { {"config_tab", 0}, {"local_workpath", 0} }, LocalWorkPath_text;
			else
				return { {"category_tree", 1}, {"config_tab", 0} }, AboutConfig_text;
			end
		elseif Control == "local_develop" then
			return { {"category_tree", 0}, {"config_tab", 0}, {"local_workpath", 0} }, LocalDevelopConfig_text;
		end
	end
	return { {"category_tree", 1}, {"config_tab", 0} }, AboutConfig_text;
end

function ChangeSpotlights_local_workpath(Iter, ControlTable)
	return { {"local_workpath", 2} }, LocalWorkPath_text;
end

function ChangeSpotlights_check_subversion(Iter, ControlTable)
	local Control, Value = Iter();

	for Control, Value in Iter do
		if Control == "subversion_detect_option" then
			if Value == "detect" then
				return { {"category_tree", 1}, {"config_tab", 0} }, LocalConfig_text;
			else
				return ChangeSpotlights_about_config(Iter, ControlTable);
			end
		end
	end
	return ChangeSpotlights_about_config(Iter, ControlTable);
end

function ChangeSpotlights_check_workpath(Iter, ControlTable)
	local Control, Value = Iter();

	if Control == "local_workpath" then
		if string.match(Value, "%a:\\.+") then
			return ChangeSpotlights_apply(Iter, ControlTable);
		else
			local Text = string.format(LocalWorkPath_Error_text, Value);

			return { {"local_workpath", 2} }, Text;
		end
	end
	return { {"local_workpath", 2} }, LocalWorkPath_text;
end

function ChangeSpotlights_check_localpath(Iter, ControlTable)
	local Control, Value = Iter();

	if Control == "local_workpath" then
		if CreateDirectory(Value) then
			return ChangeSpotlights_apply(Iter, ControlTable);
		else
			local Text = string.format(LocalWorkPath_Error_text, Value);

			return { {"local_workpath", 2} }, Text;
		end
	end
	return { {"local_workpath", 2} }, LocalWorkPath_text;
end

function ChangeSpotlights_apply(Iter, ControlTable)
	if CheckExplorerMenuInstalled() then
		return { {"save_as", 0}, {"apply", 0} }, Apply1_text;
	end
	return { {"save_as", 0}, {"apply", 0} }, Apply2_text;
end

function ChangeSpotlights_config(Iter, ControlTable)
	local Control, Value = Iter();

	if Control == "category_tree" and string.sub(Value, 1, 5) == "about" then
		return ChangeSpotlights_about_config(Iter, ControlTable);
	elseif Control == "category_tree" and string.sub(Value, 1, 5) == "local" then
		return ChangeSpotlights_local_config(Iter, ControlTable);
	end
	for Control, Value in Iter do
		if Control == "subversion_detect_option" then
			if Value == "detect" then
				return { {"category_tree", 1}, {"config_tab", 0} }, LocalConfig_text;
			end
		end
	end
	return { {"category_tree", 1}, {"config_tab", 0} }, AboutConfig_text;
end

function ChangeSpotlights(ControlTable)
	local Iter = ControlValueIterator(ControlTable);
	local Control, Value = Iter();

	if Control == "index" then
		if CheckExplorerMenuInstalled() then
			return { {"new_config", 0}, {"open_source", 1}, {"local_develop", 1} }, LocalDevelop1_text;
		end
		return { {"new_config", 0}, {"open_source", 1}, {"local_develop", 1} }, LocalDevelop2_text;
	elseif Control == "register" then
		if InstallExplorerMenu() then
			return { {"new_config", 0}, {"open_source", 1}, {"local_develop", 1} }, LocalDevelop1_text;
		end
	elseif Control == "config" then
		return ChangeSpotlights_config(Iter, ControlTable);
	elseif Control == "check_subversion" then
		return ChangeSpotlights_check_subversion(Iter, ControlTable);
	elseif Control == "check_workpath" then
		return ChangeSpotlights_check_workpath(Iter, ControlTable);
	elseif Control == "check_localpath" then
		return ChangeSpotlights_check_localpath(Iter, ControlTable);
	elseif Control == "local_workpath" then
		return ChangeSpotlights_local_workpath(Iter, ControlTable);
	elseif Control == "close" or Control == "cancel_auto_load" then
		return {}, "";
	end
end

AutoLoad = 0