帆软报表设计器源代码。
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 

256 lines
9.4 KiB

package com.fr.design.mainframe;
import com.fr.base.FRContext;
import com.fr.base.ScreenResolution;
import com.fr.common.inputevent.InputEventBaseOnOS;
import com.fr.design.designer.EditingState;
import com.fr.design.event.TargetModifiedListener;
import com.fr.design.file.HistoryTemplateListPane;
import com.fr.design.gui.icontainer.UIModeControlContainer;
import com.fr.design.gui.ispinner.UIBasicSpinner;
import com.fr.design.layout.FRGUIPaneFactory;
import com.fr.general.Inter;
import com.fr.grid.Grid;
import com.fr.main.impl.WorkBook;
import com.fr.poly.PolyDesigner;
import com.fr.report.report.TemplateReport;
import javax.swing.*;
import javax.swing.event.ChangeEvent;
import javax.swing.event.ChangeListener;
import java.awt.*;
import java.awt.event.*;
import java.util.ArrayList;
/**
* 整个报表编辑区域 包括滚动条、中间的grid或者聚合块、下面的sheetTab
*
* @editor zhou
* @since 2012-3-27下午12:12:05
*/
public class ReportComponentComposite extends JComponent {
private static final int MAX = 400;
private static final int HUND = 100;
private static final int MIN = 10;
private JWorkBook parent;
private UIModeControlContainer parentContainer = null;
protected ReportComponentCardPane centerCardPane;
private JPanel CellElementRegion;
private java.util.List<EditingState> templateStateList = new ArrayList<EditingState>();
private SheetNameTabPane sheetNameTab;
private JPanel hbarContainer;
private JSliderPane jSliderContainer;
/**
* Constructor with workbook..
*/
public ReportComponentComposite(JWorkBook jwb) {
setFocusable(true);
setFocusTraversalKeysEnabled(false);
this.parent = jwb;
this.setLayout(FRGUIPaneFactory.createBorderLayout());
this.add(centerCardPane = new ReportComponentCardPane(), BorderLayout.CENTER);
sheetNameTab = jwb.createSheetNameTabPane(this);
sheetNameTab.setSelectedIndex(0);
CellElementRegion = FRGUIPaneFactory.createBorderLayout_S_Pane();
this.add(CellElementRegion, BorderLayout.NORTH);
this.add(createSouthControlPane(), BorderLayout.SOUTH);
jSliderContainer.getShowVal().addChangeListener(showValSpinnerChangeListener);
jSliderContainer.getSelfAdaptButton().addItemListener(selfAdaptButtonItemListener);
}
MouseWheelListener showValSpinnerMouseWheelListener = new MouseWheelListener() {
@Override
public void mouseWheelMoved(MouseWheelEvent e) {
if (InputEventBaseOnOS.isControlDown(e)) {
int dir = e.getWheelRotation();
int old_resolution = (int) jSliderContainer.getShowVal().getValue();
jSliderContainer.getShowVal().setValue(old_resolution - (dir * MIN));
}
}
};
ChangeListener showValSpinnerChangeListener = new ChangeListener() {
@Override
public void stateChanged(ChangeEvent e) {
double value = (int) ((UIBasicSpinner) e.getSource()).getValue();
value = value > MAX ? MAX : value;
value = value < MIN ? MIN : value;
int resolution = (int) (ScreenResolution.getScreenResolution() * value / HUND);
HistoryTemplateListPane.getInstance().getCurrentEditingTemplate().setScale(resolution);
}
};
ItemListener selfAdaptButtonItemListener = new ItemListener() {
@Override
public void itemStateChanged(ItemEvent e) {
if (jSliderContainer.getSelfAdaptButton().isSelected()) {
int resolution = HistoryTemplateListPane.getInstance().getCurrentEditingTemplate().selfAdaptUpdate();
jSliderContainer.getShowVal().setValue(resolution * HUND / ScreenResolution.getScreenResolution());
}
}
};
protected void doBeforeChange(int oldIndex) {
if (oldIndex >= 0) {
templateStateList.set(oldIndex, centerCardPane.editingComponet.createEditingState());
}
}
protected void doAfterChange(int newIndex) {
WorkBook workbook = getEditingWorkBook();
if (workbook == null) {
FRContext.getLogger().error(Inter.getLocText("FR-Designer_Read_failure") + "!");
//AUGUST:加个报错,不然测试总是SB的认为打不开一个坏的excel文件就是BUG,也不知道去检查下源文件。
return;
}
centerCardPane.populate(workbook.getTemplateReport(newIndex));
if (parentContainer != null) {
parentContainer.setDownPane(ReportComponentComposite.this);
}
if (templateStateList.size() > newIndex) {
EditingState reportPaneEditState = templateStateList.get(newIndex);
if (reportPaneEditState != null) {
reportPaneEditState.revert();
updateJSlider();
}
} else {
while (templateStateList.size() <= newIndex) {
templateStateList.add(null);
}
centerCardPane.editingComponet.setSelection(centerCardPane.editingComponet.getDefaultSelectElement());
if (jSliderContainer != null){
jSliderContainer.reset();
}
}
if (centerCardPane.editingComponet.elementCasePane == null) {
centerCardPane.getPolyDezi().polyArea.addMouseWheelListener(showValSpinnerMouseWheelListener);
return;
}
Grid grid = centerCardPane.editingComponet.elementCasePane.getGrid();
this.centerCardPane.editingComponet.elementCasePane.getGrid().addMouseWheelListener(showValSpinnerMouseWheelListener);
if (!grid.hasFocus() && grid.isRequestFocusEnabled()) {
grid.requestFocus();
}
}
private void updateJSlider(){
if (centerCardPane.editingComponet.elementCasePane == null) {
jSliderContainer.getShowVal().setValue(centerCardPane.getPolyDezi().getResolution() * HUND / ScreenResolution.getScreenResolution());
}else {
jSliderContainer.getShowVal().setValue(centerCardPane.editingComponet.elementCasePane.getResolution() * HUND / ScreenResolution.getScreenResolution());
}
}
/**
* 移除选中状态
*
* @date 2015-2-5-上午11:41:44
*/
public void removeSelection() {
if (centerCardPane.editingComponet instanceof WorkSheetDesigner) {
((WorkSheetDesigner) centerCardPane.editingComponet).removeSelection();
} else {
centerCardPane.populate(centerCardPane.editingComponet.getTemplateReport());
}
}
public TemplateReport getEditingTemplateReport() {
return centerCardPane.editingComponet.getTemplateReport();
}
public int getEditingIndex() {
return sheetNameTab.getSelectedIndex();
}
public JSliderPane getjSliderContainer() {
return this.jSliderContainer;
}
public void setParentContainer(UIModeControlContainer parentContainer) {
this.parentContainer = parentContainer;
}
public void setComponents() {
CellElementRegion.removeAll();
hbarContainer.removeAll();
hbarContainer.add(centerCardPane.editingComponet.getHorizontalScrollBar());
centerCardPane.editingComponet.getHorizontalScrollBar().setValue(centerCardPane.editingComponet.getHorizontalScrollBar().getValue());
centerCardPane.editingComponet.getVerticalScrollBar().setValue(centerCardPane.editingComponet.getVerticalScrollBar().getValue());
this.doLayout();
}
public int getSelectedIndex() {
return sheetNameTab.getSelectedIndex();
}
protected ReportComponent getEditingReportComponent() {
return this.centerCardPane.editingComponet;
}
protected WorkBook getEditingWorkBook() {
return this.parent.getTarget();
}
/**
* 添加目标改变的监听
*
* @param targetModifiedListener 对象修改监听器
*/
public void addTargetModifiedListener(TargetModifiedListener targetModifiedListener) {
this.centerCardPane.addTargetModifiedListener(targetModifiedListener);
}
private JComponent createSouthControlPane() {
hbarContainer = FRGUIPaneFactory.createBorderLayout_S_Pane();
hbarContainer.add(centerCardPane.editingComponet.getHorizontalScrollBar());
JPanel southPane = new JPanel(new BorderLayout());
jSliderContainer = JSliderPane.getInstance();
southPane.add(hbarContainer, BorderLayout.NORTH);
southPane.add(sheetNameTab, BorderLayout.CENTER);
southPane.add(jSliderContainer, BorderLayout.EAST);
return southPane;
}
public void setSelectedIndex(int selectedIndex) {
sheetNameTab.setSelectedIndex(selectedIndex);
centerCardPane.populate(getEditingWorkBook().getTemplateReport(selectedIndex));
}
/**
* 停止编辑
*/
public void stopEditing() {
centerCardPane.stopEditing();
}
public void setComposite() {
DesignerContext.getDesignerFrame().resetToolkitByPlus(parent);
parent.setComposite();
this.validate();
this.repaint(40);
}
/**
* 模板更新
*/
public void fireTargetModified() {
parent.fireTargetModified();
}
}