Java tutorial
/* * PHEX - The pure-java Gnutella-servent. * Copyright (C) 2001 - 2007 Phex Development Group * * 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 * * --- CVS Information --- * $Id: NewDownloadDialog.java 4412 2009-03-22 13:40:44Z ArneBab $ */ package phex.gui.dialogs; import java.awt.BorderLayout; import java.awt.Container; import java.awt.Dimension; import java.awt.HeadlessException; import java.awt.Image; import java.awt.Toolkit; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.WindowAdapter; import java.awt.event.WindowEvent; import java.awt.image.FilteredImageSource; import java.awt.image.ImageProducer; import java.awt.image.RGBImageFilter; import java.io.File; import javax.swing.Icon; import javax.swing.ImageIcon; import javax.swing.JButton; import javax.swing.JDialog; import javax.swing.JFileChooser; import javax.swing.JLabel; import javax.swing.JPanel; import javax.swing.JSeparator; import javax.swing.JTabbedPane; import javax.swing.JTextField; import org.apache.commons.httpclient.URI; import org.apache.commons.httpclient.URIException; import phex.common.URN; import phex.common.log.NLogger; import phex.download.MagnetData; import phex.download.swarming.SwarmingManager; import phex.gui.common.DialogBanner; import phex.gui.common.GUIRegistry; import phex.gui.common.GUIUtils; import phex.gui.common.HTMLMultiLinePanel; import phex.servent.Servent; import phex.share.SharedFilesService; import phex.utils.InternalFileHandler; import phex.utils.Localizer; import com.jgoodies.forms.builder.PanelBuilder; import com.jgoodies.forms.factories.ButtonBarFactory; import com.jgoodies.forms.layout.CellConstraints; import com.jgoodies.forms.layout.FormLayout; /** * */ public class NewDownloadDialog extends JDialog { public static final int URI_DOWNLOAD = 1; public static final int MAGMA_DOWNLOAD = 2; public static final int RSS_DOWNLOAD = 3; private JTextField uriTF; private JTextField magmaTF; private JTextField rssTF; private JTabbedPane downloadTabPane; /** * @throws java.awt.HeadlessException */ public NewDownloadDialog() throws HeadlessException { super(GUIRegistry.getInstance().getMainFrame(), Localizer.getString("NewDownload_DialogTitle"), false); prepareComponent(); } /** * @throws java.awt.HeadlessException */ public NewDownloadDialog(String downloadValue, int type) throws HeadlessException { super(GUIRegistry.getInstance().getMainFrame(), Localizer.getString("NewDownload_DialogTitle"), false); prepareComponent(); switch (type) { case URI_DOWNLOAD: uriTF.setText(downloadValue); downloadTabPane.setSelectedIndex(0); break; case MAGMA_DOWNLOAD: magmaTF.setText(downloadValue); downloadTabPane.setSelectedIndex(1); break; case RSS_DOWNLOAD: rssTF.setText(downloadValue); downloadTabPane.setSelectedIndex(2); break; } } /** * */ private void prepareComponent() { addWindowListener(new WindowAdapter() { @Override public void windowClosing(WindowEvent evt) { closeDialog(); } }); CellConstraints cc = new CellConstraints(); Container contentPane = getContentPane(); contentPane.setLayout(new BorderLayout()); JPanel contentPanel = new JPanel(); //JPanel contentPanel = new FormDebugPanel(); contentPane.add(contentPanel, BorderLayout.CENTER); FormLayout layout = new FormLayout("2dlu, fill:d:grow, 2dlu", // columns "p, p, 2dlu, p, 6dlu, p, 3dlu, p 6dlu"); //row PanelBuilder builder = new PanelBuilder(layout, contentPanel); DialogBanner banner = new DialogBanner(Localizer.getString("NewDownload_BannerHeader"), Localizer.getString("NewDownload_BannerSubHeader")); builder.add(banner, cc.xywh(1, 1, 3, 1)); builder.add(new JSeparator(), cc.xywh(1, 2, 3, 1)); downloadTabPane = new JTabbedPane(); JPanel urlPanel = createByUrlPanel(); downloadTabPane.addTab(Localizer.getString("NewDownload_ByUrl"), urlPanel); JPanel magmaPanel = createByMagmaPanel(); downloadTabPane.addTab(Localizer.getString("NewDownload_ByMagmaFile"), magmaPanel); JPanel rssPanel = createByRSSPanel(); downloadTabPane.addTab(Localizer.getString("NewDownload_ByRSSFile"), rssPanel); builder.add(downloadTabPane, cc.xy(2, 4)); builder.add(new JSeparator(), cc.xywh(1, 6, 3, 1)); JButton cancelBtn = new JButton(Localizer.getString("Cancel")); cancelBtn.addActionListener(new CancelBtnListener()); JButton okBtn = new JButton(Localizer.getString("OK")); okBtn.addActionListener(new OkBtnListener()); JPanel btnPanel = ButtonBarFactory.buildOKCancelBar(okBtn, cancelBtn); builder.add(btnPanel, cc.xy(2, 8)); pack(); setLocationRelativeTo(getParent()); } /** * @param cc * @param builder */ private JPanel createByUrlPanel() { CellConstraints cc = new CellConstraints(); FormLayout layout = new FormLayout("6dlu, d, 2dlu, d, fill:d:grow, 6dlu", // columns "10dlu, p, 10dlu, p, 6dlu, p, 6dlu"); //row JPanel panel = new JPanel(); //JPanel panel = new FormDebugPanel(); PanelBuilder builder = new PanelBuilder(layout, panel); JLabel label = new JLabel(Localizer.getString("NewDownload_UrlToDownload")); builder.add(label, cc.xy(2, 2)); uriTF = new JTextField(40); builder.add(uriTF, cc.xywh(4, 2, 2, 1)); builder.addSeparator(Localizer.getString("NewDownload_Examples"), cc.xywh(2, 4, 4, 1)); JPanel examplesPanel = new JPanel(); builder.add(examplesPanel, cc.xywh(2, 6, 4, 1)); FormLayout examplesLayout = new FormLayout("2dlu, d", // columns "p, 3dlu, p"); //row PanelBuilder examplesBuilder = new PanelBuilder(examplesLayout, examplesPanel); examplesBuilder.addLabel("http://www.host.com/path/file.zip", cc.xy(2, 1)); examplesBuilder.addLabel("magnet:?xt=urn:sha1:AABBCCDDEEFFGGHHIIJJKKLLMMNNOOPP", cc.xy(2, 3)); return panel; } /** * @param cc * @param builder */ private JPanel createByMagmaPanel() { CellConstraints cc = new CellConstraints(); FormLayout layout = new FormLayout("6dlu, d, 2dlu, d, fill:d:grow, 2dlu, d, 6dlu", // columns "10dlu, p, 10dlu, p, 6dlu, p, 6dlu"); //row //JPanel panel = new FormDebugPanel(); JPanel panel = new JPanel(); // panel.setFillEntireArea(false); // panel.setTileImage(false); // panel.setAlignment(FWImagePanel.ALIGN_LEFT); // TransImageFilter filter = new TransImageFilter( ); // ImageIcon img = (ImageIcon) GUIRegistry.getInstance().getIconFactory().getIcon("MagmaBackground"); // ImageProducer prod = new FilteredImageSource(((ImageIcon) img) // .getImage().getSource(), filter); // Image grayImage = Toolkit.getDefaultToolkit().createImage(prod); // img = new ImageIcon(grayImage); // panel.setImage(img); PanelBuilder builder = new PanelBuilder(layout, panel); JLabel label = new JLabel(Localizer.getString("NewDownload_MagmaFile")); builder.add(label, cc.xy(2, 2)); magmaTF = new JTextField(30); builder.add(magmaTF, cc.xywh(4, 2, 2, 1)); builder.addSeparator(Localizer.getString("NewDownload_CreatingMagma"), cc.xywh(2, 4, 7, 1)); HTMLMultiLinePanel magmaHowTo = new HTMLMultiLinePanel(Localizer.getString("NewDownload_MagmaHowTo")) { @Override public Dimension getPreferredSize() { return new Dimension(0, super.getPreferredSize().height); } }; builder.add(magmaHowTo, cc.xywh(2, 6, 6, 1)); JButton button = new JButton(Localizer.getString("NewDownload_Browse")); button.addActionListener(new SetDownlodDirectoryListener()); builder.add(button, cc.xy(7, 2)); return panel; } /** * @param cc * @param builder */ private JPanel createByRSSPanel() { CellConstraints cc = new CellConstraints(); FormLayout layout = new FormLayout("6dlu, d, 2dlu, d, fill:d:grow, 2dlu, d, 6dlu", // columns "10dlu, p, 10dlu, p, 6dlu, p, 6dlu"); //row //JPanel panel = new FormDebugPanel(); JPanel panel = new JPanel(); // panel.setFillEntireArea(false); // panel.setTileImage(false); // panel.setAlignment(FWImagePanel.ALIGN_LEFT); // TransImageFilter filter = new TransImageFilter( ); // ImageIcon img = (ImageIcon) GUIRegistry.getInstance().getIconFactory().getIcon("RSSBackground"); // ImageProducer prod = new FilteredImageSource(((ImageIcon) img) // .getImage().getSource(), filter); // Image grayImage = Toolkit.getDefaultToolkit().createImage(prod); // img = new ImageIcon(grayImage); // panel.setImage(img); PanelBuilder builder = new PanelBuilder(layout, panel); JLabel label = new JLabel(Localizer.getString("NewDownload_RSSFile")); builder.add(label, cc.xy(2, 2)); rssTF = new JTextField(30); builder.add(rssTF, cc.xywh(4, 2, 2, 1)); builder.addSeparator(Localizer.getString("NewDownload_CreatingRSS"), cc.xywh(2, 4, 7, 1)); HTMLMultiLinePanel rssHowTo = new HTMLMultiLinePanel(Localizer.getString("NewDownload_RSSHowTo")) { @Override public Dimension getPreferredSize() { return new Dimension(0, super.getPreferredSize().height); } }; builder.add(rssHowTo, cc.xywh(2, 6, 6, 1)); JButton button = new JButton(Localizer.getString("NewDownload_Browse")); button.addActionListener(new SetDownlodDirectoryListener()); builder.add(button, cc.xy(7, 2)); return panel; } private void createNewDownload() throws URIException { Servent servent = GUIRegistry.getInstance().getServent(); SwarmingManager swarmingMgr = servent.getDownloadService(); SharedFilesService shareService = servent.getSharedFilesService(); String uriStr = uriTF.getText().trim(); if (uriStr.length() == 0) { return; } URI uri = new URI(uriStr, true); String protocol = uri.getScheme(); // in case this is no magnet we cant determine the file urn and cant // check if the download is already running. if ("magnet".equals(protocol)) { MagnetData magnetData = MagnetData.parseFromURI(uri); URN urn = MagnetData.lookupSHA1URN(magnetData); if (swarmingMgr.isURNDownloaded(urn)) { GUIUtils.showErrorMessage(Localizer.getString("NewDownload_AlreadyDownloadingMessage"), Localizer.getString("NewDownload_AlreadyDownloadingTitle")); return; } if (shareService.isURNShared(urn)) { GUIUtils.showErrorMessage(Localizer.getString("NewDownload_AlreadySharedMessage"), Localizer.getString("NewDownload_AlreadySharedTitle")); return; } } swarmingMgr.addFileToDownload(uri, true); } private void createNewMagmaDownload() { String magmaFileName = magmaTF.getText().trim(); if (magmaFileName.length() == 0) { return; } File file = new File(magmaFileName); if (!file.exists()) { return; } InternalFileHandler.magmaReadout(file); } private void createNewRSSDownload() { String rssFileName = rssTF.getText().trim(); if (rssFileName.length() == 0) { return; } File file = new File(rssFileName); if (!file.exists()) { return; } InternalFileHandler.rssReadout(file); } private void closeDialog() { setVisible(false); dispose(); } private class SetDownlodDirectoryListener implements ActionListener { public void actionPerformed(ActionEvent e) { try { JFileChooser chooser = new JFileChooser(); chooser.setSelectedFile(new File(magmaTF.getText())); chooser.setSelectedFile(new File(rssTF.getText())); chooser.setAcceptAllFileFilterUsed(false); chooser.setFileSelectionMode(JFileChooser.FILES_ONLY); chooser.setMultiSelectionEnabled(false); chooser.setDialogTitle(Localizer.getString("NewDownload_SelectMagmaFile")); chooser.setApproveButtonText(Localizer.getString("Select")); chooser.setApproveButtonMnemonic(Localizer.getChar("SelectMnemonic")); int returnVal = chooser.showDialog(NewDownloadDialog.this, null); if (returnVal == JFileChooser.APPROVE_OPTION) { String directory = chooser.getSelectedFile().getAbsolutePath(); magmaTF.setText(directory); rssTF.setText(directory); } } catch (Throwable th) { NLogger.error(SetDownlodDirectoryListener.class, th, th); } } } private final class OkBtnListener implements ActionListener { public void actionPerformed(ActionEvent e) { try { createNewDownload(); createNewMagmaDownload(); createNewRSSDownload(); closeDialog(); } catch (URIException exp) { NLogger.error(OkBtnListener.class, exp, exp); GUIUtils.showErrorMessage(Localizer.getString("NewDownload_FailedToCreateDownloadMessage"), Localizer.getString("NewDownload_FailedToCreateDownloadTitle")); } catch (Throwable th) { NLogger.error(OkBtnListener.class, th, th); } } } private final class CancelBtnListener implements ActionListener { public void actionPerformed(ActionEvent e) { try { closeDialog(); } catch (Throwable th) { NLogger.error(CancelBtnListener.class, th, th); } } } static class TransImageFilter extends RGBImageFilter { public static Icon createTransIcon(Icon icon) { TransImageFilter filter = new TransImageFilter(); ImageProducer prod = new FilteredImageSource(((ImageIcon) icon).getImage().getSource(), filter); Image grayImage = Toolkit.getDefaultToolkit().createImage(prod); return new ImageIcon(grayImage); } /** * @param b * @param p */ public TransImageFilter() { canFilterIndexColorModel = true; } @Override public int filterRGB(int x, int y, int rgb) { rgb = rgb & 0x33FFFFFF; return rgb; } } }