Browse Source
* commit '9024ca56b8568fcabc92d54d681c7f26295a39c2': 代码格式化 REPORT-2897 9.0设计器修改 聚合报表缩放条快捷键 REPORT-2897 9.0设计器修改 修改代码质量,加了一下方法备注 REPORT-2897 9.0设计器修改 缩放条部分-增加键盘快捷键 REPORT-2897 9.0设计器修改 缩放条部分 REPORT-2897 9.0设计器修改 缩放条部分 REPORT-2897 9.0设计器修改 缩放条部分 REPORT-2897 9.0设计器修改 缩放条部分 REPORT-3163 合作开发9.0设计器=>列表面板=》完善UI细节 REPORT-3163 合作开发9.0设计器=>列表面板弹出编辑框 REPORT-3163 合作开发9.0设计器=>调整自定义列表项 REPORT-2897 9.0设计器修改 聚合报表缩放条部分 REPORT-3163 合作开发9.0设计器=>新列表面板雏形 REPORT-3163 合作开发9.0设计器=>悬浮元素超级链接tab改为可用 REPORT-3163 合作开发9.0设计器=>将超级链接面板改为单例,插入右侧属性面板框架中 REPORT-2897 9.0设计器修改 缩放条部分 REPORT-3163 合作开发9.0设计器=>调整外框架工具条UI REPORT-2897 9.0设计器修改 缩放条部分master
superman
7 years ago
40 changed files with 3299 additions and 511 deletions
@ -0,0 +1,50 @@ |
|||||||
|
package com.fr.design.mainframe; |
||||||
|
|
||||||
|
import com.fr.design.gui.frpane.HyperlinkGroupPane; |
||||||
|
import com.fr.grid.selection.CellSelection; |
||||||
|
import com.fr.grid.selection.FloatSelection; |
||||||
|
import com.fr.grid.selection.Selection; |
||||||
|
import com.fr.js.NameJavaScriptGroup; |
||||||
|
import com.fr.report.cell.CellElement; |
||||||
|
import com.fr.report.cell.FloatElement; |
||||||
|
import com.fr.report.elementcase.TemplateElementCase; |
||||||
|
|
||||||
|
/** |
||||||
|
* Created by plough on 2017/7/21. |
||||||
|
*/ |
||||||
|
public class ReportHyperlinkGroupPane extends HyperlinkGroupPane { |
||||||
|
private static ReportHyperlinkGroupPane singleton; |
||||||
|
|
||||||
|
private ReportHyperlinkGroupPane() { |
||||||
|
super(); |
||||||
|
} |
||||||
|
|
||||||
|
public synchronized static ReportHyperlinkGroupPane getInstance() { |
||||||
|
if (singleton == null) { |
||||||
|
singleton = new ReportHyperlinkGroupPane(); |
||||||
|
} |
||||||
|
return singleton; |
||||||
|
} |
||||||
|
|
||||||
|
public void populate(ElementCasePane reportPane) { |
||||||
|
final TemplateElementCase report = reportPane.getEditingElementCase(); |
||||||
|
NameJavaScriptGroup nameHyperlinks = getNameJSGroup(reportPane, report); |
||||||
|
populate(nameHyperlinks); |
||||||
|
} |
||||||
|
|
||||||
|
private NameJavaScriptGroup getNameJSGroup(ElementCasePane reportPane, final TemplateElementCase report) { |
||||||
|
NameJavaScriptGroup nameHyperlinks = null; |
||||||
|
final Selection sel = reportPane.getSelection(); |
||||||
|
if (sel instanceof FloatSelection) { |
||||||
|
FloatElement selectedFloatElement = report.getFloatElement(((FloatSelection)sel).getSelectedFloatName()); |
||||||
|
nameHyperlinks = selectedFloatElement.getNameHyperlinkGroup(); |
||||||
|
} else { |
||||||
|
CellElement editCellElement = report.getCellElement(((CellSelection)sel).getColumn(), ((CellSelection)sel).getRow()); |
||||||
|
if (editCellElement != null) { |
||||||
|
nameHyperlinks = editCellElement.getNameHyperlinkGroup(); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
return nameHyperlinks; |
||||||
|
} |
||||||
|
} |
@ -1,15 +1,29 @@ |
|||||||
package com.fr.poly; |
package com.fr.poly; |
||||||
|
|
||||||
|
|
||||||
import javax.swing.JComponent; |
import javax.swing.JComponent; |
||||||
|
|
||||||
public class PolyArea extends JComponent { |
public class PolyArea extends JComponent { |
||||||
private PolyDesigner polyDesigner; |
private PolyDesigner polyDesigner; |
||||||
|
private int resolution; |
||||||
|
|
||||||
public PolyArea(PolyDesigner polyDesigner) { |
public PolyArea(PolyDesigner polyDesigner, int resolution) { |
||||||
this.polyDesigner = polyDesigner; |
this.polyDesigner = polyDesigner; |
||||||
setUI(new PolyDesignUI()); |
this.resolution = resolution; |
||||||
|
this.setUI(new PolyDesignUI(resolution)); |
||||||
|
// setUI(new PolyDesignUI());
|
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
public void setResolution(int resolution) { |
||||||
|
this.resolution = resolution; |
||||||
} |
} |
||||||
|
|
||||||
|
public int getResolution() { |
||||||
|
return this.resolution; |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
public PolyDesigner getPolyDesigner() { |
public PolyDesigner getPolyDesigner() { |
||||||
return polyDesigner; |
return polyDesigner; |
||||||
} |
} |
||||||
|
@ -0,0 +1,286 @@ |
|||||||
|
package com.fr.design.gui.controlpane; |
||||||
|
|
||||||
|
import com.fr.design.dialog.BasicPane; |
||||||
|
import com.fr.design.gui.ilable.UILabel; |
||||||
|
import com.fr.design.gui.itoolbar.UIToolbar; |
||||||
|
import com.fr.design.layout.FRGUIPaneFactory; |
||||||
|
import com.fr.design.layout.TableLayout; |
||||||
|
import com.fr.design.layout.TableLayoutHelper; |
||||||
|
import com.fr.design.mainframe.EastRegionContainerPane; |
||||||
|
import com.fr.design.menu.ShortCut; |
||||||
|
import com.fr.design.menu.ToolBarDef; |
||||||
|
import com.fr.design.utils.gui.GUICoreUtils; |
||||||
|
import com.fr.general.Inter; |
||||||
|
import com.fr.stable.ArrayUtils; |
||||||
|
import com.fr.stable.Nameable; |
||||||
|
|
||||||
|
import javax.swing.*; |
||||||
|
import java.awt.*; |
||||||
|
|
||||||
|
/** |
||||||
|
* Created by plough on 2017/7/21. |
||||||
|
*/ |
||||||
|
public abstract class UIControlPane extends BasicPane implements UnrepeatedNameHelper { |
||||||
|
protected static final int SHORT_WIDTH = 30; //每加一个short Divider位置加30
|
||||||
|
protected JPanel controlUpdatePane; |
||||||
|
|
||||||
|
private ShortCut4JControlPane[] shorts; |
||||||
|
private NameableCreator[] creators; |
||||||
|
private ToolBarDef toolbarDef; |
||||||
|
|
||||||
|
private UIToolbar toolBar; |
||||||
|
protected PopupEditPane popupEditPane; |
||||||
|
// peter:这是整体的一个cardLayout Pane
|
||||||
|
protected CardLayout cardLayout; |
||||||
|
|
||||||
|
protected JPanel cardPane; |
||||||
|
|
||||||
|
public UIControlPane() { |
||||||
|
this.initComponentPane(); |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* 生成添加按钮的NameableCreator |
||||||
|
* |
||||||
|
* @return 按钮的NameableCreator |
||||||
|
*/ |
||||||
|
public abstract NameableCreator[] createNameableCreators(); |
||||||
|
|
||||||
|
public ShortCut4JControlPane[] getShorts() { |
||||||
|
return shorts; |
||||||
|
} |
||||||
|
|
||||||
|
public void setShorts(ShortCut4JControlPane[] shorts) { |
||||||
|
this.shorts = shorts; |
||||||
|
} |
||||||
|
|
||||||
|
public void setCreators(NameableCreator[] creators) { |
||||||
|
this.creators = creators; |
||||||
|
} |
||||||
|
|
||||||
|
public ToolBarDef getToolbarDef() { |
||||||
|
return toolbarDef; |
||||||
|
} |
||||||
|
|
||||||
|
public void setToolbarDef(ToolBarDef toolbarDef) { |
||||||
|
this.toolbarDef = toolbarDef; |
||||||
|
} |
||||||
|
|
||||||
|
public UIToolbar getToolBar() { |
||||||
|
return toolBar; |
||||||
|
} |
||||||
|
|
||||||
|
public void setToolBar(UIToolbar toolBar) { |
||||||
|
this.toolBar = toolBar; |
||||||
|
} |
||||||
|
|
||||||
|
public CardLayout getCardLayout() { |
||||||
|
return cardLayout; |
||||||
|
} |
||||||
|
|
||||||
|
public void setCardLayout(CardLayout cardLayout) { |
||||||
|
this.cardLayout = cardLayout; |
||||||
|
} |
||||||
|
|
||||||
|
public JPanel getCardPane() { |
||||||
|
return cardPane; |
||||||
|
} |
||||||
|
|
||||||
|
public void setCardPane(JPanel cardPane) { |
||||||
|
this.cardPane = cardPane; |
||||||
|
} |
||||||
|
|
||||||
|
protected void initComponentPane() { |
||||||
|
this.setLayout(FRGUIPaneFactory.createBorderLayout()); |
||||||
|
this.creators = this.createNameableCreators(); |
||||||
|
this.controlUpdatePane = createControlUpdatePane(); |
||||||
|
|
||||||
|
// p: edit card layout
|
||||||
|
this.cardLayout = new CardLayout(); |
||||||
|
cardPane = FRGUIPaneFactory.createCardLayout_S_Pane(); |
||||||
|
cardPane.setLayout(this.cardLayout); |
||||||
|
// p:选择的Label
|
||||||
|
UILabel selectLabel = new UILabel(); |
||||||
|
cardPane.add(selectLabel, "SELECT"); |
||||||
|
cardPane.add(controlUpdatePane, "EDIT"); |
||||||
|
popupEditPane = new PopupEditPane(cardPane); |
||||||
|
// SplitPane
|
||||||
|
// JSplitPane mainSplitPane = new JSplitPane(JSplitPane.HORIZONTAL_SPLIT, true, getLeftPane(), cardPane);
|
||||||
|
// mainSplitPane.setBorder(BorderFactory.createLineBorder(GUICoreUtils.getTitleLineBorderColor()));
|
||||||
|
// mainSplitPane.setOneTouchExpandable(true);
|
||||||
|
|
||||||
|
this.add(getLeftPane(), BorderLayout.CENTER); |
||||||
|
this.setBorder(BorderFactory.createEmptyBorder(0, 10, 12, 10)); |
||||||
|
// mainSplitPane.setDividerLocation(getLeftPreferredSize());
|
||||||
|
this.checkButtonEnabled(); |
||||||
|
} |
||||||
|
|
||||||
|
protected abstract JPanel createControlUpdatePane(); |
||||||
|
|
||||||
|
protected JPanel getLeftPane() { |
||||||
|
// LeftPane
|
||||||
|
JPanel leftPane = FRGUIPaneFactory.createBorderLayout_S_Pane(); |
||||||
|
|
||||||
|
JPanel leftContentPane = FRGUIPaneFactory.createBorderLayout_S_Pane(); |
||||||
|
initLeftPane(leftContentPane); |
||||||
|
leftPane.add(leftContentPane, BorderLayout.CENTER); |
||||||
|
|
||||||
|
shorts = this.createShortcuts(); |
||||||
|
if (ArrayUtils.isEmpty(shorts)) { |
||||||
|
return leftPane; |
||||||
|
} |
||||||
|
|
||||||
|
toolbarDef = new ToolBarDef(); |
||||||
|
for (ShortCut4JControlPane sj : shorts) { |
||||||
|
toolbarDef.addShortCut(sj.getShortCut()); |
||||||
|
} |
||||||
|
toolBar = ToolBarDef.createJToolBar(); |
||||||
|
// toolBar.setLayout(new FlowLayout(FlowLayout.LEFT));
|
||||||
|
toolbarDef.updateToolBar(toolBar); |
||||||
|
// 封装一层,加边框
|
||||||
|
JPanel toolBarPane = new JPanel(new BorderLayout()); |
||||||
|
toolBarPane.add(toolBar, BorderLayout.CENTER); |
||||||
|
toolBarPane.setBorder(BorderFactory.createMatteBorder(1, 1, 0, 1, new Color(201, 198, 184))); |
||||||
|
leftContentPane.add(toolBarPane, BorderLayout.NORTH); |
||||||
|
// leftContentPane.setBorder(BorderFactory.createLineBorder(new Color(201, 198, 184)));
|
||||||
|
|
||||||
|
// 顶部标签及add按钮
|
||||||
|
UIToolbar topToolBar = new UIToolbar(); |
||||||
|
topToolBar.setLayout(new BorderLayout()); |
||||||
|
ShortCut addItem = addItemShortCut().getShortCut(); |
||||||
|
addItem.intoJToolBar(topToolBar); |
||||||
|
topToolBar.setBorder(BorderFactory.createEmptyBorder(2, 0, 2, 0)); |
||||||
|
double p = TableLayout.PREFERRED; |
||||||
|
double f = TableLayout.FILL; |
||||||
|
double[] columnSize = { p, f }; |
||||||
|
double[] rowSize = { p}; |
||||||
|
Component[][] components = new Component[][]{ |
||||||
|
new Component[]{new UILabel("add hyperlink "), topToolBar}, |
||||||
|
}; |
||||||
|
JPanel leftTopPane = TableLayoutHelper.createTableLayoutPane(components,rowSize,columnSize); |
||||||
|
leftTopPane.setBorder(BorderFactory.createEmptyBorder(0, 0, 6, 0)); |
||||||
|
leftPane.add(leftTopPane, BorderLayout.NORTH); |
||||||
|
|
||||||
|
return leftPane; |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* 初始化左边面板 |
||||||
|
*/ |
||||||
|
protected void initLeftPane(JPanel leftPane) { |
||||||
|
|
||||||
|
} |
||||||
|
|
||||||
|
protected int getLeftPreferredSize() { |
||||||
|
return shorts.length * SHORT_WIDTH; |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
protected ShortCut4JControlPane[] createShortcuts() { |
||||||
|
return new ShortCut4JControlPane[]{ |
||||||
|
// addItemShortCut(),
|
||||||
|
copyItemShortCut(), |
||||||
|
moveUpItemShortCut(), |
||||||
|
moveDownItemShortCut(), |
||||||
|
sortItemShortCut(), |
||||||
|
removeItemShortCut() |
||||||
|
}; |
||||||
|
} |
||||||
|
|
||||||
|
protected abstract ShortCut4JControlPane addItemShortCut(); |
||||||
|
|
||||||
|
protected abstract ShortCut4JControlPane removeItemShortCut(); |
||||||
|
|
||||||
|
protected abstract ShortCut4JControlPane copyItemShortCut(); |
||||||
|
|
||||||
|
protected abstract ShortCut4JControlPane moveUpItemShortCut(); |
||||||
|
|
||||||
|
protected abstract ShortCut4JControlPane moveDownItemShortCut(); |
||||||
|
|
||||||
|
protected abstract ShortCut4JControlPane sortItemShortCut(); |
||||||
|
|
||||||
|
public abstract Nameable[] update(); |
||||||
|
|
||||||
|
|
||||||
|
public void populate(Nameable[] nameableArray) { |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* 检查按钮可用状态 Check button enabled. |
||||||
|
*/ |
||||||
|
public void checkButtonEnabled() { |
||||||
|
} |
||||||
|
|
||||||
|
protected void doBeforeRemove() { |
||||||
|
} |
||||||
|
|
||||||
|
protected void doAfterRemove() { |
||||||
|
} |
||||||
|
|
||||||
|
public NameableCreator[] creators() { |
||||||
|
return creators == null ? new NameableCreator[0] : creators; |
||||||
|
} |
||||||
|
|
||||||
|
protected abstract boolean hasInvalid(boolean isAdd); |
||||||
|
|
||||||
|
/** |
||||||
|
* 刷新 NameableCreator |
||||||
|
* |
||||||
|
* @param creators 生成器 |
||||||
|
*/ |
||||||
|
public void refreshNameableCreator(NameableCreator[] creators) { |
||||||
|
this.creators = creators; |
||||||
|
shorts = this.createShortcuts(); |
||||||
|
toolbarDef.clearShortCuts(); |
||||||
|
for (ShortCut4JControlPane sj : shorts) { |
||||||
|
toolbarDef.addShortCut(sj.getShortCut()); |
||||||
|
} |
||||||
|
|
||||||
|
toolbarDef.updateToolBar(toolBar); |
||||||
|
toolBar.validate(); |
||||||
|
toolBar.repaint(); |
||||||
|
this.repaint(); |
||||||
|
} |
||||||
|
|
||||||
|
// 点击"编辑"按钮,弹出面板
|
||||||
|
protected class PopupEditPane extends JPopupMenu { |
||||||
|
private JComponent contentPane; |
||||||
|
private static final int WIDTH = 460; |
||||||
|
private static final int HEIGHT = 500; |
||||||
|
// private PopupToolPane popupToolPane;
|
||||||
|
// private int fixedHeight;
|
||||||
|
|
||||||
|
PopupEditPane(JComponent pane) { |
||||||
|
contentPane = pane; |
||||||
|
this.setLayout(new BorderLayout()); |
||||||
|
this.add(contentPane, BorderLayout.CENTER); |
||||||
|
this.setOpaque(false); |
||||||
|
contentPane.setPreferredSize(new Dimension(WIDTH, HEIGHT)); |
||||||
|
// fixedHeight = getPreferredSize().height - contentPane.getPreferredSize().height;
|
||||||
|
// updateSize();
|
||||||
|
} |
||||||
|
|
||||||
|
// private void updateSize() {
|
||||||
|
// int newHeight = fixedHeight + contentPane.getPreferredSize().height;
|
||||||
|
// this.setPreferredSize(new Dimension(CONTAINER_WIDTH - TAB_WIDTH, newHeight));
|
||||||
|
// }
|
||||||
|
|
||||||
|
public JComponent getContentPane() { |
||||||
|
return contentPane; |
||||||
|
} |
||||||
|
|
||||||
|
public void replaceContentPane(JComponent pane) { |
||||||
|
// remove(pane);
|
||||||
|
this.remove(this.contentPane); |
||||||
|
this.add(this.contentPane = pane); |
||||||
|
// updateSize();
|
||||||
|
refreshContainer(); |
||||||
|
} |
||||||
|
|
||||||
|
private void refreshContainer() { |
||||||
|
validate(); |
||||||
|
repaint(); |
||||||
|
revalidate(); |
||||||
|
} |
||||||
|
} |
||||||
|
} |
@ -0,0 +1,974 @@ |
|||||||
|
package com.fr.design.gui.controlpane; |
||||||
|
|
||||||
|
import com.fr.base.BaseUtils; |
||||||
|
import com.fr.base.FRContext; |
||||||
|
import com.fr.design.actions.UpdateAction; |
||||||
|
import com.fr.design.beans.BasicBeanPane; |
||||||
|
import com.fr.design.data.tabledata.tabledatapane.GlobalMultiTDTableDataPane; |
||||||
|
import com.fr.design.data.tabledata.tabledatapane.GlobalTreeTableDataPane; |
||||||
|
import com.fr.design.data.tabledata.tabledatapane.MultiTDTableDataPane; |
||||||
|
import com.fr.design.data.tabledata.tabledatapane.TreeTableDataPane; |
||||||
|
import com.fr.design.file.HistoryTemplateListPane; |
||||||
|
import com.fr.design.gui.ibutton.UIButton; |
||||||
|
import com.fr.design.gui.icontainer.UIScrollPane; |
||||||
|
import com.fr.design.gui.ilist.UINameEdList; |
||||||
|
import com.fr.design.gui.ilist.ListModelElement; |
||||||
|
import com.fr.design.gui.ilist.ModNameActionListener; |
||||||
|
import com.fr.design.layout.FRGUIPaneFactory; |
||||||
|
import com.fr.design.mainframe.JTemplate; |
||||||
|
import com.fr.design.menu.LineSeparator; |
||||||
|
import com.fr.design.menu.MenuDef; |
||||||
|
import com.fr.design.menu.ShortCut; |
||||||
|
import com.fr.design.menu.ToolBarDef; |
||||||
|
import com.fr.design.utils.gui.GUICoreUtils; |
||||||
|
import com.fr.general.ComparatorUtils; |
||||||
|
import com.fr.general.Inter; |
||||||
|
import com.fr.stable.ArrayUtils; |
||||||
|
import com.fr.stable.Nameable; |
||||||
|
import com.fr.stable.core.PropertyChangeAdapter; |
||||||
|
import sun.swing.DefaultLookup; |
||||||
|
|
||||||
|
import javax.swing.*; |
||||||
|
import javax.swing.border.Border; |
||||||
|
import javax.swing.event.ListSelectionEvent; |
||||||
|
import javax.swing.event.ListSelectionListener; |
||||||
|
import java.awt.*; |
||||||
|
import java.awt.event.ActionEvent; |
||||||
|
import java.awt.event.MouseAdapter; |
||||||
|
import java.awt.event.MouseEvent; |
||||||
|
import java.awt.event.MouseListener; |
||||||
|
import java.lang.reflect.Constructor; |
||||||
|
import java.lang.reflect.InvocationTargetException; |
||||||
|
import java.util.Arrays; |
||||||
|
import java.util.Comparator; |
||||||
|
|
||||||
|
/** |
||||||
|
* Created by plough on 2017/7/19. |
||||||
|
*/ |
||||||
|
|
||||||
|
public abstract class UIListControlPane extends UIControlPane { |
||||||
|
public static final String LIST_NAME = "UIControl_List"; |
||||||
|
private static final int EDIT_RANGE = 25; // 编辑按钮的x坐标范围
|
||||||
|
|
||||||
|
protected UINameEdList nameableList; |
||||||
|
protected int editingIndex; |
||||||
|
protected String selectedName; |
||||||
|
private boolean isNameRepeated = false; |
||||||
|
|
||||||
|
public UIListControlPane() { |
||||||
|
this.initComponentPane(); |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
protected JPanel createControlUpdatePane() { |
||||||
|
return new JControlUpdatePane(); |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* 生成添加按钮的NameableCreator |
||||||
|
* |
||||||
|
* @return 按钮的NameableCreator |
||||||
|
*/ |
||||||
|
@Override |
||||||
|
public abstract NameableCreator[] createNameableCreators(); |
||||||
|
|
||||||
|
|
||||||
|
@Override |
||||||
|
protected void initLeftPane(JPanel leftPane) { |
||||||
|
nameableList = createJNameList(); |
||||||
|
nameableList.setName(LIST_NAME); |
||||||
|
leftPane.add(new UIScrollPane(nameableList), BorderLayout.CENTER); |
||||||
|
|
||||||
|
|
||||||
|
nameableList.setSelectionMode(ListSelectionModel.MULTIPLE_INTERVAL_SELECTION); |
||||||
|
nameableList.addMouseListener(listMouseListener); |
||||||
|
nameableList.addListSelectionListener(new ListSelectionListener() { |
||||||
|
public void valueChanged(ListSelectionEvent evt) { |
||||||
|
// richie:避免多次update和populate大大降低效率
|
||||||
|
if (!evt.getValueIsAdjusting()) { |
||||||
|
// shoc 切换的时候加检验
|
||||||
|
if (hasInvalid(false)) { |
||||||
|
return; |
||||||
|
} |
||||||
|
((JControlUpdatePane) UIListControlPane.this.controlUpdatePane).update(); |
||||||
|
((JControlUpdatePane) UIListControlPane.this.controlUpdatePane).populate(); |
||||||
|
UIListControlPane.this.checkButtonEnabled(); |
||||||
|
} |
||||||
|
} |
||||||
|
}); |
||||||
|
} |
||||||
|
|
||||||
|
public UINameEdList createJNameList() { |
||||||
|
UINameEdList nameEdList = new UINameEdList(new DefaultListModel()) { |
||||||
|
@Override |
||||||
|
protected void doAfterLostFocus() { |
||||||
|
UIListControlPane.this.updateControlUpdatePane(); |
||||||
|
} |
||||||
|
}; |
||||||
|
nameEdList.setCellRenderer(new UINameableListCellRenderer(this)); |
||||||
|
return nameEdList; |
||||||
|
} |
||||||
|
|
||||||
|
public void updateControlUpdatePane() { |
||||||
|
((JControlUpdatePane) controlUpdatePane).update(); |
||||||
|
} |
||||||
|
|
||||||
|
protected void doWhenPopulate(BasicBeanPane beanPane) { |
||||||
|
|
||||||
|
} |
||||||
|
|
||||||
|
protected void doBeforePopulate(ListModelElement el, Object obj) { |
||||||
|
|
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
protected ShortCut4JControlPane addItemShortCut() { |
||||||
|
ShortCut addItemShortCut; |
||||||
|
NameableCreator[] creators = creators(); |
||||||
|
if (creators.length == 1) { |
||||||
|
addItemShortCut = new AddItemUpdateAction(creators); |
||||||
|
} else { |
||||||
|
addItemShortCut = new AddItemMenuDef(creators); |
||||||
|
} |
||||||
|
return new AbsoluteEnableShortCut(addItemShortCut); |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
protected ShortCut4JControlPane removeItemShortCut() { |
||||||
|
return new NormalEnableShortCut(new RemoveItemAction()); |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
protected ShortCut4JControlPane copyItemShortCut() { |
||||||
|
return new NormalEnableShortCut(new CopyItemAction()); |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
protected ShortCut4JControlPane moveUpItemShortCut() { |
||||||
|
return new NormalEnableShortCut(new MoveUpItemAction()); |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
protected ShortCut4JControlPane moveDownItemShortCut() { |
||||||
|
return new NormalEnableShortCut(new MoveDownItemAction()); |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
protected ShortCut4JControlPane sortItemShortCut() { |
||||||
|
return new NormalEnableShortCut(new SortItemAction()); |
||||||
|
} |
||||||
|
|
||||||
|
public void setNameListEditable(boolean editable) { |
||||||
|
this.nameableList.setEditable(editable); |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
public Nameable[] update() { |
||||||
|
java.util.List<Nameable> res = new java.util.ArrayList<Nameable>(); |
||||||
|
((JControlUpdatePane) this.controlUpdatePane).update(); |
||||||
|
DefaultListModel listModel = (DefaultListModel) this.nameableList.getModel(); |
||||||
|
for (int i = 0, len = listModel.getSize(); i < len; i++) { |
||||||
|
res.add(((ListModelElement) listModel.getElementAt(i)).wrapper); |
||||||
|
} |
||||||
|
|
||||||
|
return res.toArray(new Nameable[res.size()]); |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
public void populate(Nameable[] nameableArray) { |
||||||
|
DefaultListModel listModel = (DefaultListModel) this.nameableList.getModel(); |
||||||
|
listModel.removeAllElements(); |
||||||
|
if (ArrayUtils.isEmpty(nameableArray)) { |
||||||
|
return; |
||||||
|
} |
||||||
|
|
||||||
|
for (Nameable aNameableArray : nameableArray) { |
||||||
|
listModel.addElement(new ListModelElement(aNameableArray)); |
||||||
|
} |
||||||
|
|
||||||
|
if (listModel.size() > 0) { |
||||||
|
this.nameableList.setSelectedIndex(0); |
||||||
|
} |
||||||
|
this.checkButtonEnabled(); |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* 添加名字改变时的listener |
||||||
|
* |
||||||
|
* @param l 名字改变时的监听 |
||||||
|
*/ |
||||||
|
public void addModNameActionListener(ModNameActionListener l) { |
||||||
|
this.nameableList.addModNameActionListener(l); |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* 添加Editinglistener |
||||||
|
* |
||||||
|
* @param l 监听 |
||||||
|
*/ |
||||||
|
public void addEditingListner(PropertyChangeAdapter l) { |
||||||
|
this.nameableList.addEditingListner(l); |
||||||
|
} |
||||||
|
|
||||||
|
/* |
||||||
|
* 刷新当前的选中的UpdatePane |
||||||
|
*/ |
||||||
|
protected void populateSelectedValue() { |
||||||
|
((JControlUpdatePane) UIListControlPane.this.controlUpdatePane).populate(); |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* 根据name,选中UINameEdList中的item |
||||||
|
*/ |
||||||
|
public void setSelectedName(String name) { |
||||||
|
DefaultListModel listModel = (DefaultListModel) this.nameableList.getModel(); |
||||||
|
for (int i = 0, len = listModel.getSize(); i < len; i++) { |
||||||
|
Nameable item = ((ListModelElement) listModel.getElementAt(i)).wrapper; |
||||||
|
if (ComparatorUtils.equals(name, item.getName())) { |
||||||
|
this.nameableList.setSelectedIndex(i); |
||||||
|
break; |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
public String getEditingName() { |
||||||
|
return this.nameableList.getEditingName(); |
||||||
|
} |
||||||
|
|
||||||
|
public Object getEditingType() { |
||||||
|
return this.nameableList.getAllTypes()[editingIndex]; |
||||||
|
} |
||||||
|
|
||||||
|
public void setWarnigText(int index) { |
||||||
|
this.nameableList.setWarnigText(index); |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* 获取选中的名字 |
||||||
|
*/ |
||||||
|
public String getSelectedName() { |
||||||
|
ListModelElement el = (ListModelElement) this.nameableList.getSelectedValue(); |
||||||
|
|
||||||
|
return el == null ? null : el.wrapper.getName(); |
||||||
|
} |
||||||
|
|
||||||
|
protected boolean isNameRepeted(java.util.List[] list, String name) { |
||||||
|
for (int i = 0; i < list.length; i++) { |
||||||
|
if (list[i].contains(name)) { |
||||||
|
isNameRepeated = true; |
||||||
|
return true; |
||||||
|
} |
||||||
|
} |
||||||
|
isNameRepeated = false; |
||||||
|
return false; |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* 名字是否重复 |
||||||
|
* |
||||||
|
* @return 重复则返回true |
||||||
|
*/ |
||||||
|
public boolean isNameRepeated() { |
||||||
|
return isNameRepeated; |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* 添加 Nameable |
||||||
|
* |
||||||
|
* @param nameable 添加的Nameable |
||||||
|
* @param index 序号 |
||||||
|
*/ |
||||||
|
public void addNameable(Nameable nameable, int index) { |
||||||
|
UINameEdList nameEdList = UIListControlPane.this.nameableList; |
||||||
|
DefaultListModel model = (DefaultListModel) nameEdList.getModel(); |
||||||
|
|
||||||
|
ListModelElement el = new ListModelElement(nameable); |
||||||
|
model.add(index, el); |
||||||
|
nameableList.setSelectedIndex(index); |
||||||
|
nameableList.ensureIndexIsVisible(index); |
||||||
|
|
||||||
|
nameEdList.repaint(); |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* 是否重命名 |
||||||
|
* |
||||||
|
* @return 是则true |
||||||
|
*/ |
||||||
|
public boolean isContainsRename() { |
||||||
|
String rename = Inter.getLocText("FR-Please_Rename") + "!"; |
||||||
|
String[] names = this.nameableList.getAllNames(); |
||||||
|
for (int i = names.length - 1; i >= 0; i--) { |
||||||
|
if (ComparatorUtils.equals(names[i], rename)) { |
||||||
|
return true; |
||||||
|
} |
||||||
|
} |
||||||
|
return false; |
||||||
|
} |
||||||
|
|
||||||
|
protected DefaultListModel getModel() { |
||||||
|
return (DefaultListModel) UIListControlPane.this.nameableList.getModel(); |
||||||
|
} |
||||||
|
|
||||||
|
private String createUnrepeatedCopyName(String suffix) { |
||||||
|
DefaultListModel model = this.getModel(); |
||||||
|
String[] names = new String[model.getSize()]; |
||||||
|
for (int i = 0; i < model.size(); i++) { |
||||||
|
names[i] = ((ListModelElement) model.get(i)).wrapper.getName(); |
||||||
|
} |
||||||
|
String lastName = "CopyOf" + suffix; |
||||||
|
while (ArrayUtils.contains(names, lastName)) { |
||||||
|
lastName = "CopyOf" + lastName; |
||||||
|
} |
||||||
|
return lastName; |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
/** |
||||||
|
* 生成不重复的名字 |
||||||
|
* |
||||||
|
* @param prefix 名字前缀 |
||||||
|
* @return 名字 |
||||||
|
*/ |
||||||
|
@Override |
||||||
|
public String createUnrepeatedName(String prefix) { |
||||||
|
DefaultListModel model = this.getModel(); |
||||||
|
Nameable[] all = new Nameable[model.getSize()]; |
||||||
|
for (int i = 0; i < model.size(); i++) { |
||||||
|
all[i] = ((ListModelElement) model.get(i)).wrapper; |
||||||
|
} |
||||||
|
// richer:生成的名字从1开始. kunsnat: 添加属性从0开始.
|
||||||
|
int count = all.length + 1; |
||||||
|
while (true) { |
||||||
|
String name_test = prefix + count; |
||||||
|
boolean repeated = false; |
||||||
|
for (int i = 0, len = model.size(); i < len; i++) { |
||||||
|
Nameable nameable = all[i]; |
||||||
|
if (ComparatorUtils.equals(nameable.getName(), name_test)) { |
||||||
|
repeated = true; |
||||||
|
break; |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
if (!repeated) { |
||||||
|
return name_test; |
||||||
|
} |
||||||
|
|
||||||
|
count++; |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
private void popupEditPane() { |
||||||
|
if (editingIndex < 0) { |
||||||
|
return; |
||||||
|
} |
||||||
|
GUICoreUtils.showPopupMenu(popupEditPane, this, |
||||||
|
- popupEditPane.getPreferredSize().width, editingIndex * EDIT_RANGE); |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* 增加项的UpdateAction |
||||||
|
*/ |
||||||
|
protected class AddItemUpdateAction extends UpdateAction { |
||||||
|
final NameableCreator creator; |
||||||
|
|
||||||
|
public AddItemUpdateAction(NameableCreator[] creators) { |
||||||
|
this.creator = creators[0]; |
||||||
|
this.setName(Inter.getLocText("FR-Action_Add")); |
||||||
|
this.setMnemonic('A'); |
||||||
|
this.setSmallIcon(BaseUtils.readIcon("/com/fr/base/images/cell/control/add.png")); |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
public void actionPerformed(ActionEvent e) { |
||||||
|
Nameable nameable = creator.createNameable(UIListControlPane.this); |
||||||
|
|
||||||
|
UIListControlPane.this.addNameable(nameable, getModel().getSize()); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
/* |
||||||
|
* 增加项的MenuDef |
||||||
|
*/ |
||||||
|
protected class AddItemMenuDef extends MenuDef { |
||||||
|
public AddItemMenuDef(NameableCreator[] creators) { |
||||||
|
this.setName(Inter.getLocText("FR-Action_Add")); |
||||||
|
this.setMnemonic('A'); |
||||||
|
this.setIconPath("/com/fr/design/images/control/addPopup.png"); |
||||||
|
wrapActionListener(creators); |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* 生成UIButton |
||||||
|
* @return 菜单按钮 |
||||||
|
*/ |
||||||
|
public UIButton createUIButton() { |
||||||
|
createdButton = super.createUIButton(); |
||||||
|
// 此按钮单独抽出,不应使用工具栏外观
|
||||||
|
if (!createdButton.isOpaque()) { |
||||||
|
createdButton.setOpaque(true); |
||||||
|
createdButton.setNormalPainted(true); |
||||||
|
createdButton.setBorderPaintedOnlyWhenPressed(false); |
||||||
|
} |
||||||
|
return createdButton; |
||||||
|
} |
||||||
|
|
||||||
|
private void wrapActionListener(NameableCreator[] creators) { |
||||||
|
for (final NameableCreator creator : creators) { |
||||||
|
if (!whetherAdd(creator.menuName())) { |
||||||
|
continue; |
||||||
|
} |
||||||
|
boolean isTrue = ComparatorUtils.equals(creator.menuName(), Inter.getLocText("Datasource-Stored_Procedure")) || |
||||||
|
ComparatorUtils.equals(creator.menuName(), Inter.getLocText("DS-Relation_TableData")) || ComparatorUtils.equals(creator.menuName(), Inter.getLocText("DS-Multi_Dimensional_Database")); |
||||||
|
if (isTrue) { |
||||||
|
this.addShortCut(new LineSeparator()); |
||||||
|
} |
||||||
|
this.addShortCut(new UpdateAction() { |
||||||
|
{ |
||||||
|
this.setName(creator.menuName()); |
||||||
|
Icon icon = creator.menuIcon(); |
||||||
|
if (icon != null) { |
||||||
|
this.setSmallIcon(icon); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
public void actionPerformed(ActionEvent e) { |
||||||
|
if (hasInvalid(true)) { |
||||||
|
return; |
||||||
|
} |
||||||
|
|
||||||
|
Nameable nameable = creator.createNameable(UIListControlPane.this); |
||||||
|
|
||||||
|
UIListControlPane.this.addNameable(nameable, getModel().getSize()); |
||||||
|
} |
||||||
|
}); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
private boolean whetherAdd(String itemName) { |
||||||
|
JTemplate jTemplate = HistoryTemplateListPane.getInstance().getCurrentEditingTemplate(); |
||||||
|
if (jTemplate == null) { |
||||||
|
return false; |
||||||
|
} |
||||||
|
//先屏蔽掉这个,之后还有别的
|
||||||
|
String[] names = {Inter.getLocText("FR-Hyperlink_Chart_Float")}; |
||||||
|
for (String name : names) { |
||||||
|
if (!jTemplate.isJWorkBook() && ComparatorUtils.equals(itemName, name)) { |
||||||
|
return false; |
||||||
|
} |
||||||
|
} |
||||||
|
String formName = Inter.getLocText("Hyperlink-Form_link"); |
||||||
|
return !(jTemplate.isJWorkBook() && ComparatorUtils.equals(itemName, formName)); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
/* |
||||||
|
* 移除item |
||||||
|
*/ |
||||||
|
private class RemoveItemAction extends UpdateAction { |
||||||
|
public RemoveItemAction() { |
||||||
|
this.setName(Inter.getLocText("FR-Action_Remove")); |
||||||
|
this.setMnemonic('R'); |
||||||
|
this.setSmallIcon(BaseUtils |
||||||
|
.readIcon("/com/fr/base/images/cell/control/remove.png")); |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
public void actionPerformed(ActionEvent evt) { |
||||||
|
try { |
||||||
|
UIListControlPane.this.nameableList.getCellEditor() |
||||||
|
.stopCellEditing(); |
||||||
|
} catch (Exception ignored) { |
||||||
|
} |
||||||
|
// bug:在选中一个NameObject并删除,会遗留下Name.
|
||||||
|
doBeforeRemove(); |
||||||
|
if (GUICoreUtils.removeJListSelectedNodes(SwingUtilities |
||||||
|
.getWindowAncestor(UIListControlPane.this), nameableList)) { |
||||||
|
checkButtonEnabled(); |
||||||
|
doAfterRemove(); |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
/* |
||||||
|
* CopyItem |
||||||
|
*/ |
||||||
|
private class CopyItemAction extends UpdateAction { |
||||||
|
public CopyItemAction() { |
||||||
|
this.setName(Inter.getLocText("FR-Action_Copy")); |
||||||
|
this.setMnemonic('C'); |
||||||
|
this.setSmallIcon(BaseUtils |
||||||
|
.readIcon("/com/fr/base/images/cell/control/copy.png")); |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
public void actionPerformed(ActionEvent evt) { |
||||||
|
// p:选中的值.
|
||||||
|
ListModelElement selectedValue = (ListModelElement) nameableList.getSelectedValue(); |
||||||
|
if (selectedValue == null) { |
||||||
|
return; |
||||||
|
} |
||||||
|
|
||||||
|
((JControlUpdatePane) controlUpdatePane).update(); |
||||||
|
|
||||||
|
Nameable selectedNameable = selectedValue.wrapper; |
||||||
|
|
||||||
|
// p: 用反射机制实现
|
||||||
|
try { |
||||||
|
Nameable newNameable = (Nameable) BaseUtils.cloneObject(selectedNameable); |
||||||
|
newNameable.setName(createUnrepeatedCopyName(selectedNameable.getName())); |
||||||
|
|
||||||
|
UIListControlPane.this.addNameable(newNameable, nameableList.getSelectedIndex() + 1); |
||||||
|
} catch (Exception e) { |
||||||
|
FRContext.getLogger().error(e.getMessage(), e); |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
/* |
||||||
|
* 上移Item |
||||||
|
*/ |
||||||
|
private class MoveUpItemAction extends UpdateAction { |
||||||
|
public MoveUpItemAction() { |
||||||
|
this.setName(Inter.getLocText("Utils-Move_Up")); |
||||||
|
this.setMnemonic('U'); |
||||||
|
this.setSmallIcon(BaseUtils |
||||||
|
.readIcon("/com/fr/design/images/control/up.png")); |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
public void actionPerformed(ActionEvent evt) { |
||||||
|
int selectedIndex = nameableList.getSelectedIndex(); |
||||||
|
if (selectedIndex == -1) { |
||||||
|
return; |
||||||
|
} |
||||||
|
|
||||||
|
// 上移
|
||||||
|
if (selectedIndex > 0) { |
||||||
|
DefaultListModel listModel = (DefaultListModel) nameableList |
||||||
|
.getModel(); |
||||||
|
|
||||||
|
Object selecteObj1 = listModel.get(selectedIndex - 1); |
||||||
|
listModel.set(selectedIndex - 1, listModel.get(selectedIndex)); |
||||||
|
listModel.set(selectedIndex, selecteObj1); |
||||||
|
|
||||||
|
nameableList.setSelectedIndex(selectedIndex - 1); |
||||||
|
nameableList.ensureIndexIsVisible(selectedIndex - 1); |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
/* |
||||||
|
* 下移Item |
||||||
|
*/ |
||||||
|
private class MoveDownItemAction extends UpdateAction { |
||||||
|
public MoveDownItemAction() { |
||||||
|
this.setName(Inter.getLocText("Utils-Move_Down")); |
||||||
|
this.setMnemonic('D'); |
||||||
|
this.setSmallIcon(BaseUtils |
||||||
|
.readIcon("/com/fr/design/images/control/down.png")); |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
public void actionPerformed(ActionEvent evt) { |
||||||
|
int selectedIndex = nameableList.getSelectedIndex(); |
||||||
|
if (selectedIndex == -1) { |
||||||
|
return; |
||||||
|
} |
||||||
|
|
||||||
|
if (selectedIndex < nameableList.getModel().getSize() - 1) { |
||||||
|
DefaultListModel listModel = (DefaultListModel) nameableList |
||||||
|
.getModel(); |
||||||
|
|
||||||
|
Object selecteObj1 = listModel.get(selectedIndex + 1); |
||||||
|
listModel.set(selectedIndex + 1, listModel.get(selectedIndex)); |
||||||
|
listModel.set(selectedIndex, selecteObj1); |
||||||
|
|
||||||
|
nameableList.setSelectedIndex(selectedIndex + 1); |
||||||
|
nameableList.ensureIndexIsVisible(selectedIndex + 1); |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
private class SortItemAction extends UpdateAction { |
||||||
|
private boolean isAtoZ = false; |
||||||
|
|
||||||
|
public SortItemAction() { |
||||||
|
this.setName(Inter.getLocText("FR-Action_Sort")); |
||||||
|
this.setMnemonic('S'); |
||||||
|
this.setSmallIcon(BaseUtils |
||||||
|
.readIcon("/com/fr/design/images/control/sortAsc.png")); |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
public void actionPerformed(ActionEvent evt) { |
||||||
|
// p:选中的值.
|
||||||
|
Object selectedValue = nameableList.getSelectedValue(); |
||||||
|
|
||||||
|
DefaultListModel listModel = (DefaultListModel) nameableList |
||||||
|
.getModel(); |
||||||
|
Nameable[] nameableArray = new Nameable[listModel.getSize()]; |
||||||
|
if (nameableArray.length <= 0) { |
||||||
|
return; |
||||||
|
} |
||||||
|
|
||||||
|
for (int i = 0; i < listModel.getSize(); i++) { |
||||||
|
nameableArray[i] = ((ListModelElement) listModel.getElementAt(i)).wrapper; |
||||||
|
} |
||||||
|
|
||||||
|
// p:排序.
|
||||||
|
if (isAtoZ) { |
||||||
|
Comparator<Nameable> nameableComparator = new Comparator<Nameable>() { |
||||||
|
@Override |
||||||
|
public int compare(Nameable o1, Nameable o2) { |
||||||
|
return -ComparatorUtils.compare(o1.getName(), o2 |
||||||
|
.getName()); |
||||||
|
} |
||||||
|
}; |
||||||
|
isAtoZ = !isAtoZ; |
||||||
|
Arrays.sort(nameableArray, nameableComparator); |
||||||
|
} else { |
||||||
|
Comparator<Nameable> nameableComparator = new Comparator<Nameable>() { |
||||||
|
@Override |
||||||
|
public int compare(Nameable o1, Nameable o2) { |
||||||
|
return ComparatorUtils.compare(o1.getName(), o2 |
||||||
|
.getName()); |
||||||
|
} |
||||||
|
}; |
||||||
|
isAtoZ = !isAtoZ; |
||||||
|
Arrays.sort(nameableArray, nameableComparator); |
||||||
|
} |
||||||
|
|
||||||
|
for (int i = 0; i < nameableArray.length; i++) { |
||||||
|
listModel.set(i, new ListModelElement(nameableArray[i])); |
||||||
|
} |
||||||
|
|
||||||
|
// p:需要选中以前的那个值.
|
||||||
|
if (selectedValue != null) { |
||||||
|
nameableList.setSelectedValue(selectedValue, true); |
||||||
|
} |
||||||
|
|
||||||
|
checkButtonEnabled(); |
||||||
|
// p:需要repaint.
|
||||||
|
nameableList.repaint(); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
/* |
||||||
|
* UINameEdList的鼠标事件 |
||||||
|
*/ |
||||||
|
private MouseListener listMouseListener = new MouseAdapter() { |
||||||
|
@Override |
||||||
|
public void mouseReleased(MouseEvent evt) { |
||||||
|
nameableList.stopEditing(); |
||||||
|
if (evt.getClickCount() >= 2 |
||||||
|
&& SwingUtilities.isLeftMouseButton(evt) && evt.getX() > EDIT_RANGE) { |
||||||
|
editingIndex = nameableList.getSelectedIndex(); |
||||||
|
selectedName = nameableList.getNameAt(editingIndex); |
||||||
|
nameableList.editItemAt(nameableList.getSelectedIndex()); |
||||||
|
} else if (SwingUtilities.isLeftMouseButton(evt) && evt.getX() <= EDIT_RANGE) { |
||||||
|
editingIndex = nameableList.getSelectedIndex(); |
||||||
|
popupEditPane(); |
||||||
|
} |
||||||
|
|
||||||
|
// peter:处理右键的弹出菜单
|
||||||
|
if (!SwingUtilities.isRightMouseButton(evt)) { |
||||||
|
return; |
||||||
|
} |
||||||
|
|
||||||
|
// peter: 注意,在checkButtonEnabled()方法里面,设置了所有的Action的Enabled.
|
||||||
|
checkButtonEnabled(); |
||||||
|
|
||||||
|
// p:右键菜单.
|
||||||
|
JPopupMenu popupMenu = new JPopupMenu(); |
||||||
|
|
||||||
|
for (ShortCut4JControlPane sj : getShorts()) { |
||||||
|
sj.getShortCut().intoJPopupMenu(popupMenu); |
||||||
|
} |
||||||
|
|
||||||
|
// peter: 只有弹出菜单有子菜单的时候,才需要弹出来.
|
||||||
|
GUICoreUtils.showPopupMenu(popupMenu, nameableList, evt.getX() - 1, |
||||||
|
evt.getY() - 1); |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
public void mouseMoved(MouseEvent e) { |
||||||
|
|
||||||
|
} |
||||||
|
}; |
||||||
|
|
||||||
|
/** |
||||||
|
* 检查按钮可用状态 Check button enabled. |
||||||
|
*/ |
||||||
|
@Override |
||||||
|
public void checkButtonEnabled() { |
||||||
|
|
||||||
|
int selectedIndex = nameableList.getSelectedIndex(); |
||||||
|
if (selectedIndex == -1) { |
||||||
|
this.cardLayout.show(cardPane, "SELECT"); |
||||||
|
} else { |
||||||
|
this.cardLayout.show(cardPane, "EDIT"); |
||||||
|
} |
||||||
|
for (ShortCut4JControlPane sj : getShorts()) { |
||||||
|
sj.checkEnable(); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
public class AbsoluteEnableShortCut extends ShortCut4JControlPane { |
||||||
|
public AbsoluteEnableShortCut(ShortCut shortCut) { |
||||||
|
this.shortCut = shortCut; |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* 检查是否可用 |
||||||
|
*/ |
||||||
|
@Override |
||||||
|
public void checkEnable() { |
||||||
|
this.shortCut.setEnabled(true); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
public class NormalEnableShortCut extends ShortCut4JControlPane { |
||||||
|
public NormalEnableShortCut(ShortCut shortCut) { |
||||||
|
this.shortCut = shortCut; |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* 检查是否可用 |
||||||
|
*/ |
||||||
|
@Override |
||||||
|
public void checkEnable() { |
||||||
|
this.shortCut.setEnabled(getModel() |
||||||
|
.getSize() > 0 |
||||||
|
&& UIListControlPane.this.nameableList.getSelectedIndex() != -1); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
public class SortEnableShortCut extends ShortCut4JControlPane { |
||||||
|
public SortEnableShortCut(ShortCut shortCut) { |
||||||
|
this.shortCut = shortCut; |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* 检查是否可用 |
||||||
|
*/ |
||||||
|
@Override |
||||||
|
public void checkEnable() { |
||||||
|
this.shortCut.setEnabled(getModel().getSize() > 1); |
||||||
|
} |
||||||
|
|
||||||
|
} |
||||||
|
|
||||||
|
public class MoveUpEnableShortCut extends ShortCut4JControlPane { |
||||||
|
public MoveUpEnableShortCut(ShortCut shortCut) { |
||||||
|
this.shortCut = shortCut; |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* 检查是否可用 |
||||||
|
*/ |
||||||
|
@Override |
||||||
|
public void checkEnable() { |
||||||
|
this.shortCut.setEnabled(getModel().getSize() > 1 |
||||||
|
&& UIListControlPane.this.nameableList.getSelectedIndex() > 0); |
||||||
|
} |
||||||
|
|
||||||
|
} |
||||||
|
|
||||||
|
public class MoveDownEnableShortCut extends ShortCut4JControlPane { |
||||||
|
public MoveDownEnableShortCut(ShortCut shortCut) { |
||||||
|
this.shortCut = shortCut; |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* 检查是否可用 |
||||||
|
*/ |
||||||
|
@Override |
||||||
|
public void checkEnable() { |
||||||
|
this.shortCut.setEnabled(getModel().getSize() > 1 |
||||||
|
&& UIListControlPane.this.nameableList.getSelectedIndex() < UIListControlPane.this.nameableList.getModel().getSize() - 1); |
||||||
|
} |
||||||
|
|
||||||
|
} |
||||||
|
|
||||||
|
private class JControlUpdatePane extends JPanel { |
||||||
|
private CardLayout card; |
||||||
|
private JPanel cardPane; |
||||||
|
private BasicBeanPane[] updatePanes; |
||||||
|
|
||||||
|
private ListModelElement elEditing; |
||||||
|
|
||||||
|
public JControlUpdatePane() { |
||||||
|
initUpdatePane(); |
||||||
|
} |
||||||
|
|
||||||
|
private void initUpdatePane() { |
||||||
|
NameableCreator[] creators = creators(); |
||||||
|
if (creators == null) { |
||||||
|
return; |
||||||
|
} |
||||||
|
card = new CardLayout(); |
||||||
|
cardPane = FRGUIPaneFactory.createCardLayout_S_Pane(); |
||||||
|
cardPane.setLayout(card); |
||||||
|
this.setLayout(FRGUIPaneFactory.createBorderLayout()); |
||||||
|
this.add(cardPane); |
||||||
|
int len = creators.length; |
||||||
|
updatePanes = new BasicBeanPane[len]; |
||||||
|
} |
||||||
|
|
||||||
|
public void populate() { |
||||||
|
ListModelElement el = (ListModelElement) UIListControlPane.this.nameableList.getSelectedValue(); |
||||||
|
if (el == null) { |
||||||
|
return; |
||||||
|
} |
||||||
|
|
||||||
|
elEditing = el; |
||||||
|
NameableCreator[] creators = creators(); |
||||||
|
|
||||||
|
for (int i = 0, len = updatePanes.length; i < len; i++) { |
||||||
|
Object ob2Populate = creators[i].acceptObject2Populate(el.wrapper); |
||||||
|
if (ob2Populate != null) { |
||||||
|
if (updatePanes[i] == null) { |
||||||
|
if (isMulti(creators[i].getUpdatePane()) || isTree(creators[i].getUpdatePane())) { |
||||||
|
updatePanes[i] = createPaneByCreators(creators[i], el.wrapper.getName()); |
||||||
|
} else { |
||||||
|
updatePanes[i] = createPaneByCreators(creators[i]); |
||||||
|
} |
||||||
|
cardPane.add(updatePanes[i], String.valueOf(i)); |
||||||
|
} |
||||||
|
card.show(cardPane, String.valueOf(i)); |
||||||
|
doBeforePopulate(el, ob2Populate); |
||||||
|
updatePanes[i].populateBean(ob2Populate); |
||||||
|
doWhenPopulate(updatePanes[i]); |
||||||
|
break; |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
public boolean isMulti(Class _class) { |
||||||
|
return ComparatorUtils.equals(_class, GlobalMultiTDTableDataPane.class) || ComparatorUtils.equals(_class, MultiTDTableDataPane.class); |
||||||
|
} |
||||||
|
|
||||||
|
public boolean isTree(Class _class) { |
||||||
|
return ComparatorUtils.equals(_class, GlobalTreeTableDataPane.class) || ComparatorUtils.equals(_class, TreeTableDataPane.class); |
||||||
|
} |
||||||
|
|
||||||
|
public void update() { |
||||||
|
NameableCreator[] creators = creators(); |
||||||
|
for (int i = 0; i < updatePanes.length; i++) { |
||||||
|
BasicBeanPane pane = updatePanes[i]; |
||||||
|
|
||||||
|
if (pane != null && pane.isVisible()) { |
||||||
|
Object bean = pane.updateBean(); |
||||||
|
if (i < creators.length) { |
||||||
|
creators[i].saveUpdatedBean(elEditing, bean); |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
public void checkValid() throws Exception { |
||||||
|
if (updatePanes != null) { |
||||||
|
for (int i = 0; i < updatePanes.length; i++) { |
||||||
|
if (updatePanes[i] != null) { |
||||||
|
updatePanes[i].checkValid(); |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
protected BasicBeanPane createPaneByCreators(NameableCreator creator) { |
||||||
|
try { |
||||||
|
return creator.getUpdatePane().newInstance(); |
||||||
|
} catch (InstantiationException e) { |
||||||
|
throw new RuntimeException(e); |
||||||
|
} catch (IllegalAccessException e) { |
||||||
|
throw new RuntimeException(e); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
protected BasicBeanPane createPaneByCreators(NameableCreator creator, String string) { |
||||||
|
Constructor constructor = null; |
||||||
|
try { |
||||||
|
constructor = creator.getUpdatePane().getDeclaredConstructor(new Class[]{String.class}); |
||||||
|
constructor.setAccessible(true); |
||||||
|
return (BasicBeanPane) constructor.newInstance(string); |
||||||
|
} catch (NoSuchMethodException e) { |
||||||
|
throw new RuntimeException(e); |
||||||
|
} catch (InstantiationException e) { |
||||||
|
throw new RuntimeException(e); |
||||||
|
} catch (IllegalAccessException e) { |
||||||
|
throw new RuntimeException(e); |
||||||
|
} catch (InvocationTargetException e) { |
||||||
|
throw new RuntimeException(e); |
||||||
|
} |
||||||
|
|
||||||
|
} |
||||||
|
|
||||||
|
// 选项添加个数有限制等情况下 要求能控制快捷按钮的状态
|
||||||
|
protected void setToolbarDefEnable(int shortCutIndex, int itemIndex, boolean enabled) { |
||||||
|
ToolBarDef toolbarDef = getToolbarDef(); |
||||||
|
if (toolbarDef.getShortCutCount() > shortCutIndex) { |
||||||
|
ShortCut sc = toolbarDef.getShortCut(shortCutIndex); |
||||||
|
if (sc instanceof AddItemMenuDef) { |
||||||
|
AddItemMenuDef am = (AddItemMenuDef) sc; |
||||||
|
if (am.getShortCutCount() > itemIndex) { |
||||||
|
am.getShortCut(itemIndex).setEnabled(enabled); |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* 检查是否符合规范 |
||||||
|
* |
||||||
|
* @throws Exception |
||||||
|
*/ |
||||||
|
@Override |
||||||
|
public void checkValid() throws Exception { |
||||||
|
((JControlUpdatePane) this.controlUpdatePane).checkValid(); |
||||||
|
} |
||||||
|
|
||||||
|
private int getInValidIndex() { |
||||||
|
BasicBeanPane[] p = ((JControlUpdatePane) controlUpdatePane).updatePanes; |
||||||
|
if (p != null) { |
||||||
|
for (int i = 0; i < p.length; i++) { |
||||||
|
if (p[i] != null) { |
||||||
|
try { |
||||||
|
p[i].checkValid(); |
||||||
|
} catch (Exception e) { |
||||||
|
return i; |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
return -1; |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
protected boolean hasInvalid(boolean isAdd) { |
||||||
|
int idx = UIListControlPane.this.getInValidIndex(); |
||||||
|
if (isAdd || nameableList.getSelectedIndex() != idx) { |
||||||
|
try { |
||||||
|
checkValid(); |
||||||
|
} catch (Exception exp) { |
||||||
|
JOptionPane.showMessageDialog(UIListControlPane.this, exp.getMessage()); |
||||||
|
nameableList.setSelectedIndex(idx); |
||||||
|
return true; |
||||||
|
} |
||||||
|
} |
||||||
|
return false; |
||||||
|
} |
||||||
|
/** |
||||||
|
* 设置选中项 |
||||||
|
* |
||||||
|
* @param index 选中项的序列号 |
||||||
|
*/ |
||||||
|
public void setSelectedIndex(int index) { |
||||||
|
nameableList.setSelectedIndex(index); |
||||||
|
} |
||||||
|
|
||||||
|
} |
@ -0,0 +1,162 @@ |
|||||||
|
package com.fr.design.gui.controlpane; |
||||||
|
|
||||||
|
import com.fr.base.BaseUtils; |
||||||
|
import com.fr.design.gui.ibutton.UIButton; |
||||||
|
import com.fr.design.gui.ilable.UILabel; |
||||||
|
import com.fr.design.gui.ilist.ListModelElement; |
||||||
|
import com.fr.design.gui.itextfield.UITextField; |
||||||
|
import com.fr.design.utils.gui.GUICoreUtils; |
||||||
|
import com.fr.stable.Nameable; |
||||||
|
import sun.swing.DefaultLookup; |
||||||
|
|
||||||
|
import javax.swing.*; |
||||||
|
import javax.swing.border.Border; |
||||||
|
import javax.swing.border.EmptyBorder; |
||||||
|
import java.awt.*; |
||||||
|
import java.awt.event.ActionEvent; |
||||||
|
import java.awt.event.ActionListener; |
||||||
|
|
||||||
|
/** |
||||||
|
* Nameable的ListCellRenerer |
||||||
|
* Created by plough on 2017/7/21. |
||||||
|
*/ |
||||||
|
|
||||||
|
public class UINameableListCellRenderer extends |
||||||
|
JPanel implements ListCellRenderer { |
||||||
|
private static final Border SAFE_NO_FOCUS_BORDER = new EmptyBorder(1, 1, 1, 1); |
||||||
|
private static final Border DEFAULT_NO_FOCUS_BORDER = new EmptyBorder(1, 1, 1, 1); |
||||||
|
private static final Color BORDER_COLOR = new Color(201, 198, 184); |
||||||
|
protected static Border noFocusBorder = DEFAULT_NO_FOCUS_BORDER; |
||||||
|
private static final int BUTTON_WIDTH = 25; |
||||||
|
private UILabel editButton; // "编辑按钮",实际上是一个 UILabel,由列表项(UIListControlPane)统一处理点击事件
|
||||||
|
private UILabel label; |
||||||
|
private UIListControlPane listControlPane; |
||||||
|
|
||||||
|
public UINameableListCellRenderer(UIListControlPane listControlPane) { |
||||||
|
super(); |
||||||
|
this.listControlPane = listControlPane; |
||||||
|
initComponents(); |
||||||
|
setOpaque(true); |
||||||
|
setBorder(getNoFocusBorder()); |
||||||
|
setName("List.cellRenderer"); |
||||||
|
} |
||||||
|
|
||||||
|
private void initComponents() { |
||||||
|
editButton = new UILabel() { |
||||||
|
public Dimension getPreferredSize() { |
||||||
|
return new Dimension(BUTTON_WIDTH, BUTTON_WIDTH); |
||||||
|
} |
||||||
|
}; |
||||||
|
// editButton.set4LargeToolbarButton();
|
||||||
|
editButton.setIcon(BaseUtils.readIcon("/com/fr/base/images/cell/control/add.png")); |
||||||
|
editButton.setBorder(BorderFactory.createMatteBorder(0, 0, 0, 1, BORDER_COLOR)); |
||||||
|
editButton.setHorizontalAlignment(SwingConstants.CENTER); |
||||||
|
// editButton.addActionListener(new ActionListener() {
|
||||||
|
// @Override
|
||||||
|
// public void actionPerformed(ActionEvent e) {
|
||||||
|
// popupEditPane();
|
||||||
|
// }
|
||||||
|
// });
|
||||||
|
label = new UILabel(); |
||||||
|
label.setBorder(BorderFactory.createEmptyBorder(0, 10, 0, 0)); |
||||||
|
// label.setEditable(false);
|
||||||
|
this.setLayout(new BorderLayout()); |
||||||
|
this.add(editButton, BorderLayout.WEST); |
||||||
|
this.add(label, BorderLayout.CENTER); |
||||||
|
} |
||||||
|
|
||||||
|
private Border getNoFocusBorder() { |
||||||
|
// return BorderFactory.createLineBorder(new Color(201, 198, 184));
|
||||||
|
return BorderFactory.createMatteBorder(0, 0, 1, 0, BORDER_COLOR); |
||||||
|
// Border border = DefaultLookup.getBorder(this, ui, "List.cellNoFocusBorder");
|
||||||
|
// if (System.getSecurityManager() != null) {
|
||||||
|
// if (border != null) return border;
|
||||||
|
// return SAFE_NO_FOCUS_BORDER;
|
||||||
|
// } else {
|
||||||
|
// if (border != null &&
|
||||||
|
// (noFocusBorder == null ||
|
||||||
|
// noFocusBorder == DEFAULT_NO_FOCUS_BORDER)) {
|
||||||
|
// return border;
|
||||||
|
// }
|
||||||
|
// return noFocusBorder;
|
||||||
|
// }
|
||||||
|
} |
||||||
|
|
||||||
|
private void setText(String t) { |
||||||
|
label.setText(t); |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
public Component getListCellRendererComponent(JList list, Object value, |
||||||
|
int index, boolean isSelected, boolean cellHasFocus) { |
||||||
|
setComponentOrientation(list.getComponentOrientation()); |
||||||
|
|
||||||
|
Color bg = null; |
||||||
|
Color fg = null; |
||||||
|
|
||||||
|
JList.DropLocation dropLocation = list.getDropLocation(); |
||||||
|
if (dropLocation != null |
||||||
|
&& !dropLocation.isInsert() |
||||||
|
&& dropLocation.getIndex() == index) { |
||||||
|
|
||||||
|
bg = DefaultLookup.getColor(this, ui, "List.dropCellBackground"); |
||||||
|
fg = DefaultLookup.getColor(this, ui, "List.dropCellForeground"); |
||||||
|
|
||||||
|
isSelected = true; |
||||||
|
} |
||||||
|
|
||||||
|
if (isSelected) { |
||||||
|
setBackground(bg == null ? list.getSelectionBackground() : bg); |
||||||
|
setForeground(fg == null ? list.getSelectionForeground() : fg); |
||||||
|
} |
||||||
|
else { |
||||||
|
setBackground(list.getBackground()); |
||||||
|
setForeground(list.getForeground()); |
||||||
|
} |
||||||
|
|
||||||
|
// if (value instanceof Icon) {
|
||||||
|
// setIcon((Icon)value);
|
||||||
|
// setText("");
|
||||||
|
// }
|
||||||
|
// else {
|
||||||
|
// setIcon(null);
|
||||||
|
setText((value == null) ? "" : value.toString()); |
||||||
|
// }
|
||||||
|
|
||||||
|
setEnabled(list.isEnabled()); |
||||||
|
setFont(list.getFont()); |
||||||
|
|
||||||
|
Border border = null; |
||||||
|
if (cellHasFocus) { |
||||||
|
if (isSelected) { |
||||||
|
border = DefaultLookup.getBorder(this, ui, "List.focusSelectedCellHighlightBorder"); |
||||||
|
} |
||||||
|
if (border == null) { |
||||||
|
border = DefaultLookup.getBorder(this, ui, "List.focusCellHighlightBorder"); |
||||||
|
} |
||||||
|
} else { |
||||||
|
border = getNoFocusBorder(); |
||||||
|
} |
||||||
|
setBorder(border); |
||||||
|
|
||||||
|
if (value instanceof ListModelElement) { |
||||||
|
Nameable wrappee = ((ListModelElement) value).wrapper; |
||||||
|
this.setText(((ListModelElement) value).wrapper.getName()); |
||||||
|
|
||||||
|
boolean iconSet = false; |
||||||
|
for (NameableCreator creator : listControlPane.creators()) { |
||||||
|
if (creator.menuIcon() != null && creator.acceptObject2Populate(wrappee) != null) { |
||||||
|
// this.setIcon(creator.menuIcon());
|
||||||
|
this.setToolTipText(creator.createTooltip()); |
||||||
|
iconSet = true; |
||||||
|
break; |
||||||
|
} |
||||||
|
} |
||||||
|
// if (!iconSet) {
|
||||||
|
// this.setIcon(BaseUtils.readIcon("/com/fr/base/images/oem/cpt.png"));
|
||||||
|
// }
|
||||||
|
} |
||||||
|
|
||||||
|
return this; |
||||||
|
} |
||||||
|
} |
@ -0,0 +1,398 @@ |
|||||||
|
package com.fr.design.gui.ilist; |
||||||
|
|
||||||
|
import com.fr.base.Utils; |
||||||
|
import com.fr.design.gui.itextfield.UITextField; |
||||||
|
import com.fr.general.Inter; |
||||||
|
import com.fr.general.NameObject; |
||||||
|
import com.fr.stable.Nameable; |
||||||
|
import com.fr.stable.StringUtils; |
||||||
|
import com.fr.stable.core.PropertyChangeAdapter; |
||||||
|
|
||||||
|
import javax.swing.*; |
||||||
|
import javax.swing.event.CellEditorListener; |
||||||
|
import javax.swing.event.ChangeEvent; |
||||||
|
import java.awt.*; |
||||||
|
import java.awt.event.FocusEvent; |
||||||
|
import java.awt.event.FocusListener; |
||||||
|
import java.awt.event.MouseAdapter; |
||||||
|
import java.awt.event.MouseEvent; |
||||||
|
import java.util.ArrayList; |
||||||
|
import java.util.Vector; |
||||||
|
|
||||||
|
/** |
||||||
|
* Created by plough on 2017/7/23. |
||||||
|
*/ |
||||||
|
public class UINameEdList extends UIList implements CellEditorListener { |
||||||
|
private static final int TEST_LIST_LENTH = 20; |
||||||
|
private static final int BUTTON_WIDTH = 25; |
||||||
|
private boolean editable = true; |
||||||
|
|
||||||
|
// kunsnat: 是否强制ListName是数字 (int型)
|
||||||
|
private boolean isNameShouldNumber = false; |
||||||
|
|
||||||
|
transient protected ListCellEditor cellEditor; |
||||||
|
transient protected Component editorComp; |
||||||
|
transient protected int editingIndex; |
||||||
|
private PropertyChangeAdapter editingListner; |
||||||
|
private java.util.List<ModNameActionListener> ll = new ArrayList<ModNameActionListener>(); |
||||||
|
|
||||||
|
public UINameEdList(ListModel dataModel) { |
||||||
|
super(dataModel); |
||||||
|
} |
||||||
|
|
||||||
|
public UINameEdList(final Object[] listData) { |
||||||
|
super(listData); |
||||||
|
} |
||||||
|
|
||||||
|
public UINameEdList(final Vector<?> listData) { |
||||||
|
super(listData); |
||||||
|
} |
||||||
|
|
||||||
|
public UINameEdList() { |
||||||
|
super(); |
||||||
|
} |
||||||
|
|
||||||
|
/* |
||||||
|
* Sets是否可编辑 |
||||||
|
*/ |
||||||
|
public void setEditable(boolean editable) { |
||||||
|
this.editable = editable; |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* 是否可编辑 |
||||||
|
* |
||||||
|
* @return 是则返回true |
||||||
|
*/ |
||||||
|
public boolean isEditable() { |
||||||
|
return this.editable; |
||||||
|
} |
||||||
|
|
||||||
|
public void setNameShouldNumber(boolean isNameShouldNumber) { |
||||||
|
this.isNameShouldNumber = isNameShouldNumber; |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* 是否强制ListName是数字 (int型) |
||||||
|
* |
||||||
|
* @return 是则返回true |
||||||
|
*/ |
||||||
|
public boolean isNameShouldNumber() { |
||||||
|
return isNameShouldNumber; |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* 添加名字改变时的listener |
||||||
|
* |
||||||
|
* @param l 监听器 |
||||||
|
*/ |
||||||
|
public void addModNameActionListener(ModNameActionListener l) { |
||||||
|
ll.add(l); |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* 编辑时的监听器 |
||||||
|
* |
||||||
|
* @param l 监听器 |
||||||
|
*/ |
||||||
|
public void addEditingListner(PropertyChangeAdapter l) { |
||||||
|
this.editingListner = l; |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* 移除某名字改变时的listener |
||||||
|
* |
||||||
|
* @param l 监听器 |
||||||
|
*/ |
||||||
|
public void removeModNameActionListener(ModNameActionListener l) { |
||||||
|
ll.remove(l); |
||||||
|
} |
||||||
|
|
||||||
|
public ListCellEditor getCellEditor() { |
||||||
|
if (cellEditor == null) { |
||||||
|
UITextField editField = new UITextField(); |
||||||
|
if (editingListner != null) { |
||||||
|
editField.addFocusListener(new FocusListener() { |
||||||
|
|
||||||
|
@Override |
||||||
|
public void focusLost(FocusEvent e) { |
||||||
|
editingListner.propertyChange(); |
||||||
|
|
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
public void focusGained(FocusEvent e) { |
||||||
|
// TODO Auto-generated method stub
|
||||||
|
|
||||||
|
} |
||||||
|
}); |
||||||
|
} |
||||||
|
cellEditor = new DefaultListCellEditor(editField) { |
||||||
|
public boolean stopCellEditing() { |
||||||
|
boolean isTrue = super.stopCellEditing(); |
||||||
|
stopEditing(); |
||||||
|
|
||||||
|
return isTrue; |
||||||
|
} |
||||||
|
}; |
||||||
|
cellEditor.addCellEditorListener(this); |
||||||
|
} |
||||||
|
|
||||||
|
return cellEditor; |
||||||
|
} |
||||||
|
|
||||||
|
protected void doAfterLostFocus() { |
||||||
|
|
||||||
|
} |
||||||
|
|
||||||
|
public void setCellEditor(ListCellEditor editor) { |
||||||
|
this.cellEditor = editor; |
||||||
|
} |
||||||
|
|
||||||
|
/* |
||||||
|
* 取得index节点的名字 |
||||||
|
*/ |
||||||
|
public String getNameAt(int index) { |
||||||
|
Nameable nameable = ((ListModelElement) getModel().getElementAt(index)).wrapper; |
||||||
|
if (nameable != null) { |
||||||
|
return nameable.getName(); |
||||||
|
} |
||||||
|
|
||||||
|
return null; |
||||||
|
} |
||||||
|
|
||||||
|
public Object getType(int index) { |
||||||
|
Nameable nameable = ((ListModelElement) getModel().getElementAt(index)).wrapper; |
||||||
|
if (nameable != null && nameable instanceof NameObject) { |
||||||
|
return ((NameObject) nameable).getObject(); |
||||||
|
} |
||||||
|
return null; |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
public void setWarnigText() { |
||||||
|
setWarnigText(this.getSelectedIndex()); |
||||||
|
} |
||||||
|
|
||||||
|
public void setWarnigText(int index) { |
||||||
|
setNameAt(Inter.getLocText("Please_Rename") + "!", index); |
||||||
|
this.repaint(); |
||||||
|
} |
||||||
|
|
||||||
|
/* |
||||||
|
* 设置index节点的名字 |
||||||
|
*/ |
||||||
|
// b:edit改变name的时候怎么办?
|
||||||
|
public void setNameAt(String name, int index) { |
||||||
|
Nameable nameable = ((ListModelElement) getModel().getElementAt(index)).wrapper; |
||||||
|
if (nameable != null) { |
||||||
|
String oldName = nameable.getName(); |
||||||
|
|
||||||
|
if (isNameShouldNumber()) { |
||||||
|
// kunsnat: 限制只能是数字(int型)
|
||||||
|
Number number = Utils.string2Number(name); |
||||||
|
if (number == null) { |
||||||
|
nameable.setName(oldName); |
||||||
|
} else { |
||||||
|
int newName = number.intValue(); |
||||||
|
nameable.setName(String.valueOf(newName)); |
||||||
|
} |
||||||
|
} else { |
||||||
|
nameable.setName(name); |
||||||
|
} |
||||||
|
|
||||||
|
for (int i = 0, len = ll.size(); i < len; i++) { |
||||||
|
ll.get(i).nameModed(index, oldName, name); |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
/* |
||||||
|
* 编辑第index个item |
||||||
|
*/ |
||||||
|
private String oldName; |
||||||
|
|
||||||
|
/** |
||||||
|
* 编辑第index项 |
||||||
|
* |
||||||
|
* @param index 序号 |
||||||
|
* @return 成功返回true |
||||||
|
*/ |
||||||
|
public boolean editItemAt(int index) { |
||||||
|
// 如果不可编辑,返回
|
||||||
|
if (!this.editable) { |
||||||
|
return false; |
||||||
|
} |
||||||
|
|
||||||
|
if (cellEditor != null && !cellEditor.stopCellEditing()) { |
||||||
|
return false; |
||||||
|
} |
||||||
|
if (index < 0 || index >= this.getModel().getSize()) { |
||||||
|
return false; |
||||||
|
} |
||||||
|
|
||||||
|
ListCellEditor editor = getCellEditor(); |
||||||
|
Object value = editor.getCellEditorValue(); |
||||||
|
if (!StringUtils.isBlank(value.toString())) { |
||||||
|
oldName = value.toString(); |
||||||
|
} |
||||||
|
editorComp = prepareEditor(editor, index); |
||||||
|
if (editorComp == null) { |
||||||
|
return false; |
||||||
|
} |
||||||
|
Rectangle rect = this.getCellBounds(index, index); |
||||||
|
// alex:所有的UINameEdList都有Icon,空出前面20 * 20的位置就是放的Icon
|
||||||
|
rect.setRect(createRect(rect, BUTTON_WIDTH)); |
||||||
|
|
||||||
|
editorComp.setBounds(rect); |
||||||
|
add(editorComp); |
||||||
|
editorComp.validate(); |
||||||
|
editorComp.requestFocus(); |
||||||
|
if (editorComp instanceof UITextField) { |
||||||
|
((UITextField) editorComp).selectAll(); |
||||||
|
} |
||||||
|
|
||||||
|
setEditingIndex(index); |
||||||
|
|
||||||
|
return true; |
||||||
|
} |
||||||
|
|
||||||
|
public Rectangle createRect(Rectangle rect, int iconWidth) { |
||||||
|
return new Rectangle(rect.x + iconWidth, rect.y, rect.width - iconWidth, rect.height); |
||||||
|
} |
||||||
|
|
||||||
|
public String getEditingName() { |
||||||
|
return (String) getCellEditor().getCellEditorValue(); |
||||||
|
} |
||||||
|
|
||||||
|
/* |
||||||
|
* 根据ListCellEditor取得编辑器的Component |
||||||
|
*/ |
||||||
|
private Component prepareEditor(ListCellEditor cellEditor, int index) { |
||||||
|
String name = getNameAt(index); |
||||||
|
boolean isSelected = this.isSelectedIndex(index); |
||||||
|
Component comp = cellEditor.getListCellEditorComponent(this, name, isSelected, index); |
||||||
|
|
||||||
|
return comp; |
||||||
|
} |
||||||
|
|
||||||
|
/* |
||||||
|
* 记录正在编辑的index |
||||||
|
*/ |
||||||
|
private void setEditingIndex(int idx) { |
||||||
|
editingIndex = idx; |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* 编辑取消 |
||||||
|
* |
||||||
|
* @param e 事件 |
||||||
|
*/ |
||||||
|
public void editingCanceled(ChangeEvent e) { |
||||||
|
removeComp(); |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* 编辑结束 |
||||||
|
* |
||||||
|
* @param e 事件 |
||||||
|
*/ |
||||||
|
public void editingStopped(ChangeEvent e) { |
||||||
|
doAfterLostFocus(); |
||||||
|
stopEditing(); |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* 停止编辑事件 |
||||||
|
*/ |
||||||
|
public void stopEditing() { |
||||||
|
ListCellEditor editor = getCellEditor(); |
||||||
|
if (editor != null && editorComp != null) { |
||||||
|
Object value = editor.getCellEditorValue(); |
||||||
|
String name = StringUtils.isBlank(value.toString()) ? oldName : value.toString(); |
||||||
|
setNameAt(name, editingIndex); |
||||||
|
removeComp(); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
public String[] getAllNames() { |
||||||
|
int length = this.getModel().getSize(); |
||||||
|
String[] names = new String[length]; |
||||||
|
for (int i = 0; i < length; i++) { |
||||||
|
names[i] = getNameAt(i); |
||||||
|
} |
||||||
|
return names; |
||||||
|
} |
||||||
|
|
||||||
|
public Object[] getAllTypes() { |
||||||
|
int length = this.getModel().getSize(); |
||||||
|
Object[] types = new Object[length]; |
||||||
|
for (int i = 0; i < length; i++) { |
||||||
|
types[i] = getType(i); |
||||||
|
} |
||||||
|
return types; |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
/* |
||||||
|
* 移除编辑器的Component |
||||||
|
*/ |
||||||
|
private void removeComp() { |
||||||
|
if (editorComp != null) { |
||||||
|
remove(editorComp); |
||||||
|
} |
||||||
|
Rectangle cellRect = this.getCellBounds(editingIndex, editingIndex); |
||||||
|
setEditingIndex(-1); |
||||||
|
editorComp = null; |
||||||
|
repaint(cellRect); |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* 主函数 |
||||||
|
* |
||||||
|
* @param args 参数 |
||||||
|
*/ |
||||||
|
public static void main(String... args) { |
||||||
|
JFrame f = new JFrame(); |
||||||
|
JPanel c = (JPanel) f.getContentPane(); |
||||||
|
c.setLayout(new BorderLayout()); |
||||||
|
ListModelElement[] data = new ListModelElement[TEST_LIST_LENTH]; |
||||||
|
for (int i = 0; i < TEST_LIST_LENTH; i++) { |
||||||
|
data[i] = new ListModelElement(new NameObject(i + 1 + "", i)); |
||||||
|
} |
||||||
|
final UINameEdList list = new UINameEdList(data); |
||||||
|
list.setEditable(true); |
||||||
|
list.addMouseListener(new MouseAdapter() { |
||||||
|
public void mouseReleased(MouseEvent evt) { |
||||||
|
list.stopEditing(); |
||||||
|
if (evt.getClickCount() >= 2 |
||||||
|
&& SwingUtilities.isLeftMouseButton(evt)) { |
||||||
|
list.editItemAt(list.getSelectedIndex()); |
||||||
|
} |
||||||
|
} |
||||||
|
}) |
||||||
|
; |
||||||
|
|
||||||
|
list.setCellEditor(new DefaultListCellEditor(new UITextField())); |
||||||
|
list.setCellRenderer(new NameableListCellRenderer()); |
||||||
|
c.add(list, BorderLayout.CENTER); |
||||||
|
f.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE); |
||||||
|
f.setSize(400, 600); |
||||||
|
f.setVisible(true); |
||||||
|
} |
||||||
|
|
||||||
|
private static class NameableListCellRenderer extends DefaultListCellRenderer { |
||||||
|
@Override |
||||||
|
public Component getListCellRendererComponent(JList list, Object value, int index, boolean isSelected, |
||||||
|
boolean cellHasFocus) { |
||||||
|
super.getListCellRendererComponent(list, value, index, isSelected, cellHasFocus); |
||||||
|
|
||||||
|
if (value instanceof Nameable) { |
||||||
|
Nameable wrappee = (Nameable) value; |
||||||
|
this.setText(wrappee.getName()); |
||||||
|
} |
||||||
|
return this; |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
} |
@ -0,0 +1,370 @@ |
|||||||
|
package com.fr.design.mainframe; |
||||||
|
|
||||||
|
import com.fr.base.BaseUtils; |
||||||
|
import com.fr.design.gui.ibutton.UIButton; |
||||||
|
import com.fr.design.gui.ibutton.UIRadioButton; |
||||||
|
import com.fr.design.gui.ilable.UILabel; |
||||||
|
import com.fr.design.gui.islider.UISlider; |
||||||
|
import com.fr.design.gui.ispinner.UIBasicSpinner; |
||||||
|
import com.fr.design.gui.itextfield.UITextField; |
||||||
|
import com.fr.design.layout.TableLayout; |
||||||
|
import com.fr.design.layout.TableLayoutHelper; |
||||||
|
import com.fr.design.utils.gui.GUICoreUtils; |
||||||
|
import com.fr.general.Inter; |
||||||
|
|
||||||
|
import javax.swing.*; |
||||||
|
import javax.swing.border.MatteBorder; |
||||||
|
import javax.swing.event.ChangeEvent; |
||||||
|
import javax.swing.event.ChangeListener; |
||||||
|
import java.awt.*; |
||||||
|
import java.awt.event.ActionEvent; |
||||||
|
import java.awt.event.ActionListener; |
||||||
|
import java.awt.event.ItemEvent; |
||||||
|
import java.awt.event.ItemListener; |
||||||
|
import java.math.BigDecimal; |
||||||
|
|
||||||
|
/** |
||||||
|
* Created by MoMeak on 2017/7/13. |
||||||
|
*/ |
||||||
|
public class JFormSliderPane extends JPanel { |
||||||
|
|
||||||
|
private static final double ONEPOINTEIGHT = 1.8; |
||||||
|
private static final int SIX = 6; |
||||||
|
private static final int TEN = 10; |
||||||
|
private static final int ONE_EIGHT = 18; |
||||||
|
private static final int FONT_SIZE = 14; |
||||||
|
private static final int SPINNER_WIDTH = 45; |
||||||
|
private static final int SPINNER_HEIGHT = 20; |
||||||
|
private static final int HALF_HUNDRED = 50; |
||||||
|
private static final int HUNDRED = 100; |
||||||
|
private static final int TWO_HUNDRED = 200; |
||||||
|
private static final int THREE_HUNDRED = 300; |
||||||
|
private static final int FOUR_HUNDRED = 400; |
||||||
|
private static final int DIALOG_WIDTH = 150; |
||||||
|
private static final int DIALOG_HEIGHT = 240; |
||||||
|
private static final int SHOWVALBUTTON_WIDTH = 70; |
||||||
|
private static final int SHOWVALBUTTON_HEIGHTH = 25; |
||||||
|
public int showValue = 100; |
||||||
|
public double resolutionTimes = 1.0; |
||||||
|
private static JFormSliderPane THIS; |
||||||
|
private UITextField showVal; |
||||||
|
private JSpinner showValSpinner; |
||||||
|
private UISlider slider; |
||||||
|
private int times; |
||||||
|
private int sliderValue; |
||||||
|
private UIButton downButton; |
||||||
|
private UIButton upButton; |
||||||
|
private UIButton showValButton; |
||||||
|
private UIRadioButton twoHundredButton; |
||||||
|
private UIRadioButton oneHundredButton; |
||||||
|
private UIRadioButton SevenFiveButton; |
||||||
|
private UIRadioButton fiveTenButton; |
||||||
|
private UIRadioButton twoFiveButton; |
||||||
|
private UIRadioButton selfAdaptButton; |
||||||
|
private UIRadioButton customButton; |
||||||
|
//拖动条处理和button、直接输入不一样
|
||||||
|
private boolean isButtonOrIsTxt = true; |
||||||
|
private FormPopupPane dialog; |
||||||
|
private int upButtonX; |
||||||
|
private JPanel dialogContentPanel; |
||||||
|
|
||||||
|
|
||||||
|
public JFormSliderPane() { |
||||||
|
this.setLayout(new BorderLayout()); |
||||||
|
slider = new UISlider(0, HUNDRED, HALF_HUNDRED); |
||||||
|
slider.setUI(new JSliderPaneUI(slider)); |
||||||
|
slider.addChangeListener(listener); |
||||||
|
|
||||||
|
showValSpinner = new UIBasicSpinner(new SpinnerNumberModel(HUNDRED, TEN, FOUR_HUNDRED, 1)); |
||||||
|
showValSpinner.setEnabled(true); |
||||||
|
showValSpinner.addChangeListener(showValSpinnerChangeListener); |
||||||
|
showValSpinner.setPreferredSize(new Dimension(SPINNER_WIDTH, SPINNER_HEIGHT)); |
||||||
|
//MoMeak:控制只能输入10-400,但是用起来感觉不舒服,先注释掉吧
|
||||||
|
// JSpinner.NumberEditor editor = new JSpinner.NumberEditor(showValSpinner, "0");
|
||||||
|
// showValSpinner.setEditor(editor);
|
||||||
|
// JFormattedTextField textField = ((JSpinner.NumberEditor) showValSpinner.getEditor()).getTextField();
|
||||||
|
// textField.setEditable(true);
|
||||||
|
// DefaultFormatterFactory factory = (DefaultFormatterFactory) textField .getFormatterFactory();
|
||||||
|
// NumberFormatter formatter = (NumberFormatter) factory.getDefaultFormatter();
|
||||||
|
// formatter.setAllowsInvalid(false);
|
||||||
|
downButton = new UIButton(BaseUtils.readIcon("com/fr/design/images/data/source/moveDown.png")); |
||||||
|
upButton = new UIButton(BaseUtils.readIcon("com/fr/design/images/data/source/moveUp.png")); |
||||||
|
downButton.setActionCommand("less"); |
||||||
|
upButton.setActionCommand("more"); |
||||||
|
downButton.addActionListener(buttonActionListener); |
||||||
|
upButton.addActionListener(buttonActionListener); |
||||||
|
|
||||||
|
showValButton = new UIButton(showValSpinner.getValue() + "%"); |
||||||
|
showValButton.setBorderPainted(false); |
||||||
|
showValButton.setPreferredSize(new Dimension(SHOWVALBUTTON_WIDTH, SHOWVALBUTTON_HEIGHTH)); |
||||||
|
showValButton.addActionListener(showValButtonActionListener); |
||||||
|
|
||||||
|
initUIRadioButton(); |
||||||
|
initPane(); |
||||||
|
JPanel panel = new JPanel(new FlowLayout(1, 1, 0)); |
||||||
|
panel.add(downButton); |
||||||
|
panel.add(slider); |
||||||
|
panel.add(upButton); |
||||||
|
panel.add(showValButton); |
||||||
|
this.add(panel, BorderLayout.NORTH); |
||||||
|
this.setBounds(0, 0, THREE_HUNDRED, ONE_EIGHT); |
||||||
|
} |
||||||
|
|
||||||
|
public static final JFormSliderPane getInstance() { |
||||||
|
// if (THIS == null) {
|
||||||
|
// THIS = new JFormSliderPane();
|
||||||
|
// }
|
||||||
|
THIS = new JFormSliderPane(); |
||||||
|
return THIS; |
||||||
|
} |
||||||
|
|
||||||
|
private void initUIRadioButton() { |
||||||
|
twoHundredButton = new UIRadioButton("200%"); |
||||||
|
oneHundredButton = new UIRadioButton("100%"); |
||||||
|
SevenFiveButton = new UIRadioButton("75%"); |
||||||
|
fiveTenButton = new UIRadioButton("50%"); |
||||||
|
twoFiveButton = new UIRadioButton("25%"); |
||||||
|
// selfAdaptButton = new UIRadioButton(Inter.getLocText("FR-Designer_Scale_selfAdaptButton"));
|
||||||
|
customButton = new UIRadioButton(Inter.getLocText("FR-Designer_Scale_customButton")); |
||||||
|
twoHundredButton.addItemListener(radioButtonItemListener); |
||||||
|
oneHundredButton.addItemListener(radioButtonItemListener); |
||||||
|
SevenFiveButton.addItemListener(radioButtonItemListener); |
||||||
|
fiveTenButton.addItemListener(radioButtonItemListener); |
||||||
|
twoFiveButton.addItemListener(radioButtonItemListener); |
||||||
|
//TODO
|
||||||
|
// selfAdaptButton.addItemListener();
|
||||||
|
|
||||||
|
ButtonGroup bg = new ButtonGroup();// 初始化按钮组
|
||||||
|
bg.add(twoHundredButton);// 加入按钮组
|
||||||
|
bg.add(oneHundredButton); |
||||||
|
bg.add(SevenFiveButton); |
||||||
|
bg.add(fiveTenButton); |
||||||
|
bg.add(twoFiveButton); |
||||||
|
// bg.add(selfAdaptButton);
|
||||||
|
bg.add(customButton); |
||||||
|
customButton.setSelected(true); |
||||||
|
} |
||||||
|
|
||||||
|
private void initPane() { |
||||||
|
double p = TableLayout.PREFERRED; |
||||||
|
double f = TableLayout.FILL; |
||||||
|
double[] columnSize = {p, f}; |
||||||
|
double[] rowSize = {p, p, p, p, p, p, p}; |
||||||
|
Component[][] components = new Component[][]{ |
||||||
|
new Component[]{twoHundredButton, null}, |
||||||
|
new Component[]{oneHundredButton, null}, |
||||||
|
new Component[]{SevenFiveButton, null}, |
||||||
|
new Component[]{fiveTenButton, null}, |
||||||
|
new Component[]{twoFiveButton, null}, |
||||||
|
// new Component[]{selfAdaptButton,null},
|
||||||
|
new Component[]{customButton, createSpinnerPanel()} |
||||||
|
}; |
||||||
|
dialogContentPanel = TableLayoutHelper.createTableLayoutPane(components, rowSize, columnSize); |
||||||
|
} |
||||||
|
|
||||||
|
private JPanel createSpinnerPanel() { |
||||||
|
JPanel spinnerPanel = new JPanel(new FlowLayout()); |
||||||
|
spinnerPanel.add(showValSpinner); |
||||||
|
UILabel percent = new UILabel("%"); |
||||||
|
percent.setFont(new Font("Dialog", Font.PLAIN, FONT_SIZE)); |
||||||
|
spinnerPanel.add(percent); |
||||||
|
return spinnerPanel; |
||||||
|
} |
||||||
|
|
||||||
|
ActionListener showValButtonActionListener = new ActionListener() { |
||||||
|
@Override |
||||||
|
public void actionPerformed(ActionEvent e) { |
||||||
|
popupDialog(); |
||||||
|
} |
||||||
|
}; |
||||||
|
|
||||||
|
ChangeListener showValSpinnerChangeListener = new ChangeListener() { |
||||||
|
@Override |
||||||
|
public void stateChanged(ChangeEvent e) { |
||||||
|
int val = (int) ((UIBasicSpinner) e.getSource()).getValue(); |
||||||
|
isButtonOrIsTxt = true; |
||||||
|
resolutionTimes = divide(showValue, 100, 2); |
||||||
|
if (val > FOUR_HUNDRED) { |
||||||
|
showValSpinner.setValue(FOUR_HUNDRED); |
||||||
|
val = FOUR_HUNDRED; |
||||||
|
} |
||||||
|
if (val < TEN) { |
||||||
|
showValSpinner.setValue(TEN); |
||||||
|
val = TEN; |
||||||
|
} |
||||||
|
refreshSlider(val); |
||||||
|
refreshBottun(val); |
||||||
|
} |
||||||
|
}; |
||||||
|
|
||||||
|
|
||||||
|
//定义一个监听器,用于监听所有滑动条
|
||||||
|
ChangeListener listener = new ChangeListener() { |
||||||
|
public void stateChanged(ChangeEvent event) { |
||||||
|
//取出滑动条的值,并在文本中显示出来
|
||||||
|
if (!isButtonOrIsTxt) { |
||||||
|
customButton.setSelected(true); |
||||||
|
EventQueue.invokeLater(new Runnable() { |
||||||
|
public void run() { |
||||||
|
sliderValue = slider.getValue(); |
||||||
|
getTimes(sliderValue); |
||||||
|
showValue = times; |
||||||
|
showValSpinner.setValue(times); |
||||||
|
} |
||||||
|
}); |
||||||
|
} else { |
||||||
|
isButtonOrIsTxt = false; |
||||||
|
} |
||||||
|
} |
||||||
|
}; |
||||||
|
|
||||||
|
ItemListener radioButtonItemListener = new ItemListener() { |
||||||
|
@Override |
||||||
|
public void itemStateChanged(ItemEvent e) { |
||||||
|
JRadioButton temp = (JRadioButton) e.getSource(); |
||||||
|
if (temp.isSelected()) { |
||||||
|
showValSpinner.setValue(Integer.valueOf(temp.getText().substring(0, temp.getText().indexOf("%")))); |
||||||
|
} |
||||||
|
} |
||||||
|
}; |
||||||
|
|
||||||
|
private void refreshSlider(int val) { |
||||||
|
showValue = val; |
||||||
|
if (showValue > HUNDRED) { |
||||||
|
slider.setValue((int) (showValue + TWO_HUNDRED) / SIX); |
||||||
|
} else if (showValue < HUNDRED) { |
||||||
|
slider.setValue((int) ((showValue - TEN) / ONEPOINTEIGHT)); |
||||||
|
} else if (showValue == HUNDRED) { |
||||||
|
slider.setValue(HALF_HUNDRED); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
private void refreshBottun(int val) { |
||||||
|
showValButton.setText(val + "%"); |
||||||
|
} |
||||||
|
|
||||||
|
public double getResolutionTimes() { |
||||||
|
return this.resolutionTimes; |
||||||
|
} |
||||||
|
|
||||||
|
public int getshowValue() { |
||||||
|
return this.showValue; |
||||||
|
} |
||||||
|
|
||||||
|
public static double divide(double v1, double v2, int scale) { |
||||||
|
BigDecimal b1 = new BigDecimal(Double.toString(v1)); |
||||||
|
BigDecimal b2 = new BigDecimal(Double.toString(v2)); |
||||||
|
return b1.divide(b2, scale).doubleValue(); |
||||||
|
} |
||||||
|
|
||||||
|
ActionListener buttonActionListener = new ActionListener() { |
||||||
|
@Override |
||||||
|
public void actionPerformed(ActionEvent e) { |
||||||
|
showValue = (int) showValSpinner.getValue(); |
||||||
|
isButtonOrIsTxt = true; |
||||||
|
if (e.getActionCommand().equals("less")) { |
||||||
|
int newDownVal = showValue - TEN; |
||||||
|
if (newDownVal >= TEN) { |
||||||
|
showValue = newDownVal; |
||||||
|
showValSpinner.setValue(newDownVal); |
||||||
|
} else { |
||||||
|
showValue = newDownVal; |
||||||
|
showValSpinner.setValue(TEN); |
||||||
|
} |
||||||
|
} |
||||||
|
if (e.getActionCommand().equals("more")) { |
||||||
|
int newUpVal = showValue + TEN; |
||||||
|
if (newUpVal <= FOUR_HUNDRED) { |
||||||
|
showValue = newUpVal; |
||||||
|
showValSpinner.setValue(newUpVal); |
||||||
|
} else { |
||||||
|
showValue = newUpVal; |
||||||
|
showValSpinner.setValue(FOUR_HUNDRED); |
||||||
|
} |
||||||
|
} |
||||||
|
isButtonOrIsTxt = true; |
||||||
|
customButton.setSelected(true); |
||||||
|
} |
||||||
|
}; |
||||||
|
|
||||||
|
|
||||||
|
private void getTimes(int value) { |
||||||
|
if (value == HALF_HUNDRED) { |
||||||
|
times = HUNDRED; |
||||||
|
} else if (value < HALF_HUNDRED) { |
||||||
|
times = (int) Math.round(ONEPOINTEIGHT * value + TEN); |
||||||
|
} else { |
||||||
|
times = (int) (SIX * value - TWO_HUNDRED); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
public JSpinner getShowVal() { |
||||||
|
return this.showValSpinner; |
||||||
|
} |
||||||
|
|
||||||
|
public UIRadioButton getSelfAdaptButton() { |
||||||
|
return this.selfAdaptButton; |
||||||
|
} |
||||||
|
|
||||||
|
private void popupDialog() { |
||||||
|
Point btnCoords = upButton.getLocationOnScreen(); |
||||||
|
if (dialog == null) { |
||||||
|
dialog = new FormPopupPane(upButton, dialogContentPanel); |
||||||
|
if (upButtonX == 0) { |
||||||
|
upButtonX = btnCoords.x; |
||||||
|
GUICoreUtils.showPopupMenu(dialog, upButton, -DIALOG_WIDTH + upButton.getWidth() + SHOWVALBUTTON_WIDTH, -DIALOG_HEIGHT); |
||||||
|
} |
||||||
|
} else { |
||||||
|
if (upButtonX == 0) { |
||||||
|
upButtonX = btnCoords.x; |
||||||
|
GUICoreUtils.showPopupMenu(dialog, upButton, -DIALOG_WIDTH + upButton.getWidth() + SHOWVALBUTTON_WIDTH, -DIALOG_HEIGHT); |
||||||
|
} else { |
||||||
|
GUICoreUtils.showPopupMenu(dialog, upButton, -DIALOG_WIDTH + upButton.getWidth() + SHOWVALBUTTON_WIDTH, -DIALOG_HEIGHT); |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
public static void main(String[] args) { |
||||||
|
JFrame jf = new JFrame("test"); |
||||||
|
jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); |
||||||
|
JPanel content = (JPanel) jf.getContentPane(); |
||||||
|
content.setLayout(new BorderLayout()); |
||||||
|
content.add(JFormSliderPane.getInstance(), BorderLayout.CENTER); |
||||||
|
GUICoreUtils.centerWindow(jf); |
||||||
|
jf.setSize(400, 80); |
||||||
|
jf.setVisible(true); |
||||||
|
|
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
class FormPopupPane extends JPopupMenu { |
||||||
|
private JComponent contentPane; |
||||||
|
private static final int UPLABEL_HEIGHT = 25; |
||||||
|
private static final int DIALOG_WIDTH = 150; |
||||||
|
private static final int DIALOG_HEIGHT = 220; |
||||||
|
private static final int UPLABEL_WIDTH = 300; |
||||||
|
private JComponent centerPane; |
||||||
|
private UILabel upLabel; |
||||||
|
|
||||||
|
FormPopupPane(UIButton b, JPanel dialogContentPanel) { |
||||||
|
contentPane = new JPanel(new BorderLayout()); |
||||||
|
centerPane = new JPanel(new BorderLayout()); |
||||||
|
upLabel = new UILabel(" " + Inter.getLocText("FR-Designer_Scale_EnlargeOrReduce")); |
||||||
|
upLabel.setOpaque(true); |
||||||
|
upLabel.setPreferredSize(new Dimension(UPLABEL_WIDTH, UPLABEL_HEIGHT)); |
||||||
|
upLabel.setBackground(Color.LIGHT_GRAY); |
||||||
|
upLabel.setBorder(new MatteBorder(0, 0, 1, 0, Color.gray)); |
||||||
|
centerPane.add(dialogContentPanel, BorderLayout.NORTH); |
||||||
|
contentPane.add(upLabel, BorderLayout.NORTH); |
||||||
|
contentPane.add(centerPane, BorderLayout.CENTER); |
||||||
|
// contentPane.setBorder(new MatteBorder(1,1,1,1,Color.darkGray));
|
||||||
|
this.add(contentPane, BorderLayout.CENTER); |
||||||
|
this.setPreferredSize(new Dimension(DIALOG_WIDTH, DIALOG_HEIGHT)); |
||||||
|
this.setOpaque(false); |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
} |
Loading…
Reference in new issue