📄 previewproxybase.java
字号:
decreaseZoom();
}
}
/**
* Default 'about' action (does nothing).
*/
private class DefaultAboutAction extends AboutAction
{
/**
* Creates an 'about' action.
*/
public DefaultAboutAction()
{
super(getResources());
}
/**
* Does nothing (should show an 'about' dialog).
*
* @param e The action event.
*/
public void actionPerformed(final ActionEvent e)
{
LayoutManagerCache.printResults();
}
}
/**
* Default 'goto' action for the frame.
*/
private class DefaultGotoAction extends GotoPageAction
{
/**
* Creates a 'goto' action.
*/
public DefaultGotoAction()
{
super(getResources());
}
/**
* Jump to a page.
*
* @param e The action event.
*/
public void actionPerformed(final ActionEvent e)
{
final String result = JOptionPane.showInputDialog(PreviewProxyBase.this,
getResources().getString("dialog.gotopage.title"),
getResources().getString("dialog.gotopage.message"),
JOptionPane.OK_CANCEL_OPTION);
if (result == null)
{
return;
}
try
{
final int page = Integer.parseInt(result);
final ReportPane reportPane = getReportPane();
if (page > 0 && page <= reportPane.getNumberOfPages())
{
reportPane.setPageNumber(page);
}
}
catch (Exception ex)
{
Log.info("DefaultGotoAction: swallowed an exception");
}
}
}
/**
* A zoom select action.
*/
private class ZoomSelectAction extends AbstractAction
{
/**
* Creates a new action.
*/
public ZoomSelectAction()
{
}
/**
* Invoked when an action occurs.
*
* @param e the event.
*/
public void actionPerformed(final ActionEvent e)
{
setZoomFactor(zoomSelect.getSelectedIndex());
}
}
/**
* A zoom set action.
*/
protected class ZoomSetAction extends AbstractActionDowngrade
{
/** The zoom factor index. */
private int zoomFactor;
/**
* Creates a new action.
*
* @param factorIndex the zoom factor index.
*/
public ZoomSetAction(final int factorIndex)
{
zoomFactor = factorIndex;
this.putValue(Action.NAME, String.valueOf((int) (ZOOM_FACTORS[factorIndex] * 100)) + " %");
}
/**
* Invoked when an action occurs.
*
* @param e the action event.
*/
public void actionPerformed(final ActionEvent e)
{
setZoomFactor(zoomFactor);
}
}
/**
* Returns the worker.
*
* @return The worker.
*/
protected Worker getWorker()
{
if (paginationWorker == null)
{
paginationWorker = new Worker();
paginationWorker.setPriority(Thread.MIN_PRIORITY);
paginationWorker.setName("Repagination-Worker");
}
return paginationWorker;
}
/** The base class for localised resources. */
public static final String BASE_RESOURCE_CLASS =
"com.jrefinery.report.resources.JFreeReportResources";
/** The 'about' action. */
private WrapperAction aboutAction;
/** The 'close' action. */
private WrapperAction closeAction;
/** The 'first page' action. */
private WrapperAction firstPageAction;
/** The 'last page' action. */
private WrapperAction lastPageAction;
/** The 'next page' action. */
private WrapperAction nextPageAction;
/** The 'previous page' action. */
private WrapperAction previousPageAction;
/** The 'zoom in' action. */
private WrapperAction zoomInAction;
/** The 'zoom out' action. */
private WrapperAction zoomOutAction;
/** The 'goto' action. */
private WrapperAction gotoAction;
/** The available zoom factors. */
protected static final float[]
ZOOM_FACTORS = {0.25f, 0.5f, 0.75f, 1.0f, 1.25f, 1.5f, 2.0f, 3.0f, 4.0f};
/** The default zoom index (corresponds to a zoomFactor of 1.0. */
private static final int DEFAULT_ZOOM_INDEX = 3;
/** The combobox enables a direct selection of the desired zoomFactor. */
private JComboBox zoomSelect;
/** The current zoom index (indexes into the zoomFactors array). */
private int zoomIndex;
/** The pane that displays the report within the frame. */
private ReportPane reportPane;
/** Locale-specific resources. */
private ResourceBundle resources;
/** Defines whether to use 24x24 icons or 16x16 icons. */
private boolean largeIconsEnabled;
/** Label for status. */
private JLabel statusHolder;
/** Toolbar. */
private JToolBar toolbar;
/** The maximum size. */
private Dimension maximumSize;
/** The preferred size. */
private Dimension preferredSize;
/** A preview proxy. */
private PreviewProxy proxy;
/** A list of all export plugins known to this preview proxy base. */
private ArrayList exportPlugIns;
/** A collection of actions, keyed by the export plugin. */
private HashMap pluginActions;
private ReportProgressDialog progressDialog;
private boolean lockInterface;
private ActionConcentrator zoomActionConcentrator;
/**
* Creates a preview proxy.
*
* @param proxy the proxy.
*/
public PreviewProxyBase(final PreviewProxy proxy)
{
this.proxy = proxy;
progressDialog = new ReportProgressDialog();
progressDialog.setDefaultCloseOperation(ReportProgressDialog.DO_NOTHING_ON_CLOSE);
}
/**
* Initialises the preview dialog.
*
* @param report the report.
*
* @throws ReportProcessingException if there is a problem processing the report.
*/
public void init(final JFreeReport report) throws ReportProcessingException
{
this.zoomActionConcentrator = new ActionConcentrator();
this.exportWorker = new Worker();
this.exportWorker.setName("preview-dialog-export-worker: report: " + report.getName());
boolean largeIconsProperty =
report.getReportConfiguration().getConfigProperty
(LARGE_ICONS_ENABLED_PROPERTY, "true").equals("true");
setLargeIconsEnabled(largeIconsProperty);
final ExportPluginFactory factory = new ExportPluginFactory();
exportPlugIns = factory.createExportPlugIns(proxy, report.getReportConfiguration(), exportWorker);
pluginActions = new HashMap(exportPlugIns.size());
final Iterator it = exportPlugIns.iterator();
while (it.hasNext())
{
final ExportPlugin ep = (ExportPlugin) it.next();
final ExportAction ea = new ExportAction(ep);
ea.setReport(report);
pluginActions.put(ep, ea);
}
// handle a JDK bug: windows are not garbage collected if dispose is not called manually.
// DisposedState is undone when show() or pack() is called, so this does no harm.
proxy.addComponentListener(new ComponentAdapter()
{
public void componentHidden(final ComponentEvent e)
{
try
{
getWorker().interrupt();
}
catch (SecurityException se)
{
// not allowed to access the thread ...
}
final Component c = e.getComponent();
if (c instanceof Window)
{
final Window w = (Window) c;
w.dispose();
}
}
});
// get a locale-specific resource bundle...
final ResourceBundle resources = getResources();
proxy.setTitle(resources.getString("preview-frame.title"));
this.zoomIndex = DEFAULT_ZOOM_INDEX;
createDefaultActions(proxy.createDefaultCloseAction());
// set up the menu
proxy.setJMenuBar(createMenuBar());
// set up the content with a toolbar and a report pane
setLayout(new BorderLayout());
setDoubleBuffered(false);
boolean toolbarFloatableProperty =
report.getReportConfiguration().getConfigProperty
(TOOLBAR_FLOATABLE_PROPERTY, "true").equals("true");
toolbar = createToolBar(toolbarFloatableProperty);
add(toolbar, BorderLayout.NORTH);
reportPane = createReportPane(report);
reportPane.addPropertyChangeListener(createReportPanePropertyChangeListener());
reportPane.setVisible(false);
final JPanel reportPaneHolder = new JPanel(new CenterLayout());
reportPaneHolder.add(reportPane);
reportPaneHolder.setDoubleBuffered(false);
reportPaneHolder.setBorder(BorderFactory.createEmptyBorder(10, 10, 10, 10));
final JScrollPane s1 = new JScrollPane(reportPaneHolder);
s1.setDoubleBuffered(false);
s1.getVerticalScrollBar().setUnitIncrement(20);
final JPanel scrollPaneHolder = new JPanel();
scrollPaneHolder.setLayout(new BorderLayout());
scrollPaneHolder.add(s1, BorderLayout.CENTER);
scrollPaneHolder.setDoubleBuffered(false);
scrollPaneHolder.add(createStatusBar(), BorderLayout.SOUTH);
add(scrollPaneHolder);
applyDefinedDimension(report.getReportConfiguration());
performPagination(report.getDefaultPageFormat());
Log.info("Dialog started pagination ");
}
/**
* Read the defined dimensions from the report's configuration and set them to
* the Dialog. If a maximum size is defined, add a WindowSizeLimiter to check the
* maximum size
*
* @param config the report configuration of this dialog's report.
*/
private void applyDefinedDimension(final ReportConfiguration config)
{
String width = config.getConfigProperty(
ReportConfiguration.PREVIEW_PREFERRED_WIDTH);
String height = config.getConfigProperty(
ReportConfiguration.PREVIEW_PREFERRED_HEIGHT);
// only apply if both values are set.
if (width != null && height != null)
{
try
{
final Dimension pref = createCorrectedDimensions((int) ParserUtil.parseRelativeFloat(width, ""),
(int) ParserUtil.parseRelativeFloat(height, ""));
setPreferredSize(pref);
}
catch (SAXException nfe)
{
Log.warn("Preferred viewport size is defined, but the specified values are invalid.");
}
}
width = config.getConfigProperty(
ReportConfiguration.PREVIEW_MAXIMUM_WIDTH);
height = config.getConfigProperty(
ReportConfiguration.PREVIEW_MAXIMUM_HEIGHT);
// only apply if at least one value is set.
if (width != null || height != null)
{
try
{
final int iWidth = (width == null)
? Short.MAX_VALUE : (int) ParserUtil.parseRelativeFloat(width, "");
final int iHeight = (height == null)
? Short.MAX_VALUE : (int) ParserUtil.parseRelativeFloat(height, "");
final Dimension pref = createCorrectedDimensions(iWidth, iHeight);
setMaximumSize(pref);
addComponentListener(new WindowSizeLimiter());
}
catch (SAXException nfe)
{
Log.warn("Maximum viewport size is defined, but the specified values are invalid.");
}
}
}
/**
* Correct the given width and height. If the values are negative, the height and
* width is considered a proportional value where -100 corresponds to 100%.
* The proportional attributes are given is relation to the screen width and height.
*
* @param w the to be corrected width
* @param h the height that should be corrected
* @return the dimension of width and height, where all relative values are normalized.
*/
private Dimension createCorrectedDimensions(int w, int h)
{
final Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize();
if (w < 0)
{
w = (w * screenSize.width / -100);
}
if (h < 0)
{
h = (h * screenSize.height / -100);
}
return new Dimension(w, h);
}
/**
* Returns the maximum size of this container.
*
* @see #getPreferredSize
* @return the maximum size of the dialog
*/
public Dimension getMaximumSize()
{
if (maximumSize == null)
{
return super.getMaximumSize();
}
return maximumSize;
}
/**
* defines the maximum size of this container.
*
* @see #setPreferredSize
* @param maximumSize the maximum size of the dialog
*/
public void setMaximumSize(final Dimension maximumSize)
{
this.maximumSize = maximumSize;
}
/**
* Returns the preferred size of this container.
* @return an instance of <code>Dimension</code> that represents
* the preferred size of this container.
* @see #getMinimumSize
* @see #getLayout
* @see java.awt.LayoutManager#preferredLayoutSize(java.awt.Container)
* @see java.awt.Component#getPreferredSize
*/
public Dimension getPreferredSize()
{
if (preferredSize == null)
{
return super.getPreferredSize();
}
return preferredSize;
}
/**
* defines the preferred size of this container.
*
* @see #setPreferredSize
* @param preferredSize defines the preferred size for the PreviewComponent.
*/
public void setPreferredSize(final Dimension preferredSize)
{
this.preferredSize = preferredSize;
}
/**
* Creates a report pane listener.
*
* @return the listener.
*/
protected ReportPanePropertyChangeListener createReportPanePropertyChangeListener()
{
return new ReportPanePropertyChangeListener();
}
/**
* Creates the ReportPane for the report.
*
* @param report the report for this pane.
*
* @return the report pane.
*
* @throws ReportProcessingException if there is a problem processing the report.
*/
protected ReportPane createReportPane(final JFreeReport report) throws ReportProcessingException
{
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -