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

372 lines
13 KiB

package com.fr.design.webattr;
import com.fine.theme.icon.LazyIcon;
import com.fine.theme.light.ui.FineRoundBorder;
import com.fine.theme.utils.FineUIScale;
import com.fine.theme.utils.FineUIUtils;
import com.formdev.flatlaf.ui.FlatUIUtils;
import com.formdev.flatlaf.util.ScaledEmptyBorder;
import com.fr.design.ExtraDesignClassManager;
import com.fr.design.constants.LayoutConstants;
import com.fr.design.gui.core.WidgetOption;
import com.fr.design.gui.ibutton.UIButton;
import com.fr.design.gui.icheckbox.UICheckBox;
import com.fr.design.gui.icontainer.UIScrollPane;
import com.fr.design.layout.FRGUIPaneFactory;
import com.fr.design.mainframe.DesignerContext;
import com.fr.design.utils.gui.GUICoreUtils;
import com.fr.form.ui.Widget;
import com.fr.report.web.Location;
import com.fr.report.web.ToolBarManager;
import com.fr.stable.ArrayUtils;
import com.fr.stable.GraphDrawHelper;
import com.fr.stable.StringUtils;
import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.Component;
import java.awt.Color;
import java.awt.image.ImageObserver;
import javax.swing.Icon;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JTable;
import javax.swing.ListSelectionModel;
import javax.swing.SwingUtilities;
import javax.swing.BorderFactory;
import javax.swing.UIManager;
import javax.swing.table.DefaultTableCellRenderer;
import javax.swing.table.DefaultTableModel;
import javax.swing.table.TableColumnModel;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.util.List;
import static com.fine.swing.ui.layout.Layouts.cell;
import static com.fine.swing.ui.layout.Layouts.column;
/**
* 新的拖拽ToolBar button以实现自定义工具栏 报表web设置那儿的.应该不叫ToolBarDragPane,因为实际没有提供drag功能
*
* @editor zhou 2012-3-22下午3:57:22
*/
public class ToolBarDragPane extends WidgetToolBarPane {
private static final int COLUMN = 4;
private static final int MIN_COLUMN_WIDTH = 15;
private int row = 7;
private DefaultTableModel toolbarButtonTableModel;
private JTable layoutTable;
private UICheckBox isUseToolBarCheckBox = new UICheckBox(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Use_ToolBar")); // 是否使用工具栏
private boolean isEnabled;
private UIScrollPane scrollPane;
/**
* 工具栏Pane
*/
public ToolBarDragPane() {
WidgetOption[] options = ExtraDesignClassManager.getInstance().getWebWidgetOptions();
if(options != null){
double optionNums = options.length;
row += Math.ceil(optionNums / COLUMN);
}
toolbarButtonTableModel = new TableModel(row ,COLUMN);
this.setLayout(FRGUIPaneFactory.createBorderLayout());
//工具栏上方面板
JPanel northPanel = FRGUIPaneFactory.createBorderLayout_S_Pane();
isUseToolBarCheckBox.setSelected(true);
northPanel.add(isUseToolBarCheckBox, BorderLayout.WEST);
//恢复默认按钮
UIButton defaultButton = new UIButton(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Restore_Default"));
defaultButton.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
northToolBar.removeButtonList();
northToolBar.removeAll();
southToolBar.removeButtonList();
southToolBar.removeAll();
if (defaultToolBar == null) {
return;
}
ToolBarManager toolBarManager = defaultToolBar;
toolBarManager.setToolBarLocation(Location.createTopEmbedLocation());
ToolBarManager[] tbm = new ToolBarManager[] { toolBarManager };
populateBean(tbm);
ToolBarDragPane.this.repaint();
}
});
northPanel.add(defaultButton, BorderLayout.EAST);
//顶部工具栏
JPanel northContentPane = new JPanel(new BorderLayout());
northToolBar = new ToolBarPane();
//图标不垂直居中显示,超出宽度范围后在第二行显示,高度设置24可以看到第二行图标
northToolBar.setPreferredSize(FineUIScale.scale(new Dimension(ImageObserver.WIDTH, 24)));
northToolBar.setBorder(BorderFactory.createMatteBorder(0, 0, 0, 1, UIManager.getColor("defaultBorderColor")));
northToolBar.setOpaque(false);
SettingToolBar top = new SettingToolBar(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_ToolBar_Top"), northToolBar);
top.setOpaque(false);
northContentPane.add(northToolBar, BorderLayout.CENTER);
northContentPane.add(top, BorderLayout.EAST);
northContentPane.setOpaque(false);
northContentPane.setBorder(new ScaledEmptyBorder(4,0,4,0));
JPanel topToolbarPanel = new JPanel(new BorderLayout());
topToolbarPanel.add(northContentPane);
topToolbarPanel.setBackground(FineUIUtils.getUIColor("Center.ZoneBorderColor", "defaultBorderColor"));
//移入顶部工具栏按钮
UIButton topButton = new UIButton(new LazyIcon("move_up"));
topButton.setOpaque(false);
topButton.setContentAreaFilled(false);
topButton.setFocusPainted(false);
topButton.setRequestFocusEnabled(false);
topButton.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
if (isSelectedtable()) {
WidgetOption no = (WidgetOption)layoutTable.getValueAt(layoutTable.getSelectedRow(), layoutTable.getSelectedColumn());
Widget widget = no.createWidget();
ToolBarButton tb = new ToolBarButton(no.optionIcon(), widget);
tb.setNameOption(no);
northToolBar.add(tb);
northToolBar.validate();
northToolBar.repaint();
} else {
JOptionPane.showMessageDialog(DesignerContext.getDesignerFrame(), com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Choose_One_Button"));
}
}
});
//图标列表面板,增加外边距
initLayoutTable();
JPanel innerTablePanel = new JPanel(new BorderLayout());
innerTablePanel.add(layoutTable);
innerTablePanel.setOpaque(false);
innerTablePanel.setBorder(new ScaledEmptyBorder(4,4,4,4));
JPanel buttonTablePanel = new JPanel(new BorderLayout());
buttonTablePanel.setBackground(FlatUIUtils.getUIColor("fill.normal", Color.WHITE));
buttonTablePanel.setBorder(new FineRoundBorder());
buttonTablePanel.add(innerTablePanel);
//移入底部工具栏按钮
UIButton downButton = new UIButton(new LazyIcon("move_down"));
downButton.setMargin(null);
downButton.setOpaque(false);
downButton.setContentAreaFilled(false);
downButton.setFocusPainted(false);
downButton.setRequestFocusEnabled(false);
downButton.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
if (isSelectedtable()) {
WidgetOption no = (WidgetOption)layoutTable.getValueAt(layoutTable.getSelectedRow(), layoutTable.getSelectedColumn());
Widget widget = no.createWidget();
ToolBarButton tb = new ToolBarButton(no.optionIcon(), widget);
tb.setNameOption(no);
southToolBar.add(tb);
southToolBar.validate();
southToolBar.repaint();
} else {
JOptionPane.showMessageDialog(DesignerContext.getDesignerFrame(), com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Choose_One_Button"));
}
}
});
//底部工具栏
JPanel southContentPane = FRGUIPaneFactory.createBorderLayout_S_Pane();
southToolBar = new ToolBarPane();
southToolBar.setPreferredSize(FineUIScale.scale(new Dimension(ImageObserver.WIDTH, 24)));
southToolBar.setBorder(BorderFactory.createMatteBorder(0, 0, 0, 1, UIManager.getColor("defaultBorderColor")));
southToolBar.setOpaque(false);
SettingToolBar bottom = new SettingToolBar(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_ToolBar_Bottom"), southToolBar);
bottom.setOpaque(false);
southContentPane.add(bottom, BorderLayout.EAST);
southContentPane.add(southToolBar, BorderLayout.CENTER);
southContentPane.setOpaque(false);
southContentPane.setBorder(new ScaledEmptyBorder(4,0,4,0));
JPanel bottomToolbarPanel = new JPanel(new BorderLayout());
bottomToolbarPanel.add(southContentPane);
bottomToolbarPanel.setBackground(FineUIUtils.getUIColor("Center.ZoneBorderColor", "defaultBorderColor"));
//工具栏面板center布局:顶部工具栏-上移动按钮-图标面板-下移动按钮-底部工具栏
JPanel movePane = FRGUIPaneFactory.createBorderLayout_S_Pane();
scrollPane = new UIScrollPane(buttonTablePanel);
movePane.add(column(1,
cell(topToolbarPanel),
cell(topButton),
cell(scrollPane),
cell(downButton),
cell(bottomToolbarPanel)
).getComponent());
//工具栏整体面板
this.add(column(LayoutConstants.VERTICAL_GAP, cell(northPanel), cell(movePane)).getComponent());
}
/**
* 获取当前面板的滚动面板(UIScrollPane)。
* 用于获取滚动条或进行其他基于滚动面板的操作。
*
* @return 当前组件的 UIScrollPane 实例
*/
public UIScrollPane getScrollPane() {
return scrollPane;
}
/**
* 图标列表
*/
private void initLayoutTable() {
layoutTable = new JTable(toolbarButtonTableModel);
layoutTable.setDefaultRenderer(Object.class, tableRenderer);
layoutTable.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
layoutTable.setColumnSelectionAllowed(false);
layoutTable.setRowSelectionAllowed(false);
layoutTable.setOpaque(false);
layoutTable.addMouseListener(new MouseAdapter() {
public void mouseClicked(MouseEvent e) {
if (e.getClickCount() > 1 && !(SwingUtilities.isRightMouseButton(e)) && isEnabled) {
WidgetOption no = (WidgetOption)layoutTable.getValueAt(layoutTable.getSelectedRow(), layoutTable.getSelectedColumn());
Widget widget = no.createWidget();
ToolBarButton tb = new ToolBarButton(no.optionIcon(), widget);
tb.setNameOption(no);
northToolBar.add(tb);
northToolBar.validate();
northToolBar.repaint();
}
}
});
}
// 根据控件名称长度,设置合适的列宽
private static void resizeColumnWidth(JTable table) {
final TableColumnModel columnModel = table.getColumnModel();
for (int column = 0; column < table.getColumnCount(); column++) {
int width = MIN_COLUMN_WIDTH; // Min width
for (int row = 0; row < table.getRowCount(); row++) {
WidgetOption widgetOption = (WidgetOption) table.getValueAt(row, column);
if (widgetOption == null) {
continue;
}
String optionName = widgetOption.optionName();
width = Math.max(GraphDrawHelper.getWidth(optionName), width);
}
columnModel.getColumn(column).setPreferredWidth(width);
}
}
private boolean isSelectedtable() {
for (int i = 0; i < layoutTable.getColumnCount(); i++) {
if (layoutTable.isColumnSelected(i)) {
return true;
}
}
return false;
}
public void setAllEnabled(boolean b) {
GUICoreUtils.setEnabled(this, b);
isEnabled = b;
removeAllListener(northToolBar.getToolBarButtons());
removeAllListener(southToolBar.getToolBarButtons());
removeToolBarListener(northToolBar);
removeToolBarListener(southToolBar);
}
private void removeToolBarListener(ToolBarPane toolBarPane) {
if (!isEnabled) {
toolBarPane.removeDefaultMouseListener();
}
}
private void removeAllListener(List<ToolBarButton> toolBarButtons) {
for (ToolBarButton button : toolBarButtons) {
button.setEnabled(isEnabled);
if (!isEnabled) {
button.removeMouseListener(button);
}
}
}
/**
* 是否被选中
* @return 同上
*/
public boolean isUseToolbar() {
return this.isUseToolBarCheckBox.isSelected();
}
private class TableModel extends DefaultTableModel {
public TableModel(int i, int j) {
super(i, j);
}
// 禁止jtable的双击编辑功能
public boolean isCellEditable(int row, int column) {
return false;
}
}
public void setDefaultToolBar(ToolBarManager defaultToolBar, WidgetOption[] buttonArray) {
super.setDefaultToolBar(defaultToolBar);
if (buttonArray != null) {
for (int i = 0; i < buttonArray.length; i++) {
toolbarButtonTableModel.setValueAt(buttonArray[i], i % row, i / row);
}
}
resizeColumnWidth(layoutTable);
}
DefaultTableCellRenderer tableRenderer = new DefaultTableCellRenderer() {
@Override
public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) {
super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column);
this.setOpaque(false);
if (value instanceof WidgetOption) {
WidgetOption nameOption = (WidgetOption)value;
this.setText(nameOption.optionName());
Icon icon = nameOption.optionIcon();
if (icon != null) {
this.setIcon(icon);
}
}
if (value == null) {
this.setText(StringUtils.EMPTY);
this.setIcon(null);
}
return this;
}
};
@Override
protected String title4PopupWindow() {
return com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Set_Toolbar");
}
public void setCheckBoxSelected(boolean b) {
this.isUseToolBarCheckBox.setSelected(b);
}
@Override
public void populateBean(ToolBarManager[] toolBarManager) {
if (ArrayUtils.isEmpty(toolBarManager)) {
defaultToolBar.setToolBarLocation(Location.createTopEmbedLocation());
toolBarManager = new ToolBarManager[] { defaultToolBar };
}
super.populateBean(toolBarManager);
}
@Override
public ToolBarManager[] updateBean() {
if(!isUseToolbar()){
return new ToolBarManager[0];
}
return super.updateBean();
}
}