forked from fanruan/design
plough
6 years ago
13 changed files with 395 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; |
||||||
|
|
||||||
|
private UIScrollPane titlePane; |
||||||
|
|
||||||
|
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()); |
||||||
|
} |
||||||
|
|
||||||
|
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("文字颜色"), BorderLayout.NORTH); |
||||||
|
|
||||||
|
double p = TableLayout.PREFERRED; |
||||||
|
double[] rowSize = {p,p,p}; |
||||||
|
double[] columnSize = { p, MAX_WIDTH}; |
||||||
|
|
||||||
|
JPanel rightContentPane = TableLayoutHelper.createCommonTableLayoutPane( new JComponent[][]{ |
||||||
|
{new UILabel("文字"), formulaPane}, |
||||||
|
{new UILabel("字号"), fontSizeTypePane}, |
||||||
|
{colorLabelPane, colorPane}, |
||||||
|
}, rowSize, columnSize, 10); |
||||||
|
rightContentPane.setBorder(BorderFactory.createEmptyBorder(15, 12, 10, 12)); |
||||||
|
titlePane =new UIScrollPane(rightContentPane); |
||||||
|
titlePane.setBorder(GUICoreUtils.createTitledBorder("配置",null)); |
||||||
|
return titlePane; |
||||||
|
} |
||||||
|
|
||||||
|
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 "水印"; |
||||||
|
} |
||||||
|
} |
@ -0,0 +1,37 @@ |
|||||||
|
package com.fr.design.report; |
||||||
|
|
||||||
|
import com.fr.base.Watermark; |
||||||
|
import com.fr.design.constants.UIConstants; |
||||||
|
import com.fr.general.FRFont; |
||||||
|
|
||||||
|
import javax.swing.JPanel; |
||||||
|
import java.awt.Graphics; |
||||||
|
|
||||||
|
/** |
||||||
|
* Created by plough on 2018/5/15. |
||||||
|
*/ |
||||||
|
public class WatermarkPreviewPane extends JPanel { |
||||||
|
Watermark watermark; |
||||||
|
|
||||||
|
public WatermarkPreviewPane() { |
||||||
|
this.watermark = new Watermark(); |
||||||
|
repaint(); |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* 重新画 |
||||||
|
*/ |
||||||
|
public void repaint(Watermark watermark){ |
||||||
|
this.watermark = watermark; |
||||||
|
super.repaint(); |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
public void paint(Graphics g) { |
||||||
|
super.paint(g); |
||||||
|
g.drawImage(UIConstants.WATERMARK_BACKGROUND, 0, 0, this.getWidth(), this.getHeight(), null); |
||||||
|
g.setColor(watermark.getColor()); |
||||||
|
g.setFont(FRFont.getInstance().applySize(watermark.getFontSize())); |
||||||
|
g.drawString(watermark.getText(), 20, 20); |
||||||
|
} |
||||||
|
} |
@ -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,25 @@ |
|||||||
|
package com.fr.design.mainframe.widget.wrappers; |
||||||
|
|
||||||
|
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 null; |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
public void validate(String txt) throws ValidationException { |
||||||
|
|
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
public String encode(Object v) { |
||||||
|
return "watermark"; |
||||||
|
} |
||||||
|
} |
@ -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