forked from fanruan/design
Henry.Wang
3 years ago
9 changed files with 555 additions and 42 deletions
@ -0,0 +1,228 @@
|
||||
package com.fr.design.report.fit; |
||||
|
||||
import com.fr.design.ExtraDesignClassManager; |
||||
import com.fr.design.beans.BasicBeanPane; |
||||
import com.fr.design.gui.ibutton.UIRadioButton; |
||||
import com.fr.design.gui.icombobox.UIComboBox; |
||||
import com.fr.design.gui.ilable.UILabel; |
||||
import com.fr.design.layout.FRGUIPaneFactory; |
||||
import com.fr.design.layout.TableLayoutHelper; |
||||
import com.fr.design.report.fit.menupane.FitPreviewPane; |
||||
import com.fr.design.report.fit.menupane.FitRadioGroup; |
||||
import com.fr.design.report.fit.menupane.FontRadioGroup; |
||||
import com.fr.design.report.fit.provider.FitAttrModelProvider; |
||||
import com.fr.design.utils.gui.GUICoreUtils; |
||||
import com.fr.general.ComparatorUtils; |
||||
import com.fr.report.fit.ReportFitAttr; |
||||
|
||||
|
||||
import javax.swing.*; |
||||
import javax.swing.border.EmptyBorder; |
||||
import java.awt.*; |
||||
import java.awt.event.ActionEvent; |
||||
import java.awt.event.ActionListener; |
||||
import java.awt.event.ItemListener; |
||||
import java.util.ArrayList; |
||||
import java.util.Arrays; |
||||
import java.util.Comparator; |
||||
import java.util.Set; |
||||
import java.util.stream.Collectors; |
||||
|
||||
import static com.fr.design.i18n.Toolkit.i18nText; |
||||
|
||||
public abstract class BaseFitAttrPane extends BasicBeanPane<ReportFitAttr> { |
||||
|
||||
protected JPanel contentJPanel; |
||||
protected UIComboBox itemChoose; |
||||
protected java.util.List<FitAttrModel> fitAttrModelList = new ArrayList<>(); |
||||
|
||||
public FontRadioGroup fontRadioGroup; |
||||
public FitRadioGroup adaptRadioGroup; |
||||
public JPanel attrJPanel; |
||||
public FitPreviewPane previewJPanel; |
||||
public FitAttrModel fitAttrModel; |
||||
|
||||
|
||||
protected BaseFitAttrPane() { |
||||
initFitAttrModel(); |
||||
} |
||||
|
||||
private void initFitAttrModel() { |
||||
fitAttrModelList.add(new FrmFitAttrModel()); |
||||
fitAttrModelList.add(new CptFitAttrModel()); |
||||
|
||||
Set<FitAttrModelProvider> fitAttrModelProviders = ExtraDesignClassManager.getInstance().getArray(FitAttrModelProvider.XML_TAG); |
||||
|
||||
for (FitAttrModelProvider fitAttrModelProvider : fitAttrModelProviders) { |
||||
fitAttrModelList.add(fitAttrModelProvider); |
||||
} |
||||
|
||||
fitAttrModelList = fitAttrModelList.stream().sorted(Comparator.comparing(FitAttrModel::getPriority).reversed()).collect(Collectors.toList()); |
||||
} |
||||
|
||||
protected void populateModel(FitAttrModel fitAttrModel) { |
||||
this.fitAttrModel = fitAttrModel; |
||||
if (attrJPanel != null) { |
||||
contentJPanel.remove(attrJPanel); |
||||
} |
||||
if (previewJPanel != null) { |
||||
contentJPanel.remove(previewJPanel); |
||||
} |
||||
|
||||
fontRadioGroup = new FontRadioGroup(); |
||||
adaptRadioGroup = new FitRadioGroup(); |
||||
initAttrJPanel(); |
||||
initPreviewJPanel(); |
||||
} |
||||
|
||||
|
||||
protected void initAttrJPanel() { |
||||
int colCount = fitAttrModel.getFitTypes().length + 1; |
||||
Component[][] components = new Component[2][colCount]; |
||||
initFitRadioGroup(fontRadioGroup, i18nText("Fine-Designer_Fit-Font"), new String[]{i18nText("Fine-Designer_Fit"), i18nText("Fine-Designer_Fit-No")}, components[0]); |
||||
initFitRadioGroup(adaptRadioGroup, fitAttrModel.getFitName(), Arrays.stream(fitAttrModel.getFitTypes()).map(FitType::description).toArray(String[]::new), components[1]); |
||||
|
||||
double[] rowSize = new double[2]; |
||||
double[] columnSize = new double[colCount]; |
||||
for (int i = 0; i < rowSize.length; i++) { |
||||
rowSize[i] = 20; |
||||
} |
||||
for (int i = 0; i < columnSize.length; i++) { |
||||
if (i == 0) { |
||||
columnSize[i] = 80; |
||||
} else { |
||||
columnSize[i] = 100; |
||||
} |
||||
} |
||||
|
||||
attrJPanel = TableLayoutHelper.createTableLayoutPane(components, rowSize, columnSize); |
||||
attrJPanel.setBorder(new EmptyBorder(0, 100, 10, 100)); |
||||
contentJPanel.add(attrJPanel); |
||||
} |
||||
|
||||
private void initFitRadioGroup(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()); |
||||
} |
||||
|
||||
protected ActionListener getPreviewActionListener() { |
||||
return new ActionListener() { |
||||
@Override |
||||
public void actionPerformed(ActionEvent e) { |
||||
refreshPreviewJPanel(); |
||||
} |
||||
}; |
||||
} |
||||
|
||||
protected void refreshPreviewJPanel() { |
||||
String previewIndex = getPreviewIndex(); |
||||
previewJPanel.refreshPreview(previewIndex, fontRadioGroup.isEnabled()); |
||||
} |
||||
|
||||
protected String getPreviewIndex() { |
||||
return getStateInPC(adaptRadioGroup.getSelectRadioIndex()) + "" + fontRadioGroup.getSelectRadioIndex(); |
||||
} |
||||
|
||||
protected void initPreviewJPanel() { |
||||
previewJPanel = new FitPreviewPane(); |
||||
contentJPanel.add(previewJPanel); |
||||
} |
||||
|
||||
protected int getStateInPC(int index) { |
||||
FitType[] fitTypes = fitAttrModel.getFitTypes(); |
||||
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; |
||||
} |
||||
|
||||
|
||||
@Override |
||||
public void populateBean(ReportFitAttr ob) { |
||||
fontRadioGroup.selectIndexButton(ob.isFitFont() ? 0 : 1); |
||||
adaptRadioGroup.selectIndexButton(getOptionIndex(ob.fitStateInPC())); |
||||
refreshPreviewJPanel(); |
||||
} |
||||
|
||||
@Override |
||||
public ReportFitAttr updateBean() { |
||||
ReportFitAttr reportFitAttr = new ReportFitAttr(); |
||||
reportFitAttr.setFitFont(fontRadioGroup.isFontFit()); |
||||
reportFitAttr.setFitStateInPC(getStateInPC(adaptRadioGroup.getSelectRadioIndex())); |
||||
return reportFitAttr; |
||||
} |
||||
|
||||
|
||||
public void setEnabled(boolean enabled) { |
||||
super.setEnabled(enabled); |
||||
fontRadioGroup.setEnabled(enabled); |
||||
adaptRadioGroup.setEnabled(enabled); |
||||
refreshPreviewJPanel(); |
||||
} |
||||
|
||||
@Override |
||||
protected String title4PopupWindow() { |
||||
return i18nText("Fine-Designer_PC_Element_Case_Fit_Attr"); |
||||
} |
||||
|
||||
protected abstract String[] getItemNames(); |
||||
|
||||
protected void initComponents() { |
||||
this.setLayout(new BoxLayout(this, BoxLayout.Y_AXIS)); |
||||
this.setBorder(BorderFactory.createEmptyBorder(10, 10, 10, 10)); |
||||
contentJPanel = new JPanel(); |
||||
contentJPanel.setLayout(FRGUIPaneFactory.createCenterFlowLayout()); |
||||
this.add(contentJPanel); |
||||
initItemChoose(); |
||||
} |
||||
|
||||
|
||||
private void initItemChoose() { |
||||
JPanel chooseJPanel = new JPanel(); |
||||
chooseJPanel.setLayout(FRGUIPaneFactory.createLabelFlowLayout()); |
||||
ItemListener itemListener = getItemListener(); |
||||
itemChoose = new UIComboBox(getItemNames()); |
||||
itemChoose.addItemListener(itemListener); |
||||
UILabel belowSetLabel = new UILabel(i18nText("Fine-Design_Report_Blow_Set")); |
||||
JPanel buttonPane = GUICoreUtils.createFlowPane(new Component[]{ |
||||
belowSetLabel, itemChoose}, FlowLayout.LEFT, 0, 0); |
||||
chooseJPanel.add(buttonPane); |
||||
chooseJPanel.setPreferredSize(new Dimension(500, 50)); |
||||
JPanel jPanel = new JPanel(); |
||||
jPanel.setLayout(FRGUIPaneFactory.createBorderLayout()); |
||||
jPanel.add(chooseJPanel, BorderLayout.WEST); |
||||
|
||||
contentJPanel.add(jPanel); |
||||
} |
||||
|
||||
|
||||
protected abstract ItemListener getItemListener(); |
||||
|
||||
|
||||
public void populate(ReportFitAttr reportFitAttr) { |
||||
|
||||
} |
||||
|
||||
protected void refresh() { |
||||
validate(); |
||||
repaint(); |
||||
revalidate(); |
||||
} |
||||
} |
@ -0,0 +1,51 @@
|
||||
package com.fr.design.report.fit; |
||||
|
||||
|
||||
import com.fr.design.i18n.Toolkit; |
||||
import com.fr.design.mainframe.JTemplate; |
||||
import com.fr.report.fit.ReportFitAttr; |
||||
import com.fr.report.fit.ReportFitConfig; |
||||
|
||||
|
||||
public class CptFitAttrModel implements FitAttrModel { |
||||
|
||||
@Override |
||||
public FitType[] getFitTypes() { |
||||
return new FitType[]{ |
||||
FitType.HORIZONTAL_FIT, |
||||
FitType.DOUBLE_FIT, |
||||
FitType.NOT_FIT |
||||
}; |
||||
} |
||||
|
||||
@Override |
||||
public String getFitName() { |
||||
return Toolkit.i18nText("Fine-Designer_Fit-Element"); |
||||
} |
||||
|
||||
|
||||
@Override |
||||
public String getModelName() { |
||||
return Toolkit.i18nText("Fine-Design_Basic_Plain_Report"); |
||||
} |
||||
|
||||
@Override |
||||
public ReportFitAttr getGlobalReportFitAttr() { |
||||
return ReportFitConfig.getInstance().getCptFitAttr(); |
||||
} |
||||
|
||||
@Override |
||||
public void setGlobalReportFitAttr(ReportFitAttr reportFitAttr) { |
||||
ReportFitConfig.getInstance().setCptFitAttr(reportFitAttr); |
||||
} |
||||
|
||||
@Override |
||||
public int getPriority() { |
||||
return 0; |
||||
} |
||||
|
||||
@Override |
||||
public boolean isAvailable(JTemplate jTemplate) { |
||||
return jTemplate.isJWorkBook(); |
||||
} |
||||
} |
@ -0,0 +1,44 @@
|
||||
package com.fr.design.report.fit; |
||||
|
||||
import com.fr.design.mainframe.JTemplate; |
||||
import com.fr.report.fit.ReportFitAttr; |
||||
|
||||
public interface FitAttrModel { |
||||
/** |
||||
* @Description 名称,比如:普通报表、决策报表等 |
||||
**/ |
||||
String getModelName(); |
||||
|
||||
/** |
||||
* @Description 自适应选项的名称,比如返回:表格 |
||||
**/ |
||||
String getFitName(); |
||||
|
||||
/** |
||||
* @Description 自适应选项 |
||||
**/ |
||||
FitType[] getFitTypes(); |
||||
|
||||
|
||||
/** |
||||
* @Description 获取全局的自适应属性 |
||||
**/ |
||||
ReportFitAttr getGlobalReportFitAttr(); |
||||
|
||||
/** |
||||
* @Description 设置全局的自适应属性 |
||||
* @param: reportFitAttr |
||||
**/ |
||||
void setGlobalReportFitAttr(ReportFitAttr reportFitAttr); |
||||
|
||||
/** |
||||
* @Description 优先级 |
||||
**/ |
||||
int getPriority(); |
||||
|
||||
/** |
||||
* @Description 是否可用 |
||||
* @param: jTemplate |
||||
**/ |
||||
boolean isAvailable(JTemplate jTemplate); |
||||
} |
@ -0,0 +1,53 @@
|
||||
package com.fr.design.report.fit; |
||||
|
||||
|
||||
import com.fr.design.i18n.Toolkit; |
||||
import com.fr.design.mainframe.JTemplate; |
||||
import com.fr.report.fit.ReportFitAttr; |
||||
import com.fr.report.fit.ReportFitConfig; |
||||
|
||||
|
||||
public class FrmFitAttrModel implements FitAttrModel { |
||||
|
||||
|
||||
@Override |
||||
public String getModelName() { |
||||
return Toolkit.i18nText("Fine-Design_Basic_Decision_Report"); |
||||
} |
||||
|
||||
@Override |
||||
public String getFitName() { |
||||
return Toolkit.i18nText("Fine-Designer_Fit-Element"); |
||||
} |
||||
|
||||
public FitType[] getFitTypes() { |
||||
return new FitType[]{ |
||||
FitType.DEFAULT, |
||||
FitType.HORIZONTAL_FIT, |
||||
FitType.DOUBLE_FIT, |
||||
FitType.NOT_FIT |
||||
}; |
||||
} |
||||
|
||||
@Override |
||||
public ReportFitAttr getGlobalReportFitAttr() { |
||||
return ReportFitConfig.getInstance().getFrmFitAttr(); |
||||
} |
||||
|
||||
@Override |
||||
public void setGlobalReportFitAttr(ReportFitAttr reportFitAttr) { |
||||
ReportFitConfig.getInstance().setFrmFitAttr(reportFitAttr); |
||||
} |
||||
|
||||
@Override |
||||
public int getPriority() { |
||||
return 1; |
||||
} |
||||
|
||||
@Override |
||||
public boolean isAvailable(JTemplate jTemplate) { |
||||
return !jTemplate.isJWorkBook(); |
||||
} |
||||
|
||||
|
||||
} |
@ -1,55 +1,91 @@
|
||||
package com.fr.design.report.fit.menupane; |
||||
|
||||
import com.fr.design.beans.BasicBeanPane; |
||||
import com.fr.design.file.HistoryTemplateListCache; |
||||
import com.fr.design.i18n.Toolkit; |
||||
import com.fr.design.mainframe.JTemplate; |
||||
import com.fr.design.report.fit.BaseFitAttrPane; |
||||
import com.fr.design.report.fit.FitAttrModel; |
||||
import com.fr.general.ComparatorUtils; |
||||
import com.fr.report.fit.FitProvider; |
||||
import com.fr.report.fit.ReportFitAttr; |
||||
|
||||
import javax.swing.BorderFactory; |
||||
import javax.swing.BoxLayout; |
||||
import java.awt.event.ItemEvent; |
||||
import java.awt.event.ItemListener; |
||||
|
||||
/** |
||||
* Created by 夏翔 on 2016/6/24. |
||||
*/ |
||||
public class TemplateFitAttrPane extends BasicBeanPane<ReportFitAttr> { |
||||
private TemplateBrowserFitAttrPane attrPane; |
||||
|
||||
public class TemplateFitAttrPane extends BaseFitAttrPane { |
||||
|
||||
public TemplateFitAttrPane() { |
||||
initComponents(); |
||||
} |
||||
|
||||
private void initComponents() { |
||||
this.setLayout(new BoxLayout(this, BoxLayout.Y_AXIS)); |
||||
this.setBorder(BorderFactory.createEmptyBorder(10, 10, 10, 10)); |
||||
attrPane = new TemplateBrowserFitAttrPane(); |
||||
this.add(attrPane); |
||||
@Override |
||||
protected void initComponents() { |
||||
super.initComponents(); |
||||
for (FitAttrModel fitAttrModel : fitAttrModelList) { |
||||
if (fitAttrModel.isAvailable(HistoryTemplateListCache.getInstance().getCurrentEditingTemplate())) { |
||||
populateModel(fitAttrModel); |
||||
break; |
||||
} |
||||
} |
||||
} |
||||
|
||||
@Override |
||||
public void populateBean(ReportFitAttr reportFitAttr) { |
||||
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")); |
||||
} |
||||
populate(reportFitAttr); |
||||
} |
||||
|
||||
/** |
||||
* 展示界面 |
||||
* |
||||
* @param fitAttr 自适应属性 |
||||
*/ |
||||
public void populateBean(ReportFitAttr fitAttr) { |
||||
attrPane.populateBean(fitAttr); |
||||
public void populate(ReportFitAttr reportFitAttr) { |
||||
if (reportFitAttr == null) { |
||||
reportFitAttr = fitAttrModel.getGlobalReportFitAttr(); |
||||
} |
||||
|
||||
super.setEnabled(isTemplateSingleSet()); |
||||
super.populateBean(reportFitAttr); |
||||
} |
||||
|
||||
|
||||
/** |
||||
* 提交数据 |
||||
* |
||||
* @return 界面上的更新数据 |
||||
*/ |
||||
public ReportFitAttr updateBean() { |
||||
return attrPane.updateBean(); |
||||
if (!isTemplateSingleSet()) { |
||||
return null; |
||||
} else { |
||||
return super.updateBean(); |
||||
} |
||||
} |
||||
|
||||
@Override |
||||
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")}; |
||||
} |
||||
|
||||
@Override |
||||
protected ItemListener getItemListener() { |
||||
return new ItemListener() { |
||||
@Override |
||||
public void itemStateChanged(ItemEvent e) { |
||||
if (e.getStateChange() == ItemEvent.SELECTED) { |
||||
if(isTemplateSingleSet()){ |
||||
JTemplate jwb = HistoryTemplateListCache.getInstance().getCurrentEditingTemplate(); |
||||
if (jwb != null) { |
||||
FitProvider wbTpl = (FitProvider) jwb.getTarget(); |
||||
ReportFitAttr fitAttr = wbTpl.getReportFitAttr(); |
||||
populate(fitAttr); |
||||
} |
||||
}else { |
||||
populate(fitAttrModel.getGlobalReportFitAttr()); |
||||
} |
||||
} |
||||
} |
||||
}; |
||||
} |
||||
|
||||
/** |
||||
* 标题 |
||||
* |
||||
* @return 标题 |
||||
*/ |
||||
protected String title4PopupWindow() { |
||||
return com.fr.design.i18n.Toolkit.i18nText("Fine-Designer_PC_Fit_Attr"); |
||||
private boolean isTemplateSingleSet() { |
||||
return ComparatorUtils.equals(Toolkit.i18nText("Fine-Design_Report_I_Want_To_Set_Single"), itemChoose.getSelectedItem()); |
||||
} |
||||
} |
||||
} |
@ -0,0 +1,18 @@
|
||||
package com.fr.design.report.fit.provider; |
||||
|
||||
import com.fr.stable.fun.mark.API; |
||||
|
||||
|
||||
@API(level = FitAttrModelProvider.CURRENT_LEVEL) |
||||
public abstract class AbstractFitAttrModelProvider implements FitAttrModelProvider { |
||||
|
||||
@Override |
||||
public int currentAPILevel() { |
||||
return CURRENT_LEVEL; |
||||
} |
||||
|
||||
@Override |
||||
public String mark4Provider() { |
||||
return getClass().getName(); |
||||
} |
||||
} |
@ -0,0 +1,11 @@
|
||||
package com.fr.design.report.fit.provider; |
||||
|
||||
|
||||
import com.fr.design.report.fit.FitAttrModel; |
||||
import com.fr.stable.fun.mark.Mutable; |
||||
|
||||
|
||||
public interface FitAttrModelProvider extends Mutable, FitAttrModel { |
||||
String XML_TAG = "FitAttrModelProvider"; |
||||
int CURRENT_LEVEL = 1; |
||||
} |
@ -0,0 +1,78 @@
|
||||
package com.fr.design.webattr; |
||||
|
||||
import com.fr.config.Configuration; |
||||
import com.fr.design.report.fit.BaseFitAttrPane; |
||||
import com.fr.design.report.fit.FitAttrModel; |
||||
import com.fr.general.ComparatorUtils; |
||||
import com.fr.report.fit.ReportFitAttr; |
||||
import com.fr.report.fit.ReportFitConfig; |
||||
import com.fr.transaction.Configurations; |
||||
import com.fr.transaction.Worker; |
||||
|
||||
import java.awt.event.ItemEvent; |
||||
import java.awt.event.ItemListener; |
||||
|
||||
|
||||
public class ServerFitAttrPane extends BaseFitAttrPane { |
||||
|
||||
public ServerFitAttrPane() { |
||||
super(); |
||||
initComponents(); |
||||
} |
||||
|
||||
@Override |
||||
protected void initComponents() { |
||||
super.initComponents(); |
||||
populateModel(fitAttrModelList.get(0)); |
||||
} |
||||
|
||||
|
||||
@Override |
||||
public void populateBean(ReportFitAttr reportFitAttr) { |
||||
reportFitAttr = fitAttrModel.getGlobalReportFitAttr(); |
||||
super.populateBean(reportFitAttr); |
||||
} |
||||
|
||||
|
||||
public ReportFitAttr updateBean() { |
||||
ReportFitAttr reportFitAttr = super.updateBean(); |
||||
Configurations.update(new Worker() { |
||||
@Override |
||||
public void run() { |
||||
fitAttrModel.setGlobalReportFitAttr(reportFitAttr); |
||||
} |
||||
|
||||
@Override |
||||
public Class<? extends Configuration>[] targets() { |
||||
return new Class[]{ReportFitConfig.class}; |
||||
} |
||||
}); |
||||
return null; |
||||
|
||||
} |
||||
|
||||
@Override |
||||
protected String[] getItemNames() { |
||||
return fitAttrModelList.stream().map(FitAttrModel::getModelName).toArray(String[]::new); |
||||
} |
||||
|
||||
@Override |
||||
protected ItemListener getItemListener() { |
||||
ServerFitAttrPane self = this; |
||||
return new ItemListener() { |
||||
@Override |
||||
public void itemStateChanged(ItemEvent e) { |
||||
if (e.getStateChange() == ItemEvent.SELECTED) { |
||||
for (FitAttrModel fitAttrModel : fitAttrModelList) { |
||||
if (ComparatorUtils.equals(e.getItem(), fitAttrModel.getModelName())) { |
||||
self.populateModel(fitAttrModel); |
||||
populateBean(null); |
||||
refresh(); |
||||
} |
||||
} |
||||
} |
||||
} |
||||
}; |
||||
} |
||||
} |
||||
|
Loading…
Reference in new issue