summaryrefslogtreecommitdiffstats
path: root/Lib/idlelib
diff options
context:
space:
mode:
authorSteven M. Gava <elguavas@python.net>2001-07-31 06:59:02 (GMT)
committerSteven M. Gava <elguavas@python.net>2001-07-31 06:59:02 (GMT)
commit44d3d1a394571c6ddfe29911f92fdd29fd62db71 (patch)
treea030379584390b1eb7ac0fbad2a8c7ea6eaad0d9 /Lib/idlelib
parent0fbca4aaf0b5caa39e2456a176ccb52ded948488 (diff)
downloadcpython-44d3d1a394571c6ddfe29911f92fdd29fd62db71.zip
cpython-44d3d1a394571c6ddfe29911f92fdd29fd62db71.tar.gz
cpython-44d3d1a394571c6ddfe29911f92fdd29fd62db71.tar.bz2
some new dialogs and support files for new about and configuration implementations
Diffstat (limited to 'Lib/idlelib')
-rw-r--r--Lib/idlelib/CREDITS.txt17
-rw-r--r--Lib/idlelib/aboutDialog.py133
-rw-r--r--Lib/idlelib/configDialog.py138
-rw-r--r--Lib/idlelib/textView.py77
4 files changed, 365 insertions, 0 deletions
diff --git a/Lib/idlelib/CREDITS.txt b/Lib/idlelib/CREDITS.txt
new file mode 100644
index 0000000..30c2073
--- /dev/null
+++ b/Lib/idlelib/CREDITS.txt
@@ -0,0 +1,17 @@
+IDLEfork Credits
+==================
+
+Guido van Rossum, as well as being the creator of the Python language, was
+the original creator of IDLE. His great work continues as both a contributor
+to, and 'benevolent dictator for life' of Python and IDLE/IDLEfork.
+
+The main developers who have been so far active on IDLEfork version 0.8.1
+and greater are, Guido van Rossum, Stephen M. Gava and Kurt B. Kaiser.
+
+The IDLE fork project was initiated and brought up to version 0.7.1 by
+David Scherer, Peter Schneider-Kamp and Nicholas Riley.
+
+There are doubtless others who should be included here, especially those
+who may have contributed to IDLE versions prior ot 0.8. Please contact
+the IDLEfork coordinator to have yourself included here if you are one of
+those I have missed! (contact details at http://idlefork.sourceforge.net)
diff --git a/Lib/idlelib/aboutDialog.py b/Lib/idlelib/aboutDialog.py
new file mode 100644
index 0000000..85cbe46
--- /dev/null
+++ b/Lib/idlelib/aboutDialog.py
@@ -0,0 +1,133 @@
+##---------------------------------------------------------------------------##
+##
+## idle - about box
+## elguavas
+##
+##---------------------------------------------------------------------------##
+"""
+about box for idle
+"""
+from Tkinter import *
+import string
+import textView
+import idlever
+class AboutDialog(Toplevel):
+ """
+ modal about dialog for idle
+ """
+ def __init__(self,parent,title):
+ Toplevel.__init__(self, parent)
+ self.configure(borderwidth=5)
+ self.geometry("+%d+%d" % (parent.winfo_rootx()+30,
+ parent.winfo_rooty()+30))
+ #elguavas - config placeholders til config stuff completed
+ self.bg="#555555"
+ self.fg="#ffffff"
+ #no ugly bold default text font on *nix
+ self.textFont=tuple(Label().cget('font').split())[0:2]+('normal',)
+
+ self.CreateWidgets()
+ self.resizable(height=FALSE,width=FALSE)
+ self.title(title)
+ self.transient(parent)
+ self.grab_set()
+ self.protocol("WM_DELETE_WINDOW", self.Ok)
+ self.parent = parent
+ self.buttonOk.focus_set()
+ #key bindings for this dialog
+ self.bind('<Alt-c>',self.CreditsButtonBinding) #credits button
+ #self.bind('<Alt-l>',self.LicenseButtonBinding) #license button
+ self.bind('<Alt-r>',self.LicenseButtonBinding) #readme button
+ self.bind('<Return>',self.Ok) #dismiss dialog
+ self.bind('<Escape>',self.Ok) #dismiss dialog
+ self.wait_window()
+
+ def CreateWidgets(self):
+ frameMain = Frame(self,borderwidth=2,relief=SUNKEN)
+ frameButtons = Frame(self)
+ frameButtons.pack(side=BOTTOM,fill=X)
+ frameMain.pack(side=TOP,expand=TRUE,fill=BOTH)
+ self.buttonOk = Button(frameButtons,text='Ok',
+ command=self.Ok)#,default=ACTIVE
+ self.buttonOk.pack(padx=5,pady=5)
+ #self.picture = Image('photo',data=self.pictureData)
+ frameBg = Frame(frameMain,bg=self.bg)
+ frameBg.pack(expand=TRUE,fill=BOTH)
+ labelTitle = Label(frameBg,text='IDLEfork',fg=self.fg,bg=self.bg,
+ font=('courier', 24, 'bold'))
+ labelTitle.grid(row=0,column=0,sticky=W,padx=10,pady=10)
+ #labelPicture = Label(frameBg,text='[picture]')
+ #image=self.picture,bg=self.bg)
+ #labelPicture.grid(row=0,column=1,sticky=W,rowspan=2,padx=0,pady=3)
+ labelVersion = Label(frameBg,text='version '+idlever.IDLE_VERSION,
+ fg=self.fg,bg=self.bg,font=self.textFont)
+ labelVersion.grid(row=1,column=0,sticky=W,padx=10,pady=5)
+ labelCopyright = Label(frameBg,
+ text="A development version of Python's lightweight\n"+
+ 'Integrated DeveLopment Environment, IDLE.',
+ justify=LEFT,fg=self.fg,bg=self.bg,font=self.textFont)
+ labelCopyright.grid(row=2,column=0,sticky=W,columnspan=3,padx=10,pady=5)
+ labelLicense = Label(frameBg,
+ text='Licenced under the Python 2.1.1 PSF Licence\n'+
+ '(a GPL compatible licence with extra freedoms)',
+ justify=LEFT,fg=self.fg,bg=self.bg,font=self.textFont)
+ labelLicense.grid(row=3,column=0,sticky=W,columnspan=3,padx=10,pady=5)
+ framePad = Frame(frameBg,height=5,bg=self.bg).grid(row=4,column=0)
+ labelEmail = Label(frameBg,text='email: idle-dev@python.org',
+ justify=LEFT,fg=self.fg,bg=self.bg,font=self.textFont)
+ labelEmail.grid(row=5,column=0,columnspan=2,sticky=W,padx=10,pady=0)
+ labelWWW = Label(frameBg,text='www: http://idlefork.sourceforge.net',
+ justify=LEFT,fg=self.fg,bg=self.bg,font=self.textFont)
+ labelWWW.grid(row=6,column=0,columnspan=2,sticky=W,padx=10,pady=0)
+ frameDivider = Frame(frameBg,borderwidth=1,relief=SUNKEN,
+ height=2,bg=self.bg).grid(row=7,column=0,sticky=(E,W),columnspan=3,
+ padx=5,pady=5)
+ labelPythonVer = Label(frameBg,text='Python version: '+
+ sys.version.split()[0],fg=self.fg,bg=self.bg,font=self.textFont)
+ labelPythonVer.grid(row=8,column=0,sticky=W,padx=10,pady=0)
+ #handle weird tk version num in windoze python >= 1.6 (?!?)
+ tkVer = `TkVersion`.split('.')
+ tkVer[len(tkVer)-1] = str('%.3g' % (float('.'+tkVer[len(tkVer)-1])))[2:]
+ if tkVer[len(tkVer)-1] == '':
+ tkVer[len(tkVer)-1] = '0'
+ tkVer = string.join(tkVer,'.')
+ labelTkVer = Label(frameBg,text='Tk version: '+tkVer,fg=self.fg,bg=self.bg,
+ font=self.textFont)
+ labelTkVer.grid(row=8,column=1,sticky=W,padx=2,pady=0)
+ #labelOs = Label(frameBg,text='python os name: '+pyching.os,
+ # font=self.fontText,fg=self.fg,bg=self.bg)
+ #labelOs.grid(row=6,column=0,sticky=W,padx=10,pady=0)
+ #labelOsType = Label(frameBg,text='python os type: '+pyching.osType,
+ # font=self.fontText,fg=self.fg,bg=self.bg)
+ #labelOsType.grid(row=6,column=1,sticky=W,padx=5,pady=0)
+ #framePad = Frame(frameBg,bg=self.bg,height=5).grid(row=7,column=0)
+
+ self.buttonLicense = Button(frameBg,text='View Readme',underline=5,
+ width=14,highlightbackground=self.bg,command=self.ShowLicense)#takefocus=FALSE
+ self.buttonLicense.grid(row=9,column=0,sticky=W,padx=10,pady=10)
+ self.buttonCredits = Button(frameBg,text='View Credits',underline=5,
+ width=14,highlightbackground=self.bg,command=self.ShowCredits)#takefocus=FALSE
+ self.buttonCredits.grid(row=9,column=1,columnspan=2,sticky=E,padx=10,pady=10)
+
+ def CreditsButtonBinding(self,event):
+ self.buttonCredits.invoke()
+
+ def LicenseButtonBinding(self,event):
+ self.buttonLicense.invoke()
+
+ def ShowLicense(self):
+ textView.TextViewer(self,title='About - Readme',
+ fileName='./README.txt')
+
+ def ShowCredits(self):
+ textView.TextViewer(self,title='About - Credits',
+ fileName='./CREDITS.txt')
+
+ def Ok(self, event=None):
+ self.destroy()
+
+if __name__ == '__main__':
+ #test the dialog
+ root=Tk()
+ Button(root,text='About',command=lambda:AboutDialog(root,'About')).pack()
+ root.mainloop()
diff --git a/Lib/idlelib/configDialog.py b/Lib/idlelib/configDialog.py
new file mode 100644
index 0000000..f46f95f
--- /dev/null
+++ b/Lib/idlelib/configDialog.py
@@ -0,0 +1,138 @@
+##---------------------------------------------------------------------------##
+##
+## idle - configuration dialog
+## elguavas
+##
+##---------------------------------------------------------------------------##
+"""
+configuration dialog
+"""
+from Tkinter import *
+import tkMessageBox
+
+class ConfigDialog(Toplevel):
+ """
+ configuration dialog for idle
+ """
+ def __init__(self,parent,title,configDict):
+ """
+ configDict - dictionary of configuration items
+ """
+ Toplevel.__init__(self, parent)
+ self.configure(borderwidth=5)
+ self.geometry("+%d+%d" % (parent.winfo_rootx()+20,
+ parent.winfo_rooty()+30))
+ self.config=configDict
+ #elguavas - config placeholders til config stuff completed
+ self.bg=self.cget('bg')
+ self.fg=None
+ #no ugly bold default text font on *nix
+ self.textFont=tuple(Label().cget('font').split())[0:2]+('normal',)
+
+ self.CreateWidgets()
+ self.resizable(height=FALSE,width=FALSE)
+ self.ChangePage()
+ self.transient(parent)
+ self.grab_set()
+ self.protocol("WM_DELETE_WINDOW", self.Cancel)
+ self.parent = parent
+ self.framePages.focus_set()
+ #key bindings for this dialog
+# self.bind('<Return>',self.Ok) #dismiss dialog
+ self.bind('<Escape>',self.CancelBinding) #dismiss dialog, no save
+ self.bind('<Alt-s>',self.SaveBinding) #dismiss dialog, save
+ self.bind('<Alt-r>',self.RevertBinding) #revert to defaults
+ self.bind('<Alt-f>',self.ChangePageBinding)
+ self.bind('<Alt-c>',self.ChangePageBinding)
+ self.bind('<Alt-k>',self.ChangePageBinding)
+ self.bind('<Alt-g>',self.ChangePageBinding)
+ self.wait_window()
+
+ def Cancel(self):
+ self.destroy()
+
+ def Save(self):
+ pass
+
+ def Revert(self):
+ pass
+
+ def ChangePage(self):
+ self.pages[self.pageNum.get()].lift()
+ self.title('Settings - '+self.pageButtons[self.pageNum.get()].cget('text'))
+
+ def CancelBinding(self,event):
+ self.Cancel()
+
+ def SaveBinding(self,event):
+ self.Save()
+
+ def RevertBinding(self,event):
+ self.Revert()
+
+ def ChangePageBinding(self,event):
+ pageKeys=('f','c','k','g')
+ pos=0
+ for key in pageKeys:
+ if event.char == key:
+ self.pageNum.set(pos)
+ self.ChangePage()
+ return
+ pos=pos+1
+
+ def CreateWidgets(self):
+ self.framePages = Frame(self,borderwidth=2,relief=SUNKEN)
+ frameActionButtons = Frame(self)
+ framePageButtons = Frame(self.framePages,borderwidth=1,relief=SUNKEN)
+ #action buttons
+ self.buttonRevert = Button(frameActionButtons,text='Revert',
+ command=self.Revert,underline=0,takefocus=FALSE)
+ self.buttonSave = Button(frameActionButtons,text='Save',
+ command=self.Save,underline=0,takefocus=FALSE)
+ self.buttonCancel = Button(frameActionButtons,text='Cancel',
+ command=self.Cancel,takefocus=FALSE)
+ #page buttons
+ self.pageNum=IntVar()
+ self.pageNum.set(0)
+ buttonPageFonts = Radiobutton(framePageButtons,value=0,text='Fonts')
+ buttonPageColours = Radiobutton(framePageButtons,value=1,text='Colours')
+ buttonPageKeys = Radiobutton(framePageButtons,value=2,text='Keys')
+ buttonPageGeneral = Radiobutton(framePageButtons,value=3,text='General')
+ self.pageButtons=(buttonPageFonts,buttonPageColours,
+ buttonPageKeys,buttonPageGeneral)
+ for button in self.pageButtons:
+ button.config(command=self.ChangePage,underline=0,takefocus=FALSE,
+ indicatoron=FALSE,highlightthickness=0,variable=self.pageNum,
+ selectcolor=self.bg,borderwidth=1)
+ button.pack(side=LEFT)
+ #pages
+ framePageFonts=Frame(self.framePages)
+ framePageColours=Frame(self.framePages)
+ framePageKeys=Frame(self.framePages)
+ framePageGeneral=Frame(self.framePages)
+ self.pages=(framePageFonts,framePageColours,framePageKeys,framePageGeneral)
+ #pageFonts
+ Button(framePageFonts,text='fonts page test').pack(padx=30,pady=30)
+ #pageColours
+ Button(framePageColours,text='colours page test').pack(padx=60,pady=60)
+ #pageKeys
+ Button(framePageKeys,text='keys page test').pack(padx=90,pady=90)
+ #pageGeneral
+ Button(framePageGeneral,text='general page test').pack(padx=110,pady=110)
+
+ #grid in framePages so we can overlap pages
+ framePageButtons.grid(row=0,column=0,sticky=W)
+ for page in self.pages: page.grid(row=1,column=0,sticky=(N,S,E,W))
+
+ self.buttonRevert.pack(side=LEFT,padx=5,pady=5)
+ self.buttonSave.pack(side=LEFT,padx=5,pady=5)
+ self.buttonCancel.pack(side=LEFT,padx=5,pady=5)
+ frameActionButtons.pack(side=BOTTOM)
+ self.framePages.pack(side=TOP,expand=TRUE,fill=BOTH)
+
+if __name__ == '__main__':
+ #test the dialog
+ root=Tk()
+ Button(root,text='Dialog',
+ command=lambda:ConfigDialog(root,'Settings',None)).pack()
+ root.mainloop()
diff --git a/Lib/idlelib/textView.py b/Lib/idlelib/textView.py
new file mode 100644
index 0000000..72d8b34
--- /dev/null
+++ b/Lib/idlelib/textView.py
@@ -0,0 +1,77 @@
+##---------------------------------------------------------------------------##
+##
+## idle - simple text view dialog
+## elguavas
+##
+##---------------------------------------------------------------------------##
+"""
+simple text browser for idle
+"""
+from Tkinter import *
+import tkMessageBox
+
+class TextViewer(Toplevel):
+ """
+ simple text viewer dialog for idle
+ """
+ def __init__(self,parent,title,fileName):
+ """
+ fileName - string,should be an absoulute filename
+ """
+ Toplevel.__init__(self, parent)
+ self.configure(borderwidth=5)
+ self.geometry("+%d+%d" % (parent.winfo_rootx()+10,
+ parent.winfo_rooty()+10))
+ #elguavas - config placeholders til config stuff completed
+ self.bg=None
+ self.fg=None
+
+ self.CreateWidgets()
+ self.title(title)
+ self.transient(parent)
+ self.grab_set()
+ self.protocol("WM_DELETE_WINDOW", self.Ok)
+ self.parent = parent
+ self.textView.focus_set()
+ #key bindings for this dialog
+ self.bind('<Return>',self.Ok) #dismiss dialog
+ self.bind('<Escape>',self.Ok) #dismiss dialog
+ self.LoadTextFile(fileName)
+ self.textView.config(state=DISABLED)
+ self.wait_window()
+
+ def LoadTextFile(self, fileName):
+ textFile = None
+ try:
+ textFile = open(fileName, 'r')
+ except IOError:
+ tkMessageBox.showerror(title='File Load Error',
+ message='Unable to load file '+`fileName`+' .')
+ else:
+ self.textView.insert(0.0,textFile.read())
+
+ def CreateWidgets(self):
+ frameText = Frame(self)
+ frameButtons = Frame(self)
+ self.buttonOk = Button(frameButtons,text='Ok',
+ command=self.Ok,takefocus=FALSE,default=ACTIVE)
+ self.scrollbarView = Scrollbar(frameText,orient=VERTICAL,
+ takefocus=FALSE,highlightthickness=0)
+ self.textView = Text(frameText,wrap=WORD,highlightthickness=0)
+ self.scrollbarView.config(command=self.textView.yview)
+ self.textView.config(yscrollcommand=self.scrollbarView.set)
+ self.buttonOk.pack(padx=5,pady=5)
+ self.scrollbarView.pack(side=RIGHT,fill=Y)
+ self.textView.pack(side=LEFT,expand=TRUE,fill=BOTH)
+ frameButtons.pack(side=BOTTOM,fill=X)
+ frameText.pack(side=TOP,expand=TRUE,fill=BOTH)
+
+ def Ok(self, event=None):
+ self.destroy()
+
+if __name__ == '__main__':
+ #test the dialog
+ root=Tk()
+ Button(root,text='View',
+ command=lambda:TextViewer(root,'Text','./textView.py')).pack()
+ root.mainloop()