MoMeak
7 years ago
12 changed files with 1911 additions and 9 deletions
@ -0,0 +1,55 @@ |
|||||||
|
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) { |
||||||
|
// TemplateElementCase elementCase = ePane.getEditingElementCase();
|
||||||
|
// if (elementCase == null) {
|
||||||
|
// return;
|
||||||
|
// }
|
||||||
|
// ePane.getSelection().populatePropertyPane(ePane);
|
||||||
|
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; |
||||||
|
} |
||||||
|
} |
@ -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; |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
} |
Loading…
Reference in new issue