forked from fanruan/design
MoMeak
8 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