Iron Python 1.1
Now for IronPython 1.1 — annoyingly the WebBrowser control doesn't accept normal DnD, nor does it let you paint it to a bitmap to blit on another control, so this one uses a ListView.
import clr
clr.AddReferenceByPartialName("System.Windows.Forms")
clr.AddReferenceByPartialName("System.Drawing")
from System.Windows.Forms import *
from System.Drawing import *
from md5 import *
from sha import *
pane = None
hashes = [md5, sha]
nbsp = list(" ")
def getHash(file, hashOp, delimiter) :
try :
reader = open(file, 'rb')
except :
return ""
try :
digest = hashOp()
while True :
chunk = reader.read(1024)
if not chunk :
break
digest.update(chunk)
finally:
reader.close()
raw = digest.hexdigest()
work = []
i = 0
while i < len(raw) :
work.append(raw[i])
i += 1
if 0 == (i%8) :
work = work + delimiter
return ''.join(work)
def dragOver(sender, evt):
evt.Effect = DragDropEffects.Link
def dragDrop(sender, evt):
global pane
data = evt.Data
data = data.GetData(DataFormats.FileDrop)
num = pane.Items.Count
for file in data:
pane.Items.Add(file)
for hashOp in hashes :
anHash = getHash(file, hashOp, nbsp)
pane.Items[num].SubItems.Add(anHash)
num += 1
def decorate(frame):
global pane
frame.Text = "IronPython - Drophash"
## optional icon
## ico = Image.FromFile("drophash.ico")
## frame.Icon = Icon.FromHandle(ico.GetHicon());
pane = ListView()
pane.Dock = DockStyle.Fill;
frame.Controls.Add(pane)
pane.AllowDrop = True
pane.DragOver += dragOver
pane.DragEnter += dragOver
pane.DragDrop += dragDrop
pane.View = View.Details
pane.Columns.Add("File name", 100, HorizontalAlignment.Left)
pane.Columns.Add("MD5", 200, HorizontalAlignment.Left)
pane.Columns.Add("SHA-1", 200, HorizontalAlignment.Left)
if __name__ == "__main__":
frame = Form()
decorate(frame)
Application.Run(frame)
Jython 2.2
Jython next; but rather than coding the messy .ico to image transformation again, use a PNG icon (save as drophash.png) instead:—
import sys
import os.path
sys.packageManager.makeJavaPackage("javax.swing", "JWindow", None)
sys.packageManager.makeJavaPackage("java.awt", "Window", None)
sys.packageManager.makeJavaPackage("java.awt.dnd", "DropTargetListener", None)
sys.packageManager.makeJavaPackage("java.awt.datatransfer", "DataFlavor", None)
import javax.swing
import java.lang
import java.awt.dnd
import java.awt.datatransfer
from md5 import *
from sha import *
pane = None
hashes = [md5, sha]
nbsp = list(" ")
target = None
def getHash(file, hashOp, delimiter) :
try :
reader = open(file, 'rb')
except :
return ""
try :
digest = hashOp()
while True :
chunk = reader.read(1024)
if not chunk :
break
digest.update(chunk)
finally:
reader.close()
raw = digest.hexdigest()
work = []
i = 0
while i < len(raw) :
work.append(raw[i])
i += 1
if 0 == (i%8) :
work = work + delimiter
return ''.join(work)
def OnDropFiles(filenames) :
global pane, nbsp, hashes
pane.text += "<table border=1><tr><th>File</th><th>MD5</th><th>SHA-1</th></tr>"
for file in filenames :
pane.text += "<tr><td>%s</td>" % file
for hashOp in hashes :
anHash = getHash(str(file), hashOp, nbsp)
pane.text += "<td><pre>%s</pre></td>" % anHash
pane.text +="</tr>"
pane.text +="</table>"
class dropHandler(java.awt.dnd.DropTargetAdapter):
def __init__(self):
java.awt.dnd.DropTargetAdapter.__init__(self)
def drop(self, evt):
if not evt.transferable.isDataFlavorSupported(java.awt.datatransfer.DataFlavor.javaFileListFlavor):
return
evt.acceptDrop(-1)
names = evt.transferable.getTransferData(java.awt.datatransfer.DataFlavor.javaFileListFlavor)
OnDropFiles(names)
def decorate(frame):
global pane
frame.setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE)
frame.title = "Jython - Drophash"
frame.layout = java.awt.BorderLayout()
pane = javax.swing.JLabel()
pane.border = javax.swing.BorderFactory.createEmptyBorder(5,5,5,5)
frame.contentPane.add(javax.swing.JScrollPane(pane), java.awt.BorderLayout.CENTER)
pane.text = "<html>"
icon = java.awt.Toolkit.getDefaultToolkit().createImage("drophash.png")
frame.setIconImage(icon)
target = java.awt.dnd.DropTarget(pane, dropHandler())
width = 800
height = 600
frame.setSize(width, height);
screenDim = java.awt.Toolkit.getDefaultToolkit().getScreenSize();
frame.setLocation(
(screenDim.width - width) / 2,
(screenDim.height - height) / 2
)
if __name__ == "__main__":
frame = javax.swing.JFrame()
decorate(frame)
frame.visible = True
Made with Cascading Style Sheets


No comments:
Post a Comment