/* ****************************************************************************** * * Copyright 2008-2010 Hans Dijkema * * JRichTextEditor is free software: you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as * published by the Free Software Foundation, either version 3 of * the License, or (at your option) any later version. * * JRichTextEditor 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 Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with JRichTextEditor. If not, see <http://www.gnu.org/licenses/>. * * ******************************************************************************/ package nl.dykema.jxmlnote.report; import java.awt.BorderLayout; import java.awt.Component; import java.awt.Window; import java.awt.event.ActionEvent; import java.beans.PropertyChangeEvent; import java.beans.PropertyChangeListener; import java.util.Vector; import javax.swing.AbstractAction; import javax.swing.BoxLayout; import javax.swing.JButton; import javax.swing.JDialog; import javax.swing.JLabel; import javax.swing.JPanel; import javax.swing.JProgressBar; import javax.swing.SwingUtilities; import javax.swing.SwingWorker; import nl.dykema.jxmlnote.exceptions.DefaultXMLNoteErrorHandler; import nl.dykema.jxmlnote.interfaces.XMLNotePreferences; import nl.dykema.jxmlnote.internationalization.DefaultXMLNoteTranslator; import nl.dykema.jxmlnote.internationalization.XMLNoteTranslator; import nl.dykema.jxmlnote.report.Report.ReportListener; import nl.dykema.jxmlnote.report.elements.ReportElement; import nl.dykema.jxmlnote.widgets.JXMLNoteSwingUtils; public class ReportProgressBar extends JDialog { private static final long serialVersionUID = 1L; private Report _report; private Window _parentWindow; private Component _parentComponent; private Job _job; private Job _proxy; private boolean _cancelled; private XMLNotePreferences _prefs; private XMLNoteTranslator _tr; private JProgressBar _progressBar; private JLabel _pageNr; private JLabel _message; public interface Job { public void job(Progress p); public void cancelled(); } public interface Progress { public int progress(int percentage); public String statusMessage(String msg); } public boolean cancelled() { return _cancelled; } public static ReportProgressBar runJob(Report report,Component parent,String title,Job job,XMLNotePreferences prefs) { Window w=(parent instanceof Window) ? (Window) parent : SwingUtilities.getWindowAncestor(parent); ReportProgressBar bar=new ReportProgressBar(report,w,parent,title,job,prefs); bar.run(); return bar; } public void run() { class Worker extends SwingWorker<String,String> implements ReportListener,Progress { private String prevMsg=""; protected String doInBackground() throws Exception { _job.job(this); return ""; } public int progress(int p) { int prev=super.getProgress(); super.setProgress(p); return prev; } public String statusMessage(String msg) { String prev=prevMsg; firePropertyChange("message","",msg); prevMsg=msg; return prev; } protected void done() { ReportProgressBar.this.setVisible(false); } public void makeInfo(Report rep) { try { Integer pn1,pn2; pn1=rep.getCurrentPageNumber()-1; pn2=rep.getCurrentPageNumber(); firePropertyChange("page",pn1,pn2); } catch (ReportException e) { DefaultXMLNoteErrorHandler.exception(e); } } public void nextPage(Report rep) { makeInfo(rep); } public void endReport(Report rep) { makeInfo(rep); } public Vector<ReportElement> getHeader(Report rep) { return null; } public Vector<ReportElement> getFooter(Report rep) { return null; } } Worker worker=new Worker(); worker.addPropertyChangeListener( new PropertyChangeListener() { public void propertyChange(PropertyChangeEvent evt) { String prop=evt.getPropertyName(); if ("progress".equals(prop)) { _progressBar.setValue((Integer)evt.getNewValue()); } else if ("page".equals(prop)) { _pageNr.setText(Integer.toString((Integer) evt.getNewValue())); } else if ("message".equals(prop)) { _message.setText((String) evt.getNewValue()); } } }); _report.addReportListener(worker); _report.setProperty(Report.Property.PROGRESS,worker); super.pack(); Window owner=super.getOwner(); if (owner!=null) { JXMLNoteSwingUtils.centerOnParent(owner,this); } else { if (this.getParent()!=null) { owner=SwingUtilities.getWindowAncestor(this.getParent()); } else { owner=SwingUtilities.getWindowAncestor(this); } JXMLNoteSwingUtils.centerOnParent(owner,this); } worker.execute(); super.setVisible(true); _report.removeReportListener(worker); _report.removeProperty(Report.Property.PROGRESS); super.dispose(); } public ReportProgressBar(Report report,Window parentw,Component parent,String title,Job job,XMLNotePreferences prefs) { super(parentw,title); super.setModal(true); super.setDefaultCloseOperation(JDialog.DO_NOTHING_ON_CLOSE); _report=report; _parentComponent=parent; _parentWindow=parentw; _job=job; _proxy=new Job() { public void cancelled() { _cancelled=true; _job.cancelled(); } public void job(Progress p) { _job.job(p); } }; _prefs=prefs; _tr=new DefaultXMLNoteTranslator(); _progressBar=new JProgressBar(); _pageNr=new JLabel(); _pageNr.setText(" "); _message=new JLabel(" "); JPanel p=new JPanel(); //p.setLayout(new BorderLayout()); p.add(_progressBar); p.add(new JLabel(_tr._("Page:"))); p.add(_pageNr); JPanel pp=new JPanel(); pp.setLayout(new BoxLayout(pp,BoxLayout.Y_AXIS)); pp.add(p); pp.add(_message); JPanel p1=new JPanel(); p1.setLayout(new BorderLayout()); p1.add(pp,BorderLayout.CENTER); JButton cancel=new JButton(new AbstractAction(_tr._("Cancel")) { public void actionPerformed(ActionEvent e) { _proxy.cancelled(); } }); p1.add(cancel,BorderLayout.SOUTH); this.add(p1); //super.add(p); } }