net.sf.jhylafax.AbstractQueuePanel.java Source code

Java tutorial

Introduction

Here is the source code for net.sf.jhylafax.AbstractQueuePanel.java

Source

/**
 * JHylaFax - A java client for HylaFAX.
 *
 * Copyright (C) 2005 by Steffen Pingel <steffenp@gmx.de>
 *
 * 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., 675 Mass Ave, Cambridge, MA 02139, USA.
 */
package net.sf.jhylafax;

import static net.sf.jhylafax.JHylaFAX.i18n;
import java.awt.BorderLayout;
import java.awt.FlowLayout;
import java.awt.event.ActionEvent;
import java.io.File;
import java.io.IOException;
import java.util.Date;
import javax.swing.Action;
import javax.swing.JFileChooser;
import javax.swing.JMenuItem;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JPopupMenu;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.ListSelectionModel;
import javax.swing.event.ListSelectionEvent;
import javax.swing.event.ListSelectionListener;
import javax.swing.table.TableModel;
import net.sf.jhylafax.JobHelper.FileStat;
import net.sf.jhylafax.fax.FaxJob;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.xnap.commons.gui.ColoredTable;
import org.xnap.commons.gui.Dialogs;
import org.xnap.commons.gui.action.AbstractXNapAction;
import org.xnap.commons.gui.table.FilesizeCellRenderer;
import org.xnap.commons.gui.table.StringCellRenderer;
import org.xnap.commons.gui.table.TableLayout;
import org.xnap.commons.gui.table.TableSorter;
import org.xnap.commons.gui.util.GUIHelper;
import org.xnap.commons.gui.util.PopupListener;
import org.xnap.commons.settings.SettingStore;
import org.xnap.commons.util.StringHelper;

/**
 * A generic panel that displays a list of {@link net.sf.jhylafax.fax.FaxJob} 
 * objects in a table.
 *  
 * @author Steffen Pingel
 */
public abstract class AbstractQueuePanel extends JPanel implements ListSelectionListener, LocaleChangeListener {

    private final static Log logger = LogFactory.getLog(AbstractQueuePanel.class);

    private String[] defaultColumns;
    private String queueName;
    private ColoredTable queueTable;
    private TableLayout queueTableLayout;
    private ResetQueueTableAction resetQueueTableAction;
    private JPanel buttonPanel;
    private JPopupMenu tablePopupMenu;

    public AbstractQueuePanel(String queueName) {
        this.queueName = queueName;

        setLayout(new BorderLayout());
        setBorder(GUIHelper.createEmptyBorder(10));

        resetQueueTableAction = new ResetQueueTableAction();

        tablePopupMenu = new JPopupMenu();

        TableSorter sorter = new TableSorter(getTableModel());
        queueTable = new ColoredTable(sorter);
        queueTableLayout = new TableLayout(queueTable);
        initializeTableLayout();
        queueTableLayout.getHeaderPopupMenu().add(new JMenuItem(resetQueueTableAction));
        add(new JScrollPane(queueTable), BorderLayout.CENTER);

        queueTable.setShowVerticalLines(true);
        queueTable.setShowHorizontalLines(false);
        queueTable.setAutoCreateColumnsFromModel(true);
        queueTable.setIntercellSpacing(new java.awt.Dimension(2, 1));
        queueTable.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
        queueTable.getSelectionModel().addListSelectionListener(this);
        queueTable.addMouseListener(new PopupListener(tablePopupMenu));

        queueTable.setDefaultRenderer(Long.class, new FilesizeCellRenderer());
        queueTable.setDefaultRenderer(String.class, new StringCellRenderer());
        queueTable.setDefaultRenderer(Date.class, new TimeCellRenderer());
        queueTable.setDefaultRenderer(FaxJob.State.class, new StateCellRenderer());

        buttonPanel = new JPanel(new FlowLayout());
        add(buttonPanel, BorderLayout.SOUTH);
    }

    protected File createTempFile(String filename) {
        try {
            // TODO should preserve extension of downloaded file
            File tempFile = File.createTempFile("jhylafax", null);
            tempFile.deleteOnExit();
            return tempFile;
        } catch (IOException e) {
            logger.debug("Error creating temporary file", e);
            JHylaFAX.getInstance().showError(i18n.tr("Error creating temporary file"), e);
            return null;
        }
    }

    public String getAbsolutePath(String filename) {
        return getQueueName() + "/" + filename;
    }

    public String getQueueName() {
        return queueName;
    }

    public abstract FileStat getSelectedFile();

    protected abstract TableModel getTableModel();

    protected TableLayout getTableLayout() {
        return queueTableLayout;
    }

    protected JTable getTable() {
        return queueTable;
    }

    protected JPopupMenu getTablePopupMenu() {
        return tablePopupMenu;
    }

    protected JPanel getButtonPanel() {
        return buttonPanel;
    }

    protected int getSelectedRow() {
        int row = queueTable.getSelectedRow();
        return (row == -1) ? -1 : ((TableSorter) queueTable.getModel()).mapToIndex(row);
    }

    protected abstract void initializeTableLayout();

    public void restoreLayout(SettingStore store, String[] defaultColumns) {
        this.defaultColumns = defaultColumns;

        store.restoreTable(getQueueName(), defaultColumns, queueTableLayout);
    }

    public void saveLayout(SettingStore store) {
        store.saveTable(getQueueName(), queueTableLayout);
    }

    public abstract void updateActions();

    public void updateLabels() {
        resetQueueTableAction.putValue(Action.NAME, i18n.tr("Reset to Defaults"));
    }

    public void resetTable() {
        initializeTableLayout();
        getTableLayout().setColumnsVisible(defaultColumns);
        queueTable.getTableHeader().revalidate();
    }

    public void valueChanged(ListSelectionEvent e) {
        updateActions();
    }

    protected class DeleteAction extends AbstractXNapAction {

        public DeleteAction() {
            putValue(ICON_FILENAME, "editdelete.png");
        }

        public void actionPerformed(ActionEvent e) {
            FileStat selectedFile = getSelectedFile();
            if (selectedFile == null) {
                return;
            }

            if (Dialogs.showConfirmDialog(JHylaFAX.getInstance(),
                    i18n.tr("Do you really want to delete the file {0}?", selectedFile.filename),
                    i18n.tr("Delete File"), JOptionPane.YES_NO_OPTION,
                    Settings.CONFIRM_DELETE) == JOptionPane.YES_OPTION) {
                JobHelper.delete(getAbsolutePath(selectedFile.filename));
            }
        }

        public void updateLabels() {
            putValue(Action.NAME, i18n.tr("Delete"));
        }

    }

    protected class ResetQueueTableAction extends AbstractXNapAction {

        public ResetQueueTableAction() {
        }

        public void actionPerformed(ActionEvent event) {
            resetTable();
        }

    }

    protected class SaveAction extends AbstractXNapAction {

        public SaveAction() {
            putValue(ICON_FILENAME, "filesaveas.png");
        }

        public void actionPerformed(ActionEvent e) {
            FileStat selectedFile = getSelectedFile();
            if (selectedFile == null) {
                return;
            }

            JFileChooser chooser = new JFileChooser();
            chooser.setSelectedFile(new File(StringHelper.lastToken(selectedFile.filename, "/")));
            if (chooser.showSaveDialog(JHylaFAX.getInstance()) == JFileChooser.APPROVE_OPTION) {
                // TODO show warning, if file exists
                JobHelper.save(chooser.getSelectedFile(), getAbsolutePath(selectedFile.filename),
                        selectedFile.filesize);
            }
        }

        public void updateLabels() {
            putValue(Action.NAME, i18n.tr("Save"));
        }

    }

    protected class ViewAction extends AbstractXNapAction {

        public ViewAction() {
            putValue(ICON_FILENAME, "viewmag.png");
        }

        public void actionPerformed(ActionEvent event) {
            FileStat selectedFile = getSelectedFile();
            if (selectedFile == null) {
                return;
            }

            String viewerPath = JHylaFAXHelper.getViewerPath(getQueueName());
            if (viewerPath != null) {
                File tempFile = createTempFile(selectedFile.filename);
                if (tempFile != null && JobHelper.save(tempFile, getAbsolutePath(selectedFile.filename),
                        selectedFile.filesize)) {
                    JHylaFAXHelper.view(viewerPath, new File[] { tempFile });
                }
            }
        }

        public void updateLabels() {
            putValue(Action.NAME, i18n.tr("View"));
            putValue(Action.LONG_DESCRIPTION, i18n.tr("The selected file is opened in an external viewer."));
        }

    }

}