/*
 * * * Compile_AHK SETTINGS BEGIN * * *

[AHK2EXE]
Exe_File=%In_Dir%\..\FramaSuite.exe
[VERSION]
Set_Version_Info=1
Company_Name=Framakey
File_Description=Lanceur Asuite
File_Version=0.7.0.11
Inc_File_Version=1
Internal_Name=FramaSuite
Legal_Copyright=(C) 2005-2011 Framakey
Original_Filename=FramaSuite
Product_Version=2.0.0.10
Inc_Product_Version=1
[ICONS]
Icon_1=%In_Dir%\FramASuite.ico
Icon_2=0
Icon_3=0
Icon_4=0
Icon_5=0
Icon_6=0
Icon_7=0

* * * Compile_AHK SETTINGS END * * *
*/

; ----------------------------------------------------
; FramaSuite 0.7.0.3
; ----------------------------------------------------
; Par fat115
; Utilisant comme base de travail les scripts AutoIt de pyg
; License : GPL
; Ce script permet de créer le lanceur d'ASuite.
; Il vérifie au lancement si la démo doit être lancée.
; Il est également capable d'activer la démo en passant
; -demo en paramètre.
; Il s'occupe également de MaJ les chemins.
; Compiler: AutoHotkey (http://www.autohotkey.com/).
; $id=FramaSuite.ahk $date=2011-03-08
; ----------------------------------------------------
;Copyright (C) 2005-2011 Framakey

;Website: http://www.framakey.org

;This software is OSI Certified Open Source Software.
;OSI Certified is a certification mark of the Open Source Initiative.

;This program is free software; you can redistribute it and/or
;modify it under the terms of the GNU General Public License
;as published by the Free Software Foundation; either version 2
;of the License, or (at your option) any later version.

;This program is distributed in the hope that it will be useful,
;but WITHOUT ANY WARRANTY; without even the implied warranty of
;MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.	See the
;GNU General Public License for more details.

;You should have received a copy of the GNU General Public License
;along with this program; if not, write to the Free Software
;Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA	02110-1301, USA.
; ----------------------------------------------------

; Général
SetWorkingDir, %A_ScriptDir%
#Include %A_ScriptDir%\AhkIncludes
#Include CalcRelPath.ahk
#SingleInstance IGNORE
#NoTrayIcon
; Initialisation
ThisAppName := A_ScriptName
StringTrimRight, ThisAppName, ThisAppName, 4

; Vérification des paramètres
Gosub VerifParam

; on parse les arguments pour voir si la demo doit être activée
If ViewDemo
	IniWrite, 1, Framakey2.ini, Tutorials, FramaSuiteDemo

IniRead, Activated, Framakey2.ini, Tutorials, FramaSuiteDemo
IniRead, ASuitePath, Framakey2.ini, Main, RelASuiteDir
AsuiteXML := ASuitePath . "\Asuite.xml"

; Vérification des chemins
Gosub VerifFoldersFiles

; On ouvre le fichier de conf Asuite et on récupère le nom personnalisé de la fenêtre
AsuiteTempXML := ASuitePath . "\AsuiteTemp.xml"
; Petite précaution au cas où ASuite soit déjà lancé et que l'utilisateur ait changé le titre
; de la fenêtre : on prend prioritairement les infos dans le fichier de conf temporaire.
IfExist, %AsuiteTempXML%
	{
	Process, Exist, asuite.exe
	; Si le processus existe on lit le fichier temporaire sinon on écrase le fichier principal avec le temporaire laissé par une sortie brutale)
	If ErrorLevel
		FileRead, fileContent, %AsuiteTempXML%
	Else
		{
		FileMove, %AsuiteTempXML%, %AsuiteXML%, 1
		FileRead, fileContent, %AsuiteXML%
		}
	}
Else
	FileRead, fileContent, %AsuiteXML%
FoundPos := RegExMatch(fileContent, "<CustomTitleString>(.*)</CustomTitleString>", CustomTitleXML)
AsuiteWindowName := CustomTitleXML1

; Tant qu'on a le fichier de conf en mémoire, on vérifie qu'il n'existe pas de chemin relatif au lecteur
IfInString, fileContent, $Drive
	Gosub UpdatePath

; Lancement conditionnel du menu asuite (pour éviter une perte du focus sur la MsgBox de la démo)
; Impossible d'utiliser WinWait car la fenêtre principale peut ne pas être affichée
Process, Exist, asuite.exe
If (ErrorLevel = 0)
	Run, %ASuitePath%\asuite.exe

; Boucle de détection de la fenêtre principale d'ASuite (qui peut être cachée !)
DetectHiddenWindows, On
Loop
	{
	IfWinExist, %AsuiteWindowName%
		Break
	Sleep, 500
	}
DetectHiddenWindows, Off


CoordMode, Mouse, Screen

If (Activated = 1 OR Activated = "" )
	Gosub Demonstration

Exit


;===============================================================================
; Subroutine Name:	VerifParam
; Description:		Vérification de la validité des paramètres
;===============================================================================
VerifParam:
{
	Loop, %0%
		{
		Param%A_Index% := %A_Index%
		; par sécurité, on passe tout en minuscule
		StringLower, Param%A_Index%, Param%A_Index%
		If Param%A_Index% not in -help,/?,-demo
			{
			MessageIcon := 16
			UnknownParam := "Paramètre inconnu : " . Param%A_Index%
			Gosub MessageUsage
			}
		If Param%A_Index% in -help,/?
			{
			MessageIcon := 64
			UnknownParam := "Vous avez crié au secours. Voilà un peu d'aide :"
			Gosub MessageUsage
			}
		; On définit une variable pour chacun des paramètres possibles
		If (Param%A_Index% = "-demo")
			ViewDemo := 1
		}
Return
}

;===============================================================================
; Subroutine Name:	VerifFoldersFiles
; Description:		Vérification de la validité des paramètres
;===============================================================================
VerifFoldersFiles:
{
	IfNotExist, %ASuiteXML%
		{
		TempPath := ""
		FileSelectFile, TempPath, 1, %A_ScriptDir%, Impossible de trouver le fichier de configuration d'ASuite.`nVeuillez le sélectionner :, Configuration ASuite (ASuite.xml)
		If (TempPath = "")
			{
			MsgBox, 16, Erreur., Le fichier est introuvable.`n%ThisAppName% ne peut continuer., 5
			ExitApp
			}
		; Calcul du chemin relatif
		ASuiteXML := CalcRelPath(A_ScriptDir, TempPath)
		SplitPath, ASuiteXML, , ASuitePath
		; On sauve les valeurs dans l'ini
		IniWrite, %ASuitePath%, Framakey2.ini, Main, RelASuiteDir
		}
Return
}

;===============================================================================
; Subroutine Name:	MessageUsage
; Description:		Pop-up expliquant succinctement les options possibles
;===============================================================================
MessageUsage:
{
	HelpMessage := UnknownParam . "`n`n"
	HelpMessage .= ThisAppName . " gère le lancement de ASuite pour Framakey`n\n"
	HelpMessage .= "Options supportées :`n"
	HelpMessage .= "-help : Affiche cet écran d'aide.`n"
	HelpMessage .= "/? : Affiche cet écran d'aide aussi.`n"
	HelpMessage .= "-demo : Lance une démonstration succincte.`n"
	MsgBox, %MessageIcon%, Options supportées, %HelpMessage%
	ExitApp
Return
}

;===============================================================================
; Subroutine Name:	Demonstration
; Description:		Lance la démonstration expliquant une fonction peu visible
; 					d'Asuite : Accessibilité du menu par le bord supérieur de l'écran
;===============================================================================
Demonstration:
{
	MsgBox, 0, Démonstration, La petite animation qui suit va vous montrer comment utiliser la FramaSuite.`nMerci de ne pas bouger votre souris après avoir appuyé sur OK.
	ToolTip, Positionnez votre souris en haut de l'écran
	Sleep, 1000
	MouseGetPos, xpos, ypos
	MouseMove, %xpos%, 0
	ToolTip, Faites un clic gauche pour faire apparaître le menu
	Sleep, 2000
	MouseClick, Left
	Sleep, 2000
	ToolTip, Choisissez votre application
	MouseMove, 20, 200, 80, R
	Sleep, 2000
	MsgBox, 4, Revoir ?, Fin de la démonstration.`nRevoir cette animation la prochaine fois ?, 8
	IfMsgBox, No
		IniWrite, 0, Framakey2.ini, Tutorials, FramaSuiteDemo
	IfMsgBox, YES
		IniWrite, 1, Framakey2.ini, Tutorials, FramaSuiteDemo
Return
}


;===============================================================================
; Subroutine Name:	UpdatePath
; Description:		Mise à jour des chemins pointant sur le lecteur
; 					Réécriture en chemin relatif au dossier d'ASuite
;===============================================================================
UpdatePath:
{
	; Si Asuite est lancé on ne met pas à jour, c'est écrasé à la sortie
	Process, Exist, asuite.exe
	If ErrorLevel
		Return
	SplitPath, A_ScriptDir, , , , , BaseDrive
	; On boucle jusqu'à avoir remplacé toutes les occurences de $Drive
	Loop
		{
		FoundPos := RegExMatch(fileContent, "\$Drive(.*)<", RefDrive)
		If (RefDrive1 = "")
			Break
		OldPath := BaseDrive . RefDrive1
		; on transforme en relatif par rapport à AsuitePath
		NewPath := CalcRelPath(ASuitePath, OldPath, A_ScriptDir)
		NewPath := "$Asuite\" . NewPath
		; Cas particulier des sous dossiers de ASuite
		StringReplace, NewPath, NewPath, $Asuite\.\
		; on remplace dans fileContent
		StringReplace, fileContent, fileContent, $Drive%RefDrive1%, %NewPath%
		}
	FileMove, %AsuiteXML%, %AsuiteXML%.bak, 1
	FileAppend, %fileContent%, %AsuiteXML%
Return
}
