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

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

RepoBarText_text = [[
1.2.0版新功能 -- 增强的版本库导航栏
===
极客讨论器并不是版本控制的客户端软件，只是因为其主要功能是讨论和批注源代码，而源代码又是存储在版本库中，所以集成了简易的版本控制功能。  
因而可以看到，虽然极客讨论器目前可以操作subversion/git两种类型版本库，但是并没有内置那些高级操作，如建立分支和合并。git版本库目前是通过Source型插件实现（涵义为从**Source**获取代码，用Python_2.x语言编写，其它版本控制也将以此类型插件形式提供），甚至没有实现提交功能。  
另一方面，从版本库读取数据来说，却实现了比较强大的**映射**，**检索**，**搜索**等功能，都是为了讨论消息能高效的运作。

极客讨论器使用版本库导航栏来表示整个版本库或其中的一个分支，用它上面的滑块进行操作。如在不同版本间切换，在版本库和工作区间切换，检查新版本，提交版本。导航栏也用直观的方式向您展现版本库内的信息。  
![版本库导航栏](repos_bar.png)

我们提供了一个向导为您介绍版本库导航栏的使用方法。请[点击开始](start)

[关闭向导](cancel_auto_load)
]]

RecentConfig_text = [[
选择演示例子
===
请选择下面的 browse\_in\_repos.xml 配置，配置里指定了一个演示用的版本库。  
[上一步](index)
]]

GTalkabout_Ungray_text = [[
版本库导航栏
===
这是一个虚拟的工资表版本库，每一个修订版本是一个月的工资表。  
您在下方可以看到版本库导航栏。箭身代表这个工资表版本库内所有版本，箭头用于检测新版本或者提交新版本。  
上面有滑块可在导航栏上移动。

[下一步](repos_bar)
]]

ReposBar_text = [[
版本库导航栏
===
移动滑块可以切换至版本库内任意版本，而工作区对应的版本会在箭身上形成一个环，点击可以切换到工作区。  [下一步](author_revisions)
]]

AuthorRevisions_text = [[
高亮用户的版本
===
版本库用户按钮可以显示这个版本库的所有提交者，点击其中一个可查看他/她提交的所有版本。

[下一步](date_revisions)
]]

DateRevisions_text = [[
定位某日的版本
===
版本库历时按钮可以显示这个版本库的整个提交期，点击某日可查看当日提交的第一个版本。

[下一步](compare_revisions)
]]

CompareRevisions_text = [[
比较版本
===
版本比较按钮可以比对这个版本库的任意两个版本，交换比较按钮可以将这两个版本交换再次进行比对。  [下一步](navigate_actions)
]]

NavigateActions_text = [[
移动滑块时的附带动作
===
移动滑块时基本动作是列出对应版本的文件目录，附带动作可以同时打开对应版本的选中文件和/或日志。

[下一步](navigate_revisions)
]]

NavigateRevisions_text = [[
步移滑块/红旗
===
这一组按钮分别是将滑块移动到第一个版本，前一个版本，后一个版本，最后一个版本。  
如果正在比较版本就是将滑块和红旗同时移动到第一对版本，前一对版本，后一对版本，最后一对版本。  
当导航栏上有高亮版本时，范围是所有高亮的版本，否则是这个版本库的所有版本。

[下一步](cancel_highlight)
]]

CancelHighlight_text = [[
取消高亮版本
===
把所有高亮显示的版本恢复正常。

[下一步](file_revisions)
]]

FileRevisions_text = [[
高亮文件的版本
===
在文件列表中选中一个或多个文件，高亮版本库内这个/些文件的所有修改版本。  [下一步](commit_changes)
]]

CommitChanges_text = [[
提交修改
===
打开工作区的文件并稍作修改，点击“提交”按钮，会出现提交界面，可以选中文件提交入库。  [下一步](update_files)
]]

UpdateFiles_text = [[
更新文件
===
将滑块拖动到版本库任意版本，点击“更新”按钮，会出现更新界面，可以更新选中文件。  [下一步](thank_you)
]]

ThankYou_text = [[
版本库导航栏
===
这里介绍了版本库导航栏实现的基本版本库操作，在Version Control/SVN Commands菜单下还有其它一些操作。  
导航栏还有一个重要的功能是映射版本库，即把远程的版本库一个版本一个版本地同步到本地。每映射完一个版本导航栏上蓝色进度就会前进一步，直到整个箭身变蓝。  
需要映射的通常是网络上的版本库。subversion版本库是集中式的，很多访问它的命令都要通过网络。而当它的全部或者部分版本映射到本地后，再通过导航栏访问将优先访问本地的映射，本地无映射再访问源库，提高访问效率。  
git版本库本身是分布式的，它会先把整个库下载到本地，再访问这个本地拷贝。导航栏对git版本库和其它通过Source插件实现的版本库的映射操作是导入一个专门为它创建的本地subversion版本库中，这样可以进行单个或部分文件更新等git版本库无法实现的功能。

极客讨论器通过版本库导航栏实现版本库的**映射**，**检索**功能，关于**搜索**请看[介绍](search)

[关闭向导](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 CopyIterator(Iter, ControlTable)
	local Iter2 = Iter;
	local Iter2_upvalue = 1;

	function Iter2()
		local _, Origin = debug.getupvalue(Iter, 1);
		debug.setupvalue(Iter, 1, Iter2_upvalue);
		local Result = Iter()
		_, Iter2_upvalue = debug.getupvalue(Iter, 1);
		debug.setupvalue(Iter, 1, Origin);
		return Result;
	end
	return Iter2;
end

function ChangeSpotlights_recent_config(Iter, ControlTable)
	return { {"recent_config", 1} }, RecentConfig_text;
end

function ChangeSpotlights_gtalkabout_ungray(Iter, ControlTable)
	return { {"repos_control_bar", 0} }, GTalkabout_Ungray_text;
end

function ChangeSpotlights_gtalkabout_thank_you(Iter, ControlTable)
	return { {"control_tab", 1} }, ThankYou_text;
end

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

	if Control == "index" then
		return {}, RepoBarText_text;
	elseif Control == "start" or Control == "recent_config" then
		return ChangeSpotlights_recent_config(Iter, ControlTable);
	elseif (Control == "gray" and Value == "false") or (Control == "return") then
		return ChangeSpotlights_gtalkabout_ungray(Iter, ControlTable);
	elseif Control == "repos_bar" then
		return { {"resource_tab", 0}, {"control_tab", 0}, {"repos_control_bar", 1}, {"im_tab", 0} }, ReposBar_text;
	elseif Control == "author_revisions" then
		return { {"control_tab", 0}, {"repos_control_author_revisions", 1} }, AuthorRevisions_text;
	elseif Control == "date_revisions" then
		return { {"control_tab", 0}, {"repos_control_date_revisions", 1} }, DateRevisions_text;
	elseif Control == "compare_revisions" then
		return { {"control_tab", 0}, {"resource_tab", 0}, {"repos_control_compare_revisions", 1} }, CompareRevisions_text;
	elseif Control == "navigate_actions" then
		return { {"control_tab", 0}, {"repos_control_navigate_actions", 1} }, NavigateActions_text;
	elseif Control == "navigate_revisions" then
		return { {"control_tab", 0}, {"repos_control_navigate_revisions", 1} }, NavigateRevisions_text;
	elseif Control == "cancel_highlight" then
		return { {"control_tab", 0}, {"repos_control_cancel_highlight", 1} }, CancelHighlight_text;
	elseif Control == "file_revisions" then
		return { {"control_tab", 0}, {"resource_tab", 1}, {"repos_control_file_revisions", 1} }, FileRevisions_text;
	elseif Control == "commit_changes" then
		return { {"control_tab", 0}, {"resource_list", 1}, {"repos_control_commit", 1} }, CommitChanges_text;
	elseif Control == "update_files" then
		return { {"control_tab", 0}, {"resource_tab", 0}, {"repos_control_update", 1}, {"repos_control_bar", 1} }, UpdateFiles_text;
	elseif Control == "thank_you" then
		return ChangeSpotlights_gtalkabout_thank_you(Iter, ControlTable);
	elseif Control == "search" then
		TutorialOptions("whats_new_1_1_6");
	elseif Control == "close" or Control == "cancel_auto_load" then
		return {}, "";
	end
end

AutoLoad = 0