daniel
8 years ago
61 changed files with 232 additions and 2432 deletions
@ -1,37 +0,0 @@
|
||||
package com.fr.design.event; |
||||
|
||||
import com.fr.design.gui.itree.filetree.TemplateFileTree; |
||||
import com.fr.design.mainframe.dnd.ArrayTransferable; |
||||
import com.fr.design.mainframe.dnd.SerializableTransferable; |
||||
import com.fr.general.web.ParameterConsts; |
||||
import com.fr.stable.StringUtils; |
||||
|
||||
import javax.swing.*; |
||||
import java.awt.*; |
||||
import java.awt.dnd.DragGestureEvent; |
||||
import java.awt.dnd.DragGestureListener; |
||||
import java.awt.dnd.DragSource; |
||||
import java.awt.dnd.DragSourceAdapter; |
||||
|
||||
/** |
||||
* Created with IntelliJ IDEA. |
||||
* User: richie |
||||
* Date: 13-11-4 |
||||
* Time: 下午2:17 |
||||
*/ |
||||
public class TemplateTreeDragSource extends DragSourceAdapter implements DragGestureListener { |
||||
private DragSource source; |
||||
|
||||
public TemplateTreeDragSource(JTree tree, int actions) { |
||||
source = new DragSource(); |
||||
source.createDefaultDragGestureRecognizer(tree, actions, this); |
||||
|
||||
} |
||||
public void dragGestureRecognized(DragGestureEvent dge) { |
||||
Component comp = dge.getComponent(); |
||||
if (comp instanceof TemplateFileTree) { |
||||
String selectedPath = ((TemplateFileTree)comp).getSelectedTemplatePath(); |
||||
source.startDrag(dge, DragSource.DefaultLinkDrop, new SerializableTransferable(selectedPath), this); |
||||
} |
||||
} |
||||
} |
File diff suppressed because one or more lines are too long
@ -0,0 +1,13 @@
|
||||
package com.fr.design.gui.chart; |
||||
|
||||
/** |
||||
* Created by daniel on 2016/11/2. |
||||
*/ |
||||
public interface ChartEditPaneProvider { |
||||
|
||||
|
||||
void gotoPane(String... id); |
||||
|
||||
void fire(); |
||||
|
||||
} |
File diff suppressed because one or more lines are too long
@ -1,143 +0,0 @@
|
||||
/* |
||||
* Copyright(c) 2001-2011, FineReport Inc, All Rights Reserved. |
||||
*/ |
||||
package com.fr.design.mainframe; |
||||
|
||||
import java.awt.BorderLayout; |
||||
import java.awt.Component; |
||||
|
||||
import javax.swing.BorderFactory; |
||||
import javax.swing.JComponent; |
||||
import javax.swing.JPanel; |
||||
import javax.swing.SwingConstants; |
||||
import javax.swing.event.ChangeEvent; |
||||
import javax.swing.event.ChangeListener; |
||||
|
||||
import com.fr.chart.chartattr.ChartCollection; |
||||
import com.fr.design.constants.UIConstants; |
||||
import com.fr.design.designer.TargetComponent; |
||||
import com.fr.design.gui.ibutton.UIToggleButton; |
||||
import com.fr.design.gui.ilable.UILabel; |
||||
import com.fr.design.gui.itabpane.TitleChangeListener; |
||||
import com.fr.design.layout.FRGUIPaneFactory; |
||||
import com.fr.design.module.DesignModuleFactory; |
||||
import com.fr.general.Inter; |
||||
|
||||
public class ChartAndWidgetPropertyPane extends MiddleChartPropertyPane { |
||||
|
||||
public synchronized static ChartAndWidgetPropertyPane getInstance(BaseFormDesigner formEditor) { |
||||
if(singleton == null) { |
||||
singleton = new ChartAndWidgetPropertyPane(formEditor); |
||||
} |
||||
|
||||
singleton.setWidgetPropertyPane(DesignModuleFactory.getWidgetPropertyPane(formEditor)); |
||||
singleton.setSureProperty(); |
||||
return singleton; |
||||
} |
||||
|
||||
public static ChartAndWidgetPropertyPane getInstance() { |
||||
if(singleton == null) { |
||||
singleton = new ChartAndWidgetPropertyPane(); |
||||
} |
||||
return singleton; |
||||
} |
||||
|
||||
private static ChartAndWidgetPropertyPane singleton; |
||||
|
||||
private BaseWidgetPropertyPane widgetpane = null; |
||||
|
||||
private UIToggleButton hisButton; |
||||
|
||||
public ChartAndWidgetPropertyPane() { |
||||
|
||||
} |
||||
|
||||
public ChartAndWidgetPropertyPane(BaseFormDesigner formEditor) { |
||||
super(); |
||||
this.widgetpane = DesignModuleFactory.getWidgetPropertyPane(formEditor); |
||||
} |
||||
|
||||
public void setWidgetPropertyPane(BaseWidgetPropertyPane pane) { |
||||
this.widgetpane = pane; |
||||
} |
||||
|
||||
@Override |
||||
protected void createMainPane() { |
||||
this.add(chartEditPane, BorderLayout.CENTER); |
||||
} |
||||
|
||||
@Override |
||||
protected void createNameLabel() { |
||||
nameLabel = new UILabel(); |
||||
nameLabel.setHorizontalAlignment(SwingConstants.LEFT); |
||||
nameLabel.setBorder(BorderFactory.createEmptyBorder(-2, 6, 2, 0)); |
||||
} |
||||
|
||||
@Override |
||||
protected JComponent createNorthComponent() { |
||||
JPanel toolPane = FRGUIPaneFactory.createBorderLayout_S_Pane(); |
||||
|
||||
JPanel hisPane = FRGUIPaneFactory.createBorderLayout_S_Pane(); |
||||
hisPane.setBorder(BorderFactory.createEmptyBorder(2, 2, 2, 2)); |
||||
hisButton = new UIToggleButton(Inter.getLocText(new String[]{"Widget", "Attribute"}), UIConstants.HISTORY_ICON); |
||||
hisButton.setNormalPainted(false); |
||||
hisButton.setBorderPaintedOnlyWhenPressed(true); |
||||
hisPane.add(hisButton, BorderLayout.CENTER); |
||||
|
||||
hisButton.addChangeListener(new ChangeListener() { |
||||
|
||||
@Override |
||||
public void stateChanged(ChangeEvent e) { |
||||
cardChange(); |
||||
} |
||||
}); |
||||
|
||||
toolPane.add(nameLabel, BorderLayout.CENTER); |
||||
toolPane.add(hisPane, BorderLayout.EAST); |
||||
|
||||
titleListener = new TitleChangeListener() { |
||||
|
||||
@Override |
||||
public void fireTitleChange(String addName) { |
||||
if(hisButton.isSelected()) { |
||||
nameLabel.setText(Inter.getLocText(new String[]{"Widget", "Form-Widget_Property_Table"})); |
||||
}else { |
||||
nameLabel.setText(Inter.getLocText("Chart-Property_Table") + '-' + addName); |
||||
} |
||||
} |
||||
}; |
||||
|
||||
return toolPane; |
||||
} |
||||
|
||||
/** |
||||
* 感觉ChartCollection加载图表属性界面. |
||||
* @param collection 收集图表 |
||||
* @param ePane 面板 |
||||
*/ |
||||
public void populateChartPropertyPane(ChartCollection collection, TargetComponent<?> ePane) { |
||||
super.populateChartPropertyPane(collection, ePane); |
||||
//表单中的图表切换界面上得更新
|
||||
resetChartEditPane(); |
||||
} |
||||
|
||||
protected void resetChartEditPane() { |
||||
cardChange(); |
||||
} |
||||
|
||||
private void cardChange() { |
||||
remove(chartEditPane); |
||||
remove((Component)widgetpane); |
||||
if(hisButton.isSelected()) { |
||||
nameLabel.setText(Inter.getLocText(new String[]{"Widget", "Form-Widget_Property_Table"})); |
||||
add((Component)widgetpane, BorderLayout.CENTER); |
||||
} else { |
||||
String tabname = chartEditPane.getSelectedTabName(); |
||||
nameLabel.setText(Inter.getLocText(new String[]{"Utils-The-Chart", "Form-Widget_Property_Table"}) + (tabname != null ? ('-' + chartEditPane.getSelectedTabName()) : "")); |
||||
add(chartEditPane, BorderLayout.CENTER); |
||||
} |
||||
validate(); |
||||
repaint(); |
||||
revalidate(); |
||||
} |
||||
} |
@ -1,134 +0,0 @@
|
||||
/* |
||||
* Copyright (c) 2001-2014,FineReport Inc, All Rights Reserved. |
||||
*/ |
||||
|
||||
package com.fr.design.mainframe; |
||||
|
||||
import com.fr.base.chart.BaseChartCollection; |
||||
import com.fr.chart.chartattr.ChartCollection; |
||||
import com.fr.design.designer.TargetComponent; |
||||
import com.fr.design.gui.chart.BaseChartPropertyPane; |
||||
import com.fr.design.gui.ilable.UILabel; |
||||
import com.fr.design.gui.itabpane.TitleChangeListener; |
||||
import com.fr.design.mainframe.chart.ChartDesignEditPane; |
||||
import com.fr.design.mainframe.chart.ChartEditPane; |
||||
import com.fr.general.Inter; |
||||
|
||||
|
||||
import javax.swing.*; |
||||
import java.awt.*; |
||||
|
||||
/** |
||||
* Created by IntelliJ IDEA. |
||||
* Author : daisy |
||||
* Version: 6.5.6 |
||||
* Date: 14-10-15 |
||||
* Time: 下午12:43 |
||||
*/ |
||||
public class ChartDesignerPropertyPane extends BaseChartPropertyPane { |
||||
private static ChartDesignerPropertyPane instance; |
||||
private TargetComponentContainer container = new TargetComponentContainer(); |
||||
private ChartEditPane chartEditPane; |
||||
private UILabel nameLabel; |
||||
private TitleChangeListener titleListener = new TitleChangeListener() { |
||||
|
||||
@Override |
||||
public void fireTitleChange(String addName) { |
||||
nameLabel.setText(Inter.getLocText("Chart-Property_Table") + '-' + addName); |
||||
} |
||||
}; |
||||
|
||||
public synchronized static ChartDesignerPropertyPane getInstance() { |
||||
if (instance == null) { |
||||
instance = new ChartDesignerPropertyPane(); |
||||
} |
||||
instance.setSureProperty(); |
||||
return instance; |
||||
} |
||||
|
||||
public ChartDesignerPropertyPane() { |
||||
this.setLayout(new BorderLayout()); |
||||
this.setBorder(null); |
||||
|
||||
createNameLabel(); |
||||
this.add(nameLabel, BorderLayout.NORTH); |
||||
chartEditPane = ChartDesignEditPane.getInstance(); |
||||
this.add(chartEditPane, BorderLayout.CENTER); |
||||
} |
||||
|
||||
private void createNameLabel() { |
||||
nameLabel = new UILabel() { |
||||
@Override |
||||
public Dimension getPreferredSize() { |
||||
return new Dimension(super.getPreferredSize().width, 18); |
||||
} |
||||
}; |
||||
nameLabel.setBorder(BorderFactory.createEmptyBorder(0, 0, 1, 0)); |
||||
nameLabel.setHorizontalAlignment(SwingConstants.CENTER); |
||||
} |
||||
|
||||
@Override |
||||
public void setSureProperty() { |
||||
chartEditPane.setContainer(container); |
||||
chartEditPane.addTitleChangeListener(titleListener); |
||||
String tabname = chartEditPane.getSelectedTabName(); |
||||
nameLabel.setText(Inter.getLocText("Chart-Property_Table") + (tabname != null ? ('-' + chartEditPane.getSelectedTabName()) : "")); |
||||
resetChartEditPane(); |
||||
|
||||
} |
||||
|
||||
protected void resetChartEditPane() { |
||||
remove(chartEditPane); |
||||
add(chartEditPane, BorderLayout.CENTER); |
||||
validate(); |
||||
repaint(); |
||||
revalidate(); |
||||
} |
||||
|
||||
@Override |
||||
public void setSupportCellData(boolean supportCellData){ |
||||
|
||||
} |
||||
|
||||
/** |
||||
* 感觉ChartCollection加载图表属性界面. |
||||
* @param collection 收集图表 |
||||
* @param chartDesigner 图表设计 |
||||
*/ |
||||
public void populateChartPropertyPane(BaseChartCollection collection, TargetComponent<?> chartDesigner) { |
||||
if (collection instanceof ChartCollection) { |
||||
this.container.setEPane(chartDesigner); |
||||
chartEditPane.populate((ChartCollection) collection); |
||||
} |
||||
} |
||||
|
||||
@Override |
||||
public void setWidgetPropertyPane(BaseWidgetPropertyPane pane) { |
||||
|
||||
} |
||||
|
||||
/** |
||||
* 刷新 |
||||
*/ |
||||
public void refreshDockingView() { |
||||
|
||||
} |
||||
|
||||
@Override |
||||
public String getViewTitle() { |
||||
return null; |
||||
} |
||||
|
||||
@Override |
||||
public Icon getViewIcon() { |
||||
return null; |
||||
} |
||||
|
||||
/** |
||||
* 位置 |
||||
* @return 位置 |
||||
*/ |
||||
public Location preferredLocation() { |
||||
return null; |
||||
} |
||||
} |
@ -1,47 +0,0 @@
|
||||
/* |
||||
* Copyright (c) 2001-2014,FineReport Inc, All Rights Reserved. |
||||
*/ |
||||
|
||||
package com.fr.design.mainframe; |
||||
|
||||
import com.fr.form.ui.ChartBook; |
||||
|
||||
import java.awt.*; |
||||
|
||||
/** |
||||
* Created by IntelliJ IDEA. |
||||
* Author : daisy |
||||
* Version: 6.5.6 |
||||
* Date: 14-10-13 |
||||
* Time: 下午2:32 |
||||
*/ |
||||
public class ChartUndoState extends BaseUndoState<JChart> { |
||||
private ChartBook chartBook; |
||||
private Dimension designerSize; |
||||
private double widthValue; |
||||
private double heightValue; |
||||
|
||||
public ChartUndoState(JChart t,ChartArea area) { |
||||
super(t); |
||||
try { |
||||
this.chartBook = (ChartBook) t.getTarget().clone(); |
||||
} catch (CloneNotSupportedException e) { |
||||
throw new RuntimeException(e); |
||||
} |
||||
this.widthValue =area.getCustomWidth(); |
||||
this.heightValue = area.getCustomHeight(); |
||||
} |
||||
|
||||
|
||||
public ChartBook getChartBook(){ |
||||
return this.chartBook; |
||||
} |
||||
|
||||
/** |
||||
* 应用状态 |
||||
*/ |
||||
public void applyState() { |
||||
this.getApplyTarget().applyUndoState(this); |
||||
|
||||
} |
||||
} |
@ -1,376 +0,0 @@
|
||||
/* |
||||
* Copyright (c) 2001-2014,FineReport Inc, All Rights Reserved. |
||||
* 图表类型文件 |
||||
*/ |
||||
|
||||
package com.fr.design.mainframe; |
||||
|
||||
import com.fr.base.BaseUtils; |
||||
import com.fr.base.FRContext; |
||||
import com.fr.file.FILEChooserPane; |
||||
import com.fr.file.FILEChooserPane4Chart; |
||||
import com.fr.form.ui.ChartBook; |
||||
import com.fr.design.DesignModelAdapter; |
||||
import com.fr.design.event.TargetModifiedEvent; |
||||
import com.fr.design.event.TargetModifiedListener; |
||||
import com.fr.design.gui.imenu.UIMenuItem; |
||||
import com.fr.design.layout.FRGUIPaneFactory; |
||||
import com.fr.design.mainframe.actions.ExcelExportAction4Chart; |
||||
import com.fr.design.mainframe.actions.PDFExportAction4Chart; |
||||
import com.fr.design.mainframe.actions.PNGExportAction4Chart; |
||||
import com.fr.design.mainframe.form.FormECCompositeProvider; |
||||
import com.fr.design.mainframe.toolbar.ToolBarMenuDockPlus; |
||||
import com.fr.design.menu.ShortCut; |
||||
import com.fr.design.menu.ToolBarDef; |
||||
import com.fr.file.FILE; |
||||
import com.fr.general.Inter; |
||||
import com.fr.json.JSONArray; |
||||
import com.fr.json.JSONException; |
||||
import com.fr.json.JSONObject; |
||||
import com.fr.stable.StringUtils; |
||||
|
||||
import javax.swing.*; |
||||
import java.awt.*; |
||||
import java.awt.datatransfer.StringSelection; |
||||
|
||||
/** |
||||
* 图表crt文件 |
||||
* <p/> |
||||
* Created by IntelliJ IDEA. |
||||
* Author : daisy |
||||
* Version: 6.5.6 |
||||
* Date: 14-10-13 |
||||
* Time: 下午2:28 |
||||
*/ |
||||
public class JChart extends JTemplate<ChartBook, ChartUndoState> { |
||||
public static final String XML_TAG = "JChart"; |
||||
private static final String CHART_CARD = "FORM"; |
||||
private static final String ELEMENTCASE_CARD = "ELEMENTCASE"; |
||||
|
||||
private static final String[] CARDNAME = new String[]{CHART_CARD, ELEMENTCASE_CARD}; |
||||
private static final int TOOLBARPANEDIMHEIGHT_FORM = 60; |
||||
//图表设计器
|
||||
ChartDesigner chartDesigner; |
||||
|
||||
//中间编辑区域, carllayout布局
|
||||
private JPanel tabCenterPane; |
||||
private CardLayout cardLayout; |
||||
//当前编辑的组件对象
|
||||
private JComponent editingComponent; |
||||
private FormECCompositeProvider reportComposite; |
||||
|
||||
public JChart() { |
||||
super(new ChartBook(), "Chart"); |
||||
} |
||||
|
||||
public JChart(ChartBook chartFile, FILE file) { |
||||
super(chartFile, file); |
||||
} |
||||
|
||||
@Override |
||||
protected JPanel createCenterPane() { |
||||
tabCenterPane = FRGUIPaneFactory.createCardLayout_S_Pane(); |
||||
JPanel centerPane = FRGUIPaneFactory.createBorderLayout_S_Pane(); |
||||
centerPane.setBorder(BorderFactory.createMatteBorder(0, 0, 0, 0, new Color(85, 85, 85))); |
||||
chartDesigner = new ChartDesigner(this.getTarget()); |
||||
ChartArea area = new ChartArea(chartDesigner); |
||||
centerPane.add(area, BorderLayout.CENTER); |
||||
tabCenterPane.add(centerPane, CHART_CARD, 0); |
||||
chartDesigner.addTargetModifiedListener(new TargetModifiedListener() { |
||||
public void targetModified(TargetModifiedEvent e) { |
||||
JChart.this.fireTargetModified();// 调用保存*, 调用刷新界面, 刷新工具栏按钮
|
||||
} |
||||
}); |
||||
|
||||
this.add(tabCenterPane, BorderLayout.CENTER); |
||||
return tabCenterPane; |
||||
} |
||||
|
||||
/** |
||||
* 移除选择 |
||||
*/ |
||||
public void removeTemplateSelection() { |
||||
|
||||
} |
||||
|
||||
/** |
||||
* 刷新容器 |
||||
*/ |
||||
public void refreshContainer() { |
||||
|
||||
} |
||||
|
||||
/** |
||||
* 移除参数面板选择 |
||||
*/ |
||||
public void removeParameterPaneSelection() { |
||||
|
||||
} |
||||
|
||||
/** |
||||
* 创建设计模式 |
||||
* |
||||
* @return 返回模式 |
||||
*/ |
||||
protected DesignModelAdapter<ChartBook, ?> createDesignModel() { |
||||
return null; |
||||
} |
||||
|
||||
/** |
||||
* 创建预览得菜单 |
||||
* |
||||
* @return 菜单 |
||||
*/ |
||||
public UIMenuItem[] createMenuItem4Preview() { |
||||
return new UIMenuItem[0]; |
||||
} |
||||
|
||||
/** |
||||
* 创建撤销状态 |
||||
* |
||||
* @return 状态 |
||||
*/ |
||||
protected ChartUndoState createUndoState() { |
||||
return new ChartUndoState(this,chartDesigner.getArea()); |
||||
} |
||||
|
||||
/** |
||||
* 应用撤销状态 |
||||
* |
||||
* @param chartUndoState 撤销状态 |
||||
*/ |
||||
protected void applyUndoState(ChartUndoState chartUndoState) { |
||||
try { |
||||
this.setTarget((ChartBook)chartUndoState.getChartBook().clone()); |
||||
chartDesigner.setTarget(this.getTarget()); |
||||
chartDesigner.populate(); |
||||
}catch (CloneNotSupportedException e) { |
||||
throw new RuntimeException(e); |
||||
} |
||||
} |
||||
|
||||
/** |
||||
* 后缀 |
||||
* |
||||
* @return 后缀 |
||||
*/ |
||||
public String suffix() { |
||||
return ".crt"; |
||||
} |
||||
|
||||
/** |
||||
* 复制 |
||||
*/ |
||||
public void copy() { |
||||
|
||||
} |
||||
|
||||
/** |
||||
* 黏贴 |
||||
* |
||||
* @return 是否鸟贴成功 |
||||
*/ |
||||
public boolean paste() { |
||||
return false; |
||||
} |
||||
|
||||
/** |
||||
* 是否剪切 |
||||
* |
||||
* @return 剪切成功 |
||||
*/ |
||||
public boolean cut() { |
||||
return false; |
||||
} |
||||
|
||||
/** |
||||
* 创建权限编辑面板 |
||||
* |
||||
* @return 面板 |
||||
*/ |
||||
public AuthorityEditPane createAuthorityEditPane() { |
||||
return null; |
||||
} |
||||
|
||||
/** |
||||
* 工具栏 |
||||
* |
||||
* @return 工具栏 |
||||
*/ |
||||
public ToolBarMenuDockPlus getToolBarMenuDockPlus() { |
||||
return null; |
||||
} |
||||
|
||||
/** |
||||
* 东上面板 |
||||
* |
||||
* @return 面板 |
||||
*/ |
||||
public JPanel getEastUpPane() { |
||||
return null; |
||||
} |
||||
|
||||
/** |
||||
* 东下面板 |
||||
* |
||||
* @return 面板 |
||||
*/ |
||||
public JPanel getEastDownPane() { |
||||
return null; |
||||
} |
||||
|
||||
/** |
||||
* 工具栏菜单 |
||||
* |
||||
* @return 菜单 |
||||
*/ |
||||
public ToolBarDef[] toolbars4Target() { |
||||
return new ToolBarDef[0]; |
||||
} |
||||
|
||||
/** |
||||
* 表单面板 |
||||
* |
||||
* @return 面板 |
||||
*/ |
||||
public JPanel[] toolbarPanes4Form() { |
||||
return new JPanel[0]; |
||||
} |
||||
|
||||
/** |
||||
* 模版菜单 |
||||
* |
||||
* @return 模版菜单 |
||||
*/ |
||||
public ShortCut[] shortcut4TemplateMenu() { |
||||
return new ShortCut[0]; |
||||
} |
||||
|
||||
/** |
||||
* 权限编辑菜单 |
||||
* |
||||
* @return 菜单 |
||||
*/ |
||||
public ShortCut[] shortCuts4Authority() { |
||||
return new ShortCut[0]; |
||||
} |
||||
|
||||
/** |
||||
* 工具条表单 |
||||
* |
||||
* @return 表单 |
||||
*/ |
||||
public JComponent[] toolBarButton4Form() { |
||||
return new JComponent[0]; |
||||
} |
||||
|
||||
/** |
||||
* 权限编辑工具栏,但是图表设计器里面用于正常工具栏不是全县编辑 |
||||
* |
||||
* @return 工具条 |
||||
*/ |
||||
public JComponent toolBar4Authority() { |
||||
return chartDesigner.getChartToolBarPane(); |
||||
} |
||||
|
||||
/** |
||||
* 工具条高度 |
||||
* |
||||
* @return 工具条高度 |
||||
*/ |
||||
public int getToolBarHeight() { |
||||
return 0; |
||||
} |
||||
|
||||
/** |
||||
* 是否是报表 |
||||
* |
||||
* @return 不是 |
||||
*/ |
||||
public boolean isJWorkBook() { |
||||
return false; |
||||
} |
||||
|
||||
/** |
||||
* 是否是图表 |
||||
* |
||||
* @return 是则返回true |
||||
*/ |
||||
public boolean isChartBook() { |
||||
return true; |
||||
} |
||||
|
||||
/** |
||||
* 设置权限编辑模式 |
||||
* |
||||
* @param isUpMode 没有权限编辑 |
||||
*/ |
||||
public void setAuthorityMode(boolean isUpMode) { |
||||
|
||||
} |
||||
|
||||
/** |
||||
* 刷新工具区域 |
||||
*/ |
||||
public void refreshToolArea() { |
||||
DesignerContext.getDesignerFrame().resetToolkitByPlus(JChart.this); |
||||
chartDesigner.populate(); |
||||
ChartDesignerPropertyPane.getInstance().populateChartPropertyPane(getTarget().getChartCollection(), chartDesigner); |
||||
EastRegionContainerPane.getInstance().replaceUpPane(ChartDesignerPropertyPane.getInstance()); |
||||
} |
||||
|
||||
/** |
||||
* 导出菜单的子菜单 ,目前用于图表设计器 |
||||
* |
||||
* @return 子菜单 |
||||
*/ |
||||
public ShortCut[] shortcut4ExportMenu() { |
||||
return new ShortCut[]{new PNGExportAction4Chart(this), new ExcelExportAction4Chart(this), new PDFExportAction4Chart(this)}; |
||||
} |
||||
|
||||
public Icon getIcon() { |
||||
return BaseUtils.readIcon("/com/fr/design/images/chart.png"); |
||||
} |
||||
|
||||
public ChartDesigner getChartDesigner(){ |
||||
return chartDesigner; |
||||
} |
||||
|
||||
/** |
||||
* 复制JS代码 |
||||
*/ |
||||
public void copyJS(){ |
||||
JSONObject jsonObject =this.getTarget().createExportConfig(); |
||||
String jsonString = StringUtils.EMPTY; |
||||
if(jsonObject != null){ |
||||
try{ |
||||
if(jsonObject.has("charts")){ |
||||
JSONArray charts = jsonObject.getJSONArray("charts"); |
||||
jsonString = charts.toString(2); |
||||
}else{ |
||||
jsonString = jsonObject.toString(2); |
||||
} |
||||
JOptionPane.showMessageDialog(DesignerContext.getDesignerFrame(), Inter.getLocText("FR-Chart-CopyJS_Message"), Inter.getLocText("FR-Chart-Action_Copy")+"JS", JOptionPane.INFORMATION_MESSAGE); |
||||
}catch (JSONException ex){ |
||||
FRContext.getLogger().error(ex.getMessage()); |
||||
JOptionPane.showMessageDialog(DesignerContext.getDesignerFrame(), Inter.getLocText("FR-Chart-CopyJS_Failed")+"!", Inter.getLocText("Error"), JOptionPane.ERROR_MESSAGE); |
||||
} |
||||
}else{ |
||||
JOptionPane.showMessageDialog(DesignerContext.getDesignerFrame(), Inter.getLocText("FR-Chart-CopyJS_Failed")+"!", Inter.getLocText("Error"), JOptionPane.ERROR_MESSAGE); |
||||
} |
||||
StringSelection stringSelection = new StringSelection(jsonString); |
||||
Toolkit.getDefaultToolkit().getSystemClipboard().setContents(stringSelection, null); |
||||
}; |
||||
|
||||
/** |
||||
* 系列风格改动 |
||||
*/ |
||||
public void styleChange(){ |
||||
chartDesigner.clearToolBarStyleChoose(); |
||||
} |
||||
|
||||
protected FILEChooserPane getFILEChooserPane(boolean isShowLoc){ |
||||
return new FILEChooserPane4Chart(true, isShowLoc); |
||||
} |
||||
|
||||
} |
@ -1,132 +0,0 @@
|
||||
/* |
||||
* Copyright (c) 2001-2014,FineReport Inc, All Rights Reserved. |
||||
*/ |
||||
|
||||
package com.fr.design.mainframe.actions; |
||||
|
||||
import com.fr.base.FRContext; |
||||
import com.fr.design.gui.iprogressbar.FRProgressBar; |
||||
import com.fr.form.ui.ChartBook; |
||||
import com.fr.design.mainframe.DesignerContext; |
||||
import com.fr.design.mainframe.DesignerFrame; |
||||
import com.fr.design.mainframe.JChart; |
||||
import com.fr.design.mainframe.exporter.Exporter4Chart; |
||||
import com.fr.file.FILE; |
||||
import com.fr.file.FILEChooserPane; |
||||
import com.fr.file.filter.ChooseFileFilter; |
||||
import com.fr.general.FRLogger; |
||||
import com.fr.general.Inter; |
||||
|
||||
import javax.swing.*; |
||||
import java.awt.event.ActionEvent; |
||||
import java.io.FileOutputStream; |
||||
|
||||
/** |
||||
* Created by IntelliJ IDEA. |
||||
* Author : daisy |
||||
* Version: 6.5.6 |
||||
* Date: 14-10-15 |
||||
* Time: 上午9:48 |
||||
*/ |
||||
public abstract class AbstractExportAction4JChart extends JChartAction { |
||||
protected AbstractExportAction4JChart(JChart chart){ |
||||
super(chart); |
||||
} |
||||
|
||||
private FRProgressBar progressbar; |
||||
|
||||
protected ChartBook getChartBook(){ |
||||
return this.getEditingComponent().getTarget(); |
||||
} |
||||
|
||||
/** |
||||
* 执行方法 |
||||
* @param e 事件 |
||||
*/ |
||||
public void actionPerformed(ActionEvent e) { |
||||
JChart chart = this.getEditingComponent(); |
||||
FILE editingFILE = chart.getEditingFILE(); |
||||
DesignerFrame designerFrame = DesignerContext.getDesignerFrame(); |
||||
|
||||
// 弹出参数
|
||||
final java.util.Map parameterMap = new java.util.HashMap(); |
||||
final ChartBook chartBook = getChartBook(); |
||||
|
||||
// Choose a file name....
|
||||
FILEChooserPane fileChooserPane = FILEChooserPane.getInstance(false, true); |
||||
fileChooserPane.setFILEFilter(this.getChooseFileFilter()); |
||||
|
||||
// 打开文件后输出文件名修改,eg:w.cpt.doc / w.svg.doc,去掉中间的后缀名~~ w.doc
|
||||
String filenName = editingFILE.getName(); |
||||
if (filenName.indexOf('.') != -1) { |
||||
filenName = filenName.substring(0, editingFILE.getName().lastIndexOf('.')); |
||||
} |
||||
fileChooserPane.setFileNameTextField(filenName, "." + this.getDefaultExtension()); |
||||
int saveValue = fileChooserPane.showSaveDialog(designerFrame, "." + this.getDefaultExtension()); |
||||
if (saveValue == FILEChooserPane.CANCEL_OPTION || saveValue == FILEChooserPane.JOPTIONPANE_CANCEL_OPTION) { |
||||
fileChooserPane = null; |
||||
return; |
||||
} else if (saveValue == FILEChooserPane.JOPTIONPANE_OK_OPTION || saveValue == FILEChooserPane.OK_OPTION) { |
||||
FILE file = fileChooserPane.getSelectedFILE(); |
||||
try { |
||||
file.mkfile(); |
||||
} catch (Exception e1) { |
||||
FRLogger.getLogger().error("Error In Make New File"); |
||||
} |
||||
fileChooserPane = null; |
||||
FRContext.getLogger().info("\"" + file.getName() + "\"" + Inter.getLocText("Prepare_Export") + "!"); |
||||
|
||||
(progressbar = new FRProgressBar(createExportWork(file, chartBook), designerFrame, |
||||
Inter.getLocText("Exporting"), "", 0, 100)).start(); |
||||
} |
||||
|
||||
} |
||||
|
||||
private SwingWorker createExportWork(FILE file, final ChartBook chartBook) { |
||||
final String filePath = file.getPath(); |
||||
final String fileGetName = file.getName(); |
||||
|
||||
SwingWorker exportWorker = new SwingWorker<Void, Void>() { |
||||
protected Void doInBackground() throws Exception { |
||||
Thread.sleep(100); //bug 10516
|
||||
try { |
||||
final FileOutputStream fileOutputStream = new FileOutputStream(filePath); |
||||
|
||||
this.setProgress(10); |
||||
dealExporter(fileOutputStream,chartBook); |
||||
this.setProgress(80); |
||||
fileOutputStream.close(); |
||||
this.setProgress(100); |
||||
|
||||
FRContext.getLogger().info("\"" + fileGetName + "\"" + Inter.getLocText("Finish_Export") + "!"); |
||||
JOptionPane.showMessageDialog(DesignerContext.getDesignerFrame(), |
||||
Inter.getLocText("Exported_successfully") + "\n" + filePath); |
||||
} catch (Exception exp) { |
||||
this.setProgress(100); |
||||
FRContext.getLogger().errorWithServerLevel(exp.getMessage(), exp); |
||||
JOptionPane.showMessageDialog(DesignerContext.getDesignerFrame(), Inter.getLocText("Export_failed") + "\n" + filePath); |
||||
} |
||||
return null; |
||||
} |
||||
|
||||
public void done() { |
||||
progressbar.close(); |
||||
} |
||||
}; |
||||
return exportWorker; |
||||
} |
||||
|
||||
private void dealExporter(FileOutputStream fileOutputStream, final ChartBook chartBook) throws Exception { |
||||
final Exporter4Chart exporter = AbstractExportAction4JChart.this.getExporter(); |
||||
exporter.export(fileOutputStream,this.getEditingComponent()); |
||||
} |
||||
|
||||
|
||||
|
||||
protected abstract ChooseFileFilter getChooseFileFilter(); |
||||
|
||||
protected abstract String getDefaultExtension(); |
||||
|
||||
protected abstract Exporter4Chart getExporter(); |
||||
|
||||
} |
@ -1,68 +0,0 @@
|
||||
/* |
||||
* Copyright (c) 2001-2014,FineReport Inc, All Rights Reserved. |
||||
*/ |
||||
|
||||
package com.fr.design.mainframe.actions; |
||||
|
||||
import com.fr.base.BaseUtils; |
||||
import com.fr.base.ExcelUtils; |
||||
import com.fr.design.mainframe.JChart; |
||||
import com.fr.design.mainframe.exporter.ExcelExporter4Chart; |
||||
import com.fr.design.mainframe.exporter.Exporter4Chart; |
||||
import com.fr.design.menu.MenuKeySet; |
||||
import com.fr.file.filter.ChooseFileFilter; |
||||
import com.fr.general.Inter; |
||||
|
||||
import javax.swing.*; |
||||
import java.awt.event.KeyEvent; |
||||
|
||||
/** |
||||
* Created by IntelliJ IDEA. |
||||
* Author : daisy |
||||
* Version: 6.5.6 |
||||
* Date: 14-10-15 |
||||
* Time: 上午9:52 |
||||
*/ |
||||
public class ExcelExportAction4Chart extends AbstractExportAction4JChart { |
||||
|
||||
private MenuKeySet excel= new MenuKeySet() { |
||||
@Override |
||||
public char getMnemonic() { |
||||
return 'E'; |
||||
} |
||||
|
||||
@Override |
||||
public String getMenuName() { |
||||
return Inter.getLocText("FR-Chart-Format_Excel"); |
||||
} |
||||
|
||||
@Override |
||||
public KeyStroke getKeyStroke() { |
||||
return KeyStroke.getKeyStroke(KeyEvent.VK_E, KeyEvent.CTRL_MASK); |
||||
} |
||||
}; |
||||
|
||||
public ExcelExportAction4Chart(JChart chart) { |
||||
super(chart); |
||||
this.setMenuKeySet(excel); |
||||
this.setName(getMenuKeySet().getMenuKeySetName()); |
||||
this.setMnemonic(getMenuKeySet().getMnemonic()); |
||||
this.setSmallIcon(BaseUtils.readIcon("/com/fr/design/images/m_file/excel.png")); |
||||
} |
||||
|
||||
|
||||
@Override |
||||
protected ChooseFileFilter getChooseFileFilter() { |
||||
return new ChooseFileFilter(new String[]{"xls", "xlsx"}, Inter.getLocText("Export-Excel")); |
||||
} |
||||
|
||||
@Override |
||||
protected String getDefaultExtension() { |
||||
return ExcelUtils.checkThirdJarSupportPOI() ? "xlsx" : "xls"; |
||||
} |
||||
|
||||
@Override |
||||
protected Exporter4Chart getExporter() { |
||||
return new ExcelExporter4Chart(); |
||||
} |
||||
} |
@ -1,21 +0,0 @@
|
||||
/* |
||||
* Copyright (c) 2001-2014,FineReport Inc, All Rights Reserved. |
||||
*/ |
||||
|
||||
package com.fr.design.mainframe.actions; |
||||
|
||||
import com.fr.design.actions.JTemplateAction; |
||||
import com.fr.design.mainframe.JChart; |
||||
|
||||
/** |
||||
* Created by IntelliJ IDEA. |
||||
* Author : daisy |
||||
* Version: 6.5.6 |
||||
* Date: 14-10-15 |
||||
* Time: 上午9:47 |
||||
*/ |
||||
public abstract class JChartAction extends JTemplateAction<JChart> { |
||||
public JChartAction(JChart jChart) { |
||||
super(jChart); |
||||
} |
||||
} |
@ -1,61 +0,0 @@
|
||||
/* |
||||
* Copyright (c) 2001-2014,FineReport Inc, All Rights Reserved. |
||||
*/ |
||||
|
||||
package com.fr.design.mainframe.actions; |
||||
|
||||
import com.fr.base.BaseUtils; |
||||
import com.fr.design.actions.UpdateAction; |
||||
import com.fr.design.mainframe.DesignerContext; |
||||
import com.fr.design.mainframe.JChart; |
||||
import com.fr.design.menu.MenuKeySet; |
||||
import com.fr.general.Inter; |
||||
|
||||
import javax.swing.*; |
||||
import java.awt.event.ActionEvent; |
||||
import java.awt.event.InputEvent; |
||||
import java.awt.event.KeyEvent; |
||||
|
||||
/** |
||||
* Created by IntelliJ IDEA. |
||||
* Author : daisy |
||||
* Version: 6.5.6 |
||||
* Date: 14-10-13 |
||||
* Time: 下午3:22 |
||||
*/ |
||||
public class NewChartAction extends UpdateAction{ |
||||
|
||||
public NewChartAction(){ |
||||
this.setMenuKeySet(NEW_CHART); |
||||
this.setName(getMenuKeySet().getMenuKeySetName()); |
||||
this.setMnemonic(getMenuKeySet().getMnemonic()); |
||||
this.setSmallIcon(BaseUtils.readIcon("com/fr/design/images/newchart_normal.png")); |
||||
this.setAccelerator(getMenuKeySet().getKeyStroke()); |
||||
} |
||||
|
||||
|
||||
/** |
||||
* 执行事件 |
||||
* @param e 事件 |
||||
*/ |
||||
public void actionPerformed(ActionEvent e) { |
||||
DesignerContext.getDesignerFrame().addAndActivateJTemplate(new JChart()); |
||||
} |
||||
|
||||
public static final MenuKeySet NEW_CHART = new MenuKeySet() { |
||||
@Override |
||||
public char getMnemonic() { |
||||
return 'F'; |
||||
} |
||||
|
||||
@Override |
||||
public String getMenuName() { |
||||
return Inter.getLocText("M-New_ChartBook"); |
||||
} |
||||
|
||||
@Override |
||||
public KeyStroke getKeyStroke() { |
||||
return KeyStroke.getKeyStroke(KeyEvent.VK_F, InputEvent.CTRL_MASK); |
||||
} |
||||
}; |
||||
} |
@ -1,65 +0,0 @@
|
||||
/* |
||||
* Copyright (c) 2001-2014,FineReport Inc, All Rights Reserved. |
||||
*/ |
||||
|
||||
package com.fr.design.mainframe.actions; |
||||
|
||||
import com.fr.base.BaseUtils; |
||||
import com.fr.design.mainframe.JChart; |
||||
import com.fr.design.mainframe.exporter.Exporter4Chart; |
||||
import com.fr.design.mainframe.exporter.PdfExporter4Chart; |
||||
import com.fr.design.menu.MenuKeySet; |
||||
import com.fr.file.filter.ChooseFileFilter; |
||||
import com.fr.general.Inter; |
||||
|
||||
import javax.swing.*; |
||||
|
||||
/** |
||||
* Created by IntelliJ IDEA. |
||||
* Author : daisy |
||||
* Version: 6.5.6 |
||||
* Date: 14-10-15 |
||||
* Time: 上午10:16 |
||||
*/ |
||||
public class PDFExportAction4Chart extends AbstractExportAction4JChart { |
||||
|
||||
private MenuKeySet pdf = new MenuKeySet() { |
||||
@Override |
||||
public char getMnemonic() { |
||||
return 'P'; |
||||
} |
||||
|
||||
@Override |
||||
public String getMenuName() { |
||||
return Inter.getLocText("FR-Chart-Format_PDF"); |
||||
} |
||||
|
||||
@Override |
||||
public KeyStroke getKeyStroke() { |
||||
return null; |
||||
} |
||||
}; |
||||
|
||||
public PDFExportAction4Chart(JChart chart) { |
||||
super(chart); |
||||
this.setMenuKeySet(pdf); |
||||
this.setName(getMenuKeySet().getMenuKeySetName()); |
||||
this.setMnemonic(getMenuKeySet().getMnemonic()); |
||||
this.setSmallIcon(BaseUtils.readIcon("/com/fr/design/images/m_file/pdf.png")); |
||||
} |
||||
|
||||
@Override |
||||
protected ChooseFileFilter getChooseFileFilter() { |
||||
return new ChooseFileFilter(new String[]{"pdf"}, Inter.getLocText("Export-PDF")); |
||||
} |
||||
|
||||
@Override |
||||
protected String getDefaultExtension() { |
||||
return "pdf"; |
||||
} |
||||
|
||||
@Override |
||||
protected Exporter4Chart getExporter() { |
||||
return new PdfExporter4Chart(); |
||||
} |
||||
} |
@ -1,66 +0,0 @@
|
||||
/* |
||||
* Copyright (c) 2001-2014,FineReport Inc, All Rights Reserved. |
||||
*/ |
||||
|
||||
package com.fr.design.mainframe.actions; |
||||
|
||||
import com.fr.base.BaseUtils; |
||||
import com.fr.design.mainframe.JChart; |
||||
import com.fr.design.mainframe.exporter.Exporter4Chart; |
||||
import com.fr.design.mainframe.exporter.ImageExporter4Chart; |
||||
import com.fr.design.menu.MenuKeySet; |
||||
import com.fr.file.filter.ChooseFileFilter; |
||||
import com.fr.general.Inter; |
||||
|
||||
import javax.swing.*; |
||||
import java.awt.event.KeyEvent; |
||||
|
||||
/** |
||||
* Created by IntelliJ IDEA. |
||||
* Author : daisy |
||||
* Version: 6.5.6 |
||||
* Date: 14-10-15 |
||||
* Time: 上午10:18 |
||||
*/ |
||||
public class PNGExportAction4Chart extends AbstractExportAction4JChart { |
||||
|
||||
private MenuKeySet menuSet = new MenuKeySet() { |
||||
@Override |
||||
public char getMnemonic() { |
||||
return 'M'; |
||||
} |
||||
|
||||
@Override |
||||
public String getMenuName() { |
||||
return Inter.getLocText("FR-Chart-Format_Image"); |
||||
} |
||||
|
||||
@Override |
||||
public KeyStroke getKeyStroke() { |
||||
return KeyStroke.getKeyStroke(KeyEvent.VK_M, KeyEvent.CTRL_MASK); |
||||
} |
||||
}; |
||||
|
||||
public PNGExportAction4Chart(JChart chart) { |
||||
super(chart); |
||||
this.setMenuKeySet(menuSet); |
||||
this.setName(getMenuKeySet().getMenuKeySetName()); |
||||
this.setMnemonic(getMenuKeySet().getMnemonic()); |
||||
this.setSmallIcon(BaseUtils.readIcon("/com/fr/design/images/exportimg.png")); |
||||
} |
||||
|
||||
@Override |
||||
protected ChooseFileFilter getChooseFileFilter() { |
||||
return new ChooseFileFilter(new String[]{"png"}, Inter.getLocText("Image")); |
||||
} |
||||
|
||||
@Override |
||||
protected String getDefaultExtension() { |
||||
return "png"; |
||||
} |
||||
|
||||
@Override |
||||
protected Exporter4Chart getExporter() { |
||||
return new ImageExporter4Chart(); |
||||
} |
||||
} |
@ -1,94 +0,0 @@
|
||||
package com.fr.design.mainframe.exporter; |
||||
|
||||
import com.fr.base.ExcelUtils; |
||||
import com.fr.design.mainframe.ChartDesigner; |
||||
import com.fr.design.mainframe.JChart; |
||||
import com.fr.general.FRLogger; |
||||
import com.fr.general.IOUtils; |
||||
import com.fr.stable.CoreGraphHelper; |
||||
import com.fr.third.v2.org.apache.poi.hssf.usermodel.HSSFClientAnchor; |
||||
import com.fr.third.v2.org.apache.poi.hssf.usermodel.HSSFWorkbook; |
||||
import com.fr.third.v2.org.apache.poi.ss.usermodel.ClientAnchor; |
||||
import com.fr.third.v2.org.apache.poi.ss.usermodel.Drawing; |
||||
import com.fr.third.v2.org.apache.poi.ss.usermodel.Sheet; |
||||
import com.fr.third.v2.org.apache.poi.ss.usermodel.Workbook; |
||||
import com.fr.third.v2.org.apache.poi.xssf.usermodel.XSSFClientAnchor; |
||||
import com.fr.third.v2.org.apache.poi.xssf.usermodel.XSSFWorkbook; |
||||
import java.awt.*; |
||||
import java.awt.image.BufferedImage; |
||||
import java.io.ByteArrayOutputStream; |
||||
import java.io.IOException; |
||||
import java.io.OutputStream; |
||||
|
||||
/** |
||||
* Created by IntelliJ IDEA. |
||||
* Author : daisy |
||||
* Version: 6.5.6 |
||||
* Date: 14-10-22 |
||||
* Time: 上午10:47 |
||||
*/ |
||||
public class ExcelExporter4Chart extends ImageExporter4Chart { |
||||
private static final int PICTURE_TYPE_PNG = 6 ; |
||||
private static final int DEFAULT_COLUMN_SPAN = 12; |
||||
private static final int DEFAULT_ROW_SPAN = 26; |
||||
private Workbook workbook; |
||||
private ClientAnchor anchor; |
||||
|
||||
|
||||
|
||||
/** |
||||
* 导出 |
||||
* |
||||
* @param out 输出流 |
||||
* @param chart 图表文件 |
||||
* @throws Exception 异常 |
||||
*/ |
||||
public void export(OutputStream out, JChart chart) throws Exception { |
||||
try { |
||||
ChartDesigner designer = chart.getChartDesigner(); |
||||
int imageWidth = designer.getArea().getCustomWidth(); |
||||
int imageHeight = designer.getArea().getCustomHeight(); |
||||
BufferedImage image = CoreGraphHelper.createBufferedImage(imageWidth, (int) imageHeight, BufferedImage.TYPE_INT_RGB); |
||||
Graphics2D g2d = image.createGraphics(); |
||||
paintGlyph(g2d,imageWidth,imageHeight,designer); |
||||
g2d.dispose(); |
||||
if (checkExcelExportVersion()) { |
||||
workbook = new XSSFWorkbook(); |
||||
}else{ |
||||
workbook = new HSSFWorkbook(); |
||||
} |
||||
Sheet sheet = workbook.createSheet(); |
||||
if(checkExcelExportVersion()){ |
||||
anchor = new XSSFClientAnchor(0,0,0,0,1,1,DEFAULT_COLUMN_SPAN,DEFAULT_ROW_SPAN); |
||||
}else{ |
||||
anchor = new HSSFClientAnchor(0,0,0,0,(short)1,1,(short)DEFAULT_COLUMN_SPAN,DEFAULT_ROW_SPAN); |
||||
} |
||||
Drawing patriarch = sheet.createDrawingPatriarch(); |
||||
patriarch.createPicture(anchor,loadPicture(image)); |
||||
workbook.write(out); |
||||
out.flush(); |
||||
}catch (Exception e){ |
||||
FRLogger.getLogger().error(e.getMessage()); |
||||
} |
||||
} |
||||
|
||||
private boolean checkExcelExportVersion() { |
||||
return ExcelUtils.checkThirdJarSupportPOI(); |
||||
} |
||||
// 加载图片.
|
||||
private int loadPicture(BufferedImage bufferedImage)throws IOException { |
||||
ByteArrayOutputStream bos = null; |
||||
try { |
||||
bos = new ByteArrayOutputStream(); |
||||
IOUtils.writeImage(bufferedImage, "png", bos); |
||||
//引用这个参数是jdk1.5的版本 XSSFWorkbook.PICTURE_TYPE_PNG, 在1.4下无法编译, 所有手动去掉这个参数.
|
||||
return workbook.addPicture(bos.toByteArray(), PICTURE_TYPE_PNG); |
||||
} finally { |
||||
if (bos != null) { |
||||
bos.flush(); |
||||
bos.close(); |
||||
} |
||||
bufferedImage.flush(); |
||||
} |
||||
} |
||||
} |
@ -1,25 +0,0 @@
|
||||
package com.fr.design.mainframe.exporter; |
||||
import com.fr.design.mainframe.JChart; |
||||
|
||||
import java.io.OutputStream; |
||||
|
||||
/** |
||||
* 图表设计器crt文件的导出成其他类型文件的接口 |
||||
* Created by IntelliJ IDEA. |
||||
* Author : daisy |
||||
* Version: 6.5.6 |
||||
* Date: 14-10-21 |
||||
* Time: 下午7:14 |
||||
*/ |
||||
public interface Exporter4Chart { |
||||
|
||||
/** |
||||
* 将结果crt导出成目标文件 |
||||
* |
||||
* @param out 输出流 |
||||
* @param chart chart文件 |
||||
* @throws Exception 导出失败则抛出此异常 |
||||
*/ |
||||
public void export(OutputStream out, JChart chart) throws Exception; |
||||
|
||||
} |
@ -1,89 +0,0 @@
|
||||
/* |
||||
* Copyright (c) 2001-2014,FineReport Inc, All Rights Reserved. |
||||
*/ |
||||
|
||||
package com.fr.design.mainframe.exporter; |
||||
|
||||
import com.fr.base.chart.BaseChartGlyph; |
||||
import com.fr.base.chart.chartdata.BaseTableDefinition; |
||||
import com.fr.base.chart.chartdata.ChartData; |
||||
import com.fr.base.chart.chartdata.TopDefinitionProvider; |
||||
import com.fr.chart.chartattr.Chart; |
||||
import com.fr.chart.chartattr.ChartCollection; |
||||
import com.fr.chart.chartglyph.ChartGlyph; |
||||
import com.fr.data.TableDataSource; |
||||
import com.fr.design.mainframe.ChartDesigner; |
||||
import com.fr.design.mainframe.JChart; |
||||
import com.fr.script.Calculator; |
||||
import com.fr.stable.Constants; |
||||
import com.fr.stable.CoreGraphHelper; |
||||
|
||||
import javax.imageio.ImageIO; |
||||
import java.awt.*; |
||||
import java.awt.image.BufferedImage; |
||||
import java.io.OutputStream; |
||||
|
||||
/** |
||||
* Created by IntelliJ IDEA. |
||||
* Author : daisy |
||||
* Version: 6.5.6 |
||||
* Date: 14-10-15 |
||||
* Time: 上午10:04 |
||||
*/ |
||||
public class ImageExporter4Chart implements Exporter4Chart{ |
||||
private int resolution = Constants.DEFAULT_WEBWRITE_AND_SCREEN_RESOLUTION; |
||||
protected Calculator calculator; |
||||
|
||||
|
||||
public ImageExporter4Chart() { |
||||
|
||||
} |
||||
|
||||
/** |
||||
* 导出 |
||||
* |
||||
* @param out 输出流 |
||||
* @param chart 图表文件 |
||||
* @throws Exception 异常 |
||||
*/ |
||||
public void export(OutputStream out, JChart chart) throws Exception { |
||||
ChartDesigner designer = chart.getChartDesigner(); |
||||
int imageWidth = designer.getArea().getCustomWidth(); |
||||
int imageHeight = designer.getArea().getCustomHeight(); |
||||
BufferedImage image = CoreGraphHelper.createBufferedImage(imageWidth, (int) imageHeight, BufferedImage.TYPE_INT_RGB); |
||||
Graphics2D g2d = image.createGraphics(); |
||||
paintGlyph(g2d,imageWidth,imageHeight,designer); |
||||
ImageIO.write(image, "png", out); |
||||
} |
||||
|
||||
protected void paintGlyph(Graphics2D g2d,int imageWidth,int imageHeight,ChartDesigner designer){ |
||||
if (imageWidth == 0 || imageHeight == 0) { |
||||
return; |
||||
} |
||||
this.calculator = Calculator.createCalculator(); |
||||
this.calculator.setAttribute(TableDataSource.class, null); |
||||
g2d.setColor(Color.white); |
||||
g2d.fillRect(0, 0, imageWidth,imageHeight); |
||||
ChartCollection chartCollection = (ChartCollection) designer.getTarget().getChartCollection(); |
||||
Chart editingChart = chartCollection.getSelectedChart(); |
||||
|
||||
TopDefinitionProvider topDefinition = editingChart.getFilterDefinition(); |
||||
ChartData chartData4Glyph = null; |
||||
if (topDefinition instanceof BaseTableDefinition) { |
||||
chartData4Glyph = ((BaseTableDefinition) topDefinition).calcu4ChartData(calculator, editingChart.getDataProcessor()); |
||||
} |
||||
|
||||
if (chartData4Glyph == null) { |
||||
chartData4Glyph = editingChart.defaultChartData(); |
||||
} |
||||
|
||||
BaseChartGlyph chartGlyph = null; |
||||
if (editingChart != null && editingChart.getPlot() != null) { |
||||
chartGlyph = editingChart.createGlyph(chartData4Glyph); |
||||
} |
||||
if (chartGlyph instanceof ChartGlyph) { |
||||
Image glyphImage = ((ChartGlyph) chartGlyph).toImage(imageWidth, imageHeight, resolution); |
||||
g2d.drawImage(glyphImage, 0, 0, null); |
||||
} |
||||
} |
||||
} |
@ -1,382 +0,0 @@
|
||||
package com.fr.design.mainframe.exporter; |
||||
|
||||
import com.fr.base.FRContext; |
||||
import com.fr.design.mainframe.ChartDesigner; |
||||
import com.fr.design.mainframe.JChart; |
||||
import com.fr.general.ComparatorUtils; |
||||
import com.fr.general.FRLogger; |
||||
import com.fr.stable.OperatingSystem; |
||||
import com.fr.stable.StableUtils; |
||||
import com.fr.third.com.lowagie.text.Document; |
||||
import com.fr.third.com.lowagie.text.ExceptionConverter; |
||||
import com.fr.third.com.lowagie.text.Rectangle; |
||||
import com.fr.third.com.lowagie.text.pdf.*; |
||||
|
||||
import java.awt.*; |
||||
import java.io.ByteArrayOutputStream; |
||||
import java.io.File; |
||||
import java.io.IOException; |
||||
import java.io.OutputStream; |
||||
import java.util.HashMap; |
||||
import java.util.Locale; |
||||
|
||||
/** |
||||
* Created by IntelliJ IDEA. |
||||
* Author : daisy |
||||
* Version: 6.5.6 |
||||
* Date: 14-10-22 |
||||
* Time: 上午10:20 |
||||
*/ |
||||
public class PdfExporter4Chart extends ImageExporter4Chart { |
||||
protected static MyFontMapper fontMapper = null; |
||||
|
||||
|
||||
/** |
||||
* 将结果crt导出成目标文件 |
||||
* |
||||
* @param out 输出流 |
||||
* @param chart chart文件 |
||||
* @throws Exception 导出失败则抛出此异常 |
||||
*/ |
||||
public void export(OutputStream out, JChart chart) throws Exception { |
||||
ChartDesigner designer = chart.getChartDesigner(); |
||||
int imageWidth = designer.getArea().getCustomWidth(); |
||||
int imageHeight = designer.getArea().getCustomHeight(); |
||||
Document document = null; |
||||
PdfWriter writer = null; |
||||
ByteArrayOutputStream bo = new ByteArrayOutputStream(); |
||||
|
||||
if (document == null) { |
||||
document = new Document(new Rectangle(imageWidth, imageHeight)); |
||||
writer = PdfWriter.getInstance(document, bo); |
||||
document.open(); |
||||
} |
||||
//将chart画到PDF上去
|
||||
PdfContentByte cb = writer.getDirectContent(); |
||||
Graphics2D g2d = cb.createGraphics(imageWidth, imageHeight, prepareFontMapper()); |
||||
paintGlyph(g2d, imageWidth, imageHeight, designer); |
||||
g2d.dispose(); |
||||
if (document != null) { |
||||
document.close(); |
||||
} |
||||
|
||||
try { |
||||
out.write(bo.toByteArray()); |
||||
out.flush(); |
||||
out.close(); |
||||
} catch (IOException e) { |
||||
FRLogger.getLogger().error(e.getMessage()); |
||||
} |
||||
|
||||
|
||||
} |
||||
|
||||
private static void insertDirectory4Linux() { |
||||
/* |
||||
* alex:在222这台Redhat的机器上测试,发现把从windows拷来的simsun.ttc只有放在usr/share/fonts/default/Type1里面才可以用起来 |
||||
* 如果是放在usr/share/fonts目录或是${env}/resources/fonts目录下面,虽然可以读到,但是awtToPdf之后返回出去却依旧无法起作用 |
||||
* 中文字依然挤在一起 |
||||
* |
||||
* 觉得实在很诡异,可能必须放在系统字体的文件夹下面才行吧 |
||||
* |
||||
* PS:这是在用Graphics drawString的时候遇到的问题 |
||||
*/ |
||||
//Linux
|
||||
InsertDirectory(fontMapper, new File("/usr/X11R6/lib/X11/fonts")); |
||||
InsertDirectory(fontMapper, new File("/usr/share/fonts")); |
||||
String path = StableUtils.pathJoin(new String[]{FRContext.getCurrentEnv().getPath(), "fonts"}); |
||||
//再去web-inf/fonts里面找一下, 省去客户四处找jdk安装路径的麻烦
|
||||
InsertDirectory(fontMapper, new File(path)); |
||||
|
||||
//Solaris
|
||||
InsertDirectory(fontMapper, new File("/usr/X/lib/X11/fonts/TrueType")); |
||||
InsertDirectory(fontMapper, new File("/usr/openwin/lib/X11/fonts/TrueType")); |
||||
} |
||||
|
||||
private static void insertDirectory4Windows() { |
||||
String libraryPath = System.getProperty("java.library.path"); |
||||
String[] libraryPathArray = StableUtils.splitString(libraryPath, ";"); |
||||
for (int i = 0; i < libraryPathArray.length; i++) { |
||||
File libraryFile = new File(libraryPathArray[i]); |
||||
InsertDirectory(fontMapper, new File(libraryFile, "Fonts")); |
||||
} |
||||
|
||||
InsertDirectory(fontMapper, new File("C:\\WINNT\\Fonts")); |
||||
InsertDirectory(fontMapper, new File("C:\\WINDOWS\\Fonts")); |
||||
} |
||||
|
||||
//peter:循环所有的目录,遍历所有的FontMapper.
|
||||
protected static void InsertDirectory(MyFontMapper fontMapper, File dir) { |
||||
if (dir == null || !dir.exists() || !dir.isDirectory()) { |
||||
return; |
||||
} |
||||
|
||||
fontMapper.insertDirectory(dir.getAbsolutePath()); |
||||
|
||||
File[] listFiles = dir.listFiles(); |
||||
for (int i = 0; i < listFiles.length; i++) { |
||||
InsertDirectory(fontMapper, listFiles[i]); |
||||
} |
||||
} |
||||
|
||||
|
||||
/** |
||||
* Prepares FontMapper. |
||||
*/ |
||||
protected static MyFontMapper prepareFontMapper() { |
||||
if (fontMapper != null) { |
||||
return fontMapper; |
||||
} |
||||
|
||||
fontMapper = new MyFontMapper(); |
||||
try { |
||||
//然后加载系统Font字体.
|
||||
if (OperatingSystem.isWindows()) { |
||||
insertDirectory4Windows(); |
||||
|
||||
} else { |
||||
insertDirectory4Linux(); |
||||
|
||||
} |
||||
|
||||
String javaHomeProp = System.getProperty("java.home"); |
||||
if (javaHomeProp != null) { |
||||
File javaFontFile = new File(StableUtils.pathJoin(new String[]{ |
||||
javaHomeProp, "lib", "fonts" |
||||
})); |
||||
if (javaFontFile.exists() && javaFontFile.isDirectory()) { |
||||
InsertDirectory(fontMapper, javaFontFile); |
||||
} |
||||
} |
||||
|
||||
if (FRContext.getLocale() == Locale.CHINA || FRContext.getLocale() == Locale.CHINESE) { |
||||
MyFontMapper.defaultFont = BaseFont.createFont(MyFontMapper.CHINESE_SIMPLIFIED_FONT, MyFontMapper.CHINESE_SIMPLIFIED_ENCODING_H, BaseFont.NOT_EMBEDDED); |
||||
} else if (FRContext.getLocale() == Locale.TAIWAN || FRContext.getLocale() == Locale.TRADITIONAL_CHINESE) { |
||||
MyFontMapper.defaultFont = BaseFont.createFont(MyFontMapper.CHINESE_TRADITIONAL_FONT_M_SUNG, MyFontMapper.CHINESE_TRADITIONAL_ENCODING_H, BaseFont.NOT_EMBEDDED); |
||||
} else if (FRContext.getLocale() == Locale.JAPAN || FRContext.getLocale() == Locale.JAPANESE) { |
||||
MyFontMapper.defaultFont = BaseFont.createFont(MyFontMapper.JAPANESE_FONT_GO, MyFontMapper.JAPANESE_ENCODING_H, BaseFont.NOT_EMBEDDED); |
||||
} else if (FRContext.getLocale() == Locale.KOREA || FRContext.getLocale() == Locale.KOREAN) { |
||||
MyFontMapper.defaultFont = BaseFont.createFont(MyFontMapper.KOREAN_FONT_GO_THIC, MyFontMapper.KOREAN_ENCODING_H, BaseFont.NOT_EMBEDDED); |
||||
} else { |
||||
//默认也设置一个吧45422 , 不设置默认字体, linux英文环境导不出来
|
||||
MyFontMapper.defaultFont = BaseFont.createFont(MyFontMapper.CHINESE_SIMPLIFIED_FONT, MyFontMapper.CHINESE_SIMPLIFIED_ENCODING_H, BaseFont.NOT_EMBEDDED); |
||||
} |
||||
} catch (Exception e) { |
||||
FRContext.getLogger().error(e.getMessage(), e); |
||||
} |
||||
|
||||
return fontMapper; |
||||
} |
||||
|
||||
public static class MyFontMapper implements FontMapper { |
||||
|
||||
public static final String CHINESE_SIMPLIFIED_FONT = "STSong-Light"; |
||||
public static final String CHINESE_SIMPLIFIED_ENCODING_H = "UniGB-UCS2-H"; |
||||
public static final String CHINESE_SIMPLIFIED_ENCODING_V = "UniGB-UCS2-V"; |
||||
|
||||
public static final String CHINESE_TRADITIONAL_FONT_M_HEI = "MHei-Medium"; |
||||
public static final String CHINESE_TRADITIONAL_FONT_M_SUNG = "MSung-Light"; |
||||
public static final String CHINESE_TRADITIONAL_ENCODING_H = "UniCNS-UCS2-H"; |
||||
public static final String CHINESE_TRADITIONAL_ENCODING_V = "UniCNS-UCS2-V"; |
||||
|
||||
public static final String JAPANESE_FONT_GO = "HeiseiKakuGo-W5"; |
||||
public static final String JAPANESE_FONT_MIN = "HeiseiMin-W3"; |
||||
public static final String JAPANESE_ENCODING_H = "UniJIS-UCS2-H"; |
||||
public static final String JAPANESE_ENCODING_V = "UniJIS-UCS2-V"; |
||||
public static final String JAPANESE_ENCODING_HW_H = "UniJIS-UCS2-HW-H"; |
||||
public static final String JAPANESE_ENCODING_HW_V = "UniJIS-UCS2-HW-V"; |
||||
|
||||
public static final String KOREAN_FONT_GO_THIC = "HYGoThic-Medium"; |
||||
public static final String KOREAN_FONT_S_MYEONG_JO = "HYSMyeongJo-Medium"; |
||||
public static final String KOREAN_ENCODING_H = "UniKS-UCS2-H"; |
||||
public static final String KOREAN_ENCODING_V = "UniKS-UCS2-V"; |
||||
|
||||
public static BaseFont defaultFont; |
||||
private HashMap mapper; |
||||
|
||||
public static class BaseFontParameters { |
||||
|
||||
public String fontName; |
||||
public String encoding; |
||||
public boolean embedded; |
||||
public boolean cached; |
||||
public byte ttfAfm[]; |
||||
public byte pfb[]; |
||||
|
||||
public BaseFontParameters(String fontName) { |
||||
this.fontName = fontName; |
||||
encoding = BaseFont.IDENTITY_H; |
||||
embedded = true; |
||||
cached = true; |
||||
} |
||||
|
||||
/** |
||||
* toString方法 |
||||
* |
||||
* @return 对象说明 |
||||
*/ |
||||
public String toString() { |
||||
return "{fontName:" + fontName + ",encoding:" + encoding + ",embedded:" + embedded + ",cached:" + cached; |
||||
} |
||||
} |
||||
|
||||
public MyFontMapper() { |
||||
mapper = new HashMap(); |
||||
} |
||||
|
||||
/** |
||||
* 转化字体 |
||||
* |
||||
* @param font awt字体 |
||||
* @return pdf字体 |
||||
*/ |
||||
public BaseFont awtToPdf(Font font) { |
||||
try { |
||||
BaseFontParameters p = getBaseFontParameters(font.getFontName()); |
||||
|
||||
/* |
||||
* alex:不明真相 |
||||
* 经测试,Arial粗体在getFontName返回的是Arial Bold,可以在上面的方法中得到对应的p |
||||
* 所以getFontName是有用的 |
||||
* 但是在linux上测试,宋体在getFontName返回的却是Dialog这种逻辑字体,只有getName才返回SimSun |
||||
* 所以还需要getBaseFontParameters一下 |
||||
*/ |
||||
if (p == null) { |
||||
p = getBaseFontParameters(font.getName()); |
||||
} |
||||
|
||||
if (p != null) { |
||||
return BaseFont.createFont(p.fontName, p.encoding, p.embedded, p.cached, p.ttfAfm, p.pfb); |
||||
} else { |
||||
// FRContext.getLogger().info(Inter.getLocText("Utils-Font_Not_Found") + ":" + font.getFontName());
|
||||
|
||||
// alex:未找到合适的字体,如果有默认字体,用之,没有的话,根据Bold & Italic设置字体
|
||||
if (defaultFont != null) { |
||||
return defaultFont; |
||||
} else { |
||||
String fontKey = BaseFont.COURIER; |
||||
if (font.isBold() && font.isItalic()) { |
||||
fontKey = BaseFont.COURIER_BOLDOBLIQUE; |
||||
} else if (font.isBold()) { |
||||
fontKey = BaseFont.COURIER_BOLD; |
||||
} else if (font.isItalic()) { |
||||
fontKey = BaseFont.COURIER_OBLIQUE; |
||||
} |
||||
|
||||
return BaseFont.createFont(fontKey, BaseFont.CP1252, BaseFont.NOT_EMBEDDED); |
||||
} |
||||
} |
||||
} catch (Exception e) { |
||||
FRContext.getLogger().error(e.getMessage(), e); |
||||
throw new ExceptionConverter(e); |
||||
} |
||||
} |
||||
|
||||
/** |
||||
* 转化字体 |
||||
* |
||||
* @param font pdf字体 |
||||
* @param size 大小 |
||||
* @return 转化后awt字体 |
||||
*/ |
||||
public Font pdfToAwt(BaseFont font, int size) { |
||||
String[][] names = font.getFullFontName(); |
||||
if (names.length == 1) { |
||||
return new Font(names[0][3], 0, size); |
||||
} |
||||
String name10 = null; |
||||
String name3x = null; |
||||
for (int k = 0; k < names.length; ++k) { |
||||
String[] name = names[k]; |
||||
if (ComparatorUtils.equals(name[0], "1") && ComparatorUtils.equals(name[1], "0")) { |
||||
name10 = name[3]; |
||||
} else if (ComparatorUtils.equals(name[2], "1033")) { |
||||
name3x = name[3]; |
||||
break; |
||||
} |
||||
} |
||||
String finalName = name3x; |
||||
if (finalName == null) { |
||||
finalName = name10; |
||||
} |
||||
if (finalName == null) { |
||||
finalName = names[0][3]; |
||||
} |
||||
return new Font(finalName, 0, size); |
||||
} |
||||
|
||||
private BaseFontParameters getBaseFontParameters(String name) { |
||||
return (BaseFontParameters) mapper.get(name); |
||||
} |
||||
|
||||
protected void insertNames(String names[][], String path) { |
||||
String main = null; |
||||
int k = 0; |
||||
do { |
||||
if (k >= names.length) { |
||||
break; |
||||
} |
||||
String[] name = names[k]; |
||||
if (ComparatorUtils.equals(name[2], "1033")) { |
||||
main = name[3]; |
||||
break; |
||||
} |
||||
k++; |
||||
} while (true); |
||||
if (main == null) { |
||||
main = names[0][3]; |
||||
} |
||||
BaseFontParameters p = new BaseFontParameters(path); |
||||
|
||||
// alex:不一样的名字可能对应同样的BaseFontParameters,比如simsun和宋体都对应同样的p
|
||||
mapper.put(main, p); |
||||
for (k = 0; k < names.length; k++) { |
||||
mapper.put(names[k][3], p); |
||||
} |
||||
} |
||||
|
||||
/** |
||||
* 插入目录里的字体 |
||||
* |
||||
* @param dir 目录 |
||||
* @return 插入数量 |
||||
*/ |
||||
public int insertDirectory(String dir) { |
||||
File file = new File(dir); |
||||
if (!file.exists() || !file.isDirectory()) { |
||||
return 0; |
||||
} |
||||
|
||||
File[] files = file.listFiles(); |
||||
int count = 0; |
||||
for (int k = 0; k < files.length; k++) { |
||||
file = files[k]; |
||||
String name = file.getPath().toLowerCase(); |
||||
try { |
||||
if (matchPostfix(name)) { |
||||
String[][] names = BaseFont.getFullFontName(file.getPath(), BaseFont.CP1252, null); |
||||
insertNames(names, file.getPath()); |
||||
count++; |
||||
} else if (name.endsWith(".ttc")) { |
||||
String[] ttcs = BaseFont.enumerateTTCNames(file.getPath()); |
||||
for (int j = 0; j < ttcs.length; j++) { |
||||
String nt = String.valueOf(new StringBuffer(file.getPath()).append(',').append(j)); |
||||
String[][] names = BaseFont.getFullFontName(nt, BaseFont.CP1252, null); |
||||
insertNames(names, nt); |
||||
} |
||||
|
||||
count++; |
||||
} |
||||
} catch (Exception exception) { |
||||
FRContext.getLogger().error(exception.getMessage(), exception); |
||||
} |
||||
} |
||||
|
||||
return count; |
||||
} |
||||
|
||||
private boolean matchPostfix(String name) { |
||||
return name.endsWith(".ttf") || name.endsWith(".otf") || name.endsWith(".afm"); |
||||
} |
||||
} |
||||
} |
@ -1 +1 @@
|
||||
package com.fr.design.module;
import com.fr.chart.base.ChartInternationalNameContentBean;
import com.fr.chart.chartattr.Chart;
import com.fr.chart.chartattr.ChartCollection;
import com.fr.chart.charttypes.ChartTypeManager;
import com.fr.design.ChartTypeInterfaceManager;
import com.fr.design.actions.core.ActionFactory;
import com.fr.design.chart.ChartDialog;
import com.fr.design.chart.gui.ChartComponent;
import com.fr.design.chart.gui.ChartWidgetOption;
import com.fr.design.gui.core.WidgetOption;
import com.fr.design.mainframe.App;
import com.fr.design.mainframe.ChartAndWidgetPropertyPane;
import com.fr.design.mainframe.ChartPropertyPane;
import com.fr.form.ui.ChartEditor;
import com.fr.general.IOUtils;
import com.fr.general.Inter;
import com.fr.stable.bridge.StableFactory;
import com.fr.stable.plugin.ExtraChartDesignClassManagerProvider;
import javax.swing.*;
/**
* Created by IntelliJ IDEA.
* Author : Richer
* Version: 7.0.3
* Date: 13-7-8
* Time: 上午9:13
*/
public class ChartDesignerModule extends DesignModule {
public void start() {
super.start();
dealBeforeRegister();
register();
registerFloatEditor();
}
protected void dealBeforeRegister(){
StableFactory.registerMarkedClass(ExtraChartDesignClassManagerProvider.XML_TAG, ChartTypeInterfaceManager.class);
StableFactory.getStaticMarkedInstanceObjectFromClass(ExtraChartDesignClassManagerProvider.XML_TAG, ExtraChartDesignClassManagerProvider.class);
}
private void register(){
DesignModuleFactory.registerHyperlinkGroupType(new ChartHyperlinkGroup());
DesignModuleFactory.registerChartEditorClass(ChartEditor.class);
DesignModuleFactory.registerChartComponentClass(ChartComponent.class);
DesignModuleFactory.registerChartDialogClass(ChartDialog.class);
DesignModuleFactory.registerChartAndWidgetPropertyPane(ChartAndWidgetPropertyPane.class);
DesignModuleFactory.registerChartPropertyPaneClass(ChartPropertyPane.class);
ActionFactory.registerChartPreStyleAction(new ChartPreStyleAction());
}
protected void registerFloatEditor() {
ActionFactory.registerChartCollection(ChartCollection.class);
}
/**
* 返回设计器能打开的模板类型的一个数组列表
*
* @return 可以打开的模板类型的数组
*/
public App<?>[] apps4TemplateOpener() {
return new App[0];
}
protected WidgetOption[] options4Show() {
ChartInternationalNameContentBean[] typeName = ChartTypeManager.getInstance().getAllChartBaseNames();
ChartWidgetOption[] child = new ChartWidgetOption[typeName.length];
for (int i = 0; i < typeName.length; i++) {
String plotID = typeName[i].getPlotID();
Chart[] rowChart = ChartTypeManager.getInstance().getChartTypes(plotID);
if(rowChart == null) {
continue;
}
String iconPath = ChartTypeInterfaceManager.getInstance().getIconPath(plotID);
Icon icon = IOUtils.readIcon(iconPath);
child[i] = new ChartWidgetOption(Inter.getLocText(typeName[i].getName()), icon, ChartEditor.class, rowChart[0]);
}
return child;
}
public String getInterNationalName() {
return Inter.getLocText("FR-Chart-Design_ChartModule");
}
} |
||||
package com.fr.design.module;
import com.fr.chart.base.ChartInternationalNameContentBean;
import com.fr.chart.chartattr.Chart;
import com.fr.chart.chartattr.ChartCollection;
import com.fr.chart.charttypes.ChartTypeManager;
import com.fr.design.ChartTypeInterfaceManager;
import com.fr.design.actions.core.ActionFactory;
import com.fr.design.chart.ChartDialog;
import com.fr.design.chart.gui.ChartComponent;
import com.fr.design.chart.gui.ChartWidgetOption;
import com.fr.design.gui.core.WidgetOption;
import com.fr.design.mainframe.App;
import com.fr.design.mainframe.ChartPropertyPane;
import com.fr.form.ui.ChartEditor;
import com.fr.general.IOUtils;
import com.fr.general.Inter;
import com.fr.stable.bridge.StableFactory;
import com.fr.stable.plugin.ExtraChartDesignClassManagerProvider;
import javax.swing.*;
/**
* Created by IntelliJ IDEA.
* Author : Richer
* Version: 7.0.3
* Date: 13-7-8
* Time: 上午9:13
*/
public class ChartDesignerModule extends DesignModule {
public void start() {
super.start();
dealBeforeRegister();
register();
registerFloatEditor();
}
protected void dealBeforeRegister(){
StableFactory.registerMarkedClass(ExtraChartDesignClassManagerProvider.XML_TAG, ChartTypeInterfaceManager.class);
StableFactory.getStaticMarkedInstanceObjectFromClass(ExtraChartDesignClassManagerProvider.XML_TAG, ExtraChartDesignClassManagerProvider.class);
}
private void register(){
DesignModuleFactory.registerHyperlinkGroupType(new ChartHyperlinkGroup());
DesignModuleFactory.registerChartEditorClass(ChartEditor.class);
DesignModuleFactory.registerChartComponentClass(ChartComponent.class);
DesignModuleFactory.registerChartDialogClass(ChartDialog.class);
DesignModuleFactory.registerChartPropertyPaneClass(ChartPropertyPane.class);
ActionFactory.registerChartPreStyleAction(new ChartPreStyleAction());
}
protected void registerFloatEditor() {
ActionFactory.registerChartCollection(ChartCollection.class);
}
/**
* 返回设计器能打开的模板类型的一个数组列表
*
* @return 可以打开的模板类型的数组
*/
public App<?>[] apps4TemplateOpener() {
return new App[0];
}
protected WidgetOption[] options4Show() {
ChartInternationalNameContentBean[] typeName = ChartTypeManager.getInstance().getAllChartBaseNames();
ChartWidgetOption[] child = new ChartWidgetOption[typeName.length];
for (int i = 0; i < typeName.length; i++) {
String plotID = typeName[i].getPlotID();
Chart[] rowChart = ChartTypeManager.getInstance().getChartTypes(plotID);
if(rowChart == null) {
continue;
}
String iconPath = ChartTypeInterfaceManager.getInstance().getIconPath(plotID);
Icon icon = IOUtils.readIcon(iconPath);
child[i] = new ChartWidgetOption(Inter.getLocText(typeName[i].getName()), icon, ChartEditor.class, rowChart[0]);
}
return child;
}
public String getInterNationalName() {
return Inter.getLocText("FR-Chart-Design_ChartModule");
}
} |
@ -1,95 +0,0 @@
|
||||
/* |
||||
* Copyright (c) 2001-2014,FineReport Inc, All Rights Reserved. |
||||
*/ |
||||
|
||||
package com.fr.design.module; |
||||
|
||||
import com.fr.base.BaseUtils; |
||||
import com.fr.base.FRContext; |
||||
import com.fr.base.io.XMLEncryptUtils; |
||||
import com.fr.chart.base.ChartInternationalNameContentBean; |
||||
import com.fr.chart.chartattr.Chart; |
||||
import com.fr.chart.charttypes.ChartTypeManager; |
||||
import com.fr.chart.module.ChartModule; |
||||
import com.fr.design.DesignerEnvManager; |
||||
import com.fr.design.chart.gui.ChartWidgetOption; |
||||
import com.fr.design.gui.core.WidgetOption; |
||||
import com.fr.design.mainframe.*; |
||||
import com.fr.file.FILE; |
||||
import com.fr.form.ui.ChartBook; |
||||
import com.fr.form.ui.ChartEditor; |
||||
import com.fr.general.Inter; |
||||
import com.fr.general.ModuleContext; |
||||
|
||||
/** |
||||
* Created by IntelliJ IDEA. |
||||
* Author : daisy |
||||
* Version: 6.5.6 |
||||
* Date: 14-10-13 |
||||
* Time: 下午2:56 |
||||
*/ |
||||
public class ChartStartModule extends ChartDesignerModule { |
||||
|
||||
protected void dealBeforeRegister(){ |
||||
ModuleContext.startModule(ChartModule.class.getName()); |
||||
} |
||||
|
||||
protected void registerFloatEditor() { |
||||
|
||||
} |
||||
|
||||
protected WidgetOption[] options4Show() { |
||||
ChartInternationalNameContentBean[] typeName = ChartTypeManager.getInstance().getAllChartBaseNames(); |
||||
ChartWidgetOption[] child = new ChartWidgetOption[typeName.length]; |
||||
for (int i = 0; i < typeName.length; i++) { |
||||
Chart[] rowChart = ChartTypeManager.getInstance().getChartTypes(typeName[i].getPlotID()); |
||||
child[i] = new ChartWidgetOption(Inter.getLocText(typeName[i].getName()), BaseUtils |
||||
.readIcon("com/fr/design/images/form/toolbar/" + typeName[i].getName() + ".png"), |
||||
ChartEditor.class, rowChart[0]); |
||||
} |
||||
return child; |
||||
} |
||||
|
||||
/** |
||||
* 应用打开器 |
||||
* @return 应用 |
||||
*/ |
||||
public App<?>[] apps4TemplateOpener() { |
||||
return new App[]{new AbstractAppProvider<ChartBook>() { |
||||
|
||||
@Override |
||||
public String[] defaultExtentions() { |
||||
return new String[]{"crt"}; |
||||
} |
||||
|
||||
@Override |
||||
public JTemplate<ChartBook, ?> openTemplate(FILE tplFile) { |
||||
return new JChart(asIOFile(tplFile), tplFile); |
||||
} |
||||
|
||||
@Override |
||||
public ChartBook asIOFile(FILE file) { |
||||
if (XMLEncryptUtils.isCptEncoded() && |
||||
!XMLEncryptUtils.checkVaild(DesignerEnvManager.getEnvManager().getEncryptionKey())) { |
||||
if (!new DecodeDialog(file).isPwdRight()) { |
||||
FRContext.getLogger().error(Inter.getLocText("FR-Chart-Password_Error")); |
||||
return new ChartBook(); |
||||
} |
||||
} |
||||
|
||||
|
||||
ChartBook tpl = new ChartBook(); |
||||
//打开通知
|
||||
FRContext.getLogger().info(Inter.getLocText(new String[]{"LOG-Is_Being_Openned", "LOG-Please_Wait"}, |
||||
new String[]{"\"" + file.getName() + "\"" + ",", "..."})); |
||||
try { |
||||
tpl.readStream(file.asInputStream()); |
||||
} catch (Exception exp) { |
||||
FRContext.getLogger().error("Failed to generate frm from " + file, exp); |
||||
return null; |
||||
} |
||||
return tpl; |
||||
} |
||||
}}; |
||||
} |
||||
} |
@ -1,18 +0,0 @@
|
||||
package com.fr.start; |
||||
|
||||
import java.awt.Image; |
||||
|
||||
import com.fr.base.BaseUtils; |
||||
|
||||
public class ChartSplashPane extends SplashPane{ |
||||
|
||||
/** |
||||
* 创建启动画面的背景图片 |
||||
* |
||||
* @return 背景图片 |
||||
* |
||||
*/ |
||||
public Image createSplashBackground() { |
||||
return BaseUtils.readImage("/com/fr/design/images/splash4Chart.png"); |
||||
} |
||||
} |
@ -1,406 +0,0 @@
|
||||
/* |
||||
* Copyright (c) 2001-2014,FineReport Inc, All Rights Reserved. |
||||
*/ |
||||
|
||||
package com.fr.start; |
||||
|
||||
import com.fr.base.BaseUtils; |
||||
import com.fr.base.FRContext; |
||||
import com.fr.design.DesignerEnvManager; |
||||
import com.fr.design.actions.file.WebPreviewUtils; |
||||
import com.fr.design.actions.help.AboutAction; |
||||
import com.fr.design.constants.UIConstants; |
||||
import com.fr.design.file.HistoryTemplateListPane; |
||||
import com.fr.design.file.MutilTempalteTabPane; |
||||
import com.fr.design.file.NewTemplatePane; |
||||
import com.fr.design.gui.ibutton.UIButton; |
||||
import com.fr.design.gui.itoolbar.UILargeToolbar; |
||||
import com.fr.design.mainframe.*; |
||||
import com.fr.design.mainframe.actions.*; |
||||
import com.fr.design.mainframe.toolbar.ToolBarMenuDockPlus; |
||||
import com.fr.design.menu.*; |
||||
import com.fr.design.module.ChartStartModule; |
||||
import com.fr.general.FRFont; |
||||
import com.fr.general.Inter; |
||||
import com.fr.general.web.ParameterConsts; |
||||
import com.fr.stable.Constants; |
||||
|
||||
import javax.swing.*; |
||||
import javax.swing.border.MatteBorder; |
||||
import java.awt.*; |
||||
import java.awt.event.ActionEvent; |
||||
import java.awt.event.ActionListener; |
||||
import java.awt.event.InputEvent; |
||||
import java.awt.event.KeyEvent; |
||||
import java.util.ArrayList; |
||||
|
||||
/** |
||||
* Created by IntelliJ IDEA. |
||||
* Author : daisy |
||||
* Version: 6.5.6 |
||||
* Date: 14-10-13 |
||||
* Time: 上午11:02 |
||||
*/ |
||||
public class Designer4Chart extends BaseDesigner { |
||||
private static final int TOOLBAR_HEIGHT = 53; |
||||
private static final int TOOLBAR_WIDTH =60+34+7+1+7 ; |
||||
private static final int GAP = 7; |
||||
private static final int EAST_WIDTH = 292; |
||||
private static final int MESSAGEPORT = 51460; |
||||
private UIButton saveButton; |
||||
private UIButton undo; |
||||
private UIButton redo; |
||||
private UIButton run; |
||||
private UIButton copy; |
||||
|
||||
/** |
||||
* 主函数 |
||||
* |
||||
* @param args 入口参数 |
||||
*/ |
||||
public static void main(String[] args) { |
||||
new Designer4Chart(args); |
||||
} |
||||
|
||||
public Designer4Chart(String[] args) { |
||||
super(args); |
||||
} |
||||
|
||||
@Override |
||||
protected String module2Start() { |
||||
EastRegionContainerPane.getInstance().setDownPaneVisible(false); |
||||
EastRegionContainerPane.getInstance().setContainerWidth(EAST_WIDTH); |
||||
return ChartStartModule.class.getName(); |
||||
} |
||||
|
||||
protected void initLanguage() { |
||||
//这两句的位置不能随便调换,因为会影响语言切换的问题
|
||||
FRContext.setLanguage(Constants.LANGUAGE_ENGLISH); |
||||
} |
||||
|
||||
protected void initDefaultFont(){ |
||||
FRContext.getDefaultValues().setFRFont(FRFont.getInstance("Meiryo", Font.PLAIN, 9)); |
||||
} |
||||
|
||||
/** |
||||
* build得路径 |
||||
* @return build得路径 |
||||
*/ |
||||
public String buildPropertiesPath() { |
||||
return "/com/fr/chart/base/build.properties"; |
||||
} |
||||
|
||||
/** |
||||
* 创建文件菜单项 |
||||
* @return 菜单项 |
||||
*/ |
||||
public ShortCut[] createNewFileShortCuts() { |
||||
ArrayList<ShortCut> shortCuts = new ArrayList<ShortCut>(); |
||||
shortCuts.add(new NewChartAction()); |
||||
return shortCuts.toArray(new ShortCut[shortCuts.size()]); |
||||
} |
||||
|
||||
/** |
||||
* 创建新模版 |
||||
* @return 模版 |
||||
*/ |
||||
public JTemplate<?, ?> createNewTemplate() { |
||||
return new JChart(); |
||||
} |
||||
|
||||
protected void resetToolTips(){ |
||||
copy.setToolTipText(Inter.getLocText("FR-Chart-Action_Copy")+"JS"); |
||||
run.setToolTipText(PREVIEW.getMenuKeySetName()); |
||||
} |
||||
|
||||
/** |
||||
* 创建设计器上几个比较大的图标:新建cpt,保存,前进,后退,运行。 |
||||
* |
||||
* @return 返回大图标对应的工具栏 |
||||
*/ |
||||
public UILargeToolbar createLargeToolbar() { |
||||
|
||||
UILargeToolbar largeToolbar = new UILargeToolbar(FlowLayout.LEFT){ |
||||
public Dimension getPreferredSize() { |
||||
return new Dimension(TOOLBAR_WIDTH ,TOOLBAR_HEIGHT); |
||||
} |
||||
}; |
||||
largeToolbar.setLayout(new FlowLayout(FlowLayout.CENTER, 0, 4)); |
||||
largeToolbar.add(new JPanel() { |
||||
public Dimension getPreferredSize() { |
||||
Dimension dim = super.getPreferredSize(); |
||||
dim.width = 1; |
||||
return dim; |
||||
} |
||||
}); |
||||
createRunButton(); |
||||
largeToolbar.add(run); |
||||
largeToolbar.add(new JPanel() { |
||||
public Dimension getPreferredSize() { |
||||
Dimension dim = super.getPreferredSize(); |
||||
dim.width = GAP; |
||||
return dim; |
||||
} |
||||
}); |
||||
largeToolbar.addSeparator(new Dimension(2, 42)); |
||||
largeToolbar.add(new JPanel() { |
||||
public Dimension getPreferredSize() { |
||||
Dimension dim = super.getPreferredSize(); |
||||
dim.width = GAP; |
||||
return dim; |
||||
} |
||||
}); |
||||
createCopyButton(); |
||||
largeToolbar.add(copy); |
||||
largeToolbar.add(new JPanel() { |
||||
public Dimension getPreferredSize() { |
||||
Dimension dim = super.getPreferredSize(); |
||||
dim.width = GAP; |
||||
return dim; |
||||
} |
||||
}); |
||||
largeToolbar.addSeparator(new Dimension(2, 42)); |
||||
|
||||
largeToolbar.setBorder(new MatteBorder(new Insets(0, 0, 1, 0), UIConstants.LINE_COLOR)); |
||||
return largeToolbar; |
||||
} |
||||
|
||||
protected int getStartPort(){ |
||||
return MESSAGEPORT; |
||||
} |
||||
|
||||
protected DesignerFrame createDesignerFrame(){ |
||||
|
||||
return new DesignerFrame4Chart(this); |
||||
} |
||||
|
||||
/** |
||||
* 创建上面一排的工具栏按钮 |
||||
* |
||||
* @return 按钮 |
||||
*/ |
||||
public UIButton[] createUp() { |
||||
return new UIButton[]{createSaveButton(), createUndoButton(), createRedoButton()}; |
||||
} |
||||
|
||||
private UIButton createRunButton() { |
||||
run = new UIButton(BaseUtils.readIcon("com/fr/design/images/buttonicon/pageb24.png")) { |
||||
public Dimension getPreferredSize() { |
||||
return new Dimension(34, 43); |
||||
} |
||||
}; |
||||
run.setToolTipText(PREVIEW.getMenuKeySetName()); |
||||
run.set4ChartLargeToolButton(); |
||||
run.addActionListener(new ActionListener() { |
||||
@Override |
||||
public void actionPerformed(ActionEvent e) { |
||||
JTemplate<?, ?> jt = HistoryTemplateListPane.getInstance().getCurrentEditingTemplate(); |
||||
if (jt == null) { |
||||
return; |
||||
} |
||||
onChartPreview(jt); |
||||
} |
||||
}); |
||||
return run; |
||||
} |
||||
|
||||
public static void onChartPreview(JTemplate<?, ?> jt) { |
||||
WebPreviewUtils.actionPerformed(jt, null, ParameterConsts.CHARTLET); |
||||
} |
||||
|
||||
public static final MenuKeySet PREVIEW = new MenuKeySet() { |
||||
@Override |
||||
public char getMnemonic() { |
||||
return 'P'; |
||||
} |
||||
|
||||
@Override |
||||
public String getMenuName() { |
||||
return Inter.getLocText("FR-Chart-Template_Preview"); |
||||
} |
||||
|
||||
@Override |
||||
public KeyStroke getKeyStroke() { |
||||
return KeyStroke.getKeyStroke(KeyEvent.VK_P, InputEvent.CTRL_MASK); |
||||
} |
||||
}; |
||||
|
||||
|
||||
private UIButton createCopyButton(){ |
||||
copy = new UIButton(BaseUtils.readIcon("com/fr/design/images/copyjs.png")) { |
||||
public Dimension getPreferredSize() { |
||||
return new Dimension(34, 43); |
||||
} |
||||
}; |
||||
copy.setToolTipText(Inter.getLocText("FR-Chart-Action_Copy")+"JS"); |
||||
copy.set4ChartLargeToolButton(); |
||||
copy.addActionListener(new ActionListener() { |
||||
@Override |
||||
public void actionPerformed(ActionEvent e) { |
||||
JTemplate<?, ?> jt = HistoryTemplateListPane.getInstance().getCurrentEditingTemplate(); |
||||
if (jt == null) { |
||||
return; |
||||
} |
||||
DesignerContext.getDesignerFrame().refreshToolbar(); |
||||
|
||||
jt.stopEditing(); |
||||
if (!jt.isSaved() && !jt.saveTemplate2Env()) { |
||||
return; |
||||
} |
||||
//复制代码
|
||||
jt.copyJS(); |
||||
} |
||||
}); |
||||
return copy; |
||||
} |
||||
|
||||
private UIButton createSaveButton() { |
||||
saveButton = new UIButton(BaseUtils.readIcon("/com/fr/design/images/buttonicon/save.png")); |
||||
saveButton.setToolTipText(KeySetUtils.SAVE_TEMPLATE.getMenuKeySetName()); |
||||
saveButton.set4ToolbarButton(); |
||||
saveButton.addActionListener(new ActionListener() { |
||||
@Override |
||||
public void actionPerformed(ActionEvent e) { |
||||
JTemplate<?, ?> jt = HistoryTemplateListPane.getInstance().getCurrentEditingTemplate(); |
||||
jt.stopEditing(); |
||||
jt.saveTemplate(); |
||||
jt.requestFocus(); |
||||
} |
||||
}); |
||||
return saveButton; |
||||
} |
||||
|
||||
private UIButton createUndoButton() { |
||||
undo = new UIButton(BaseUtils.readIcon("/com/fr/design/images/buttonicon/undo.png")); |
||||
undo.setToolTipText(KeySetUtils.UNDO.getMenuKeySetName()); |
||||
undo.set4ToolbarButton(); |
||||
undo.addActionListener(new ActionListener() { |
||||
@Override |
||||
public void actionPerformed(ActionEvent e) { |
||||
JTemplate<?, ?> jt = HistoryTemplateListPane.getInstance().getCurrentEditingTemplate(); |
||||
if (jt != null) { |
||||
jt.undo(); |
||||
} |
||||
} |
||||
}); |
||||
return undo; |
||||
} |
||||
|
||||
private UIButton createRedoButton() { |
||||
redo = new UIButton(BaseUtils.readIcon("/com/fr/design/images/buttonicon/redo.png")); |
||||
redo.setToolTipText(KeySetUtils.REDO.getMenuKeySetName()); |
||||
redo.set4ToolbarButton(); |
||||
redo.addActionListener(new ActionListener() { |
||||
@Override |
||||
public void actionPerformed(ActionEvent e) { |
||||
JTemplate<?, ?> jt = HistoryTemplateListPane.getInstance().getCurrentEditingTemplate(); |
||||
if (jt != null) { |
||||
jt.redo(); |
||||
} |
||||
} |
||||
}); |
||||
return redo; |
||||
} |
||||
|
||||
/** |
||||
* 重置工具条 |
||||
* @param toolbarComponent 工具栏 |
||||
* @param plus 对象 |
||||
* @return 工具条对象 |
||||
*/ |
||||
public JComponent resetToolBar(JComponent toolbarComponent, ToolBarMenuDockPlus plus) { |
||||
return plus.toolBar4Authority(); |
||||
} |
||||
|
||||
public NewTemplatePane getNewTemplatePane(){ |
||||
return new NewTemplatePane() { |
||||
@Override |
||||
public Icon getNew() { |
||||
return BaseUtils.readIcon("/com/fr/design/images/newchart_normal.png"); |
||||
} |
||||
|
||||
@Override |
||||
public Icon getMouseOverNew() { |
||||
return BaseUtils.readIcon("/com/fr/design/images/newchart_over.png"); |
||||
} |
||||
|
||||
@Override |
||||
public Icon getMousePressNew() { |
||||
return BaseUtils.readIcon("/com/fr/design/images/newchart_press.png"); |
||||
} |
||||
}; |
||||
}; |
||||
|
||||
@Override |
||||
protected void refreshLargeToolbarState() { |
||||
JTemplate<?, ?> jt = HistoryTemplateListPane.getInstance().getCurrentEditingTemplate(); |
||||
if (jt == null) { |
||||
return; |
||||
} |
||||
saveButton.setEnabled(!jt.isSaved()); |
||||
MutilTempalteTabPane.getInstance().refreshOpenedTemplate(HistoryTemplateListPane.getInstance().getHistoryList()); |
||||
MutilTempalteTabPane.getInstance().repaint(); |
||||
if (DesignerEnvManager.getEnvManager().isSupportUndo()) { |
||||
undo.setEnabled(jt.canUndo()); |
||||
redo.setEnabled(jt.canRedo()); |
||||
} else { |
||||
undo.setEnabled(false); |
||||
redo.setEnabled(false); |
||||
} |
||||
} |
||||
|
||||
protected SplashPane createSplashPane() { |
||||
return new ChartSplashPane(); |
||||
} |
||||
|
||||
/** |
||||
*更新工具栏 |
||||
*/ |
||||
public void updateToolBarDef() { |
||||
refreshLargeToolbarState(); |
||||
} |
||||
|
||||
protected void addCloseCurrentTemplateAction(MenuDef menuDef) { |
||||
|
||||
} |
||||
|
||||
protected void addPreferenceAction(MenuDef menuDef) { |
||||
|
||||
} |
||||
|
||||
protected void addSwitchExistEnvAction(MenuDef menuDef) { |
||||
|
||||
} |
||||
|
||||
@Override |
||||
public MenuDef[] createTemplateShortCuts(ToolBarMenuDockPlus plus) { |
||||
MenuDef menuDef = new MenuDef(KeySetUtils.EXPORT_CHART.getMenuKeySetName(), KeySetUtils.EXPORT_CHART.getMnemonic()); |
||||
menuDef.addShortCut(plus.shortcut4ExportMenu()); |
||||
return new MenuDef[] {menuDef}; |
||||
} |
||||
|
||||
/** |
||||
* 创建帮助菜单得菜单项 |
||||
* @return 菜单项 |
||||
*/ |
||||
public ShortCut[] createHelpShortCuts() { |
||||
resetToolTips(); |
||||
return new ShortCut[]{ |
||||
new ChartWebAction(), |
||||
SeparatorDef.DEFAULT, |
||||
new ChartFeedBackAciton(), |
||||
SeparatorDef.DEFAULT, |
||||
new UpdateOnlineAction(), |
||||
new AboutAction() |
||||
}; |
||||
} |
||||
|
||||
protected ShortCut openTemplateAction(){ |
||||
return new OpenChartAction(); |
||||
} |
||||
|
||||
protected String[] startFileSuffix(){ |
||||
return new String[]{".crt"}; |
||||
} |
||||
|
||||
} |
Loading…
Reference in new issue