public void showDialog(final String fileName, final String description, final File file) throws IOException {
        final JDialog dialog = new JDialog((JFrame) null, Messages.getString("PandaDownload.title"), true);
        JPanel panel = new JPanel(new BorderLayout(5, 5));
        String descLine = "";

        if (description.length() > 0) {
            descLine = Messages.getString("PandaDownload.description") + description + "\n";
        }

        JPanel textPanel = new JPanel(new BorderLayout(5, 5));
        textPanel.setBorder(BorderFactory.createEmptyBorder(5, 5, 5, 5));

        JTextPane bodyText = new JTextPane();
        bodyText.setText(Messages.getString("PandaDownload.question") + "\n\n"
                + Messages.getString("PandaDownload.filename") + fileName + "\n"
                + descLine
                + Messages.getString("PandaDownload.size") + displaySize(file.length()) + "\n");
        bodyText.setOpaque(false);
        bodyText.setEditable(false);

        textPanel.add(bodyText, BorderLayout.CENTER);
        panel.add(new JLabel(GtkStockIcon.get("gtk-dialog-info")), BorderLayout.WEST);
        panel.add(textPanel, BorderLayout.CENTER);

        //buttons
        JPanel bar = new JPanel();
        bar.setLayout(new FlowLayout());
        panel.add(bar, BorderLayout.SOUTH);

        Button openButton = new Button(new AbstractAction(Messages.getString("PandaDownload.open")) {

            public void actionPerformed(ActionEvent e) {
                Desktop d = Desktop.getDesktop();
                if (Desktop.isDesktopSupported() && d.isSupported(Desktop.Action.OPEN)) {
                    try {
                        d.open(file);
                    } catch (IOException ex) {
                        System.out.println(ex);
                        JOptionPane.showMessageDialog(null, Messages.getString("PandaDownload.open_failure_message"), Messages.getString("PandaDownload.error"), JOptionPane.ERROR_MESSAGE);
                    }
                }
            }
        });
        bar.add(openButton);

        Button saveButton = new Button(new AbstractAction(Messages.getString("PandaDownload.save")) {

            public void actionPerformed(ActionEvent e) {
                String dir = prefs.get(PandaDownload.class.getName(), System.getProperty("user.home"));
                JFileChooser chooser = new JFileChooser(dir);
                chooser.setSelectedFile(new File(fileName));

                if (chooser.showSaveDialog(dialog) != JFileChooser.APPROVE_OPTION) {
                    return;
                }
                File selected = chooser.getSelectedFile();
                if (selected.exists() && selected.canWrite()) {
                    if (JOptionPane.showConfirmDialog(dialog, Messages.getString("FileEntry.ask_overwrite"), Messages.getString("FileEntry.question"), JOptionPane.YES_NO_OPTION) == JOptionPane.NO_OPTION) {  //$NON-NLS-2$
                        return;
                    }
                }
                prefs.put(PandaDownload.class.getName(), selected.getParent());
                try {
                    FileChannel srcChannel = new FileInputStream(file).getChannel();
                    FileChannel destChannel = new FileOutputStream(selected).getChannel();
                    try {
                        srcChannel.transferTo(0, srcChannel.size(), destChannel);
                    } finally {
                        srcChannel.close();
                        destChannel.close();
                    }
                    PopupNotify.popup(Messages.getString("PandaDownload.save_comp"),
                            selected.getAbsolutePath() + Messages.getString("PandaDownload.save_comp_msg"),
                            GtkStockIcon.get("gtk-dialog-info"), 0);
                } catch (IOException ex) {
                    logger.warn(ex);
                }
            }
        });
        bar.add(saveButton);

        Button closeButton = new Button(new AbstractAction(Messages.getString("PandaDownload.close")) {

            public void actionPerformed(ActionEvent e) {
                dialog.dispose();
            }
        });
        bar.add(closeButton);

        dialog.add(panel);
        dialog.pack();
        dialog.setResizable(false);
        dialog.setLocationRelativeTo((JFrame) null);
        dialog.setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);
        dialog.setVisible(true);
    }