net.sf.jhylafax.AbstractFaxDialog.java Source code

Java tutorial

Introduction

Here is the source code for net.sf.jhylafax.AbstractFaxDialog.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.Dimension;
import java.awt.event.ActionEvent;
import javax.swing.AbstractAction;
import javax.swing.Action;
import javax.swing.Box;
import javax.swing.ButtonGroup;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JRadioButton;
import javax.swing.JSpinner;
import javax.swing.JTextField;
import javax.swing.SpinnerDateModel;
import javax.swing.event.ChangeEvent;
import javax.swing.event.ChangeListener;
import net.sf.jhylafax.addressbook.AbstractContactTransferHandler;
import net.sf.jhylafax.fax.FaxHelper;
import net.sf.jhylafax.fax.FaxJob;
import net.wimpi.pim.contact.facades.SimpleContact;
import net.wimpi.pim.contact.model.Contact;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.xnap.commons.gui.Builder;
import org.xnap.commons.gui.DefaultDialog;
import org.xnap.commons.gui.Dialogs;
import org.xnap.commons.gui.action.AbstractXNapAction;
import org.xnap.commons.gui.completion.Completion;
import org.xnap.commons.gui.completion.DefaultCompletionModel;
import org.xnap.commons.settings.CompletionSettingDirector;
import com.jgoodies.forms.builder.DefaultFormBuilder;
import com.jgoodies.forms.layout.FormLayout;

public abstract class AbstractFaxDialog extends DefaultDialog implements LocaleChangeListener {

    private final static Log logger = LogFactory.getLog(AbstractQueuePanel.class);
    public static final int DEFAULT_COLUMNS = 20;

    private JobPanel jobPanel;
    private SpinnerDateModel dateModel;
    private FaxJob job;
    private JLabel dateLabel;
    private ParameterDialogAction parameterAction;
    private JRadioButton dateNowRadionButton;
    private JRadioButton dateLaterRadionButton;
    protected DefaultFormBuilder builder;
    private JTextField numberTextField;
    private JLabel numberLabel;
    private Completion numberCompletion;
    private DefaultCompletionModel numberCompletionModel;
    private AddressBookAction addressBookAction;

    public AbstractFaxDialog(JFrame owner) {
        super(owner, BUTTON_OKAY | BUTTON_CANCEL);

        FormLayout layout = new FormLayout("left:max(40dlu;pref), 3dlu, pref, 3dlu, min, min:grow", "");
        builder = new DefaultFormBuilder(layout);
        builder.setDefaultDialogBorder();
        setMainComponent(builder.getPanel());

        parameterAction = new ParameterDialogAction();
        getButtonPanel().add(Builder.createButton(parameterAction), 0);
    }

    protected void addNumberTextField() {
        Box box = Box.createHorizontalBox();

        addressBookAction = new AddressBookAction();

        numberTextField = new JTextField();
        numberTextField.setMaximumSize(new Dimension(Integer.MAX_VALUE, numberTextField.getPreferredSize().height));
        numberTextField.setTransferHandler(new ContactTransferHandler());
        //numberTextField.setDragEnabled(true);
        box.add(numberTextField);
        box.add(Box.createHorizontalStrut(4));
        box.add(Builder.createIconButton(addressBookAction));
        numberLabel = builder.append("", box, 4);
        builder.nextLine();

        numberCompletionModel = new DefaultCompletionModel();
        numberCompletion = Builder.addCompletion(numberTextField, numberCompletionModel);

        new CompletionSettingDirector(Settings.backstore, "number").restore(numberCompletion);
    }

    protected void addDateControls() {
        dateNowRadionButton = new JRadioButton();
        dateNowRadionButton.setSelected(true);
        dateLabel = builder.append("", dateNowRadionButton);
        builder.nextLine();

        dateLaterRadionButton = new JRadioButton();
        dateModel = new SpinnerDateModel();
        final JSpinner dateSpinner = new JSpinner(dateModel);
        dateSpinner.setEnabled(false);
        dateLaterRadionButton.addChangeListener(new ChangeListener() {
            public void stateChanged(ChangeEvent e) {
                dateSpinner.setEnabled(dateLaterRadionButton.isSelected());
            }
        });
        builder.append("", dateLaterRadionButton, dateSpinner);
        builder.nextLine();

        ButtonGroup buttonGroup = new ButtonGroup();
        buttonGroup.add(dateNowRadionButton);
        buttonGroup.add(dateLaterRadionButton);
    }

    @Override
    public boolean apply() {
        if (numberTextField != null) {
            if (numberTextField.getText().trim().length() == 0) {
                Dialogs.showError(this, i18n.tr("Please enter a number"), i18n.tr("JHylaFAX Error"));
                numberTextField.requestFocus();
                return false;
            }
            getJob().setNumber(FaxHelper.extractNumber(numberTextField.getText().trim()));
            numberCompletionModel.insert(numberTextField.getText());
            new CompletionSettingDirector(Settings.backstore, "number").save(numberCompletion);
        }

        if (dateNowRadionButton != null) {
            job.setSendTime((dateNowRadionButton.isSelected()) ? null : dateModel.getDate());
        }
        return true;
    }

    public FaxJob getJob() {
        return job;
    }

    public void updateLabels() {
        if (numberTextField != null) {
            numberLabel.setText(i18n.tr("Number"));
        }
        if (dateNowRadionButton != null) {
            dateLabel.setText(i18n.tr("Date"));
            dateNowRadionButton.setText(i18n.tr("Now"));
            dateLaterRadionButton.setText(i18n.tr("Later"));
        }
        parameterAction.updateLabels();
    }

    public void revert() {
        if (numberTextField != null) {
            numberTextField.setText(getJob().getNumber());
        }
        if (dateNowRadionButton != null) {
            if (getJob().getSendTime() == null) {
                dateNowRadionButton.setSelected(true);
            } else {
                dateLaterRadionButton.setSelected(true);
                dateModel.setValue(job.getSendTime());
            }
        }
    }

    public void setJob(FaxJob job) {
        this.job = job;
    }

    public void setNumber(String number) {
        if (numberTextField != null) {
            numberTextField.setText(number);
        }
    }

    private class ParameterDialogAction extends AbstractXNapAction implements LocaleChangeListener {

        private JobDialog dialog;

        public ParameterDialogAction() {
            //putValue(ICON_FILENAME, "configure.png");
        }

        public void actionPerformed(ActionEvent e) {
            if (job == null) {
                return;
            }

            if (dialog == null) {
                dialog = new JobDialog(job);
                dialog.setLocationRelativeTo(AbstractFaxDialog.this);
                dialog.setModal(true);
            }

            if (!dialog.isVisible()) {
                dialog.revert();
                dialog.getJobPanel().setSenderEditable(getJob().getID() == -1);
                dialog.setVisible(true);
            }
        }

        public void updateLabels() {
            parameterAction.putValue(Action.NAME, i18n.tr("Parameter..."));
            parameterAction.putValue(Action.SHORT_DESCRIPTION,
                    i18n.tr("Opens a dialog for entering job parameter"));

            if (dialog != null) {
                dialog.updateLabels();
            }
        }

    }

    private class InsertNumberAction extends AbstractAction {

        private boolean visible;

        public InsertNumberAction() {
            visible = JHylaFAX.getInstance().getAddressBook().isVisible();
        }

        public void actionPerformed(ActionEvent e) {
            SimpleContact[] contacts = JHylaFAX.getInstance().getAddressBook().getSelectedContacts();
            if (contacts.length > 0) {
                // TODO this is locale dependent
                String receipient = add("", "", contacts[0].getFirstname());
                receipient = add(receipient, " ", contacts[0].getLastname());
                receipient = add(receipient, ", ", contacts[0].getCompany());
                receipient += " <" + contacts[0].getFaxNumber() + ">";

                setNumber(receipient);
            }
            JHylaFAX.getInstance().getAddressBook().setDoubleClickAction(null);
            JHylaFAX.getInstance().getAddressBook().setVisible(false);

            AbstractFaxDialog.this.requestFocus();
        }

        public String add(String input, String glue, String token) {
            if (token != null) {
                return input + glue + token;
            }
            return input;
        }

    }

    private class AddressBookAction extends AbstractXNapAction {

        public AddressBookAction() {
            putValue(ICON_FILENAME, "contents.png");
        }

        public void actionPerformed(ActionEvent e) {
            JHylaFAX.getInstance().getAddressBook().setDoubleClickAction(new InsertNumberAction());
            JHylaFAX.getInstance().getAddressBook().setVisible(true);
        }

    }

    private class ContactTransferHandler extends AbstractContactTransferHandler {

        @Override
        public void importData(Contact[] contacts) {
            SimpleContact contact = new SimpleContact(contacts[0]);
            setNumber(contact.getFaxNumber());
        }

    }

}