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
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(); |
|
} |
|
|
|
}
|
|
|