Browse Source
* commit '868e95047dd04dc45486f38372b4867a01937779': REPORT-8125 水印 设计器配置界面与实时预览=>完善国际化 REPORT-8125 水印 设计器配置界面与实 时预览=>核心功能完成 REPORT-8125 水印 设计器配置界面与实时预览=>完成基本框架master
13 changed files with 443 additions and 10 deletions
After Width: | Height: | Size: 98 KiB |
After Width: | Height: | Size: 558 B |
@ -0,0 +1,170 @@ |
|||||||
|
package com.fr.design.report; |
||||||
|
|
||||||
|
import com.fr.base.Watermark; |
||||||
|
import com.fr.design.dialog.BasicPane; |
||||||
|
import com.fr.design.formula.TinyFormulaPane; |
||||||
|
import com.fr.design.gui.icombobox.UIComboBox; |
||||||
|
import com.fr.design.gui.icontainer.UIScrollPane; |
||||||
|
import com.fr.design.gui.ilable.UILabel; |
||||||
|
import com.fr.design.gui.style.FRFontPane; |
||||||
|
import com.fr.design.layout.FRGUIPaneFactory; |
||||||
|
import com.fr.design.layout.TableLayout; |
||||||
|
import com.fr.design.layout.TableLayoutHelper; |
||||||
|
import com.fr.design.style.color.NewColorSelectPane; |
||||||
|
import com.fr.design.utils.gui.GUICoreUtils; |
||||||
|
import com.fr.general.Inter; |
||||||
|
|
||||||
|
import javax.swing.BorderFactory; |
||||||
|
import javax.swing.JComponent; |
||||||
|
import javax.swing.JPanel; |
||||||
|
import javax.swing.event.ChangeEvent; |
||||||
|
import javax.swing.event.ChangeListener; |
||||||
|
import javax.swing.event.DocumentEvent; |
||||||
|
import javax.swing.event.DocumentListener; |
||||||
|
import java.awt.BorderLayout; |
||||||
|
import java.awt.Color; |
||||||
|
import java.awt.event.ItemEvent; |
||||||
|
import java.awt.event.ItemListener; |
||||||
|
|
||||||
|
/** |
||||||
|
* Created by plough on 2018/5/15. |
||||||
|
*/ |
||||||
|
public class WatermarkPane extends BasicPane { |
||||||
|
|
||||||
|
private static final int MAX_WIDTH = 160; |
||||||
|
|
||||||
|
// 水印预览面板
|
||||||
|
private WatermarkPreviewPane watermarkPreviewPane; |
||||||
|
// 文字
|
||||||
|
private TinyFormulaPane formulaPane; |
||||||
|
// 字号
|
||||||
|
private UIComboBox fontSizeComboBox; |
||||||
|
// 文字颜色
|
||||||
|
private NewColorSelectPane colorPane; |
||||||
|
|
||||||
|
public WatermarkPane() { |
||||||
|
initComponents(); |
||||||
|
} |
||||||
|
|
||||||
|
private void initComponents() { |
||||||
|
this.setBorder(BorderFactory.createEmptyBorder(4, 4, 4, 4)); |
||||||
|
this.setLayout(FRGUIPaneFactory.createBorderLayout()); |
||||||
|
|
||||||
|
JPanel contentPane = FRGUIPaneFactory.createBorderLayout_S_Pane(); |
||||||
|
this.add(contentPane, BorderLayout.CENTER); |
||||||
|
|
||||||
|
// 预览
|
||||||
|
JPanel leftPane = FRGUIPaneFactory.createBorderLayout_S_Pane(); |
||||||
|
contentPane.add(leftPane, BorderLayout.CENTER); |
||||||
|
leftPane.setBorder(GUICoreUtils.createTitledBorder(Inter.getLocText("FR-Designer-Widget-Style_Preview"), null)); |
||||||
|
JPanel previewPaneWrapper = FRGUIPaneFactory.createBorderLayout_S_Pane(); |
||||||
|
leftPane.add(previewPaneWrapper, BorderLayout.CENTER); |
||||||
|
previewPaneWrapper.setBorder(BorderFactory.createEmptyBorder(2, 8, 4, 8)); |
||||||
|
watermarkPreviewPane = new WatermarkPreviewPane(); |
||||||
|
previewPaneWrapper.add(watermarkPreviewPane, BorderLayout.CENTER); |
||||||
|
|
||||||
|
// 设置
|
||||||
|
JPanel rightPane = FRGUIPaneFactory.createBorderLayout_S_Pane(); |
||||||
|
contentPane.add(rightPane, BorderLayout.EAST); |
||||||
|
rightPane.add(initRightPane(), BorderLayout.CENTER); |
||||||
|
} |
||||||
|
|
||||||
|
public void populate(Watermark watermark) { |
||||||
|
populateFourmula(watermark.getText()); |
||||||
|
populateFontSize(watermark.getFontSize()); |
||||||
|
populateColor(watermark.getColor()); |
||||||
|
paintPreviewPane(); |
||||||
|
} |
||||||
|
|
||||||
|
public Watermark update() { |
||||||
|
Watermark watermark = new Watermark(); |
||||||
|
watermark.setText(formulaPane.getUITextField().getText()); |
||||||
|
watermark.setFontSize((int)fontSizeComboBox.getSelectedItem()); |
||||||
|
watermark.setColor(colorPane.getColor()); |
||||||
|
return watermark; |
||||||
|
} |
||||||
|
|
||||||
|
public TinyFormulaPane getFormulaPane() { |
||||||
|
return formulaPane; |
||||||
|
} |
||||||
|
|
||||||
|
public void setFormulaPane(TinyFormulaPane formulaPane) { |
||||||
|
this.formulaPane = formulaPane; |
||||||
|
} |
||||||
|
|
||||||
|
protected UIScrollPane initRightPane(){ |
||||||
|
formulaPane = new TinyFormulaPane(); |
||||||
|
fontSizeComboBox = new UIComboBox(FRFontPane.FONT_SIZES); |
||||||
|
JPanel fontSizeTypePane = new JPanel(new BorderLayout(10,0)); |
||||||
|
fontSizeTypePane.add(fontSizeComboBox, BorderLayout.CENTER); |
||||||
|
|
||||||
|
colorPane = new NewColorSelectPane(); |
||||||
|
JPanel colorLabelPane = FRGUIPaneFactory.createBorderLayout_S_Pane(); |
||||||
|
colorLabelPane.add(new UILabel(Inter.getLocText("FR-Designer_Text_Color")), BorderLayout.NORTH); |
||||||
|
|
||||||
|
double p = TableLayout.PREFERRED; |
||||||
|
double[] rowSize = {p,p,p}; |
||||||
|
double[] columnSize = { p, MAX_WIDTH}; |
||||||
|
|
||||||
|
JPanel rightContentPane = TableLayoutHelper.createCommonTableLayoutPane( new JComponent[][]{ |
||||||
|
{new UILabel(Inter.getLocText("FR-Designer_Watermark_Text")), formulaPane}, |
||||||
|
{new UILabel(Inter.getLocText("FR-Designer_Font_Size")), fontSizeTypePane}, |
||||||
|
{colorLabelPane, colorPane}, |
||||||
|
}, rowSize, columnSize, 10); |
||||||
|
rightContentPane.setBorder(BorderFactory.createEmptyBorder(15, 12, 10, 12)); |
||||||
|
|
||||||
|
UIScrollPane configPane = new UIScrollPane(rightContentPane); |
||||||
|
configPane.setBorder(GUICoreUtils.createTitledBorder(Inter.getLocText("FR-Designer_Config"),null)); |
||||||
|
return configPane; |
||||||
|
} |
||||||
|
|
||||||
|
protected void populateFontSize(int fontSize){ |
||||||
|
this.fontSizeComboBox.setSelectedItem(fontSize); |
||||||
|
this.fontSizeComboBox.addItemListener(new ItemListener() { |
||||||
|
@Override |
||||||
|
public void itemStateChanged(ItemEvent e) { |
||||||
|
paintPreviewPane(); |
||||||
|
} |
||||||
|
}); |
||||||
|
} |
||||||
|
|
||||||
|
protected void paintPreviewPane(){ |
||||||
|
watermarkPreviewPane.repaint(update()); |
||||||
|
} |
||||||
|
|
||||||
|
private void populateFourmula(String formula) { |
||||||
|
this.formulaPane.populateBean(formula); |
||||||
|
this.formulaPane.getUITextField().getDocument() |
||||||
|
.addDocumentListener(new DocumentListener() { |
||||||
|
@Override |
||||||
|
public void insertUpdate(DocumentEvent e) { |
||||||
|
paintPreviewPane(); |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
public void removeUpdate(DocumentEvent e) { |
||||||
|
paintPreviewPane(); |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
public void changedUpdate(DocumentEvent e) { |
||||||
|
paintPreviewPane(); |
||||||
|
} |
||||||
|
}); |
||||||
|
} |
||||||
|
|
||||||
|
private void populateColor(Color color) { |
||||||
|
colorPane.setColor(color); |
||||||
|
colorPane.addChangeListener(new ChangeListener() { |
||||||
|
@Override |
||||||
|
public void stateChanged(ChangeEvent e) { |
||||||
|
paintPreviewPane(); |
||||||
|
} |
||||||
|
}); |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
protected String title4PopupWindow() { |
||||||
|
return Inter.getLocText("FR-Designer_WaterMark"); |
||||||
|
} |
||||||
|
} |
@ -0,0 +1,84 @@ |
|||||||
|
package com.fr.design.report; |
||||||
|
|
||||||
|
import com.fr.base.Watermark; |
||||||
|
import com.fr.design.constants.UIConstants; |
||||||
|
import com.fr.general.FRFont; |
||||||
|
import com.fr.stable.StringUtils; |
||||||
|
|
||||||
|
import javax.swing.JPanel; |
||||||
|
import java.awt.Color; |
||||||
|
import java.awt.FontMetrics; |
||||||
|
import java.awt.Graphics; |
||||||
|
import java.awt.Graphics2D; |
||||||
|
import java.awt.Image; |
||||||
|
import java.awt.image.BufferedImage; |
||||||
|
|
||||||
|
/** |
||||||
|
* Created by plough on 2018/5/15. |
||||||
|
*/ |
||||||
|
public class WatermarkPreviewPane extends JPanel { |
||||||
|
private static final double SCALE_FACTOR = 3; // 水印层的放大比例
|
||||||
|
private static final int ROTATE_DEGREE = -20; // 旋转角度
|
||||||
|
// 绘制水印层的坐标,用来控制图层偏移
|
||||||
|
private static final int MARK_X = 0; |
||||||
|
private static final int MARK_Y = -120; |
||||||
|
|
||||||
|
private int horizontalGap = 20; // 水平间隔(一个中文字符宽度)
|
||||||
|
private int verticalGap = 40; // 垂直间隔(两个中文字符宽度)
|
||||||
|
private Watermark watermark; |
||||||
|
|
||||||
|
|
||||||
|
public WatermarkPreviewPane() { |
||||||
|
this.watermark = new Watermark(); |
||||||
|
repaint(); |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* 重新画 |
||||||
|
*/ |
||||||
|
public void repaint(Watermark watermark){ |
||||||
|
this.watermark = watermark; |
||||||
|
super.repaint(); |
||||||
|
} |
||||||
|
|
||||||
|
private void updateGap(FontMetrics fontMetrics) { |
||||||
|
horizontalGap = fontMetrics.stringWidth("帆"); // 任意一个中文字符
|
||||||
|
verticalGap = horizontalGap * 2; |
||||||
|
} |
||||||
|
|
||||||
|
private int getLineHeight() { |
||||||
|
return horizontalGap; |
||||||
|
} |
||||||
|
|
||||||
|
private BufferedImage paintWatermark() { |
||||||
|
int width = (int)(this.getWidth() * SCALE_FACTOR); |
||||||
|
int height = (int)(this.getHeight() * SCALE_FACTOR); |
||||||
|
BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_ARGB); |
||||||
|
Graphics g = image.getGraphics(); |
||||||
|
g.setColor(watermark.getColor()); |
||||||
|
g.setFont(FRFont.getInstance().applySize(watermark.getFontSize())); |
||||||
|
updateGap(g.getFontMetrics()); |
||||||
|
for (int y = getLineHeight(); y < height; y += verticalGap) { |
||||||
|
for (int x = 0; x < width; x += horizontalGap) { |
||||||
|
g.drawString(watermark.getText(), x, y); |
||||||
|
x += g.getFontMetrics().stringWidth(watermark.getText()); |
||||||
|
} |
||||||
|
y += getLineHeight(); |
||||||
|
} |
||||||
|
return image; |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
public void paint(Graphics g) { |
||||||
|
super.paint(g); |
||||||
|
Graphics2D g2d = (Graphics2D)g; |
||||||
|
g2d.drawImage(UIConstants.WATERMARK_BACKGROUND, 0, 0, this.getWidth(), this.getHeight(), null); |
||||||
|
BufferedImage markImage = paintWatermark(); |
||||||
|
g2d.rotate( |
||||||
|
Math.toRadians(ROTATE_DEGREE), |
||||||
|
(double) markImage.getWidth() / 2, |
||||||
|
(double) markImage.getHeight() / 2 |
||||||
|
); |
||||||
|
g.drawImage(markImage, MARK_X, MARK_Y, null); |
||||||
|
} |
||||||
|
} |
@ -0,0 +1,48 @@ |
|||||||
|
package com.fr.design.mainframe.widget.accessibles; |
||||||
|
|
||||||
|
import com.fr.base.Watermark; |
||||||
|
import com.fr.design.dialog.BasicDialog; |
||||||
|
import com.fr.design.dialog.DialogActionAdapter; |
||||||
|
import com.fr.design.mainframe.widget.editors.ITextComponent; |
||||||
|
import com.fr.design.mainframe.widget.renderer.WatermarkRenderer; |
||||||
|
import com.fr.design.mainframe.widget.wrappers.WatermarkWrapper; |
||||||
|
import com.fr.design.report.WatermarkPane; |
||||||
|
|
||||||
|
import javax.swing.SwingUtilities; |
||||||
|
import java.awt.Dimension; |
||||||
|
|
||||||
|
/** |
||||||
|
* Created by plough on 2018/5/15. |
||||||
|
*/ |
||||||
|
|
||||||
|
public class AccessibleBodyWatermarkEditor extends UneditableAccessibleEditor { |
||||||
|
private WatermarkPane watermarkPane; |
||||||
|
|
||||||
|
public AccessibleBodyWatermarkEditor() { |
||||||
|
super(new WatermarkWrapper()); |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
protected ITextComponent createTextField() { |
||||||
|
return new RendererField(new WatermarkRenderer()); |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
protected void showEditorPane() { |
||||||
|
if (watermarkPane == null) { |
||||||
|
watermarkPane = new WatermarkPane(); |
||||||
|
watermarkPane.setPreferredSize(new Dimension(600, 400)); |
||||||
|
} |
||||||
|
BasicDialog dlg = watermarkPane.showWindow(SwingUtilities.getWindowAncestor(this)); |
||||||
|
dlg.addDialogActionListener(new DialogActionAdapter() { |
||||||
|
|
||||||
|
@Override |
||||||
|
public void doOk() { |
||||||
|
setValue(watermarkPane.update()); |
||||||
|
fireStateChanged(); |
||||||
|
} |
||||||
|
}); |
||||||
|
watermarkPane.populate((Watermark) getValue()); |
||||||
|
dlg.setVisible(true); |
||||||
|
} |
||||||
|
} |
@ -0,0 +1,14 @@ |
|||||||
|
package com.fr.design.mainframe.widget.renderer; |
||||||
|
|
||||||
|
import com.fr.design.mainframe.widget.wrappers.WatermarkWrapper; |
||||||
|
|
||||||
|
/** |
||||||
|
* Created by plough on 2018/5/15. |
||||||
|
*/ |
||||||
|
public class WatermarkRenderer extends EncoderCellRenderer { |
||||||
|
|
||||||
|
public WatermarkRenderer() { |
||||||
|
super(new WatermarkWrapper()); |
||||||
|
} |
||||||
|
|
||||||
|
} |
@ -0,0 +1,26 @@ |
|||||||
|
package com.fr.design.mainframe.widget.wrappers; |
||||||
|
|
||||||
|
import com.fr.base.Watermark; |
||||||
|
import com.fr.design.Exception.ValidationException; |
||||||
|
import com.fr.design.designer.properties.Decoder; |
||||||
|
import com.fr.design.designer.properties.Encoder; |
||||||
|
|
||||||
|
/** |
||||||
|
* Created by plough on 2018/5/15. |
||||||
|
*/ |
||||||
|
public class WatermarkWrapper implements Encoder, Decoder { |
||||||
|
@Override |
||||||
|
public Object decode(String txt) { |
||||||
|
return new Watermark(); |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
public void validate(String txt) throws ValidationException { |
||||||
|
// do nothing
|
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
public String encode(Object v) { |
||||||
|
return ((Watermark)v).getText(); |
||||||
|
} |
||||||
|
} |
@ -0,0 +1,48 @@ |
|||||||
|
package com.fr.design.actions.report; |
||||||
|
|
||||||
|
import com.fr.base.BaseUtils; |
||||||
|
import com.fr.design.actions.ReportComponentAction; |
||||||
|
import com.fr.design.dialog.DialogActionAdapter; |
||||||
|
import com.fr.design.mainframe.DesignerContext; |
||||||
|
import com.fr.design.mainframe.ReportComponent; |
||||||
|
import com.fr.design.menu.KeySetUtils; |
||||||
|
import com.fr.design.report.WatermarkPane; |
||||||
|
import com.fr.report.core.ReportUtils; |
||||||
|
import com.fr.report.stable.ReportSettings; |
||||||
|
|
||||||
|
/** |
||||||
|
* Created by plough on 2018/5/15. |
||||||
|
*/ |
||||||
|
public class ReportWatermarkAction extends ReportComponentAction<ReportComponent> { |
||||||
|
|
||||||
|
public ReportWatermarkAction(ReportComponent rc) { |
||||||
|
super(rc); |
||||||
|
this.setMenuKeySet(KeySetUtils.REPORT_WATERMARK); |
||||||
|
this.setName(getMenuKeySet().getMenuKeySetName() + "..."); |
||||||
|
this.setMnemonic(getMenuKeySet().getMnemonic()); |
||||||
|
this.setSmallIcon(BaseUtils.readIcon("/com/fr/design/images/m_report/watermark.png")); |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* 执行动作 |
||||||
|
* @return 是否执行成功 |
||||||
|
*/ |
||||||
|
public boolean executeActionReturnUndoRecordNeeded() { |
||||||
|
final ReportComponent reportPane = this.getEditingComponent(); |
||||||
|
if (reportPane == null) { |
||||||
|
return false; |
||||||
|
} |
||||||
|
final WatermarkPane watermarkPane = new WatermarkPane(); |
||||||
|
ReportSettings reportSettings = (ReportSettings) ReportUtils.getReportSettings(reportPane.getTemplateReport()); |
||||||
|
watermarkPane.populate(reportSettings.getWatermark()); |
||||||
|
watermarkPane.showWindow(DesignerContext.getDesignerFrame(), new DialogActionAdapter() { |
||||||
|
@Override |
||||||
|
public void doOk() { |
||||||
|
reportSettings.setWatermark(watermarkPane.update()); |
||||||
|
reportPane.fireTargetModified(); |
||||||
|
} |
||||||
|
}).setVisible(true); |
||||||
|
|
||||||
|
return false; |
||||||
|
} |
||||||
|
} |
Loading…
Reference in new issue