/** * PrintDialog.java * Created On 2007, Sep 7, 2007 2:42:13 PM * @author E. Rajasekar */ package app.astrosoft.ui.dlg; import java.awt.BorderLayout; import java.awt.Color; import java.awt.Component; import java.awt.Container; import java.awt.Cursor; import java.awt.Dimension; import java.awt.FlowLayout; import java.awt.Point; import java.awt.Toolkit; import java.awt.Window; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.ItemEvent; import java.awt.event.ItemListener; import java.io.File; import java.text.SimpleDateFormat; import java.util.Calendar; import java.util.Date; import java.util.concurrent.FutureTask; import java.util.logging.Logger; import javax.swing.BorderFactory; import javax.swing.JButton; import javax.swing.JCheckBox; import javax.swing.JComboBox; import javax.swing.JLabel; import javax.swing.JOptionPane; import javax.swing.JPanel; import javax.swing.JWindow; import javax.swing.SpringLayout; import javax.swing.border.EtchedBorder; import javax.swing.plaf.basic.BasicArrowButton; import app.astrosoft.core.PanchangList; import app.astrosoft.core.Ephemeris.Mode; import app.astrosoft.exception.AstrosoftException; import app.astrosoft.export.AstrosoftExporter; import app.astrosoft.ui.AstroSoft; import app.astrosoft.ui.comp.CalendarSpinner; import app.astrosoft.ui.comp.DateListener; import app.astrosoft.ui.comp.FileChooserPanel; import app.astrosoft.ui.comp.ProgressBarPanel; import app.astrosoft.ui.comp.ProgressListener; import app.astrosoft.ui.util.SpringUtilities; import app.astrosoft.ui.util.UIConsts; import app.astrosoft.ui.util.UIUtil; import app.astrosoft.util.AstroUtil; import app.astrosoft.util.AstrosoftFileFilter; import app.astrosoft.util.FileOps; import app.astrosoft.export.AstrosoftExporter.Type; import static app.astrosoft.export.AstrosoftExporter.*; public class PrintDialog extends AstrosoftDialog { private static final Logger log = Logger.getLogger(PrintDialog.class.getName()); private static final Dimension dlgSize = new Dimension(440,270); //private static final Dimension dlgSize = new Dimension(440,320); private static final Dimension extDlgSize = new Dimension(440,380); private static final Dimension fileChooserSize = new Dimension(dlgSize.width - 60,60); private static final Dimension acrobatSize = new Dimension(dlgSize.width - 60,60); private static final Dimension progressSize = new Dimension(dlgSize.width - 60,25); private static final Dimension printPanelSize = new Dimension(dlgSize.width - 60,dlgSize.height - 60); private static final String defaultPath = AstroSoft.getPreferences().getAstrosoftFilesDir(); private static SimpleDateFormat df = new SimpleDateFormat("MMM"); private FileChooserPanel acrobatPanel; private FileChooserPanel outputFileChooser; JPanel printPanel; private JComboBox printTypes; private JButton print; private JButton cancel; private Window panInputWindow; private boolean windowShown = false; private JCheckBox fullYear = new JCheckBox("Full Year", false); private CalendarSpinner spinner; /*private JButton arrow = new BasicArrowButton( 5, UIConsts.THEME_CLR, new Color( 0, 0, 0 ), new Color( 0, 0, 0 ), new Color( 0, 0, 0 ) );*/ private JButton arrow = new JButton(UIUtil.createImageIcon("calendar")); public PrintDialog(AstroSoft parent){ super(parent, "Print ", dlgSize); addComponents(); setVisible(true); } private void addComponents() { //dlgPanel.setLayout(new SpringLayout()); dlgPanel.setLayout(new FlowLayout()); printPanel = createPrintPanel(); dlgPanel.add(printPanel); add(dlgPanel); setBackground(UIConsts.THEME_CLR); //Allow user to directly open if previous printed file already exists. if (new File(outputFileChooser.getFilePath()).exists()){ printCompleted(); } } private JPanel createPrintPanel() { JPanel printPanel = new JPanel(new SpringLayout()); printPanel.setPreferredSize(printPanelSize); printPanel.add(createPrintTypePanel()); boolean isPrintPanchang = ((app.astrosoft.export.AstrosoftExporter.Type)printTypes.getSelectedItem()).equals(AstrosoftExporter.Type.Panchang); if (isPrintPanchang){ arrow.setEnabled(true); }else{ arrow.setEnabled(false); } outputFileChooser = new FileChooserPanel(fileChooserSize, getDefaultFile(),"Output File " , FileOps.FileDialogMode.SAVE, AstrosoftFileFilter.PDF_EXTN ); printPanel.add(outputFileChooser); JPanel buttonPanel = new JPanel(); print = new JButton("Print"); print.addActionListener(new ActionListener(){ public void actionPerformed(ActionEvent e) { printClicked(); } }); cancel = new JButton("Cancel"); cancel.addActionListener(closeListener); buttonPanel.add(print); buttonPanel.add(cancel); printPanel.add(buttonPanel); SpringUtilities.makeCompactGrid(printPanel, 3, 1, 10,10,10,23); printPanel.setBorder(UIConsts.getTitleBorder("Print")); return printPanel; } protected void printClicked() { String outputFile = outputFileChooser.getFilePath(); if (outputFile == null || outputFile.isEmpty()){ OptionDialog.showDialog("Please choose valid file " , JOptionPane.ERROR_MESSAGE); return; } setCursor(Cursor.getPredefinedCursor(Cursor.WAIT_CURSOR)); print.setEnabled(false); cancel.setEnabled(false); AstrosoftExporter.Type type = (AstrosoftExporter.Type)printTypes.getSelectedItem(); FutureTask<Object> printTask = null; if (type.equals(AstrosoftExporter.Type.Horosocope)){ printTask = AstrosoftExporter.export2Pdf(AstrosoftExporter.Type.Horosocope, parent.getHoroscope(), outputFile); }else if (type.equals(AstrosoftExporter.Type.Compactibility)){ printTask = AstrosoftExporter.export2Pdf(AstrosoftExporter.Type.Compactibility, parent.getCompactibility(), outputFile); }else if (type.equals(AstrosoftExporter.Type.Panchang)){ closePanInputWindow(); PanchangList panchang = null; Calendar panCal = (spinner != null) ? AstroUtil.getCalendar(spinner.getSelectedDate()) : AstroUtil.getCalendar(); if (fullYear.isSelected()){ panchang = new PanchangList(panCal.get(Calendar.YEAR)); }else{ panchang = new PanchangList(panCal.get(Calendar.YEAR), panCal.get(Calendar.MONTH)); } printTask = AstrosoftExporter.export2Pdf(type, panchang, outputFile); } ProgressListener listener = new ProgressListener(){ public void completed() { printCompleted(); } }; ProgressBarPanel pbarPanel = new ProgressBarPanel(progressSize, printTask, "Printing", listener); refresh(pbarPanel); } protected void printCompleted() { setCursor(Cursor.getPredefinedCursor(Cursor.DEFAULT_CURSOR)); print.setEnabled(true); cancel.setEnabled(true); JPanel p = new JPanel(new SpringLayout()); acrobatPanel = new FileChooserPanel(acrobatSize,AstroSoft.getPreferences().getAcrobatExecutable(), "Acrobat Executable", FileOps.FileDialogMode.OPEN); p.add(acrobatPanel); JButton open = new JButton("Open"); JButton close = new JButton("Close"); open.addActionListener(new ActionListener(){ public void actionPerformed(ActionEvent e) { openClicked(); } }); close.addActionListener(closeListener); JPanel buttonPanel = new JPanel(); buttonPanel.add(open); buttonPanel.add(close); p.add(buttonPanel); SpringUtilities.makeCompactGrid(p, 2, 1, 10,10,10,10); refresh(p); } private void openClicked() { try { AstroSoft.getPreferences().setAcrobatExecutable(acrobatPanel.getFilePath()); FileOps.openDocument(outputFileChooser.getFilePath()); }catch(AstrosoftException e){ OptionDialog.showDialog(e.getMessage(),JOptionPane.ERROR_MESSAGE); } } private JPanel createPrintTypePanel(){ JPanel typePanel = new JPanel(new SpringLayout()); printTypes = new JComboBox(); printTypes.addItemListener(new ItemListener(){ public void itemStateChanged(ItemEvent e) { if (((app.astrosoft.export.AstrosoftExporter.Type)printTypes.getSelectedItem()).equals(AstrosoftExporter.Type.Panchang)){ arrow.setEnabled(true); }else{ arrow.setEnabled(false); } if (outputFileChooser != null ) { String outputFile = getDefaultFile(); outputFileChooser.setFilePath(outputFile); if(new File(outputFile).exists()){ printCompleted(); }else{ refresh(); } } } }); if (parent.getHoroscope() != null){ printTypes.addItem(AstrosoftExporter.Type.Horosocope); } if(parent.getCompactibility() != null) { printTypes.addItem(AstrosoftExporter.Type.Compactibility); } printTypes.addItem(AstrosoftExporter.Type.Panchang); arrow.addActionListener(new ActionListener(){ public void actionPerformed(ActionEvent e) { arrowClicked(); } }); JPanel comboPanel = new JPanel(new BorderLayout()); comboPanel.add(printTypes, BorderLayout.CENTER); comboPanel.add(arrow, BorderLayout.EAST); typePanel.add(new JLabel("Print ")); typePanel.add(comboPanel); SpringUtilities.makeCompactGrid(typePanel, 1, 2, 0,0,5,5); return typePanel; } protected void arrowClicked() { if (!windowShown) { panInputWindow = createPanchangInputWindow(); UIUtil.setWindowLocation(panInputWindow, printTypes); panInputWindow.setVisible(true); windowShown = true; }else { closePanInputWindow(); } } private void closePanInputWindow(){ if (panInputWindow != null){ panInputWindow.dispose(); windowShown = false; } } private void refresh(JPanel panel){ dlgPanel.removeAll(); dlgPanel.add(printPanel); if (panel != null) { dlgPanel.add(panel); resetSize(extDlgSize); }else { resetSize(dlgSize); } setBackground(); repaint(); setVisible(true); } private void refresh(){ refresh(null); } private String getDefaultFile(){ app.astrosoft.export.AstrosoftExporter.Type type = (app.astrosoft.export.AstrosoftExporter.Type)printTypes.getSelectedItem(); if (type != null) { if (type.equals(AstrosoftExporter.Type.Horosocope)){ return parent.getHoroscope().createDocumentName(); }else if (type.equals(AstrosoftExporter.Type.Compactibility)){ return parent.getCompactibility().createDocumentName(); }else if (type.equals(AstrosoftExporter.Type.Panchang)) { return getPanchangOutputFile(null); } } return null; } private Window createPanchangInputWindow(){ JWindow window = new JWindow(this); Container windowPane = window.getContentPane( ); windowPane.setLayout(new BorderLayout()); spinner = new CalendarSpinner(CalendarSpinner.FMT_MONTH_YEAR); spinner.addDateListener( new DateListener () { public void dateChanged(Date date) { outputFileChooser.setFilePath(getPanchangOutputFile(date)); } }); JPanel panChooser = spinner.getChooser(); JPanel p = new JPanel(); p.add(panChooser); p.add(fullYear); p.setBackground(UIConsts.CAL_COMBO_BACKGROUND); p.setBorder(BorderFactory.createEtchedBorder(EtchedBorder.LOWERED)); windowPane.add(p, BorderLayout.CENTER); window.pack(); fullYear.addActionListener(new ActionListener(){ public void actionPerformed(ActionEvent e) { outputFileChooser.setFilePath(getPanchangOutputFile(spinner.getSelectedDate())); } }); return window; } private String getPanchangOutputFile(Date date){ StringBuilder sb = new StringBuilder(defaultPath); sb.append("Panchang"); Calendar cal = (date != null) ? AstroUtil.getCalendar(date) : AstroUtil.getCalendar(); if (!fullYear.isSelected()){ sb.append("_"); sb.append(df.format(cal.getTime())); } sb.append("_"); sb.append(cal.get(Calendar.YEAR)); sb.append(".pdf"); return sb.toString(); } }