Java tutorial
/* * EMailPlugin by Bodo Tasche * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * * SVN information: * $Date: 2010-01-30 17:12:46 +0100 (Sat, 30 Jan 2010) $ * $Author: bananeweizen $ * $Revision: 6426 $ */ package emailplugin; import java.awt.Desktop; import java.awt.FlowLayout; import java.awt.Frame; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.io.UnsupportedEncodingException; import java.net.URI; import java.net.URLEncoder; import javax.swing.ButtonGroup; import javax.swing.JButton; import javax.swing.JCheckBox; import javax.swing.JDialog; import javax.swing.JOptionPane; import javax.swing.JPanel; import javax.swing.JRadioButton; import javax.swing.JRootPane; import org.apache.commons.lang.StringUtils; import tvbrowser.ui.mainframe.MainFrame; import util.exc.ErrorHandler; import util.io.ExecutionHandler; import util.misc.OperatingSystem; import util.paramhandler.ParamParser; import util.program.AbstractPluginProgramFormating; import util.ui.Localizer; import util.ui.UiUtilities; import util.ui.WindowClosingIf; import com.jgoodies.forms.factories.Borders; import com.jgoodies.forms.layout.CellConstraints; import com.jgoodies.forms.layout.FormLayout; import devplugin.Plugin; import devplugin.Program; /** * This class creates the Mail and launches the Mail-Application. * If no Mail-Application is found, it asks the User to specify the App. * * @author bodum */ public class MailCreator { /** Settings for this Plugin */ private EMailSettings mSettings; private AbstractPluginProgramFormating mFormatting; /** The Plugin */ private EMailPlugin mPlugin; /** Localizer */ private Localizer mLocalizer = Localizer.getLocalizerFor(MailCreator.class); /** * Create the MailCreator * @param plugin Plugin to use * @param settings Settings for this MailCreator * @param formatting The program formatting to use. */ public MailCreator(EMailPlugin plugin, EMailSettings settings, AbstractPluginProgramFormating formatting) { mPlugin = plugin; mSettings = settings; mFormatting = formatting; } /** * Create the Mail * * @param parent Parent-Frame for Dialogs * @param program Programs to show in the Mail */ void createMail(Frame parent, Program[] program) { final String param = mFormatting.getContentValue();// mSettings.getProperty("paramToUse", // EMailPlugin.DEFAULT_PARAMETER); final StringBuilder result = new StringBuilder(); ParamParser parser = new ParamParser(); int i = 0; while (!parser.hasErrors() && (i < program.length)) { String prgResult = parser.analyse(param, program[i]); result.append(prgResult).append("\n\n"); i++; } if (parser.showErrors(UiUtilities.getLastModalChildOf(parent))) { return; } mail(parent, result.toString(), parser.analyse(mFormatting.getTitleValue(), program[0])); } private void mail(final Frame parent, final String content, final String title) { // Java 6 desktop API boolean sent = false; if (Desktop.isDesktopSupported()) { Desktop desktop = Desktop.getDesktop(); try { URI uriMailTo = new URI("mailto", "?body=" + content + "&subject=" + title, null); desktop.mail(uriMailTo); sent = true; } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } } if (sent) { return; } // fall back to non Java 6 code try { final String mailTo = "mailto:?body=" + encodeString(content) + "&subject=" + encodeString(title); String application; String execparam; if ((OperatingSystem.isMacOs() || OperatingSystem.isWindows()) && mSettings.getUseDefaultApplication()) { if (OperatingSystem.isMacOs()) { application = "/usr/bin/open"; execparam = mailTo; } else { application = "rundll32.exe"; execparam = "url.dll,FileProtocolHandler " + mailTo; } } else if (StringUtils.isBlank(mSettings.getApplication())) { if (OperatingSystem.isOther()) { if (!showKdeGnomeDialog(parent)) { return; } application = mSettings.getApplication(); execparam = getContentParameter(content); } else { showNotConfiguredCorrectly(parent); return; } } else { application = mSettings.getApplication(); execparam = getContentParameter(content); } new ExecutionHandler(execparam, application).execute(); if (mSettings.getShowEmailOpened()) { showEMailOpenedDialog(parent); } } catch (Exception e) { e.printStackTrace(); int ret = ErrorHandler.handle( mLocalizer.msg("ErrorWhileStarting", "Error while starting mail application"), e, ErrorHandler.SHOW_YES_NO); if (ret == ErrorHandler.YES_PRESSED) { MainFrame.getInstance().showSettingsDialog(mPlugin); } } } private String getContentParameter(String content) throws UnsupportedEncodingException { ParamParser parser = new ParamParser(new EMailParamLibrary(content)); String string = "mailto:?body=" + encodeString(parser.analyse(mSettings.getParameter(), null)); return string; } /** * Encodes a String into an Url-Encoded String * * @param string String to Encode * @return URL-Encoded String * @throws UnsupportedEncodingException Problems during encoding */ private String encodeString(String string) throws UnsupportedEncodingException { return URLEncoder.encode(string.trim(), StringUtils .replace(mFormatting.getEncodingValue()/*.getProperty("encoding", "UTF-8"))*/, "+", "%20")); } /** * Show the EMail-Open Dialog. * * This Dialog says that the EMail should have been opened. It gives the User * a chance to specify another EMail Program if it went wrong. * * @param parent * Parent-Frame */ private void showEMailOpenedDialog(Frame parent) { final JDialog dialog = new JDialog(parent, true); dialog.setTitle(mLocalizer.msg("EMailOpenedTitel", "Email was opened")); JPanel panel = (JPanel) dialog.getContentPane(); panel.setLayout(new FormLayout("fill:200dlu:grow", "default, 3dlu, default, 3dlu, default")); panel.setBorder(Borders.DIALOG_BORDER); CellConstraints cc = new CellConstraints(); panel.add(UiUtilities.createHelpTextArea(mLocalizer.msg("EMailOpened", "Email was opened. Configure it?")), cc.xy(1, 1)); final JCheckBox dontShowAgain = new JCheckBox( mLocalizer.msg("DontShowAgain", "Don't show this Dialog again")); panel.add(dontShowAgain, cc.xy(1, 3)); JButton configure = new JButton(mLocalizer.msg("configure", "Configure")); configure.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { Plugin.getPluginManager().showSettings(mPlugin); dialog.setVisible(false); } }); JButton ok = new JButton(Localizer.getLocalization(Localizer.I18N_OK)); ok.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { if (dontShowAgain.isSelected()) { mSettings.setShowEmailOpened(false); } dialog.setVisible(false); } }); JPanel buttonPanel = new JPanel(new FlowLayout(FlowLayout.RIGHT)); buttonPanel.add(configure); buttonPanel.add(ok); panel.add(buttonPanel, cc.xy(1, 5)); UiUtilities.registerForClosing(new WindowClosingIf() { public void close() { dialog.setVisible(false); } public JRootPane getRootPane() { return dialog.getRootPane(); } }); dialog.getRootPane().setDefaultButton(ok); dialog.pack(); UiUtilities.centerAndShow(dialog); } /** * Shows a Warning if the Plugin was not configured correctly. * * @param parent Parent-Dialog */ private void showNotConfiguredCorrectly(Frame parent) { int ret = JOptionPane.showConfirmDialog(parent, mLocalizer.msg("NotConfiguredCorrectly", "Not configured correctly"), Localizer.getLocalization(Localizer.I18N_ERROR), JOptionPane.YES_NO_OPTION, JOptionPane.ERROR_MESSAGE); if (ret == JOptionPane.YES_OPTION) { Plugin.getPluginManager().showSettings(mPlugin); } } /** * Gives the User the opportunity to specify which Desktop he uses (KDE or * Gnome) * * @param parent * Parent Dialog * @return true if KDE or Gnome has been selected, false if the User wanted to * specify the App */ private boolean showKdeGnomeDialog(Frame parent) { final JDialog dialog = new JDialog(parent, true); dialog.setTitle(mLocalizer.msg("chooseTitle", "Choose")); JPanel panel = (JPanel) dialog.getContentPane(); panel.setLayout(new FormLayout("10dlu, fill:pref:grow", "default, 3dlu, default, 3dlu, default, 3dlu, default, 3dlu:grow, default")); panel.setBorder(Borders.DIALOG_BORDER); CellConstraints cc = new CellConstraints(); panel.add(UiUtilities.createHelpTextArea(mLocalizer.msg("cantConfigure", "Can't configure on your system")), cc.xyw(1, 1, 2)); JRadioButton kdeButton = new JRadioButton(mLocalizer.msg("kde", "I am using KDE")); panel.add(kdeButton, cc.xy(2, 3)); JRadioButton gnomeButton = new JRadioButton(mLocalizer.msg("gnome", "I am using Gnome")); panel.add(gnomeButton, cc.xy(2, 5)); JRadioButton selfButton = new JRadioButton(mLocalizer.msg("self", "I want to configure by myself")); panel.add(selfButton, cc.xy(2, 7)); ButtonGroup group = new ButtonGroup(); group.add(kdeButton); group.add(gnomeButton); group.add(selfButton); selfButton.setSelected(true); JButton ok = new JButton(Localizer.getLocalization(Localizer.I18N_OK)); ok.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { dialog.setVisible(false); } }); JPanel buttonPanel = new JPanel(new FlowLayout(FlowLayout.RIGHT)); buttonPanel.add(ok); panel.add(buttonPanel, cc.xy(2, 9)); UiUtilities.registerForClosing(new WindowClosingIf() { public void close() { dialog.setVisible(false); } public JRootPane getRootPane() { return dialog.getRootPane(); } }); dialog.getRootPane().setDefaultButton(ok); dialog.pack(); UiUtilities.centerAndShow(dialog); if (kdeButton.isSelected()) { mSettings.setApplication("kfmclient"); mSettings.setParameter("exec {content}"); } else if (gnomeButton.isSelected()) { mSettings.setApplication("gnome-open"); mSettings.setParameter("{content}"); } else { Plugin.getPluginManager().showSettings(mPlugin); return false; } return true; } }