"""
Submit_Download.py - A Jython Macro for jEdit that submits
a 'download' to community.jedit.org.

Copyright (C) 2002 Ollie Rutherfurd <oliver@rutherfurd.net>

$Id: Submit_Download.py 28 2003-03-25 22:40:28Z oliver $
"""

from java.awt import BorderLayout
from java.awt.event import ActionListener
from javax.swing import Box, BoxLayout, JButton, \
	JComboBox, JDialog, JLabel, JPanel, JScrollPane, \
	JTextArea, JTextField
from javax.swing.border import EmptyBorder

from org.gjt.sp.jedit import Macros, MiscUtilities
from org.gjt.sp.jedit.gui import VariableGridLayout

import httplib
import urllib


# settings to save and restore
AUTHOR_EMAIL = 'macro.py_submit_download.author-email'
AUTHOR_NAME = 'macro.py_submit_download.author-name'
CATEGORY = 'macro.py_submit_download.category'
HOMEPAGE = 'macros.py_submit_download.homepage'

# connection settings
ACTION = '/modules.php'
HEADERS = {'Content-type': 'application/x-www-form-urlencoded',
	'Accept': 'text/html',}
HOST = 'community.jedit.org:80'

# field maximum sizes (taken from upload page)
TITLE_MAX = 100
URL_MAX = 100
DESCRIPTION_MAX = 255
AUTHOR_NAME_MAX = 60
AUTHOR_EMAIL_MAX = 60
FILESIZE_MAX = 11
VERSION_MAX = 10
HOMEPAGE_MAX = 200

# download categories
CATEGORIES = {'CodeAid databases': '8',
	'Commando files': '11',
	'Edit Modes': '9',
	'Editor schemes': '10',
	'Libraries': '2',
	'Macros': '1',
	'Macros / BeanShell macros': '1-1',
	'Macros / Jython macros': '1-2',
	'Macros / Manilla macros': '1-3',
	'Patches and fixes': '6',
	'Plugin beta versions': '3',
	'Reference': '7',
	'Utilities': '5',
}

# look for this in HTML from server
SUCCESS_MSG = 'We received your download submission. Thank you!'


class SubmitDownloadDialog(JDialog,ActionListener):

	TITLE = 'Submit Download to community.jedit.org'

	def __init__(self,view,modal=1):
		JDialog.__init__(self,view,self.TITLE,modal)

		self.view=view

		panel=JPanel(BorderLayout(),border=EmptyBorder(12,12,12,12))
		self.setContentPane(panel)
		fields = JPanel(VariableGridLayout(VariableGridLayout.FIXED_NUM_COLUMNS,2,2,2))
		fields.add(JLabel('Program Name:'))
		self.programName = JTextField(25)
		fields.add(self.programName)
		fields.add(JLabel('Program Version:'))
		self.programVersion = JTextField(25)
		fields.add(self.programVersion)
		fields.add(JLabel('Homepage:'))
		self.homepage = JTextField(25)
		fields.add(self.homepage)
		fields.add(JLabel('Category:'))
		categories = CATEGORIES.keys()
		categories.sort()
		self.category = JComboBox(categories)
		fields.add(self.category)
		fields.add(JLabel('File URL:'))
		self.fileURL = JTextField(25)
		self.fileURL.setText('http://')
		fields.add(self.fileURL)
		fields.add(JLabel("Author's Name:"))
		self.authorName = JTextField(25)
		fields.add(self.authorName)
		fields.add(JLabel("Author's E-mail:"))
		self.authorEmail = JTextField(25)
		fields.add(self.authorEmail)
		fields.add(JLabel('Description:'))
		self.description=JTextArea(6,50)
		self.description.setLineWrap(1)
		fields.add(JScrollPane(self.description))

		panel.add(fields, BorderLayout.CENTER)

		buttons = JPanel(border=EmptyBorder(12,50,0,50))
		buttons.setLayout(BoxLayout(buttons, BoxLayout.X_AXIS))
		buttons.add(Box.createGlue())
		self.submit = JButton('Submit',actionListener=self)
		self.getRootPane().setDefaultButton(self.submit)
		buttons.add(self.submit)
		buttons.add(Box.createHorizontalStrut(6))
		close = JButton('Cancel',actionListener=self)
		self.submit.setPreferredSize(close.getPreferredSize())
		buttons.add(close)
		buttons.add(Box.createGlue())
		panel.add(buttons, BorderLayout.SOUTH)

		self.loadSettings()

		self.pack()
		self.setLocationRelativeTo(view)
		self.setDefaultCloseOperation(JDialog.DISPOSE_ON_CLOSE)
		self.setVisible(1)

	def submitDownload(self):
		try:
			url = self.fileURL.getText()[:URL_MAX]
			params = {'op': 'modload',
				'name': 'downloads',
				'file': 'index'}
			params['title'] = self.programName.getText()[:TITLE_MAX]
			params['url'] = url
			params['cat'] = CATEGORIES[str(self.category.getSelectedItem())]
			params['description'] = self.description.getText()[:DESCRIPTION_MAX]
			params['nname'] = self.authorName.getText()[:AUTHOR_NAME_MAX]
			params['email'] = self.authorEmail.getText()[:AUTHOR_EMAIL_MAX]
			params['filesize'] = '%d' % len(urllib.urlopen(url).read())
			params['version'] = self.programVersion.getText()[:VERSION_MAX]
			params['homepage'] = self.homepage.getText()[:HOMEPAGE_MAX]
			params['req'] = 'Add'
			params = urllib.urlencode(params)
			print params
			conn = httplib.HTTPConnection(HOST)
			conn.request('POST', ACTION, params, HEADERS)
			response = conn.getresponse()

			if str(response.status) != '200':
				Macros.error(self.view, 'Error submitting download: ' + str(response))
				return
			data = response.read()
			if data.find(SUCCESS_MSG) > -1:
				self.view.getStatus().setMessageAndClear('%s submitted to community.jedit.org' % (url,))
			else:
				Macros.error(self.view, "Didn't find `%s` in html from server." % (SUCCESS_MSG,))

		except Exception,e:
			Macros.error(self.view, 'Error submitting download: ' + str(e))

	def actionPerformed(self,evt):
		if evt.getSource() == self.submit:
			self.submitDownload()
			self.saveSettings()
		self.close()

	def saveSettings(self):
		if self.authorName.getText():
			jEdit.setProperty(AUTHOR_NAME,self.authorName.getText())
		if self.authorEmail.getText():
			jEdit.setProperty(AUTHOR_EMAIL,self.authorEmail.getText())
		jEdit.setProperty(CATEGORY,self.category.getSelectedItem())
		if self.homepage.getText():
			jEdit.setProperty(HOMEPAGE,self.homepage.getText())

	def loadSettings(self):
		self.authorName.setText(jEdit.getProperty(AUTHOR_NAME,''))
		self.authorEmail.setText(jEdit.getProperty(AUTHOR_EMAIL,''))
		category = jEdit.getProperty(CATEGORY,'')
		if category:
			self.category.setSelectedItem(category)
		self.homepage.setText(jEdit.getProperty(HOMEPAGE,'http://'))

	def close(self):
		"""
		Do cleanup and close dialog.
		"""
		self.view = None
		self.dispose()

def main():
	SubmitDownloadDialog(init.view)

if __name__ in ('__main__','main'):
	main()

# :indentSize=4:lineSeparator=\n:noTabs=false:tabSize=4:

