#!/usr/bin/env python
# -*- coding: utf-8 -*-

"""
***************************************************************************
    widgets_tree.py
    ---------------------
    Date                 : May 2011
    Copyright            : (C) 2011 by Martin Dobias
    Email                : wonder dot sk at gmail dot com
***************************************************************************
*                                                                         *
*   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.                                   *
*                                                                         *
***************************************************************************
"""

__author__ = 'Martin Dobias'
__date__ = 'May 2011'
__copyright__ = '(C) 2011, Martin Dobias'
# This will get replaced with a git SHA1 when you do a git archive
__revision__ = '$Format:%H$'

"""
Reads .ui files from ../src/ui/ directory and write to stdout an XML describing
widgets tree.

Python bindings must be compiled and in PYTHONPATH

QGIS libraries must be in LD_LIBRARY_PATH

Output should go to ../resources/customization.xml

"""

import sys
import os, glob, imp
from PyQt4.QtCore import *
from PyQt4.QtGui import *
from PyQt4.uic import loadUi, compileUi
from PyQt4.QtXml import *

# qwt_plot is missing somehow but it may depend on installed packages
from PyQt4 import Qwt5 as qwt_plot
sys.modules['qwt_plot'] = qwt_plot

from qgis.gui import QgsAttributeTableView

# loadUi is looking for custom widget in module which is lowercase version of
# the class, which do not exist (AFAIK) -> preload them, problems anyway:
# missing in gui: QgsColorRampComboBox, QgsRendererRulesTreeWidget,
# QgsRendererRulesTreeWidget, QgsAttributeTableView
# and QgsProjectionSelector cannot open db file
from qgis import gui
for m in ['qgscolorbutton', 'qgscolorrampcombobox', 'qgsprojectionselector', 'qgslabelpreview', 'qgsrulebasedrendererv2widget', 'qgscollapsiblegroupbox', 'qgsblendmodecombobox', 'qgsexpressionbuilderwidget', 'qgsrasterformatsaveoptionswidget', 'qgsrasterpyramidsoptionswidget', 'qgsscalecombobox', 'qgsfilterlineedit', 'qgsdualview' ]:
	sys.modules[m] = gui

class UiInspector:
	def __init__(self):
		self.ui_dir = os.path.abspath ( os.path.join( os.path.dirname(__file__), '../src/ui/*.ui' ) )
		self.printMsg ( "Loading UI files " + self.ui_dir )
		# list of widget classes we want to follow
		self.follow = [
			QWidget, QDialog,
			QCheckBox, QComboBox, QDial, QPushButton, QLabel, QLCDNumber, QLineEdit, QRadioButton, QScrollBar, QSlider, QSpinBox, QTextEdit,
			QDateEdit, QTimeEdit, QDateTimeEdit, QListView, QProgressBar, QTableView, QTabWidget, QTextBrowser, QDialogButtonBox,
			QScrollArea, QGroupBox, QStackedWidget,
		]

	def printMsg ( self, msg ):
		sys.stderr.write( msg + "\n" )

	def widgetXml(self, element, widget, level = 0, label = None ):
		#print tostring ( element )
		#self.printMsg ( "class: " + str( type ( widget ) ) )
		#self.printMsg ( "objectName: " + widget.objectName() )
		#self.printMsg ( "windowTitle: " + widget.windowTitle() )

		if not widget.objectName():
			return

		lab = label
		if hasattr( widget, 'text' ):
			lab = widget.text()
		if widget.windowTitle():
			label = widget.windowTitle()
		if not lab:
			lab = ''

		subElement = self.doc.createElement('widget')
		subElement.setAttribute('class', widget.__class__.__name__ )
		subElement.setAttribute('objectName', widget.objectName() )
		subElement.setAttribute('label', lab )
		element.appendChild( subElement )

		#print str ( widget.children () )
		# tab widget label is stored in QTabWidget->QTabBarPrivate->tabList->QTab ..
		if type(widget) in [ QTabWidget ]:
			children = list ( { 'widget': widget.widget(i), 'label':  widget.tabText(i) } for i in range ( 0, widget.count() ) )
		else:
			children = list ( { 'widget': c, 'label': None } for c in widget.children () )
		for child in children:
			w  = child['widget']
			if w.isWidgetType() and ( type(w) in self.follow ):
				self.widgetXml( subElement, w, level+1, child['label'] )

	def xml(self) :
		self.doc = QDomDocument()
		element = self.doc.createElement( "qgiswidgets" )
		self.doc.appendChild( element )
		for p in glob.glob( self.ui_dir ):
			self.printMsg ( "Loading " + p )
			# qgsrasterlayerpropertiesbase.ui is giving: No module named qwt_plot
			try:
				widget = loadUi ( p )
				#print dir ( ui )
				self.widgetXml( element, widget )
			except Exception, e:
			#except IOError, e:
				self.printMsg( str(e) )
				
		return self.doc.toString( 2 )


if __name__ == '__main__':
	app = QApplication(sys.argv) # required by loadUi
	inspector = UiInspector()
	xml = inspector.xml()
	sys.stdout.write( xml )
	sys.stdout.flush()

	del app
	sys.exit(0)