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