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


from PyQt4 import QtCore, QtGui
import sys, os
import sqlite3
import goslate
import looker

try:
    _fromUtf8 = QtCore.QString.fromUtf8
except AttributeError:
    def _fromUtf8(s):
        return s

try:
    _encoding = QtGui.QApplication.UnicodeUTF8
    def _translate(context, text, disambig):
        return QtGui.QApplication.translate(context, text, disambig, _encoding)
except AttributeError:
    def _translate(context, text, disambig):
        return QtGui.QApplication.translate(context, text, disambig)

class Ui_MainWindow(object):
    def setupUi(self, MainWindow):
        MainWindow.setObjectName(_fromUtf8("MainWindow"))
        MainWindow.resize(784, 474)
        self.centralwidget = QtGui.QWidget(MainWindow)
        self.centralwidget.setObjectName(_fromUtf8("centralwidget"))
        self.gridLayout_2 = QtGui.QGridLayout(self.centralwidget)
        self.gridLayout_2.setObjectName(_fromUtf8("gridLayout_2"))
        self.gridLayout = QtGui.QGridLayout()
        self.gridLayout.setObjectName(_fromUtf8("gridLayout"))
        self.wordsView = QtGui.QListView(self.centralwidget)
        sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Ignored, QtGui.QSizePolicy.Expanding)
        sizePolicy.setHorizontalStretch(0)
        sizePolicy.setVerticalStretch(0)
        sizePolicy.setHeightForWidth(self.wordsView.sizePolicy().hasHeightForWidth())
        self.wordsView.setSizePolicy(sizePolicy)
        self.wordsView.setObjectName(_fromUtf8("wordsView"))
        self.gridLayout.addWidget(self.wordsView, 1, 0, 2, 1)
        self.entry = QtGui.QLineEdit(self.centralwidget)
        sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Maximum, QtGui.QSizePolicy.Maximum)
        sizePolicy.setHorizontalStretch(0)
        sizePolicy.setVerticalStretch(0)
        sizePolicy.setHeightForWidth(self.entry.sizePolicy().hasHeightForWidth())
        self.entry.setSizePolicy(sizePolicy)
        font = QtGui.QFont()
        font.setFamily(_fromUtf8("KacstBook"))
        font.setPointSize(14)
        font.setBold(True)
        font.setItalic(True)
        font.setWeight(75)
        self.entry.setFont(font)
        self.entry.setObjectName(_fromUtf8("entry"))
        self.gridLayout.addWidget(self.entry, 0, 0, 1, 1)
        self.result = QtGui.QTextBrowser(self.centralwidget)
        font = QtGui.QFont()
        font.setFamily(_fromUtf8("KacstBook"))
        font.setPointSize(12)
        font.setBold(True)
        font.setItalic(True)
        font.setWeight(75)
        self.result.setFont(font)
        self.result.setObjectName(_fromUtf8("result"))
        self.gridLayout.addWidget(self.result, 0, 1, 3, 1)
        self.gridLayout_2.addLayout(self.gridLayout, 0, 0, 1, 1)
        MainWindow.setCentralWidget(self.centralwidget)
        self.menubar = QtGui.QMenuBar(MainWindow)
        self.menubar.setGeometry(QtCore.QRect(0, 0, 784, 31))
        self.menubar.setObjectName(_fromUtf8("menubar"))
        self.menuFile = QtGui.QMenu(self.menubar)
        self.menuFile.setObjectName(_fromUtf8("menuFile"))
        self.menuEdit = QtGui.QMenu(self.menubar)
        self.menuEdit.setObjectName(_fromUtf8("menuEdit"))
        self.menuHelp = QtGui.QMenu(self.menubar)
        self.menuHelp.setObjectName(_fromUtf8("menuHelp"))
        MainWindow.setMenuBar(self.menubar)
        self.statusbar = QtGui.QStatusBar(MainWindow)
        self.statusbar.setObjectName(_fromUtf8("statusbar"))
        MainWindow.setStatusBar(self.statusbar)
        self.toolBar = QtGui.QToolBar(MainWindow)
        self.toolBar.setMovable(False)
        self.toolBar.setObjectName(_fromUtf8("toolBar"))
        MainWindow.addToolBar(QtCore.Qt.TopToolBarArea, self.toolBar)
        self.actionNew_window = QtGui.QAction(MainWindow)
        self.actionNew_window.setObjectName(_fromUtf8("actionNew_window"))
        self.actionQuit = QtGui.QAction(MainWindow)
        self.actionQuit.setObjectName(_fromUtf8("actionQuit"))
        self.actionCopy = QtGui.QAction(MainWindow)
        self.actionCopy.setObjectName(_fromUtf8("actionCopy"))
        self.actionPaste = QtGui.QAction(MainWindow)
        self.actionPaste.setObjectName(_fromUtf8("actionPaste"))
        self.actionCut = QtGui.QAction(MainWindow)
        self.actionCut.setObjectName(_fromUtf8("actionCut"))
        self.actionAbout_dictionary = QtGui.QAction(MainWindow)
        self.actionAbout_dictionary.setObjectName(_fromUtf8("actionAbout_dictionary"))
        self.menuFile.addAction(self.actionNew_window)
        self.menuFile.addSeparator()
        self.menuFile.addAction(self.actionQuit)
        self.menuEdit.addAction(self.actionCut)
        self.menuEdit.addAction(self.actionCopy)
        self.menuEdit.addAction(self.actionPaste)
        self.menuHelp.addAction(self.actionAbout_dictionary)
        self.menubar.addAction(self.menuFile.menuAction())
        self.menubar.addAction(self.menuEdit.menuAction())
        self.menubar.addAction(self.menuHelp.menuAction())

        self.online = QtGui.QRadioButton(MainWindow)
        self.online.setObjectName(_fromUtf8("online"))
        self.online.click()
        self.offline = QtGui.QRadioButton(MainWindow)
        self.offline.setObjectName(_fromUtf8("offline"))
        self.frome = QtGui.QComboBox(MainWindow)
        self.frome.setObjectName(_fromUtf8("frome"))
        self.label = QtGui.QLabel(MainWindow)
        self.label.setObjectName("label")
        self.to = QtGui.QComboBox(MainWindow)
        self.to.setObjectName("to")
        self.dicts = QtGui.QComboBox(MainWindow)
        self.dicts.setObjectName(_fromUtf8("dicts"))
        self.dicts.setEnabled(False)
        self.toolBar.addWidget(self.online)
        self.toolBar.addWidget(self.frome)
        self.toolBar.addWidget(self.label)
        self.toolBar.addWidget(self.to)
        self.toolBar.addSeparator()
        self.toolBar.addWidget(self.offline)
        self.toolBar.addWidget(self.dicts)

        languages = ['Afrikaans', 'Albanian', 'Arabic', 'Armenian', 'Azerbaijani', 'Basque', 'Belarusian', 'Bengali', 'Bosnian', 'Bulgarian',\
                     'Catalan', 'Cebuano', 'Chichewa', 'Chinese', 'Croatian', 'Czech', 'Danish', 'Dutch', 'English', 'Esperanto', 'Estonian',\
                     'Filipino', 'Finnish', 'French', 'Galician', 'Georgian', 'German', 'Greek', 'Gujarati', 'Haitian Creole', 'Hausa',\
                     'Hebrew', 'Hindi', 'Hmong', 'Hungarian', 'Icelandic', 'Igbo', 'Indonesian', 'Irish', 'Italian', 'Japanese', 'Javanese',\
                     'Kannada', 'Kazakh', 'Khmer', 'Korean', 'Lao', 'Latin', 'Latvian', 'Lithuanian', 'Macedonian', 'Malagasy', 'Malay', 'Malayalam',\
                     'Maltese', 'Maori', 'Marathi', 'Mongolian', 'Myanmar (Burmese)', 'Nepali', 'Norwegian', 'Persian', 'Polish', 'Portuguese',\
                     'Punjabi', 'Romanian', 'Russian', 'Serbian', 'Sesotho', 'Sinhala', 'Slovak', 'Slovenian', 'Somali', 'Spanish', 'Sundanese',\
                     'Swahili', 'Swedish', 'Tajik', 'Tamil', 'Telugu', 'Thai', 'Turkish', 'Ukrainian', 'Urdu', 'Uzbek', 'Vietnamese', 'Welsh', 'Yiddish', 'Yoruba', 'Zulu']
        self.frome.addItems(languages)
        self.to.addItems(languages)

        self.retranslateUi(MainWindow)
        QtCore.QMetaObject.connectSlotsByName(MainWindow)

    def retranslateUi(self, MainWindow):
        MainWindow.setWindowTitle(_translate("MainWindow", "MainWindow", None))
        self.menuFile.setTitle(_translate("MainWindow", "File", None))
        self.menuEdit.setTitle(_translate("MainWindow", "Edit", None))
        self.menuHelp.setTitle(_translate("MainWindow", "Help", None))
        self.toolBar.setWindowTitle(_translate("MainWindow", "toolBar", None))
        self.actionNew_window.setText(_translate("MainWindow", "New window", None))
        self.actionNew_window.setStatusTip(_translate("MainWindow", "Create New Window", None))
        self.actionNew_window.setShortcut(_translate("MainWindow", "Ctrl+N", None))
        self.actionQuit.setText(_translate("MainWindow", "Quit", None))
        self.actionQuit.setStatusTip(_translate("MainWindow", "Quit", None))
        self.actionQuit.setShortcut(_translate("MainWindow", "Ctrl+Q", None))
        self.actionCopy.setText(_translate("MainWindow", "Copy", None))
        self.actionCopy.setStatusTip(_translate("MainWindow", "Cpoy the selected text", None))
        self.actionCopy.setShortcut(_translate("MainWindow", "Ctrl+C", None))
        self.actionPaste.setText(_translate("MainWindow", "Paste", None))
        self.actionPaste.setStatusTip(_translate("MainWindow", "Paste the Clipboard\'s contents", None))
        self.actionPaste.setShortcut(_translate("MainWindow", "Ctrl+V", None))
        self.actionCut.setText(_translate("MainWindow", "Cut", None))
        self.actionCut.setStatusTip(_translate("MainWindow", "Cut the selected text", None))
        self.actionCut.setShortcut(_translate("MainWindow", "Ctrl+X", None))
        self.actionAbout_dictionary.setText(_translate("MainWindow", "About dictionary", None))

        self.online.setText(_translate("MainWindow", "Online(Google)", None))
        self.offline.setText(_translate("MainWindow", "offline", None))
        self.label.setText(_translate("MainWindow", "  To  ", None))

class main(QtGui.QMainWindow):
    def __init__(self, parent=None):
        QtGui.QMainWindow.__init__(self, parent)
        self.ui = Ui_MainWindow()
        self.ui.setupUi(self)
        self.model = QtGui.QStringListModel()
        self.dict = os.path.join('dictdb', str(self.ui.dicts.currentText()))
        self.language = {'Afrikaans':'af', 'Albanian':'sq', 'Arabic':'ar', 'Armenian':'hy', 'Azerbaijani':'az', 'Basque':'eu', 'Belarusian':'be', 'Bengali':'bn', 'Bosnian':'bs', 'Bulgarian':'bg',\
                     'Catalan':'ca', 'Cebuano':'ceb', 'Chichewa':'ny', 'Chinese':'zh-CN', 'Croatian':'hr', 'Czech':'cs', 'Danish':'da', 'Dutch':'nl', 'English':'en', 'Esperanto':'eo', 'Estonian':'et',\
                     'Filipino':'tl', 'Finnish':'fi', 'French':'fr', 'Galician':'gl', 'Georgian':'ka', 'German':'de', 'Greek':'el', 'Gujarati':'gu', 'Haitian Creole':'ht', 'Hausa':'ha',\
                     'Hebrew':'iw', 'Hindi':'hi', 'Hmong':'hmn', 'Hungarian':'hu', 'Icelandic':'is', 'Igbo':'ig', 'Indonesian':'id', 'Irish':'ga', 'Italian':'it', 'Japanese':'ja', 'Javanese':'jw',\
                     'Kannada':'kn', 'Kazakh':'kk', 'Khmer':'km', 'Korean':'ko', 'Lao':'lo', 'Latin':'la', 'Latvian':'lv', 'Lithuanian':'lt', 'Macedonian':'mk', 'Malagasy':'mg', 'Malay':'ms', 'Malayalam':'ml',\
                     'Maltese':'mt', 'Maori':'mi', 'Marathi':'mr', 'Mongolian':'mn', 'Myanmar (Burmese)':'my', 'Nepali':'ne', 'Norwegian':'no', 'Persian':'fa', 'Polish':'pl', 'Portuguese':'pt',\
                     'Punjabi':'pa', 'Romanian':'ro', 'Russian':'ru', 'Serbian':'sr', 'Sesotho':'st', 'Sinhala':'si', 'Slovak':'sk', 'Slovenian':'sl', 'Somali':'so', 'Spanish':'es', 'Sundanese':'su',\
                     'Swahili':'sw', 'Swedish':'sv', 'Tajik':'tg', 'Tamil':'ta', 'Telugu':'te', 'Thai':'th', 'Turkish':'tr', 'Ukrainian':'uk', 'Urdu':'ur', 'Uzbek':'uz', 'Vietnamese':'vi', 'Welsh':'cy', 'Yiddish':'yi', 'Yoruba':'yo', 'Zulu':'zu'}

        QtCore.QObject.connect(self.ui.actionNew_window, QtCore.SIGNAL('triggered()'), self.new_window)
        QtCore.QObject.connect(self.ui.actionQuit, QtCore.SIGNAL('triggered()'), app, QtCore.SLOT('quit()'))
        QtCore.QObject.connect(self.ui.entry, QtCore.SIGNAL('returnPressed()'), self.KeyPressEvent)
        QtCore.QObject.connect(self.ui.offline, QtCore.SIGNAL('clicked()'), self.en_dicts)
        QtCore.QObject.connect(self.ui.online, QtCore.SIGNAL('clicked()'), self.dis_dicts)
        QtCore.QObject.connect(self.ui.actionCut, QtCore.SIGNAL('triggered()'), self.ui.entry.cut)
        QtCore.QObject.connect(self.ui.actionPaste, QtCore.SIGNAL('triggered()'), self.ui.entry.paste)
        QtCore.QObject.connect(self.ui.actionCopy, QtCore.SIGNAL('triggered()'), self.ui.result.copy)
        QtCore.QObject.connect(self.ui.actionCopy, QtCore.SIGNAL('triggered()'), self.ui.entry.copy)
        QtCore.QObject.connect(self.ui.entry, QtCore.SIGNAL('textChanged(QString)'), self.text_changed)
        QtCore.QObject.connect(self.ui.dicts, QtCore.SIGNAL('currentIndexChanged(QString)'), self.handleChanged)
        QtCore.QObject.connect(self.ui.wordsView, QtCore.SIGNAL('clicked(QModelIndex)'), self.venue_selected)

    def venue_selected(self, selected_index):
    	self.translate_offline(selected_index.data().toString())

    def handleChanged(self):
    	self.dict = os.path.join('dictdb', str(self.ui.dicts.currentText()))

    def text_changed(self):
    	if self.ui.offline.isChecked():
	    	self.test()	

    def showEvent(self, show_event):
    	self.add_dict()

    def KeyPressEvent(self):
        if self.ui.online.isChecked():
            self.translate_online()
        else:
			self.test()

    def en_dicts(self):
        self.ui.dicts.setEnabled(True)
        self.ui.frome.setEnabled(False)
        self.ui.to.setEnabled(False)

    def dis_dicts(self):
        self.ui.dicts.setEnabled(False)
        self.ui.frome.setEnabled(True)
        self.ui.to.setEnabled(True)
        self.model.setStringList([])
    	self.ui.wordsView.setModel(self.model)
    	self.ui.result.clear()

    def new_window(self):
        nw = main(self)
        nw.show()

    def add_dict(self):
    	self.ui.dicts.addItem("Select Dictionary")
        dicts = os.listdir('dictdb')
        self.ui.dicts.addItems(dicts)

    def lang(self):
    	ch = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ'
    	text = unicode(self.ui.entry.text()).strip()
    	if text[0] in ch:
    		lang = {'lang':'en', 'index':1, 'view':0}
    	else :
    		lang = {'lang':'ar', 'index':0, 'view':1}
    	return lang

    def test(self):
    	if self.ui.entry.text() == '':
    		self.model.setStringList([])
    		self.ui.wordsView.setModel(self.model)
    		self.ui.result.clear()
    	else :
	    	wl = looker.WordsListLooker(self.ui.entry.text(), self.dict)
    		words_list = []
    		for row in wl.lookup():
    			words_list.append(row[self.lang()['view']])
	    	self.model.setStringList(words_list)
    		self.ui.wordsView.setModel(self.model)
    		first_item_index = self.model.index(0, 0, QtCore.QModelIndex())
    		self.ui.wordsView.setCurrentIndex(first_item_index)
    		self.translate_offline(first_item_index.data().toString())

    def translate_offline(self, word):
        self.ui.result.clear()
        sql = sqlite3.connect(self.dict)
        con = sql.cursor()
        con.execute("select * from wordlist where %s = '%s'"%(self.lang()['lang'], word))
        words = con.fetchall()
        for w in words:
            self.ui.result.append(w[self.lang()['index']])
        con.close()
        sql.close()

    def translate_online(self):
    	try :
	        text = unicode(self.ui.entry.text()).strip()
	        frome = self.language[str(self.ui.frome.currentText())]
	        to = self.language[str(self.ui.to.currentText())]
	        gs = goslate.Goslate()
	        if gs.detect(text) == frome :
	        	t = gs.translate(text, to, frome)
	        	self.ui.result.setText(t)
	        else :
	        	self.ui.result.setText('Erorr : please select languages')
        except Exception, e:
        	pass

if __name__ == '__main__' :
    app = QtGui.QApplication(sys.argv)
    myapp = main()
    myapp.show()
    sys.exit(app.exec_())
