#!/usr/bin/python2

# IceMergePrefs 0.5
# (c) Vadim A. Khohlov

#(c) 2003 by Vadim A. Khohlov (aka XBA) (xvadim@teko.kherson.ua)
#This tool allows you to merge global and local 'preferences'
#files (for example, after apgrade of the IceWM).
#Usage:
#	icemergeprefs.py [global 'preferences' file]"


import sys, os
from types import *
from qt import *

globalPrefFile = "/usr/local/share/icewm/preferences"

class iceMergePrefs(QWidget):
	def __init__(self,parent = None,name = None):
		QWidget.__init__(self,parent,name)
		
		if name == None:
			self.setName("iceMergePrefs")

		self.setCaption(self.trUtf8("IceMergePrefs"))

		topLayout = QVBoxLayout(self, 0, 6, "topLayout")

		layout = QHBox(self)

		self.lbGlobalPrefs = QLabel(self.trUtf8(" &Global Prefs. File: "), layout,
			"lbGlobalPrefs")
		self.edGlobalPrefs = QLineEdit(layout, "edGlobalPrefs")
		self.lbGlobalPrefs.setBuddy(self.edGlobalPrefs)
		self.pbGlobalBrowse = QPushButton(self.trUtf8("&Browse..."), layout)

		topLayout.addWidget(layout)
		
		layout = QHBox(self)

		self.lbLocalPrefs = QLabel(self.trUtf8(" &Local Prefs. File: "), layout,
			"lbLocalPrefs")
		self.edLocalPrefs = QLineEdit(layout, "edLocalPrefs")
		self.lbLocalPrefs.setBuddy(self.edLocalPrefs)
		self.pbLocalBrowse = QPushButton(self.trUtf8("B&rowse..."), layout)

		topLayout.addWidget(layout)

		self.lbInform = QLabel(self.trUtf8(" Press \'Merge\' button "
			"for mergin preferences"), self, "lbInform")
		self.lbInform.setAlignment(Qt.AlignCenter)
		topLayout.addWidget(self.lbInform)

		self.prbProgress = QProgressBar(self, "progressBar");
		topLayout.addWidget(self.prbProgress)

		layout = QHBox(self)
		self.pbMerge = QPushButton(self.trUtf8("&Merge"), layout, "pbMerge")
		self.pbAbout = QPushButton(self.trUtf8("&About"), layout, "pbAbout")
		self.pbQuit = QPushButton(self.trUtf8("&Quit"), layout, "pbQuit")
		topLayout.addWidget(layout)

		if os.environ.has_key("ICEWM_CFGDIR") == 1:
				self.icewmLocalprefs = os.environ["ICEWM_CFGDIR"]
		else:
				self.icewmLocalPrefs = os.environ["HOME"] + "/.icewm"
		#else if os.environ.has_key("ICEWM_CFGDIR") == 1
		self.icewmLocalPrefs += "/preferences"

		self.edLocalPrefs.setText(self.icewmLocalPrefs)
		#self.edLocalPrefs.setMinimumSize(self.edLocalPrefs.sizeHint())
		if(len(sys.argv) > 1):
			self.edGlobalPrefs.setText(sys.argv[1])
		else:
			self.edGlobalPrefs.setText(globalPrefFile)
		#self.edGlobalPrefs.setMinimumSize(self.edGlobalPrefs.sizeHint())

		self.connect(self.pbQuit, SIGNAL("clicked()"), self.close)
		self.connect(self.pbMerge, SIGNAL("clicked()"), self.slotMerge)
		self.connect(self.pbGlobalBrowse, SIGNAL("clicked()"), self.slotGlobalBrowse)
		self.connect(self.pbLocalBrowse, SIGNAL("clicked()"), self.slotLocalBrowse)
		self.connect(self.pbAbout, SIGNAL("clicked()"), self.slotAbout)
	#def __init__(self,parent = None,name = None):

	def slotMerge(self):
		if(os.access(str(self.edGlobalPrefs.text()), os.R_OK) != 1):
			QMessageBox.critical(self, QString.null,
				self.trUtf8("Can't open global preferences!"),
				QMessageBox.Ok, QMessageBox.NoButton)
			return
		#if(os.stat(str(self.edGlobalPrefs.text()), os.R_OK) != 1 
		self.lbInform.setText(self.trUtf8("Reading old preferences"))
		self.lbInform.repaint()
		optDict = self.createOptDict(self.icewmLocalPrefs)
		
		self.lbInform.setText(self.trUtf8("Backuping old preferences"))
		self.lbInform.repaint()
		os.rename(self.icewmLocalPrefs, self.icewmLocalPrefs + ".bak")

		self.lbInform.setText(self.trUtf8("Writing new preferences"))
		self.lbInform.repaint()
		self.writeNewPrefs()

		self.lbInform.setText(self.trUtf8("Done"))
		self.lbInform.repaint()
	#def slotMerge(self)

	#Creates the dictionary of old prefernces
	def createOptDict(self, prefFilename):
		self.optDict = {}
		#reading old preferences
		oldPrefFile = open(prefFilename, "rb")
		#calc the size of file
		oldPrefFile.seek(0, 2)
		self.prbProgress.setTotalSteps(oldPrefFile.tell())
		oldPrefFile.seek(0, 0)
		strf = oldPrefFile.readline()
		self.prbProgress.setProgress(oldPrefFile.tell())
		while strf != "":
			#don't treat comments and empty lines
			if strf[0] != '#' and strf != '\n':
				eqInd = strf.find('=')
				if(eqInd != -1):
					self.optDict[strf[:eqInd].strip()] = strf[eqInd:]
				#if(eqInd != -1)
			#if str[0] != "#"
			strf = oldPrefFile.readline()
			self.prbProgress.setProgress(oldPrefFile.tell())
		#while str != ""
		oldPrefFile.close()
	#def createOptDict(prefFilename)

	#Writes new preferences
	def writeNewPrefs(self):
		locPrefFile = open(self.icewmLocalPrefs, "wb")
		glbPrefFile = open(str(self.edGlobalPrefs.text()), "rb")
		glbPrefFile.seek(0, 2)
		self.prbProgress.setTotalSteps(glbPrefFile.tell())
		glbPrefFile.seek(0, 0)
		strf = glbPrefFile.readline()
		self.prbProgress.setProgress(glbPrefFile.tell())
		while strf != "":
			eqInd = strf.find('=')
			#is this string with options?
			if(eqInd != -1):
				if(strf[0] == '#'):
					sopt = 1
				else:
					sopt = 0	
				optName = strf[sopt:eqInd].strip()
				if(self.optDict.has_key(optName)):
					locPrefFile.write(optName)
					locPrefFile.write(self.optDict[optName])
					del self.optDict[optName]
				#if(optDict.has_key(optName))
				else:
					locPrefFile.write(strf)
				#else
			#if(eqInd != -1)
			else:
				locPrefFile.write(strf)
				
			strf = glbPrefFile.readline()
			self.prbProgress.setProgress(glbPrefFile.tell())
		#while str != ""
		glbPrefFile.close()
		
		if(len(self.optDict)) > 0:
			#we have old options
			optLst = "This options:\n\n"
			for x in self.optDict:
				optLst += x + '\n'
			#for x in self.optDict
			optLst += "\nare absent in new \'preferences\' file.\n\n"\
				"May be they are obsolote.\n"\
				"Do you want to append them to your local options?"
			if(QMessageBox.warning(self, self.trUtf8("Attention !!"), optLst,
				QMessageBox.Yes, QMessageBox.No) == QMessageBox.Yes):
					locPrefFile.write("\n\n## This options are absent in new"
						"\'preferences\' file\n## May be they are obsolote\n\n");
					for x in self.optDict:
						locPrefFile.write(x)
						locPrefFile.write(self.optDict[x])
					#for x in self.optDict
				#QMessageBox.Yes, QMessageBox.No) == QMessageBox.Yes)
		#if(len(self.optDict) > 0
		
		locPrefFile.close()
	#def writeNewPrefs(self)

	def slotGlobalBrowse(self):
		fileName = QFileDialog.getOpenFileName(globalPrefFile,
			"preferences (preferences)", self, "getOpenFile",
			"Choose a preferences file")
		if( not fileName.isEmpty()):
			self.edGlobalPrefs.setText(fileName)
		#if(fileName != "")
	#def slotGlobalBrowse(self)

	def slotLocalBrowse(self):
		fileName = QFileDialog.getOpenFileName(self.icewmLocalPrefs,
			"preferences (preferences)", self, "getOpenFile",
			"Choose a preferences file")
		if( not fileName.isEmpty()):
			self.edLocalPrefs.setText(fileName)
		#if(fileName != "")
	#def slotLocalBrowse(self)

	def slotAbout(self):
		QMessageBox.information(self, self.trUtf8("About IceMergePrefs"),
			self.trUtf8("IceMergePrefs\nVersion 0.5\n"\
			"(c) 2003 by Vadim A. Khohlov (aka XBA) (xvadim@teko.kherson.ua)\n\n"\
			"This tool allows you to merge global and local \'preferences\' "\
			"files\n(for example, after apgrade of the IceWM).\n\n"\
			"Usage:\n\ticemergeprefs.py [global \'preferences\' file]"),
			QMessageBox.Ok, QMessageBox.NoButton)
	#def slotAbout(self)
	
#class iceMergePrefs(QWidget)

def main():
	app = QApplication(sys.argv)

	iceMergePrefsApp = iceMergePrefs()
	app.setMainWidget(iceMergePrefsApp)
	iceMergePrefsApp.show()
	app.exec_loop()
#def main()

if __name__ == "__main__":
	main()
#if __name__ == "__main__"
