Java tutorial
/** * 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()); } } }