#!/usr/bin/python
#
# We're using PySide, Nokia's official LGPL bindings.
# You can however easily use PyQt (Riverside Computing's GPL bindings) by commenting these and fixing the appropriate imports.
import sys
from PySide.QtCore import *
from PySide.QtGui import *

 
# In Qt, everything is a class.
# We can subclass stuff to do whatever we want - it seems a bit strange at first,
# but it keeps all related functionality in one place, which helps to keep you organised.
#
# We're subclassing 'QWidget' here. QWidget is the base class for all graphical elements in Qt.
# You can do all sorts of cool things like drawing your widget yourself, but we won't get into that.
#
# See also:
#   http://doc.trolltech.com/4.6/qwidget.html

####################
# Global variables #
####################
Rwx_CalcVersion = "0.0.1-0"
OctValue = "0000 ---------"

class MyMainWindow(QMainWindow):
	def __init__(self, parent=None):# first things first, we need to initialise the Qt parent, otherwise it won't work properly.
		#
		super(MyMainWindow, self).__init__(parent)
		self.setAttribute(Qt.WA_Maemo5StackedWindow)

		self.setWindowTitle(self.tr("rwx-calc"))

		self.form_widget = FormWidget(self)
		self.setCentralWidget(self.form_widget)

		self.setAttribute(Qt.WA_Maemo5AutoOrientation, True)
		###############
		# Create menu #
		###############
		aboutAction = QAction( '&About', self)
		helpAction = QAction( '&Help', self)

		########################
		# create menu from bar #
		########################
		menubar = self.menuBar()
		mainMenu = menubar.addMenu('&MainMenu')
		mainMenu.addAction(helpAction)
		mainMenu.addAction(aboutAction)

		##################
		# Define actions #
		##################
		aboutAction.triggered.connect(self.aboutPushed)
		helpAction.triggered.connect(self.helpPushed)

	def aboutPushed(self):
		d = QDialog(self)
		vbox = QVBoxLayout()
		verticalLayout = QVBoxLayout()
		d.setWindowTitle(self.tr("About rwx-calc"))
		verticalLayout.addWidget(QLabel("<center><img src=/opt/usr/share/icons/hicolor/64x64/apps/rwx-calc.png /></center>"),0)
		verticalLayout.addWidget(QLabel("<center><b><big>rwx-calc "+Rwx_CalcVersion+"</big></b></center>"),1)
		verticalLayout.addWidget(QLabel("<center>Created by Arno Dekker (ade)</center>"),2)
		vbox.addLayout (verticalLayout)
		d.setLayout(vbox)
		d.show()

	def helpPushed(self):
		a = AboutWindow(self)
		a.show()

class AboutWindow(QMainWindow):
	def __init__(self, parent):
		QMainWindow.__init__(self, parent)
		self.setWindowTitle("More info")
		self.setAttribute(Qt.WA_Maemo5StackedWindow)
		self.setAttribute(Qt.WA_DeleteOnClose)
		area = QScrollArea()
		lay = QHBoxLayout()
		lay.addWidget(area)
		self.wg = QWidget()
		area.setWidget(self.wg)
		self.setCentralWidget(area)
		self.wg.resize(478, 740)
		sizePolicy = QSizePolicy(QSizePolicy.Minimum, QSizePolicy.Expanding)
		sizePolicy.setHorizontalStretch(0)
		sizePolicy.setVerticalStretch(0)
		sizePolicy.setHeightForWidth(self.wg.sizePolicy().hasHeightForWidth())
		self.wg.setSizePolicy(sizePolicy)
		grid = QGridLayout(self.wg)
		infoTXT = "<font style='color: black'>" \
                "<b>Rwx-calc</b> helps you to calculate the file/directory permissions used in Unix like operating systems.<br>" \
				"<h3>More info on this subject:</h3>" \
				"<b><u>User:</u></b><br>" \
				"The user is the owner of the files. The user of a file or directory can be changed with the chown command.<br>" \
				"Read, write and execute privileges are individually set for the user with 0400, 0200 and 0100 respectively. " \
				"Combinations can be applied as necessary eg: 0700 is read, write and execute for the user.<p>" \
				"<b><u>Group:</u></b><br>" \
				"A group is the set of people that are able to interact with that file. " \
				"The group set on a file or directory can be changed with the chgrp command.<br>" \
				"Read, write and execute privileges are individually set for the group with 0040, 0020 and 0010 respectively. " \
				"Combinations can be applied as necessary eg: 0070 is read, write and execute for the group.<p>" \
				"<b><u>Other:</u></b><br>" \
				"Represents everyone who isn't an owner or a member of the group associated with that resource. " \
				"Other is often referred to as \"world\", \"everyone\" etc.<br>" \
				"Read, write and execute privileges are individually set for the other with 0004, 0002 and 0001 " \
				"respectively. Combinations can be applied as necessary eg: 0007 is read, write and execute for other.<p>" \
				"<h3>Read Write and Execute Permissions</h3>" \
				"<b><u>Read:</u></b><br>" \
				"Allows files to be read" \
				"Is denoted with \"r\" in the output of the ls command.<br>" \
				"<b><u>Write:</u></b><br>" \
				"Allows files to be written" \
				"Is denoted with \"w\" in the output of the ls command.<br>" \
				"<b><u>Execute:</u></b><br>" \
				"Execute permissions allow binary files to be executed but they also control whether a directory " \
				"is searchable. For example if a directory has permissions of 0600 you cannot use the cd command " \
				"to \"change directory\" into it, nor can you list it's contents.<br>" \
				"Execute permissions are denoted with an \"x\" in the output of ls.<p>" \
				"<h3>Special Modes</h3>" \
				"<b><u>setuid:</u></b><br>" \
				"Binary executables with the setuid bit (chmod u+s path) can be executed with the privileges of the " \
				"file's owner. Due to it's nature it should be used with care.<br>" \
				"In octal, the setuid bit is set with 4000 e.g: \"chmod 4755 path\".<br>" \
				"setuid has no effect if the user does not have execute permissions.<br>" \
				"setuid is represented with a lower-case \"s\" in the output of ls. " \
				"In cases where it has no effect it is represented with an upper-case \"S\".<br>" \
				"<b><u>setgid:</u></b><br>" \
				"Binary executables with the setgid bit (chmod g+s path) can be executed with the privileges of the file's group.<br>" \
				"A useful property is to set the setgid bit on a directory so that all files and directories newly created " \
				"within it inherit the group from that directory.<br>" \
				"In octal, the setgid bit is represented by 2000 e.g: \"chmod 2755 path\"." \
				"setgid has no effect if the group does not have execute permissions." \
				"setgid is represented with a lower-case \"s\" in the output of ls. In cases where it has no " \
				"effect it is represented with an upper-case \"S\".<br>" \
				"<b><u>Sticky bit:</u></b><br>" \
				"The sticky bit (chmod +t path) was introduced for use with executables as a way of telling " \
				"an operating system to keep the text segment of the program in swap space after the process had " \
				"terminated. This was a performance feature designed to make subsequent execution of the program faster.<br>" \
				"The sticky bit is more commonly used on directories where it allows the files or directories within to only " \
				"be moved or deleted by that object's owner, the directory owner, or the super-user.<br>" \
				"In octal, the sticky bit is set with 1000 e.g: \"chmod 1755 path\".<br>" \
				"The sticky bit has no effect if other does not have execute permissions.<br>" \
				"The sticky bit is represented with a lower-case \"t\" in the output of ls. " \
				"In cases where it has no effect it is represented with an upper-case \"T\"."

		termsInfo = QTextBrowser()
		termsInfo.setMinimumSize(QSize(330, 340))
		termsInfo.setHtml( infoTXT )
		font = QFont()
		font.setPointSize(16)
		termsInfo.setFont(font)
		grid.addWidget(termsInfo, 0, 0)
		self.wg.show()
		self.connect(QApplication.desktop(), SIGNAL("resized(int)"), self.orientationChanged)
		# set correct orientation at start
		self.orientationChanged()

	def orientationChanged(self):
		screenGeometry = QApplication.desktop().screenGeometry()
		if screenGeometry.width() < screenGeometry.height():
			# portrait
			self.wg.resize(478, 740)
		else:
			self.wg.resize(792, 420)


class FormWidget(QWidget):
	def __init__(self, parent):
		super(FormWidget, self).__init__(parent)
		# Now we start getting into building our interface. The first thing we need to learn about are layouts.
		# Layouts tell Qt where to put widgets, and how they fit with other widgets.
		# Unlike Gtk+, Qt layouts are *not* widgets - important difference to keep in mind.
		#
		# There are many types of layouts (from the complex, like QGridLayout) 
		# to the simple, like what we're using here.
		# See also:
		#   http://doc.trolltech.com/4.6/qlayout.html
		#   http://doc.trolltech.com/4.6/qvboxlayout.html
		self.WindowOpen = False
		# Layout
		self.grid = QGridLayout()
		self.setLayout(self.grid)
		# Button declarations
		self.octalButton = QPushButton()
		self.octalButton.setText(OctValue)
		self.userreadStatus = QPushButton()
		self.userreadStatus.setIcon(QIcon.fromTheme("general_close"))
		self.userreadStatus.setText("Read")
		self.userreadStatus.setStyleSheet("background: transparent; border: none;text-align: left;")
		self.userreadStatus.setCheckable(True)
		self.userwriteStatus = QPushButton()
		self.userwriteStatus.setIcon(QIcon.fromTheme("general_close"))
		self.userwriteStatus.setText("Write")
		self.userwriteStatus.setStyleSheet("background: transparent; border: none;text-align: left;")
		self.userwriteStatus.setCheckable(True)
		self.userexecuteStatus = QPushButton()
		self.userexecuteStatus.setIcon(QIcon.fromTheme("general_close"))
		self.userexecuteStatus.setText("Exec")
		self.userexecuteStatus.setStyleSheet("background: transparent; border: none;text-align: left;")
		self.userexecuteStatus.setCheckable(True)
		self.groupreadStatus = QPushButton()
		self.groupreadStatus.setIcon(QIcon.fromTheme("general_close"))
		self.groupreadStatus.setText("Read")
		self.groupreadStatus.setStyleSheet("background: transparent; border: none;text-align: left;")
		self.groupreadStatus.setCheckable(True)
		self.groupwriteStatus = QPushButton()
		self.groupwriteStatus.setIcon(QIcon.fromTheme("general_close"))
		self.groupwriteStatus.setText("Write")
		self.groupwriteStatus.setStyleSheet("background: transparent; border: none;text-align: left;")
		self.groupwriteStatus.setCheckable(True)
		self.groupexecuteStatus = QPushButton()
		self.groupexecuteStatus.setIcon(QIcon.fromTheme("general_close"))
		self.groupexecuteStatus.setText("Exec")
		self.groupexecuteStatus.setStyleSheet("background: transparent; border: none;text-align: left;")
		self.groupexecuteStatus.setCheckable(True)
		self.otherreadStatus = QPushButton()
		self.otherreadStatus.setIcon(QIcon.fromTheme("general_close"))
		self.otherreadStatus.setText("Read")
		self.otherreadStatus.setStyleSheet("background: transparent; border: none;text-align: left;")
		self.otherreadStatus.setCheckable(True)
		self.otherwriteStatus = QPushButton()
		self.otherwriteStatus.setIcon(QIcon.fromTheme("general_close"))
		self.otherwriteStatus.setText("Write")
		self.otherwriteStatus.setStyleSheet("background: transparent; border: none;text-align: left;")
		self.otherwriteStatus.setCheckable(True)
		self.otherexecuteStatus = QPushButton()
		self.otherexecuteStatus.setIcon(QIcon.fromTheme("general_close"))
		self.otherexecuteStatus.setText("Exec")
		self.otherexecuteStatus.setStyleSheet("background: transparent; border: none;text-align: left;")
		self.otherexecuteStatus.setCheckable(True)
		self.setuidStatus = QPushButton()
		self.setuidStatus.setIcon(QIcon.fromTheme("general_close"))
		self.setuidStatus.setText("setuid")
		self.setuidStatus.setStyleSheet("background: transparent; border: none;text-align: left;")
		self.setuidStatus.setCheckable(True)
		self.setgidStatus = QPushButton()
		self.setgidStatus.setIcon(QIcon.fromTheme("general_close"))
		self.setgidStatus.setText("setgid")
		self.setgidStatus.setStyleSheet("background: transparent; border: none;text-align: left;")
		self.setgidStatus.setCheckable(True)
		self.stickybitStatus = QPushButton()
		self.stickybitStatus.setIcon(QIcon.fromTheme("general_close"))
		self.stickybitStatus.setText("sticky")
		self.stickybitStatus.setStyleSheet("background: transparent; border: none;text-align: left;")
		self.stickybitStatus.setCheckable(True)
		self.Userlabel = QLabel("User")
		self.Userlabel.setStyleSheet("qproperty-alignment: 'AlignCenter|AlignCenter';font: bold;")
		self.Grouplabel = QLabel("Group")
		self.Grouplabel.setStyleSheet("qproperty-alignment: 'AlignCenter|AlignCenter';font: bold;")
		self.Otherlabel = QLabel("Other")
		self.Otherlabel.setStyleSheet("qproperty-alignment: 'AlignCenter|AlignCenter';font: bold;")
		self.Speciallabel = QLabel("Special")
		self.Speciallabel.setStyleSheet("qproperty-alignment: 'AlignCenter|AlignCenter';font: bold;")
		self.Octallabel = QLabel("Absolute (octal) and symbolic")
		self.Octallabel.setStyleSheet("qproperty-alignment: 'AlignCenter|AlignCenter';font: bold;")
		self.Iconlabel = QLabel("<center>Permissions calculator</center>")
		self.line1 = QFrame()
		self.line1.setLineWidth(3)
		self.line1.setMidLineWidth(3)
		self.line1.setFrameShape(QFrame.HLine)
		self.line1.setFrameShadow(QFrame.Sunken)
		self.line2 = QFrame()
		self.line2.setLineWidth(3)
		self.line2.setMidLineWidth(3)
		self.line2.setFrameShape(QFrame.HLine)
		self.line2.setFrameShadow(QFrame.Sunken)
		self.line3 = QFrame()
		self.line3.setLineWidth(3)
		self.line3.setMidLineWidth(3)
		self.line3.setFrameShape(QFrame.HLine)
		self.line3.setFrameShadow(QFrame.Sunken)
		self.line4 = QFrame()
		self.line4.setLineWidth(3)
		self.line4.setMidLineWidth(3)
		self.line4.setFrameShape(QFrame.HLine)
		self.line4.setFrameShadow(QFrame.Sunken)
		self.line5 = QFrame()
		self.line5.setLineWidth(3)
		self.line5.setMidLineWidth(3)
		self.line5.setFrameShape(QFrame.HLine)
		self.line5.setFrameShadow(QFrame.Sunken)
		# signals/slots
		self.connect(QApplication.desktop(), SIGNAL("resized(int)"), self.orientationChanged)
		self.connect(self.userreadStatus, SIGNAL("clicked()"),self.RWXButtonPressed)
		self.connect(self.userwriteStatus, SIGNAL("clicked()"),self.RWXButtonPressed)
		self.connect(self.userexecuteStatus, SIGNAL("clicked()"),self.RWXButtonPressed)
		self.connect(self.groupreadStatus, SIGNAL("clicked()"),self.RWXButtonPressed)
		self.connect(self.groupwriteStatus, SIGNAL("clicked()"),self.RWXButtonPressed)
		self.connect(self.groupexecuteStatus, SIGNAL("clicked()"),self.RWXButtonPressed)
		self.connect(self.otherreadStatus, SIGNAL("clicked()"),self.RWXButtonPressed)
		self.connect(self.otherwriteStatus, SIGNAL("clicked()"),self.RWXButtonPressed)
		self.connect(self.otherexecuteStatus, SIGNAL("clicked()"),self.RWXButtonPressed)
		self.connect(self.setuidStatus, SIGNAL("clicked()"),self.RWXButtonPressed)
		self.connect(self.setgidStatus, SIGNAL("clicked()"),self.RWXButtonPressed)
		self.connect(self.stickybitStatus, SIGNAL("clicked()"),self.RWXButtonPressed)
		self.connect(self.octalButton, SIGNAL("clicked()"), self.setOctalVal)
		self.grid.addWidget(self.Userlabel,2,0)
		self.grid.addWidget(self.Grouplabel,2,1)
		self.grid.addWidget(self.Otherlabel,2,2)
		self.grid.addWidget(self.userreadStatus,8,0)
		self.grid.addWidget(self.userwriteStatus,9,0)
		self.grid.addWidget(self.userexecuteStatus,10,0)
		self.grid.addWidget(self.groupreadStatus,8,1)
		self.grid.addWidget(self.groupwriteStatus,9,1)
		self.grid.addWidget(self.groupexecuteStatus,10,1)
		self.grid.addWidget(self.otherreadStatus,8,2)
		self.grid.addWidget(self.otherwriteStatus,9,2)
		self.grid.addWidget(self.otherexecuteStatus,10,2)
		self.orientationChanged()

	def orientationChanged(self):
		screenGeometry = QApplication.desktop().screenGeometry()
		if screenGeometry.width() > screenGeometry.height():
			# landscape 
			# first remove layout
			self.grid.removeWidget(self.line1)
			self.grid.removeWidget(self.line2)
			self.grid.removeWidget(self.line3)
			self.grid.removeWidget(self.Speciallabel)
			self.grid.removeWidget(self.setuidStatus)
			self.grid.removeWidget(self.setgidStatus)
			self.grid.removeWidget(self.stickybitStatus)
			self.grid.removeWidget(self.Iconlabel)
			self.grid.removeWidget(self.Octallabel)
			self.grid.removeWidget(self.octalButton)
			# then add new layout
			self.grid.addWidget(self.Iconlabel,0,0,1,4)
			self.grid.addWidget(self.line1,1,0,1,4)
			self.grid.addWidget(self.Speciallabel,2,3)
			self.grid.addWidget(self.line2,3,0,1,4)
			self.grid.addWidget(self.setuidStatus,8,3)
			self.grid.addWidget(self.setgidStatus,9,3)
			self.grid.addWidget(self.stickybitStatus,10,3)
			self.grid.addWidget(self.line3,11,0,1,4)
			self.grid.addWidget(self.line4,11,0,1,4)
			self.grid.addWidget(self.line5,11,0,1,4)
			self.grid.addWidget(self.Octallabel,16,0,1,4)
			self.grid.addWidget(self.octalButton,17,0,1,4)
			self.octalButton.setMinimumHeight(100)
			font = QFont()
			font.setPointSize(52)
			self.octalButton.setFont(font)
		else:
			# portrait
			# first remove layout
			self.grid.removeWidget(self.Speciallabel)
			self.grid.removeWidget(self.line1)
			self.grid.removeWidget(self.line2)
			self.grid.removeWidget(self.line3)
			self.grid.removeWidget(self.line4)
			self.grid.removeWidget(self.line5)
			self.grid.removeWidget(self.setuidStatus)
			self.grid.removeWidget(self.setgidStatus)
			self.grid.removeWidget(self.stickybitStatus)
			self.grid.removeWidget(self.Iconlabel)
			self.grid.removeWidget(self.Octallabel)
			self.grid.removeWidget(self.octalButton)
			# then add new layout
			self.grid.addWidget(self.Iconlabel,0,0,1,3)
			self.grid.addWidget(self.line1,1,0,1,3)
			self.grid.addWidget(self.line2,3,0,1,3)
			self.grid.addWidget(self.Speciallabel,12,0,1,3)
			self.grid.addWidget(self.setuidStatus,14,0)
			self.grid.addWidget(self.setgidStatus,14,1)
			self.grid.addWidget(self.stickybitStatus,14,2)
			self.grid.addWidget(self.Octallabel,16,0,1,3)
			self.grid.addWidget(self.octalButton,17,0,1,3)
			self.grid.addWidget(self.line3,11,0,1,3)
			self.grid.addWidget(self.line4,13,0,1,3)
			self.grid.addWidget(self.line5,15,0,1,3)
			self.octalButton.setMinimumHeight(150)
			font = QFont()
			font.setPointSize(32)
			self.octalButton.setFont(font)

	def RWXButtonPressed(self):
		global OctValue
		# user
		if self.userreadStatus.isChecked():
			self.userreadStatus.setIcon(QIcon.fromTheme("widgets_tickmark_grid"))
			userReadVal = 4
		else:
			self.userreadStatus.setIcon(QIcon.fromTheme("general_close"))
			userReadVal = 0
		if self.userwriteStatus.isChecked():
			self.userwriteStatus.setIcon(QIcon.fromTheme("widgets_tickmark_grid"))
			userWriteVal = 2
		else:
			self.userwriteStatus.setIcon(QIcon.fromTheme("general_close"))
			userWriteVal = 0
		if self.userexecuteStatus.isChecked():
			self.userexecuteStatus.setIcon(QIcon.fromTheme("widgets_tickmark_grid"))
			userExecuteVal = 1
		else:
			self.userexecuteStatus.setIcon(QIcon.fromTheme("general_close"))
			userExecuteVal = 0
		# group
		if self.groupreadStatus.isChecked():
			self.groupreadStatus.setIcon(QIcon.fromTheme("widgets_tickmark_grid"))
			groupReadVal = 4
		else:
			self.groupreadStatus.setIcon(QIcon.fromTheme("general_close"))
			groupReadVal = 0
		if self.groupwriteStatus.isChecked():
			self.groupwriteStatus.setIcon(QIcon.fromTheme("widgets_tickmark_grid"))
			groupWriteVal = 2
		else:
			self.groupwriteStatus.setIcon(QIcon.fromTheme("general_close"))
			groupWriteVal = 0
		if self.groupexecuteStatus.isChecked():
			self.groupexecuteStatus.setIcon(QIcon.fromTheme("widgets_tickmark_grid"))
			groupExecuteVal = 1
		else:
			self.groupexecuteStatus.setIcon(QIcon.fromTheme("general_close"))
			groupExecuteVal = 0
		# other
		if self.otherreadStatus.isChecked():
			self.otherreadStatus.setIcon(QIcon.fromTheme("widgets_tickmark_grid"))
			otherReadVal = 4
		else:
			self.otherreadStatus.setIcon(QIcon.fromTheme("general_close"))
			otherReadVal = 0
		if self.otherwriteStatus.isChecked():
			self.otherwriteStatus.setIcon(QIcon.fromTheme("widgets_tickmark_grid"))
			otherWriteVal = 2
		else:
			self.otherwriteStatus.setIcon(QIcon.fromTheme("general_close"))
			otherWriteVal = 0
		if self.otherexecuteStatus.isChecked():
			self.otherexecuteStatus.setIcon(QIcon.fromTheme("widgets_tickmark_grid"))
			otherExecuteVal = 1
		else:
			otherExecuteVal = 0
			self.otherexecuteStatus.setIcon(QIcon.fromTheme("general_close"))
		# special
		if self.setuidStatus.isChecked():
			self.setuidStatus.setIcon(QIcon.fromTheme("widgets_tickmark_grid"))
			setuidVal = 4
		else:
			self.setuidStatus.setIcon(QIcon.fromTheme("general_close"))
			setuidVal = 0
		if self.setgidStatus.isChecked():
			self.setgidStatus.setIcon(QIcon.fromTheme("widgets_tickmark_grid"))
			setgidVal = 2
		else:
			self.setgidStatus.setIcon(QIcon.fromTheme("general_close"))
			setgidVal = 0
		if self.stickybitStatus.isChecked():
			self.stickybitStatus.setIcon(QIcon.fromTheme("widgets_tickmark_grid"))
			stickybitVal = 1
		else:
			self.stickybitStatus.setIcon(QIcon.fromTheme("general_close"))
			stickybitVal = 0

		specialVal = setuidVal + setgidVal + stickybitVal
		userVal = userReadVal + userWriteVal + userExecuteVal
		groupVal = groupReadVal + groupWriteVal + groupExecuteVal
		otherVal = otherReadVal + otherWriteVal + otherExecuteVal

		allACL = self.GetACL(specialVal,userVal,groupVal,otherVal)

		self.octalButton.setText(str(specialVal)+str(userVal)+str(groupVal)+str(otherVal)+" "+ str(allACL))
		OctValue = self.octalButton.text()


	def setOctalVal(self):
		octPick = octalPickDialog(self)
		octPick.show()
		specialVal = OctValue[0]
		userVal = OctValue[1]
		groupVal = OctValue[2]
		otherVal = OctValue[3]
		allACL = self.GetACL(int(specialVal),int(userVal),int(groupVal),int(otherVal))
		self.octalButton.setText(str(specialVal)+str(userVal)+str(groupVal)+str(otherVal)+" "+ str(allACL))
		# special
		if specialVal == "0":
			self.setuidStatus.setIcon(QIcon.fromTheme("general_close"))
			self.setuidStatus.setChecked(False)
			self.setgidStatus.setIcon(QIcon.fromTheme("general_close"))
			self.setgidStatus.setChecked(False)
			self.stickybitStatus.setIcon(QIcon.fromTheme("general_close"))
			self.stickybitStatus.setChecked(False)
		if specialVal == "1":
			self.setuidStatus.setIcon(QIcon.fromTheme("general_close"))
			self.setuidStatus.setChecked(False)
			self.setgidStatus.setIcon(QIcon.fromTheme("general_close"))
			self.setgidStatus.setChecked(False)
			self.stickybitStatus.setIcon(QIcon.fromTheme("widgets_tickmark_grid"))
			self.stickybitStatus.setChecked(True)
		if specialVal == "2":
			self.setuidStatus.setIcon(QIcon.fromTheme("general_close"))
			self.setuidStatus.setChecked(False)
			self.setgidStatus.setIcon(QIcon.fromTheme("widgets_tickmark_grid"))
			self.setgidStatus.setChecked(True)
			self.stickybitStatus.setIcon(QIcon.fromTheme("general_close"))
			self.stickybitStatus.setChecked(False)
		if specialVal == "3":
			self.setuidStatus.setIcon(QIcon.fromTheme("general_close"))
			self.setuidStatus.setChecked(False)
			self.setgidStatus.setIcon(QIcon.fromTheme("widgets_tickmark_grid"))
			self.setgidStatus.setChecked(True)
			self.stickybitStatus.setIcon(QIcon.fromTheme("widgets_tickmark_grid"))
			self.stickybitStatus.setChecked(True)
		if specialVal == "4":
			self.setuidStatus.setIcon(QIcon.fromTheme("widgets_tickmark_grid"))
			self.setuidStatus.setChecked(True)
			self.setgidStatus.setIcon(QIcon.fromTheme("general_close"))
			self.setgidStatus.setChecked(False)
			self.stickybitStatus.setIcon(QIcon.fromTheme("general_close"))
			self.stickybitStatus.setChecked(False)
		if specialVal == "5":
			self.setuidStatus.setIcon(QIcon.fromTheme("widgets_tickmark_grid"))
			self.setuidStatus.setChecked(True)
			self.setgidStatus.setIcon(QIcon.fromTheme("general_close"))
			self.setgidStatus.setChecked(False)
			self.stickybitStatus.setIcon(QIcon.fromTheme("widgets_tickmark_grid"))
			self.stickybitStatus.setChecked(True)
		if specialVal == "6":
			self.setuidStatus.setIcon(QIcon.fromTheme("widgets_tickmark_grid"))
			self.setuidStatus.setChecked(True)
			self.setgidStatus.setIcon(QIcon.fromTheme("widgets_tickmark_grid"))
			self.setgidStatus.setChecked(True)
			self.stickybitStatus.setIcon(QIcon.fromTheme("general_close"))
			self.stickybitStatus.setChecked(False)
		if specialVal == "7":
			self.setuidStatus.setIcon(QIcon.fromTheme("widgets_tickmark_grid"))
			self.setuidStatus.setChecked(True)
			self.setgidStatus.setIcon(QIcon.fromTheme("widgets_tickmark_grid"))
			self.setgidStatus.setChecked(True)
			self.stickybitStatus.setIcon(QIcon.fromTheme("widgets_tickmark_grid"))
			self.stickybitStatus.setChecked(True)
		# user
		if userVal == "0":
			self.userreadStatus.setIcon(QIcon.fromTheme("general_close"))
			self.userreadStatus.setChecked(False)
			self.userwriteStatus.setIcon(QIcon.fromTheme("general_close"))
			self.userwriteStatus.setChecked(False)
			self.userexecuteStatus.setIcon(QIcon.fromTheme("general_close"))
			self.userexecuteStatus.setChecked(False)
		if userVal == "1":
			self.userreadStatus.setIcon(QIcon.fromTheme("general_close"))
			self.userreadStatus.setChecked(False)
			self.userwriteStatus.setIcon(QIcon.fromTheme("general_close"))
			self.userwriteStatus.setChecked(False)
			self.userexecuteStatus.setIcon(QIcon.fromTheme("widgets_tickmark_grid"))
			self.userexecuteStatus.setChecked(True)
		if userVal == "2":
			self.userreadStatus.setIcon(QIcon.fromTheme("general_close"))
			self.userreadStatus.setChecked(False)
			self.userwriteStatus.setIcon(QIcon.fromTheme("widgets_tickmark_grid"))
			self.userwriteStatus.setChecked(True)
			self.userexecuteStatus.setIcon(QIcon.fromTheme("general_close"))
			self.userexecuteStatus.setChecked(False)
		if userVal == "3":
			self.userreadStatus.setIcon(QIcon.fromTheme("general_close"))
			self.userreadStatus.setChecked(False)
			self.userwriteStatus.setIcon(QIcon.fromTheme("widgets_tickmark_grid"))
			self.userwriteStatus.setChecked(True)
			self.userexecuteStatus.setIcon(QIcon.fromTheme("widgets_tickmark_grid"))
			self.userexecuteStatus.setChecked(True)
		if userVal == "4":
			self.userreadStatus.setIcon(QIcon.fromTheme("widgets_tickmark_grid"))
			self.userreadStatus.setChecked(True)
			self.userwriteStatus.setIcon(QIcon.fromTheme("general_close"))
			self.userwriteStatus.setChecked(False)
			self.userexecuteStatus.setIcon(QIcon.fromTheme("general_close"))
			self.userexecuteStatus.setChecked(False)
		if userVal == "5":
			self.userreadStatus.setIcon(QIcon.fromTheme("widgets_tickmark_grid"))
			self.userreadStatus.setChecked(True)
			self.userwriteStatus.setIcon(QIcon.fromTheme("general_close"))
			self.userwriteStatus.setChecked(False)
			self.userexecuteStatus.setIcon(QIcon.fromTheme("widgets_tickmark_grid"))
			self.userexecuteStatus.setChecked(True)
		if userVal == "6":
			self.userreadStatus.setIcon(QIcon.fromTheme("widgets_tickmark_grid"))
			self.userreadStatus.setChecked(True)
			self.userwriteStatus.setIcon(QIcon.fromTheme("widgets_tickmark_grid"))
			self.userwriteStatus.setChecked(True)
			self.userexecuteStatus.setIcon(QIcon.fromTheme("general_close"))
			self.userexecuteStatus.setChecked(False)
		if userVal == "7":
			self.userreadStatus.setIcon(QIcon.fromTheme("widgets_tickmark_grid"))
			self.userreadStatus.setChecked(True)
			self.userwriteStatus.setIcon(QIcon.fromTheme("widgets_tickmark_grid"))
			self.userwriteStatus.setChecked(True)
			self.userexecuteStatus.setIcon(QIcon.fromTheme("widgets_tickmark_grid"))
			self.userexecuteStatus.setChecked(True)
		# group
		if groupVal == "0":
			self.groupreadStatus.setIcon(QIcon.fromTheme("general_close"))
			self.groupreadStatus.setChecked(False)
			self.groupwriteStatus.setIcon(QIcon.fromTheme("general_close"))
			self.groupwriteStatus.setChecked(False)
			self.groupexecuteStatus.setIcon(QIcon.fromTheme("general_close"))
			self.groupexecuteStatus.setChecked(False)
		if groupVal == "1":
			self.groupreadStatus.setIcon(QIcon.fromTheme("general_close"))
			self.groupreadStatus.setChecked(False)
			self.groupwriteStatus.setIcon(QIcon.fromTheme("general_close"))
			self.groupwriteStatus.setChecked(False)
			self.groupexecuteStatus.setIcon(QIcon.fromTheme("widgets_tickmark_grid"))
			self.groupexecuteStatus.setChecked(True)
		if groupVal == "2":
			self.groupreadStatus.setIcon(QIcon.fromTheme("general_close"))
			self.groupreadStatus.setChecked(False)
			self.groupwriteStatus.setIcon(QIcon.fromTheme("widgets_tickmark_grid"))
			self.groupwriteStatus.setChecked(True)
			self.groupexecuteStatus.setIcon(QIcon.fromTheme("general_close"))
			self.groupexecuteStatus.setChecked(False)
		if groupVal == "3":
			self.groupreadStatus.setIcon(QIcon.fromTheme("general_close"))
			self.groupreadStatus.setChecked(False)
			self.groupwriteStatus.setIcon(QIcon.fromTheme("widgets_tickmark_grid"))
			self.groupwriteStatus.setChecked(True)
			self.groupexecuteStatus.setIcon(QIcon.fromTheme("widgets_tickmark_grid"))
			self.groupexecuteStatus.setChecked(True)
		if groupVal == "4":
			self.groupreadStatus.setIcon(QIcon.fromTheme("widgets_tickmark_grid"))
			self.groupreadStatus.setChecked(False)
			self.groupwriteStatus.setIcon(QIcon.fromTheme("general_close"))
			self.groupwriteStatus.setChecked(False)
			self.groupexecuteStatus.setIcon(QIcon.fromTheme("general_close"))
			self.groupexecuteStatus.setChecked(False)
		if groupVal == "5":
			self.groupreadStatus.setIcon(QIcon.fromTheme("widgets_tickmark_grid"))
			self.groupreadStatus.setChecked(True)
			self.groupwriteStatus.setIcon(QIcon.fromTheme("general_close"))
			self.groupwriteStatus.setChecked(False)
			self.groupexecuteStatus.setIcon(QIcon.fromTheme("widgets_tickmark_grid"))
			self.groupexecuteStatus.setChecked(True)
		if groupVal == "6":
			self.groupreadStatus.setIcon(QIcon.fromTheme("widgets_tickmark_grid"))
			self.groupreadStatus.setChecked(True)
			self.groupwriteStatus.setIcon(QIcon.fromTheme("widgets_tickmark_grid"))
			self.groupwriteStatus.setChecked(True)
			self.groupexecuteStatus.setIcon(QIcon.fromTheme("general_close"))
			self.groupexecuteStatus.setChecked(False)
		if groupVal == "7":
			self.groupreadStatus.setIcon(QIcon.fromTheme("widgets_tickmark_grid"))
			self.groupreadStatus.setChecked(True)
			self.groupwriteStatus.setIcon(QIcon.fromTheme("widgets_tickmark_grid"))
			self.groupwriteStatus.setChecked(True)
			self.groupexecuteStatus.setIcon(QIcon.fromTheme("widgets_tickmark_grid"))
			self.groupexecuteStatus.setChecked(True)
		# other
		if otherVal == "0":
			self.otherreadStatus.setIcon(QIcon.fromTheme("general_close"))
			self.otherreadStatus.setChecked(False)
			self.otherwriteStatus.setIcon(QIcon.fromTheme("general_close"))
			self.otherwriteStatus.setChecked(False)
			self.otherexecuteStatus.setIcon(QIcon.fromTheme("general_close"))
			self.otherexecuteStatus.setChecked(False)
		if otherVal == "1":
			self.otherreadStatus.setIcon(QIcon.fromTheme("general_close"))
			self.otherreadStatus.setChecked(False)
			self.otherwriteStatus.setIcon(QIcon.fromTheme("general_close"))
			self.otherwriteStatus.setChecked(False)
			self.otherexecuteStatus.setIcon(QIcon.fromTheme("widgets_tickmark_grid"))
			self.otherexecuteStatus.setChecked(True)
		if otherVal == "2":
			self.otherreadStatus.setIcon(QIcon.fromTheme("general_close"))
			self.otherreadStatus.setChecked(False)
			self.otherwriteStatus.setIcon(QIcon.fromTheme("widgets_tickmark_grid"))
			self.otherwriteStatus.setChecked(True)
			self.otherexecuteStatus.setIcon(QIcon.fromTheme("general_close"))
			self.otherexecuteStatus.setChecked(False)
		if otherVal == "3":
			self.otherreadStatus.setIcon(QIcon.fromTheme("general_close"))
			self.otherreadStatus.setChecked(False)
			self.otherwriteStatus.setIcon(QIcon.fromTheme("widgets_tickmark_grid"))
			self.otherwriteStatus.setChecked(True)
			self.otherexecuteStatus.setIcon(QIcon.fromTheme("widgets_tickmark_grid"))
			self.otherexecuteStatus.setChecked(True)
		if otherVal == "4":
			self.otherreadStatus.setIcon(QIcon.fromTheme("widgets_tickmark_grid"))
			self.otherreadStatus.setChecked(True)
			self.otherwriteStatus.setIcon(QIcon.fromTheme("general_close"))
			self.otherwriteStatus.setChecked(False)
			self.otherexecuteStatus.setIcon(QIcon.fromTheme("general_close"))
			self.otherexecuteStatus.setChecked(False)
		if otherVal == "5":
			self.otherreadStatus.setIcon(QIcon.fromTheme("widgets_tickmark_grid"))
			self.otherreadStatus.setChecked(True)
			self.otherwriteStatus.setIcon(QIcon.fromTheme("general_close"))
			self.otherwriteStatus.setChecked(False)
			self.otherexecuteStatus.setIcon(QIcon.fromTheme("widgets_tickmark_grid"))
			self.otherexecuteStatus.setChecked(True)
		if otherVal == "6":
			self.otherreadStatus.setIcon(QIcon.fromTheme("widgets_tickmark_grid"))
			self.otherreadStatus.setChecked(True)
			self.otherwriteStatus.setIcon(QIcon.fromTheme("widgets_tickmark_grid"))
			self.otherwriteStatus.setChecked(True)
			self.otherexecuteStatus.setIcon(QIcon.fromTheme("general_close"))
			self.otherexecuteStatus.setChecked(False)
		if otherVal == "7":
			self.otherreadStatus.setIcon(QIcon.fromTheme("widgets_tickmark_grid"))
			self.otherreadStatus.setChecked(True)
			self.otherwriteStatus.setIcon(QIcon.fromTheme("widgets_tickmark_grid"))
			self.otherwriteStatus.setChecked(True)
			self.otherexecuteStatus.setIcon(QIcon.fromTheme("widgets_tickmark_grid"))
			self.otherexecuteStatus.setChecked(True)

	def GetACL(self,specialval,userval,groupval,otherval):
		if userval == 0:
			userACL = "---"
		if userval == 1:
			userACL = "--x"
		if userval == 2:
			userACL = "-w-"
		if userval == 3:
			userACL = "-wx"
		if userval == 4:
			userACL = "r--"
		if userval == 5:
			userACL = "r-x"
		if userval == 6:
			userACL = "rw-"
		if userval == 7:
			userACL = "rwx"
		if groupval == 0:
			groupACL = "---"
		if groupval == 1:
			groupACL = "--x"
		if groupval == 2:
			groupACL = "-w-"
		if groupval == 3:
			groupACL = "-wx"
		if groupval == 4:
			groupACL = "r--"
		if groupval == 5:
			groupACL = "r-x"
		if groupval == 6:
			groupACL = "rw-"
		if groupval == 7:
			groupACL = "rwx"
		if otherval == 0:
			otherACL = "---"
		if otherval == 1:
			otherACL = "--x"
		if otherval == 2:
			otherACL = "-w-"
		if otherval == 3:
			otherACL = "-wx"
		if otherval == 4:
			otherACL = "r--"
		if otherval == 5:
			otherACL = "r-x"
		if otherval == 6:
			otherACL = "rw-"
		if otherval == 7:
			otherACL = "rwx"
		if specialval == 4 or specialval == 5 or specialval == 7 or specialval == 6:
			# setuid
			if userval == 7 or userval == 5 or userval == 3 or userval == 1:
				# exec bit on user
				userACL = userACL[:2] + "s"
			else:
				userACL = userACL[:2] + "S"
		if specialval == 2 or specialval == 6 or specialval == 7 or specialval == 3:
			# setgit
			if groupval == 7 or groupval == 5 or groupval == 3 or groupval == 1:
				# exec bit on group
				groupACL = groupACL[:2] + "s"
			else:
				groupACL = groupACL[:2] + "S"
		if specialval == 1 or specialval == 3 or specialval == 5 or specialval == 7:
			# stickybit
			if otherval == 7 or otherval == 5 or otherval == 3 or otherval == 1:
				# exec bit on other
				otherACL = otherACL[:2] + "t"
			else:
				otherACL = otherACL[:2] + "T"

		allACL= userACL+groupACL+otherACL
		return allACL

class octalPickDialog(QWidget):
	def __init__(self,parent):
		super(octalPickDialog, self).__init__(parent)
		self.d = QDialog(self)
		self.d.setMinimumHeight(650)
		self.d.setMaximumHeight(650)
		self.d.setWindowTitle("|special|user|group|other|")
		doneButton = QPushButton(self.tr("Done"))
		hbox = QGridLayout()
		horizontalLayout = QGridLayout()
		self.specialWidget = QListWidget()
		self.userWidget = QListWidget()
		self.groupWidget = QListWidget()
		self.otherWidget = QListWidget()
		f = QFont()
		f.setPointSize(20)

		for i in range(8):
			item = QListWidgetItem("%01i" % i)
			item.setFont(f)
			item.setTextAlignment(Qt.AlignCenter)
			self.specialWidget.addItem(item)

		for i in range(8):
			item2 = QListWidgetItem("%01i" % i)
			item2.setFont(f)
			item2.setTextAlignment(Qt.AlignCenter)
			self.userWidget.addItem(item2)

		for i in range(8):
			item3 = QListWidgetItem("%01i" % i)
			item3.setFont(f)
			item3.setTextAlignment(Qt.AlignCenter)
			self.groupWidget.addItem(item3)

		for i in range(8):
			item4 = QListWidgetItem("%01i" % i)
			item4.setFont(f)
			item4.setTextAlignment(Qt.AlignCenter)
			self.otherWidget.addItem(item4)

		self.specialWidget.setCurrentRow(int(OctValue[0]))
		self.userWidget.setCurrentRow(int(OctValue[1]))
		self.groupWidget.setCurrentRow(int(OctValue[2]))
		self.otherWidget.setCurrentRow(int(OctValue[3]))

		horizontalLayout.addWidget(self.specialWidget,0,0) 
		horizontalLayout.addWidget(self.userWidget,0,1) 
		horizontalLayout.addWidget(self.groupWidget,0,2) 
		horizontalLayout.addWidget(self.otherWidget,0,3) 

		buttonBox = QDialogButtonBox()
		horizontalLayout.addWidget(doneButton,1,0,1,4)
		self.d.setLayout(hbox)
		hbox.addLayout (horizontalLayout,0,0)
		self.connect(doneButton, SIGNAL("clicked()"), self.accept)
		self.connect(QApplication.desktop(), SIGNAL("resized(int)"), self.orientationChanged)
		self.d.exec_()

	def accept(self):
		global OctValue
		OctValue = str(self.specialWidget.currentRow())+str(self.userWidget.currentRow())+str(self.groupWidget.currentRow())+str(self.otherWidget.currentRow())
		self.d.close()

	def orientationChanged(self):
		# resize back to portrait size if possible
		self.d.resize(650,740)

class helpWindow(QWidget):
	def __init__(self,parent):
		super(helpWindow, self).__init__(parent)
		self.wg = QDialog(self)
		self.wg.resize(398, 692)
		sizePolicy = QSizePolicy(QSizePolicy.Minimum, QSizePolicy.Expanding)
		sizePolicy.setHorizontalStretch(0)
		sizePolicy.setVerticalStretch(0)
		sizePolicy.setHeightForWidth(self.wg.sizePolicy().hasHeightForWidth())
		self.wg.setSizePolicy(sizePolicy)
		self.wg.setWindowTitle("Terms explained")
		self.grid = QGridLayout(self.wg)

		termsInfo = QTextBrowser()
		termsInfo.setMinimumSize(QSize(330, 340))
		termsInfo.setHtml( infoTXT )
		font = QFont()
		font.setPointSize(16)
		termsInfo.setFont(font)
		self.grid.addWidget(termsInfo, 0, 0)
		self.connect(QApplication.desktop(), SIGNAL("resized(int)"), self.orientationChanged)
		self.HelpWindowOpen = False
		self.wg.show()

	def orientationChanged(self):
		screenGeometry = QApplication.desktop().screenGeometry()
		if screenGeometry.width() < screenGeometry.height():
			# portrait
			self.wg.resize(398, 692)

if __name__ == '__main__':
	# QApplication controls things relating to a Qt application, like the main loop.
	# You should always instantiate it before using any QtGui related stuff.
	# See also:
	#   http://doc.trolltech.com/4.6/qapplication.html
	app = QApplication(sys.argv)

	# Create an instance (calling __init__, too, of course) of our window subclassing QWidget
	w = MyMainWindow()

	# Show our window
	w.show()

	app.exec_()
	sys.exit()
