Browse Source
Merge in DESIGN/design from ~KERRY/design_10.0:feature/x to feature/x * commit '510117c2a75a9bcb6229832a3bc84f08c047e92c': REPORT-64445 新老自适应配置面板修改feature/x
kerry
3 years ago
16 changed files with 1032 additions and 399 deletions
@ -0,0 +1,78 @@
|
||||
package com.fr.design.gui.ilable; |
||||
|
||||
import javax.swing.JLabel; |
||||
import java.awt.Dimension; |
||||
import java.awt.FontMetrics; |
||||
import java.util.ArrayList; |
||||
import java.util.List; |
||||
|
||||
public class UIAutoChangeLineLabel extends JLabel { |
||||
private final String text; |
||||
private final int width; |
||||
|
||||
|
||||
public UIAutoChangeLineLabel(String text, int width) { |
||||
super(text); |
||||
this.text = text; |
||||
this.width = width; |
||||
} |
||||
|
||||
|
||||
@Override |
||||
public void doLayout() { |
||||
super.doLayout(); |
||||
this.setText(wrapperHtmlText()); |
||||
} |
||||
|
||||
private String wrapperHtmlText() { |
||||
List<String> stringList = autoChangeLine(this.getWidth()); |
||||
StringBuilder builder = new StringBuilder("<html>"); |
||||
for (String s : stringList) { |
||||
//用THML标签进行拼接,以实现自动换行
|
||||
builder.append(s).append("<br/>"); |
||||
} |
||||
builder.append("</html>"); |
||||
return builder.toString(); |
||||
} |
||||
|
||||
private List<String> autoChangeLine(int width) { |
||||
List<String> result = new ArrayList<>(); |
||||
if (width <= 0) { |
||||
result.add(this.text); |
||||
} else { |
||||
|
||||
char[] chars = this.text.toCharArray(); |
||||
//获取字体计算大小
|
||||
FontMetrics fontMetrics = this.getFontMetrics(this.getFont()); |
||||
int start = 0; |
||||
int len = 0; |
||||
while (start + len < this.text.length()) { |
||||
while (true) { |
||||
len++; |
||||
if (start + len > this.text.length()) |
||||
break; |
||||
if (fontMetrics.charsWidth(chars, start, len) |
||||
> width) { |
||||
break; |
||||
} |
||||
} |
||||
result.add(String.copyValueOf(chars, start, len - 1)); |
||||
start = start + len - 1; |
||||
len = 0; |
||||
} |
||||
if (this.text.length() - start > 0) { |
||||
result.add(String.copyValueOf(chars, start, this.text.length() - start)); |
||||
} |
||||
} |
||||
return result; |
||||
} |
||||
|
||||
|
||||
@Override |
||||
public Dimension getPreferredSize() { |
||||
Dimension preferredSize = super.getPreferredSize(); |
||||
List<String> stringList = autoChangeLine(width); |
||||
FontMetrics fontMetrics = this.getFontMetrics(this.getFont()); |
||||
return new Dimension(preferredSize.width, fontMetrics.getHeight() * stringList.size()); |
||||
} |
||||
} |
@ -0,0 +1,128 @@
|
||||
package com.fr.design.report.fit; |
||||
|
||||
|
||||
import com.fr.design.designer.properties.items.Item; |
||||
import com.fr.form.fit.common.LightTool; |
||||
import com.fr.form.main.BodyScaleAttrTransformer; |
||||
import com.fr.form.main.Form; |
||||
import com.fr.form.ui.container.WAbsoluteLayout; |
||||
import com.fr.form.ui.container.WBodyLayoutType; |
||||
import com.fr.form.ui.container.WFitLayout; |
||||
|
||||
public enum FormFitAttrModelType { |
||||
PLAIN_FORM_FIT_ATTR_MODEL { |
||||
@Override |
||||
public FitAttrModel getFitAttrModel() { |
||||
return new FrmFitAttrModel(); |
||||
} |
||||
|
||||
@Override |
||||
public Item[] getFitLayoutScaleAttr() { |
||||
return new Item[]{ |
||||
new Item(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Form_Attr_Bidirectional_Adaptive"), WFitLayout.STATE_FULL), |
||||
new Item(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Form_Attr_Horizontal_Adaptive"), WFitLayout.STATE_ORIGIN)}; |
||||
|
||||
} |
||||
|
||||
@Override |
||||
public Item[] getAbsoluteLayoutSaleAttr() { |
||||
return new Item[]{ |
||||
new Item(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Form_Widget_Scaling_Mode_Fit"), WAbsoluteLayout.STATE_FIT), |
||||
new Item(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Form_Widget_Scaling_Mode_Fixed"), WAbsoluteLayout.STATE_FIXED) |
||||
}; |
||||
} |
||||
|
||||
|
||||
@Override |
||||
public int getScaleAttrShowIndex(WFitLayout wFitLayout) { |
||||
int scale = wFitLayout.getScaleAttr(); |
||||
if (wFitLayout.getBodyLayoutType() == WBodyLayoutType.FIT) { |
||||
return BodyScaleAttrTransformer.getFitBodyCompStateFromScaleAttr(scale); |
||||
} else { |
||||
return BodyScaleAttrTransformer.getAbsoluteBodyCompStateFromScaleAttr(scale); |
||||
} |
||||
} |
||||
|
||||
@Override |
||||
public int parseScaleAttrFromShowIndex(int showIndex, WBodyLayoutType wBodyLayoutType) { |
||||
if (wBodyLayoutType == WBodyLayoutType.FIT) { |
||||
if (showIndex == 0) { |
||||
return WFitLayout.SCALE_FULL; |
||||
} else { |
||||
return WFitLayout.SCALE_HOR; |
||||
} |
||||
} else { |
||||
if (showIndex == 0) { |
||||
return WFitLayout.SCALE_FULL; |
||||
} else { |
||||
return WFitLayout.SCALE_NO; |
||||
} |
||||
} |
||||
} |
||||
|
||||
|
||||
}, |
||||
NEW_FORM_FIT_ATTR_MODEL { |
||||
@Override |
||||
public FitAttrModel getFitAttrModel() { |
||||
return new AdaptiveFrmFitAttrModel(); |
||||
} |
||||
|
||||
@Override |
||||
public Item[] getFitLayoutScaleAttr() { |
||||
return new Item[]{ |
||||
new Item(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Form_Attr_Bidirectional_Adaptive"), WFitLayout.STATE_FULL), |
||||
new Item(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Form_Attr_Horizontal_Adaptive"), WFitLayout.STATE_ORIGIN), |
||||
new Item(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Form_Widget_Scaling_Mode_Fixed"), 2)}; |
||||
} |
||||
|
||||
@Override |
||||
public Item[] getAbsoluteLayoutSaleAttr() { |
||||
return new Item[]{ |
||||
new Item(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Form_Attr_Bidirectional_Adaptive"), WFitLayout.STATE_FULL), |
||||
new Item(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Form_Attr_Horizontal_Adaptive"), WFitLayout.STATE_ORIGIN), |
||||
new Item(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Form_Widget_Scaling_Mode_Fixed"), 2)}; |
||||
} |
||||
|
||||
|
||||
@Override |
||||
public int getScaleAttrShowIndex(WFitLayout wFitLayout) { |
||||
int scale = wFitLayout.getScaleAttr(); |
||||
if (scale == WFitLayout.SCALE_NO) { |
||||
return 2; |
||||
} else if (scale == WFitLayout.SCALE_HOR) { |
||||
return 1; |
||||
} else { |
||||
return 0; |
||||
} |
||||
} |
||||
|
||||
@Override |
||||
public int parseScaleAttrFromShowIndex(int showIndex, WBodyLayoutType wBodyLayoutType) { |
||||
if (showIndex == 0) { |
||||
return WFitLayout.SCALE_FULL; |
||||
} else if (showIndex == 1) { |
||||
return WFitLayout.SCALE_HOR; |
||||
} else { |
||||
return WFitLayout.SCALE_NO; |
||||
} |
||||
} |
||||
|
||||
|
||||
}; |
||||
|
||||
public abstract FitAttrModel getFitAttrModel(); |
||||
|
||||
public abstract Item[] getFitLayoutScaleAttr(); |
||||
|
||||
public abstract Item[] getAbsoluteLayoutSaleAttr(); |
||||
|
||||
public abstract int getScaleAttrShowIndex(WFitLayout wFitLayout); |
||||
|
||||
public abstract int parseScaleAttrFromShowIndex(int showIndex, WBodyLayoutType wBodyLayoutType); |
||||
|
||||
|
||||
public static FormFitAttrModelType parse(Form form) { |
||||
return LightTool.containNewFormFlag(form) ? NEW_FORM_FIT_ATTR_MODEL : PLAIN_FORM_FIT_ATTR_MODEL; |
||||
} |
||||
} |
@ -0,0 +1,59 @@
|
||||
package com.fr.design.report.fit; |
||||
|
||||
import com.fr.design.gui.ilable.UILabel; |
||||
import com.fr.design.i18n.Toolkit; |
||||
import com.fr.design.layout.FRGUIPaneFactory; |
||||
import com.fr.report.fit.ReportFitAttr; |
||||
|
||||
import javax.swing.JPanel; |
||||
import java.awt.BorderLayout; |
||||
import java.awt.Color; |
||||
import java.awt.Component; |
||||
|
||||
public class FormFitConfigPane extends ReportFitConfigPane { |
||||
private static final int DEFAULT_ITEM = 0; |
||||
private static final int CUSTOM_ITEM = 1; |
||||
|
||||
public FormFitConfigPane(FitAttrModel fitAttrModel) { |
||||
this(fitAttrModel, false); |
||||
} |
||||
|
||||
public FormFitConfigPane(FitAttrModel fitAttrModel, boolean globalConfig) { |
||||
super(fitAttrModel, globalConfig); |
||||
} |
||||
|
||||
protected JPanel initECConfigPane() { |
||||
JPanel jPanel = FRGUIPaneFactory.createBorderLayout_S_Pane(); |
||||
if (fitAttrModel.getFitTypeNames().length != 0) { |
||||
Component[] ecComponents = new Component[fitAttrModel.getFitTypeNames().length + 1]; |
||||
initRadioGroup(ecConfigRadioGroup, fitAttrModel.getFitName(), fitAttrModel.getFitTypeNames(), ecComponents); |
||||
jPanel.add(createSubAttrPane(ecComponents), BorderLayout.CENTER); |
||||
jPanel.add(createTipPane(), BorderLayout.SOUTH); |
||||
} |
||||
return jPanel; |
||||
} |
||||
|
||||
private JPanel createTipPane() { |
||||
JPanel jPanel = FRGUIPaneFactory.createVerticalFlowLayout_S_Pane(true); |
||||
UILabel label1 = new UILabel(Toolkit.i18nText("Fine-Design_Form_PC_FIT_Config_Tip1")); |
||||
jPanel.add(label1); |
||||
label1.setForeground(Color.lightGray); |
||||
UILabel label2 = new UILabel(Toolkit.i18nText("Fine-Design_Form_PC_FIT_Config_Tip2")); |
||||
jPanel.add(label2); |
||||
label2.setForeground(Color.lightGray); |
||||
return jPanel; |
||||
} |
||||
|
||||
protected void refreshPreviewJPanel() { |
||||
previewJPanel.refreshPreview(fontRadioGroup.isFontFit()); |
||||
} |
||||
|
||||
protected void populateECConfigRadioGroup(int fitStateInPC) { |
||||
ecConfigRadioGroup.selectIndexButton(fitStateInPC == 0 ? DEFAULT_ITEM : CUSTOM_ITEM); |
||||
} |
||||
|
||||
protected void updateECConfigRadioGroup(ReportFitAttr reportFitAttr) { |
||||
reportFitAttr.setFitStateInPC(ecConfigRadioGroup.getSelectRadioIndex()); |
||||
} |
||||
|
||||
} |
@ -0,0 +1,71 @@
|
||||
package com.fr.design.report.fit; |
||||
|
||||
import com.fr.base.GraphHelper; |
||||
import com.fr.general.FRFont; |
||||
|
||||
import javax.swing.JPanel; |
||||
import java.awt.Color; |
||||
import java.awt.Dimension; |
||||
import java.awt.Font; |
||||
import java.awt.FontMetrics; |
||||
import java.awt.Graphics; |
||||
|
||||
|
||||
public class NewFitPreviewPane extends JPanel { |
||||
private boolean fitFont = false; |
||||
private FitType fitType = FitType.DOUBLE_FIT; |
||||
private static final Color DEFAULT_PAINT_COLOR = Color.decode("#419BF9"); |
||||
private static final int FIT_FONT_SIZE = 15; |
||||
private static final int NO_FIT_FONT_SIZE = 9; |
||||
private static final Dimension NO_FIT_CONTAINER_DIMENSION = new Dimension(200, 136); |
||||
|
||||
@Override |
||||
public void paint(Graphics g) { |
||||
super.paint(g); |
||||
g.setColor(Color.GRAY); |
||||
GraphHelper.drawRect(g, 1, 1, this.getWidth() - 2, this.getHeight() - 2); |
||||
g.setColor(DEFAULT_PAINT_COLOR); |
||||
FRFont textFont = FRFont.getInstance(FRFont.DEFAULT_FONTNAME, Font.PLAIN, fitFont ? FIT_FONT_SIZE : NO_FIT_FONT_SIZE); |
||||
g.setFont(textFont); |
||||
Dimension dimension = calculateCellDimension(); |
||||
GraphHelper.drawLine(g, 1, dimension.height, dimension.width * 2 - 1, dimension.height); |
||||
GraphHelper.drawLine(g, dimension.width, 1, dimension.width, dimension.height * 2 - 1); |
||||
GraphHelper.drawRect(g, 1, 1, dimension.width * 2 - 2, dimension.height * 2 - 2); |
||||
double startX = calculateTextDrawStartX(dimension.width, this.getFontMetrics(textFont), "text1"); |
||||
double startY = calculateTextDrawStartY(dimension.height); |
||||
GraphHelper.drawString(g, "text1", startX, startY); |
||||
GraphHelper.drawString(g, "text2", dimension.width + startX, startY); |
||||
GraphHelper.drawString(g, "text3", startX, dimension.height + startY); |
||||
GraphHelper.drawString(g, "text4", dimension.width + startX, dimension.height + startY); |
||||
} |
||||
|
||||
private Dimension calculateCellDimension() { |
||||
if (fitType == FitType.DOUBLE_FIT) { |
||||
return new Dimension(this.getWidth() / 2, this.getHeight() / 2); |
||||
} else if (fitType == FitType.NOT_FIT) { |
||||
return new Dimension(NO_FIT_CONTAINER_DIMENSION.width / 2, NO_FIT_CONTAINER_DIMENSION.height / 2); |
||||
} else { |
||||
return new Dimension(this.getWidth() / 2, NO_FIT_CONTAINER_DIMENSION.height / 2); |
||||
} |
||||
} |
||||
|
||||
private double calculateTextDrawStartX(int containerWidth, FontMetrics fontMetrics, String text) { |
||||
return (containerWidth - fontMetrics.stringWidth(text)) / 2.0D; |
||||
} |
||||
|
||||
private double calculateTextDrawStartY(int containerHeight) { |
||||
return containerHeight / 2.0D; |
||||
} |
||||
|
||||
public void refreshPreview(boolean fitFont, FitType fitType) { |
||||
this.fitFont = fitFont; |
||||
this.fitType = fitType; |
||||
repaint(); |
||||
} |
||||
|
||||
public void refreshPreview(boolean fitFont) { |
||||
this.fitFont = fitFont; |
||||
repaint(); |
||||
} |
||||
|
||||
} |
@ -0,0 +1,172 @@
|
||||
package com.fr.design.report.fit; |
||||
|
||||
import com.fr.design.gui.ibutton.UIRadioButton; |
||||
import com.fr.design.gui.ilable.UILabel; |
||||
import com.fr.design.i18n.DesignSizeI18nManager; |
||||
import com.fr.design.layout.FRGUIPaneFactory; |
||||
import com.fr.design.layout.TableLayoutHelper; |
||||
import com.fr.design.report.fit.menupane.FitRadioGroup; |
||||
import com.fr.design.report.fit.menupane.FontRadioGroup; |
||||
import com.fr.general.ComparatorUtils; |
||||
import com.fr.report.fit.ReportFitAttr; |
||||
|
||||
import javax.swing.BorderFactory; |
||||
import javax.swing.JPanel; |
||||
import java.awt.BorderLayout; |
||||
import java.awt.Component; |
||||
import java.awt.Dimension; |
||||
import java.awt.FlowLayout; |
||||
import java.awt.event.ActionEvent; |
||||
import java.awt.event.ActionListener; |
||||
|
||||
import static com.fr.design.i18n.Toolkit.i18nText; |
||||
|
||||
public class ReportFitConfigPane extends JPanel { |
||||
public FontRadioGroup fontRadioGroup; |
||||
public FitRadioGroup ecConfigRadioGroup; |
||||
protected NewFitPreviewPane previewJPanel; |
||||
protected FitAttrModel fitAttrModel; |
||||
protected boolean globalConfig; |
||||
|
||||
|
||||
public ReportFitConfigPane(FitAttrModel fitAttrModel, boolean globalConfig) { |
||||
this.fitAttrModel = fitAttrModel; |
||||
this.globalConfig = globalConfig; |
||||
initComponent(); |
||||
} |
||||
|
||||
private void initComponent() { |
||||
JPanel contentJPanel = FRGUIPaneFactory.createVerticalFlowLayout_Pane(false, FlowLayout.LEFT, 0, 0); |
||||
this.add(contentJPanel); |
||||
fontRadioGroup = new FontRadioGroup(); |
||||
ecConfigRadioGroup = new FitRadioGroup(); |
||||
contentJPanel.add(initAttrJPanel()); |
||||
contentJPanel.add(initPreviewJPanel()); |
||||
} |
||||
|
||||
private JPanel initAttrJPanel() { |
||||
JPanel jPanel = FRGUIPaneFactory.createBorderLayout_S_Pane(); |
||||
Component[] fontComponents = new Component[3]; |
||||
initRadioGroup(fontRadioGroup, i18nText("Fine-Designer_Fit-Font"), new String[]{i18nText("Fine-Designer_Fit"), i18nText("Fine-Designer_Fit-No")}, fontComponents); |
||||
jPanel.add(createSubAttrPane(fontComponents), BorderLayout.NORTH); |
||||
jPanel.add(initECConfigPane(), BorderLayout.CENTER); |
||||
return jPanel; |
||||
} |
||||
|
||||
protected JPanel initECConfigPane() { |
||||
JPanel jPanel = FRGUIPaneFactory.createBorderLayout_S_Pane(); |
||||
Component[] ecComponents = new Component[fitAttrModel.getFitTypeNames().length + 1]; |
||||
initRadioGroup(ecConfigRadioGroup, fitAttrModel.getFitName(), fitAttrModel.getFitTypeNames(), ecComponents); |
||||
jPanel.add(createSubAttrPane(ecComponents), BorderLayout.CENTER); |
||||
return jPanel; |
||||
} |
||||
|
||||
|
||||
protected JPanel createSubAttrPane(Component[] components) { |
||||
double[] rowSize = new double[]{20}; |
||||
double[] columnSize = new double[components.length]; |
||||
for (int i = 0; i < columnSize.length; i++) { |
||||
if (i == 0) { |
||||
columnSize[i] = DesignSizeI18nManager.getInstance().i18nDimension("com.fr.design.report.fit.firstColumn").getWidth(); |
||||
} else { |
||||
columnSize[i] = DesignSizeI18nManager.getInstance().i18nDimension("com.fr.design.report.fit.column").getWidth(); |
||||
} |
||||
} |
||||
|
||||
JPanel attrJPanel = TableLayoutHelper.createTableLayoutPane(new Component[][]{components}, rowSize, columnSize); |
||||
attrJPanel.setBorder(BorderFactory.createEmptyBorder(5, 0, 10, 0)); |
||||
return attrJPanel; |
||||
} |
||||
|
||||
protected void initRadioGroup(FitRadioGroup fitRadioGroup, String name, String[] options, Component[] components) { |
||||
components[0] = new UILabel(name); |
||||
for (int i = 0; i < options.length; i++) { |
||||
|
||||
if (options[i] != null) { |
||||
UIRadioButton fontFitRadio = new UIRadioButton(options[i]); |
||||
fitRadioGroup.add(fontFitRadio); |
||||
components[i + 1] = fontFitRadio; |
||||
} else { |
||||
components[i + 1] = null; |
||||
} |
||||
} |
||||
fitRadioGroup.addActionListener(getPreviewActionListener()); |
||||
} |
||||
|
||||
private ActionListener getPreviewActionListener() { |
||||
return new ActionListener() { |
||||
@Override |
||||
public void actionPerformed(ActionEvent e) { |
||||
refreshPreviewJPanel(); |
||||
} |
||||
}; |
||||
} |
||||
|
||||
public void refreshPreviewJPanel(FitType fitType) { |
||||
previewJPanel.refreshPreview(fontRadioGroup.isFontFit(), fitType); |
||||
} |
||||
|
||||
protected void refreshPreviewJPanel() { |
||||
previewJPanel.refreshPreview(fontRadioGroup.isFontFit(), FitType.parse(updateBean())); |
||||
} |
||||
|
||||
private JPanel initPreviewJPanel() { |
||||
JPanel wrapperPane = FRGUIPaneFactory.createBorderLayout_S_Pane(); |
||||
previewJPanel = new NewFitPreviewPane(); |
||||
wrapperPane.add(previewJPanel, BorderLayout.CENTER); |
||||
int leftIndent = globalConfig ? (int) DesignSizeI18nManager.getInstance().i18nDimension("com.fr.design.report.fit.firstColumn").getWidth() : 0; |
||||
wrapperPane.setBorder(BorderFactory.createEmptyBorder(0, leftIndent, 0, 0)); |
||||
wrapperPane.setPreferredSize(new Dimension(300 + leftIndent, 204)); |
||||
return wrapperPane; |
||||
} |
||||
|
||||
|
||||
public void populateBean(ReportFitAttr ob) { |
||||
fontRadioGroup.selectIndexButton(ob.isFitFont() ? 0 : 1); |
||||
populateECConfigRadioGroup(ob.fitStateInPC()); |
||||
refreshPreviewJPanel(); |
||||
} |
||||
|
||||
protected void populateECConfigRadioGroup(int fitStateInPC){ |
||||
ecConfigRadioGroup.selectIndexButton(getOptionIndex(fitStateInPC)); |
||||
} |
||||
|
||||
|
||||
protected void updateECConfigRadioGroup(ReportFitAttr reportFitAttr){ |
||||
reportFitAttr.setFitStateInPC(getStateInPC(ecConfigRadioGroup.getSelectRadioIndex())); |
||||
} |
||||
|
||||
public ReportFitAttr updateBean() { |
||||
ReportFitAttr reportFitAttr = new ReportFitAttr(); |
||||
reportFitAttr.setFitFont(fontRadioGroup.isFontFit()); |
||||
updateECConfigRadioGroup(reportFitAttr); |
||||
return reportFitAttr; |
||||
} |
||||
|
||||
|
||||
protected int getStateInPC(int index) { |
||||
FitType[] fitTypes = fitAttrModel.getFitTypes(); |
||||
if (index > fitTypes.length - 1) { |
||||
return index; |
||||
} |
||||
return fitTypes[index].getState(); |
||||
} |
||||
|
||||
protected int getOptionIndex(int state) { |
||||
FitType[] fitTypes = fitAttrModel.getFitTypes(); |
||||
for (int i = 0; i < fitTypes.length; i++) { |
||||
if (ComparatorUtils.equals(state, fitTypes[i].getState())) { |
||||
return i; |
||||
} |
||||
} |
||||
return 0; |
||||
} |
||||
|
||||
|
||||
public void setEnabled(boolean enabled) { |
||||
super.setEnabled(enabled); |
||||
fontRadioGroup.setEnabled(enabled); |
||||
ecConfigRadioGroup.setEnabled(enabled); |
||||
} |
||||
|
||||
} |
@ -0,0 +1,85 @@
|
||||
package com.fr.design.fit; |
||||
|
||||
import com.fr.design.actions.JTemplateAction; |
||||
import com.fr.design.beans.BasicBeanPane; |
||||
import com.fr.design.dialog.DialogActionAdapter; |
||||
import com.fr.design.dialog.UIDialog; |
||||
import com.fr.design.i18n.Toolkit; |
||||
import com.fr.design.mainframe.DesignerContext; |
||||
import com.fr.design.mainframe.JForm; |
||||
import com.fr.design.mainframe.JTemplate; |
||||
import com.fr.design.menu.MenuKeySet; |
||||
import com.fr.design.report.fit.FormFitAttrModelType; |
||||
import com.fr.form.main.Form; |
||||
import com.fr.report.fit.FitProvider; |
||||
import com.fr.report.fit.ReportFitAttr; |
||||
|
||||
import javax.swing.KeyStroke; |
||||
import java.awt.Dimension; |
||||
import java.awt.event.ActionEvent; |
||||
|
||||
public class FormFitAttrAction extends JTemplateAction { |
||||
private static final MenuKeySet REPORT_FIT_ATTR = new MenuKeySet() { |
||||
@Override |
||||
public char getMnemonic() { |
||||
return 'T'; |
||||
} |
||||
|
||||
@Override |
||||
public String getMenuName() { |
||||
return Toolkit.i18nText("Fine-Designer_PC_Fit_Attr"); |
||||
} |
||||
|
||||
@Override |
||||
public KeyStroke getKeyStroke() { |
||||
return null; |
||||
} |
||||
}; |
||||
|
||||
public FormFitAttrAction(JTemplate jTemplate) { |
||||
super(jTemplate); |
||||
initMenuStyle(); |
||||
} |
||||
|
||||
private void initMenuStyle() { |
||||
this.setMenuKeySet(REPORT_FIT_ATTR); |
||||
this.setName(getMenuKeySet().getMenuKeySetName() + "..."); |
||||
this.setMnemonic(getMenuKeySet().getMnemonic()); |
||||
this.setSmallIcon("/com/fr/design/images/reportfit/fit"); |
||||
} |
||||
|
||||
/** |
||||
* Action触发事件 |
||||
* |
||||
* @param e 事件 |
||||
*/ |
||||
@Override |
||||
public void actionPerformed(ActionEvent e) { |
||||
final JTemplate jwb = getEditingComponent(); |
||||
if (jwb == null || !(jwb.getTarget() instanceof Form)) { |
||||
return; |
||||
} |
||||
JForm jForm = (JForm) jwb; |
||||
Form wbTpl = jForm.getTarget(); |
||||
ReportFitAttr fitAttr = wbTpl.getReportFitAttr(); |
||||
FormFitAttrPane formFitAttrPane = new FormFitAttrPane(jForm, FormFitAttrModelType.parse(wbTpl)); |
||||
showReportFitDialog(fitAttr, jwb, wbTpl, formFitAttrPane); |
||||
} |
||||
|
||||
private void showReportFitDialog(ReportFitAttr fitAttr, final JTemplate jwb, final FitProvider wbTpl, final BasicBeanPane<ReportFitAttr> attrPane) { |
||||
attrPane.populateBean(fitAttr); |
||||
UIDialog dialog = attrPane.showWindowWithCustomSize(DesignerContext.getDesignerFrame(), new DialogActionAdapter() { |
||||
@Override |
||||
public void doOk() { |
||||
fireEditingOk(jwb, wbTpl, attrPane.updateBean(), fitAttr); |
||||
} |
||||
}, new Dimension(660, 600)); |
||||
dialog.setVisible(true); |
||||
} |
||||
|
||||
private void fireEditingOk(final JTemplate jwb, final FitProvider wbTpl, ReportFitAttr newReportFitAttr, ReportFitAttr oldReportFitAttr) { |
||||
wbTpl.setReportFitAttr(newReportFitAttr); |
||||
jwb.fireTargetModified(); |
||||
} |
||||
|
||||
} |
@ -0,0 +1,377 @@
|
||||
package com.fr.design.fit; |
||||
|
||||
import com.fr.design.beans.BasicBeanPane; |
||||
import com.fr.design.designer.IntervalConstants; |
||||
import com.fr.design.designer.creator.XCreator; |
||||
import com.fr.design.designer.creator.XLayoutContainer; |
||||
import com.fr.design.designer.creator.XOccupiedLayout; |
||||
import com.fr.design.designer.creator.XWAbsoluteBodyLayout; |
||||
import com.fr.design.designer.creator.XWFitLayout; |
||||
import com.fr.design.designer.creator.XWScaleLayout; |
||||
import com.fr.design.designer.properties.items.FRLayoutTypeItems; |
||||
import com.fr.design.designer.properties.items.Item; |
||||
import com.fr.design.dialog.FineJOptionPane; |
||||
import com.fr.design.gui.icombobox.UIComboBox; |
||||
import com.fr.design.gui.ilable.UILabel; |
||||
import com.fr.design.i18n.Toolkit; |
||||
import com.fr.design.layout.FRGUIPaneFactory; |
||||
import com.fr.design.layout.TableLayoutHelper; |
||||
import com.fr.design.mainframe.FormDesigner; |
||||
import com.fr.design.mainframe.FormSelectionUtils; |
||||
import com.fr.design.mainframe.JForm; |
||||
import com.fr.design.mainframe.WidgetPropertyPane; |
||||
import com.fr.design.report.fit.FitType; |
||||
import com.fr.design.report.fit.FormFitAttrModelType; |
||||
import com.fr.design.report.fit.FormFitConfigPane; |
||||
import com.fr.design.report.fit.ReportFitConfigPane; |
||||
import com.fr.design.widget.FRWidgetFactory; |
||||
import com.fr.form.main.Form; |
||||
import com.fr.form.ui.Widget; |
||||
import com.fr.form.ui.container.WAbsoluteBodyLayout; |
||||
import com.fr.form.ui.container.WAbsoluteLayout; |
||||
import com.fr.form.ui.container.WBodyLayoutType; |
||||
import com.fr.form.ui.container.WFitLayout; |
||||
import com.fr.form.ui.container.WSortLayout; |
||||
import com.fr.general.ComparatorUtils; |
||||
import com.fr.general.act.BorderPacker; |
||||
import com.fr.log.FineLoggerFactory; |
||||
import com.fr.report.fit.ReportFitAttr; |
||||
|
||||
import javax.swing.BorderFactory; |
||||
import javax.swing.DefaultComboBoxModel; |
||||
import javax.swing.JPanel; |
||||
import javax.swing.SwingConstants; |
||||
import java.awt.BorderLayout; |
||||
import java.awt.Component; |
||||
import java.awt.Dimension; |
||||
import java.awt.Rectangle; |
||||
import java.awt.event.ActionEvent; |
||||
import java.awt.event.ActionListener; |
||||
import java.awt.event.ItemEvent; |
||||
import java.awt.event.ItemListener; |
||||
|
||||
import static com.fr.design.i18n.Toolkit.i18nText; |
||||
import static javax.swing.JOptionPane.*; |
||||
|
||||
public class FormFitAttrPane extends BasicBeanPane<ReportFitAttr> { |
||||
|
||||
private UIComboBox layoutComboBox; |
||||
private UIComboBox scaleComboBox; |
||||
private FormFitAttrModelType fitAttrModelType; |
||||
|
||||
protected UIComboBox itemChoose; |
||||
|
||||
private JForm jForm; |
||||
private ReportFitConfigPane fitConfigPane; |
||||
|
||||
public FormFitAttrPane(JForm jForm, FormFitAttrModelType fitAttrModelType) { |
||||
this.fitAttrModelType = fitAttrModelType; |
||||
this.jForm = jForm; |
||||
initComponents(); |
||||
} |
||||
|
||||
|
||||
private void initComponents() { |
||||
this.setLayout(FRGUIPaneFactory.createBorderLayout()); |
||||
this.setBorder(BorderFactory.createEmptyBorder(12, 5, 0, 5)); |
||||
this.add(createReportFitSettingPane(), BorderLayout.CENTER); |
||||
this.add(createReportLayoutSettingPane(), BorderLayout.NORTH); |
||||
|
||||
} |
||||
|
||||
|
||||
private JPanel createReportLayoutSettingPane() { |
||||
JPanel jPanel = FRGUIPaneFactory.createTitledBorderPane(Toolkit.i18nText("Fine-Design_Form_PC_Fit_Config_Layout")); |
||||
jPanel.add(createAreaScalePane(), BorderLayout.CENTER); |
||||
jPanel.setPreferredSize(new Dimension(640, 84)); |
||||
return jPanel; |
||||
} |
||||
|
||||
protected String[] getItemNames() { |
||||
return new String[]{Toolkit.i18nText("Fine-Design_Report_Using_Server_Report_View_Settings"), |
||||
Toolkit.i18nText("Fine-Design_Report_I_Want_To_Set_Single")}; |
||||
} |
||||
|
||||
|
||||
private JPanel createReportFitSettingPane() { |
||||
JPanel jPanel = FRGUIPaneFactory.createTitledBorderPane(Toolkit.i18nText("Fine-Design_Form_PC_Fit_Config_Content_Attr")); |
||||
JPanel contentPane = FRGUIPaneFactory.createBorderLayout_S_Pane(); |
||||
jPanel.add(contentPane, BorderLayout.CENTER); |
||||
UILabel label = new UILabel(Toolkit.i18nText("Fine-Design_Form_PC_Fit_Config_Settings")); |
||||
label.setBorder(BorderFactory.createEmptyBorder(3, 0, 0, 0)); |
||||
contentPane.add(label, BorderLayout.WEST); |
||||
label.setPreferredSize(new Dimension(100, 0)); |
||||
label.setVerticalAlignment(SwingConstants.TOP); |
||||
itemChoose = new UIComboBox(getItemNames()); |
||||
itemChoose.setPreferredSize(new Dimension(160, 20)); |
||||
Form form = jForm.getTarget(); |
||||
itemChoose.addItemListener(new ItemListener() { |
||||
@Override |
||||
public void itemStateChanged(ItemEvent e) { |
||||
if (e.getStateChange() == ItemEvent.SELECTED) { |
||||
if (isTemplateSingleSet()) { |
||||
if (form != null) { |
||||
ReportFitAttr fitAttr = form.getReportFitAttr(); |
||||
populate(fitAttr); |
||||
} |
||||
} else { |
||||
populate(fitAttrModelType.getFitAttrModel().getGlobalReportFitAttr()); |
||||
} |
||||
} |
||||
} |
||||
}); |
||||
JPanel centerPane = FRGUIPaneFactory.createVerticalFlowLayout_S_Pane(true); |
||||
centerPane.add(itemChoose); |
||||
centerPane.add(fitConfigPane = new FormFitConfigPane(this.fitAttrModelType.getFitAttrModel())); |
||||
contentPane.add(centerPane, BorderLayout.CENTER); |
||||
return jPanel; |
||||
} |
||||
|
||||
public void populate(ReportFitAttr reportFitAttr) { |
||||
if (reportFitAttr == null) { |
||||
reportFitAttr = fitAttrModelType.getFitAttrModel().getGlobalReportFitAttr(); |
||||
} |
||||
|
||||
this.setEnabled(isTemplateSingleSet()); |
||||
fitConfigPane.populateBean(reportFitAttr); |
||||
} |
||||
|
||||
|
||||
public ReportFitAttr updateBean() { |
||||
updateLayoutType(); |
||||
if (!isTemplateSingleSet()) { |
||||
return null; |
||||
} else { |
||||
return fitConfigPane.updateBean(); |
||||
} |
||||
} |
||||
|
||||
private void updateLayoutType() { |
||||
XLayoutContainer xLayoutContainer = this.jForm.getRootComponent(); |
||||
if (xLayoutContainer == null || !xLayoutContainer.acceptType(XWFitLayout.class)) { |
||||
return; |
||||
} |
||||
XWFitLayout xwFitLayout = (XWFitLayout) xLayoutContainer; |
||||
WFitLayout wFitLayout = xwFitLayout.toData(); |
||||
int state = layoutComboBox.getSelectedIndex(); |
||||
WBodyLayoutType selectType = WBodyLayoutType.parse(state); |
||||
if (selectType != wFitLayout.getBodyLayoutType()) { |
||||
wFitLayout.setLayoutType(selectType); |
||||
//从自适应布局切换到绝对布局
|
||||
if (selectType == WBodyLayoutType.ABSOLUTE) { |
||||
switchLayoutFromFit2Absolute(xwFitLayout); |
||||
} else { |
||||
//从绝对布局切换到自适应布局
|
||||
switchLayoutFromAbsolute2Fit(xwFitLayout); |
||||
} |
||||
} |
||||
wFitLayout.setCompatibleScaleAttr(fitAttrModelType.parseScaleAttrFromShowIndex(this.scaleComboBox.getSelectedIndex(), wFitLayout.getBodyLayoutType())); |
||||
} |
||||
|
||||
|
||||
private void switchLayoutFromFit2Absolute(XWFitLayout xWFitLayout) { |
||||
try { |
||||
WFitLayout layout = xWFitLayout.toData(); |
||||
WAbsoluteBodyLayout wAbsoluteBodyLayout = new WAbsoluteBodyLayout("body"); |
||||
wAbsoluteBodyLayout.setCompState(WAbsoluteLayout.STATE_FIXED); |
||||
// 切换布局类型时,保留body背景样式
|
||||
wAbsoluteBodyLayout.setBorderStyleFollowingTheme(layout.isBorderStyleFollowingTheme()); |
||||
wAbsoluteBodyLayout.setBorderStyle((BorderPacker) (layout.getBorderStyle().clone())); |
||||
Component[] components = xWFitLayout.getComponents(); |
||||
Rectangle[] backupBounds = getBackupBoundsFromFitLayout(xWFitLayout); |
||||
xWFitLayout.removeAll(); |
||||
layout.resetStyle(); |
||||
XWAbsoluteBodyLayout xwAbsoluteBodyLayout = xWFitLayout.getBackupParent() == null ? new XWAbsoluteBodyLayout(wAbsoluteBodyLayout, new Dimension(0, 0)) : (XWAbsoluteBodyLayout) xWFitLayout.getBackupParent(); |
||||
xWFitLayout.setFixLayout(false); |
||||
xWFitLayout.getLayoutAdapter().addBean(xwAbsoluteBodyLayout, 0, 0); |
||||
for (int i = 0; i < components.length; i++) { |
||||
XCreator xCreator = (XCreator) components[i]; |
||||
xCreator.setBounds(backupBounds[i]); |
||||
//部分控件被ScaleLayout包裹着,绝对布局里面要放出来
|
||||
if (xCreator.acceptType(XWScaleLayout.class)) { |
||||
if (xCreator.getComponentCount() > 0 && ((XCreator) xCreator.getComponent(0)).shouldScaleCreator()) { |
||||
Component component = xCreator.getComponent(0); |
||||
component.setBounds(xCreator.getBounds()); |
||||
} |
||||
} |
||||
if (!xCreator.acceptType(XOccupiedLayout.class)) { |
||||
xwAbsoluteBodyLayout.add(xCreator); |
||||
} |
||||
|
||||
} |
||||
copyLayoutAttr(layout, xwAbsoluteBodyLayout.toData()); |
||||
xWFitLayout.setBackupParent(xwAbsoluteBodyLayout); |
||||
FormDesigner formDesigner = WidgetPropertyPane.getInstance().getEditingFormDesigner(); |
||||
formDesigner.getSelectionModel().setSelectedCreators( |
||||
FormSelectionUtils.rebuildSelection(xWFitLayout, new Widget[]{wAbsoluteBodyLayout})); |
||||
if (xwAbsoluteBodyLayout.toData() != null) { |
||||
xwAbsoluteBodyLayout.toData().setBorderStyleFollowingTheme(wAbsoluteBodyLayout.isBorderStyleFollowingTheme()); |
||||
xwAbsoluteBodyLayout.toData().setBorderStyle(wAbsoluteBodyLayout.getBorderStyle()); |
||||
} |
||||
xwAbsoluteBodyLayout.refreshStylePreviewEffect(); |
||||
if (xWFitLayout.toData() != null) { |
||||
xWFitLayout.toData().resetStyle(); |
||||
} |
||||
xWFitLayout.refreshStylePreviewEffect(); |
||||
formDesigner.switchBodyLayout(xwAbsoluteBodyLayout); |
||||
} catch (Exception e) { |
||||
FineLoggerFactory.getLogger().error(e.getMessage(), e); |
||||
|
||||
} |
||||
} |
||||
|
||||
private Rectangle[] getBackupBoundsFromFitLayout(XWFitLayout xWFitLayout) { |
||||
int count = xWFitLayout.getComponentCount(); |
||||
Rectangle[] rectangles = new Rectangle[count]; |
||||
for (int i = 0; i < count; i++) { |
||||
rectangles[i] = xWFitLayout.getComponent(i).getBounds(); |
||||
} |
||||
return rectangles; |
||||
} |
||||
|
||||
protected void copyLayoutAttr(WSortLayout srcLayout, WSortLayout destLayout) { |
||||
destLayout.clearListeners(); |
||||
destLayout.clearMobileWidgetList(); |
||||
for (int i = 0, len = srcLayout.getMobileWidgetListSize(); i < len; i++) { |
||||
destLayout.addMobileWidget(srcLayout.getMobileWidget(i)); |
||||
} |
||||
destLayout.setSorted(true); |
||||
for (int i = 0, len = srcLayout.getListenerSize(); i < len; i++) { |
||||
destLayout.addListener(srcLayout.getListener(i)); |
||||
} |
||||
srcLayout.clearListeners(); |
||||
srcLayout.clearMobileWidgetList(); |
||||
} |
||||
|
||||
|
||||
private void switchLayoutFromAbsolute2Fit(XWFitLayout xwFitLayout) { |
||||
XWAbsoluteBodyLayout xwAbsoluteBodyLayout = getAbsoluteBodyLayout(xwFitLayout); |
||||
if (xwAbsoluteBodyLayout == null) { |
||||
return; |
||||
} |
||||
WAbsoluteBodyLayout layout = xwAbsoluteBodyLayout.toData(); |
||||
WFitLayout wFitLayout = xwFitLayout.toData(); |
||||
wFitLayout.resetStyle(); |
||||
xwFitLayout.switch2FitBodyLayout(xwAbsoluteBodyLayout); |
||||
// 切换布局类型时,保留body背景样式
|
||||
if (wFitLayout != null) { |
||||
wFitLayout.setBorderStyleFollowingTheme(layout.isBorderStyleFollowingTheme()); |
||||
wFitLayout.setBorderStyle(layout.getBorderStyle()); |
||||
} |
||||
copyLayoutAttr(layout, xwFitLayout.toData()); |
||||
|
||||
copyLayoutAttr(layout, xwFitLayout.toData()); |
||||
xwFitLayout.refreshStylePreviewEffect(); |
||||
} |
||||
|
||||
private XWAbsoluteBodyLayout getAbsoluteBodyLayout(XWFitLayout xwFitLayout) { |
||||
if (xwFitLayout != null && xwFitLayout.getComponentCount() > 0) { |
||||
Component component = xwFitLayout.getComponent(0); |
||||
if (component instanceof XWAbsoluteBodyLayout) { |
||||
return (XWAbsoluteBodyLayout) component; |
||||
} |
||||
} |
||||
return null; |
||||
} |
||||
|
||||
private JPanel createAreaScalePane() { |
||||
initLayoutComboBox(); |
||||
|
||||
UILabel layoutTypeLabel = FRWidgetFactory.createLineWrapLabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Form_Attr_Layout_Type")); |
||||
UILabel scaleModeLabel = FRWidgetFactory.createLineWrapLabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Form_PC_Fit_Config_Scale_Setting")); |
||||
Component[][] components = new Component[][]{ |
||||
{layoutTypeLabel, layoutComboBox}, |
||||
{scaleModeLabel, scaleComboBox} |
||||
}; |
||||
JPanel contentPane = TableLayoutHelper.createGapTableLayoutPane(components, |
||||
TableLayoutHelper.FILL_LASTCOLUMN, 20, IntervalConstants.INTERVAL_L1); |
||||
JPanel containerPane = FRGUIPaneFactory.createBorderLayout_S_Pane(); |
||||
containerPane.add(contentPane, BorderLayout.CENTER); |
||||
|
||||
return containerPane; |
||||
} |
||||
|
||||
|
||||
public void initLayoutComboBox() { |
||||
Item[] items = FRLayoutTypeItems.ITEMS; |
||||
DefaultComboBoxModel model = new DefaultComboBoxModel(); |
||||
for (Item item : items) { |
||||
model.addElement(item); |
||||
} |
||||
scaleComboBox = new UIComboBox(model); |
||||
scaleComboBox.setModel(new DefaultComboBoxModel(fitAttrModelType.getFitLayoutScaleAttr())); |
||||
layoutComboBox = new UIComboBox(model); |
||||
layoutComboBox.setPreferredSize(new Dimension(160, 20)); |
||||
scaleComboBox.setPreferredSize(new Dimension(160, 20)); |
||||
WFitLayout wFitLayout = jForm.getTarget().getWFitLayout(); |
||||
layoutComboBox.addActionListener(new ActionListener() { |
||||
@Override |
||||
public void actionPerformed(ActionEvent e) { |
||||
int selectIndex = layoutComboBox.getSelectedIndex(); |
||||
if (selectIndex == 0) { |
||||
if (wFitLayout.getBodyLayoutType() == WBodyLayoutType.ABSOLUTE) { |
||||
int selVal = FineJOptionPane.showConfirmDialog( |
||||
FormFitAttrPane.this, |
||||
Toolkit.i18nText("Fine-Design_Form_Layout_Switch_Tip"), |
||||
Toolkit.i18nText("Fine-Design_Basic_Alert"), |
||||
OK_CANCEL_OPTION, |
||||
WARNING_MESSAGE |
||||
); |
||||
if (OK_OPTION != selVal) { |
||||
layoutComboBox.setSelectedIndex(1); |
||||
return; |
||||
} |
||||
} |
||||
scaleComboBox.setModel(new DefaultComboBoxModel(fitAttrModelType.getFitLayoutScaleAttr())); |
||||
} else { |
||||
scaleComboBox.setModel(new DefaultComboBoxModel(fitAttrModelType.getAbsoluteLayoutSaleAttr())); |
||||
} |
||||
scaleComboBox.setSelectedIndex(0); |
||||
} |
||||
}); |
||||
|
||||
scaleComboBox.addActionListener(new ActionListener() { |
||||
@Override |
||||
public void actionPerformed(ActionEvent e) { |
||||
WBodyLayoutType selectBodyType = WBodyLayoutType.parse(layoutComboBox.getSelectedIndex()); |
||||
int state = fitAttrModelType.parseScaleAttrFromShowIndex(scaleComboBox.getSelectedIndex(), selectBodyType); |
||||
fitConfigPane.refreshPreviewJPanel(FitType.parseByFitState(state)); |
||||
} |
||||
}); |
||||
} |
||||
|
||||
|
||||
@Override |
||||
public void populateBean(ReportFitAttr reportFitAttr) { |
||||
WFitLayout wFitLayout = jForm.getTarget().getWFitLayout(); |
||||
layoutComboBox.setSelectedIndex(wFitLayout.getBodyLayoutType().getTypeValue()); |
||||
scaleComboBox.setSelectedIndex(fitAttrModelType.getScaleAttrShowIndex(wFitLayout)); |
||||
|
||||
if (reportFitAttr == null) { |
||||
itemChoose.setSelectedItem(Toolkit.i18nText("Fine-Design_Report_Using_Server_Report_View_Settings")); |
||||
} else { |
||||
itemChoose.setSelectedItem(Toolkit.i18nText("Fine-Design_Report_I_Want_To_Set_Single")); |
||||
} |
||||
if (reportFitAttr == null) { |
||||
reportFitAttr = fitAttrModelType.getFitAttrModel().getGlobalReportFitAttr(); |
||||
} |
||||
setEnabled(isTemplateSingleSet()); |
||||
fitConfigPane.populateBean(reportFitAttr); |
||||
} |
||||
|
||||
private boolean isTemplateSingleSet() { |
||||
return ComparatorUtils.equals(Toolkit.i18nText("Fine-Design_Report_I_Want_To_Set_Single"), itemChoose.getSelectedItem()); |
||||
} |
||||
|
||||
|
||||
public void setEnabled(boolean enabled) { |
||||
super.setEnabled(enabled); |
||||
fitConfigPane.setEnabled(enabled); |
||||
} |
||||
|
||||
@Override |
||||
protected String title4PopupWindow() { |
||||
return i18nText("Fine-Designer_PC_Fit_Attr"); |
||||
} |
||||
|
||||
} |
Loading…
Reference in new issue