001: /**
002: * ===========================================
003: * JFreeReport : a free Java reporting library
004: * ===========================================
005: *
006: * Project Info: http://reporting.pentaho.org/
007: *
008: * (C) Copyright 2001-2007, by Object Refinery Ltd, Pentaho Corporation and Contributors.
009: *
010: * This library is free software; you can redistribute it and/or modify it under the terms
011: * of the GNU Lesser General Public License as published by the Free Software Foundation;
012: * either version 2.1 of the License, or (at your option) any later version.
013: *
014: * This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
015: * without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
016: * See the GNU Lesser General Public License for more details.
017: *
018: * You should have received a copy of the GNU Lesser General Public License along with this
019: * library; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330,
020: * Boston, MA 02111-1307, USA.
021: *
022: * [Java is a trademark or registered trademark of Sun Microsystems, Inc.
023: * in the United States and other countries.]
024: *
025: * ------------
026: * PreviewFrame.java
027: * ------------
028: * (C) Copyright 2001-2007, by Object Refinery Ltd, Pentaho Corporation and Contributors.
029: */package org.jfree.report.modules.gui.base;
030:
031: import java.awt.BorderLayout;
032: import java.awt.event.ComponentAdapter;
033: import java.awt.event.ComponentEvent;
034: import java.beans.PropertyChangeEvent;
035: import java.beans.PropertyChangeListener;
036: import javax.swing.BoxLayout;
037: import javax.swing.JComponent;
038: import javax.swing.JFrame;
039: import javax.swing.JLabel;
040: import javax.swing.JMenu;
041: import javax.swing.JMenuBar;
042: import javax.swing.JPanel;
043:
044: import org.jfree.report.JFreeReport;
045: import org.jfree.report.JFreeReportBoot;
046: import org.jfree.report.modules.gui.common.IconTheme;
047: import org.jfree.report.modules.gui.commonswing.JStatusBar;
048: import org.jfree.report.modules.gui.commonswing.ReportProgressBar;
049: import org.jfree.report.modules.gui.commonswing.ReportProgressDialog;
050: import org.jfree.report.modules.gui.commonswing.RequestFocusHandler;
051: import org.jfree.report.modules.gui.commonswing.StatusType;
052: import org.jfree.report.util.i18n.Messages;
053: import org.jfree.util.Configuration;
054: import org.jfree.ui.RefineryUtilities;
055:
056: /**
057: * Creation-Date: 11.11.2006, 19:35:09
058: *
059: * @author Thomas Morgner
060: */
061: public class PreviewFrame extends JFrame {
062: private class PreviewPanePropertyChangeHandler implements
063: PropertyChangeListener {
064:
065: protected PreviewPanePropertyChangeHandler() {
066: }
067:
068: /**
069: * This method gets called when a bound property is changed.
070: *
071: * @param evt A PropertyChangeEvent object describing the event source and the property that has changed.
072: */
073:
074: public void propertyChange(final PropertyChangeEvent evt) {
075: final String propertyName = evt.getPropertyName();
076: if (PreviewPane.MENU_PROPERTY.equals(propertyName)) {
077: // Update the menu
078: final JMenu[] menus = previewPane.getMenu();
079: if (menus != null && menus.length > 0) {
080: final JMenuBar menuBar = new JMenuBar();
081: for (int i = 0; i < menus.length; i++) {
082: final JMenu menu = menus[i];
083: menuBar.add(menu);
084: }
085: setJMenuBar(menuBar);
086: } else {
087: setJMenuBar(null);
088: }
089: return;
090: }
091:
092: if (PreviewPane.TITLE_PROPERTY.equals(propertyName)) {
093: setTitle(previewPane.getTitle());
094: return;
095: }
096:
097: if (PreviewPane.STATUS_TEXT_PROPERTY.equals(propertyName)
098: || PreviewPane.STATUS_TYPE_PROPERTY
099: .equals(propertyName)) {
100: statusBar.setStatus(previewPane.getStatusType(),
101: previewPane.getStatusText());
102: return;
103: }
104:
105: if (PreviewPane.ICON_THEME_PROPERTY.equals(propertyName)) {
106: statusBar.setIconTheme(previewPane.getIconTheme());
107: return;
108: }
109:
110: if (PreviewPane.PAGINATING_PROPERTY.equals(propertyName)) {
111: if (Boolean.TRUE.equals(evt.getNewValue())) {
112: pageLabel.setVisible(false);
113: statusBar
114: .setStatus(
115: StatusType.INFORMATION,
116: messages
117: .getString("PreviewFrame.USER_PAGINATING")); //$NON-NLS-1$
118: if (progressBar != null) {
119: previewPane
120: .addReportProgressListener(progressBar);
121: progressBar.setOnlyPagination(true);
122: progressBar.setVisible(true);
123: progressBar.revalidate();
124: }
125: if (progressDialog != null) {
126: previewPane
127: .addReportProgressListener(progressDialog);
128: progressDialog.setOnlyPagination(true);
129: progressDialog.setVisible(true);
130: RefineryUtilities
131: .centerDialogInParent(progressDialog);
132: }
133: } else {
134: pageLabel.setVisible(true);
135: statusBar.setStatus(StatusType.NONE, ""); //$NON-NLS-1$
136: if (progressBar != null) {
137: progressBar.setVisible(false);
138: progressBar.setOnlyPagination(false);
139: previewPane
140: .removeReportProgressListener(progressBar);
141: progressBar.revalidate();
142: }
143: if (progressDialog != null) {
144: previewPane
145: .removeReportProgressListener(progressDialog);
146: progressDialog.setOnlyPagination(false);
147: progressDialog.setVisible(false);
148: }
149: }
150: return;
151: }
152:
153: if (PreviewPane.PAGE_NUMBER_PROPERTY.equals(propertyName)
154: || PreviewPane.NUMBER_OF_PAGES_PROPERTY
155: .equals(propertyName)) {
156: pageLabel.setText(previewPane.getPageNumber()
157: + "/" + previewPane.getNumberOfPages()); //$NON-NLS-1$
158: return;
159: }
160:
161: if (PreviewPane.CLOSED_PROPERTY.equals(propertyName)) {
162: if (previewPane.isClosed()) {
163: setVisible(false);
164: dispose();
165: } else {
166: setVisible(true);
167: }
168: }
169: }
170: }
171:
172: private static class TriggerPaginationListener extends
173: ComponentAdapter {
174: private PreviewPane pane;
175:
176: public TriggerPaginationListener(final PreviewPane pane) {
177: this .pane = pane;
178: }
179:
180: /**
181: * Invoked when the component has been made visible.
182: */
183: public void componentShown(final ComponentEvent e) {
184: if (pane.isDeferredRepagination()) {
185: pane.startPagination();
186: }
187: }
188: }
189:
190: private PreviewPane previewPane;
191:
192: private JStatusBar statusBar;
193:
194: private ReportProgressBar progressBar;
195:
196: private JLabel pageLabel;
197:
198: private ReportProgressDialog progressDialog;
199: private Messages messages;
200:
201: /**
202: * Creates a non-modal dialog without a title and without a specified <code>Frame</code> owner. A shared, hidden
203: * frame will be set as the owner of the dialog.
204: * <p/>
205: * This constructor sets the component's locale property to the value returned by
206: * <code>JComponent.getDefaultLocale</code>.
207: *
208: * @throws java.awt.HeadlessException if GraphicsEnvironment.isHeadless() returns true.
209: * @see java.awt.GraphicsEnvironment#isHeadless
210: * @see javax.swing.JComponent#getDefaultLocale
211: */
212: public PreviewFrame() {
213: init();
214: }
215:
216: /**
217: * Constructs a new frame that is initially invisible.
218: * <p/>
219: * This constructor sets the component's locale property to the value returned by
220: * <code>JComponent.getDefaultLocale</code>.
221: *
222: * @see java.awt.GraphicsEnvironment#isHeadless
223: * @see java.awt.Component#setSize
224: * @see java.awt.Component#setVisible
225: * @see javax.swing.JComponent#getDefaultLocale
226: */
227: public PreviewFrame(final JFreeReport report) {
228: init();
229: setReportJob(report);
230: }
231:
232: protected void init() {
233: addComponentListener(new RequestFocusHandler());
234:
235: messages = new Messages(getLocale(),
236: SwingPreviewModule.BUNDLE_NAME);
237: previewPane = new PreviewPane();
238: previewPane.setDeferredRepagination(true);
239: addComponentListener(new TriggerPaginationListener(previewPane));
240: statusBar = new JStatusBar(previewPane.getIconTheme());
241:
242: pageLabel = new JLabel();
243: previewPane
244: .addPropertyChangeListener(new PreviewPanePropertyChangeHandler());
245: addComponentListener(new TriggerPaginationListener(previewPane));
246:
247: final Configuration configuration = JFreeReportBoot
248: .getInstance().getGlobalConfig();
249: final boolean progressBarEnabled = "true".equals(configuration //$NON-NLS-1$
250: .getConfigProperty("org.jfree.report.modules.gui.base.ProgressBarEnabled")); //$NON-NLS-1$
251: final boolean progressDialogEnabled = "true".equals(configuration //$NON-NLS-1$
252: .getConfigProperty("org.jfree.report.modules.gui.base.ProgressDialogEnabled")); //$NON-NLS-1$
253:
254: if (progressBarEnabled) {
255: progressBar = new ReportProgressBar();
256: progressBar.setVisible(false);
257: previewPane.addReportProgressListener(progressBar);
258: previewPane
259: .addPropertyChangeListener(new PreviewPanePropertyChangeHandler());
260: } else {
261: progressBar = null;
262: }
263:
264: if (progressDialogEnabled) {
265: progressDialog = new ReportProgressDialog(this );
266: previewPane.addReportProgressListener(progressDialog);
267: final JFreeReport reportJob = previewPane.getReportJob();
268: if (reportJob == null || reportJob.getName() == null) {
269: progressDialog.setTitle(messages
270: .getString("ProgressDialog.EMPTY_TITLE"));
271: progressDialog.setMessage(messages
272: .getString("ProgressDialog.EMPTY_TITLE"));
273: } else {
274: progressDialog.setTitle(messages.getString(
275: "ProgressDialog.TITLE", reportJob.getName()));
276: progressDialog.setMessage(messages.getString(
277: "ProgressDialog.TITLE", reportJob.getName()));
278: }
279: progressDialog.pack();
280: } else {
281: progressDialog = null;
282: }
283:
284: final JComponent extensionArea = statusBar.getExtensionArea();
285: extensionArea.setLayout(new BoxLayout(extensionArea,
286: BoxLayout.X_AXIS));
287: if (progressBar != null) {
288: extensionArea.add(progressBar);
289: }
290: extensionArea.add(pageLabel);
291:
292: final JComponent contentPane = new JPanel();
293: contentPane.setLayout(new BorderLayout());
294: contentPane.add(previewPane, BorderLayout.CENTER);
295: contentPane.add(statusBar, BorderLayout.SOUTH);
296: setContentPane(contentPane);
297:
298: updateMenu(previewPane.getMenu());
299: setTitle(previewPane.getTitle());
300: statusBar.setIconTheme(previewPane.getIconTheme());
301: statusBar.setStatus(previewPane.getStatusType(), previewPane
302: .getStatusText());
303: }
304:
305: private void updateMenu(final JMenu[] menus) {
306: if (menus != null && menus.length > 0) {
307: final JMenuBar menuBar = new JMenuBar();
308: for (int i = 0; i < menus.length; i++) {
309: final JMenu menu = menus[i];
310: menuBar.add(menu);
311: }
312: setJMenuBar(menuBar);
313: } else {
314: setJMenuBar(null);
315: }
316: }
317:
318: public ReportController getReportController() {
319: return previewPane.getReportController();
320: }
321:
322: public void setReportController(
323: final ReportController reportController) {
324: previewPane.setReportController(reportController);
325: }
326:
327: public IconTheme getIconTheme() {
328: return previewPane.getIconTheme();
329: }
330:
331: public void setIconTheme(final IconTheme theme) {
332: previewPane.setIconTheme(theme);
333: }
334:
335: public JFreeReport getReportJob() {
336: return previewPane.getReportJob();
337: }
338:
339: public void setReportJob(final JFreeReport reportJob) {
340: previewPane.setReportJob(reportJob);
341: }
342:
343: public void dispose() {
344: super .dispose();
345: previewPane.setClosed(true);
346: }
347:
348: protected PreviewPane getPreviewPane() {
349: return previewPane;
350: }
351:
352: public boolean isToolbarFloatable() {
353: return previewPane.isToolbarFloatable();
354: }
355:
356: public void setToolbarFloatable(final boolean toolbarFloatable) {
357: previewPane.setToolbarFloatable(toolbarFloatable);
358: }
359:
360: public double getZoom() {
361: return previewPane.getZoom();
362: }
363:
364: public void setZoom(final double zoom) {
365: previewPane.setZoom(zoom);
366: }
367: }
|