帆软报表设计器源代码。
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.
 
 
 
 

949 lines
34 KiB

package com.fr.design.mainframe;
import com.fine.theme.icon.LazyIcon;
import com.fine.theme.utils.FineUIStyle;
import com.fine.theme.utils.FineUIUtils;
import com.formdev.flatlaf.ui.FlatUIUtils;
import com.fr.base.GraphHelper;
import com.fr.base.svg.IconUtils;
import com.fr.base.theme.ReportTheme;
import com.fr.base.theme.TemplateTheme;
import com.fr.base.theme.TemplateThemeCompatible;
import com.fr.base.vcs.DesignerMode;
import com.fr.design.actions.UpdateAction;
import com.fr.design.constants.UIConstants;
import com.fr.design.dialog.FineJOptionPane;
import com.fr.design.event.RemoveListener;
import com.fr.design.file.HistoryTemplateListCache;
import com.fr.design.gui.ibutton.UIButton;
import com.fr.design.menu.MenuDef;
import com.fr.design.menu.SeparatorDef;
import com.fr.design.roleAuthority.ReportAndFSManagePane;
import com.fr.design.roleAuthority.RolesAlreadyEditedPane;
import com.fr.design.utils.gui.GUICoreUtils;
import com.fr.general.ComparatorUtils;
import com.fr.main.impl.WorkBook;
import com.fr.poly.PolyDesigner;
import com.fr.report.poly.PolyWorkSheet;
import com.fr.report.report.TemplateReport;
import com.fr.report.worksheet.WorkSheet;
import javax.swing.Icon;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JPopupMenu;
import javax.swing.SwingUtilities;
import javax.swing.UIManager;
import java.awt.BasicStroke;
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.FontMetrics;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Point;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.ComponentAdapter;
import java.awt.event.ComponentEvent;
import java.awt.event.ComponentListener;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.awt.event.MouseMotionListener;
import java.awt.geom.Path2D;
import java.awt.geom.RoundRectangle2D;
import java.util.ArrayList;
import java.util.List;
import static com.fine.theme.utils.FineUIScale.scale;
import static com.fine.theme.utils.FineUIStyle.LIGHT_GREY;
/**
* NameTabPane of sheets
*
* @author zhou
* @since 11.0
* Created on 2012-3-26
*/
public class SheetNameTabPane extends JPanel implements MouseListener, MouseMotionListener, RemoveListener {
private Color borderColor = UIManager.getColor("Center.ZoneBorderColor");
private Color backgroundColor = UIManager.getColor("Center.OuterShadowColor");
private Color selectedColor = UIManager.getColor("South.SheetSelectedColor");
private Color fontColor = UIManager.getColor("DarkenedFontColor");
private static final Icon ADD_WORK_SHEET = new LazyIcon("add_worksheet");
protected static final Icon ADD_POLY_SHEET = new LazyIcon("add_polysheet");
// TODO: 视觉未提供
private static final Icon LEFT_ICON = IconUtils.readIcon("/com/fr/design/standard/prepage/pre_page");
private static final Icon RIGHT_ICON = IconUtils.readIcon("/com/fr/design/standard/nextpage/next_page");
private static final Icon DISABLED_LEFT_ICON = IconUtils.readIcon("/com/fr/design/standard/prepage/pre_page_disabled.svg");
private static final Icon DISABLED_RIGHT_ICON = IconUtils.readIcon("/com/fr/design/standard/nextpage/next_page_disabled.svg");
private static final int NUM = 10;
private static final int GRID_TOSHEET_RIGHT = 20; // 添加grid按钮右侧距sheet面板右侧的距离
private static final int POLY_TOSHEET_LEFT = 30; // 添加poly按钮左侧距sheet面板右侧的距离
private static final int POLY_TOSHEET_RIGHT = 50; // 添加poly按钮右侧距sheet面板右侧的距离
private int iconSepDistance = UIManager.getInt("South.SheetIconSepDistance");
private int sheetIconGap = UIManager.getInt("South.SheetIconGap"); // 每个sheet图标之间的距离
private int toolbarHeight = UIManager.getInt("South.SheetBarHeight");
private int addWidthBySheetname = UIManager.getInt("South.SheetAddWidth"); //sheet名字的文本到图标边框的距离
private int tabButtonGap = UIManager.getInt("South.SheetTabButtonGap"); // 两个添加按钮与其他组件预留的间隔
private int sheetTabRadius = UIManager.getInt("South.SheetTabRadius"); // sheet标签栏圆角属性
/**
* 左移和右移按钮
*/
private UIButton leftButton;
private UIButton rightButton;
/**
* 鼠标按下时的坐标数组、鼠标放开时的坐标数组
*/
private int[] xyPressedCoordinate = {0, 0};
private int[] xyReleasedCoordinate = {0, 0};
/**
* 保存每个workSheet的宽度.
*/
private int[] widthArray;
/**
* 这个数组用来记录鼠标drag过的区域里面的点.
*/
private List<Point> lineArray = new ArrayList<Point>();
/**
* 鼠标是否已经释放
*/
private boolean isReleased = false;
/**
* 是否越界
*/
private boolean isOvertakeWidth = false;
/**
* 能显示的tab个数
*/
private int showCount = 0;
/**
* 两个添加图标的位置。
*/
protected int iconLocation;
/**
* august: 当sheet的数量过多了,scrollIndex就有用了,用来表示最左边的sheet的Index
*/
private int scrollIndex = 0;
/**
* 当超过最大宽度时,最右边的sheet的index
*/
private int lastOneIndex;
/**
* 编辑的对象实例
*/
private ReportComponentComposite reportComposite;
private int selectedIndex = -1;
private JPanel buttonPane;
private boolean isAuthorityEditing = false;
private ComponentListener listener;
private DesignerFrame designerFrame;
public SheetNameTabPane(ReportComponentComposite reportCompositeX) {
this.reportComposite = reportCompositeX;
this.setLayout(new BorderLayout(0, 0));
this.addMouseListener(this);
this.addMouseMotionListener(this);
this.setBorder(null);
this.setForeground(fontColor);
FineUIStyle.setStyle(this, LIGHT_GREY);
leftButton = new UIButton(LEFT_ICON) {
@Override
public Dimension getPreferredSize() {
return new Dimension(super.getPreferredSize().width, toolbarHeight);
}
};
leftButton.set4ToolbarButton();
leftButton.setDisabledIcon(DISABLED_LEFT_ICON);
rightButton = new UIButton(RIGHT_ICON) {
@Override
public Dimension getPreferredSize() {
return new Dimension(super.getPreferredSize().width, toolbarHeight);
}
};
rightButton.set4ToolbarButton();
rightButton.setDisabledIcon(DISABLED_RIGHT_ICON);
buttonPane = new JPanel(new BorderLayout(3, 0));
buttonPane.add(rightButton, BorderLayout.EAST);
buttonPane.add(leftButton, BorderLayout.CENTER);
this.add(buttonPane, BorderLayout.EAST);
leftButton.addActionListener(createLeftButtonActionListener());
rightButton.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
int reportCount = reportComposite.getEditingWorkBook().getReportCount();
if (selectedIndex <= (reportCount - 1) && scrollIndex < reportCount - showCount) {
scrollIndex = Math.min((showCount == 0 ? 1 : showCount) + scrollIndex, reportCount - showCount - 1);
repaint();
}
}
});
listener = new ComponentAdapter(){
@Override public void componentResized(ComponentEvent e) {
for (int i = 0; i < lastOneIndex * NUM; i++) {
moveLeft();
}
}
};
designerFrame = DesignerContext.getDesignerFrame();
designerFrame.addComponentListener(listener);
}
@Override
public void doRemoveAction() {
designerFrame.removeComponentListener(listener);
}
private ActionListener createLeftButtonActionListener() {
return new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
moveLeft();
}
};
}
private void moveLeft() {
int s = scrollIndex;
if (s == lastOneIndex && s != 0) {
scrollIndex--;
lastOneIndex--;
repaint();
} else {
while (s > lastOneIndex && showCount != 0) {
scrollIndex++;
lastOneIndex++;
repaint();
}
while (s < lastOneIndex && scrollIndex > 0) {
scrollIndex--;
lastOneIndex--;
repaint();
}
}
}
/**
* 设置选择index
*
* @param newIndex
*/
public void setSelectedIndex(int newIndex) {
doBeforeChange(selectedIndex);
selectedIndex = newIndex;
doAfterChange(newIndex);
}
/**
* 在权限细粒度状态下,点击sheet,进入编辑sheet可见不可见状态
*/
private void doWithAuthority() {
AuthoritySheetEditedPane sheetEditedPane = new AuthoritySheetEditedPane(reportComposite.getEditingWorkBook(), selectedIndex);
sheetEditedPane.populate();
EastRegionContainerPane.getInstance().switchMode(EastRegionContainerPane.PropertyMode.AUTHORITY_EDITION);
EastRegionContainerPane.getInstance().replaceAuthorityEditionPane(sheetEditedPane);
EastRegionContainerPane.getInstance().replaceConfiguredRolesPane(RolesAlreadyEditedPane.getInstance());
}
/**
* /**
* selectedIndex 改变之前所做的事情
*
* @param oldIndex
*/
protected void doBeforeChange(int oldIndex) {
reportComposite.doBeforeChange(oldIndex);
}
/**
* selectedIndex 改变之后所做的事情
*
* @param newIndex
*/
protected void doAfterChange(int newIndex) {
reportComposite.doAfterChange(newIndex);
}
/**
* 得到选择的index
*
* @return
*/
public int getSelectedIndex() {
return selectedIndex;
}
/**
* 鼠标拖拽
*
* @param e 鼠标事件
*/
@Override
public void mouseDragged(MouseEvent e) {
if (isAuthorityEditing) {
return;
}
lineArray.add(e.getPoint());
repaint();
}
/**
* 鼠标移动
*
* @param e 鼠标事件
*/
@Override
public void mouseMoved(MouseEvent e) {
}
private void checkButton(boolean buttonEnabled) {
leftButton.setEnabled(buttonEnabled);
rightButton.setEnabled(buttonEnabled);
}
/**
* 抽出来方便OEM
* @return
*/
public Icon getAddWorkSheet(){
return ADD_WORK_SHEET;
}
/**
* 画Tab
*/
@Override
public void paintComponent(Graphics g) {
isAuthorityEditing = DesignerMode.isAuthorityEditing();
showCount = 0;
// 开始画那些Tab.
Graphics2D g2d = (Graphics2D) g;
FontMetrics fm = GraphHelper.getFontMetrics(this.getFont());
int charWidth = fm.charWidth('M');
int textAscent = fm.getAscent();
double textHeight = this.getSize().getHeight() - 1;
widthArray = calculateWidthArray();
int operationWidth = tabButtonGap + getAddWorkSheet().getIconWidth() + iconSepDistance + ADD_POLY_SHEET.getIconWidth();
double maxWidth = getWidth() - operationWidth - buttonPane.getWidth();// 最大宽度
paintBackgroundAndLine(g2d, textHeight, maxWidth, charWidth, textAscent);
checkButton(showCount < widthArray.length);
// richie:当linearray不为空时,说明有了鼠标拖动,下面画由于鼠标拖动产生的效果.
//REPORT-13572 点击切换会出现重影,保证:此时鼠标点击是没有放开的,才会绘制轨迹
if (!lineArray.isEmpty() && !isReleased) {
paintDragTab(g2d, textHeight, charWidth, textAscent);
}
// richie:鼠标松开时把drag的轨迹数组clear掉.
if (isReleased) {
lineArray.clear();
}
}
private void paintBackgroundAndLine(Graphics2D g2d, double textHeight, double maxWidth, int charWidth, int textAscent) {
int arc = FineUIUtils.getAndScaleInt("Center.arc", 10) / 2;
Path2D roundedPath = FineUIUtils.createPartRoundRectangle(0, 0, this.getWidth(), this.getHeight(), 0, 0, 0, arc);
FlatUIUtils.setRenderingHints(g2d);
g2d.setColor(getBackground());
g2d.fill(roundedPath);
showCount = 0;
int addIconlocation = 0;
WorkBook workBook = reportComposite.getEditingWorkBook();
int reportCount = workBook.getReportCount();
double textX = sheetIconGap;
for (int i = scrollIndex; i < reportCount; i++) {
lastOneIndex = i;
TemplateReport templateReport = workBook.getTemplateReport(i);
boolean isNeedPaintedAuthority = false;
if (isAuthorityEditing) {
String selectedRoles = ReportAndFSManagePane.getInstance().getRoleTree().getSelectedRoleName();
isNeedPaintedAuthority = templateReport.getWorkSheetPrivilegeControl().checkInvisible(selectedRoles);
}
String sheetName = workBook.getReportName(i);
boolean selected = i == selectedIndex;
paintTab(g2d, textHeight, textX, sheetName, charWidth, textAscent, i, isNeedPaintedAuthority, selected);
int width = widthArray[i];
textX += width + 1;
addIconlocation += width;
if (i < widthArray.length - 1 && textX + widthArray[i + 1] + 1 > maxWidth) {
isOvertakeWidth = true;
break;
} else {
showCount++;
isOvertakeWidth = false;
}
int count = (int) (maxWidth) / width;
if (i >= scrollIndex + count - 1) {
isOvertakeWidth = true;
}
}
// 画两个添加sheet图标
iconLocation = isOvertakeWidth ? (int) (maxWidth) : addIconlocation + tabButtonGap;
paintAddButton(g2d);
}
protected void paintAddButton(Graphics2D g2d){
getAddWorkSheet().paintIcon(this, g2d, iconLocation, 3);
ADD_POLY_SHEET.paintIcon(this, g2d, iconLocation + getAddWorkSheet().getIconWidth() + iconSepDistance, 3);
}
private void paintTab(Graphics2D g2d, double textHeight, double textX, String sheetName, int charWidth, int textAscent, int i, boolean isNeedPaintAuthority, boolean isSelected) {
Color backgroundColor = isSelected ? selectedColor : (isNeedPaintAuthority ? UIConstants.AUTHORITY_SHEET_UNSELECTED : getBackground());
g2d.setColor(backgroundColor);
// 绘制圆角矩形背景
if (isSelected) {
FlatUIUtils.setRenderingHints(g2d);
int width = widthArray[i];
int height = (int) textHeight + sheetTabRadius;
RoundRectangle2D.Double backgroundRect = new RoundRectangle2D.Double(textX, -10, width, height, sheetTabRadius, sheetTabRadius);
g2d.fill(backgroundRect);
g2d.setColor(borderColor);
g2d.setStroke(new BasicStroke(1));
g2d.draw(backgroundRect);
}
// 绘制文本
g2d.setColor(getForeground());
GraphHelper.drawString(g2d, sheetName, (int) textX + charWidth + 4, textAscent + 2);
}
/**
* 画拖拽的轨迹
*
* @param g2d
* @param textHeight
* @param charWidth
* @param textAscent
*/
private void paintDragTab(Graphics2D g2d, double textHeight, int charWidth, int textAscent) {
g2d.setPaint(UIManager.getColor("TabbedPane.darkShadow"));
Point lastPoint = lineArray.get(lineArray.size() - 1);
// richie:鼠标拖动开始时的x坐标
int startPointX = this.getPressedXY()[0];
// richie:当前选中的workSheet的宽度
int width = widthArray[selectedIndex];
int totalWidth = 0;
// richie:当前选中的workSheet之前的所有workSheets的总宽度
for (int i = 0; i < selectedIndex; i++) {
totalWidth += widthArray[i];
}
int distance = startPointX - totalWidth;
// peter:画字符
g2d.setPaint(getForeground());
// richie:把当前选中的workSheet的名字画到鼠标拖动产生的图形上.
g2d.drawString(reportComposite.getEditingWorkBook().getReportName(selectedIndex), (int) lastPoint.getX() - distance + charWidth, textAscent);
}
/**
* 根据名字和个数计算出所有tab的宽度
*
* @return
*/
private int[] calculateWidthArray() {
FontMetrics fm = GraphHelper.getFontMetrics(this.getFont());
int charWidth = fm.charWidth('M');
WorkBook workBook = reportComposite.getEditingWorkBook();
int reportCount = workBook.getReportCount();
int[] widthArray = new int[reportCount];
for (int i = 0; i < reportCount; i++) {
String sheetName = workBook.getReportName(i);
widthArray[i] = fm.stringWidth(sheetName) + charWidth * 2 - 1 + addWidthBySheetname;
}
return widthArray;
}
private int[] getPressedXY() {
return this.xyPressedCoordinate;
}
private void setPressedXY(int x, int y) {
this.xyPressedCoordinate[0] = x;
this.xyPressedCoordinate[1] = y;
}
private int[] getReleasedXY() {
return this.xyReleasedCoordinate;
}
private void setReleasedXY(int x, int y) {
this.xyReleasedCoordinate[0] = x;
this.xyReleasedCoordinate[1] = y;
}
/**
* 鼠标点击事件
*
* @param e 鼠标事件
*/
@Override
public void mouseClicked(MouseEvent e) {
}
/**
* 鼠标按下事件
*
* @param evt 鼠标事件
*/
@Override
public void mousePressed(MouseEvent evt) {
isReleased = false;
int reportcount = reportComposite.getEditingWorkBook().getReportCount();
if (scrollIndex < 0 || scrollIndex >= reportcount) {
return;
}
reportComposite.stopEditing();
int evtX = evt.getX();
int evtY = evt.getY();
this.setPressedXY(evtX, evtY);
boolean isBlank = true;
int textX = 0;
for (int i = scrollIndex; i <= lastOneIndex; i++) {
int textWidth = widthArray[i];
if (evtX >= textX && evtX < textX + textWidth) {
boolean needRefreshPropertiesPane = getSelectedIndex() != i;
setSelectedIndex(i);
if (needRefreshPropertiesPane) {
HistoryTemplateListCache.getInstance().getCurrentEditingTemplate().refreshEastPropertiesPane();
}
isBlank = false;
reportComposite.setComposite();
if (isAuthorityEditing) {
doWithAuthority();
}
DesignerContext.getDesignerFrame().getContentFrame().repaint();
break;
}
textX += textWidth;
}
if (SwingUtilities.isLeftMouseButton(evt)) {
processLeftMouseButton(evtX);
}
if (isBlank) {
return;
}
if (SwingUtilities.isRightMouseButton(evt) && !isAuthorityEditing) {
processRightMouseButton(evtX, evtY);
}
}
private void processRightMouseButton(int evtX, int evtY){
MenuDef def = new MenuDef();
addInsertGridShortCut(def);
def.addShortCut(new PolyReportInsertAction(), SeparatorDef.DEFAULT, new RemoveSheetAction(), new RenameSheetAction(),
new CopySheetAction());
JPopupMenu tabPop = def.createJMenu().getPopupMenu();
def.updateMenu();
GUICoreUtils.showPopupMenu(tabPop, this, evtX - 1, evtY - 1);
}
private void processLeftMouseButton(int evtX){
if (evtX > iconLocation && evtX < iconLocation + scale(GRID_TOSHEET_RIGHT)) {
firstInsertActionPerformed();
} else if (evtX > iconLocation + scale(POLY_TOSHEET_LEFT) && evtX < iconLocation + scale(POLY_TOSHEET_RIGHT)) {
new PolyReportInsertAction().actionPerformed(null);
}
}
protected void addInsertGridShortCut(MenuDef def){
def.addShortCut(new GridReportInsertAction());
}
protected void firstInsertActionPerformed(){
new GridReportInsertAction().actionPerformed(null);
}
/**
* 鼠标释放事件
*
* @param e 鼠标事件
*/
@Override
public void mouseReleased(MouseEvent e) {
this.isReleased = true;
this.setReleasedXY(e.getX(), e.getY());
int width = 0;
for (int w : widthArray) {
width = width + w + sheetIconGap;
}
if (isAuthorityEditing) {
return;
}
if (this.getPressedXY()[0] != this.getReleasedXY()[0] || this.getPressedXY()[1] != this.getReleasedXY()[1]) {
// 因为下面的操作会使得selectedIndex变化,所以要个量来保存开始的selectedIndex
int si = selectedIndex;
// richie:workSheet向右拖动
int moveRighttDistance = this.getReleasedXY()[0] - this.getPressedXY()[0];
// richie:向左拖动
int moveLeftDistance = -moveRighttDistance;
// samuel:拖动范围超过宽度的一半才移动,并且不越界
if (moveRighttDistance > widthArray[si] / 2 && this.getReleasedXY()[0] < width) {
move2Right(moveRighttDistance, si);
//拖拽触发保存
reportComposite.fireTargetModified();
this.repaint(100);
return;
} else if (moveLeftDistance > widthArray[si] / 2) {
move2Left(moveLeftDistance, si);
//拖拽触发保存
reportComposite.fireTargetModified();
this.repaint(100);
return;
} else {
setSelectedIndex(si);
DesignerContext.getDesignerFrame().getContentFrame().repaint();
}
}
this.repaint(100);
}
/**
* 右移动
*
* @param moveRighttDistance 右侧移动距离
* @param si 宽度坐标
*/
private void move2Right(int moveRighttDistance, int si) {
int reportcount = reportComposite.getEditingWorkBook().getReportCount();
if (selectedIndex < reportcount - 1) {
while (moveRighttDistance > widthArray[si] / 2) {
int i = selectedIndex;
this.exchangeWorkSheet(selectedIndex, selectedIndex + 1);
setSelectedIndex(selectedIndex + 1);
// richie:拖到越过所有的workSheet时,直接就作为最后一个workSheet
if (i > reportcount - 3) {
setSelectedIndex(reportcount - 1);
return;
}
moveRighttDistance -= widthArray[i + 1];
}
} else {
return;
}
}
/**
* 左移动
*
* @param moveLeftDistance 左侧距离
* @param si 宽度坐标
*/
private void move2Left(int moveLeftDistance, int si) {
if (selectedIndex > 0) {
while (moveLeftDistance > widthArray[si] / 2) {
int i = selectedIndex;
this.exchangeWorkSheet(selectedIndex, selectedIndex - 1);
setSelectedIndex(selectedIndex - 1);
// richie:拖到越过所有的workSheet时,直接就作为第一个workSheet
if (i < 2) {
setSelectedIndex(0);
return;
}
moveLeftDistance -= widthArray[i - 1];
}
} else {
return;
}
}
/**
* 鼠标进入事件
*
* @param e 鼠标事件
*/
@Override
public void mouseEntered(MouseEvent e) {
}
/**
* 鼠标退出事件
*
* @param e 鼠标事件
*/
@Override
public void mouseExited(MouseEvent e) {
}
/**
* exchange workSheet
*
* @param
* @param index1
* @param index2
* @return workBook
*/
private void exchangeWorkSheet(int index1, int index2) {
WorkBook workbook = reportComposite.getEditingWorkBook();
TemplateReport workSheet1 = workbook.getTemplateReport(index1);
String name1 = reportComposite.getEditingWorkBook().getReportName(index1);
TemplateReport workSheet2 = workbook.getTemplateReport(index2);
String name2 = workbook.getReportName(index2);
workbook.addReport(index1, name2, workSheet2);
workbook.removeReport(index1 + 1);
workbook.addReport(index2, name1, workSheet1);
workbook.removeReport(index2 + 1);
}
protected abstract class SheetInsertAction extends UpdateAction {
SheetInsertAction() {
this.setName(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Insert") + getTemplateReportType());
this.setSmallIcon(new LazyIcon("add"));
}
@Override
public void actionPerformed(ActionEvent evt) {
if (isAuthorityEditing) {
return;
}
int insertPos = selectedIndex + 1;
if (isOvertakeWidth) {
scrollIndex++;
}
JTemplate<?,?> template = HistoryTemplateListCache.getInstance().getCurrentEditingTemplate();
TemplateTheme theme = template.getTemplateTheme();
TemplateReport templateReport = newTemplateReport();
if (theme instanceof ReportTheme) {
templateReport.onTemplateUsingThemeChange((ReportTheme) theme, TemplateThemeCompatible.NONE);
}
reportComposite.getEditingWorkBook().addReport(insertPos, templateReport);
setSelectedIndex(insertPos);
// sheet名字的公式也需要做相应的变化.
reportComposite.setComposite();
reportComposite.fireTargetModified();
ReportComponent ReportComponent = reportComposite.centerCardPane.editingComponet;
ReportComponent.setSelection(ReportComponent.getDefaultSelectElement());
showCount = 1;
WorkBook workBook = reportComposite.getEditingWorkBook();
int reportCount = workBook.getReportCount();
double textX = 0;
for (int i = scrollIndex; i < reportCount; i++) {
widthArray = calculateWidthArray();
int width = widthArray[i];
textX += width + 1;
int operationWidth = tabButtonGap + getAddWorkSheet().getIconWidth() + iconSepDistance + ADD_POLY_SHEET.getIconWidth();
double maxWidth = getWidth() - operationWidth - buttonPane.getWidth();// 最大宽度
if (i < widthArray.length - 1 && textX + widthArray[i + 1] + 1 > maxWidth) {
isOvertakeWidth = true;
scrollIndex++;
continue;
} else {
showCount++;
isOvertakeWidth = false;
}
}
if (scrollIndex > 0 && showCount + scrollIndex < reportCount) {
scrollIndex++;
}
DesignerContext.getDesignerFrame().getContentFrame().repaint();
}
protected abstract TemplateReport newTemplateReport();
protected abstract String getTemplateReportType();
}
protected class GridReportInsertAction extends SheetInsertAction {
@Override
protected TemplateReport newTemplateReport() {
return new WorkSheet();
}
@Override
protected String getTemplateReportType() {
return com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Report");
}
}
protected class PolyReportInsertAction extends SheetInsertAction {
@Override
protected TemplateReport newTemplateReport() {
return new PolyWorkSheet();
}
@Override
protected String getTemplateReportType() {
return com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Poly");
}
}
private class RemoveSheetAction extends UpdateAction {
RemoveSheetAction() {
this.setName(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Remove"));
this.setSmallIcon(new LazyIcon("remove"));
}
@Override
public void actionPerformed(ActionEvent e) {
if (isAuthorityEditing) {
return;
}
int count = reportComposite.getEditingWorkBook().getReportCount();
if (count <= 1) {
JOptionPane.showMessageDialog(SwingUtilities.getWindowAncestor(reportComposite), com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_At_Least_One_Visual_Worksheet") + "!");
return;
}
int returnValue = FineJOptionPane.showConfirmDialog(SwingUtilities.getWindowAncestor(reportComposite), com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Des_Remove_Work_Sheet"),
com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Dialog_Prompt"),
JOptionPane.OK_CANCEL_OPTION);
if (returnValue == JOptionPane.OK_OPTION) {
if (DesignerContext.getFormatState() != DesignerContext.FORMAT_STATE_NULL) {
doCancelFormat();
}
reportComposite.getEditingWorkBook().removeReport(selectedIndex);
int insertPos = selectedIndex > 0 ? selectedIndex - 1 : 0;
setSelectedIndex(insertPos);
final int s = scrollIndex;
if (s < lastOneIndex && scrollIndex > 0) {
scrollIndex--;
lastOneIndex--;
}
reportComposite.setComposite();
reportComposite.repaint();
reportComposite.fireTargetModified();
}
}
}
private void doCancelFormat() {
boolean isSameCase = ComparatorUtils.equals(reportComposite.centerCardPane.editingComponet.elementCasePane, DesignerContext.getReferencedElementCasePane());
boolean isPolyContains = false;
if (reportComposite.centerCardPane.editingComponet instanceof PolyDesigner) {
isPolyContains = ((PolyDesigner) reportComposite.centerCardPane.editingComponet).containsBlocks(DesignerContext.getReferencedElementCasePane());
}
boolean isDelPane = isSameCase || isPolyContains;
if (isDelPane && this.selectedIndex == DesignerContext.getReferencedIndex()) {
DesignerContext.setFormatState(DesignerContext.FORMAT_STATE_NULL);
((ElementCasePane) DesignerContext.getReferencedElementCasePane()).getGrid().setNotShowingTableSelectPane(true);
DesignerContext.setReferencedElementCasePane(null);
DesignerContext.setReferencedIndex(0);
this.repaint();
}
}
private class RenameSheetAction extends UpdateAction {
RenameSheetAction() {
this.setName(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Rename"));
this.setSmallIcon(new LazyIcon("rename"));
}
@Override
public void actionPerformed(ActionEvent e) {
if (selectedIndex < 0 || selectedIndex >= reportComposite.getEditingWorkBook().getReportCount()) {
return;
}
String newName = FineJOptionPane.showInputDialog(reportComposite, com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Rename") + ":", reportComposite.getEditingWorkBook().getReportName(selectedIndex));
if (newName != null) {
// marks:判断是否重名
boolean isExisted = false;
for (int i = 0; i < reportComposite.getEditingWorkBook().getReportCount(); i++) {
if (newName.equalsIgnoreCase(reportComposite.getEditingWorkBook().getReportName(i)) && i != selectedIndex) {
isExisted = true;
break;
}
}
if (!isExisted) {
reportComposite.getEditingWorkBook().setReportName(selectedIndex, newName);
reportComposite.getEditingReportComponent().fireTargetModified();
// sheet名字的公式也需要做相应的变化.
reportComposite.repaint();
} else {
JOptionPane.showMessageDialog(reportComposite, com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Utils_The_Name_Has_Been_Existed"));
}
}
}
}
private class CopySheetAction extends UpdateAction {
CopySheetAction() {
this.setName(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Copy"));
this.setSmallIcon(new LazyIcon("copy"));
}
@Override
public void actionPerformed(ActionEvent e) {
TemplateReport tr;
try {
tr = (TemplateReport) reportComposite.getEditingWorkBook().getReport(selectedIndex).clone();
} catch (CloneNotSupportedException ex) {
return;
}
// 在需要复制的sheet后加上
int index = selectedIndex;
reportComposite.getEditingWorkBook().addReport(index + 1, tr);
String prefix = reportComposite.getEditingWorkBook().getReportName(index);
int times = 0;
for (int i = 0; i < reportComposite.getEditingWorkBook().getReportCount(); i++) {
if (reportComposite.getEditingWorkBook().getReportName(i).startsWith(prefix)) {
times++;
}
}
String suffix = "-" + com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Copy") + times;
reportComposite.getEditingWorkBook().setReportName(index + 1, prefix + suffix);
setSelectedIndex(index + 1);
reportComposite.validate();
reportComposite.repaint(100);
reportComposite.fireTargetModified();
}
}
}